@magic-xpa/engine 4.1100.0-dev4110.25 → 4.1100.0-dev4110.250

Sign up to get free protection for your applications and to get access to all the features.
Files changed (521) hide show
  1. package/{esm2020 → esm2022}/index.mjs +188 -188
  2. package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
  3. package/esm2022/src/AccessHelper.mjs +15 -0
  4. package/esm2022/src/ClientManager.mjs +416 -0
  5. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  6. package/esm2022/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2022/src/CommandsTable.mjs +162 -0
  8. package/esm2022/src/ConstInterface.mjs +517 -0
  9. package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
  10. package/esm2022/src/FlowMonitorInterface.mjs +16 -0
  11. package/esm2022/src/GUIManager.mjs +62 -0
  12. package/esm2022/src/GlobalCommandsManager.mjs +34 -0
  13. package/esm2022/src/GuiEventsProcessor.mjs +156 -0
  14. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  15. package/esm2022/src/ServerConfig.mjs +122 -0
  16. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  17. package/esm2022/src/bridge/MagicBridge.mjs +41 -0
  18. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
  19. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
  20. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
  21. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
  22. package/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
  23. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  24. package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
  26. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
  27. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  28. package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
  29. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
  31. package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
  32. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  33. package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
  34. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +40 -0
  35. package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
  36. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
  37. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
  38. package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
  39. package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
  40. package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
  41. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
  42. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  44. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
  45. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
  47. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
  48. package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
  49. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  50. package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
  51. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
  52. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
  53. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
  54. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
  56. package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
  57. package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
  58. package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +2 -2
  59. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  61. package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  64. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
  65. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  67. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
  68. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
  69. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
  70. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  72. package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
  73. package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
  74. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
  75. package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
  76. package/esm2022/src/data/DataView.mjs +1613 -0
  77. package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
  78. package/esm2022/src/data/DataviewManager.mjs +28 -0
  79. package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
  80. package/esm2022/src/data/DvCache.mjs +67 -0
  81. package/esm2022/src/data/Field.mjs +646 -0
  82. package/esm2022/src/data/FieldBase.mjs +15 -0
  83. package/esm2022/src/data/FieldsTable.mjs +103 -0
  84. package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
  85. package/esm2022/src/data/Key.mjs +88 -0
  86. package/esm2022/src/data/Record.mjs +880 -0
  87. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  88. package/esm2022/src/data/RecordsTable.mjs +267 -0
  89. package/esm2022/src/data/TaskTransactionManager.mjs +107 -0
  90. package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/{esm2020 → esm2022}/src/enums.mjs +23 -23
  92. package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2022/src/env/Environment.mjs +487 -0
  94. package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
  95. package/esm2022/src/env/LanguageData.mjs +227 -0
  96. package/esm2022/src/env/MirrorString.mjs +65 -0
  97. package/esm2022/src/event/ActionManager.mjs +91 -0
  98. package/esm2022/src/event/Event.mjs +1333 -0
  99. package/esm2022/src/event/EventHandler.mjs +766 -0
  100. package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
  101. package/esm2022/src/event/EventsManager.mjs +2988 -0
  102. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  103. package/esm2022/src/event/RunTimeEvent.mjs +399 -0
  104. package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
  105. package/esm2022/src/event/UserEventsTable.mjs +47 -0
  106. package/esm2022/src/exp/ExpTable.mjs +57 -0
  107. package/esm2022/src/exp/Expression.mjs +200 -0
  108. package/esm2022/src/exp/ExpressionDict.mjs +727 -0
  109. package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
  110. package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2022/src/exp/YesNoExp.mjs +36 -0
  113. package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
  114. package/esm2022/src/gui/FormsTable.mjs +66 -0
  115. package/esm2022/src/gui/MgControl.mjs +363 -0
  116. package/esm2022/src/gui/MgForm.mjs +1224 -0
  117. package/esm2022/src/http/HttpManager.mjs +97 -0
  118. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  119. package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
  120. package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
  121. package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
  122. package/esm2022/src/http/client/HttpUtility.mjs +84 -0
  123. package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
  124. package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
  128. package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
  131. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
  132. package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
  133. package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
  134. package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  136. package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2022/src/remote/ServerError.mjs +40 -0
  138. package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
  139. package/esm2022/src/rt/Argument.mjs +265 -0
  140. package/esm2022/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2022/src/rt/Boundary.mjs +152 -0
  142. package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
  143. package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
  144. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  145. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  146. package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
  147. package/esm2022/src/rt/ExecutionStack.mjs +94 -0
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  149. package/esm2022/src/rt/HandlersTable.mjs +96 -0
  150. package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
  151. package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
  152. package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
  153. package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
  154. package/esm2022/src/rt/Operation.mjs +735 -0
  155. package/esm2022/src/rt/OperationTable.mjs +67 -0
  156. package/esm2022/src/rt/Recompute.mjs +355 -0
  157. package/esm2022/src/rt/RecomputeTable.mjs +63 -0
  158. package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
  159. package/esm2022/src/rt/ResultValue.mjs +10 -0
  160. package/esm2022/src/rt/TableCache.mjs +177 -0
  161. package/esm2022/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2022/src/rt/Transaction.mjs +53 -0
  163. package/esm2022/src/security/UserDetails.mjs +71 -0
  164. package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
  165. package/esm2022/src/tasks/MGData.mjs +552 -0
  166. package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
  167. package/esm2022/src/tasks/RCTimer.mjs +63 -0
  168. package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
  169. package/esm2022/src/tasks/Task.mjs +2499 -0
  170. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  171. package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
  172. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  174. package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
  175. package/esm2022/src/util/ConstUtils.mjs +14 -0
  176. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  177. package/esm2022/src/util/HeapSort.mjs +70 -0
  178. package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
  179. package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
  180. package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
  181. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
  182. package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
  183. package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
  184. package/esm2022/src/util/PrmMap.mjs +152 -0
  185. package/esm2022/src/util/ReturnResult.mjs +46 -0
  186. package/esm2022/src/util/ReturnResultBase.mjs +18 -0
  187. package/esm2022/src/util/Scrambler.mjs +89 -0
  188. package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
  189. package/esm2022/src/util/cookie.service.mjs +92 -0
  190. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29883 -29693
  191. package/fesm2022/magic-xpa-engine.mjs.map +1 -0
  192. package/index.d.ts +187 -187
  193. package/package.json +8 -14
  194. package/src/AccessHelper.d.ts +20 -20
  195. package/src/ClientManager.d.ts +35 -32
  196. package/src/CommandsProcessorBase.d.ts +23 -23
  197. package/src/CommandsProcessorManager.d.ts +6 -6
  198. package/src/CommandsTable.d.ts +22 -22
  199. package/src/ConstInterface.d.ts +516 -515
  200. package/src/CurrentClientVersion.d.ts +1 -1
  201. package/src/FlowMonitorInterface.d.ts +15 -15
  202. package/src/GUIManager.d.ts +17 -17
  203. package/src/GlobalCommandsManager.d.ts +17 -17
  204. package/src/GuiEventsProcessor.d.ts +24 -24
  205. package/src/ICommandsTable.d.ts +9 -9
  206. package/src/ServerConfig.d.ts +35 -34
  207. package/src/bridge/IGuiEvent.d.ts +19 -19
  208. package/src/bridge/MagicBridge.d.ts +16 -16
  209. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
  210. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
  211. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
  212. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
  213. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +9 -8
  214. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
  215. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
  216. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +11 -10
  217. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
  218. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
  219. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +9 -8
  220. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
  221. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -7
  222. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
  223. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
  224. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
  225. package/src/commands/ClientToServer/EvaluateCommand.d.ts +16 -15
  226. package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
  227. package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
  228. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -8
  229. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
  230. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
  231. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +9 -8
  232. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
  233. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
  234. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  235. package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
  236. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
  237. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
  238. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
  239. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
  240. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  241. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
  242. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
  243. package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
  244. package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -7
  245. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
  246. package/src/commands/DataViewCommandBase.d.ts +6 -6
  247. package/src/commands/IClientCommand.d.ts +2 -2
  248. package/src/commands/IClientTargetedCommand.d.ts +12 -12
  249. package/src/commands/IClientToServerCommandInfo.d.ts +4 -3
  250. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
  251. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
  252. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
  253. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
  254. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
  255. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
  256. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
  257. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
  258. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
  259. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
  260. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
  261. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
  262. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
  263. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
  264. package/src/communications/IConnectionStateManager.d.ts +4 -4
  265. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
  266. package/src/data/DataSourceIdKey.d.ts +2 -2
  267. package/src/data/DataView.d.ts +162 -162
  268. package/src/data/DataViewBase.d.ts +12 -12
  269. package/src/data/DataviewManager.d.ts +14 -14
  270. package/src/data/DataviewManagerBase.d.ts +11 -11
  271. package/src/data/DvCache.d.ts +15 -15
  272. package/src/data/Field.d.ts +103 -103
  273. package/src/data/FieldBase.d.ts +23 -23
  274. package/src/data/FieldsTable.d.ts +27 -27
  275. package/src/data/IRecordsTable.d.ts +7 -7
  276. package/src/data/Key.d.ts +15 -15
  277. package/src/data/Record.d.ts +157 -156
  278. package/src/data/RecordOutOfDataViewException.d.ts +10 -10
  279. package/src/data/RecordsTable.d.ts +38 -38
  280. package/src/data/TaskTransactionManager.d.ts +17 -17
  281. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
  282. package/src/enums.d.ts +21 -21
  283. package/src/env/EnvVariablesTable.d.ts +17 -17
  284. package/src/env/Environment.d.ts +118 -118
  285. package/src/env/ILanguageData.d.ts +3 -3
  286. package/src/env/LanguageData.d.ts +20 -20
  287. package/src/env/MirrorString.d.ts +15 -15
  288. package/src/event/ActionManager.d.ts +14 -14
  289. package/src/event/Event.d.ts +79 -79
  290. package/src/event/EventHandler.d.ts +66 -66
  291. package/src/event/EventHandlerPosition.d.ts +25 -25
  292. package/src/event/EventsManager.d.ts +205 -204
  293. package/src/event/IEventsManager.d.ts +77 -77
  294. package/src/event/RunTimeEvent.d.ts +126 -123
  295. package/src/event/RunTimeEventBase.d.ts +5 -5
  296. package/src/event/UserEventsTable.d.ts +11 -11
  297. package/src/exp/ExpTable.d.ts +11 -11
  298. package/src/exp/Expression.d.ts +37 -37
  299. package/src/exp/ExpressionDict.d.ts +12 -12
  300. package/src/exp/ExpressionEvaluator.d.ts +198 -198
  301. package/src/exp/ExpressionLocalJpn.d.ts +18 -18
  302. package/src/exp/GlobalParamsTable.d.ts +19 -19
  303. package/src/exp/YesNoExp.d.ts +9 -9
  304. package/src/gui/CreatedFormVector.d.ts +10 -10
  305. package/src/gui/FormsTable.d.ts +15 -15
  306. package/src/gui/MgControl.d.ts +60 -60
  307. package/src/gui/MgForm.d.ts +96 -93
  308. package/src/http/HttpManager.d.ts +25 -25
  309. package/src/http/client/HttpClientAsync.d.ts +16 -16
  310. package/src/http/client/HttpClientBase.d.ts +30 -30
  311. package/src/http/client/HttpClientEvents.d.ts +18 -18
  312. package/src/http/client/HttpClientSync.d.ts +17 -17
  313. package/src/http/client/HttpUtility.d.ts +10 -10
  314. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
  315. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
  316. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
  317. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
  318. package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
  319. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
  320. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
  321. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
  322. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
  323. package/src/remote/RemoteDataviewManager.d.ts +9 -9
  324. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
  325. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
  326. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
  327. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
  328. package/src/remote/ServerError.d.ts +16 -16
  329. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
  330. package/src/rt/Argument.d.ts +36 -36
  331. package/src/rt/ArgumentsList.d.ts +24 -24
  332. package/src/rt/Boundary.d.ts +27 -27
  333. package/src/rt/CompMainPrgTable.d.ts +10 -10
  334. package/src/rt/DataviewHeaderBase.d.ts +34 -34
  335. package/src/rt/DataviewHeaderFactory.d.ts +5 -5
  336. package/src/rt/DataviewHeaders.d.ts +12 -12
  337. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
  338. package/src/rt/ExecutionStack.d.ts +22 -22
  339. package/src/rt/ExecutionStackEntry.d.ts +7 -7
  340. package/src/rt/HandlersTable.d.ts +19 -19
  341. package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
  342. package/src/rt/IDataviewHeader.d.ts +10 -10
  343. package/src/rt/IResultValue.d.ts +4 -4
  344. package/src/rt/LastFocusedManager.d.ts +23 -23
  345. package/src/rt/Operation.d.ts +97 -97
  346. package/src/rt/OperationTable.d.ts +15 -15
  347. package/src/rt/Recompute.d.ts +41 -41
  348. package/src/rt/RecomputeTable.d.ts +9 -9
  349. package/src/rt/RemoteDataviewHeader.d.ts +14 -14
  350. package/src/rt/ResultValue.d.ts +7 -7
  351. package/src/rt/TableCache.d.ts +29 -29
  352. package/src/rt/TableCacheManager.d.ts +10 -10
  353. package/src/rt/Transaction.d.ts +23 -23
  354. package/src/security/UserDetails.d.ts +16 -16
  355. package/src/tasks/IMGDataCollection.d.ts +26 -26
  356. package/src/tasks/MGData.d.ts +63 -63
  357. package/src/tasks/MGDataCollection.d.ts +42 -42
  358. package/src/tasks/RCTimer.d.ts +13 -13
  359. package/src/tasks/RemoteTaskService.d.ts +16 -16
  360. package/src/tasks/Task.d.ts +312 -312
  361. package/src/tasks/TaskBase.d.ts +123 -123
  362. package/src/tasks/TaskServiceBase.d.ts +16 -16
  363. package/src/tasks/TasksTable.d.ts +21 -21
  364. package/src/tasks/sort/Sort.d.ts +4 -4
  365. package/src/tasks/sort/SortCollection.d.ts +11 -11
  366. package/src/util/ConstUtils.d.ts +3 -3
  367. package/src/util/FlowMonitorQueue.d.ts +70 -70
  368. package/src/util/HeapSort.d.ts +6 -6
  369. package/src/util/IMirrorXML.d.ts +6 -6
  370. package/src/util/IServerConfig.d.ts +11 -11
  371. package/src/util/MgBlockingQueue.d.ts +5 -5
  372. package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
  373. package/src/util/MgPriorityQueue.d.ts +13 -13
  374. package/src/util/ParamParseResult.d.ts +6 -6
  375. package/src/util/PrmMap.d.ts +28 -28
  376. package/src/util/ReturnResult.d.ts +18 -18
  377. package/src/util/ReturnResultBase.d.ts +11 -11
  378. package/src/util/Scrambler.d.ts +10 -10
  379. package/src/util/UniqueIDUtils.d.ts +4 -4
  380. package/src/util/cookie.service.d.ts +8 -8
  381. package/esm2020/src/AccessHelper.mjs +0 -9
  382. package/esm2020/src/ClientManager.mjs +0 -399
  383. package/esm2020/src/CommandsProcessorBase.mjs +0 -58
  384. package/esm2020/src/CommandsProcessorManager.mjs +0 -26
  385. package/esm2020/src/CommandsTable.mjs +0 -162
  386. package/esm2020/src/ConstInterface.mjs +0 -516
  387. package/esm2020/src/FlowMonitorInterface.mjs +0 -16
  388. package/esm2020/src/GUIManager.mjs +0 -62
  389. package/esm2020/src/GlobalCommandsManager.mjs +0 -34
  390. package/esm2020/src/GuiEventsProcessor.mjs +0 -154
  391. package/esm2020/src/ServerConfig.mjs +0 -117
  392. package/esm2020/src/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/ClientOriginatedCommandSerializer.mjs +0 -60
  396. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
  397. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  398. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  399. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
  400. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  401. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  402. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  403. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  404. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
  405. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  406. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  407. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  408. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  409. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  410. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +0 -15
  411. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
  412. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  413. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  414. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  415. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  416. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  417. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  418. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
  419. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
  420. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  421. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  422. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  423. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  424. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  425. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  426. package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
  427. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  428. package/esm2020/src/data/DataView.mjs +0 -1610
  429. package/esm2020/src/data/DataviewManager.mjs +0 -28
  430. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  431. package/esm2020/src/data/DvCache.mjs +0 -67
  432. package/esm2020/src/data/Field.mjs +0 -646
  433. package/esm2020/src/data/FieldBase.mjs +0 -18
  434. package/esm2020/src/data/FieldsTable.mjs +0 -103
  435. package/esm2020/src/data/Key.mjs +0 -88
  436. package/esm2020/src/data/Record.mjs +0 -846
  437. package/esm2020/src/data/RecordsTable.mjs +0 -267
  438. package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
  439. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
  440. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  441. package/esm2020/src/env/Environment.mjs +0 -489
  442. package/esm2020/src/env/LanguageData.mjs +0 -226
  443. package/esm2020/src/env/MirrorString.mjs +0 -65
  444. package/esm2020/src/event/ActionManager.mjs +0 -91
  445. package/esm2020/src/event/Event.mjs +0 -1333
  446. package/esm2020/src/event/EventHandler.mjs +0 -766
  447. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  448. package/esm2020/src/event/EventsManager.mjs +0 -2975
  449. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  450. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  451. package/esm2020/src/exp/ExpTable.mjs +0 -59
  452. package/esm2020/src/exp/Expression.mjs +0 -200
  453. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  454. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
  455. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  456. package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
  457. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  458. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  459. package/esm2020/src/gui/FormsTable.mjs +0 -66
  460. package/esm2020/src/gui/MgControl.mjs +0 -353
  461. package/esm2020/src/gui/MgForm.mjs +0 -1181
  462. package/esm2020/src/http/HttpManager.mjs +0 -97
  463. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  464. package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
  465. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  466. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  467. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  468. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
  469. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
  470. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
  471. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  472. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
  473. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
  474. package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
  475. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
  476. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
  477. package/esm2020/src/remote/ServerError.mjs +0 -40
  478. package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
  479. package/esm2020/src/rt/Argument.mjs +0 -265
  480. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  481. package/esm2020/src/rt/Boundary.mjs +0 -152
  482. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  483. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  484. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
  485. package/esm2020/src/rt/ExecutionStack.mjs +0 -94
  486. package/esm2020/src/rt/HandlersTable.mjs +0 -96
  487. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  488. package/esm2020/src/rt/Operation.mjs +0 -735
  489. package/esm2020/src/rt/OperationTable.mjs +0 -67
  490. package/esm2020/src/rt/Recompute.mjs +0 -355
  491. package/esm2020/src/rt/RecomputeTable.mjs +0 -63
  492. package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
  493. package/esm2020/src/rt/ResultValue.mjs +0 -12
  494. package/esm2020/src/rt/TableCache.mjs +0 -177
  495. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  496. package/esm2020/src/rt/Transaction.mjs +0 -53
  497. package/esm2020/src/security/UserDetails.mjs +0 -71
  498. package/esm2020/src/tasks/MGData.mjs +0 -552
  499. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  500. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  501. package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
  502. package/esm2020/src/tasks/Task.mjs +0 -2495
  503. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  504. package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
  505. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  506. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  507. package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
  508. package/esm2020/src/util/ConstUtils.mjs +0 -14
  509. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  510. package/esm2020/src/util/HeapSort.mjs +0 -70
  511. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  512. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  513. package/esm2020/src/util/PrmMap.mjs +0 -151
  514. package/esm2020/src/util/ReturnResult.mjs +0 -46
  515. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  516. package/esm2020/src/util/Scrambler.mjs +0 -89
  517. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  518. package/esm2020/src/util/cookie.service.mjs +0 -92
  519. package/fesm2015/magic-xpa-engine.mjs +0 -30835
  520. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  521. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -1,2495 +0,0 @@
1
- import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
2
- import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
3
- import { Commands, DataModificationTypes, DisplayConvertor, Events, GuiDataCollection, Helps, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
4
- import { DataView } from '../data/DataView';
5
- import { DvCache } from '../data/DvCache';
6
- import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
7
- import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
8
- import { TaskServiceBase } from './TaskServiceBase';
9
- import { TaskTransactionManager } from '../data/TaskTransactionManager';
10
- import { DataviewManager } from '../data/DataviewManager';
11
- import { SortCollection } from './sort/SortCollection';
12
- import { MgForm } from '../gui/MgForm';
13
- import { RemoteTaskService } from './RemoteTaskService';
14
- import { ReturnResult } from '../util/ReturnResult';
15
- import { RunTimeEvent } from '../event/RunTimeEvent';
16
- import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
17
- import { DataviewHeaders } from '../rt/DataviewHeaders';
18
- import { Transaction } from '../rt/Transaction';
19
- import { TasksTable } from './TasksTable';
20
- import { HandlersTable } from '../rt/HandlersTable';
21
- import { RecomputeTable } from '../rt/RecomputeTable';
22
- import { ExpTable } from '../exp/ExpTable';
23
- import { UserEventsTable } from '../event/UserEventsTable';
24
- import { FormsTable } from '../gui/FormsTable';
25
- import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
26
- import { ActionManager } from '../event/ActionManager';
27
- import { ConstInterface } from '../ConstInterface';
28
- import { GUIManager } from '../GUIManager';
29
- import { CommandsProcessorManager } from '../CommandsProcessorManager';
30
- import { EventSubType } from '../enums';
31
- import { OpeningTaskDetails, Task_SubformExecModeEnum, TaskBase } from './TaskBase';
32
- import { LanguageData } from '../env/LanguageData';
33
- import { Environment } from '../env/Environment';
34
- import { LastFocusedManager } from '../rt/LastFocusedManager';
35
- import { GlobalCommandsManager } from '../GlobalCommandsManager';
36
- import { EventsAllowedType } from '../event/IEventsManager';
37
- import { AccessHelper } from '../AccessHelper';
38
- import { MGDataCollection } from './MGDataCollection';
39
- import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
40
- import { EventHandlerPosition } from '../event/EventHandlerPosition';
41
- export var Task_Flow;
42
- (function (Task_Flow) {
43
- Task_Flow[Task_Flow["NONE"] = 0] = "NONE";
44
- Task_Flow[Task_Flow["STEP"] = 1] = "STEP";
45
- Task_Flow[Task_Flow["FAST"] = 2] = "FAST";
46
- })(Task_Flow || (Task_Flow = {}));
47
- export var Task_Direction;
48
- (function (Task_Direction) {
49
- Task_Direction[Task_Direction["BACK"] = -1] = "BACK";
50
- Task_Direction[Task_Direction["NONE"] = 0] = "NONE";
51
- Task_Direction[Task_Direction["FORE"] = 1] = "FORE";
52
- })(Task_Direction || (Task_Direction = {}));
53
- export class Task extends TaskBase {
54
- get ParentTask() {
55
- return this._parentTask;
56
- }
57
- set TryingToCommit(value) {
58
- this._tryingToCommit = value;
59
- }
60
- get TryingToCommit() {
61
- return this._tryingToCommit;
62
- }
63
- get TaskService() {
64
- if (this._taskService == null)
65
- this._taskService = new RemoteTaskService();
66
- return this._taskService;
67
- }
68
- static get CommandsProcessor() {
69
- return CommandsProcessorManager.GetCommandsProcessor();
70
- }
71
- get LogicalStudioParentTask() {
72
- if (this.StudioParentTask === null && !super.isMainProg()) {
73
- return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
74
- }
75
- return this.StudioParentTask;
76
- }
77
- get KnownToServer() {
78
- return this._knownToServer;
79
- }
80
- set Transaction(value) {
81
- this.DataviewManager.CurrentDataviewManager.Transaction = value;
82
- }
83
- get Transaction() {
84
- return this.DataviewManager.CurrentDataviewManager.Transaction;
85
- }
86
- get TaskDefinitionId() {
87
- if (this.taskDefinitionId === null) {
88
- this.taskDefinitionId = new TaskDefinitionId(this._ctlIdx, this.ProgramIsn, this.TaskIsn, this._isPrg);
89
- }
90
- return this.taskDefinitionId;
91
- }
92
- static get IsBlockingBatch() {
93
- return false;
94
- }
95
- constructor(parent) {
96
- super();
97
- this._dvCache = null;
98
- this._mgData = null;
99
- this._aborting = false;
100
- this._bExecEndTask = false;
101
- this._isStarted = false;
102
- this._evalOldValues = false;
103
- this._inRecordSuffix = false;
104
- this._cancelWasRaised = false;
105
- this._counter = 0;
106
- this._currStartProgLevel = 0;
107
- this._destinationSubform = false;
108
- this._enableZoomHandler = false;
109
- this._firstRecordCycle = false;
110
- this._originalTaskMode = ' ';
111
- this._inCreateLine = false;
112
- this.InSelect = false;
113
- this.InStartProcess = false;
114
- this._isDestinationCall = false;
115
- this._knownToServer = true;
116
- this._loopStack = null;
117
- this.DelayCommandExecution = false;
118
- this._parentTask = null;
119
- this.ContextTask = null;
120
- this._triggeringTask = null;
121
- this.PathParentTask = null;
122
- this._preventControlChange = false;
123
- this._preventRecordSuffix = false;
124
- this._taskPath = null;
125
- this._tryingToCommit = false;
126
- this._useLoopStack = false;
127
- this._inProcessingTopMostEndTaskSaved = false;
128
- this.InHandleActCancel = false;
129
- this.RuntimeSorts = null;
130
- this.VewFirst = 0;
131
- this.dataViewContent = null;
132
- this.PerformParentRecordPrefix = false;
133
- this.ModeAsParent = false;
134
- this.TaskTransactionManager = null;
135
- this.ExecuteClientSubformRefresh = false;
136
- this.InCommonHandlerBeforeRP = false;
137
- this._taskService = null;
138
- this.hasLocate = false;
139
- this.taskDefinitionId = null;
140
- this.ArgumentsList = null;
141
- this.ConfirmUpdateNo = false;
142
- this.DataSynced = false;
143
- this.UniqueSort = null;
144
- this.RefreshOnVars = null;
145
- this.DvPosDescriptor = null;
146
- this.SubTasks = null;
147
- this.ExpTab = null;
148
- this.UserEvtTab = null;
149
- this.DataviewHeadersTable = null;
150
- this.HandlersTab = null;
151
- this._forms = null;
152
- this.Name = null;
153
- this.PublicName = null;
154
- this.TaskSuffixExecuted = false;
155
- this.RetrunValueExp = 0;
156
- this.SubformControl = null;
157
- if (isNullOrUndefined(parent)) {
158
- this.constructor_0();
159
- return;
160
- }
161
- this.constructor_1(parent);
162
- }
163
- constructor_0() {
164
- this.ActionManager = new ActionManager();
165
- this.DataView = new DataView(this);
166
- this._flowMonitor = FlowMonitorQueue.Instance;
167
- this.ContextTask = this;
168
- this._dvCache = new DvCache(this);
169
- this.PerformParentRecordPrefix = true;
170
- this.DataviewManager = new DataviewManager(this);
171
- this.allowRemoteCmdExecution = true;
172
- this.TaskTransactionManager = new TaskTransactionManager(this);
173
- }
174
- Init() {
175
- this.DataView.Init();
176
- }
177
- constructor_1(parent) {
178
- this.constructor_0();
179
- this.PathParentTask = parent;
180
- this._parentTask = parent;
181
- this._triggeringTask = null;
182
- this.buildTaskPath();
183
- }
184
- static CreateTask() {
185
- let task = new Task();
186
- task.Init();
187
- return task;
188
- }
189
- isAborting() {
190
- return this._aborting;
191
- }
192
- buildTaskPath() {
193
- this._taskPath = new List();
194
- if (this._parentTask._taskPath !== null)
195
- this._taskPath.AddRange(this._parentTask._taskPath.GetEnumerator());
196
- this._taskPath.push(this);
197
- }
198
- async fillData(mgd, openingTaskDetails) {
199
- if (!super.isMainProg()) {
200
- if (this._parentTask === null && openingTaskDetails.CallingTask !== null) {
201
- this._parentTask = openingTaskDetails.CallingTask;
202
- this.buildTaskPath();
203
- openingTaskDetails.CallingTask.addSubTask(this);
204
- }
205
- if (this.PathParentTask === null && openingTaskDetails.PathParentTask !== null) {
206
- this.PathParentTask = openingTaskDetails.PathParentTask;
207
- }
208
- }
209
- if (this._parentTask !== null && this._parentTask.getEnableZoomHandler()) {
210
- this.setEnableZoomHandler();
211
- }
212
- this._mgData = mgd;
213
- this.fillAttributes();
214
- this._mgData.addTask(this);
215
- let parentForm = (this._parentTask !== null) ? this._parentTask.getForm() : null;
216
- while (await this.initInnerObjects(RuntimeContextBase.Instance.Parser.getNextTag(), parentForm)) {
217
- }
218
- this.TaskTransactionManager.PrepareTransactionProperties(this.DataviewManager.RemoteDataviewManager.Transaction, false);
219
- this.HandleTriggerTask();
220
- this.HandlePreviouslyActiveTaskId();
221
- this.CheckAndSetSubForm();
222
- if (this.IsSubForm) {
223
- let subFormCtrl = this.getParent().getForm().getSubFormCtrlForTask(this._taskTag);
224
- if (subFormCtrl !== null) {
225
- subFormCtrl.setSubformTaskId(this._taskTag);
226
- }
227
- if (this.Form !== null) {
228
- this.Form.setSubFormCtrl(subFormCtrl);
229
- }
230
- }
231
- }
232
- HandlePreviouslyActiveTaskId() {
233
- if (this._parentTask !== null && this._parentTask.GetContextTask() !== null && this._mgData !== this._parentTask.getMGData())
234
- this.PreviouslyActiveTaskId = (this._parentTask.GetContextTask()).getTaskTag();
235
- else if (this._parentTask !== null)
236
- this.PreviouslyActiveTaskId = this._parentTask.getTaskTag();
237
- }
238
- HandleTriggerTask() {
239
- this._triggeringTask = this._parentTask;
240
- }
241
- FillTaskTables(taskTablesData) {
242
- if (arguments.length === 1) {
243
- this.FillTaskTables_0();
244
- return;
245
- }
246
- this.FillTaskTables_1();
247
- }
248
- FillTaskTables_0() {
249
- }
250
- fillAttributes() {
251
- let parser = RuntimeContextBase.Instance.Parser;
252
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
253
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
254
- super.fillAttributes(parser);
255
- if (super.isMainProg())
256
- this._mgData = AccessHelper.mgDataTable.getMGData(0);
257
- }
258
- else {
259
- Logger.Instance.WriteExceptionToLogWithMsg("in Task.fillAttributes() out of string bounds");
260
- }
261
- }
262
- setAttribute(attribute, valueStr) {
263
- let isTagProcessed;
264
- isTagProcessed = super.setAttribute(attribute, valueStr);
265
- if (!isTagProcessed) {
266
- isTagProcessed = true;
267
- switch (attribute) {
268
- case ConstInterface.MG_ATTR_REFRESHON:
269
- if (!(valueStr.trim() === ""))
270
- this.SetRefreshOnVars(valueStr);
271
- break;
272
- case XMLConstants.MG_ATTR_NAME:
273
- this.Name = valueStr;
274
- break;
275
- case ConstInterface.MG_ATTR_DVPOS_DEC:
276
- if (!(valueStr.trim() === ""))
277
- this.setDescriptor(valueStr);
278
- break;
279
- case ConstInterface.MG_ATTR_HAS_LOCATE:
280
- if (+valueStr == 1)
281
- this.hasLocate = true;
282
- break;
283
- case ConstInterface.MG_ATTR_AS_PARENT:
284
- if (+valueStr == 1)
285
- this.ModeAsParent = true;
286
- break;
287
- case ConstInterface.MG_ATTR_TASK_UNIQUE_SORT:
288
- this.UniqueSort = valueStr[0];
289
- break;
290
- case ConstInterface.MG_ATTR_TRANS_ID:
291
- this.setRemoteTransaction(valueStr);
292
- break;
293
- case ConstInterface.MG_ATTR_PUBLIC:
294
- this.PublicName = XmlParser.unescape(valueStr);
295
- break;
296
- case XMLConstants.MG_ATTR_IS_OFFLINE:
297
- this.IsOffline = XmlParser.getBoolean(valueStr);
298
- break;
299
- case XMLConstants.MG_ATTR_RETURN_VALUE_EXP:
300
- this.RetrunValueExp = XmlParser.getInt(valueStr);
301
- break;
302
- case XMLConstants.MG_ATTR_MENUS_FILE_NAME:
303
- break;
304
- default:
305
- isTagProcessed = false;
306
- break;
307
- }
308
- }
309
- if (!isTagProcessed)
310
- Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
311
- return true;
312
- }
313
- async initInnerObjects(foundTagName, parentForm) {
314
- if (foundTagName == null)
315
- return false;
316
- let parser = RuntimeContextBase.Instance.Parser;
317
- switch (foundTagName) {
318
- case XMLConstants.MG_TAG_HELPTABLE:
319
- if (this._helpTab == null)
320
- this._helpTab = new Helps();
321
- if (Events.ShouldLog(Logger_LogLevels.Development))
322
- Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
323
- this._helpTab.fillData(parser);
324
- break;
325
- case XMLConstants.MG_TAG_DVHEADER:
326
- if (Events.ShouldLog(Logger_LogLevels.Development))
327
- Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
328
- this.DataView.fillHeaderData(parser);
329
- break;
330
- case XMLConstants.MG_TAG_PROP:
331
- this._propTab.fillData(this, 'T', parser);
332
- break;
333
- case XMLConstants.MG_TAG_FORM:
334
- this.Form = this.FormInitData(parentForm);
335
- break;
336
- case XMLConstants.MG_ATTR_MENU_CONTENT:
337
- break;
338
- case "assemblies":
339
- let endContext = parser.getXMLdata().indexOf('/assemblies', parser.getCurrIndex());
340
- parser.setCurrIndex(endContext);
341
- parser.setCurrIndex2EndOfTag();
342
- break;
343
- case XMLConstants.MG_TAG_FORMS:
344
- this._forms = new FormsTable(this, parentForm);
345
- Logger.Instance.WriteDevToLog(NString.Format("{0} ...", foundTagName));
346
- await this._forms.fillData();
347
- break;
348
- case XMLConstants.MG_TAG_TASK:
349
- if (this.SubTasks == null)
350
- this.SubTasks = new TasksTable();
351
- let subtask = new Task(this);
352
- subtask.Init();
353
- this.SubTasks.addTask(subtask);
354
- let mgd = this._mgData;
355
- if (this.isMainProg())
356
- mgd = AccessHelper.mgDataTable.GetMGDataForStartupProgram();
357
- await subtask.fillData(mgd, new OpeningTaskDetails());
358
- break;
359
- case ConstInterface.MG_TAG_TASKURL:
360
- await Task.ProcessTaskURL();
361
- break;
362
- case ConstInterface.MG_TAG_EXPTABLE:
363
- if (this.ExpTab == null)
364
- this.ExpTab = new ExpTable();
365
- Logger.Instance.WriteDevToLog("goes to exp");
366
- this.ExpTab.fillData(this, parser);
367
- break;
368
- case ConstInterface.MG_TAG_USER_EVENTS:
369
- if (this.UserEvtTab == null)
370
- this.UserEvtTab = new UserEventsTable();
371
- Logger.Instance.WriteDevToLog("goes to user event tab");
372
- this.UserEvtTab.fillData(this, parser);
373
- break;
374
- case ConstInterface.MG_TAG_LINKS:
375
- this.DataviewHeadersTable = new DataviewHeaders(this);
376
- this.DataviewHeadersTable.fillData(parser);
377
- break;
378
- case ConstInterface.MG_TAG_SORTS:
379
- this.RuntimeSorts = new SortCollection();
380
- this.RuntimeSorts.fillData(parser);
381
- break;
382
- case ConstInterface.MG_TAG_TASK_TABLES:
383
- this.FillTaskTables();
384
- break;
385
- case XMLConstants.MG_TAG_RECOMPUTE:
386
- Logger.Instance.WriteDevToLog("goes to recompute");
387
- this.RecomputeFillData(parser);
388
- break;
389
- case ConstInterface.MG_TAG_EVENTHANDLERS:
390
- Logger.Instance.WriteDevToLog("goes to eventhandlers");
391
- if (this.HandlersTab == null)
392
- this.HandlersTab = new HandlersTable();
393
- this.HandlersTab.fillData(this, parser);
394
- this.addExpHandlersToMGData();
395
- break;
396
- default:
397
- if (foundTagName === ("/" + XMLConstants.MG_TAG_TASK)) {
398
- RuntimeContextBase.Instance.Parser.setCurrIndex2EndOfTag();
399
- return false;
400
- }
401
- else {
402
- Logger.Instance.WriteDevToLog("There is no such tag in Task.initInnerObjects . Enter case for " + foundTagName);
403
- return false;
404
- }
405
- }
406
- return true;
407
- }
408
- RecomputeFillData(parser) {
409
- let recomputeTable = new RecomputeTable();
410
- recomputeTable.fillData_1(this.DataView, this, parser);
411
- }
412
- FillTaskTables_1() {
413
- let parser = RuntimeContextBase.Instance.Parser;
414
- let endContext = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_TASK_TABLES_END, parser.getCurrIndex());
415
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, endContext) + XMLConstants.TAG_CLOSE.length;
416
- let taskTablesData = parser.getXMLsubstring(endContext);
417
- this.FillTaskTables(taskTablesData);
418
- parser.setCurrIndex(endContext);
419
- }
420
- addExpHandlersToMGData() {
421
- let idx = 0;
422
- for (let i = this.HandlersTab.getSize() - 1; i >= 0; i--) {
423
- let handler = this.HandlersTab.getHandler(i);
424
- let evt = handler.getEvent();
425
- if (evt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION ||
426
- (evt.getType() === ConstInterface.EVENT_TYPE_USER && evt.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
427
- this._mgData.addExpHandler(handler, idx);
428
- idx++;
429
- }
430
- }
431
- }
432
- SetRefreshOnVars(variables) {
433
- let strTok = StrUtil.tokenize(variables, ",");
434
- let fldNum;
435
- let intVals = new List();
436
- let i;
437
- for (i = 0; i < strTok.length; i++) {
438
- fldNum = NNumber.Parse(strTok[i]);
439
- intVals.push(fldNum);
440
- }
441
- this.RefreshOnVars = new Array(intVals.length);
442
- for (i = 0; i < intVals.length; i++) {
443
- fldNum = intVals.get_Item(i);
444
- this.RefreshOnVars[i] = fldNum;
445
- }
446
- }
447
- setDataSynced(synced) {
448
- this.DataSynced = synced;
449
- }
450
- getField(fldName) {
451
- return this.DataView.getFieldByName(fldName);
452
- }
453
- getExpById(id) {
454
- if (this.ExpTab !== null)
455
- return this.ExpTab.getExpById(id);
456
- else
457
- Logger.Instance.WriteExceptionToLogWithMsg("in Task.GetExpById(): no expression table");
458
- return null;
459
- }
460
- getExpObjectById(id) {
461
- return this.getExpById(id);
462
- }
463
- GetExpressionStorage(expId) {
464
- let result = null;
465
- if (expId > 0) {
466
- let expById = this.getExpById(expId);
467
- Debug.Assert(expById !== null);
468
- result = expById.GetStorageAttribute();
469
- }
470
- return result;
471
- }
472
- async CalculateExpression(expId, resType, length) {
473
- let result = null;
474
- if (expId > 0) {
475
- let expById = this.getExpById(expId);
476
- Debug.Assert(expById !== null);
477
- result = await expById.evaluateWithResultTypeAndLength(resType, length);
478
- }
479
- return result;
480
- }
481
- async insertRecordTable(invalidate, parser) {
482
- if (await this.isCached()) {
483
- let firstTime = this.DataView.getFirstDv();
484
- if (!firstTime && invalidate) {
485
- if (!this.hasLocate) {
486
- if (this.DataView.IncludesFirst()) {
487
- if (!this.DataView.getChanged())
488
- this._dvCache.putInCache(this.DataView.replicate());
489
- else
490
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
491
- }
492
- }
493
- else
494
- this.locatePutInCache();
495
- }
496
- }
497
- await this.DataView.fillData(parser);
498
- if (invalidate)
499
- this.DataView.setChanged(false);
500
- }
501
- getHandlersTab() {
502
- return this.HandlersTab;
503
- }
504
- async buildXML(message) {
505
- this.IsAfterRetryBeforeBuildXML = this.getAfterRetry();
506
- if (this.KnownToServer && !this.IsOffline) {
507
- message.Append(XMLConstants.START_TAG + XMLConstants.MG_TAG_TASK);
508
- message.Append(" " + XMLConstants.MG_ATTR_TASKID + "=\"" + this.getTaskTag() + "\"");
509
- message.Append(" " + ConstInterface.MG_ATTR_TASK_MAINLEVEL + "=\"" + this.getMainLevel() + "\"");
510
- message.Append(XMLConstants.TAG_CLOSE);
511
- await this.DataView.buildXML(message);
512
- if (this.Form != null && this.Form.Opened)
513
- message.Append(this.Form.GetHiddenControlListXML());
514
- message.Append("\n </" + XMLConstants.MG_TAG_TASK + XMLConstants.TAG_CLOSE);
515
- }
516
- }
517
- buildXMLForRngs(message, UserRanges, locate) {
518
- let i;
519
- let fld;
520
- let cellAttr = StorageAttribute.SKIP;
521
- let toBase64 = (Environment.Instance.GetDebugLevel() <= 1);
522
- message.Append(XMLConstants.TAG_CLOSE);
523
- for (i = 0; i < UserRanges.length; i++) {
524
- message.Append(XMLConstants.START_TAG + ConstInterface.USER_RNG);
525
- let rng = UserRanges.get_Item(i);
526
- message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + rng.veeIdx + "\"");
527
- fld = this.DataView.getField(rng.veeIdx - 1);
528
- let fldAttr = fld.getType();
529
- if (rng.nullMin)
530
- message.Append(" " + ConstInterface.NULL_MIN_RNG + "=\"1\"");
531
- if (!rng.discardMin && rng.min != null) {
532
- let val = RecordUtils.itemValToXML(rng.min, fldAttr, cellAttr, toBase64);
533
- message.Append(" " + ConstInterface.MIN_RNG + "=\"" + val + "\"");
534
- }
535
- if (rng.nullMax)
536
- message.Append(" " + ConstInterface.NULL_MAX_RNG + "=\"1\"");
537
- if (!rng.discardMax && rng.max != null) {
538
- let val = RecordUtils.itemValToXML(rng.max, fldAttr, cellAttr, toBase64);
539
- message.Append(" " + ConstInterface.MAX_RNG + "=\"" + val + "\"");
540
- }
541
- message.Append(XMLConstants.TAG_TERM);
542
- }
543
- if (locate)
544
- message.Append(XMLConstants.END_TAG + ConstInterface.USER_LOCATES + XMLConstants.TAG_CLOSE);
545
- else
546
- message.Append(XMLConstants.END_TAG + ConstInterface.USER_RANGES + XMLConstants.TAG_CLOSE);
547
- }
548
- buildXMLForSorts(message) {
549
- if (this.UserSorts != null && this.UserSorts.length > 0) {
550
- let i;
551
- for (i = 0; i < this.UserSorts.length; i++) {
552
- message.Append(XMLConstants.TAG_CLOSE);
553
- let srt = this.UserSorts.get_Item(i);
554
- message.Append(XMLConstants.START_TAG + ConstInterface.SORT);
555
- message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + srt.fldIdx + "\"");
556
- if (srt.dir)
557
- message.Append(" " + ConstInterface.MG_ATTR_DIR + "=\"1\"");
558
- message.Append(XMLConstants.TAG_TERM);
559
- }
560
- this.UserSorts.Clear();
561
- this.UserSorts = null;
562
- message.Append(XMLConstants.END_TAG + ConstInterface.MG_TAG_SORTS + XMLConstants.TAG_CLOSE);
563
- }
564
- }
565
- getUserEvent(idx) {
566
- Debug.Assert(this.UserEvtTab !== null);
567
- let retEvent = null;
568
- if (this.UserEvtTab !== null)
569
- retEvent = this.UserEvtTab.getEvent(idx);
570
- return retEvent;
571
- }
572
- SetMoveToFirstControl(moveToFirstControl) {
573
- if (moveToFirstControl || !this.IsSubForm) {
574
- if (this.Form !== null) {
575
- let alreadyMoved = this.Form.alreadyMovedToFirstControl();
576
- if (!alreadyMoved)
577
- this.Form.MovedToFirstControl = true;
578
- }
579
- }
580
- }
581
- async Start(moveToFirstControl, callByDestSubForm) {
582
- let nonInteractiveTask = null;
583
- if (!this._isStarted) {
584
- this._isStarted = true;
585
- this.InitializeExecution();
586
- this.InStartProcess = true;
587
- let result = await this.Setup();
588
- if (!result.Success)
589
- return null;
590
- this._inProcessingTopMostEndTaskSaved = AccessHelper.eventsManager.getProcessingTopMostEndTask();
591
- AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
592
- await this.EnableActions();
593
- result = await this.InitializeForm(moveToFirstControl);
594
- if (!result.Success)
595
- return null;
596
- if (!this.IsInteractive && !this._isMainPrg)
597
- nonInteractiveTask = this;
598
- this.DataViewWasRetrieved = true;
599
- let subTasks = this.SubTasks;
600
- if (this.isMainProg())
601
- this.SubTasks = null;
602
- if (this.isMainProg())
603
- this.SubTasks = subTasks;
604
- if (!result.Success)
605
- return null;
606
- if (this._aborting)
607
- return null;
608
- let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.FirstChunk);
609
- result = await this.DataviewManager.Execute(dataViewCommand);
610
- if (!result.Success)
611
- return null;
612
- this.ResumeSubformLayout();
613
- }
614
- nonInteractiveTask = await this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
615
- this.InStartProcess = false;
616
- return nonInteractiveTask;
617
- }
618
- InitializeExecution() {
619
- super.setBrkLevel(ConstInterface.BRK_LEVEL_REC_MAIN, -1);
620
- this._firstRecordCycle = true;
621
- this._currStartProgLevel = ((this.IsSubForm && this.getParent().getForm().alreadyMovedToFirstControl())
622
- ? this.getParent()._currStartProgLevel
623
- : Task.StartProgLevel);
624
- }
625
- async InitializeForm(moveToFirstControl) {
626
- if (this.Form !== null) {
627
- this.SetMoveToFirstControl(moveToFirstControl);
628
- AccessHelper.eventsManager.pushNewExecStacks();
629
- this.routeParams = this.DataView.GetRouteParams();
630
- await this.InitForm();
631
- AccessHelper.eventsManager.popNewExecStacks();
632
- this.getMGData().StartTimers();
633
- Commands.beginInvoke();
634
- }
635
- return new ReturnResult();
636
- }
637
- async StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm) {
638
- if (this.hasSubTasks()) {
639
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
640
- let task = this.SubTasks.getTask(i);
641
- let tmpNonInteractiveTask = await task.Start(moveToFirstControl, callByDestSubForm);
642
- if (nonInteractiveTask === null)
643
- nonInteractiveTask = tmpNonInteractiveTask;
644
- else if (tmpNonInteractiveTask !== null)
645
- Debug.Assert(false, "more than 1 non interactive in task.start");
646
- }
647
- }
648
- return nonInteractiveTask;
649
- }
650
- async EnableActions() {
651
- let actList = ActionManager.actEnabled;
652
- this.ActionManager.enableList(actList, true, false);
653
- if (this.IsSubForm)
654
- this.ActionManager.enable(InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT, true);
655
- await this.enableModes();
656
- if (await this.checkProp(PropInterface.PROP_TYPE_SELECTION, false)) {
657
- this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
658
- }
659
- let enablePrintdata = await this.checkProp(PropInterface.PROP_TYPE_PRINT_DATA, false);
660
- this.ActionManager.enable(InternalInterface.MG_ACT_PRINT_DATA, enablePrintdata);
661
- if (this.getEnableZoomHandler())
662
- this.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
663
- }
664
- async ShowError(text) {
665
- let mlsTransText = LanguageData.Instance.translate(text);
666
- let mlsTransTitle = LanguageData.Instance.translate(ConstInterface.ERROR_STRING);
667
- await GUIManager.Instance.MessageBox(mlsTransTitle, mlsTransText, Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
668
- }
669
- async EndTaskOnError(result, displayError) {
670
- if (!result.Success && !this.isAborting()) {
671
- if (this.InStartProcess) {
672
- await this.endTask(false, false, false);
673
- if (displayError)
674
- await this.ShowError(result.ErrorDescription);
675
- this.InStartProcess = false;
676
- return true;
677
- }
678
- else {
679
- if (displayError)
680
- await this.ShowError(result.ErrorDescription);
681
- await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_EXIT);
682
- }
683
- }
684
- return false;
685
- }
686
- async Setup() {
687
- let result;
688
- this.TaskService.InitTaskPrefixExecutedFlag(this);
689
- this.TaskSuffixExecuted = false;
690
- TaskServiceBase.CreateFirstRecord(this);
691
- let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Init);
692
- result = await this.DataviewManager.Execute(dataViewCommand);
693
- if (!result.Success)
694
- return result;
695
- if (result.Success) {
696
- let commands = GlobalCommandsManager.Instance.getCommandsExecutedAfterTaskStarted();
697
- for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
698
- let command = (commands.get_Item(cmdIdx));
699
- if (command.TaskTag === this.getTaskTag()) {
700
- await command.Execute(null);
701
- GlobalCommandsManager.Instance.removeCommandsExecutedAfterTaskStarted(command);
702
- }
703
- }
704
- dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Prepare);
705
- result = await this.DataviewManager.Execute(dataViewCommand);
706
- }
707
- if (result.Success) {
708
- result = this.TaskService.PrepareTask(this);
709
- if (!result.Success)
710
- await this.EndTaskOnError(result, true);
711
- }
712
- if (result.Success) {
713
- dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.InitDataControlViews);
714
- result = await this.DataviewManager.Execute(dataViewCommand);
715
- }
716
- return result;
717
- }
718
- async doFirstRecordCycle() {
719
- if (!this._isMainPrg) {
720
- AccessHelper.eventsManager.pushNewExecStacks();
721
- this.SubformExecMode = Task_SubformExecModeEnum.FIRST_TIME;
722
- await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(this, InternalInterface.MG_ACT_REC_PREFIX, this.IsSubForm);
723
- if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
724
- if (this.IsSubForm) {
725
- if (this.hasSubTasks())
726
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
727
- let subTask = this.SubTasks.getTask(i);
728
- if (subTask.IsSubForm) {
729
- subTask.getForm().IgnoreFirstRecordCycle = true;
730
- await subTask.doFirstRecordCycle();
731
- }
732
- }
733
- }
734
- }
735
- this.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
736
- AccessHelper.eventsManager.popNewExecStacks();
737
- }
738
- }
739
- CheckAndSetSubForm() {
740
- this.IsSubForm = (!super.isMainProg() && this !== this._mgData.getFirstTask());
741
- }
742
- IsRoute() {
743
- return (this.RouterPath != null);
744
- }
745
- async stop() {
746
- let task;
747
- if (this._aborting)
748
- return;
749
- if (this.hasSubTasks()) {
750
- while ((task = this.SubTasks.getTask(0)) != null) {
751
- task.setDestinationSubform(this._destinationSubform);
752
- await task.stop();
753
- }
754
- }
755
- if (!this._isMainPrg)
756
- this._aborting = true;
757
- if (this._parentTask != null) {
758
- this._parentTask.removeSubTask(this);
759
- if (this.IsSubForm) {
760
- let oldTimers = new List(), newTimers = new List();
761
- let mgd = this.getMGData();
762
- if (mgd.getTimerHandlers() != null)
763
- oldTimers = mgd.getTimerHandlers().getTimersVector();
764
- mgd.removeTimerHandler(this);
765
- mgd.removeExpressionHandler(this);
766
- if (mgd.getTimerHandlers() != null)
767
- newTimers = mgd.getTimerHandlers().getTimersVector();
768
- mgd.changeTimers(oldTimers, newTimers);
769
- mgd.removeTask(this);
770
- GUIManager.Instance.abort(this.getForm());
771
- }
772
- }
773
- this.AbortTransaction();
774
- if (this.getClickedControl() != null)
775
- RuntimeContextBase.Instance.CurrentClickedCtrl = null;
776
- if (this.Form != null)
777
- this.Form.removeRefsToCtrls();
778
- if (this.IsSubForm) {
779
- let subForm = this.Form.getSubFormCtrl();
780
- subForm.setSubformTaskId(null);
781
- subForm.initSubformTask();
782
- if (LastFocusedManager.Instance.getLastFocusedTask() === this)
783
- LastFocusedManager.Instance.setLastFocusedTask(this._parentTask);
784
- if (subForm.SubformLoaded)
785
- await (subForm.getProp(PropInterface.PROP_TYPE_VISIBLE)).RefreshDisplay(true);
786
- }
787
- let clearDataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Clear);
788
- await this.DataviewManager.Execute(clearDataViewCommand);
789
- }
790
- abort() {
791
- this.getMGData().abort();
792
- }
793
- hasSubTasks() {
794
- return this.SubTasks !== null && this.SubTasks.getSize() > 0;
795
- }
796
- getTaskDepth(byParentOrder) {
797
- if (byParentOrder)
798
- return this.getTaskDepth_(byParentOrder);
799
- let depth = this.GetContextTask().getTaskDepth_(byParentOrder);
800
- if (this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
801
- depth = depth + 1;
802
- return depth;
803
- }
804
- getTaskDepth_(byParentOrder) {
805
- let tmpTask = this.getTriggeringTask();
806
- if (tmpTask == null || byParentOrder)
807
- if (this._parentTask == null)
808
- return 1;
809
- else {
810
- if (byParentOrder && this.getCtlIdx() !== this._parentTask.getCtlIdx())
811
- return 2 + this._parentTask.getTaskDepth_(byParentOrder);
812
- return 1 + this._parentTask.getTaskDepth_(byParentOrder);
813
- }
814
- return 1 + (tmpTask).getTaskDepth_(byParentOrder);
815
- }
816
- GetTaskAncestor(generation) {
817
- return this.getTaskAncestor_(generation);
818
- }
819
- getTaskAncestor_(generation) {
820
- let retTask = null;
821
- if (generation === 0)
822
- retTask = this;
823
- else {
824
- let tmpTask = this.getTriggeringTask();
825
- if (tmpTask === null)
826
- tmpTask = this._parentTask;
827
- if (tmpTask !== null)
828
- retTask = tmpTask.getTaskAncestor_(--generation);
829
- }
830
- return retTask;
831
- }
832
- GetTaskDepth() {
833
- return this.getTaskDepth(false);
834
- }
835
- pathContains(task) {
836
- return this._taskPath.Contains(task);
837
- }
838
- SetContextTask(context) {
839
- this.ContextTask = context;
840
- }
841
- GetContextTask() {
842
- let currRec = (this.DataView.getCurrRec());
843
- if (this.InStartProcess
844
- || currRec !== null && (currRec.InCompute || currRec.InRecompute)
845
- || this.Form !== null && this.Form.inRefreshDisplay())
846
- return this;
847
- return this.ContextTask;
848
- }
849
- getTriggeringTask() {
850
- if (this._triggeringTask !== null && this._triggeringTask.getMGData().IsAborting)
851
- this._triggeringTask = this._parentTask;
852
- return this._triggeringTask;
853
- }
854
- setLastParkedCtrl(ctrl) {
855
- super.setLastParkedCtrl(ctrl);
856
- LastFocusedManager.setLastFocusedControl(this, ctrl);
857
- }
858
- queryTaskPath() {
859
- let insertedNames = 0;
860
- let result = new StringBuilder(7936);
861
- let treeRoute = new Array(this.getTaskDepth(false));
862
- this.pathToRoot(treeRoute, false);
863
- for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
864
- let currTsk = treeRoute[tsk];
865
- if (currTsk.isMainProg())
866
- continue;
867
- let nameProp = currTsk.getProp(PropInterface.PROP_TYPE_NAME);
868
- if (nameProp == null)
869
- continue;
870
- let name = nameProp.GetComputedValue();
871
- if (!NString.IsNullOrEmpty(name)) {
872
- if (insertedNames++ !== 0)
873
- result.Append(';');
874
- result.Append(name);
875
- }
876
- }
877
- return result;
878
- }
879
- ctl_itm_2_parent_vee(itm) {
880
- let currTsk;
881
- let currItm = 0;
882
- let lastItm = 0;
883
- let treeRoute = new Array(this.getTaskDepth(true));
884
- this.pathToRoot(treeRoute, true);
885
- for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
886
- currTsk = treeRoute[tsk];
887
- currItm += currTsk.DataView.GetFieldsTab().getSize();
888
- if (itm < currItm) {
889
- itm -= lastItm;
890
- return currTsk.DataView.getField(itm);
891
- }
892
- lastItm = currItm;
893
- }
894
- return null;
895
- }
896
- GetControlIDFromVarItem(item) {
897
- let currTask;
898
- let currItem = 0;
899
- let lastItem = 0;
900
- let noOfControlsBeforeCurrTask = 0;
901
- let treeRoute = new Array(this.getTaskDepth(true));
902
- this.pathToRoot(treeRoute, true);
903
- for (let task = treeRoute.length - 1; task >= 0; task--) {
904
- currTask = treeRoute[task];
905
- currItem += currTask.DataView.GetFieldsTab().getSize();
906
- if (item < currItem) {
907
- item -= lastItem;
908
- let field = currTask.DataView.getField(item);
909
- if (field.getCtrl() != null)
910
- return noOfControlsBeforeCurrTask = noOfControlsBeforeCurrTask + currTask.Form.getControlIdx(field.getCtrl()) + 1;
911
- return 0;
912
- }
913
- if (currTask.Form != null)
914
- noOfControlsBeforeCurrTask += currTask.Form.getCtrlCount();
915
- lastItem = currItem;
916
- }
917
- return 0;
918
- }
919
- GetControlFromControlID(controlID, parent) {
920
- let control = null;
921
- parent.value = -1;
922
- if (controlID >= 0) {
923
- let currTask = null;
924
- let callerTask = null;
925
- let noOfControlsInCurrtask = 0;
926
- let noOfControlsBeforeCurrTask = 0;
927
- let controlIdx = 0;
928
- let treeRoute = new Array(this.getTaskDepth(true));
929
- this.pathToRoot(treeRoute, true);
930
- for (let task = treeRoute.length - 1; task >= 0; task--) {
931
- currTask = treeRoute[task];
932
- if (currTask.Form != null) {
933
- noOfControlsInCurrtask = currTask.Form.getCtrlCount();
934
- if (controlID < (noOfControlsBeforeCurrTask + noOfControlsInCurrtask)) {
935
- controlIdx = controlID - noOfControlsBeforeCurrTask;
936
- control = currTask.Form.CtrlTab.getCtrl(controlIdx);
937
- callerTask = currTask;
938
- break;
939
- }
940
- noOfControlsBeforeCurrTask += noOfControlsInCurrtask;
941
- }
942
- }
943
- if (control != null) {
944
- parent.value = 0;
945
- let prevCtlIdx = treeRoute[0].TaskDefinitionId.CtlIndex;
946
- for (let task = 0; task < treeRoute.length - 1; task++) {
947
- currTask = treeRoute[task];
948
- if (prevCtlIdx !== currTask.TaskDefinitionId.CtlIndex)
949
- parent.value++;
950
- if (callerTask.TaskDefinitionId.CtlIndex === currTask.TaskDefinitionId.CtlIndex)
951
- break;
952
- prevCtlIdx = currTask.TaskDefinitionId.CtlIndex;
953
- }
954
- }
955
- }
956
- return control;
957
- }
958
- ctl_itm_4_parent_vee(parent, vee) {
959
- let tsk;
960
- let depth = this.getTaskDepth(true);
961
- if (parent !== TaskBase.MAIN_PRG_PARENT_ID && depth <= parent)
962
- return vee;
963
- let treeRoute = new Array(depth);
964
- if (vee !== 0) {
965
- this.pathToRoot(treeRoute, true);
966
- let indOfParentInTaskTree = this.getIndOfParentInTaskTree(parent, treeRoute);
967
- let i;
968
- for (i = treeRoute.length - 1; i > indOfParentInTaskTree; i--) {
969
- tsk = treeRoute[i];
970
- vee += tsk.DataView.GetFieldsTab().getSize();
971
- }
972
- }
973
- return vee;
974
- }
975
- getIndOfParentInTaskTree(parent, taskTree) {
976
- let indOfParentInTaskTree = 0;
977
- if (parent === TaskBase.MAIN_PRG_PARENT_ID) {
978
- for (let i = 1; i < taskTree.length; i = i + 1) {
979
- if (taskTree[i].isMainProg() && this._ctlIdx === taskTree[i].getCtlIdx()) {
980
- indOfParentInTaskTree = i;
981
- break;
982
- }
983
- }
984
- }
985
- else
986
- indOfParentInTaskTree = parent;
987
- return indOfParentInTaskTree;
988
- }
989
- getFieldByName(fldName) {
990
- return (this.GetContextTask()).getFieldByName_(fldName);
991
- }
992
- getFieldByName_(fldName) {
993
- let tmpTask;
994
- if (fldName == null)
995
- return null;
996
- let fld = this.getField(fldName);
997
- if (fld == null) {
998
- tmpTask = this.getTriggeringTask() != null ? this.getTriggeringTask() : this._parentTask;
999
- if (tmpTask != null) {
1000
- if (!this.isMainProg() && this.getCtlIdx() !== tmpTask.getCtlIdx()) {
1001
- let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, this.getCtlIdx());
1002
- fld = mainPrg.getFieldByName_(fldName);
1003
- }
1004
- if (fld == null)
1005
- fld = tmpTask.getFieldByName_(fldName);
1006
- }
1007
- }
1008
- return fld;
1009
- }
1010
- getIndexOfFieldByName(fldName) {
1011
- let depth = this.getTaskDepth(true);
1012
- let index = 0;
1013
- let fld = this.getFieldByName(fldName);
1014
- let fldTab;
1015
- if (fld == null)
1016
- return 0;
1017
- let treeRoute = new Array(depth);
1018
- this.pathToRoot(treeRoute, true);
1019
- for (let curr = depth - 1; curr >= 0; curr--) {
1020
- let currTask = treeRoute[curr];
1021
- if (currTask === fld.getTask()) {
1022
- curr = fld.getId();
1023
- index += ++curr;
1024
- break;
1025
- }
1026
- fldTab = currTask.DataView.GetFieldsTab();
1027
- index += fldTab.getSize();
1028
- }
1029
- return index;
1030
- }
1031
- pathToRoot(path, byParentOrder) {
1032
- let task = (byParentOrder ? this : this.GetContextTask());
1033
- for (let i = 0; i < path.length; i++) {
1034
- path[i] = task;
1035
- let ctlIdx = task.getCtlIdx();
1036
- let tmpTask = byParentOrder ? null : task.getTriggeringTask();
1037
- if (tmpTask != null)
1038
- task = tmpTask;
1039
- else {
1040
- task = task.getParent();
1041
- if (task == null) {
1042
- if (!byParentOrder && this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
1043
- path[i + 1] = this;
1044
- break;
1045
- }
1046
- if (byParentOrder && ctlIdx !== task.getCtlIdx())
1047
- path[++i] = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
1048
- }
1049
- }
1050
- }
1051
- shouldBeRefreshed() {
1052
- let dataView = this._parentTask.DataView;
1053
- let result = false;
1054
- if (this._parentTask === null || dataView.isPrevCurrRecNull() ||
1055
- (this.RefreshOnVars !== null && !dataView.currEqualsPrev(this.RefreshOnVars)))
1056
- result = true;
1057
- return result;
1058
- }
1059
- async CheckRefreshSubTasks() {
1060
- let ret = false;
1061
- if (this._enteredRecLevel) {
1062
- let subformsToRefresh = await this.GetSubformsToRefresh();
1063
- if (subformsToRefresh.length > 0)
1064
- ret = true;
1065
- }
1066
- return ret;
1067
- }
1068
- GetSubTasks() {
1069
- let subTasks = new List();
1070
- if (this.hasSubTasks()) {
1071
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1)
1072
- subTasks.push(this.SubTasks.getTask(i));
1073
- }
1074
- return subTasks;
1075
- }
1076
- async GetSubformsToRefresh() {
1077
- let subTasks = this.GetSubTasks();
1078
- let subTasksToRefresh = new List();
1079
- for (let i = 0; i < subTasks.length; i++) {
1080
- let subTask = subTasks.get_Item(i);
1081
- if (await this.ShouldRefreshSubformTask(subTask))
1082
- subTasksToRefresh.push(subTask);
1083
- }
1084
- return subTasksToRefresh;
1085
- }
1086
- async ShouldRefreshSubformTask(subTask) {
1087
- let refresh = false;
1088
- let subformCtrl = subTask.getForm().getSubFormCtrl();
1089
- subTask.DoSubformPrefixSuffix = false;
1090
- if (subformCtrl != null && !subTask.InSelect && subTask.AfterFirstRecordPrefix) {
1091
- let parentMode = this.getMode();
1092
- let modeProperty = (parentMode === Constants.TASK_MODE_QUERY ? PropInterface.PROP_TYPE_ALLOW_QUERY
1093
- : parentMode === Constants.TASK_MODE_MODIFY
1094
- ? PropInterface.PROP_TYPE_ALLOW_MODIFY
1095
- : PropInterface.PROP_TYPE_ALLOW_CREATE);
1096
- if (subTask.ModeAsParent && parentMode !== subTask.getMode() &&
1097
- this.getLevel() === Constants.TASK_LEVEL_RECORD &&
1098
- await (subTask.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean() &&
1099
- await subTask.checkProp(modeProperty, true)) {
1100
- if (!subformCtrl.isVisible() &&
1101
- !await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
1102
- subformCtrl.RefreshOnVisible = true;
1103
- refresh = false;
1104
- }
1105
- else
1106
- refresh = true;
1107
- await subTask.SetModeAsParent(parentMode);
1108
- }
1109
- else {
1110
- refresh = await subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true) && subTask.shouldBeRefreshed();
1111
- if (refresh) {
1112
- if (!subformCtrl.isVisible() &&
1113
- !await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
1114
- subformCtrl.RefreshOnVisible = true;
1115
- refresh = false;
1116
- }
1117
- }
1118
- }
1119
- if (refresh)
1120
- subTask.DoSubformPrefixSuffix = true;
1121
- }
1122
- return refresh;
1123
- }
1124
- async SetModeAsParent(parentMode) {
1125
- await this.enableModes();
1126
- if (parentMode === Constants.TASK_MODE_CREATE) {
1127
- let cmd = CommandFactory.CreateEventCommand(this.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
1128
- await this.DataviewManager.Execute(cmd);
1129
- }
1130
- else if (this.getMode() === Constants.TASK_MODE_CREATE) {
1131
- this.setPreventRecordSuffix(true);
1132
- this.setPreventControlChange(true);
1133
- await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
1134
- this.setPreventRecordSuffix(false);
1135
- this.setPreventControlChange(false);
1136
- let subTaskDv = this.DataView;
1137
- if (!subTaskDv.isEmpty() && (subTaskDv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
1138
- this.setMode(parentMode);
1139
- else
1140
- this.setMode(Constants.TASK_MODE_CREATE);
1141
- await this.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1142
- }
1143
- else
1144
- this.setMode(parentMode);
1145
- this.setOriginalTaskMode(parentMode);
1146
- await this.setCreateDeleteActsEnableState();
1147
- }
1148
- async doSubformRecPrefixSuffix() {
1149
- let subTasks = this.GetSubTasks();
1150
- for (let i = 0; i < subTasks.length; i++) {
1151
- let subTask = subTasks.get_Item(i);
1152
- if (subTask.DoSubformPrefixSuffix) {
1153
- await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subTask, InternalInterface.MG_ACT_REC_PREFIX, true);
1154
- if (!AccessHelper.eventsManager.GetStopExecutionFlag())
1155
- await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_REC_SUFFIX);
1156
- }
1157
- }
1158
- }
1159
- CleanDoSubformPrefixSuffix() {
1160
- let subTasks = this.GetSubTasks();
1161
- for (let i = 0; i < subTasks.length; i++) {
1162
- let subTask = subTasks.get_Item(i);
1163
- subTask.DoSubformPrefixSuffix = false;
1164
- }
1165
- }
1166
- mustConfirmInDeleteMode() {
1167
- let prop = this.getProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE);
1168
- return !prop.isExpression();
1169
- }
1170
- addSubTask(subTask) {
1171
- if (this.SubTasks === null)
1172
- this.SubTasks = new TasksTable();
1173
- this.SubTasks.addTask(subTask);
1174
- }
1175
- removeSubTask(subTask) {
1176
- if (this.SubTasks !== null)
1177
- this.SubTasks.removeTask(subTask);
1178
- }
1179
- setTransactionFailed(val) {
1180
- this._transactionFailed = val;
1181
- if (!val)
1182
- this.TransactionErrorHandlingsRetry = null;
1183
- }
1184
- transactionFailed(level) {
1185
- if (level === ConstInterface.TRANS_NONE ||
1186
- (this.Transaction != null && this.Transaction.getLevel() === level))
1187
- return this._transactionFailed;
1188
- else if (level === ConstInterface.TRANS_NONE ||
1189
- (this.TransactionErrorHandlingsRetry != null && this.TransactionErrorHandlingsRetry.getLevel() === level))
1190
- return this._transactionFailed;
1191
- return false;
1192
- }
1193
- setAfterRetry(val) {
1194
- if (this.Transaction != null)
1195
- this.Transaction.setAfterRetry(val);
1196
- else if (this.TransactionErrorHandlingsRetry != null) {
1197
- if (val === ConstInterface.RECOVERY_NONE)
1198
- this.TransactionErrorHandlingsRetry = null;
1199
- else
1200
- this.TransactionErrorHandlingsRetry.setAfterRetry(val);
1201
- }
1202
- }
1203
- getAfterRetry(recovery) {
1204
- if (arguments.length === 0) {
1205
- return this.getAfterRetry_0();
1206
- }
1207
- return this.getAfterRetry_1(recovery);
1208
- }
1209
- getAfterRetry_0() {
1210
- if (this.Transaction != null)
1211
- return this.Transaction.getAfterRetry();
1212
- else if (this.TransactionErrorHandlingsRetry != null)
1213
- return this.TransactionErrorHandlingsRetry.getAfterRetry();
1214
- return false;
1215
- }
1216
- getAfterRetry_1(recovery) {
1217
- if (this.Transaction != null)
1218
- return this.Transaction.getAfterRetry(recovery);
1219
- else if (this.TransactionErrorHandlingsRetry != null)
1220
- return this.TransactionErrorHandlingsRetry.getAfterRetry(recovery);
1221
- return false;
1222
- }
1223
- getExecEndTask() {
1224
- return this._bExecEndTask;
1225
- }
1226
- resetExecEndTask() {
1227
- this._bExecEndTask = false;
1228
- }
1229
- setExecEndTask() {
1230
- this._bExecEndTask = true;
1231
- }
1232
- async evalEndCond(mode) {
1233
- let endTaskCondProp;
1234
- let evalEndCondProp = this.getProp(PropInterface.PROP_TYPE_EVAL_END_CONDITION);
1235
- if (this.InEndTask)
1236
- return false;
1237
- if (this._bExecEndTask)
1238
- return true;
1239
- if (evalEndCondProp != null && (NString.Compare(await evalEndCondProp.getValue(), ConstInterface.END_COND_EVAL_IMMIDIATE, true) === 0 || ((await evalEndCondProp.getValue()).toLowerCase() === mode.toLowerCase()))) {
1240
- endTaskCondProp = this.getProp(PropInterface.PROP_TYPE_END_CONDITION);
1241
- if (endTaskCondProp == null)
1242
- return false;
1243
- let endTask = await endTaskCondProp.getValue();
1244
- if (DisplayConvertor.toBoolean(endTask)) {
1245
- this._bExecEndTask = true;
1246
- return true;
1247
- }
1248
- return false;
1249
- }
1250
- return false;
1251
- }
1252
- setTryingToStop(val) {
1253
- if (this.hasSubTasks()) {
1254
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1255
- let task = this.SubTasks.getTask(i);
1256
- task.setTryingToStop(val);
1257
- }
1258
- }
1259
- this.IsTryingToStop = val;
1260
- }
1261
- getInRecordSuffix() {
1262
- return this._inRecordSuffix;
1263
- }
1264
- setInRecordSuffix(bValue) {
1265
- if (bValue !== this._inRecordSuffix) {
1266
- this._inRecordSuffix = bValue;
1267
- return true;
1268
- }
1269
- return false;
1270
- }
1271
- setEvalOldValues(bFlag) {
1272
- if (bFlag !== this._evalOldValues) {
1273
- this._evalOldValues = bFlag;
1274
- return true;
1275
- }
1276
- return false;
1277
- }
1278
- getEvalOldValues() {
1279
- return this._evalOldValues;
1280
- }
1281
- async endTask(reversibleExit, onlyDescs, dueToVerifyError, subformDestination) {
1282
- if (isNullOrUndefined(subformDestination))
1283
- return await this.endTask_1(reversibleExit, onlyDescs, false, dueToVerifyError);
1284
- else
1285
- return await this.endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError);
1286
- }
1287
- async endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError) {
1288
- let succeeded = true;
1289
- let closedSubForm = false;
1290
- let subTask;
1291
- let mgdTab = AccessHelper.mgDataTable;
1292
- if ((this.IsSubForm && !subformDestination) && !this._parentTask.InEndTask) {
1293
- succeeded = await this._parentTask.endTask(reversibleExit, onlyDescs, dueToVerifyError);
1294
- }
1295
- else if (!this.isAborting() && !this.InEndTask) {
1296
- try {
1297
- this.InEndTask = true;
1298
- if ((MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI) && AccessHelper.eventsManager.GetStopExecutionFlag()) {
1299
- let cmd = CommandFactory.CreateUnloadCommand();
1300
- MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
1301
- await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1302
- return;
1303
- }
1304
- if (!this.IsTryingToStop)
1305
- this.setTryingToStop(true);
1306
- let i;
1307
- if (reversibleExit) {
1308
- if (this.hasSubTasks()) {
1309
- if (!RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
1310
- let pendingTransactions = true;
1311
- let clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1312
- if (!clientOperExist) {
1313
- clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_REC_SUFFIX);
1314
- if (!clientOperExist)
1315
- pendingTransactions = this.CheckIfPendingTransactions(this);
1316
- }
1317
- if (!clientOperExist && !pendingTransactions) {
1318
- this.allowRemoteCmdExecution = false;
1319
- this.SetServerSideTaskSuffix(this);
1320
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1321
- }
1322
- }
1323
- else
1324
- this.SetServerSideTaskSuffix(this);
1325
- for (i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1326
- subTask = this.SubTasks.getTask(i);
1327
- closedSubForm = closedSubForm || subTask.IsSubForm;
1328
- await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_EXIT);
1329
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1330
- }
1331
- }
1332
- else {
1333
- if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution)
1334
- this.SetServerSideTaskSuffix(this);
1335
- }
1336
- if (this === mgdTab.StartupMgData.getFirstTask()) {
1337
- for (i = mgdTab.getSize() - 1; i > 0 && succeeded; i--) {
1338
- if (mgdTab.getMGData(i) != null) {
1339
- await AccessHelper.eventsManager.handleInternalEventWithTask(mgdTab.getMGData(i).getFirstTask(), InternalInterface.MG_ACT_EXIT);
1340
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1341
- }
1342
- }
1343
- }
1344
- }
1345
- if (succeeded) {
1346
- if (reversibleExit && !dueToVerifyError) {
1347
- let forceSuffix = await this.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1348
- if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1349
- this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "0");
1350
- await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
1351
- if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1352
- this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "1");
1353
- }
1354
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1355
- if (succeeded && !onlyDescs)
1356
- this.HandleTransactionInfo();
1357
- let preTskSuffix = succeeded;
1358
- if (succeeded && !onlyDescs && reversibleExit && !dueToVerifyError &&
1359
- (!this.IsSubForm || subformDestination) &&
1360
- this.TaskPrefixExecuted && !this.TaskSuffixExecuted)
1361
- succeeded = await this.handleTaskSuffix(true);
1362
- if (reversibleExit && this.hasSubTasks())
1363
- for (i = 0; i < this.SubTasks.getSize(); i++) {
1364
- subTask = this.SubTasks.getTask(i);
1365
- if (!subTask.IsSubForm)
1366
- await AccessHelper.eventsManager.handleNonReversibleEvent(subTask, InternalInterface.MG_ACT_EXIT);
1367
- }
1368
- if (reversibleExit)
1369
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1370
- if (preTskSuffix)
1371
- AccessHelper.eventsManager.setStopExecution(false);
1372
- this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1373
- if (!this.isAborting() && succeeded && !onlyDescs) {
1374
- if (reversibleExit) {
1375
- this.setTransactionFailed(false);
1376
- await this.TaskTransactionManager.checkAndCommit(false, ConstInterface.TRANS_TASK_PREFIX, false);
1377
- succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError) && !this.isAborting() && !this.transactionFailed(ConstInterface.TRANS_TASK_PREFIX);
1378
- }
1379
- this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1380
- if (succeeded) {
1381
- if (!this.allowRemoteCmdExecution) {
1382
- this.allowRemoteCmdExecution = true;
1383
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
1384
- }
1385
- else if (this.DelayCommandExecution) {
1386
- this.DelayCommandExecution = false;
1387
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1388
- }
1389
- let baseMgd = AccessHelper.mgDataTable.StartupMgData;
1390
- if (reversibleExit && baseMgd.getFirstTask().getTaskTag() === this.getTaskTag()) {
1391
- AccessHelper.eventsManager.setProcessingTopMostEndTask(true);
1392
- await AccessHelper.eventsManager.handleEvents(baseMgd, 0);
1393
- AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
1394
- if (this.isAborting()) {
1395
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
1396
- this.DelayCommandExecution = false;
1397
- this.allowRemoteCmdExecution = true;
1398
- return true;
1399
- }
1400
- }
1401
- await TaskServiceBase.Exit(this, reversibleExit, subformDestination);
1402
- if (this._parentTask != null && this._parentTask.isMainProg()) {
1403
- let mgd = AccessHelper.mgDataTable.getMGData(0);
1404
- let mainPrgTask = mgd.getMainProg(0);
1405
- let rootTask = AccessHelper.mgDataTable.StartupMgData.getFirstTask();
1406
- let endMainPrg = await mainPrgTask.checkProp(PropInterface.PROP_TYPE_END_CONDITION, false);
1407
- if (this !== rootTask && endMainPrg) {
1408
- let rtEvt = new RunTimeEvent(rootTask);
1409
- rtEvt.setInternal(InternalInterface.MG_ACT_CLOSE);
1410
- rtEvt.setCtrl(null);
1411
- rtEvt.setArgList(null);
1412
- AccessHelper.eventsManager.addToTail(rtEvt);
1413
- }
1414
- }
1415
- MgForm.CreatedForms.remove(this.Form);
1416
- }
1417
- }
1418
- }
1419
- }
1420
- finally {
1421
- if (!this.IsSubForm || subformDestination)
1422
- this.handleFinallyEndTask(succeeded, reversibleExit);
1423
- }
1424
- }
1425
- else if (this.InEndTask)
1426
- succeeded = false;
1427
- AccessHelper.eventsManager.setProcessingTopMostEndTask(this._inProcessingTopMostEndTaskSaved);
1428
- return succeeded;
1429
- }
1430
- SetServerSideTaskSuffix(task) {
1431
- var rtEvt = new RunTimeEvent(task);
1432
- rtEvt.setInternal(InternalInterface.MG_ACT_TASK_SUFFIX);
1433
- let handler = null;
1434
- var evtHanPos = new EventHandlerPosition();
1435
- evtHanPos.init(rtEvt);
1436
- handler = evtHanPos.getNext();
1437
- if (handler != null) {
1438
- for (let i = 0; i < handler.getOperationTab().getSize(); i++) {
1439
- let oper = handler.getOperationTab().getOperation(i);
1440
- oper.setExecOnServer(true);
1441
- }
1442
- }
1443
- if (task.hasSubTasks()) {
1444
- for (let i = 0; i < task.GetSubTasks().length; i++) {
1445
- let subTask = task.SubTasks.getTask(i);
1446
- this.SetServerSideTaskSuffix(subTask);
1447
- }
1448
- }
1449
- }
1450
- async CheckIfClientOperationExistsInSubformTasks(task, eventCode) {
1451
- let clientOperationExist = false;
1452
- var rtEvt = new RunTimeEvent(task);
1453
- rtEvt.setInternal(eventCode);
1454
- let handler = null;
1455
- var evtHanPos = new EventHandlerPosition();
1456
- evtHanPos.init(rtEvt);
1457
- handler = evtHanPos.getNext();
1458
- if (eventCode == InternalInterface.MG_ACT_REC_SUFFIX) {
1459
- let currRecord = task.DataView.getCurrRec();
1460
- if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1461
- clientOperationExist = true;
1462
- if (!clientOperationExist) {
1463
- let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1464
- if (forceSuffix === true)
1465
- if (task.IsInteractive || task.getMode() !== Constants.TASK_MODE_CREATE)
1466
- clientOperationExist = true;
1467
- }
1468
- }
1469
- if (handler != null && !clientOperationExist) {
1470
- let cnt = handler.getOperationTab().getSize();
1471
- for (let i = 0; i < cnt; i++) {
1472
- let oper = handler.getOperationTab().getOperation(i);
1473
- if (oper.getExecOnClient()) {
1474
- clientOperationExist = true;
1475
- break;
1476
- }
1477
- else {
1478
- if (oper.getType() == ConstInterface.MG_OPER_RAISE_EVENT) {
1479
- if (oper.GetRuntimeEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL &&
1480
- oper.GetRuntimeEvent().getInternalCode() === InternalInterface.MG_ACT_RT_REFRESH_VIEW) {
1481
- clientOperationExist = true;
1482
- break;
1483
- }
1484
- }
1485
- }
1486
- }
1487
- }
1488
- if (!clientOperationExist && task.hasSubTasks()) {
1489
- for (let i = 0; (!clientOperationExist && i < task.getSubTasks().getSize()); i++) {
1490
- let subTask = task.SubTasks.getTask(i);
1491
- clientOperationExist = await this.CheckIfClientOperationExistsInSubformTasks(subTask, eventCode);
1492
- }
1493
- }
1494
- return clientOperationExist;
1495
- }
1496
- CheckIfPendingTransactions(task) {
1497
- let pendingTransactions = false;
1498
- let currRecord = task.DataView.getCurrRec();
1499
- if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1500
- pendingTransactions = true;
1501
- if (!pendingTransactions && task.hasSubTasks()) {
1502
- for (let i = 0; (!pendingTransactions && i < task.getSubTasks().getSize()); i++) {
1503
- let subTask = task.SubTasks.getTask(i);
1504
- pendingTransactions = this.CheckIfPendingTransactions(subTask);
1505
- }
1506
- }
1507
- return pendingTransactions;
1508
- }
1509
- HandleTransactionInfo() {
1510
- let transaction = this.DataviewManager.RemoteDataviewManager.Transaction;
1511
- if (transaction !== null && transaction.isOwner(this) && transaction.getLevel() === 'P') {
1512
- this.DataviewManager.RemoteDataviewManager.Transaction = null;
1513
- this.DataView.setTransCleared();
1514
- }
1515
- }
1516
- async Exit(reversibleExit, subformDestination) {
1517
- let cmd = reversibleExit ?
1518
- CommandFactory.CreateBrowserEscEventCommand(this.getTaskTag(), subformDestination) :
1519
- CommandFactory.CreateNonReversibleExitCommand(this.getTaskTag(), subformDestination);
1520
- this._mgData.CmdsToServer.Add(cmd);
1521
- if (!subformDestination) {
1522
- try {
1523
- if (this.getTaskTag() == MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag() ||
1524
- !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI))
1525
- await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1526
- }
1527
- catch (err) {
1528
- if (this.isMainProg()) {
1529
- this._mgData.CmdsToServer.Add(cmd);
1530
- }
1531
- else
1532
- throw err;
1533
- }
1534
- }
1535
- }
1536
- handleFinallyEndTask(succeeded, reversibleExit) {
1537
- let subTask;
1538
- if (this.hasSubTasks()) {
1539
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
1540
- subTask = this.SubTasks.getTask(i);
1541
- subTask.handleFinallyEndTask(succeeded, reversibleExit);
1542
- }
1543
- }
1544
- this.InEndTask = false;
1545
- if (succeeded)
1546
- this._isStarted = false;
1547
- if (!succeeded && reversibleExit && this.IsTryingToStop)
1548
- this.setTryingToStop(false);
1549
- }
1550
- async handleTaskSuffix(withSubTasks) {
1551
- let succeeded = true;
1552
- let subTask;
1553
- if (withSubTasks) {
1554
- if (this.hasSubTasks()) {
1555
- for (let i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1556
- subTask = this.SubTasks.getTask(i);
1557
- succeeded = await subTask.handleTaskSuffix(withSubTasks);
1558
- }
1559
- }
1560
- }
1561
- if (succeeded)
1562
- await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1563
- succeeded = !AccessHelper.eventsManager.GetStopExecutionFlag();
1564
- this.TaskSuffixExecuted = true;
1565
- return succeeded;
1566
- }
1567
- setInCreateLine(inCreateLine) {
1568
- this._inCreateLine = inCreateLine;
1569
- }
1570
- getInCreateLine() {
1571
- return this._inCreateLine;
1572
- }
1573
- async handleEventOnSlaveTasks(internalEvtCode) {
1574
- let i;
1575
- let task = null;
1576
- let failureTask = null;
1577
- let mgdTab = AccessHelper.mgDataTable;
1578
- let triggeredTasks = mgdTab.getTriggeredTasks(this);
1579
- let orphans = null;
1580
- let sameTrans;
1581
- let hasSlaves = false;
1582
- let isOwner = this.Transaction != null && this.Transaction.isOwner(this);
1583
- if (isOwner) {
1584
- AccessHelper.eventsManager.setEventScopeTrans();
1585
- orphans = new List();
1586
- mgdTab.startTasksIteration();
1587
- while ((task = mgdTab.getNextTask()) != null) {
1588
- sameTrans = task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1589
- if (task !== this && sameTrans && task.PreviouslyActiveTaskId != null && mgdTab.GetTaskByID(task.PreviouslyActiveTaskId) == null)
1590
- orphans.push(task);
1591
- }
1592
- }
1593
- let scopeTrans = AccessHelper.eventsManager.isEventScopeTrans();
1594
- for (i = 0; i < triggeredTasks.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1595
- task = triggeredTasks.get_Item(i);
1596
- sameTrans = this.Transaction != null && task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1597
- if (!task.IsSubForm && (scopeTrans && sameTrans) && task.isStarted()) {
1598
- if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1599
- await task.DataView.currRecCompute(false);
1600
- await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1601
- hasSlaves = true;
1602
- }
1603
- }
1604
- for (; isOwner && i < orphans.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1605
- task = orphans.get_Item(i);
1606
- if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1607
- await task.DataView.currRecCompute(false);
1608
- await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1609
- hasSlaves = true;
1610
- }
1611
- if (hasSlaves && AccessHelper.eventsManager.GetStopExecutionFlag())
1612
- failureTask = task;
1613
- if (isOwner)
1614
- AccessHelper.eventsManager.clearEventScope();
1615
- return failureTask;
1616
- }
1617
- async enableRecordActions() {
1618
- let dataview = this.DataView;
1619
- await this.setCreateDeleteActsEnableState();
1620
- if (dataview.IncludesFirst() || dataview.IsOneWayKey) {
1621
- if (dataview.isEmptyDataview() || dataview.getCurrRecIdx() === 0) {
1622
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, false);
1623
- if (dataview.IsOneWayKey)
1624
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1625
- else
1626
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, false);
1627
- if (this.Form.isScreenMode())
1628
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1629
- }
1630
- else {
1631
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1632
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1633
- if (this.Form.isScreenMode())
1634
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1635
- }
1636
- if (!this.Form.isScreenMode())
1637
- if (dataview.isEmptyDataview() || (dataview.getCurrRecIdx() === 0) || (dataview.getTopRecIdx() === 0))
1638
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1639
- else
1640
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1641
- }
1642
- else {
1643
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1644
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1645
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1646
- }
1647
- if (dataview.IncludesLast()) {
1648
- if (((this.getMode() === Constants.TASK_MODE_QUERY) || dataview.isEmptyDataview() ||
1649
- ((this.getMode() === Constants.TASK_MODE_MODIFY) &&
1650
- (!Environment.Instance.allowCreateInModifyMode(this.getCompIdx()) ||
1651
- !await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)))) && (dataview.getCurrRecIdx() + 1) === dataview.getSize()) {
1652
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, false);
1653
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, false);
1654
- if (this.Form.isScreenMode())
1655
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1656
- }
1657
- else {
1658
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1659
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1660
- if (this.Form.isScreenMode())
1661
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1662
- }
1663
- if (!this.Form.isScreenMode()) {
1664
- if (dataview.isEmptyDataview() || ((dataview.getSize() - dataview.getTopRecIdx()) <= this.Form.getRowsInPage()))
1665
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1666
- else
1667
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1668
- }
1669
- }
1670
- else {
1671
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1672
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1673
- this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1674
- }
1675
- if (dataview.isEmptyDataview())
1676
- this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, false);
1677
- else
1678
- this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, true);
1679
- this.ActionManager.enable(InternalInterface.MG_ACT_ENTER_ROW_EDITING, true);
1680
- this.ActionManager.enable(InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS, true);
1681
- }
1682
- isStarted() {
1683
- return this._isStarted;
1684
- }
1685
- getSubTasks() {
1686
- return this.SubTasks;
1687
- }
1688
- refreshesOn(fldId) {
1689
- let result = false;
1690
- for (let i = 0; !result && this.RefreshOnVars !== null && i < this.RefreshOnVars.length; i++) {
1691
- result = (this.RefreshOnVars[i] === fldId);
1692
- }
1693
- return result;
1694
- }
1695
- AbortTransaction() {
1696
- this.DataviewManager.RemoteDataviewManager.Transaction = null;
1697
- }
1698
- setPreventRecordSuffix(val) {
1699
- this._preventRecordSuffix = val;
1700
- }
1701
- getPreventRecordSuffix() {
1702
- return this._preventRecordSuffix;
1703
- }
1704
- setPreventControlChange(val) {
1705
- this._preventControlChange = val;
1706
- }
1707
- getPreventControlChange() {
1708
- return this._preventControlChange;
1709
- }
1710
- resetKnownToServer() {
1711
- this._knownToServer = false;
1712
- }
1713
- evaluateDescriptor() {
1714
- let result = "";
1715
- let res;
1716
- if (this.DvPosDescriptor == null)
1717
- return HashUtils.GetHashCode(result);
1718
- let first = true;
1719
- for (let i = 0; i < this.DvPosDescriptor.length; i++) {
1720
- if (!first)
1721
- result += ";";
1722
- let currentCell = this.DvPosDescriptor.get_Item(i);
1723
- let currentTag = currentCell[0];
1724
- let currentVeeIdx = NNumber.Parse(currentCell[1]);
1725
- let currentTask = AccessHelper.mgDataTable.GetTaskByID(currentTag);
1726
- let currentField = currentTask.DataView.getField(currentVeeIdx);
1727
- let dispVal = currentField.getDispValue();
1728
- if (currentField.isNull())
1729
- dispVal = "";
1730
- let pic;
1731
- switch (currentField.getType()) {
1732
- case StorageAttribute.BOOLEAN:
1733
- case StorageAttribute.ALPHA:
1734
- case StorageAttribute.UNICODE:
1735
- case StorageAttribute.BLOB:
1736
- case StorageAttribute.BLOB_VECTOR:
1737
- result += dispVal;
1738
- break;
1739
- case StorageAttribute.DATE:
1740
- case StorageAttribute.TIME:
1741
- if (dispVal !== "") {
1742
- pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1743
- let conv = DisplayConvertor.Instance;
1744
- result += conv.mg2disp(dispVal, "", pic, false, this.getCompIdx(), false);
1745
- }
1746
- break;
1747
- case StorageAttribute.NUMERIC:
1748
- if (dispVal !== "") {
1749
- res = new NUM_TYPE(dispVal);
1750
- pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1751
- result += res.to_a(pic);
1752
- }
1753
- break;
1754
- }
1755
- first = false;
1756
- }
1757
- let tmpStr2 = StrUtil.stringToHexaDump(result, 4);
1758
- return HashUtils.GetHashCode(tmpStr2);
1759
- }
1760
- setDescriptor(newDesc) {
1761
- if (!(newDesc.trim() === "")) {
1762
- let desc = StrUtil.tokenize(newDesc, ";");
1763
- this.DvPosDescriptor = new List();
1764
- for (let i = 0; i < desc.length; i = i + 1) {
1765
- let cell = new Array(2);
1766
- let tagVeePair = StrUtil.tokenize(desc[i], ",");
1767
- cell[0] = tagVeePair[0];
1768
- cell[1] = tagVeePair[1];
1769
- this.DvPosDescriptor.push(cell);
1770
- }
1771
- }
1772
- }
1773
- getTaskCache() {
1774
- return this._dvCache;
1775
- }
1776
- async prepareCache(ignoreCurr) {
1777
- let success = true;
1778
- if (!ignoreCurr) {
1779
- if (await this.isCached()) {
1780
- if (this.DataView.getChanged()) {
1781
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1782
- success = false;
1783
- }
1784
- }
1785
- else {
1786
- if (this.IsSubForm && !await this.isCached()) {
1787
- success = false;
1788
- }
1789
- }
1790
- }
1791
- let curretTask;
1792
- if (this.hasSubTasks()) {
1793
- for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1794
- curretTask = this.SubTasks.getTask(i);
1795
- if (!await curretTask.prepareCache(false)) {
1796
- success = false;
1797
- }
1798
- }
1799
- }
1800
- return success;
1801
- }
1802
- async testAndSet(ignoreCurr) {
1803
- if (!ignoreCurr && await this.isCached()) {
1804
- let requestedDv = this.evaluateDescriptor();
1805
- if (requestedDv !== this.DataView.getDvPosValue()) {
1806
- let fromCache = this._dvCache.getCachedDataView(requestedDv);
1807
- if (fromCache == null)
1808
- return false;
1809
- await this.changeDv(fromCache);
1810
- }
1811
- this.DoSubformPrefixSuffix = true;
1812
- }
1813
- if (this.hasSubTasks()) {
1814
- for (let i = 0; i < this.SubTasks.getSize(); i++) {
1815
- if (!await this.SubTasks.getTask(i).testAndSet(false))
1816
- return false;
1817
- }
1818
- }
1819
- return true;
1820
- }
1821
- async changeDv(fromCache) {
1822
- let dataview = this.DataView;
1823
- if (!this.hasLocate) {
1824
- if (!dataview.getChanged() && dataview.IncludesFirst())
1825
- this._dvCache.putInCache(dataview.replicate());
1826
- }
1827
- else
1828
- this.locatePutInCache();
1829
- await dataview.setSameAs(fromCache);
1830
- dataview.takeFldValsFromCurrRec();
1831
- this.Form.SetTableItemsCount(0, true);
1832
- this.Form.setTableItemsCount(false);
1833
- await this.Form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
1834
- this.setOriginalTaskMode(this.getMode());
1835
- }
1836
- setOriginalTaskMode(originalTaskMode) {
1837
- this._originalTaskMode = originalTaskMode.charAt(0);
1838
- }
1839
- getOriginalTaskMode() {
1840
- return this._originalTaskMode;
1841
- }
1842
- async isCached() {
1843
- return this.IsSubForm && await this.Form.getSubFormCtrl().checkProp(PropInterface.PROP_TYPE_IS_CACHED, false);
1844
- }
1845
- locatePutInCache() {
1846
- let cached = this._dvCache.getCachedDataView(this.DataView.getDvPosValue());
1847
- if (cached != null) {
1848
- if (this.DataView.checkFirst(cached.getLocateFirstRec()) && !this.DataView.getChanged()) {
1849
- this.DataView.setLocateFirstRec(cached.getLocateFirstRec());
1850
- this._dvCache.putInCache(this.DataView.replicate());
1851
- }
1852
- else
1853
- this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1854
- }
1855
- else {
1856
- if (!this.DataView.getChanged())
1857
- this._dvCache.putInCache(this.DataView.replicate());
1858
- }
1859
- }
1860
- HasLoacte() {
1861
- return this.hasLocate;
1862
- }
1863
- setRemoteTransaction(transId) {
1864
- let mgdTab = AccessHelper.mgDataTable;
1865
- let transTask;
1866
- let isFind = false;
1867
- mgdTab.startTasksIteration();
1868
- while ((transTask = mgdTab.getNextTask()) != null) {
1869
- if (transTask.DataviewManager.RemoteDataviewManager.Transaction != null &&
1870
- transTask.DataviewManager.RemoteDataviewManager.Transaction.getTransId() === transId) {
1871
- isFind = true;
1872
- break;
1873
- }
1874
- }
1875
- this.DataviewManager.RemoteDataviewManager.Transaction = (isFind ?
1876
- transTask.DataviewManager.RemoteDataviewManager.Transaction :
1877
- new Transaction(this, transId));
1878
- }
1879
- setTransOwnerTask() {
1880
- this.Transaction.setOwnerTask(this);
1881
- this.Transaction.setTransBegin('T');
1882
- }
1883
- getLoopCounter() {
1884
- let result = 0;
1885
- if (this._useLoopStack && this._loopStack !== null && !(this._loopStack.count() === 0)) {
1886
- result = this._loopStack.peek();
1887
- }
1888
- return result;
1889
- }
1890
- enterLoop() {
1891
- if (this._loopStack === null)
1892
- this._loopStack = new Stack();
1893
- this._loopStack.push(0);
1894
- }
1895
- leaveLoop() {
1896
- this.popLoopCounter();
1897
- }
1898
- popLoopCounter() {
1899
- let result = 0;
1900
- if (this._loopStack !== null && !(this._loopStack.count() === 0))
1901
- result = this._loopStack.pop();
1902
- return result;
1903
- }
1904
- increaseLoopCounter() {
1905
- this._loopStack.push(this.popLoopCounter() + 1);
1906
- }
1907
- getLoopStackSize() {
1908
- if (this._loopStack !== null)
1909
- return this._loopStack.count();
1910
- return 0;
1911
- }
1912
- setUseLoopStack(val) {
1913
- this._useLoopStack = val;
1914
- }
1915
- getDataviewHeaders() {
1916
- return this.DataviewHeadersTable;
1917
- }
1918
- isFirstRecordCycle(Value_) {
1919
- if (arguments.length === 0) {
1920
- return this.isFirstRecordCycle_0();
1921
- }
1922
- return this.isFirstRecordCycle_1(Value_);
1923
- }
1924
- isFirstRecordCycle_0() {
1925
- return this._firstRecordCycle;
1926
- }
1927
- isFirstRecordCycle_1(Value_) {
1928
- this._firstRecordCycle = Value_;
1929
- }
1930
- getPublicName() {
1931
- return this.PublicName;
1932
- }
1933
- async isAllowEvents() {
1934
- let prop = this.getProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS);
1935
- return await prop.getValueBoolean();
1936
- }
1937
- getExternalTaskId() {
1938
- let taskId = "";
1939
- let prop = this.getProp(PropInterface.PROP_TYPE_TASK_ID);
1940
- if (prop != null)
1941
- taskId = prop.GetComputedValue();
1942
- return taskId;
1943
- }
1944
- isTransactionOwner() {
1945
- let isTransOwner = false;
1946
- if (this.Transaction != null && this.Transaction.isOwner(this))
1947
- isTransOwner = true;
1948
- return isTransOwner;
1949
- }
1950
- isTransactionOnLevel(level) {
1951
- return this.isTransactionOwner() && this.Transaction.getLevel() === level;
1952
- }
1953
- isProgram() {
1954
- return this._isPrg;
1955
- }
1956
- async enableModes() {
1957
- let enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
1958
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_MODIFY, enable);
1959
- enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true);
1960
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_CREATE, enable);
1961
- enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_QUERY, true);
1962
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_QUERY, enable);
1963
- enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_RANGE, true);
1964
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_RANGE, enable);
1965
- enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE, true);
1966
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_LOCATE, enable);
1967
- this.ActionManager.enable(InternalInterface.MG_ACT_RTO_SEARCH, enable);
1968
- enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_SORT, true);
1969
- this.ActionManager.enable(InternalInterface.MG_ACT_SORT_RECORDS, enable);
1970
- enable = await this.checkProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX, true);
1971
- this.ActionManager.enable(InternalInterface.MG_ACT_VIEW_BY_KEY, enable);
1972
- this.ActionManager.enable(InternalInterface.MG_ACT_DUMP_ENVIRONMENT, true);
1973
- }
1974
- setEnableZoomHandler() {
1975
- this._enableZoomHandler = true;
1976
- }
1977
- getEnableZoomHandler() {
1978
- return this._enableZoomHandler;
1979
- }
1980
- isDestinationSubform() {
1981
- return this._destinationSubform;
1982
- }
1983
- setDestinationSubform(destinationSubform) {
1984
- this._destinationSubform = destinationSubform;
1985
- }
1986
- getIsDestinationCall() {
1987
- return this._isDestinationCall;
1988
- }
1989
- setIsDestinationCall(isDestinationCall) {
1990
- this._isDestinationCall = isDestinationCall;
1991
- }
1992
- setCancelWasRaised(val) {
1993
- this._cancelWasRaised = val;
1994
- }
1995
- cancelWasRaised() {
1996
- return this._cancelWasRaised;
1997
- }
1998
- enableCreateActs(val) {
1999
- this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE, val);
2000
- this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE_ABOVE, (this.getForm().HasTable()) ? val : false);
2001
- }
2002
- async setCreateDeleteActsEnableState() {
2003
- if (!(this.DataView).isEmptyDataview() && await this.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true) &&
2004
- this.getMode() === Constants.TASK_MODE_MODIFY && this.DataView.HasMainTable)
2005
- this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, true);
2006
- else
2007
- this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
2008
- if ((await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) &&
2009
- (this.DataView.HasMainTable &&
2010
- (this.getMode() === Constants.TASK_MODE_MODIFY && Environment.Instance.allowCreateInModifyMode(this.getCompIdx())) ||
2011
- (this.getMode() === Constants.TASK_MODE_CREATE)))
2012
- this.enableCreateActs(true);
2013
- else
2014
- this.enableCreateActs(false);
2015
- }
2016
- setEmptyDataview(emptyDataview) {
2017
- this.DataView.setEmptyDataview(emptyDataview);
2018
- }
2019
- getName() {
2020
- return this.Name;
2021
- }
2022
- async emptyDataviewOpen(subformRefresh) {
2023
- if (this.getLevel() === Constants.TASK_LEVEL_TASK) {
2024
- this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, true);
2025
- if (this.IsSubForm) {
2026
- let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
2027
- if ((rtEvnt != null && rtEvnt.getInternalCode() == InternalInterface.MG_ACT_RT_REFRESH_VIEW) || subformRefresh) {
2028
- let rtEvt = new RunTimeEvent(this);
2029
- rtEvt.setInternal(InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2030
- rtEvt.SetEventSubType(EventSubType.Normal);
2031
- await AccessHelper.eventsManager.handleEvent(rtEvt, false);
2032
- }
2033
- }
2034
- else
2035
- AccessHelper.eventsManager.addInternalEventWithItaskAndCode(this, InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2036
- this.setLevel(Constants.TASK_LEVEL_RECORD);
2037
- if (this.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME && subformRefresh && await this.CheckRefreshSubTasks()) {
2038
- await this.DataView.computeSubForms();
2039
- await this.doSubformRecPrefixSuffix();
2040
- }
2041
- await this.enableRecordActions();
2042
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, false);
2043
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, false);
2044
- }
2045
- }
2046
- emptyDataviewClose() {
2047
- this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, false);
2048
- this.setLevel(Constants.TASK_LEVEL_TASK);
2049
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, true);
2050
- this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, true);
2051
- }
2052
- async SubformRefresh(subformTask, explicitSubformRefresh) {
2053
- let currTask = LastFocusedManager.Instance.getLastFocusedTask();
2054
- let isInside = await subformTask.ExecuteNestedRS(currTask);
2055
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2056
- return;
2057
- if (subformTask.getLevel() !== Constants.TASK_LEVEL_TASK && !AccessHelper.eventsManager.GetStopExecutionFlag()) {
2058
- AccessHelper.eventsManager.pushNewExecStacks();
2059
- await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_SUFFIX, true);
2060
- AccessHelper.eventsManager.popNewExecStacks();
2061
- isInside = true;
2062
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2063
- return;
2064
- }
2065
- let cmd = CommandFactory.CreateSubformRefreshCommand(this.getTaskTag(), subformTask.getTaskTag(), explicitSubformRefresh);
2066
- await subformTask.DataviewManager.Execute(cmd);
2067
- if (subformTask.isAborting())
2068
- return;
2069
- if (explicitSubformRefresh) {
2070
- AccessHelper.eventsManager.pushNewExecStacks();
2071
- let performParentRecordPrefixOrg = subformTask.PerformParentRecordPrefix;
2072
- subformTask.PerformParentRecordPrefix = false;
2073
- await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_PREFIX, true);
2074
- subformTask.PerformParentRecordPrefix = performParentRecordPrefixOrg;
2075
- AccessHelper.eventsManager.popNewExecStacks();
2076
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2077
- return;
2078
- }
2079
- if (isInside) {
2080
- }
2081
- else {
2082
- if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
2083
- if (explicitSubformRefresh) {
2084
- await AccessHelper.eventsManager.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_SUFFIX);
2085
- if (currTask != null)
2086
- currTask.DataView.setPrevCurrRec();
2087
- subformTask.DoSubformPrefixSuffix = false;
2088
- }
2089
- }
2090
- }
2091
- }
2092
- async ExecuteNestedRS(lastTask) {
2093
- let isExecuteNestedRS = false;
2094
- if (lastTask == null)
2095
- return isExecuteNestedRS;
2096
- if (this.getLevel() !== Constants.TASK_LEVEL_TASK && lastTask.getMgdID() !== this.getMgdID())
2097
- return isExecuteNestedRS;
2098
- for (let task = lastTask; task !== this && task.pathContains(this) && task.getLevel() !== Constants.TASK_LEVEL_TASK; task = task.getParent()) {
2099
- AccessHelper.eventsManager.pushNewExecStacks();
2100
- await AccessHelper.eventsManager.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2101
- AccessHelper.eventsManager.popNewExecStacks();
2102
- isExecuteNestedRS = true;
2103
- }
2104
- return isExecuteNestedRS;
2105
- }
2106
- async execSubformRecSuffix(newTask) {
2107
- let subfTask;
2108
- let i, idx = 0;
2109
- for (i = this._taskPath.length; i > 0; i--) {
2110
- subfTask = this._taskPath.get_Item(i - 1);
2111
- if (!newTask._taskPath.Contains(subfTask)) {
2112
- await AccessHelper.eventsManager.handleInternalEventWithTask(subfTask, InternalInterface.MG_ACT_REC_SUFFIX);
2113
- if (AccessHelper.eventsManager.GetStopExecutionFlag())
2114
- break;
2115
- if (subfTask.getMode() === Constants.TASK_MODE_CREATE && !(subfTask.DataView.getCurrRec()).isNewRec())
2116
- subfTask.setMode(Constants.TASK_MODE_MODIFY);
2117
- }
2118
- else {
2119
- idx = newTask._taskPath.indexOf(subfTask);
2120
- break;
2121
- }
2122
- }
2123
- Debug.Assert(i > 0);
2124
- return idx;
2125
- }
2126
- getCounter() {
2127
- return this._counter;
2128
- }
2129
- increaseCounter() {
2130
- this._counter = this._counter + 1;
2131
- }
2132
- setCounter(cnt) {
2133
- this._counter = cnt;
2134
- }
2135
- isCurrentStartProgLevel() {
2136
- return this._currStartProgLevel === Task.StartProgLevel;
2137
- }
2138
- static isMainProgramField(fieldStr) {
2139
- let Field = XmlParser.getTokens(fieldStr, ',');
2140
- let mainProgField = false;
2141
- if (Field.length === 2) {
2142
- let parent = NNumber.Parse(Field.get_Item(0));
2143
- if (parent === TaskBase.MAIN_PRG_PARENT_ID)
2144
- mainProgField = true;
2145
- }
2146
- return mainProgField;
2147
- }
2148
- getTaskInfo() {
2149
- let taskName = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2150
- return NString.Format('{0} {1}', this.isProgram() ? 'Program' : 'Subtask', taskName);
2151
- }
2152
- toString() {
2153
- return NString.Format("(task {0}-\"{1}\"{2})", this._taskTag, this.Name, super.isMainProg() ? (" ctl " + this._ctlIdx) : "");
2154
- }
2155
- ConstructMgForm(alreadySetParentForm) {
2156
- let form = new MgForm();
2157
- let parentForm = (this.ParentTask != null ? this.ParentTask.getForm() : null);
2158
- while (parentForm != null && !parentForm.getTask().isOpenWin()) {
2159
- parentForm = parentForm.ParentForm;
2160
- }
2161
- form.ParentForm = parentForm;
2162
- alreadySetParentForm.value = true;
2163
- return form;
2164
- }
2165
- getMgdID() {
2166
- return this._mgData.GetId();
2167
- }
2168
- getMGData() {
2169
- return this._mgData;
2170
- }
2171
- async RefreshDisplay() {
2172
- if (this.Form !== null && !this.isAborting() && this.isStarted()) {
2173
- Logger.Instance.WriteDevToLog("Start task.RefreshDisplay()");
2174
- if (this._refreshType !== Constants.TASK_REFRESH_NONE) {
2175
- let form = this.Form;
2176
- let wasRefreshed = await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
2177
- if (wasRefreshed) {
2178
- this._refreshType = Constants.TASK_REFRESH_NONE;
2179
- }
2180
- }
2181
- Logger.Instance.WriteDevToLog("End task.RefreshDisplay()");
2182
- }
2183
- }
2184
- getFieldDisplayValue(fieldDef, value, isNull) {
2185
- value.value = fieldDef.getDispValue();
2186
- isNull.value = fieldDef.isNull();
2187
- }
2188
- async UpdateFieldValueAndStartRecompute(fieldDef, value, isNull) {
2189
- if (this.TaskPrefixExecuted) {
2190
- await fieldDef.setValueAndStartRecompute(value, isNull, true, false, false);
2191
- }
2192
- }
2193
- ShouldNonInteractiveChildBeModal() {
2194
- return this.ShouldChildBeModal();
2195
- }
2196
- ShouldChildBeModal() {
2197
- let childShouldBehaveAsModal = false;
2198
- if ((this.Form.ConcreteWindowType === WindowType.Overlay) && this.getForm().Opened)
2199
- childShouldBehaveAsModal = true;
2200
- else if (!this.IsInteractive) {
2201
- childShouldBehaveAsModal = true;
2202
- }
2203
- return childShouldBehaveAsModal;
2204
- }
2205
- getParent() {
2206
- return this._parentTask;
2207
- }
2208
- isDescendentOf(chkTask) {
2209
- if (chkTask === this)
2210
- return true;
2211
- else if (chkTask === null || this._parentTask === null)
2212
- return false;
2213
- return this._parentTask.isDescendentOf(chkTask);
2214
- }
2215
- GetSubformModalParentTask() {
2216
- let currTask = this;
2217
- while (currTask._parentTask != null && currTask._parentTask.getIsDestinationCall()) {
2218
- let subformCtrl = (currTask._parentTask.getForm().getSubFormCtrl());
2219
- if (subformCtrl.IsModal()) {
2220
- return subformCtrl;
2221
- }
2222
- currTask = currTask._parentTask;
2223
- }
2224
- return null;
2225
- }
2226
- ShouldEvaluatePropertyLocally(propId) {
2227
- return this.TaskService.ShouldEvaluatePropertyLocally(propId);
2228
- }
2229
- EnsureValidForm() {
2230
- if (this._isMainPrg && this.Form !== null) {
2231
- if (!this._openWin || !this.Form.isLegalForm) {
2232
- this.Form = null;
2233
- }
2234
- }
2235
- }
2236
- async ComputeMainDisplay() {
2237
- let propMainDisplay = this.getProp(PropInterface.PROP_TYPE_MAIN_DISPLAY);
2238
- let mainDisplayIndex = await propMainDisplay.getValueInt();
2239
- mainDisplayIndex = this.GetRealMainDisplayIndexOnCurrentTask(mainDisplayIndex);
2240
- this._forms.InitFormFromXmlString(mainDisplayIndex);
2241
- this.EnsureValidForm();
2242
- }
2243
- async PrepareTaskForm() {
2244
- await TaskServiceBase.PreparePropOpenTaskWindow(this);
2245
- return await RemoteTaskService.PreparePropMainDisplay(this);
2246
- }
2247
- FormIsLegal() {
2248
- let isFormIsLegal = super.isMainProg();
2249
- return isFormIsLegal || super.getForm().isLegalForm;
2250
- }
2251
- GetRealMainDisplayIndexOnDepth(mainDspIdx) {
2252
- let task = this.LogicalStudioParentTask;
2253
- while (task != null) {
2254
- mainDspIdx += task._forms.Count;
2255
- task = task.LogicalStudioParentTask;
2256
- }
2257
- return mainDspIdx;
2258
- }
2259
- GetRealMainDisplayIndexOnCurrentTask(mainDspIdx) {
2260
- if (mainDspIdx > 1) {
2261
- let task = this.LogicalStudioParentTask;
2262
- while (task != null) {
2263
- mainDspIdx -= task._forms.Count;
2264
- task = task.LogicalStudioParentTask;
2265
- }
2266
- }
2267
- return mainDspIdx;
2268
- }
2269
- GetAncestorTaskByTaskDefinitionId(findTaskDefinitionId) {
2270
- let currentTask = this;
2271
- if (findTaskDefinitionId.IsMainProgram())
2272
- return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, findTaskDefinitionId.CtlIndex);
2273
- while (currentTask != null) {
2274
- if (currentTask.TaskDefinitionId.Equals(findTaskDefinitionId))
2275
- return currentTask;
2276
- currentTask = currentTask._parentTask;
2277
- }
2278
- return null;
2279
- }
2280
- SetDataControlValuesReference(controlId, dcValuesId) {
2281
- let ctrl = super.getForm().getCtrl(controlId);
2282
- ctrl.setDcValId(dcValuesId);
2283
- }
2284
- DisplayMessageToStatusBar(text) {
2285
- let taskToVerifyOn = this.GetContextTask();
2286
- if (taskToVerifyOn.getForm() == null)
2287
- taskToVerifyOn = LastFocusedManager.Instance.getLastFocusedTask();
2288
- taskToVerifyOn.WriteToMessagePane(text);
2289
- }
2290
- isTableWithAbsolutesScrollbar() {
2291
- let isTableWithAbsolutesScrollbar = false;
2292
- if (this.getForm() != null)
2293
- isTableWithAbsolutesScrollbar = this.getForm().isTableWithAbsoluteScrollbar();
2294
- return isTableWithAbsolutesScrollbar;
2295
- }
2296
- GetTaskDetails() {
2297
- let names = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2298
- let task = this;
2299
- while (task.ParentTask !== null && !task.ParentTask.isMainProg()) {
2300
- task = task.ParentTask;
2301
- names = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + "." + names;
2302
- }
2303
- return names;
2304
- }
2305
- static async ProcessTaskURL() {
2306
- let xmlData = RuntimeContextBase.Instance.Parser.getXMLdata();
2307
- let endTaskUrlIdx = xmlData.indexOf(XMLConstants.TAG_CLOSE, RuntimeContextBase.Instance.Parser.getCurrIndex());
2308
- Debug.Assert(endTaskUrlIdx !== -1 && endTaskUrlIdx < xmlData.length);
2309
- let tag = RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx);
2310
- RuntimeContextBase.Instance.Parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_TASKURL) + ConstInterface.MG_TAG_TASKURL.length);
2311
- let tokensVector = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx), XMLConstants.XML_ATTR_DELIM);
2312
- let taskCacheURL = tokensVector.get_Item(1);
2313
- let refListStr = tokensVector.get_Item(3);
2314
- let taskContentOriginal = "";
2315
- if (taskCacheURL.trim() != "") {
2316
- if (taskCacheURL.startsWith("./"))
2317
- taskCacheURL = NString.Replace(taskCacheURL, './', './assets/cache/');
2318
- taskContentOriginal = await Task.CommandsProcessor.GetContent(taskCacheURL, true);
2319
- }
2320
- let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
2321
- let reflist = this.getReflist(refListStr, ';', true, -1);
2322
- let refListIdx = 0;
2323
- let currIdx = taskContentOriginal.indexOf("[:");
2324
- let prevIdx = 0;
2325
- while (currIdx !== -1) {
2326
- taskContentFinal.Append(taskContentOriginal.substr(prevIdx, currIdx - prevIdx));
2327
- taskContentFinal.Append(reflist.get_Item(refListIdx++));
2328
- currIdx += 2;
2329
- prevIdx = currIdx;
2330
- currIdx = taskContentOriginal.indexOf("[:", prevIdx);
2331
- }
2332
- taskContentFinal.Append(taskContentOriginal.substr(prevIdx));
2333
- taskContentFinal.Append(xmlData.substr(xmlData.indexOf(XMLConstants.TAG_CLOSE, endTaskUrlIdx + 1) + 1));
2334
- xmlData = taskContentFinal.ToString();
2335
- Logger.Instance.WriteDevToLog(NString.Format("{0} -------> {1}", taskCacheURL, xmlData));
2336
- RuntimeContextBase.Instance.Parser.setXMLdata(xmlData);
2337
- RuntimeContextBase.Instance.Parser.setCurrIndex(RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1));
2338
- }
2339
- static getReflist(data, delim, trunc, maxTokens) {
2340
- let currStr = new StringBuilder();
2341
- let list = new List();
2342
- let tokensCnt = 0;
2343
- for (let i = 1; i < data.length; i++) {
2344
- let curr = data.charAt(i);
2345
- if (curr !== '\\' && curr !== delim)
2346
- currStr.Append(curr);
2347
- else if (curr === delim) {
2348
- list.push(currStr.ToString());
2349
- currStr = new StringBuilder();
2350
- tokensCnt++;
2351
- if (tokensCnt === maxTokens)
2352
- break;
2353
- }
2354
- else if (curr === '\\') {
2355
- if (!trunc && data.charAt(i + 1) !== delim)
2356
- currStr.Append(data.charAt(i));
2357
- i++;
2358
- currStr.Append(data.charAt(i));
2359
- }
2360
- }
2361
- list.push(currStr.ToString());
2362
- return list;
2363
- }
2364
- static async StartProgram(callByDestSubForm, moveToFirstControl) {
2365
- let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
2366
- let nonInteractiveTaskAlreadyExecuted = null;
2367
- let allowEvents = AccessHelper.eventsManager.getAllowEvents();
2368
- AccessHelper.eventsManager.setAllowEvents(EventsAllowedType.ALL);
2369
- Logger.Instance.WriteDevToLog("Start \"startProg\"");
2370
- Task.StartProgLevel++;
2371
- AccessHelper.eventsManager.setStopExecution(false);
2372
- nonInteractiveTaskAlreadyExecuted = await this.ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl);
2373
- let nonInteractiveTaskAlreadyExecutedRef = new RefParam(nonInteractiveTaskAlreadyExecuted);
2374
- let currentNonInteractiveTaskRef = new RefParam(null);
2375
- await Task.ExecuteMainProgram(0, callByDestSubForm, moveToFirstControl, nonInteractiveTaskAlreadyExecutedRef, currentNonInteractiveTaskRef, AccessHelper.mgDataTable);
2376
- nonInteractiveTaskAlreadyExecuted = nonInteractiveTaskAlreadyExecutedRef.value;
2377
- if (!Task._idleTimerStarted) {
2378
- GUIManager.Instance.startTimer(AccessHelper.mgDataTable.getMGData(0), Environment.Instance.getIdleTime(0), true);
2379
- Task._idleTimerStarted = true;
2380
- }
2381
- await this.OpenForms(callByDestSubForm);
2382
- await this.DoFirstRecordCycle();
2383
- await this.MoveToFirstControls(callByDestSubForm);
2384
- if (Task.StartProgLevel === 1) {
2385
- let resetAllowEvents = false;
2386
- let canExecuteEvents = true;
2387
- if (nonInteractiveTaskAlreadyExecuted !== null && nonInteractiveTaskAlreadyExecuted.isStarted()) {
2388
- resetAllowEvents = true;
2389
- AccessHelper.eventsManager.setNonInteractiveAllowEvents(await nonInteractiveTaskAlreadyExecuted.isAllowEvents());
2390
- canExecuteEvents = await nonInteractiveTaskAlreadyExecuted.isAllowEvents();
2391
- }
2392
- if (LastFocusedManager.Instance.getLastFocusedTask() !== null && canExecuteEvents) {
2393
- AccessHelper.eventsManager.pushNewExecStacks();
2394
- await AccessHelper.eventsManager.handleEvents(AccessHelper.mgDataTable.getCurrMGData(), 0);
2395
- AccessHelper.eventsManager.popNewExecStacks();
2396
- }
2397
- if (resetAllowEvents)
2398
- AccessHelper.eventsManager.setAllowEvents(allowEvents);
2399
- }
2400
- Task.StartProgLevel--;
2401
- Logger.Instance.WriteDevToLog("End \"startProg\"");
2402
- if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2403
- if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2404
- AccessHelper.eventsManager.setStopExecution(orgStopExecution);
2405
- return nonInteractiveTaskAlreadyExecuted;
2406
- }
2407
- static async ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl) {
2408
- let currentNonInteractiveTask = new RefParam(null);
2409
- let nonInteractiveTaskAlreadyExecuted = new RefParam(null);
2410
- let maxCtlIdx = AccessHelper.mgDataTable.getMGData(0).getMaxCtlIdx();
2411
- for (let i = 1; i <= maxCtlIdx; i = i + 1) {
2412
- let componentMainProgram = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, i);
2413
- if (componentMainProgram !== null)
2414
- await Task.ExecuteMainProgram(i, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, AccessHelper.mgDataTable);
2415
- }
2416
- return nonInteractiveTaskAlreadyExecuted.value;
2417
- }
2418
- static async ExecuteMainProgram(CtlIndex, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, mgDataTable) {
2419
- let mainProgramTask = mgDataTable.GetMainProgByCtlIdx(-1, CtlIndex);
2420
- Logger.Instance.WriteDevToLog(NString.Format(" ClientManager.startProg: ctlIdx={0}, task={1}", CtlIndex, mainProgramTask));
2421
- currentNonInteractiveTask.value = (await mainProgramTask.Start(moveToFirstControl, callByDestSubForm));
2422
- if (nonInteractiveTaskAlreadyExecuted.value === null)
2423
- nonInteractiveTaskAlreadyExecuted.value = currentNonInteractiveTask.value;
2424
- else if (currentNonInteractiveTask.value !== null) {
2425
- Debug.Assert(false, "more than 1 non interactive tasks in startProg");
2426
- }
2427
- }
2428
- static async OpenForms(callByDestSubForm) {
2429
- let createdForms = MgForm.CreatedForms;
2430
- if (createdForms.Count() > 0) {
2431
- let i = 0;
2432
- while (i < createdForms.Count()) {
2433
- let mgForm = createdForms.get(i);
2434
- let canOpen = false;
2435
- if (mgForm.isSubForm()) {
2436
- let opened = mgForm.getSubFormCtrl().getForm().Opened;
2437
- if (opened) {
2438
- canOpen = true;
2439
- }
2440
- }
2441
- else {
2442
- if (mgForm.getTask().isCurrentStartProgLevel()) {
2443
- canOpen = true;
2444
- }
2445
- }
2446
- if (canOpen) {
2447
- Manager.OpenForm(mgForm);
2448
- await Manager.DoFirstRefreshTable(mgForm);
2449
- }
2450
- if (mgForm.Opened) {
2451
- createdForms.remove(mgForm);
2452
- }
2453
- else
2454
- i++;
2455
- }
2456
- }
2457
- }
2458
- static async DoFirstRecordCycle() {
2459
- for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2460
- let mgd = AccessHelper.mgDataTable.getMGData(i);
2461
- if (mgd === null || mgd.IsAborting)
2462
- continue;
2463
- for (let j = 0; j < mgd.getTasksCount(); j++) {
2464
- let task = mgd.getTask(j);
2465
- if (task !== null) {
2466
- let mgForm = task.getForm();
2467
- if (mgForm !== null && task.isCurrentStartProgLevel() && !mgForm.IgnoreFirstRecordCycle) {
2468
- mgForm.IgnoreFirstRecordCycle = true;
2469
- await task.doFirstRecordCycle();
2470
- }
2471
- }
2472
- }
2473
- }
2474
- }
2475
- static async MoveToFirstControls(callByDestSubForm) {
2476
- for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2477
- let mgd = AccessHelper.mgDataTable.getMGData(i);
2478
- if (mgd === null || mgd.IsAborting)
2479
- continue;
2480
- let tasksCount = mgd.getTasksCount();
2481
- for (let j = 0; j < tasksCount; j++) {
2482
- let task = mgd.getTask(j);
2483
- let mgForm = task.getForm();
2484
- if (task.isCurrentStartProgLevel() && mgForm !== null && mgForm.MovedToFirstControl) {
2485
- mgForm.MovedToFirstControl = false;
2486
- if (!callByDestSubForm)
2487
- await AccessHelper.eventsManager.HandleNonParkableControls(task);
2488
- }
2489
- }
2490
- }
2491
- }
2492
- }
2493
- Task.StartProgLevel = 0;
2494
- Task._idleTimerStarted = false;
2495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pJLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFFUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixNQUFNLEVBRU4saUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxPQUFPLEVBR1AsUUFBUSxFQUNSLEdBQUcsRUFFSCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVB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QyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUtELEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxNQUFNLEdBQVksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBS0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUtELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBR0Qsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxrQkFBMkI7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0lBQ2hELENBQUM7SUFHRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQU1ELG9CQUFvQixDQUFDLGlCQUEwQjtRQUM3QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7SUFDOUMsQ0FBQztJQUtELGtCQUFrQixDQUFDLEdBQVk7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBSUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFZO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFLRCxLQUFLLENBQUMsOEJBQThCO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQztZQUN4RyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFlLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWTtZQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7O1lBRWxFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWTtnQkFDckMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xILENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFFNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFHRCxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFHRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFLRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsY0FBdUI7UUFFN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsRUFBRTtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUd6RSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLGNBQWMsRUFDOUc7b0JBQ0UsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBQzNELEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUQ7YUFDRjs7Z0JBRUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUU3RyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBTzNDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyx3QkFBd0IsQ0FBQyxVQUFVLElBQUksY0FBYyxJQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3ZILE1BQWlCLElBQUksQ0FBQyxRQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7YUFDdkM7WUFFRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlFO0lBQ0gsQ0FBQztJQUtELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBTUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFxQixFQUFFLHNCQUErQjtRQUN6RSxJQUFJLFFBQVEsR0FBUyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN0RSxJQUFJLFFBQVEsR0FBWSxNQUFhLFdBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUUsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1lBQ25ELE9BQU87UUFHVCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQzlHLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsNENBQTRDLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RJLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBR2hCLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDbkQsT0FBTztTQUNWO1FBR0QsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDMUksTUFBTSxXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDMUIsT0FBTztRQUVULElBQUksc0JBQXNCLEVBQUU7WUFFMUIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRy9DLElBQUksNEJBQTRCLEdBQW1CLFdBQVksQ0FBQyx5QkFBeUIsQ0FBQztZQUNuRixXQUFZLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1lBQ3RELE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0gsV0FBWSxDQUFDLHlCQUF5QixHQUFHLDRCQUE0QixDQUFDO1lBQzdFLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ25ELE9BQU87U0FDVjtRQUlELElBQUksUUFBUSxFQUFFO1NBS2I7YUFDSTtZQUNILElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3RELElBQUksc0JBQXNCLEVBQUU7b0JBQzFCLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDL0csSUFBSSxRQUFRLElBQUksSUFBSTt3QkFDUCxRQUFRLENBQUMsUUFBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNqRCxXQUFXLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO2lCQUMzQzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBUUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFjO1FBQ2xDLElBQUksaUJBQWlCLEdBQVksS0FBSyxDQUFDO1FBSXZDLElBQUksUUFBUSxJQUFJLElBQUk7WUFDbEIsT0FBTyxpQkFBaUIsQ0FBQztRQUkzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzFGLE9BQU8saUJBQWlCLENBQUM7UUFFM0IsS0FBSyxJQUFJLElBQUksR0FBUyxRQUFRLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFLElBQUksR0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDeEosWUFBWSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN4RyxZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBUUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQWE7UUFDdEMsSUFBSSxRQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2QixLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN6QyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzVHLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtvQkFDbkQsTUFBTTtnQkFJUixJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFZLFFBQVEsQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7b0JBQy9HLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDaEQ7aUJBQ0k7Z0JBQ0gsR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNO2FBQ1A7U0FDRjtRQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQU1ELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQU1ELGVBQWU7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN0QixDQUFDO0lBTUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDMUQsQ0FBQztJQVFELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUN4QyxJQUFJLEtBQUssR0FBaUIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1FBRW5DLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxNQUFNLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLGtCQUFrQjtnQkFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUN4QjtRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBRVQsSUFBSSxRQUFRLEdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkYsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQSxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQU9ELGVBQWUsQ0FBQyxvQkFBdUM7UUFDckQsSUFBSSxJQUFJLEdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFVBQVUsR0FBZSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUsxRixPQUFPLFVBQVUsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDOUQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7U0FDcEM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUtELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUdELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFRN0QsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDckQsSUFBSSxJQUFJLEdBQW1CLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JDLElBQUksWUFBWSxHQUFZLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2lCQUNqRDthQUNGO1lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFnQkQsb0JBQW9CLENBQUMsUUFBa0IsRUFBRSxLQUF1QixFQUFFLE1BQXlCO1FBQ3pGLEtBQUssQ0FBQyxLQUFLLEdBQVcsUUFBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxLQUFLLEdBQVcsUUFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFNRCxLQUFLLENBQUMsaUNBQWlDLENBQUMsUUFBa0IsRUFBRSxLQUFhLEVBQUUsTUFBZTtRQUN4RixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixNQUFjLFFBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdEY7SUFDSCxDQUFDO0lBTUQsZ0NBQWdDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQU9PLGtCQUFrQjtRQUN4QixJQUFJLHdCQUF3QixHQUFZLEtBQUssQ0FBQztRQUc5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU07WUFDaEYsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO2FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzFCLHdCQUF3QixHQUFHLElBQUksQ0FBQztTQUNuQztRQUNELE9BQU8sd0JBQXdCLENBQUM7SUFDbEMsQ0FBQztJQUtELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUtELGNBQWMsQ0FBQyxPQUFpQjtRQUM5QixJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO2FBQ1QsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSTtZQUNwRCxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUtNLHlCQUF5QjtRQUM5QixJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7UUFDMUIsT0FBTyxRQUFRLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLEVBQUU7WUFDbEYsSUFBSSxXQUFXLEdBQXlCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUN6QjtnQkFDRSxPQUFPLFdBQVcsQ0FBQzthQUNwQjtZQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBTUQsNkJBQTZCLENBQUMsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQU1ELGVBQWU7UUFJYixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDbEI7U0FDRjtJQUNILENBQUM7SUFNRCxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLElBQUksZUFBZSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFbkYsSUFBSSxnQkFBZ0IsR0FBVyxNQUFNLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFLRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxPQUFPLE1BQU0saUJBQWlCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQU9ELFdBQVc7UUFDVCxJQUFJLGFBQWEsR0FBWSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEQsT0FBTyxhQUFhLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztJQUN0RCxDQUFDO0lBT0QsOEJBQThCLENBQUMsVUFBa0I7UUFDL0MsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBRTlDLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRTtZQUNuQixVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDaEMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztTQUNyQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFPRCxvQ0FBb0MsQ0FBQyxVQUFrQjtRQUNyRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFFbEIsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBRTlDLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDbkIsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO2FBQ3JDO1NBQ0Y7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBT0QsaUNBQWlDLENBQUMsb0JBQXNDO1FBQ3RFLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQztRQUs3QixJQUFJLG9CQUFvQixDQUFDLGFBQWEsRUFBRTtZQUN0QyxPQUFhLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhILE9BQU8sV0FBVyxJQUFJLElBQUksRUFBRTtZQUMxQixJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7Z0JBQzNELE9BQU8sV0FBVyxDQUFDO1lBRXJCLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtRQUNqRSxJQUFJLElBQUksR0FBa0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFPRCx5QkFBeUIsQ0FBQyxJQUFZO1FBR3BDLElBQUksY0FBYyxHQUFnQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEQsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSTtZQUNsQyxjQUFjLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFcEUsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFHRCw2QkFBNkI7UUFDM0IsSUFBSSw2QkFBNkIsR0FBWSxLQUFLLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSTtZQUN4Qiw2QkFBNkIsR0FBWSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUUxRixPQUFPLDZCQUE2QixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxLQUFLLEdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0UsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2hFLElBQUksR0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzdCLEtBQUssR0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1NBQ3hGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBS0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLElBQUksT0FBTyxHQUFXLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEUsSUFBSSxhQUFhLEdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2SCxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUMsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBR3JFLElBQUksR0FBRyxHQUFXLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEksSUFBSSxZQUFZLEdBQWlCLFNBQVMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JKLElBQUksWUFBWSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxVQUFVLEdBQVcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRCxJQUFJLG1CQUFtQixHQUFXLEVBQUUsQ0FBQztRQUVyQyxJQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFHNUIsSUFBRyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDL0IsWUFBWSxHQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRXRFLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkY7UUFHRCxJQUFJLGdCQUFnQixHQUFrQixJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2TSxJQUFJLE9BQU8sR0FBaUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixJQUFJLE9BQU8sR0FBVyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2IsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNsQixPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN0RDtRQUNELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUc3RCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEcsT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXRDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFekYsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEosQ0FBQztJQU9PLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxLQUFjLEVBQUUsU0FBaUI7UUFDdEYsSUFBSSxPQUFPLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDakQsSUFBSSxJQUFJLEdBQWlCLElBQUksSUFBSSxFQUFVLENBQUM7UUFDNUMsSUFBSSxTQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRzFCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksSUFBSSxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLO2dCQUNqQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixTQUFTLEVBQUUsQ0FBQztnQkFFWixJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUN6QixNQUFNO2FBQ1Q7aUJBQ0ksSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUV0QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUs7b0JBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVqQyxDQUFDLEVBQUUsQ0FBQztnQkFDSixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBR0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLRCxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxpQkFBMEIsRUFBRSxrQkFBMkI7UUFDL0UsSUFBSSxnQkFBZ0IsR0FBWSxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDbEYsSUFBSSxpQ0FBaUMsR0FBUyxJQUFJLENBQUM7UUFDbkQsSUFBSSxXQUFXLEdBQXNCLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakYsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUduRCxpQ0FBaUMsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBR25ILElBQUksb0NBQW9DLEdBQW1CLElBQUksUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDM0csSUFBSSw0QkFBNEIsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLG9DQUFvQyxFQUFFLDRCQUE0QixFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0SyxpQ0FBaUMsR0FBRyxvQ0FBb0MsQ0FBQyxLQUFLLENBQUM7UUFFL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBSWxELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7WUFDdEMsSUFBSSxnQkFBZ0IsR0FBWSxJQUFJLENBQUM7WUFJckMsSUFBSSxpQ0FBaUMsS0FBSyxJQUFJLElBQUksaUNBQWlDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQy9GLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDeEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLGlDQUFpQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBSWpILGdCQUFnQixHQUFHLE1BQU8saUNBQWlDLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDN0U7WUFLRCxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsRUFBRTtnQkFDakYsWUFBWSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUMvQztZQUdELElBQUksZ0JBQWdCO2dCQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBR25ELElBQUksZ0JBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1lBQ3hFLElBQUksZ0JBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO2dCQUN4RSxZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEUsT0FBTyxpQ0FBaUMsQ0FBQztJQUMzQyxDQUFDO0lBU0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBMEIsRUFBRSxrQkFBMkI7UUFDL0YsSUFBSSx5QkFBeUIsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxpQ0FBaUMsR0FBbUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0UsSUFBSSxTQUFTLEdBQVcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFN0UsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNqRCxJQUFJLG9CQUFvQixHQUFlLFlBQVksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFM0YsSUFBSSxvQkFBb0IsS0FBSyxJQUFJO2dCQUMvQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsaUNBQWlDLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ25LO1FBRUQsT0FBTyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUM7SUFDakQsQ0FBQztJQVdPLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxpQkFBMEIsRUFBRSxrQkFBMkIsRUFBRSx5QkFBeUMsRUFBRSxpQ0FBaUQsRUFBRSxXQUE4QjtRQUM3TyxJQUFJLGVBQWUsR0FBZSxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFaEYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpREFBaUQsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUU1SCx5QkFBeUIsQ0FBQyxLQUFLLEdBQVUsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzlHLElBQUksaUNBQWlDLENBQUMsS0FBSyxLQUFLLElBQUk7WUFDbEQsaUNBQWlDLENBQUMsS0FBSyxHQUFHLHlCQUF5QixDQUFDLEtBQUssQ0FBQzthQUN2RSxJQUFJLHlCQUF5QixDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDakQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztTQUN2RTtJQUNILENBQUM7SUFHRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBMEI7UUFDL0MsSUFBSSxZQUFZLEdBQXNCLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFFMUQsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxHQUFXLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLElBQUksTUFBTSxHQUFXLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztnQkFJN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3RCLElBQUksTUFBTSxHQUF5QixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsTUFBTSxDQUFDO29CQUM3RSxJQUFJLE1BQU0sRUFBRTt3QkFDVixPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtpQkFDRjtxQkFDSTtvQkFDSCxJQUFXLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO3dCQUN0RCxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtpQkFDRjtnQkFFRCxJQUFJLE9BQU8sRUFBRTtvQkFDWCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN6QixNQUFNLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0M7Z0JBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUVqQixZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUM3Qjs7b0JBRUMsQ0FBQyxFQUFFLENBQUM7YUFDUDtTQUNGO0lBQ0gsQ0FBQztJQUdELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCO1FBRTdCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25FLElBQUksR0FBRyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVTtnQkFDaEMsU0FBUztZQUVYLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxHQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsSUFBSSxNQUFNLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFFNUMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFO3dCQUN2RixNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO3dCQUNyQyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3FCQUNqQztpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBTU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBMEI7UUFFakUsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkUsSUFBSSxHQUFHLEdBQVcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVO2dCQUNoQyxTQUFTO1lBRVgsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksSUFBSSxHQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTVDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7b0JBQ25GLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7b0JBQ25DLElBQUksQ0FBQyxpQkFBaUI7d0JBQ2xCLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdEU7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7QUF2dUhNLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO0FBRW5CLHNCQUFpQixHQUFZLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGVidWcsIEhhc2hVdGlscywgTGlzdCwgTk51bWJlciwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVW5pcXVlVHNrU29ydCxcclxuICBXaW5kb3dUeXBlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFdmVudHMsXHJcbiAgRmllbGREZWYsXHJcbiAgR3VpRGF0YUNvbGxlY3Rpb24sXHJcbiAgSGVscHMsXHJcbiAgSVRhc2ssXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTlVNX1RZUEUsXHJcbiAgUElDLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUmVjb3JkVXRpbHMsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi9ldmVudC9FdmVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0R2Q2FjaGV9IGZyb20gJy4uL2RhdGEvRHZDYWNoZSc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuL01HRGF0YSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3NvckJhc2UsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb259IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yQmFzZSc7XHJcbmltcG9ydCB7VGFza1NlcnZpY2VCYXNlfSBmcm9tICcuL1Rhc2tTZXJ2aWNlQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7VGFza1RyYW5zYWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHtEYXRhdmlld01hbmFnZXJ9IGZyb20gJy4uL2RhdGEvRGF0YXZpZXdNYW5hZ2VyJztcclxuaW1wb3J0IHtTb3J0Q29sbGVjdGlvbn0gZnJvbSAnLi9zb3J0L1NvcnRDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtTb3J0fSBmcm9tICcuL3NvcnQvU29ydCc7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge1JlbW90ZVRhc2tTZXJ2aWNlfSBmcm9tICcuL1JlbW90ZVRhc2tTZXJ2aWNlJztcclxuaW1wb3J0IHtSZXR1cm5SZXN1bHR9IGZyb20gJy4uL3V0aWwvUmV0dXJuUmVzdWx0JztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4uL2V2ZW50L1J1blRpbWVFdmVudCc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0RhdGF2aWV3SGVhZGVyc30gZnJvbSAnLi4vcnQvRGF0YXZpZXdIZWFkZXJzJztcclxuaW1wb3J0IHtUcmFuc2FjdGlvbn0gZnJvbSAnLi4vcnQvVHJhbnNhY3Rpb24nO1xyXG5pbXBvcnQge1Rhc2tzVGFibGV9IGZyb20gJy4vVGFza3NUYWJsZSc7XHJcbmltcG9ydCB7SUNsaWVudFRhcmdldGVkQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudFRhcmdldGVkQ29tbWFuZCc7XHJcbmltcG9ydCB7SGFuZGxlcnNUYWJsZX0gZnJvbSAnLi4vcnQvSGFuZGxlcnNUYWJsZSc7XHJcbmltcG9ydCB7UmVjb21wdXRlVGFibGV9IGZyb20gJy4uL3J0L1JlY29tcHV0ZVRhYmxlJztcclxuaW1wb3J0IHtFeHBUYWJsZX0gZnJvbSAnLi4vZXhwL0V4cFRhYmxlJztcclxuaW1wb3J0IHtVc2VyRXZlbnRzVGFibGV9IGZyb20gJy4uL2V2ZW50L1VzZXJFdmVudHNUYWJsZSc7XHJcbmltcG9ydCB7Rm9ybXNUYWJsZX0gZnJvbSAnLi4vZ3VpL0Zvcm1zVGFibGUnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge0FjdGlvbk1hbmFnZXJ9IGZyb20gJy4uL2V2ZW50L0FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyfSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uJztcclxuaW1wb3J0IHtGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZX0gZnJvbSAnLi4vZGF0YS9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge09wZW5pbmdUYXNrRGV0YWlscywgVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZSwgVXNlclJhbmdlfSBmcm9tICcuL1Rhc2tCYXNlJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge0Vudmlyb25tZW50fSBmcm9tICcuLi9lbnYvRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSAnLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHtHbG9iYWxDb21tYW5kc01hbmFnZXJ9IGZyb20gJy4uL0dsb2JhbENvbW1hbmRzTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGV9IGZyb20gJy4uL2V2ZW50L0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtDcmVhdGVkRm9ybVZlY3Rvcn0gZnJvbSAnLi4vZ3VpL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7SU1HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vSU1HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4vTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi4vZXZlbnQvRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5cclxuZXhwb3J0IGVudW0gVGFza19GbG93IHtcclxuICBOT05FLFxyXG4gIFNURVAsXHJcbiAgRkFTVFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0RpcmVjdGlvbiB7XHJcbiAgQkFDSyA9IC0xLFxyXG4gIE5PTkUsXHJcbiAgRk9SRVxyXG59XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVGFzayBleHRlbmRzIFRhc2tCYXNlIHtcclxuICBwcml2YXRlIF9kdkNhY2hlOiBEdkNhY2hlID0gbnVsbDtcclxuICBwcml2YXRlIF9tZ0RhdGE6IE1HRGF0YSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWJvcnRpbmc6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBhbiBhYm9ydCBjb21tYW5kIHdhcyBleGVjdXRlZCBmb3IgdGhpcyB0YXNrIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzXHJcbiAgcHJpdmF0ZSBfYkV4ZWNFbmRUYXNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZXZhbE9sZFZhbHVlczogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgLy8gaW5kaWNhdGVzIGZvciB0aGUgZ2V0IHZhbHVlIHRvIGdldCB0aGUgb2xkIHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gIHByaXZhdGUgX2luUmVjb3JkU3VmZml4OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgIC8vIGluZGljYXRlIHdlIGFyZSBpbiByZWNvcmQgc3VmZml4IChoYW5kbGUgYmVmb3JlKVxyXG4gIHByaXZhdGUgX2NhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgIC8vIHdhcyBjYW5jZWwvcXVpdCBldmVudCByYWlzZWQgP1xyXG4gIHByaXZhdGUgX2NvdW50ZXI6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlcyBvbmx5IGluIG5vbiBpbnRlcnZhbCB0YXNrcy5cclxuICBwcml2YXRlIF9jdXJyU3RhcnRQcm9nTGV2ZWw6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2Ygc3RhcnRQcm9nIHJlcXVlc3QgaW4gd2hpY2ggd2UgdGFzayBpcyBzdGFydGVkXHJcbiAgcHJpdmF0ZSBfZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICBwcml2YXRlIF9lbmFibGVab29tSGFuZGxlcjogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGVyZSBpcyBhIHpvb20gaGFuZGxlciBmb3IgdGhpcyBmaWVsZFxyXG4gIHByaXZhdGUgX2ZpcnN0UmVjb3JkQ3ljbGU6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgZmlyc3QgcmVjb3JkIGN5Y2xlXHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gIHByaXZhdGUgX2luQ3JlYXRlTGluZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGlzIHRoZSB0YXNrIGludG8gcHJvY2Vzc2luZyBDUkVBVEUgTElORVxyXG4gIHB1YmxpYyBJblNlbGVjdDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlIHRhc2sgaXMgZXhlY3V0aW5nIGEgU0VMRUNUIGludGVybmFsIGV2ZW50XHJcbiAgcHVibGljIEluU3RhcnRQcm9jZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2sgYnkgY2FsbCBvcGVyYXRpb25cclxuICBwcml2YXRlIF9rbm93blRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgICAgICAgICAgICAgICAvLyBGYWxzZSBpZiB0aGUgc2VydmVyIGhhc1xyXG4gIHByaXZhdGUgX2xvb3BTdGFjazogU3RhY2s8bnVtYmVyPiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBhbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgRGVsYXlDb21tYW5kRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgY29udGFpbmluZyB0aGUgQ2FsbCBvcGVyYXRpb24uXHJcbiAgLy8vIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIHNlYXJjaGluZyB0aGUgdmFyaWFibGVzIGxpa2UgVmFySW5kZXgoKSwgZXRjXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3BhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IFBhcmVudFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgY29udGV4dCBvZiB3aGljaCB0YXNrIHRoaXMgdGFzayBpcyBjdXJyZW50bHkgcnVubmluZ1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBpcyBzYW1lIGFzIF9wYXJlbnRUYXNrIGV4Y2VwdCBmb3IgTW9kYWwgdGFza3MuIEluIGNhc2UsIHRoZSBjdXJyZW50IHRhc2sgaXMgbW9kYWwsIF90cmlnZ2VyaW5nVGFzayByZWZlcnMgdG9cclxuICAvLy8gIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgb2YgdGhlIF9wYXJlbnRUYXNrLiBUaGlzIG1lbWJlciBpcyB1c2VkIGZvciBhbGwgZ2VuZXJhdGlvbi1iYXNlZCBmdW5jdGlvbnMgYW5kIFByb2coKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3RyaWdnZXJpbmdUYXNrOiBUYXNrID0gbnVsbDsgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgdGFzayB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlciB3aGljaCBjcmVhdGVkIG1lXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggY29udGFpbmVkIHRoZSBDYWxsIG9wZXJhdGlvbi4gSWYgdGhlIHRhc2sgd2FzIGV4ZWN1dGVkIHdpdGhvdXQgY2FsbFxyXG4gIC8vLyAgIG9wZXJhdGlvbiBlZy4gdGhlIE1QLCB0aGUgc3RhcnR1cCBwcm9ncmFtLCBldGMuLCBpdCByZWZlcnMgdG8gaXRzZWxmLiBUaGlzIG1lbWJlciB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIGV2ZW50IGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgUGF0aFBhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9wcmV2ZW50Q29udHJvbENoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZlbnRSZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90YXNrUGF0aDogTGlzdDxUYXNrPiA9IG51bGw7XHJcblxyXG4gIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIGNvbW1pdCBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICBwcml2YXRlIF90cnlpbmdUb0NvbW1pdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZXQgVHJ5aW5nVG9Db21taXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3RyeWluZ1RvQ29tbWl0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJ5aW5nVG9Db21taXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJ5aW5nVG9Db21taXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91c2VMb29wU3RhY2s6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwcmVzc2lvbiAoTE9PUENPVU5URVIoKSkgaXMgaW4gdGhlIHNjb3BlIG9mIEJsb2NrIExvb3AuXHJcbiAgcHJpdmF0ZSBfaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgSW5IYW5kbGVBY3RDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgUnVudGltZVNvcnRzOiBTb3J0Q29sbGVjdGlvbiA9IG51bGw7XHJcbiAgcHVibGljIFZld0ZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBkYXRhVmlld0NvbnRlbnQ6IHN0cmluZyA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIGRhdGFWaWV3Q29udGVudCByZXRyaWV2ZWQgYnkgR2V0RGF0YVZpZXdDb250ZW50IGNvbW1hbmQuXHJcbiAgcHVibGljIFBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgLy8gSW4gcmVjb3JkIHByZWZpeCAoY29tbW9uSGFuZGxlckJlZm9yZSkgd2UgZXhlY3V0ZSByZWNvcmQgcHJlZml4IG9mIGFsbCBmYXRoZXJzLlxyXG5cclxuICAvLyBCdXQgd2UgZG8gbm90IG5lZWQgaXQgaW4gYWxsIGNhc2VzLlxyXG4gIC8vIFdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIHNlcnZlciB3ZSBkbyBub3QgbmVlZCBpdC5cclxuICAvLyBXaGVuIHdlIGNsaWNrIG9uIHRoZSBuZXN0ZWQgc3ViZm9ybSB3ZSBuZWVkIGl0LlxyXG4gIC8vIGlmIHRydWUsIGRvIHRoZSBwYXJlbnQgc3ViZm9ybSByZWNvcmQgcHJlZml4XHJcblxyXG4gIC8vIC0xIOKAkyBUaGUgdGFzayBpcyBub3QgZXhlY3V0ZWQgYXMgYSBzdWJmb3JtXHJcbiAgLy8gIDAg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJ5IHNldHRpbmcgdGhlIGZvY3VzIG9uIGl0XHJcbiAgLy8gIDEg4oCTIFRoZSBzdWJ0YXNrIGlzIGV4ZWN1dGVkIGZvciB0aGUgZmlyc3QgdGltZVxyXG4gIC8vICAyIOKAkyBUaGUgdGFzayBpcyBleGVjdXRlZCBiZWNhdXNlIHRoZSBBdXRvbWF0aWMgUmVmcmVzaCBwcm9wZXJ0eVxyXG4gIC8vICAgICAgb3IgdGhlIFN1YmZvcm0gUmVmcmVzaCBldmVudCBoYXMgYmVlbiB0cmlnZ2VyZWRcclxuICBwdWJsaWMgTW9kZUFzUGFyZW50OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzayBtb2RlIGlzICdBcyBQYXJlbnQnIHdlIG5lZWQgdG8gY2FyZSBvdXQgaXQgc3BlY2lmaWNhbGx5XHJcbiAgcHVibGljIFRhc2tUcmFuc2FjdGlvbk1hbmFnZXI6IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiB0aGUgY2xpZW50LlxyXG4gIC8vLyBSZWxldmFudCBvbmx5IGZvciBub24tb2ZmbGluZSB3aXRoIGxvY2FsIGRhdGEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgRXhlY3V0ZUNsaWVudFN1YmZvcm1SZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgZXhlY3V0ZXMgQ29tbW9uSGFuZGxlckJlZm9yZSBtZXRob2QuXHJcbiAgLy8vIEZvciBzdWJmb3JtcyB3ZSBkbyBub3QgZXhlY3V0ZSBpdCdzIFJQIGlmIHRoZSBwYXJlbnQgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gIC8vLyBpdCdzIENvbW1hbmRIYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBJbkNvbW1vbkhhbmRsZXJCZWZvcmVSUDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBkaWZmZXJlbnQgaW4gdGhlIHRhc2sgbGV2ZWwgYmV0d2VlbiBjb25uZWN0ZWQgYW5kIG9mZmxpbmUgc3RhdGVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlQmFzZSA9IG51bGw7XHJcblxyXG4gIGdldCBUYXNrU2VydmljZSgpOiBUYXNrU2VydmljZUJhc2Uge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2tTZXJ2aWNlID09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tTZXJ2aWNlID0gbmV3IFJlbW90ZVRhc2tTZXJ2aWNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXRyaWV2ZSBhbmQgcmV0dXJuIGEgY29tbWFuZHMgcHJvY2Vzc29yIGRlcGVuZGluZyBvbiB0YXNrIHR5cGUgYW5kIHN0YXRlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGdldCBDb21tYW5kc1Byb2Nlc3NvcigpOiBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gICAgcmV0dXJuIENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNMb2NhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsO1xyXG4gIHB1YmxpYyBBcmd1bWVudHNMaXN0OiBBcmd1bWVudHNMaXN0ID0gbnVsbDsgICAgICAgICAgIC8vIG9mZi1saW5lIGV4ZWN1dGlvbiAtIHRhc2sgYXJndW1lbnQsIHRvIGVuYWJsZSB0aGUgdXBkYXRlIG9mIGZpZWxkIHZhbHVlc1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJ0YXNrIGJ5IHRvb2xraXQgdHJlZSBpbmNsdWRlIHRoZSBtYWluIHByb2dyYW0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgTG9naWNhbFN0dWRpb1BhcmVudFRhc2soKTogVGFzayB7XHJcbiAgICBpZiAodGhpcy5TdHVkaW9QYXJlbnRUYXNrID09PSBudWxsICYmICFzdXBlci5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgcmV0dXJuIDxUYXNrPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgodGhpcy5Db250ZXh0SUQsIHRoaXMuX2N0bElkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIDxUYXNrPnRoaXMuU3R1ZGlvUGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIGdldCBLbm93blRvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2tub3duVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29uZmlybVVwZGF0ZU5vOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgLy8gb25seSBmb3IgY29uZmlybXMgdXBkYXRlXHJcbiAgcHVibGljIERhdGFTeW5jZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgVW5pcXVlU29ydDogVW5pcXVlVHNrU29ydCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIG9uIHRoZSBkYXRhIHZpZXcgbWFuYWdlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0IFRyYW5zYWN0aW9uKHZhbHVlOiBUcmFuc2FjdGlvbikge1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hPblZhcnM6IG51bWJlcltdID0gbnVsbDtcclxuICBwdWJsaWMgRHZQb3NEZXNjcmlwdG9yOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7XHJcbiAgcHVibGljIFN1YlRhc2tzOiBUYXNrc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRXhwVGFiOiBFeHBUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIFVzZXJFdnRUYWI6IFVzZXJFdmVudHNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIERhdGF2aWV3SGVhZGVyc1RhYmxlOiBEYXRhdmlld0hlYWRlcnMgPSBudWxsO1xyXG4gIHB1YmxpYyBIYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIF9mb3JtczogRm9ybXNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIFB1YmxpY05hbWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhc2sgc3VmZml4IHdhcyBwZXJmb3JtZWQgZm9yIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFRhc2tTdWZmaXhFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIGlmICh0aGlzLnRhc2tEZWZpbml0aW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy50YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQodGhpcy5fY3RsSWR4LCB0aGlzLlByb2dyYW1Jc24sIHRoaXMuVGFza0lzbiwgdGhpcy5faXNQcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGFza0RlZmluaXRpb25JZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZXRydW5WYWx1ZUV4cDogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgU3ViZm9ybUNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgIC8vIHJlY3Vyc2l2ZSBsZXZlbCBvZiBcInN0YXJ0UHJvZ1wiIGludm9jYXRpb25zXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9pZGxlVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBnZXQgSXNCbG9ja2luZ0JhdGNoKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVGFzayk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50PzogVGFzaykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocGFyZW50KSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBhcmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcigpO1xyXG4gICAgdGhpcy5EYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHRoaXMuX2Zsb3dNb25pdG9yID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSB0aGlzO1xyXG4gICAgdGhpcy5fZHZDYWNoZSA9IG5ldyBEdkNhY2hlKHRoaXMpO1xyXG4gICAgdGhpcy5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gdHJ1ZTtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyID0gbmV3IERhdGF2aWV3TWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbmV3IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudDogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fcGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gbnVsbDtcclxuICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIENyZWF0ZVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2sgPSAgbmV3IFRhc2soKTtcclxuICAgIHRhc2suSW5pdCgpO1xyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLyBJVGFzayBNZW1iZXJzXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlbGxzIHdoZXRoZXIgdGhlIHRhc2sgaXMgYWJvcnRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQWJvcnRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRpbmc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVGFza1BhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrUGF0aCA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGggIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tQYXRoLkFkZFJhbmdlKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoLkdldEVudW1lcmF0b3IoKSk7XHJcbiAgICB0aGlzLl90YXNrUGF0aC5wdXNoKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBkYXRhIGJ5IHBhcnNpbmcgdGhlIHhtbCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+cmVmZXJlbmNlIHRvIE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIGFzeW5jIGZpbGxEYXRhKG1nZDogTUdEYXRhLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSWYgdGhpcyB0YXNrIHdhcyBvcGVuZWQgYnkgYW4gXCJvcGVuIHdpbmRvd1wiIGNvbW1hbmQgLSBjb25uZWN0IGhpbSB0byBpdHMgcGFyZW50XHJcbiAgICBpZiAoIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gICAgICAgICg8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2spLmFkZFN1YlRhc2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuUGF0aFBhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZm9yIE1HX0FDVF9aT09NIGFjdGlvbiBlbmFibGVcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICB0aGlzLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhID0gbWdkO1xyXG4gICAgdGhpcy5maWxsQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5hZGRUYXNrKHRoaXMpO1xyXG5cclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpID8gdGhpcy5fcGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudEZvcm0pKSB7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLlByZXBhcmVUcmFuc2FjdGlvblByb3BlcnRpZXModGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5IYW5kbGVUcmlnZ2VyVGFzaygpO1xyXG4gICAgdGhpcy5IYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk7XHJcblxyXG4gICAgLy8gU2V0IGlzU3ViZm9ybSBmbGFnXHJcbiAgICB0aGlzLkNoZWNrQW5kU2V0U3ViRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAvLyBnZXQgdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBsZXQgc3ViRm9ybUN0cmw6IE1nQ29udHJvbCA9ICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5nZXRTdWJGb3JtQ3RybEZvclRhc2sodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIGlmIChzdWJGb3JtQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHN1YkZvcm1DdHJsLnNldFN1YmZvcm1UYXNrSWQodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSB3aXRoIHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gaGFuZGxlIHRoZSBQcmV2aW91c2x5QWN0aXZlVGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpICE9PSBudWxsICYmIHRoaXMuX21nRGF0YSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRNR0RhdGEoKSlcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gKHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza1RhZygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbClcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGhhbmRsZSB0aGUgdHJpZ2dlciB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVUcmlnZ2VyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKCk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzXzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICBzdXBlci5maWxsQXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gUUNSICM3NTk5MTE6IG1wcmcgbXVzdCBiZWxvbmcgdG8gdGhlIG1haW4gYXBwbGljYXRpb24ncyBNR0RhdGEuXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgdW50aWwgdGhlIGVuZCBvZiBleGVjdXRpb24uXHJcbiAgICAgIGlmIChzdXBlci5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5fbWdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLmZpbGxBdHRyaWJ1dGVzKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbjtcclxuICAgIGlzVGFnUHJvY2Vzc2VkID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0UmVmcmVzaE9uVmFycyh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICB0aGlzLk5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19ERUM6XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLnNldERlc2NyaXB0b3IodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MT0NBVEU6XHJcbiAgICAgICAgICBpZiAoK3ZhbHVlU3RyID09IDEpXHJcbiAgICAgICAgICAgIHRoaXMuaGFzTG9jYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9BU19QQVJFTlQ6XHJcbiAgICAgICAgICBpZiAoK3ZhbHVlU3RyID09IDEpXHJcbiAgICAgICAgICAgIHRoaXMuTW9kZUFzUGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX1VOSVFVRV9TT1JUOlxyXG4gICAgICAgICAgdGhpcy5VbmlxdWVTb3J0ID0gPFVuaXF1ZVRza1NvcnQ+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVFJBTlNfSUQ6XHJcbiAgICAgICAgICB0aGlzLnNldFJlbW90ZVRyYW5zYWN0aW9uKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QVUJMSUM6XHJcbiAgICAgICAgICB0aGlzLlB1YmxpY05hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19PRkZMSU5FOlxyXG4gICAgICAgICAgdGhpcy5Jc09mZmxpbmUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1JFVFVSTl9WQUxVRV9FWFA6XHJcbiAgICAgICAgICB0aGlzLlJldHJ1blZhbHVlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVTX0ZJTEVfTkFNRTpcclxuICAgICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPnBvc3NpYmxlIHRhZyBuYW1lICwgbmFtZSBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICBzd2l0Y2ggKGZvdW5kVGFnTmFtZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLl9oZWxwVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9oZWxwVGFiID0gbmV3IEhlbHBzKCk7XHJcblxyXG4gICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG5cclxuICAgICAgICB0aGlzLl9oZWxwVGFiLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVI6XHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuRGF0YVZpZXcuZmlsbEhlYWRlckRhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QOlxyXG4gICAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ1QnLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk06XHJcbiAgICAgICAgdGhpcy5Gb3JtID0gdGhpcy5Gb3JtSW5pdERhdGEocGFyZW50Rm9ybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVfQ09OVEVOVDpcclxuICAgICAgICAvLyBUT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImFzc2VtYmxpZXNcIjpcclxuICAgICAgICBsZXQgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZignL2Fzc2VtYmxpZXMnLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk1TOlxyXG4gICAgICAgIHRoaXMuX2Zvcm1zID0gbmV3IEZvcm1zVGFibGUodGhpcywgcGFyZW50Rm9ybSk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Zvcm1zLmZpbGxEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLOlxyXG4gICAgICAgIGlmICh0aGlzLlN1YlRhc2tzID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgICAgICBsZXQgc3VidGFzayA9IG5ldyBUYXNrKHRoaXMpO1xyXG4gICAgICAgIHN1YnRhc2suSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJ0YXNrKTtcclxuICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSB0aGlzLl9tZ0RhdGE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgICAgbWdkID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1HRGF0YUZvclN0YXJ0dXBQcm9ncmFtKCk7XHJcbiAgICAgICAgYXdhaXQgc3VidGFzay5maWxsRGF0YShtZ2QsIG5ldyBPcGVuaW5nVGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkw6XHJcbiAgICAgICAgYXdhaXQgVGFzay5Qcm9jZXNzVGFza1VSTCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWFBUQUJMRTpcclxuICAgICAgICBpZiAodGhpcy5FeHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuRXhwVGFiID0gbmV3IEV4cFRhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV4cFwiKTtcclxuICAgICAgICB0aGlzLkV4cFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU0VSX0VWRU5UUzpcclxuICAgICAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlVzZXJFdnRUYWIgPSBuZXcgVXNlckV2ZW50c1RhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHVzZXIgZXZlbnQgdGFiXCIpO1xyXG4gICAgICAgIHRoaXMuVXNlckV2dFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19MSU5LUzpcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlID0gbmV3IERhdGF2aWV3SGVhZGVycyh0aGlzKTtcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTOlxyXG4gICAgICAgIHRoaXMuUnVudGltZVNvcnRzID0gbmV3IFNvcnRDb2xsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMuZmlsbERhdGEoIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTOlxyXG4gICAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURTpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlXCIpO1xyXG4gICAgICAgIHRoaXMuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlRIQU5ETEVSUzpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXZlbnRoYW5kbGVyc1wiKTtcclxuICAgICAgICBpZiAodGhpcy5IYW5kbGVyc1RhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5IYW5kbGVyc1RhYiA9IG5ldyBIYW5kbGVyc1RhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5IYW5kbGVyc1RhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIHRoaXMuYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IChcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSykpIHtcclxuICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBUYXNrLmluaXRJbm5lck9iamVjdHMgLiBFbnRlciBjYXNlIGZvciBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBSZWNvbXB1dGVGaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlY29tcHV0ZVRhYmxlOiBSZWNvbXB1dGVUYWJsZSA9IG5ldyBSZWNvbXB1dGVUYWJsZSgpO1xyXG4gICAgcmVjb21wdXRlVGFibGUuZmlsbERhdGFfMSg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldywgdGhpcywgcGFyc2VyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMSgpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICAvLyBHZXQgdGhlIGVuZCBvZiB0aGUgdGFzayB0YWJsZSBlbGVtZW50XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFU19FTkQsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZENvbnRleHQpICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGg7XHJcbiAgICAvLyBnZXQgdGhlIHRhc2sgdGFibGUgeG1sIHN0cmluZ1xyXG4gICAgbGV0IHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgdGhpcy5GaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YSk7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgaGFuZGxlcnMgdHJpZ2dlcmVkIGJ5IGV4cHJlc3Npb25zIHRvIG1nZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk6IHZvaWQge1xyXG4gICAgbGV0IGlkeDogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHxcclxuICAgICAgICAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIGV2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpIHtcclxuICAgICAgICB0aGlzLl9tZ0RhdGEuYWRkRXhwSGFuZGxlcihoYW5kbGVyLCBpZHgpO1xyXG4gICAgICAgIGlkeCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZWZyZXNoIG9uIHZhcmlhYmxlIGxpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBTZXRSZWZyZXNoT25WYXJzKHZhcmlhYmxlczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgc3RyVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUodmFyaWFibGVzLCBcIixcIik7XHJcbiAgICBsZXQgZmxkTnVtOiBudW1iZXI7XHJcbiAgICBsZXQgaW50VmFscyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyVG9rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IE5OdW1iZXIuUGFyc2Uoc3RyVG9rW2ldKTtcclxuICAgICAgaW50VmFscy5wdXNoKGZsZE51bSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hPblZhcnMgPSBuZXcgQXJyYXkoaW50VmFscy5sZW5ndGgpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGludFZhbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gaW50VmFscy5nZXRfSXRlbShpKTtcclxuICAgICAgdGhpcy5SZWZyZXNoT25WYXJzW2ldID0gZmxkTnVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgRGF0YVN5bmNlZCBwcm9wZXJ0eSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREYXRhU3luY2VkKHN5bmNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhU3luY2VkID0gc3luY2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIGJ5IGl0cyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5vZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGZpZWxkIGJ5IGl0cyBuYW1lPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuICAgIHJldHVybiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhbiBleHByZXNzaW9uIGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmlkIG9mIHRoZSBleHByZXNzaW9uPC9wYXJhbT5cclxuICBnZXRFeHBCeUlkKGlkOiBudW1iZXIpOiBFeHByZXNzaW9uIHtcclxuICAgIGlmICh0aGlzLkV4cFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuRXhwVGFiLmdldEV4cEJ5SWQoaWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLkdldEV4cEJ5SWQoKTogbm8gZXhwcmVzc2lvbiB0YWJsZVwiKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXhwT2JqZWN0QnlJZChpZDogbnVtYmVyKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmdldEV4cEJ5SWQoaWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gZXhwQnlJZC5HZXRTdG9yYWdlQXR0cmlidXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxjdWxhdGUgZXhwcmVzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPlRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+VGhlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+VGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+RGVub3RlcyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSB1bmljb2RlIHN0cmluZy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+Tm90IHVzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4cEJ5SWQuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChyZXNUeXBlLCBsZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbnNlcnQgUmVjb3JkIFRhYmxlIHRvIGRhdGF2aWV3IG9mIHRoZSB0YXNrIGlmIGl0IGNhbWUgYWZ0ZXIgY2xvc2luZyB0YXNrIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaW5zZXJ0UmVjb3JkVGFibGUoaW52YWxpZGF0ZTogYm9vbGVhbiwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGNoZWNrIGNhY2hlIGxvZ2ljIG9ubHkgZm9yIHN1Yi1mb3Jtc1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaXJzdER2KCk7XHJcbiAgICAgIC8vIGlmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSB0YXNrIGdldCBkdiBvciB0aGUgb2xkIGR2IGlzIG5vdCBpbnZhbGlkYXRlZCBvclxyXG4gICAgICAvLyB0aGUgb2xkIGR2IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpcnN0IHJlY29yZCBkbyBub3QgcHV0IGluIGNhY2hlXHJcbiAgICAgIGlmICghZmlyc3RUaW1lICYmIGludmFsaWRhdGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgICAgICAvLyB0aGUgb2xkIGQudiB3YXMgbm90IHVwZGF0ZWQgcHV0IGl0IGluIGNhY2hlIChpdHMgcmVwbGljYXRlKVxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSW5jbHVkZXNGaXJzdCgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdGhpcy5sb2NhdGVQdXRJbkNhY2hlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHBhcnNlIHRoZSBuZXcgZGF0YXZpZXdcclxuICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZmlsbERhdGEocGFyc2VyKTtcclxuXHJcbiAgICBpZiAoaW52YWxpZGF0ZSlcclxuICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRDaGFuZ2VkKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGhhbmRsZXJzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRIYW5kbGVyc1RhYigpOiBIYW5kbGVyc1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLkhhbmRsZXJzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwgPSB0aGlzLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGlmICh0aGlzLktub3duVG9TZXJ2ZXIgJiYgIXRoaXMuSXNPZmZsaW5lKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0VGFza1RhZygpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19NQUlOTEVWRUwgKyBcIj1cXFwiXCIgKyB0aGlzLmdldE1haW5MZXZlbCgpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsICYmIHRoaXMuRm9ybS5PcGVuZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5HZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICA8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSByYW5nZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yUm5ncyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBVc2VyUmFuZ2VzOiBMaXN0PFVzZXJSYW5nZT4sIGxvY2F0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmbGQ6IEZpZWxkO1xyXG4gICAgbGV0IGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5TS0lQO1xyXG4gICAgbGV0IHRvQmFzZTY0OiBib29sZWFuID0gKEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBVc2VyUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JORyk7XHJcblxyXG4gICAgICBsZXQgcm5nOiBVc2VyUmFuZ2UgPSBVc2VyUmFuZ2VzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHJuZy52ZWVJZHggKyBcIlxcXCJcIik7XHJcblxyXG4gICAgICBmbGQgPSA8RmllbGQ+dGhpcy5EYXRhVmlldy5nZXRGaWVsZCg8bnVtYmVyPnJuZy52ZWVJZHggLSAxKTtcclxuICAgICAgbGV0IGZsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWluKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NSU5fUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1pbiAmJiBybmcubWluICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1pbiwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1JTl9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1heClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUFYX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNYXggJiYgcm5nLm1heCAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5tYXgsIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NQVhfUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2F0ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX0xPQ0FURVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGVsc2VcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JBTkdFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgdXNlciBhZGRlZCBzb3J0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JTb3J0cyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Vc2VyU29ydHMgIT0gbnVsbCAmJiB0aGlzLlVzZXJTb3J0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlVzZXJTb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICAgIGxldCBzcnQ6IFNvcnQgPSB0aGlzLlVzZXJTb3J0cy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlNPUlQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBzcnQuZmxkSWR4ICsgXCJcXFwiXCIpO1xyXG4gICAgICAgIGlmIChzcnQuZGlyKVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RJUiArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlVzZXJTb3J0cy5DbGVhcigpO1xyXG4gICAgICB0aGlzLlVzZXJTb3J0cyA9IG51bGw7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHVzZXIgZXZlbnQgYnkgaXRzIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGV2ZW50PC9wYXJhbT5cclxuICBnZXRVc2VyRXZlbnQoaWR4OiBudW1iZXIpOiBFdmVudCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKTtcclxuICAgIGxldCByZXRFdmVudDogRXZlbnQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0RXZlbnQgPSB0aGlzLlVzZXJFdnRUYWIuZ2V0RXZlbnQoaWR4KTtcclxuICAgIHJldHVybiByZXRFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gU2V0IHRoZSBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAobW92ZVRvRmlyc3RDb250cm9sIHx8ICF0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIGNhbGwgZGVzdGluYXRpb24vIHN1YmZvcm0gY2FsbFxyXG4gICAgICAgIC8vIFdlIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIG9ubHkgdG8gb25lIGNvbnRyb2wgZm9ybSBwZXIgcmVxdWVzdCAtIHRoZSBmaXJzdCBvbmUgdGhhdCB3ZSByZWNlaXZlXHJcbiAgICAgICAgbGV0IGFscmVhZHlNb3ZlZDogYm9vbGVhbiA9ICg8TWdGb3JtPnRoaXMuRm9ybSkuYWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICAgICAgICBpZiAoIWFscmVhZHlNb3ZlZClcclxuICAgICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuTW92ZWRUb0ZpcnN0Q29udHJvbCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGFuZCBpdHMgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPElUYXNrPiB7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzU3RhcnRlZCkge1xyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5Jbml0aWFsaXplRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0ID0gYXdhaXQgdGhpcy5TZXR1cCgpO1xyXG5cclxuICAgICAgLy8gdGFzayBpbml0aWFsaXphdGlvbiBmYWlsZWQgLSBjbG9zZSB0aGUgdGFza1xyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaygpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5FbmFibGVBY3Rpb25zKCk7XHJcblxyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0aGlzO1xyXG5cclxuICAgICAgdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBRQ1IgIyAxNjczMzIgOlxyXG4gICAgICAvLyBJZiB3ZSBzdGFydCBwb3JncmFtIFAxLCBmb3Igd2hpY2ggTVAgaXMgc3RhcnRlZC4gTVAgaXMgY2FsbGluZyBQMiBmcm9tIGl0J3MgVFAuIFNvLCB3aGVuIGl0IGNhbGxzIFAyXHJcbiAgICAgIC8vIGFnYWluIGl0IHN0YXJ0cyBNUCwgYnV0IGZyb20gTVAgaXQgYWdhaW4gc3RhcnRzIFAxLiBhcyBQMSBpcyBpbiBpdCdzIHN1YnRhc2sgYW5kIGl0IGlzIG5vdCB5ZXQgc3RhcnRlZC5cclxuICAgICAgLy8gU28sIGl0J3Mgd3JvbmcgdG8gc3RhcnQgUDEgd2hpbGUgZXhlY3V0aW5nIFRQIG9mIE1QLiBJdCBzaG91bGQgZXhlY3V0ZSBvbmx5IFAyLlxyXG4gICAgICAvLyBTbywgaW4gb3JkZXIgdG8gYXZvaWQgdGhpcywgc2V0IE1QJ3Mgc3VidGFza3MgdG8gbnVsbCBiZWZvcmUgZW50ZXJpbmcgVFAuIGFuZCBhZ2FpbiByZXN0b3JlIGl0IGJhY2ssIGluIG9yZGVyIHRvXHJcbiAgICAgIC8vIHN0YXJ0IFAxIHByb3Blcmx5LlxyXG4gICAgICBsZXQgc3ViVGFza3M6IFRhc2tzVGFibGUgPSB0aGlzLlN1YlRhc2tzO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gc3ViVGFza3M7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5GaXJzdENodW5rKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuUmVzdW1lU3ViZm9ybUxheW91dCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgZXhlY3V0aW9uLXJlbGF0ZWQgc3R1ZmYuXHJcbiAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBmcm9tIFRhc2suU3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdGlhbGl6ZUV4ZWN1dGlvbigpOiB2b2lkIHtcclxuICAgIC8vIGN1cnJlbnRseSB0aGUgaXMgbm8gY29udHJvbCBleGVjdXRpbmcgdGhlcmUgZm9yIHRoZVxyXG4gICAgLy8gY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleCBpcyBzZXQgdG8gLTFcclxuICAgIHN1cGVyLnNldEJya0xldmVsKENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfTUFJTiwgLTEpO1xyXG4gICAgdGhpcy5fZmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7ICAgICAgLy8gV2hpbGUgc3RhcnRpbmcgYSBUYXNrLCBzZXQgZmlyc3RSZWNvcmRDeWNsZSA9IFRSVUVcclxuXHJcbiAgICB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPSAoKHRoaXMuSXNTdWJGb3JtICYmICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpKVxyXG4gICAgICA/ICg8VGFzaz50aGlzLmdldFBhcmVudCgpKS5fY3VyclN0YXJ0UHJvZ0xldmVsXHJcbiAgICAgIDogVGFzay5TdGFydFByb2dMZXZlbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgZm9ybS1yZWxhdGVkIHN0dWZmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBJbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBzZXQgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uXHJcbiAgICAgIHRoaXMuU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICAvLyB0aGUgSW5pdEZvcm0gbWlnaHQgY2F1c2UgZXhlY3V0aW9uIG9mIGNvZGUgKHZhcmlhYmxlIGNoYW5nZSkgc28gd2Ugc2hvdWxkIGRvIGl0IHdpdGggYSBuZXcgc2VydmVyIGV4ZWN1dGlvbiBzdGFja1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtcyA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuR2V0Um91dGVQYXJhbXMoKTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgICAgIGF3YWl0IHRoaXMuSW5pdEZvcm0oKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0TUdEYXRhKCkuU3RhcnRUaW1lcnMoKTtcclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJldHVyblJlc3VsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCBzdWIgdGFza3Mgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2ssIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgbGV0IHRtcE5vbkludGVyYWN0aXZlVGFzazogVGFzayA9ICA8VGFzaz4gYXdhaXQgdGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrID09PSBudWxsKVxyXG4gICAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdG1wTm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRtcE5vbkludGVyYWN0aXZlVGFzayAhPT0gbnVsbClcclxuICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgaW4gdGFzay5zdGFydFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEVuYWJsZUFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgYWN0TGlzdDogbnVtYmVyW10gPSBBY3Rpb25NYW5hZ2VyLmFjdEVuYWJsZWQ7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChhY3RMaXN0LCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5ULCB0cnVlKTtcclxuXHJcblxyXG4gICAgLy8gZW5hYmxlIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRhc2sgcHJvcGVydGllc1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVuYWJsZVByaW50ZGF0YTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEEsIGZhbHNlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0RBVEEsIGVuYWJsZVByaW50ZGF0YSk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzaG93IGVycm9yIG9uIHRhc2sncyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBhc3luYyBTaG93RXJyb3IodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWxzVHJhbnNUZXh0OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRleHQpO1xyXG4gICAgbGV0IG1sc1RyYW5zVGl0bGU6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUoQ29uc3RJbnRlcmZhY2UuRVJST1JfU1RSSU5HKTtcclxuICAgIC8vIG1scyA/Pz9cclxuICAgIGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChtbHNUcmFuc1RpdGxlLCBtbHNUcmFuc1RleHQsIFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgdGhlIHJlc3VsdC4gSWYgZmFpbGVkIC0gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZWJveCBhbmQgZW5kIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRW5kVGFza09uRXJyb3IocmVzdWx0OiBSZXR1cm5SZXN1bHQsIGRpc3BsYXlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFyZXN1bHQuU3VjY2VzcyAmJiAhdGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuSW5TdGFydFByb2Nlc3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuZFRhc2soZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFNldHVwKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQ7XHJcbiAgICB0aGlzLlRhc2tTZXJ2aWNlLkluaXRUYXNrUHJlZml4RXhlY3V0ZWRGbGFnKHRoaXMpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBUYXNrU2VydmljZUJhc2UuQ3JlYXRlRmlyc3RSZWNvcmQodGhpcyk7XHJcblxyXG4gICAgLy8gaW5pdCBkYXRhIHZpZXdcclxuICAgIC8vIE5vdGU6IEV2ZW4gaWYgdGhlIHJlc3VsdEluaXRNb2RlIGlzIGZhbHNlIHdlIE1VU1QgaW5pdCB0aGUgZGF0YSB2aWV3XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0KTtcclxuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAvLyBuZWVkIHRvIGNoZWNrIHJlc3VsdChvZiB0aGUgZGF0YSB2aWV3IGluaXQgYW5kIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmV0dXJuIHRoaXMgZXJyb3JcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQsIHdob3NlIGV4ZWN1dGlvbiB3YXMgZGVsYXllZCBiZWN1YXNlIHRhc2sgd2FzIG5vdCBzdGFydGVkLiBTbyBFeGN1dGUgdGhvc2UgY29tbWFuZHMgYWZ0ZXIgdGFzayBzdGFydGVkLlxyXG4gICAgICBsZXQgY29tbWFuZHM6IExpc3Q8SUNsaWVudFRhcmdldGVkQ29tbWFuZD4gPSBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UuZ2V0Q29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNtZElkeDogbnVtYmVyID0gMDsgY21kSWR4IDwgY29tbWFuZHMubGVuZ3RoOyBjbWRJZHgrKykge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kID0gKGNvbW1hbmRzLmdldF9JdGVtKGNtZElkeCkpO1xyXG4gICAgICAgIGlmIChjb21tYW5kLlRhc2tUYWcgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICBhd2FpdCBjb21tYW5kLkV4ZWN1dGUobnVsbCk7XHJcbiAgICAgICAgICBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UucmVtb3ZlQ29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoY29tbWFuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuUHJlcGFyZSk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5UYXNrU2VydmljZS5QcmVwYXJlVGFzayh0aGlzKTtcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICBhd2FpdCB0aGlzLkVuZFRhc2tPbkVycm9yKHJlc3VsdCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0RGF0YUNvbnRyb2xWaWV3cyk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBmaXJzdCByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbmx5IGZvciBjb25uZWN0ZWQgdGFzay5cclxuICAvLy8gICBGb3Igb2ZmbGluZSB0YXNrIHdlIHJ1biBFbnRlckZpcnN0UmVjb3JkIGZ1bmN0aW9uLiBUaGVyZSB3ZSBleGVjdXRlIFJQIGFuZCBvcGVuIHN1YmZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2godGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRoaXMuSXNTdWJGb3JtKTtcclxuXHJcbiAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViVGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgICAgICBpZiAoc3ViVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPnN1YlRhc2suZ2V0Rm9ybSgpKS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHN1YlRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVM7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrIGlzIGEgc3ViIGZvcm0gYnkgaXRzIG1nZCBkZWZpbml0aW9uICh1c2VkIG9ubHkgd2hpbGUgaW5pdGlhdGluZyB0YXNrIGZvciBzZXR0aW5nIGlzU3ViZm9ybSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQ2hlY2tBbmRTZXRTdWJGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jc1N1YkZvcm0gPSAoIXN1cGVyLmlzTWFpblByb2coKSAmJiB0aGlzICE9PSB0aGlzLl9tZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIElzUm91dGUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuUm91dGVyUGF0aCAhPSBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdG9wIHRoZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2s7XHJcbiAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzaygwKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2suc2V0RGVzdGluYXRpb25TdWJmb3JtKHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgdGhpcy5fYWJvcnRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgdGFzayBhbmQgaXRzIHBhcmVudCBhcmUgZnJvbSBkaWZmZXJlbnQgTUdEQVRBIG9iamVjdHMgdGhlbiBkaXNjb25uZWN0XHJcbiAgICAvLyB0aGVtIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhpcyB0YXNrIGZyb20gaXRzIHBhcmVudFxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYXNrLnJlbW92ZVN1YlRhc2sodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBvbGRUaW1lcnM6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKSwgbmV3VGltZXJzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgICAgIGxldCBtZ2QgPSB0aGlzLmdldE1HRGF0YSgpO1xyXG5cclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgb2xkVGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QucmVtb3ZlVGltZXJIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIG1nZC5yZW1vdmVFeHByZXNzaW9uSGFuZGxlcih0aGlzKTtcclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgbmV3VGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QuY2hhbmdlVGltZXJzKG9sZFRpbWVycywgbmV3VGltZXJzKTtcclxuXHJcbiAgICAgICAgbWdkLnJlbW92ZVRhc2sodGhpcyk7XHJcbiAgICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWJvcnRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0YXNrIGdvdCBjbG9zZWQgZHVlIHRvIGEgY2xpY2sgb24gc2FtZSB0YXNrLCB0aGVuIHNldCBDdXJyZW50Q2xpY2tlZEN0cmwgdG8gbnVsbFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2xpY2tlZENvbnRyb2woKSAhPSBudWxsKVxyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbClcclxuICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBsZXQgc3ViRm9ybSA9IDxNZ0NvbnRyb2w+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgICBzdWJGb3JtLnNldFN1YmZvcm1UYXNrSWQobnVsbCk7XHJcbiAgICAgIHN1YkZvcm0uaW5pdFN1YmZvcm1UYXNrKCk7XHJcblxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpID09PSB0aGlzKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5zZXRMYXN0Rm9jdXNlZFRhc2sodGhpcy5fcGFyZW50VGFzayk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMxMDExMy4gSWYgdGhlIHN1YmZvcm0gdGFzayBmb3Igd2FzIG5vdCBsb2FkZWQgeWV0LCBkbyBub3QgcmVmcmVzaCBpdC5cclxuICAgICAgaWYgKHN1YkZvcm0uU3ViZm9ybUxvYWRlZClcclxuICAgICAgICBhd2FpdCAoc3ViRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2xlYXJEYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkNsZWFyKTtcclxuICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY2xlYXJEYXRhVmlld0NvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhYm9ydCB0aGUgTWdEYXRhIHRvIHdoaWNoIHRoZSB0YXNrIGJlbG9uZ3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFib3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRNR0RhdGEoKS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgc3ViLXRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBoYXNTdWJUYXNrcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzICE9PSBudWxsICYmIHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBIG51bWJlciwgMS0yNCwgdGhlIGN1cnJlbnQgdGFzaydzIGRlcHRoIGluIHRoZSB0YXNrIGV4ZWN1dGlvbiBoaWVyYXJjaHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZGVwdGggb2YgdGhlIHRhc2ssIDEgaWYgY2FsbGVkIGZyb20gdGhlIHJvb3QgdGFzazwvcmV0dXJucz5cclxuICBnZXRUYXNrRGVwdGgoYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoYnlQYXJlbnRPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcblxyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAoPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcbiAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBoYW5kbGVyIGFkZCBpdCB0byB0aGUgcGF0aFxyXG4gICAgaWYgKHRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IENvbnN0SW50ZXJmYWNlLlRPUF9MRVZFTF9DT05UQUlORVIpXHJcbiAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xyXG5cclxuICAgIHJldHVybiBkZXB0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgZ2V0VGFza0RlcHRoIHJlY3Vyc2lvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICBpZiAodG1wVGFzayA9PSBudWxsIHx8IGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8qIGlmIHRoZSBjdGxJZHggb2YgdGhlIGN1cnJlbnQgdGFzayBhbmQgdGhlIHBhcmVudCBhcmUgZGlmZmVyZW50LCAgICovXHJcbiAgICAgICAgLyogdGhhdCBpcyB0aGUgY3VycmVudCB0YXNrIGlzIGZyb20gYSBjb21wb25lbnQsIGFkZCB0aGUgY29tcG9uZW50J3MgKi9cclxuICAgICAgICAvKiBNYWluIFByZyBhcyB3ZWxsLiAqL1xyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICByZXR1cm4gMiArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgICByZXR1cm4gMSArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgfVxyXG4gICAgcmV0dXJuIDEgKyAodG1wVGFzaykuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj5vZiB0aGUgYW5jZXN0b3IgdGFzazwvcGFyYW0+XHJcbiAgR2V0VGFza0FuY2VzdG9yKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbjogbnVtYmVyKTogSVRhc2sge1xyXG4gICAgbGV0IHJldFRhc2s6IElUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gMClcclxuICAgICAgcmV0VGFzayA9IHRoaXM7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICAgIGlmICh0bXBUYXNrID09PSBudWxsKVxyXG4gICAgICAgIHRtcFRhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gICAgICBpZiAodG1wVGFzayAhPT0gbnVsbClcclxuICAgICAgICByZXRUYXNrID0gdG1wVGFzay5nZXRUYXNrQW5jZXN0b3JfKC0tZ2VuZXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGFzayBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRUYXNrRGVwdGgoKTogbnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmZiB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCB0YXNrIGNvbnRhaW5zIHRoZSB0YXNrIHBhc3NlZCBhcyBwYXJhbWV0ZXI8L3JldHVybnM+XHJcbiAgcGF0aENvbnRhaW5zKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1BhdGguQ29udGFpbnMoPFRhc2s+dGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY29udGV4dCB0YXNrIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb250ZXh0XCI+dGhlIG5ldyBjb250ZXh0IHRhc2sgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgU2V0Q29udGV4dFRhc2soY29udGV4dDogVGFza0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSA8VGFzaz5jb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRhc2sgd2hpY2ggaXMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbnRleHRUYXNrKCk6IElUYXNrIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzXHJcbiAgICAgIHx8IGN1cnJSZWMgIT09IG51bGwgJiYgKGN1cnJSZWMuSW5Db21wdXRlIHx8IGN1cnJSZWMuSW5SZWNvbXB1dGUpXHJcbiAgICAgIHx8IHRoaXMuRm9ybSAhPT0gbnVsbCAmJiB0aGlzLkZvcm0uaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5Db250ZXh0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIgd2hpY2ggY3JlYXRlZCBtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VHJpZ2dlcmluZ1Rhc2soKTogVGFzayB7XHJcbiAgICAvLyBUaGlzIGlzIGEgc2VtaSBwYXRjaCB3aGljaCBmaXhlcyBwcm9ibGVtcyBzdWNoIGFzIHRoZSBvbmVzIGluIFFDUiAjMjk2NDI4XHJcbiAgICAvLyBXaGVuIGEgbW9kYWwgdGFzayBnZXRzIG9wZW5lZCwgaXQgbWlnaHQgc2V0IGl0cyB0cmlnZ2VyaW5nIHRhc2sgdG8gYSB0YXNrXHJcbiAgICAvLyB3aG9zZSAnYWJvcnQnIGNvbW1hbmQgYXJyaXZlZCBhbmQgaXMgcGVuZGluZyBmb3IgZXhlY3V0aW9uLiBVbmRlciB0aGVzZVxyXG4gICAgLy8gY2lyY3Vtc3RhbmNlcywgd2UgbXVzdCBjaGVjayBldmVyeSBhY2Nlc3MgdG8gdHJpZ2dlcmluZ1Rhc2sgYW5kIG1ha2Ugc3VyZVxyXG4gICAgLy8gaXQgcG9pbnRzIHRvIGEgdmFsaWQgdGFzay5cclxuICAgIGlmICh0aGlzLl90cmlnZ2VyaW5nVGFzayAhPT0gbnVsbCAmJiB0aGlzLl90cmlnZ2VyaW5nVGFzay5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKVxyXG4gICAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJpbmdUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpbiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmxhc3QgZm9jdXNlZCBjb250cm9sPC9wYXJhbT5cclxuICBzZXRMYXN0UGFya2VkQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGhpcywgY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUXVlcnkgVGFzayBQYXRoIFJldHVybnMgdGhlIHRhc2sgcGF0aCB0aGF0IGxlYWRzIHRvIHRoZSBjdXJyZW50IHRhc2suIFRoZSByZXN1bHRpbmcgYWxwaGEgc3RyaW5nXHJcbiAgLy8vICAgY29udGFpbnMgdGhlIHRhc2sgbmFtZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgbmFtZSBvZiB0aGUgdGFzay4gTmFtZXMgYXJlIHNlcGFyYXRlZCBieSB0aGUgJzsnXHJcbiAgLy8vICAgY2hhcmFjdGVyLiBGb3IgUFJPRygpIHVzaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcXVlcnlUYXNrUGF0aCgpOiBTdHJpbmdCdWlsZGVyIHtcclxuICAgIGxldCBpbnNlcnRlZE5hbWVzOiBudW1iZXIgPSAwOyAgICAgICAgLy8gaG93IG1hY2ggbmFtZXMgaW5zZXJ0ZWQgdG8gdGhlIG91dHB1dCBzdHJpbmdcclxuICAgIGxldCByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcig3OTM2KTsgLy8gMzEgKiAyNTYgKi9cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgoZmFsc2UpKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIGZhbHNlKTtcclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBsZXQgY3VyclRzazogVGFzayA9IHRyZWVSb3V0ZVt0c2tdO1xyXG4gICAgICBpZiAoY3VyclRzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGxldCBuYW1lUHJvcDogUHJvcGVydHkgPSBjdXJyVHNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSk7XHJcbiAgICAgIGlmIChuYW1lUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gbmFtZVByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgMSBuYW1lIC0+IGRvbid0IGluc2VydCAnOydcclxuICAgICAgICAvLyBhZnRlciBsYXN0IG5hbWUgZG9uJ3QgaW5zZXJ0ICc7JyB0b28uXHJcbiAgICAgICAgaWYgKGluc2VydGVkTmFtZXMrKyAhPT0gMClcclxuICAgICAgICAgIHJlc3VsdC5BcHBlbmQoJzsnKTtcclxuICAgICAgICByZXN1bHQuQXBwZW5kKG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBGaWVsZCB3aGljaCBjb250YWluIGl0ZW0gbnVtYmVyIGl0bVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3RsX2l0bV8yX3BhcmVudF92ZWUoaXRtOiBudW1iZXIpOiBGaWVsZCB7XHJcbiAgICBsZXQgY3VyclRzazogVGFzaztcclxuICAgIGxldCBjdXJySXRtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxhc3RJdG06IG51bWJlciA9IDA7ICAgICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aC0xXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdHNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdHNrID49IDA7IHRzay0tKSB7XHJcbiAgICAgIGN1cnJUc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuXHJcbiAgICAgIGN1cnJJdG0gKz0gY3VyclRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBmb3VuZCB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgZmllbGRcclxuICAgICAgaWYgKGl0bSA8IGN1cnJJdG0pIHtcclxuICAgICAgICAvLyBudW1iZXIgb2YgRmllbGQgaW4gZm91bmQgdGFza1xyXG4gICAgICAgIGl0bSAtPSBsYXN0SXRtO1xyXG4gICAgICAgIHJldHVybiA8RmllbGQ+Y3VyclRzay5EYXRhVmlldy5nZXRGaWVsZChpdG0pO1xyXG4gICAgICB9XHJcbiAgICAgIGxhc3RJdG0gPSBjdXJySXRtO1xyXG4gICAgfVxyXG4gICAgLy8gbm90IGZvdW5kIHRoZSBmaWVsZFxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBpZCB3aGljaCBjb250YWluIGZpZWxkIGF0dGFjaGVkIHRvIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbElERnJvbVZhckl0ZW0oaXRlbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgIGxldCBjdXJySXRlbTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRlbTogbnVtYmVyID0gMDsgICAvLyBzdGFydCBvZiB0aGUgZmllbGQgaW4gZmllbGRlVGFiIG51bWJlciBmb3IgY2hlY2tlZCB0YXNrXHJcbiAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcbiAgICAgIGN1cnJJdGVtICs9IGN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbCAmIGZpZWxkXHJcbiAgICAgIGlmIChpdGVtIDwgY3Vyckl0ZW0pIHtcclxuICAgICAgICAvLyBOdW1iZXIgb2YgZmllbGRzIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdGVtIC09IGxhc3RJdGVtO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN1cnJUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGl0ZW0pO1xyXG4gICAgICAgIGlmIChmaWVsZC5nZXRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayA9IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICsgY3VyclRhc2suRm9ybS5nZXRDb250cm9sSWR4KGZpZWxkLmdldEN0cmwoKSkgKyAxO1xyXG5cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN1cnJUYXNrLkZvcm0gIT0gbnVsbClcclxuICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgbGFzdEl0ZW0gPSBjdXJySXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cm9sIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSBpbiBzYW1lIHRhc2sgbm90IGZvdW5kXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250cm9sIGZyb20gY29udHJvbElEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sSURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbEZyb21Db250cm9sSUQoY29udHJvbElEOiBudW1iZXIsIHBhcmVudDogUmVmUGFyYW08bnVtYmVyPik6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIHBhcmVudC52YWx1ZSA9IC0xO1xyXG5cclxuICAgIGlmIChjb250cm9sSUQgPj0gMCkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgY2FsbGVyVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgIGxldCBub09mQ29udHJvbHNJbkN1cnJ0YXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBjb250cm9sSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuXHJcbiAgICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoIC0gMV1cclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuXHJcbiAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIG5vT2ZDb250cm9sc0luQ3VycnRhc2sgPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbFxyXG4gICAgICAgICAgaWYgKGNvbnRyb2xJRCA8IChub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIG5vT2ZDb250cm9sc0luQ3VycnRhc2spKSB7XHJcbiAgICAgICAgICAgIC8vIElkeCBvZiB0aGUgY29udHJvbCBpbiBjdXJyZW50IHRhc2tcclxuICAgICAgICAgICAgY29udHJvbElkeCA9IGNvbnRyb2xJRCAtIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrO1xyXG4gICAgICAgICAgICBjb250cm9sID0gPE1nQ29udHJvbD5jdXJyVGFzay5Gb3JtLkN0cmxUYWIuZ2V0Q3RybChjb250cm9sSWR4KTtcclxuICAgICAgICAgICAgY2FsbGVyVGFzayA9IGN1cnJUYXNrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBub09mQ29udHJvbHNJbkN1cnJ0YXNrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR2V0IHBhcmVudFxyXG4gICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50LnZhbHVlID0gMDtcclxuICAgICAgICBsZXQgcHJldkN0bElkeDogbnVtYmVyID0gdHJlZVJvdXRlWzBdLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IDA7IHRhc2sgPCB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzaysrKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuXHJcbiAgICAgICAgICBpZiAocHJldkN0bElkeCAhPT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgcGFyZW50LnZhbHVlKys7XHJcblxyXG4gICAgICAgICAgaWYgKGNhbGxlclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCA9PT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgcHJldkN0bElkeCA9IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgQ29udHJvbElEXHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fNF9wYXJlbnRfdmVlKHBhcmVudDogbnVtYmVyLCB2ZWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdHNrOiBUYXNrO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSB0aGlzLmdldFRhc2tEZXB0aCh0cnVlKTtcclxuXHJcbiAgICBpZiAocGFyZW50ICE9PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQgJiYgZGVwdGggPD0gcGFyZW50KVxyXG4gICAgICByZXR1cm4gdmVlO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG5cclxuICAgIGlmICh2ZWUgIT09IDApIHtcclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHBhcmVudCBpbiB0aGUgdGFzayB0cmVlXHJcbiAgICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IHRoaXMuZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudCwgdHJlZVJvdXRlKTtcclxuXHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyBpID4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlOyBpLS0pIHtcclxuICAgICAgICB0c2sgPSB0cmVlUm91dGVbaV07XHJcbiAgICAgICAgdmVlICs9IHRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2ZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrVHJlZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRJbmRPZlBhcmVudEluVGFza1RyZWUocGFyZW50OiBudW1iZXIsIHRhc2tUcmVlOiBUYXNrW10pOiBudW1iZXIge1xyXG4gICAgbGV0IGluZE9mUGFyZW50SW5UYXNrVHJlZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgdGFza1RyZWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAodGFza1RyZWVbaV0uaXNNYWluUHJvZygpICYmIHRoaXMuX2N0bElkeCA9PT0gdGFza1RyZWVbaV0uZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgaW5kT2ZQYXJlbnRJblRhc2tUcmVlID0gcGFyZW50O1xyXG5cclxuICAgIHJldHVybiBpbmRPZlBhcmVudEluVGFza1RyZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW50cnkgcG9pbnQgdG8gdGhlIHJlY3Vyc2lvbiBpbmR1Y2VkIGJ5IGdldEZpZWxkQnlOYW1lXy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gYSBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIG1lIG9yIHRvIG15IHBhcmVudHMgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxUYXNrPiAodGhpcy5HZXRDb250ZXh0VGFzaygpKSkuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgZmllbGQgd2l0aCB0aGUgbmFtZSBpbiB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWUsIHRoZSBuYW1lIGNhbiBiZSBlbXB0eSBzdHJpbmcgdG9vPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlOYW1lXyhmbGROYW1lOiBzdHJpbmcpOiBGaWVsZHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmIChmbGROYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkKGZsZE5hbWUpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmaWVsZCBpcyBub3Qgb3VycyAtIHJlY3Vyc2l2ZSBjaGVjayB0aGUgYW5jZXN0b3JzXHJcbiAgICBpZiAoZmxkID09IG51bGwpIHtcclxuICAgICAgdG1wVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSAhPSBudWxsID8gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpIDogdGhpcy5fcGFyZW50VGFzaztcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRtcFRhc2suZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGxldCBtYWluUHJnOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIHRoaXMuZ2V0Q3RsSWR4KCkpO1xyXG4gICAgICAgICAgZmxkID0gbWFpblByZy5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgICAgICBmbGQgPSB0bXBUYXNrLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbm90IGZvdW5kIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBaZXJvLjwvcmV0dXJucz5cclxuICBnZXRJbmRleE9mRmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IHRoaXMuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgICBsZXQgZmxkVGFiOiBGaWVsZHNUYWJsZTtcclxuXHJcbiAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSBkZXB0aCAtIDE7IGN1cnIgPj0gMDsgY3Vyci0tKSB7XHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRyZWVSb3V0ZVtjdXJyXTtcclxuICAgICAgaWYgKGN1cnJUYXNrID09PSBmbGQuZ2V0VGFzaygpKSB7XHJcbiAgICAgICAgY3VyciA9IGZsZC5nZXRJZCgpO1xyXG4gICAgICAgIGluZGV4ICs9ICsrY3VycjsgICAgICAgICAvLyBzdGFydCBpbmRleCBpbiBNYWdpYyBmcm9tIDEgYW5kIG5vdCBmcm9tIDBcclxuICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG91dCBvZiB0aGUgdGFzayB0cmVlIC0gdGhlIGluZGV4IGlzIGZvdW5kXHJcbiAgICAgIH1cclxuICAgICAgZmxkVGFiID0gPEZpZWxkc1RhYmxlPmN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpO1xyXG4gICAgICBpbmRleCArPSBmbGRUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSB0aGUgcGF0aCBmcm9tIHRoaXMgdGFzayB0byB0aGUgcm9vdCBvZiB0aGUgdGFza3MgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXRoXCI+YXJyYXkgb2YgdGFza3MsIHRoZSByb3V0ZSB1cC4gVGhlIDAgaXRlbSBpcyBzdGFydCBwb2ludCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHBhdGhUb1Jvb3QocGF0aDogVGFza1tdLCBieVBhcmVudE9yZGVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IChieVBhcmVudE9yZGVyID8gdGhpcyA6IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBhdGhbaV0gPSB0YXNrO1xyXG4gICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0YXNrLmdldEN0bElkeCgpO1xyXG5cclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSBieVBhcmVudE9yZGVyID8gbnVsbCA6IHRhc2suZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpXHJcbiAgICAgICAgdGFzayA9IHRtcFRhc2s7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBnbG9iYWwgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgICAgICAgIGlmICghYnlQYXJlbnRPcmRlciAmJiB0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICAgICAgICBwYXRoW2kgKyAxXSA9IHRoaXM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIGN0bElkeCAhPT0gdGFzay5nZXRDdGxJZHgoKSlcclxuICAgICAgICAgIHBhdGhbKytpXSA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyB0YXNrIHNob3VsZCBiZSByZWZyZXNoZWQgLSBjb21wYXJlIHRoZSBcInJlZnJlc2ggb25cIiBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZVxyXG4gIC8vLyAgIHByZXZpb3VzIHJlY29yZCBhbmQgaWYgZGlmZmVyZW50IHZhbHVlcyBhcmUgZm91bmQgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNob3VsZEJlUmVmcmVzaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl9wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHByZXZDdXJyUmVjIGlzIG51bGwgb25seSBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSBvciBhZnRlciBDYW5jZWwuXHJcbiAgICAvLyBBZnRlciBDYW5jZWwgaW4gdGhlIHBhcmVudCB0YXNrIFN1YmZvcm0gcmVmcmVzaCBtdXN0IGJlIGRvbmUgYWx3YXlzXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCB8fCBkYXRhVmlldy5pc1ByZXZDdXJyUmVjTnVsbCgpIHx8XHJcbiAgICAgICh0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgIWRhdGFWaWV3LmN1cnJFcXVhbHNQcmV2KHRoaXMuUmVmcmVzaE9uVmFycykpKVxyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWJUYXNrcyAoc3ViZm9ybXMpIHNob3VsZCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIENoZWNrUmVmcmVzaFN1YlRhc2tzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGRvIG5vdCByZWZyZXNoIHN1YmZvcm1zIGJlZm9yZSB0aGUgZmlyc3QgcmVjb3JkIHByZWZpeC4gVGhlIHNlcnZlciBzZW50IHVzIHRoZWlyIGRhdGF2aWV3IVxyXG4gICAgaWYgKHRoaXMuX2VudGVyZWRSZWNMZXZlbCkge1xyXG4gICAgICBsZXQgc3ViZm9ybXNUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBhd2FpdCB0aGlzLkdldFN1YmZvcm1zVG9SZWZyZXNoKCk7XHJcblxyXG4gICAgICBpZiAoc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoID4gMClcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2Ygc3VidGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5hIGxpc3Qgb2Ygc3VidGFza3M8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRTdWJUYXNrcygpOiBMaXN0PFRhc2s+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSlcclxuICAgICAgICBzdWJUYXNrcy5wdXNoKDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIGEgbGlzdCBvZiB0aG9zZSBzdWJmb3JtcyB0aGF0IG11c3QgYmUgcmVmcmVzaGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmxpc3Qgb2Ygc3ViZm9ybXMgdG8gcmVmcmVzaDwvcmV0dXJucz5cclxuICBhc3luYyBHZXRTdWJmb3Jtc1RvUmVmcmVzaCgpOiBQcm9taXNlPExpc3Q8VGFzaz4+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuICAgIGxldCBzdWJUYXNrc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLlNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrKSlcclxuICAgICAgICBzdWJUYXNrc1RvUmVmcmVzaC5wdXNoKHN1YlRhc2spXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzVG9SZWZyZXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmljIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YlRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgU2hvdWxkUmVmcmVzaFN1YmZvcm1UYXNrKHN1YlRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+c3ViVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuXHJcbiAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgLy8gRGVmZWN0IDc2OTc5LiBTdWJmb3JtIGNhbiBleGVjdXRlIHJlZnJlc2ggb25seSBhZnRlciBpdCBoYXMgVGFza1ZpZXcuXHJcbiAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAhc3ViVGFzay5JblNlbGVjdCAmJiBzdWJUYXNrLkFmdGVyRmlyc3RSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgbGV0IHBhcmVudE1vZGU6IHN0cmluZyA9IHRoaXMuZ2V0TW9kZSgpO1xyXG4gICAgICBsZXQgbW9kZVByb3BlcnR5OiBudW1iZXIgPSAocGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZXHJcbiAgICAgICAgOiBwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSk7XHJcblxyXG4gICAgICAvLyBGb3IgYSBzdWJmb3JtIHdpdGggJ0FzUGFyZW50JyBtb2RlIHdlIGFsc28gbXVzdCByZWZyZXNoIHRoZSBzdWJmb3JtXHJcbiAgICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgcmVjb3JkIHByZWZpeC4gSWYgdGhlIHNwZWNpZmljIG1vZGUgaXMgbm90IGFsbG93ZWRcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gY29udGludWVzIGluIHRoZSBvbGQgbW9kZS5cclxuICAgICAgaWYgKHN1YlRhc2suTW9kZUFzUGFyZW50ICYmIHBhcmVudE1vZGUgIT09IHN1YlRhc2suZ2V0TW9kZSgpICYmXHJcbiAgICAgICAgdGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgJiZcclxuICAgICAgICBhd2FpdCAoc3ViVGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpICYmXHJcbiAgICAgICAgYXdhaXQgc3ViVGFzay5jaGVja1Byb3AobW9kZVByb3BlcnR5LCB0cnVlKSkge1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlZnJlc2ggPSBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNILCB0cnVlKSAmJiBzdWJUYXNrLnNob3VsZEJlUmVmcmVzaGVkKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsLlJlZnJlc2hPblZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaClcclxuICAgICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmcmVzaDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0cyB0aGUgdGFzayBtb2RlIGFzIHBhcmVudCBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRNb2RlXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRNb2RlQXNQYXJlbnQocGFyZW50TW9kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmVuYWJsZU1vZGVzKCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgIGxldCBzdWJUYXNrRHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAgIGlmICghc3ViVGFza0R2LmlzRW1wdHkoKSAmJiAoc3ViVGFza0R2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRNb2RlKHBhcmVudE1vZGUpO1xyXG5cclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZShwYXJlbnRNb2RlKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhZnRlciBjb21wdXRlIGRvIHN1YmZvcm0gdGFzayByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgYXN5bmMgZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4KSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2xlYW4gZmxhZyBmb3IgU3ViZm9ybSByZWNvcmQgY3ljbGUgPC9zdW1tYXJ5PlxyXG4gIENsZWFuRG9TdWJmb3JtUHJlZml4U3VmZml4KCk6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBtdXN0IGRpc3BsYXkgY29uZmlybWF0aW9uIHdpbmRvdyBwcmlvciB0byBkZWxldGluZyBhIHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG11c3RDb25maXJtSW5EZWxldGVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFKTtcclxuXHJcbiAgICAvLyBBcyBzdHJhbmdlIGFzIGl0IHNvdW5kcywgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvXHJcbiAgICAvLyBGYWxzZSwgdGhlbiBubyBuZWVkIHRvIGRpc3BsYXkgY29uZmlybWF0aW9uLi4uXHJcbiAgICByZXR1cm4gIXByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPnRoZSBzdWIgdGFzayB0byBhZGQ8L3BhcmFtPlxyXG4gIGFkZFN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSBvbmUgb2YgdGhpcyB0YXNrcyBzdWItdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJUYXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHN1Yi10YXNrIHRvIHJlbW92ZTwvcGFyYW0+XHJcbiAgcmVtb3ZlU3ViVGFzayhzdWJUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TdWJUYXNrcyAhPT0gbnVsbClcclxuICAgICAgdGhpcy5TdWJUYXNrcy5yZW1vdmVUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyYW5zYWN0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQgPSB2YWw7XHJcblxyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGV2ZWxcIj5pcyB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBsZXZlbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjaGVja2luZy4gVFJBTlNfTk9ORSAtLT4gY2hlY2sgZm9yIGFueVxyXG4gIC8vLyAgIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgZmFpbHVyZSBUUkFOU19SRUNPUkQvVEFTS19QUkVGSVggLS0+IGNoZWNrIGZvciBhIGZhaWx1cmUgaW4gdGhhdCBzcGVjaWZpY1xyXG4gIC8vLyAgIGxldmVsPC9wYXJhbT5cclxuICB0cmFuc2FjdGlvbkZhaWxlZChsZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgZWxzZSBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0TGV2ZWwoKSA9PT0gbGV2ZWwpKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQ7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBmbGFnIG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiByZXRyeSBvbiB0aGUgdGFzaydzIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgb2YgZmxhZzwvcGFyYW0+XHJcbiAgc2V0QWZ0ZXJSZXRyeSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRBZnRlclJldHJ5KHZhbCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh2YWwgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgPSBudWxsO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWZ0ZXJSZXRyeSgpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW47XHJcbiAgZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBZnRlclJldHJ5XzEocmVjb3ZlcnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhpcyB0YXNrIGlzIHBhcnQgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGN1cnJlbnRseSBiZWluZyByZXRyaWVkIHdpdGggYSBzcGVjaWZpYyByZWNvdmVyeTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMShyZWNvdmVyeTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEV4ZWNFbmRUYXNrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIF9iRXhlY0VuZFRhc2sgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0RXhlY0VuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYkV4ZWNFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwiZXhlY3V0ZSBlbmQgdGFza1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFdmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RlXCI+dGhlIG1vZGUgdG8gY29tcGFyZSB0bzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzaG91bGQgd2UgZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24/PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV2YWxFbmRDb25kKG1vZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGVuZFRhc2tDb25kUHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgZXZhbEVuZENvbmRQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT04pO1xyXG5cclxuICAgIC8vIERvbnQgZXZhbHVhdGUgZW5kIGNvbmRpdGlvbiBpZiB3ZSBhcmUgYWxyZWFkeSBjbG9zaW5nIHRoZSB0YXNrXHJcbiAgICBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fYkV4ZWNFbmRUYXNrKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZXZhbEVuZENvbmRQcm9wICE9IG51bGwgJiYgKCBOU3RyaW5nLkNvbXBhcmUoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCksIENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFLFxyXG4gICAgICAgIHRydWUpID09PSAwIHx8ICgoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCkpLnRvTG93ZXJDYXNlKCkgPT09IG1vZGUudG9Mb3dlckNhc2UoKSkpKSB7XHJcbiAgICAgIC8vIGNoZWNrIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgIGVuZFRhc2tDb25kUHJvcCA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OKTtcclxuICAgICAgaWYgKGVuZFRhc2tDb25kUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgbGV0IGVuZFRhc2s6IHN0cmluZyA9IGF3YWl0IGVuZFRhc2tDb25kUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyBzaWduYWwgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGVuZCB0YXNrIGFmdGVyIHdlIGdldCBvdXQgb2YgdGhlIGxvb3BcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGVuZFRhc2spKSB7XHJcbiAgICAgICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInRyeWluZyB0byBzdG9wXCIgZmxhZyBmb3IgdGhlIHRhc2sgYW5kIGl0J3Mgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyeWluZ1RvU3RvcCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICB0YXNrLnNldFRyeWluZ1RvU3RvcCh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLklzVHJ5aW5nVG9TdG9wID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldEluUmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJblJlY29yZFN1ZmZpeChiVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiVmFsdWUgIT09IHRoaXMuX2luUmVjb3JkU3VmZml4KSB7XHJcbiAgICAgIHRoaXMuX2luUmVjb3JkU3VmZml4ID0gYlZhbHVlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJFdmFsT2xkVmFsdWVzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYkZsYWdcIj50cnVlL2ZhbHNlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmxhc2UgLSB2YWx1ZSB1cGRhdGVkPC9yZXR1cm5zPlxyXG4gIHNldEV2YWxPbGRWYWx1ZXMoYkZsYWc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiRmxhZyAhPT0gdGhpcy5fZXZhbE9sZFZhbHVlcykge1xyXG4gICAgICB0aGlzLl9ldmFsT2xkVmFsdWVzID0gYkZsYWc7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkV2YWxPbGRWYWx1ZXMgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZS9mYWxzZSAtIGxvb2sgYXQgb2xkIHZhbHVlcyB3aGVuIGdldHRpbmcgdGhlIGZpZWxkIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV2YWxPbGRWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZhbE9sZFZhbHVlcztcclxuICB9XHJcblxyXG4gICBhc3luYyBlbmRUYXNrKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbj86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzdWJmb3JtRGVzdGluYXRpb24pKVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZmFsc2UsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgc3ViZm9ybURlc3RpbmF0aW9uLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkIGluIGVuZGluZyB0aGUgdGFzayBhbmQgaXRzIHN1YiB0YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPmlmIHRydWUgdGhlbiB0aGUgZXhpdCBpcyByZXZlcnNpYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlEZXNjc1wiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGUgc3ViIHRhc2tzIGFuZCBoYW5kbGUgcmVjIHN1ZmZpeCBmb3IgdGhpcyB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1EZXN0aW5hdGlvblwiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGlzIHRhc2s8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVGFza18xKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbiwgZHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY2xvc2VkU3ViRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuXHJcbiAgICBpZiAoKHRoaXMuSXNTdWJGb3JtICYmICFzdWJmb3JtRGVzdGluYXRpb24pICYmICF0aGlzLl9wYXJlbnRUYXNrLkluRW5kVGFzaykge1xyXG4gICAgICAvLyBpZiB0aGlzIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0cnlpbmcgdG8gc3RvcCB0aGVuXHJcbiAgICAgIC8vIHN0YXJ0IHN0b3BwaW5nIHRoZSB0YXNrcyBzdWIgdHJlZSBmcm9tIHRoZSBwYXJlbnQgZm9ybVxyXG4gICAgICBzdWNjZWVkZWQgPSBhd2FpdCB0aGlzLl9wYXJlbnRUYXNrLmVuZFRhc2socmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgIXRoaXMuSW5FbmRUYXNrKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5JbkVuZFRhc2sgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGVycm9yIGFuZCBicm93c2VyIGNsb3NlLCBpbnRpbWF0ZSBzZXJ2ZXIgYWJvdXQgYnJvd3NlciBjbG9zZVxyXG4gICAgICAgIGlmKChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHN1YlRhc2tzIGluIGEgcHJlZml4IG1hbm5lclxyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KSB7XHJcbiAgICAgICAgICAvLyBleGl0IGZyb20gdGhlIHN1YiB0YXNrc1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBsZXQgY2xpZW50T3BlckV4aXN0OiBib29sZWFuID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3ModGhpcyxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJFeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdClcclxuICAgICAgICAgICAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGhpcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0ICYmICFwZW5kaW5nVHJhbnNhY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgY2xvc2VkU3ViRm9ybSA9IGNsb3NlZFN1YkZvcm0gfHwgc3ViVGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBleGl0IGZvciB0aGUgZmlyc3QgdGFzayBtdXN0IGVuZCBhbGwgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzID09PSBtZ2RUYWIuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSBtZ2RUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+IDAgJiYgc3VjY2VlZGVkOyBpLS0pIHtcclxuICAgICAgICAgICAgICBpZiAobWdkVGFiLmdldE1HRGF0YShpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sobWdkVGFiLmdldE1HRGF0YShpKS5nZXRGaXJzdFRhc2soKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XHJcbiAgICAgICAgICAvLyBpZiBjbG9zaW5nIHRoZSBzdWIgdGFza3Mgd2FzIHN1Y2Nlc3NmdWwgdGhlbiBleGVjdXRlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiAhZHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgdHVybiBvZmYgdGhlIGZvcmNlIHJlY29yZCBzdWZmaXgsXHJcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhbiB1bndhbnRlZCB1cGRhdGUgbWlnaHQgYmUgc2VudCB3aGVuIHRhc2sgZW5kcy5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgZm9yY2VTdWZmaXggPT09IHRydWUgJiYgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIFwiMFwiKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBmb3JjZSBzdWZmaXgsIGZvciBqdXN0IGluIGNhc2UuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjFcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIGlmIChzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcylcclxuICAgICAgICAgICAgdGhpcy5IYW5kbGVUcmFuc2FjdGlvbkluZm8oKTtcclxuXHJcbiAgICAgICAgICBsZXQgcHJlVHNrU3VmZml4OiBib29sZWFuID0gc3VjY2VlZGVkO1xyXG5cclxuICAgICAgICAgIC8vIG5vdyBwZXJmb3JtIHRhc2sgc3VmZml4XHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IgJiZcclxuICAgICAgICAgICAgKCF0aGlzLklzU3ViRm9ybSB8fCBzdWJmb3JtRGVzdGluYXRpb24pICYmXHJcbiAgICAgICAgICAgIHRoaXMuVGFza1ByZWZpeEV4ZWN1dGVkICYmICF0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5oYW5kbGVUYXNrU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIERvbid0IGZvcmdldCB0byBleGl0IGZyb20gYW55IHN1YlRhc2tzIG9wZW5lZCBkdXJpbmcgdGhlIGxhc3QgcmVjLXN1ZmZpeCBvciB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFzdWJUYXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZU5vblJldmVyc2libGVFdmVudChzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkb250IGNvbnRpbnVlIHdpdGggdGFzayBleGl0IGlmIGEgZGF0YSBlcnJvciBvY2N1cmVkIGR1cmluZyB0YXNrIHN1ZmZpeCAoZS5nLiByb2xsYmFjaygpKVxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KVxyXG4gICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcblxyXG4gICAgICAgICAgLy8gdGFzayBzdWZmaXggb25seSBzdG9wcyBleGVjdXRpb24gZm9yIGN1cnJlbnQgdGFzaywgd2hpY2ggaXMgYmVpbmcgY2xvc2VkXHJcbiAgICAgICAgICBpZiAocHJlVHNrU3VmZml4KVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQWJvcnRpbmcoKSAmJiBzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcykge1xyXG4gICAgICAgICAgICAvLyBUcnkgY2xvc2luZyBhbnkgdGFzayBsZXZlbCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChmYWxzZSwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfVEFTS19QUkVGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcikgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgYmFzZU1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGE7XHJcbiAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNsb3NpbmcgdGhlIHRvcG1vc3QgdGFzayAtIGRvbnQgbG9vc2UgYW55IGV2ZW50cywgbGVmdCBpbiB0aGUgcXVldWVcclxuICAgICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgYmFzZU1nZC5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoYmFzZU1nZCwgMCk7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBzdCA9IG5ldyBTZXNzaW9uU3RhdGlzdGljc0Zvcm0oKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0LldyaXRlVG9GbG93TW9uaXRvcigoRmxvd01vbml0b3JRdWV1ZSlfZmxvd01vbml0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL2Fib3J0aW5nIHRhc2sgY2xvc3VyZVxyXG4gICAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuRXhpdCh0aGlzLCByZXZlcnNpYmxlRXhpdCwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gV2hlbiBjbG9zaW5nIGEgdGFzayB3aG9zZSBwYXJlbnQgaXMgYSBtYWluIHByb2dyYW0sIGNoZWNrIHRoZSBtYWluIHByb2dyYW0ncyBlbmRcclxuICAgICAgICAgICAgICAvLyBjb25kaXRpb25cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haW5QcmdUYXNrOiBUYXNrID0gbWdkLmdldE1haW5Qcm9nKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RUYXNrOiBUYXNrID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kTWFpblByZzogYm9vbGVhbiA9IGF3YWl0IG1haW5QcmdUYXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBlbmQgdGhlIHJvb3QgdGFzayBpZiB3ZSBhcmUgYWxyZWFkeSBkb2luZyBpdC5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzICE9PSByb290VGFzayAmJiBlbmRNYWluUHJnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQocm9vdFRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLnJlbW92ZSg8TWdGb3JtPnRoaXMuRm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIGlmICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFjciAjOTE0NjQ1IDogcmV0dXJuIGZhbHNlIGluIGEgcmVjdXJzaXZlIGNhbGwuXHJcbiAgICAvLyBvdGhlcndpc2UgY29tbW9uSGFuZGxlckFmdGVyKGV2ZW50TWFuYWdlcikgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWYgdGhlIGNhbGwgaXMgcmVjdXJzaXZlbHkgbWFkZSBmcm9tIGhhbmRsZUV2ZW50LlxyXG4gICAgLy8gZm9yIGV4YW1wbGUgOiB0YXNrIGNvbmQgZnVsZmlsbGVkLiBoYW5kbGVJbnRlcm5hbEV2ZW50KHRoaXMsIE1HX0FDVF9SRUNfU1VGRklYKSBpcyBjYWxsZWQuXHJcbiAgICAvLyB3aGlsZSBpbiByZWMgc3VmIGhhbmRsZXIsIGVuZFRhc2sgaXMgY2FsbGVkIGFnYWluLi5pZiB3ZSByZXR1cm4gdHJ1ZSB0aGVuIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgaXMgbm90IGV4ZWN1dGVkLlxyXG4gICAgLy8gaWYgdGhlIHJlYyBzdWZmaXggaGFuZGxlciBkaWQgbm90IGV4aXN0LCB0aGVyZSB3aWxsIGJlIG5vIGNhbGwgdG8gZW5kVGFzayBhbmQgdGhlIGNvbW1vbkhhbmRsZXJBZnRlciB3aWxsIGJlIGV4ZWN1dGVkLlxyXG4gICAgLy8gVGhlIG5hbWUgJ3N1Y2NlZWRlZCcgaXMgYSBiaXQgbWlzbGVhZGluZy4uaXRzIG1vcmUgbGlrZSAnZXhlY3V0ZWQnLi5idXQgd2UgZGVjaWRlZCB0byBrZWVwIGl0LlxyXG4gICAgZWxzZSBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHJlc3RvcmUgdGhlIGZsYWcuXHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCk7XHJcblxyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCAodGFzayA6IFRhc2spIDogdm9pZFxyXG4gIHtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlIDxib29sZWFuPiB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggLyBNR19BQ1RfUkVDX1NVRkZJWCBoYW5kbGVyIGV4aXN0cz9cclxuICAgIHZhciBldnRIYW5Qb3MgPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGV2dEhhblBvcy5pbml0KHJ0RXZ0KTtcclxuICAgIGhhbmRsZXIgPSBldnRIYW5Qb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCkge1xyXG4gICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIGNyZWF0ZSBtb2RlIHRhc2suICBmb3JjZSByZWNvcmQgc3VmZml4IGlzIGNhbmNlbGxlZFxyXG5cclxuICAgICAgICBpZiAoZm9yY2VTdWZmaXggPT09IHRydWUpXHJcbiAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSB8fCAgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYW5kbGVyICE9IG51bGwgJiYgIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGNudCA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb3BlciA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0T3BlcmF0aW9uKGkpO1xyXG4gICAgICAgICAgaWYgKG9wZXIuZ2V0RXhlY09uQ2xpZW50KCkpIHtcclxuICAgICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3Blci5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVCl7XHJcbiAgICAgICAgICAgICAgaWYgKG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgICAgICBvcGVyLkdldFJ1bnRpbWVFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgdGFzay5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspIHtcclxuICAgICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyhzdWJUYXNrLCBldmVudENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNsaWVudE9wZXJhdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyh0YXNrIDogVGFzayk6IGJvb2xlYW5cclxuICB7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIHRhc2suaGFzU3ViVGFza3MoKSlcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7ICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlbmRpbmdUcmFuc2FjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5RGVzY3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBIYW5kbGVUcmFuc2FjdGlvbkluZm8oKTogdm9pZCB7XHJcbiAgICAvLyB3aGlsZSByZW1vdGUgdGFzayB3aXRob3V0IGxvY2FsIGRhdGEsIGhhcyBzdWJmb3JtIHRoYXQgaGFzIGxvY2FsIGRhdGEgOiBSZW1vdGUgdHJhbnNhY3Rpb24gaXMgc2V0IG9uIHRoZSBwYXJlbnQgdGFzayBhbmQgbG9jYWwgVHJhbnNhY3Rpb24gaXMgc2V0IG9uIHN1YmZvcm0uXHJcbiAgICAvLyBUaGUgbWVtYmVyIHRhc2suVHJhbnNhY3Rpb24gaXMgZ2V0IHRoZSBEYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIHN1YmZvcm0gOiAgdGhlIEN1cnJlbnREYXRhdmlld01hbmFnZXIgaXMgdGhlIGxvY2FsRGF0YXZpZXcgc28gdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBsb2NhbCB0cmFuc2FjdGlvbiB0aGF0IHRoZSBzdWJmb3JtIGlzIHRoZSBvd25lciBidXQgbm90IHRoZSBvd25lciBvZiB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBUaGUgbWV0aG9kIHNldFRyYW5zQ2xlYXJlZCgpIG5lZWQgdG8gYmUgY2FsbGVkIG9ubHkgZm9yIHJlbW90ZSB0cmFuc2FjdGlvbiB0aGF0IGlzIHRoZSBvd25lciB0YXNrIC4gKF90cmFuc0NsZWFyZWQgaXMgc2VuZCB0byB0aGUgc2VydmVyIClcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICBsZXQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uICE9PSBudWxsICYmIHRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykgJiYgdHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gJ1AnKSB7XHJcbiAgICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0VHJhbnNDbGVhcmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgZXhpdCBjb21tYW5kLCBhZGRzIGl0IHRvIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYW5kIGV4ZWN1dGUgaXQgaWYgaXQncyBuZWVkZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtRGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV4aXQocmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgcmVjb3JkIHN1ZmZpeCB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhpcyB0YXNrIGlzIG5vdCBhIHN1YiBmb3JtXHJcbiAgICAvLyB0aGVuIGVuZCB0aGUgdGFzayBhdCB0aGUgc2VydmVyIHNpZGVcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IHJldmVyc2libGVFeGl0ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZUJyb3dzZXJFc2NFdmVudENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbikgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBpZiAoIXN1YmZvcm1EZXN0aW5hdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIEJyb3dlckVzY0NvbW1hbmQgaW1tZWRpYXRlbHkgb25seSBpZlxyXG4gICAgICAgIC8vIDEuIElmIHdlIGFyZSB0cnlpbmcgdG8gY2xvc2UgdGhlIGJyb3dzZXIgYW5kIHRoZSB0b3Btb3N0IHRhc2sgaXMgY2xvc2luZ1xyXG4gICAgICAgIC8vIDIuIElmIHVzZXIgZXhwbGljaXRseSBjbG9zZXMgdGhlIGN1cnJlbnQgdGFzayAobGlrZSBjbG9zaW5nIG92ZXJsYXkpXHJcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBFeGl0KCkgY29tbWFuZHMsIGp1c3QgYWRkIHRoZSBCcm93c2VyRXNjQ29tbWFuZCB0byBDbWRzVG9TZXJ2ZXIuXHJcbiAgICAgICAgaWYodGhpcy5nZXRUYXNrVGFnKCkgPT0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSB8fFxyXG4gICAgICAgICAgICEoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkpXHJcbiAgICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyBvZiBNYWluIFByb2dyYW0gZGlkbid0IHN1Y2NlZWQgb24gc2VydmVyLCBjbG9zZSBpdCBoZXJlIC0tLSBvZmNvdXJzZSBpdFxyXG4gICAgICAgIC8vIGluY2x1ZGVzIHRoZSBleGVjdXRpb24gb2YgVFMgYXMgd2VsbC5cclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIGZpbmFsbHkgb3BlcmF0aW9uIG9mIGVuZFRhc2sgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldmVyc2libGVFeGl0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQ6IGJvb2xlYW4sIHJldmVyc2libGVFeGl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBzdWJUYXNrLmhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZCwgcmV2ZXJzaWJsZUV4aXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbkVuZFRhc2sgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXN1Y2NlZWRlZCAmJiByZXZlcnNpYmxlRXhpdCAmJiB0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBUYXNrIFByZWZpeCBleGVjdXRpb24gZm9yIGFsbCBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBoYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAod2l0aFN1YlRhc2tzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBzdWNjZWVkZWQgPSBhd2FpdCBzdWJUYXNrLmhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuICAgIHN1Y2NlZWRlZCA9ICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGlmIHRoZSB0YXNrIGludG8gY3JlYXRlIGxpbmUgcHJvY2Vzc2luZyBvciBub3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluQ3JlYXRlTGluZShpbkNyZWF0ZUxpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luQ3JlYXRlTGluZSA9IGluQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaWYgdGhlIHRhc2sgaXMgaW50byBDcmVhdGUgbGluZSBwcm9jZXNzaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJbkNyZWF0ZUxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYW4gaW50ZXJuYWwgZXZlbnQgb24gdGhpcyB0YXNrcyBzbGF2ZSB0YXNrcy4gU2xhdmUgdGFza3MgYXJlOiAoMSkgSWYgdGhpcyB0YXNrIGlzIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyAgIG93bmVyIC0gYWxsIHRhc2tzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHRyYW5zYWN0aW9ucyBhcmUgaXRzIHNsYXZlcy4gKDIpIElmIHRoaXMgdGFzayBpcyBub3QgYW4gb3duZXIgLVxyXG4gIC8vLyAgIGFsbCBpdHMgc3ViZm9ybXMgYXJlIGNvbnNpZGVyZWQgc2xhdmVzLiBpZiBvbmUgb2YgdGhlIHN1YiB0YXNrcyBmYWlsZWQgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZW4gYVxyXG4gIC8vLyAgIHJlZmVyZW5jZSB0byB0aGF0IHRhc2sgaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludGVybmFsRXZ0Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBpbnRlcm5hbCBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKGludGVybmFsRXZ0Q29kZTogbnVtYmVyKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGZhaWx1cmVUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyaWdnZXJlZFRhc2tzOiBMaXN0PFRhc2tCYXNlPiA9IG1nZFRhYi5nZXRUcmlnZ2VyZWRUYXNrcyh0aGlzKTtcclxuICAgIGxldCBvcnBoYW5zOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuICAgIGxldCBzYW1lVHJhbnM6IGJvb2xlYW47XHJcbiAgICBsZXQgaGFzU2xhdmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaXNPd25lcjogYm9vbGVhbiA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcyk7XHJcblxyXG4gICAgLy8gZXZlbnQgb24gdHJhbnMtb3duZXIgc2hvdWxkIGJlIHByb3BvZ2F0ZWQgdG8gYWxsIG90aGVyIHRhc2tzIGluIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uLlxyXG4gICAgaWYgKGlzT3duZXIpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0RXZlbnRTY29wZVRyYW5zKCk7XHJcbiAgICAgIG9ycGhhbnMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgICAgLy8gSW4gY2FzZSBhIGNoYW5nZSBvZiB0cmFucy1vd25lcnNoaXAgcHJldmlvdXNseSB0b29rIHBsYWNlLCB0aGVyZSBtaWdodCBiZSB0YXNrc1xyXG4gICAgICAvLyB3aGljaCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBidXQgdGhlaXIgcGFyZW50IGlzIGdvbmUuIFRoZXNlIGFyZSBvcnBoYW4gdGFza3NcclxuICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcHJvcG9nYXRlIHRoZSBldmVudCB0byB0aGVtIHRvby5cclxuICAgICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgICBzYW1lVHJhbnMgPSB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG4gICAgICAgIGlmICh0YXNrICE9PSB0aGlzICYmIHNhbWVUcmFucyAmJiB0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgIT0gbnVsbCAmJiBtZ2RUYWIuR2V0VGFza0J5SUQodGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSA9PSBudWxsKVxyXG4gICAgICAgICAgb3JwaGFucy5wdXNoKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNjb3BlVHJhbnM6IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5pc0V2ZW50U2NvcGVUcmFucygpO1xyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgYWNjb3JkaW5nIHRvIHRoZSBzY29wZSwgb24gYWxsIHRhc2tzIHRyaWdnZXJlZCBieSBtZVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWdnZXJlZFRhc2tzLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50cmlnZ2VyZWRUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc2FtZVRyYW5zID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcblxyXG4gICAgICBpZiAoIXRhc2suSXNTdWJGb3JtICYmIChzY29wZVRyYW5zICYmIHNhbWVUcmFucykgJiYgdGFzay5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IG9uIG9ycGhhbnMgdG9vLlxyXG4gICAgZm9yICg7IGlzT3duZXIgJiYgaSA8IG9ycGhhbnMubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IG9ycGhhbnMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzU2xhdmVzICYmIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGZhaWx1cmVUYXNrID0gdGFzaztcclxuXHJcbiAgICBpZiAoaXNPd25lcilcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2xlYXJFdmVudFNjb3BlKCk7XHJcblxyXG4gICAgcmV0dXJuIGZhaWx1cmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVSZWNvcmRBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSB8fCBkYXRhdmlldy5Jc09uZVdheUtleSkge1xyXG4gICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIGZhbHNlKTtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuSXNPbmVXYXlLZXkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkgfHwgKGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpID09PSAwKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICBpZiAoKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgfHwgZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHxcclxuICAgICAgICAgICgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKSAmJlxyXG4gICAgICAgICAgICAoIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93Q3JlYXRlSW5Nb2RpZnlNb2RlKHRoaXMuZ2V0Q29tcElkeCgpKSB8fFxyXG4gICAgICAgICAgICAgICFhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSkpICYmIChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgKyAxKSA9PT0gZGF0YXZpZXcuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICgoZGF0YXZpZXcuZ2V0U2l6ZSgpIC0gZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkpIDw9IHRoaXMuRm9ybS5nZXRSb3dzSW5QYWdlKCkpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgZmFsc2UpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT19QUk9HX0VYRV9SSUdIVFMsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBzdGFydGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTdGFydGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YiB0YXNrcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3ViVGFza3MoKTogVGFza3NUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrcyByZWZyZXNoZXMgb24gYSBjaGFuZ2Ugb2Ygb25lIG9mIGl0cyBwYXJlbnQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+dGhlIGlkIG9mIHRoZSBwYXJlbnQgZmllbGQ8L3BhcmFtPlxyXG4gIHJlZnJlc2hlc09uKGZsZElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyAhcmVzdWx0ICYmIHRoaXMuUmVmcmVzaE9uVmFycyAhPT0gbnVsbCAmJiBpIDwgdGhpcy5SZWZyZXNoT25WYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLlJlZnJlc2hPblZhcnNbaV0gPT09IGZsZElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIHRoaXMgdGFzayBmcm9tIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb25zIGFjY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQWJvcnRUcmFuc2FjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXggdG8gdmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRydWUgaWYgd2UgYWxyZWFkeSBwZXJmb3JtZWQgcmVjb3JkIHN1ZmZpeDwvcGFyYW0+XHJcbiAgc2V0UHJldmVudFJlY29yZFN1ZmZpeCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXggPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldFByZXZlbnRDb250cm9sQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNpZ25hbCB0aGUgc2VydmVyIGNsb3NlZCB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0S25vd25Ub1NlcnZlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2tub3duVG9TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCItXCI+ZXZhbHVhdGVzIHRoZSBkZXJjcmlwdG9yIGFuZCByZXR1cm4gdGhlIG5vbi1oYXZlIGR2UG9zIHZhbHVlPC9wYXJhbT5cclxuICBldmFsdWF0ZURlc2NyaXB0b3IoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRTtcclxuICAgIGlmICh0aGlzLkR2UG9zRGVzY3JpcHRvciA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHJlc3VsdCk7XHJcblxyXG4gICAgbGV0IGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBnbyBvdmVyIHRoZSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5EdlBvc0Rlc2NyaXB0b3IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFmaXJzdClcclxuICAgICAgICByZXN1bHQgKz0gXCI7XCI7XHJcblxyXG4gICAgICBsZXQgY3VycmVudENlbGw6IHN0cmluZ1tdID0gdGhpcy5EdlBvc0Rlc2NyaXB0b3IuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBwYXJzZSB0aGUgY3VycmVudCB0YXNrIGFuZCBmaWVsZCBudW1iZXJcclxuICAgICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IGN1cnJlbnRDZWxsWzBdO1xyXG4gICAgICBsZXQgY3VycmVudFZlZUlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjdXJyZW50Q2VsbFsxXSk7XHJcbiAgICAgIGxldCBjdXJyZW50VGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRUYXNrQnlJRChjdXJyZW50VGFnKTtcclxuICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IDxGaWVsZD5jdXJyZW50VGFzay5EYXRhVmlldy5nZXRGaWVsZChjdXJyZW50VmVlSWR4KTtcclxuICAgICAgbGV0IGRpc3BWYWw6IHN0cmluZyA9IGN1cnJlbnRGaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuXHJcbiAgICAgIC8vIFFDUiA5Nzg1NjZcclxuICAgICAgaWYgKGN1cnJlbnRGaWVsZC5pc051bGwoKSlcclxuICAgICAgICBkaXNwVmFsID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFFDUiA3NDMyOTBcclxuICAgICAgbGV0IHBpYzogUElDO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkpIHtcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAvLyBib29sZWFuIGlzIHN0b3JlZCBhcyBcIm9cIiBvciBcIjFcIiBzbyB3ZSBqdXN0IGFkZCB0aGVtIGFzIHdlXHJcbiAgICAgICAgLy8gZG8gaW4gdGhlIHNlcnZlclxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICByZXN1bHQgKz0gZGlzcFZhbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgIC8vIFFDUiA3NDI5NjYgZGF0ZSBhbmQgdGltZSBzcGVjaWFsIHRyZWF0bWVudFxyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnY6IERpc3BsYXlDb252ZXJ0b3IgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gY29udi5tZzJkaXNwKGRpc3BWYWwsIFwiXCIsIHBpYywgZmFsc2UsIHRoaXMuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAvLyBRQ1IgNTQzMjA0IHdoZW4gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nIChhbHBoYSlhcHBlbmQgbm90aGluZ1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcmVzID0gbmV3IE5VTV9UWVBFKGRpc3BWYWwpO1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gcmVzLnRvX2EocGljKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0bXBTdHIyOiBzdHJpbmcgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAocmVzdWx0LCA0KTtcclxuXHJcbiAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHRtcFN0cjIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyB0aGUgZHZQb3MgZGVzY3JpcHRvciB2ZWN0b3IgZWFjaCBvZiB0aGUgZHZQb3NEZXNjcmlwdG9yIHZlY3RvciBlbGVtZW50cyBpcyBhIFN0cmluZyBhcnJheSBvZiBzaXplXHJcbiAgLy8vICAgMiBpbiB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIGFycmF5IHdlIGhhdmUgdGhlIHRhZyBhbmQgaW4gdGhlIHNlY29uZCB3ZSBoYXZlIHRoZSB2ZWUgaWluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREZXNjcmlwdG9yKG5ld0Rlc2M6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCEobmV3RGVzYy50cmltKCkgPT09IFwiXCIpKSB7XHJcbiAgICAgIGxldCBkZXNjOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUobmV3RGVzYywgXCI7XCIpO1xyXG4gICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvciA9IG5ldyBMaXN0PHN0cmluZ1tdPigpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRlc2MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY2VsbDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigyKTtcclxuICAgICAgICBsZXQgdGFnVmVlUGFpcjogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGRlc2NbaV0sIFwiLFwiKTtcclxuICAgICAgICBjZWxsWzBdID0gdGFnVmVlUGFpclswXTtcclxuICAgICAgICBjZWxsWzFdID0gdGFnVmVlUGFpclsxXTtcclxuXHJcbiAgICAgICAgLy8gcHV0IHRoZSBjZWxsIHZhbHVlIGludG8gdGhlIHZlY3RvclxyXG4gICAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yLnB1c2goY2VsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrQ2FjaGUoKTogRHZDYWNoZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZDYWNoZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcmVwYXJlIGFsbCBzdWItZm9ybSB0cmVlJ3MgdG8gZWl0aGVyIGdvIHRvIHNlcnZlciAoYWZ0ZXIgZGVsZXRpbmcgcmVsZXZhbnQgZW50cmllcykgb3IgdG8gdGFrZSBkLnYgZnJvbVxyXG4gIC8vLyAgIGNhY2hlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIHN1YmZvcm0gY2FuIGRvIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBiZWNhdXNlIG9mIHVwZGF0ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgcHJlcGFyZUNhY2hlKGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjaGVja2luZyBteXNlbGYgaWYgaSBhbSBhIHN1YmZvcm1cclxuICAgIGlmICghaWdub3JlQ3Vycikge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgY3VycmVudCB1cGRhdGUgZGF0YXZpZXcgd2VyZSBwcmV2aW91c2x5IHRha2VuIGZyb20gY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBjaGVja3MgdGhhdCBpIGFtIGEgc3ViIGZvcm0gYnV0IGkgYW0gbm90IGNhY2hlZFxyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSAmJiAhIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZXRUYXNrOiBUYXNrO1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBteSBzdWIgZm9ybXNcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIG11c3QgcnVuIHRvIGl0cyBlbmQgc28gYWxsIHVwZGF0ZWQgZC52IHdpbGwgYmUgZGVsZXRlZFxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGN1cnJldFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgLy8gaWYgb25lIG9mIG15IHN1Yi1mb3JtcyBuZWVkcyB0byBnbyB0byB0aGUgc2VydmVyIC0gc28gZG8gaVxyXG4gICAgICAgIGlmICghIGF3YWl0IGN1cnJldFRhc2sucHJlcGFyZUNhY2hlKGZhbHNlKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHdlIGNhbiB0YWtlIHRoZSBkLnYgb2YgdGhlIHRhc2sgYW5kIGFsbCBoaXMgc3ViLWZvcm1zIGZyb20gY2FjaGUgaXMgd2UgY2FuIC0gdGFrZSB0aGVtIGFuZFxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBjdXJyZW50IGQudiBvZiBlYWNoIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgZC52J3Mgd2VyZSBmb3VuZCBhbmQgc2V0PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHRlc3RBbmRTZXQoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gY2hlY2sgY3VycmVudCB0YXNrXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIgJiYgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0ZWREdjogbnVtYmVyID0gdGhpcy5ldmFsdWF0ZURlc2NyaXB0b3IoKTtcclxuXHJcbiAgICAgIC8vIHRyeSB0byB0YWtlIGZyb20gY2FjaGUgb25seSBpZiByZXF1ZXN0ZWQgaXMgbm90IGN1cnJlbnRcclxuICAgICAgaWYgKHJlcXVlc3RlZER2ICE9PSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSkge1xyXG4gICAgICAgIGxldCBmcm9tQ2FjaGU6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldyhyZXF1ZXN0ZWREdik7XHJcbiAgICAgICAgaWYgKGZyb21DYWNoZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRHYoZnJvbUNhY2hlKTsgICAgIC8vIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggdGhlIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGRvIG5vdCBmb3JnZXQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBuZWVkcyB0byBiZSBpbnNlcnRlZCB0byB0aGUgY2FjaGVcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUUNSICM0MzAwNDUuIEluZGljYXRlIHRoYXQgUlAgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBnZXQgZnJvbSB0aGUgY2FjaGUuXHJcbiAgICAgIHRoaXMuRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBhbGwgc3ViLWZvcm1zIHRhc2tzZFxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgZG9lcyBub3QgbmVlZCB0byByZWFjaCBpdHMgZW5kXHJcbiAgICAgIC8vIHRoZSBtb21lbnQgb25lIHRoYXQgbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGlzIGRpc2NvdmVyZWQgYWxsIG5lZWQgdG8gZ28gYWxzb1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIC8vIGRvZXMgdGhlIGktdGggc29uIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpLnRlc3RBbmRTZXQoZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCBvbmUgdGFrZW4gZnJvbSBjYWNoZSBpbiB0aGlzIG1ldGhvZCB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB1cGRhdGVzXHJcbiAgLy8vICAgb2YgdGhlIGN1cnJlbnQgZGF0YXZpZXcgc2luY2UgdGhlIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBmcm9tIHRlc3RBbmRTZXQgdGhhdCBpbiB0dXJuIGlzIG9ubHkgdXNlZCBhZnRlclxyXG4gIC8vLyAgIGEgU3VjY2Vzc2Z1bCBydW4gcHJhcHJlQ2FjaGUgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGZvciB1cGRhdGVzIGluIHRoZSBjdXJyZW50IGRhdGF2aWV3IG9mXHJcbiAgLy8vICAgZWFjaCByZWxhdGVkIHRhc2suIGhvd2V2ZXIgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBjaGVjayBpdCBhbnl3YXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZnJvbUNhY2hlXCI+dGhlIG5ldyBkLnY8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlRHYoZnJvbUNhY2hlOiBEYXRhVmlldyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgLy8gdGhlIGRhdGEgdmlldyB3ZSByZWNlaXZlIGlzIENlcnRhaW5seSBmcm9tIHRoZSBjYWNoZVxyXG5cclxuICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgaWYgKCFkYXRhdmlldy5nZXRDaGFuZ2VkKCkgJiYgZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZShkYXRhdmlldy5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG5cclxuICAgIC8vIHNldCB0aGUgZGF0YSB2aWV3IGZyb20gdGhlIGNhY2hlIGFzIHRoZSBjdXJyZW50XHJcbiAgICBhd2FpdCBkYXRhdmlldy5zZXRTYW1lQXMoZnJvbUNhY2hlKTtcclxuICAgIGRhdGF2aWV3LnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICB0aGlzLkZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG5cclxuICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAvLyBRQ1IgOTI0ODA5NFxyXG4gICAgdGhpcy5zZXRPcmlnaW5hbFRhc2tNb2RlKHRoaXMuZ2V0TW9kZSgpKTtcclxuICB9XHJcblxyXG4gIHNldE9yaWdpbmFsVGFza01vZGUob3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlID0gb3JpZ2luYWxUYXNrTW9kZS5jaGFyQXQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBtb2RlIG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVGFza01vZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlzIENhY2hlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sIHRoaXMgdGFzayBDb3JyZWxhdGVzIHdpdGggdGhpcyBtZXRob2RcclxuICAvLy8gICBhY3R1YWxseSBjb21iaW5lcyB0d28gdGVzdCBmaXJzdCB0aGF0IHRoZSB0YXNrIGlzIGEgc3ViIGZvcm0gc2Vjb25kIHRoYXQgdGhlIHN1YiB0aGF0IHRoZSBzdWIgZm9ybSBoYXNcclxuICAvLy8gICB0aGUgaXMgY2FjaGVkIHByb3BlcnR5IHNldCB0byB5ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQ2FjaGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNTdWJGb3JtICYmIGF3YWl0ICg8TWdDb250cm9sQmFzZT50aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKSkuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvZXMgdGhlIGluc2VydCBpbiBjYWNoZSBsb2dpYyBpbiBjYXNlIHRoZSB0YXNrIGhhcyBsb2NhdGUgZXhwcmVzc2lvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbG9jYXRlUHV0SW5DYWNoZSgpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZWQ6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldygoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBkYXRhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlIGJlZm9yZVxyXG4gICAgaWYgKGNhY2hlZCAhPSBudWxsKSB7XHJcbiAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNoZWNrRmlyc3QoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpICYmICEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0TG9jYXRlRmlyc3RSZWMoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpO1xyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBwdXQgaXQgaW4gdGhlIGNhY2hlIGlmIGl0IGlzIG5vdCB1cGRhdGVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFzTG9jYXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhc0xvYWN0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0xvY2F0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcGVucyBhIG5ldyBUcmFuc2FjdGlvbiBvciBzZXQgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBUcmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRSZW1vdGVUcmFuc2FjdGlvbih0cmFuc0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyYW5zVGFzazogVGFzaztcclxuICAgIGxldCBpc0ZpbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgd2hpbGUgKCh0cmFuc1Rhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAvLyB0cmFuc2FjdGlvbiBtaWdodCBiZSBudWxsIHdoZW4gdGFzayBpcyBhYm9ydGluZyBidXQgbm90IHlldCB1bmxvYWRlZC5cclxuICAgICAgaWYgKHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uICE9IG51bGwgJiZcclxuICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRyYW5zSWQpIHtcclxuICAgICAgICBpc0ZpbmQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gKGlzRmluZCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc0lkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgbmV3IFRyYW5zYWN0aW9uIE93bmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc093bmVyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0T3duZXJUYXNrKHRoaXMpO1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRUcmFuc0JlZ2luKCdUJykvKidUJyovO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHRoZSB0b3Btb3N0IHZhbHVlIGluIHRoZSBzdGFjayBhbmQgdGhlIHN0YXR1cyBvZiB0aGVcclxuICAvLy8gICBcInVzZUxvb3BTdGFja1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExvb3BDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3VzZUxvb3BTdGFjayAmJiB0aGlzLl9sb29wU3RhY2sgIT09IG51bGwgJiYgISh0aGlzLl9sb29wU3RhY2suY291bnQoKSA9PT0gMCkpIHtcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucGVlaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgdGhlIHZhbHVlIDAgb24gdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZW50ZXJMb29wKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fbG9vcFN0YWNrID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fbG9vcFN0YWNrLnB1c2goMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdG9wbW9zdCBlbnRyeSBmcm9tIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsZWF2ZUxvb3AoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSlcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucG9wKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZXMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY3JlYXNlTG9vcENvdW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCh0aGlzLnBvcExvb3BDb3VudGVyKCkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcFN0YWNrU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvb3BTdGFjay5jb3VudCgpO1xyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwidXNlIGxvb3Agc3RhY2tcIiB2YXJpYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VXNlTG9vcFN0YWNrKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdXNlTG9vcFN0YWNrID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGlua3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVycygpOiBEYXRhdmlld0hlYWRlcnMge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UmVjb3JkQ3ljbGUoVmFsdWVfPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWNvcmRDeWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gVmFsdWVfO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSBpbnRlcm5hbCBuYW1lPC9zdW1tYXJ5PlxyXG4gIGdldFB1YmxpY05hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlB1YmxpY05hbWU7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIEFsbG93RXZlbnRzPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQWxsb3dFdmVudHMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUyk7XHJcbiAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgdGFzayBpZDwvc3VtbWFyeT5cclxuICBnZXRFeHRlcm5hbFRhc2tJZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEKTtcclxuXHJcbiAgICBpZiAocHJvcCAhPSBudWxsKVxyXG4gICAgICB0YXNrSWQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gdGFza0lkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgdGhpcyB0YXNrIG93bnMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RyYW5zYWN0aW9uT3duZXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcmFuc093bmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykpXHJcbiAgICAgIGlzVHJhbnNPd25lciA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIGlzVHJhbnNPd25lcjtcclxuICB9XHJcblxyXG4gIGlzVHJhbnNhY3Rpb25PbkxldmVsKGxldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzVHJhbnNhY3Rpb25Pd25lcigpICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHdoZXRoZXIgdGhlIHRhc2sgaXMgdGhlIFByb2dyYW0gKGkuZS4gbm90IGEgc3VidGFzaylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUHJvZ3JhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ByZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciB0YXNrIG1vZGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVNb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlksIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0UsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1JBTkdFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTE9DQVRFLCBlbmFibGUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSCwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JULCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NPUlRfUkVDT1JEUywgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVgsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklFV19CWV9LRVksIGVuYWJsZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFVNUF9FTlZJUk9OTUVOVCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGhhc1pvb21IYW5kbGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuYWJsZVpvb21IYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5hYmxlWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRFbmFibGVab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2s8L3JldHVybnM+XHJcbiAgaXNEZXN0aW5hdGlvblN1YmZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RpbmF0aW9uU3ViZm9ybVwiPjwvcGFyYW0+XHJcbiAgc2V0RGVzdGluYXRpb25TdWJmb3JtKGRlc3RpbmF0aW9uU3ViZm9ybTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtID0gZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBnZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZm9yIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0Rlc3RpbmF0aW9uQ2FsbFwiPjwvcGFyYW0+XHJcbiAgc2V0SXNEZXN0aW5hdGlvbkNhbGwoaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsID0gaXNEZXN0aW5hdGlvbkNhbGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBzZXRDYW5jZWxXYXNSYWlzZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYW5jZWxXYXNSYWlzZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjYW5jZWxXYXNSYWlzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsV2FzUmFpc2VkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQ3JlYXRlQWN0cyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUsIHZhbCk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSwgICh0aGlzLmdldEZvcm0oKS5IYXNUYWJsZSgpICkgPyB2YWwgOiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgb2YgY3JlYXRlIGFuZCBkZWxldGUgYWN0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBhc3luYyBzZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoISh0aGlzLkRhdGFWaWV3KS5pc0VtcHR5RGF0YXZpZXcoKSAmJiBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpICYmXHJcbiAgICAgIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgdHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpICYmXHJcbiAgICAgICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSAmJlxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiYgRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpKSB8fFxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSlcclxuICAgICAgdGhpcy5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbXB0eURhdGF2aWV3XCI+dGhlIGVtcHR5RGF0YXZpZXcgdG8gc2V0IDwvcGFyYW0+XHJcbiAgc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcoZW1wdHlEYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIHN0YXJ0cyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICBpZiAodGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSwgc28gZXhlY3V0ZSB0aGUgZW1wdHkgZGF0YXR2aWV3IGhhbmRsZXIsXHJcbiAgICAgIC8vIGlmIHRoZSB0YXNrIGlzIG5vdCBhIHN1YmZvcm0sIHB1dCB0aGUgZW1wdHkgZGF0YXZpZXcgZXZlbnQgb24gdGhlIHF1ZXVlXHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBydEV2bnQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgIGlmICgocnRFdm50ICE9IG51bGwgJiYgcnRFdm50LmdldEludGVybmFsQ29kZSgpID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHx8IHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0aGlzKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVyk7XHJcbiAgICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGZvciBzdWJmb3JtIG1vZGUgJ0FzUGFyZW50Jy4gSWYgdGhlIHBhcmVudCB0YXNrIHRoYXQgaW4gJ0VtcHR5IERhdGF2aWV3JyBzdGF0ZSBjaGFuZ2VzIGl0cyBtb2RlXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGFsc28gbXVzdCBjaGFuZ2UgbW9kZS5cclxuICAgICAgLy8gUUNSICMyODE4NjIuIElmIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkIGluIHRoZSBmaXJzdCB0aW1lIGRvIG5vdCByZWZyZXNoIGl0J3Mgc3ViZm9ybXMsXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhleSd2ZSByZWNlaXZlZCB0aGVpciBkYXRhdmlld3MgYWxyZWFkeS5cclxuICAgICAgLy8gV2UgbXVzdCByZWZyZXNoIHRoZW0gd2hlbiB0aGUgc3ViZm9ybSB0YXNrIHBhc3NlcyB0byBlbXB0eSBEVi5cclxuICAgICAgaWYgKHRoaXMuU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSAmJiBzdWJmb3JtUmVmcmVzaCAmJiBhd2FpdCB0aGlzLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpIHtcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIGVuZHMgaXRzIGV4ZWN1dGlvbiBpbiBFbXB0eSBEYXRhdmlldyBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbXB0eURhdGF2aWV3Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVywgZmFsc2UpO1xyXG4gICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2s6IFRhc2tCYXNlLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICBsZXQgaXNJbnNpZGU6IGJvb2xlYW4gPSBhd2FpdCAoPFRhc2s+c3ViZm9ybVRhc2spLkV4ZWN1dGVOZXN0ZWRSUyhjdXJyVGFzayk7XHJcblxyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIzQzNDQ2Ny4gRXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCBzdWJmb3JtIGlmIGl0J3MgdGhlIGN1cnJlbnQgKGxhc3QgZm9jdXNlZCkgdGFzay5cclxuICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgdHJ1ZSk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaXNJbnNpZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVmZWN0IDc3NDgzLiBEbyBub3QgY29udGludWUgaWYgdGhlIHJlY29yZCBzdWZmaXggZXhlY3V0aW9uIGlzIGZhaWxlZC5cclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNyZWF0ZSBjb21tYW5kIGZvciB0aGUgc2VydmVyXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1SZWZyZXNoQ29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoKTtcclxuICAgIGF3YWl0IHN1YmZvcm1UYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICBpZiAoc3ViZm9ybVRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgLy8gUUNSICM0MjkxMTIuIFB1c2ggZXhlY3V0aW9uIHN0YWNrIGJlZm9yZSBSUCBleGVjdXRpb24uXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgIzc3MDQ5LiBEbyBub3QgZXhlY3V0ZSBwYXJlbnQgUlAuIFdlIG5lZWQgaXQgb25seSB3aGVuIGNsaWNrIG9uIHN1YmZvcm13YXMgZG9uZS5cclxuICAgICAgbGV0IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc6IGJvb2xlYW4gPSAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSBwZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4T3JnO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBTdWJmb3JtUmVmcmVzaCBldmVudCB0byBpdHNlbGYgc28gdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgLy8gYXMgZm9yIFZpZXdSZWZyZXNoIGV2ZW50LlxyXG4gICAgaWYgKGlzSW5zaWRlKSB7XHJcbiAgICAgIC8vIERlZmVjdCAxMTU3OTMuIGN1cnJUYXNrIGNhbid0IGJlIG51bGwuXHJcbiAgICAgIC8vIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhc3ViZm9ybVRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSAmJiBjdXJyVGFzayAhPSBudWxsKVxyXG4gICAgICAvLyAgIGN1cnJUYXNrLm1vdmVUb0ZpcnN0Q3RybChmYWxzZSk7XHJcbiAgICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogSGFuZGxlIHRoaXMgc2l0dWF0aW9uXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+Y3VyclRhc2suRGF0YVZpZXcpLnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzdWJmb3JtVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZXMgUmVjb3JkIFN1ZmZpeGVzIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMgZnJvbSBib3R0b20gdG8gdG9wLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV4ZWN1dGVOZXN0ZWRSUyhsYXN0VGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGlzRXhlY3V0ZU5lc3RlZFJTOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUUNSICMxNjgzNDIuIEEgbmV3IHRhc2sgaXMgc2V0IGFzIGZvY3VzZWQgdGFzayBhZnRlciB0aGUgZmlyc3QgQ1AuXHJcbiAgICAvLyBTbyBpZiBpbiBDUCBVcGRhdGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGN1cnJUYXNrIGlzIG51bGwuIEJ1dCB3ZSBtdXN0IHJlZnJlc2ggdGhlIHN1YmZvcm0uXHJcbiAgICBpZiAobGFzdFRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG5cclxuICAgIC8vIERvIG5vdCBleGVjdXRlIHN1YmZvcm0gcmVmcmVzaCB3aGVuIHRoZSBmb2N1c2VkIHRhc2sgaXMgbm90IG9wZW5lZCBhcyBhIHN1YmZvcm0gKGl0IHdhcyBvcGVuZWQgZnJvbSBjYWxsIG9wZXJhdGlvbiksXHJcbiAgICAvLyBidXQgdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzdWJmb3JtIHRhc2suIFNlZSBmb3IgZXhhbXBsZSBRQ1IgIzQzMTg1MC5cclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgbGFzdFRhc2suZ2V0TWdkSUQoKSAhPT0gdGhpcy5nZXRNZ2RJRCgpKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogVGFzayA9IGxhc3RUYXNrOyB0YXNrICE9PSB0aGlzICYmIHRhc2sucGF0aENvbnRhaW5zKHRoaXMpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSzsgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0V4ZWN1dGVOZXN0ZWRSUyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFJlYyBzdWZmaXggZm9yIGFsbCBuZXN0ZWQgc3ViZm9ybXMgdW50aWxsIHN1YmZvcm0gdGFzayB0aGF0IGNvbnRhaW5zIHRoZXNlIDIgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBleGVjU3ViZm9ybVJlY1N1ZmZpeChuZXdUYXNrOiBUYXNrKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBzdWJmVGFzazogVGFzaztcclxuICAgIGxldCBpOiBudW1iZXIsIGlkeCA9IDA7XHJcbiAgICBmb3IgKGkgPSB0aGlzLl90YXNrUGF0aC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgc3ViZlRhc2sgPSB0aGlzLl90YXNrUGF0aC5nZXRfSXRlbShpIC0gMSk7XHJcbiAgICAgIGlmICghbmV3VGFzay5fdGFza1BhdGguQ29udGFpbnMoc3ViZlRhc2spKSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBDcmVhdGUgbW9kZSB0byBNb2RpZnkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgLy8gU28gdGhlIG1vZGUgaXMgY2hhbmdlZCBvbmx5IGZvciB0aGUgZmlyc3QgcmVjb3JkIHRoYXQgd2FzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgIGlmIChzdWJmVGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICEoKDxEYXRhVmlldz5zdWJmVGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5pc05ld1JlYygpKVxyXG4gICAgICAgICAgc3ViZlRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWR4ID0gbmV3VGFzay5fdGFza1BhdGguaW5kZXhPZihzdWJmVGFzayk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIERlYnVnLkFzc2VydChpID4gMCk7XHJcbiAgICByZXR1cm4gaWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY291bnRlciBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgZ2V0Q291bnRlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2UgdGhlIHRhc2tzIGNvdW50ZXIgYnkgMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5jb3VudGVyPC9yZXR1cm5zPlxyXG4gIGluY3JlYXNlQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLl9jb3VudGVyICsgMTtcclxuICB9XHJcblxyXG4gIHNldENvdW50ZXIoY250OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSBjbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgISFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID09PSBUYXNrLlN0YXJ0UHJvZ0xldmVsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVjayBpZiByZWZlcmVuY2UgdG8gbWFpbiBwcm9ncmFtIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpZWxkU3RyXCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc01haW5Qcm9ncmFtRmllbGQoZmllbGRTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IEZpZWxkOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKGZpZWxkU3RyLCAnLCcpO1xyXG4gICAgbGV0IG1haW5Qcm9nRmllbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoRmllbGQubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoRmllbGQuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpXHJcbiAgICAgICAgbWFpblByb2dGaWVsZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Qcm9nRmllbGQ7XHJcbiAgfVxyXG5cclxuICBnZXRUYXNrSW5mbygpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSB0YXNrIG5hbWUgdXNpbmcgdGhlIGdldFByb3AoKSBhcyBuYW1lIGlzIG9ubHkgc2VyaWFsaXplZCBmb3IgZGVidWdcclxuICAgIGxldCB0YXNrTmFtZTogc3RyaW5nID0gKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KCd7MH0gezF9Jyx0aGlzLmlzUHJvZ3JhbSgpID8gJ1Byb2dyYW0nOiAnU3VidGFzaycsIHRhc2tOYW1lKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIodGFzayB7MH0tXFxcInsxfVxcXCJ7Mn0pXCIsIHRoaXMuX3Rhc2tUYWcsIHRoaXMuTmFtZSwgc3VwZXIuaXNNYWluUHJvZygpID8gKFwiIGN0bCBcIiArIHRoaXMuX2N0bElkeCkgOiBcIlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbnN0cnVjdE1nRm9ybShhbHJlYWR5U2V0UGFyZW50Rm9ybTogUmVmUGFyYW08Ym9vbGVhbj4pOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSBuZXcgTWdGb3JtKCk7XHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLlBhcmVudFRhc2sgIT0gbnVsbCA/IHRoaXMuUGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsKTtcclxuXHJcbiAgICAvLyBQYXJlbnRGb3JtIG9mIGFueSBmb3JtIHNob3VsZCBiZSBhIHZpc2libGUgb25lLiBJdCBtaWdodCBoYXBwZW4gdGhhdCB0aGUgUGFyZW50VGFza1xyXG4gICAgLy8gaXMgYSBub24taW50ZXJhY3RpdmUgdGFzayB3aXRoIE9wZW5XaW5kb3c9Tm8uIEluIHRoaXMgY2FzZSwgdGhlIFBhcmVudCBvZiB0aGUgbm9uLWludGVyYWN0aXZlXHJcbiAgICAvLyB0YXNrLCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBmb3JtLlxyXG4gICAgd2hpbGUgKHBhcmVudEZvcm0gIT0gbnVsbCAmJiAhcGFyZW50Rm9ybS5nZXRUYXNrKCkuaXNPcGVuV2luKCkpIHtcclxuICAgICAgcGFyZW50Rm9ybSA9IHBhcmVudEZvcm0uUGFyZW50Rm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtLlBhcmVudEZvcm0gPSBwYXJlbnRGb3JtO1xyXG4gICAgYWxyZWFkeVNldFBhcmVudEZvcm0udmFsdWUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbWdkYXRhIElEIHRvIHdoaWNoIHRhc2sgYmVsb25nc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TWdkSUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGEuR2V0SWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmVmZXJlbmNlIHRvIGN1cnJlbnQgTUdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNR0RhdGEoKTogTUdEYXRhIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlZnJlc2ggdGhlIGRpc3BsYXksIHBhaW50IHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllcyBhZ2FpbiA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiB0aGlzLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgdGFzay5SZWZyZXNoRGlzcGxheSgpXCIpO1xyXG5cclxuICAgICAgLy8gcmVjb3JkcyBmcm9tIHRoZSBEYXRhVmlldyBhbmQgcmVmcmVzaGVzIHRoZSByb3dzLlxyXG4gICAgICAvLyBOb3csIFRhc2suUmVmcmVzaERpc3BsYXkoKSBpcyBjYWxsZWQgZnJvbSAyIHBsYWNlczpcclxuICAgICAgLy8gMS4gd2hpbGUgaW5pdGluZyB0aGUgZm9ybVxyXG4gICAgICAvLyAyLiB3aGVuIGNvbWluZyBiYWNrIGZyb20gc2VydmVyXHJcbiAgICAgIC8vIEluIGNhc2UgIzEsIHdlIGRvIG5vdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlIGFzIGl0IGlzIGRvbmUgZnJvbSBmaXJzdFRhYmxlUmVmcmVzaCgpLlxyXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNhbiBiZSBlbGltaW5hdGVkLlxyXG4gICAgICBpZiAodGhpcy5fcmVmcmVzaFR5cGUgIT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSkge1xyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuRm9ybTtcclxuICAgICAgICBsZXQgd2FzUmVmcmVzaGVkOiBib29sZWFuID0gYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIGlmICh3YXNSZWZyZXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICB2YWx1ZS52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmdldFZhbHVlKGZhbHNlKTtcclxuICAvLyAgIGlzTnVsbC52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmlzTnVsbCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogdm9pZCB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9ICg8RmllbGQ+ZmllbGREZWYpLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgaXNOdWxsLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5UYXNrUHJlZml4RXhlY3V0ZWQpIHtcclxuICAgICAgYXdhaXQgKDxGaWVsZD5maWVsZERlZikuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWx1ZSwgaXNOdWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgYSByaWNoY2xpZW50IHRhc2tzLCBjaGVjayBpZiBOb24tSW50ZXJhY3RpdmUgdGFzayBjaGlsZCBzaG91bGQgYmUgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZTwvcmV0dXJucz5cclxuICBTaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlNob3VsZENoaWxkQmVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayBpZiBhIHRhc2tzIGNoaWxkIHNob3VsZCBiZSBtb2RhbFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZENoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyB3aW5kb3cgaXMgb3BlbmVkIGFuZCBvZiBtb2RhbCB0eXBlIChkb2Vzbid0IG1hdHRlciBpZiBpbnRlcmFjdGl2ZSBvciBub3QpXHJcbiAgICBpZiAoKHRoaXMuRm9ybS5Db25jcmV0ZVdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSkgJiYgdGhpcy5nZXRGb3JtKCkuT3BlbmVkKVxyXG4gICAgICBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGFyZW50IHRhc2sgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnQoKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgdGFzayBpcyB0aGUgY2hlY2tlZCB0YXNrIG9yIGEgZGVzY2VuZGFudCBvZiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEZXNjZW5kZW50T2YoY2hrVGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIGlmIChjaGtUYXNrID09PSB0aGlzKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGNoa1Rhc2sgPT09IG51bGwgfHwgdGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrLmlzRGVzY2VuZGVudE9mKGNoa1Rhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc3ViZm9ybUN0cmwgd2hpY2ggaXMgTW9kYWwgaW4gY3VycmVudCBydW50aW1lIHRyZWUgaWYgdGhlcmUgaXMgYW55Py5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBHZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKGN1cnJUYXNrLl9wYXJlbnRUYXNrICE9IG51bGwgJiYgY3VyclRhc2suX3BhcmVudFRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+KGN1cnJUYXNrLl9wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKTtcclxuICAgICAgaWYgKHN1YmZvcm1DdHJsLklzTW9kYWwoKSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBzdWJmb3JtQ3RybDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFzayA9IGN1cnJUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBmb3IgcmVtb3RlIHRhc2sgZm9yIGV4cHJlc3Npb24gdGhhdCB3YXMgY29tcHV0ZWQgb25jZSBvbiBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlRhc2tTZXJ2aWNlLlNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHByb3BJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgbWV0aG9kIHJ1bnMgYWN0aW9ucyBhZnRlciB0aGUgJ2Zvcm0nIHRhZyBpcyBoYW5kbGVkLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgRW5zdXJlVmFsaWRGb3JtKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kOlxyXG4gICAgLy8gSWYgdGhpcyB0YXNrIGlzIHRoZSBtYWluIHByb2dyYW0gYW5kIF9vcGVuV2luIGV2YWx1YXRlcyB0byAnZmFsc2UnLCB0aGVuXHJcbiAgICAvLyBwcmV2ZW50IHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBieSBzZXR0aW5nIGl0IHRvICdudWxsJy5cclxuICAgIGlmICh0aGlzLl9pc01haW5QcmcgJiYgdGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fb3BlbldpbiB8fCAhdGhpcy5Gb3JtLmlzTGVnYWxGb3JtKSB7ICAgLy8gVGhpcyBjYW4gYmUgbWRpIGZyYW1lXHJcbiAgICAgICAgdGhpcy5Gb3JtID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIHRoZSBtYWluIGRpc3BsYXkgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDb21wdXRlTWFpbkRpc3BsYXkoKTpQcm9taXNlPHZvaWQ+ICB7XHJcbiAgICBsZXQgcHJvcE1haW5EaXNwbGF5OiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVkpO1xyXG4gICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBtYWluIGRpc3BsYXlcclxuICAgIGxldCBtYWluRGlzcGxheUluZGV4OiBudW1iZXIgPSBhd2FpdCBwcm9wTWFpbkRpc3BsYXkuZ2V0VmFsdWVJbnQoKTtcclxuXHJcbiAgICBtYWluRGlzcGxheUluZGV4ID0gdGhpcy5HZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uQ3VycmVudFRhc2sobWFpbkRpc3BsYXlJbmRleCk7XHJcblxyXG4gICAgdGhpcy5fZm9ybXMuSW5pdEZvcm1Gcm9tWG1sU3RyaW5nKG1haW5EaXNwbGF5SW5kZXgpO1xyXG4gICAgdGhpcy5FbnN1cmVWYWxpZEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcHJlcGFyZSB0YXNrIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFByZXBhcmVUYXNrRm9ybSgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLlByZXBhcmVQcm9wT3BlblRhc2tXaW5kb3codGhpcyk7XHJcbiAgICByZXR1cm4gYXdhaXQgUmVtb3RlVGFza1NlcnZpY2UuUHJlcGFyZVByb3BNYWluRGlzcGxheSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRydWUgaWYgZm9ybSBpcyBsZWdhbFxyXG4gIC8vLyB3ZSBhcmUgbm90IGdldCB0byB0aGF0IG1ldGhvZCBmb3IgbWFpbiBkaXNwbGF5IHRoYXQgb3BlbiB3aW5kb3cgaXMgZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgRm9ybUlzTGVnYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNGb3JtSXNMZWdhbDogYm9vbGVhbiA9IHN1cGVyLmlzTWFpblByb2coKTtcclxuICAgIHJldHVybiBpc0Zvcm1Jc0xlZ2FsIHx8IHN1cGVyLmdldEZvcm0oKS5pc0xlZ2FsRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBtYWluIGRpc3BsYXkgb24gc3R1ZGlvIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYWluRHNwSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlYWxNYWluRGlzcGxheUluZGV4T25EZXB0aChtYWluRHNwSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG5cclxuICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgbWFpbkRzcElkeCArPSB0YXNrLl9mb3Jtcy5Db3VudDtcclxuICAgICAgdGFzayA9IHRhc2suTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uQ3VycmVudFRhc2sobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChtYWluRHNwSWR4ID4gMSkge1xyXG5cclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG5cclxuICAgICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICAgIG1haW5Ec3BJZHggLT0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgICAgdGFzayA9IHRhc2suTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpbkRzcElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IEFuY2VzdG9yIHRhc2sgKG9uIHJ1bnRpbWUgdHJlZSkgb2YgdGhlIHNlbmQgdGFzayBkZWZpbml0aW9uIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaW5kVGFza0RlZmluaXRpb25JZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRBbmNlc3RvclRhc2tCeVRhc2tEZWZpbml0aW9uSWQoZmluZFRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQpOiBUYXNrIHtcclxuICAgIGxldCBjdXJyZW50VGFzazogVGFzayA9IHRoaXM7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnICM6MTcyOTU5XHJcbiAgICAvLyBpZiB0aGUgZmluZFRhc2tEZWZpbml0aW9uSWQgaXMgbWFpbiBwcm9ncmFtIChjYW4gYmUgb2YgY29tcG9uZW50KSB3ZSB3aWxsIG5vdCBmb3VuZCBpdCBpbiB0aGUgX3BhcmVudFRhc2tcclxuICAgIC8vIHNvIHdlIHdpbGwgdGFrZSB0aGUgdGFzayBmcm9tIHRoZSBNR0RhdGFUYWJsZVxyXG4gICAgaWYgKGZpbmRUYXNrRGVmaW5pdGlvbklkLklzTWFpblByb2dyYW0oKSlcclxuICAgICAgcmV0dXJuIDxUYXNrPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgodGhpcy5Db250ZXh0SUQsIGZpbmRUYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4KTtcclxuXHJcbiAgICB3aGlsZSAoY3VycmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoY3VycmVudFRhc2suVGFza0RlZmluaXRpb25JZC5FcXVhbHMoZmluZFRhc2tEZWZpbml0aW9uSWQpKVxyXG4gICAgICAgIHJldHVybiBjdXJyZW50VGFzaztcclxuXHJcbiAgICAgIGN1cnJlbnRUYXNrID0gY3VycmVudFRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBTZXREYXRhQ29udHJvbFZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQ6IG51bWJlciwgZGNWYWx1ZXNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHN1cGVyLmdldEZvcm0oKS5nZXRDdHJsKGNvbnRyb2xJZCk7XHJcbiAgICBjdHJsLnNldERjVmFsSWQoZGNWYWx1ZXNJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRpc3BsYXkgdGVzdCBvbiBzdGF0dXMgYmFyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBEaXNwbGF5TWVzc2FnZVRvU3RhdHVzQmFyKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gUWNyICM3OTgzMTEuIGlmIHNlcnZlciBzaWRlIGhhZCBNUCBkb2luZyB2ZXJpZnkgdG8gcGFuZSBhbmQgTVAgaGFzIG5vIGZvcm1cclxuICAgIC8vIHdlIHdpbGwgZ2V0IGFuIGV4Y2VwdGlvbi4gc28gaW4gY2FzZSBvZiBubyBmb3JtLCBnZXQgaXQgZnJvbSBsYXN0IGZvY3VzZWQgdGFzay5cclxuICAgIGxldCB0YXNrVG9WZXJpZnlPbjogVGFzayA9IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCk7XHJcbiAgICBpZiAodGFza1RvVmVyaWZ5T24uZ2V0Rm9ybSgpID09IG51bGwpXHJcbiAgICAgIHRhc2tUb1ZlcmlmeU9uID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuICAgIHRhc2tUb1ZlcmlmeU9uLldyaXRlVG9NZXNzYWdlUGFuZSh0ZXh0KTtcclxuICB9XHJcblxyXG5cclxuICBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhciA9ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcblxyXG4gICAgcmV0dXJuIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyO1xyXG4gIH1cclxuXHJcbiAgR2V0VGFza0RldGFpbHMoKTogc3RyaW5nIHtcclxuICAgIGxldCBuYW1lcyA9ICAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAodGFzay5QYXJlbnRUYXNrICE9PSBudWxsICYmICF0YXNrLlBhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50YXNrLlBhcmVudFRhc2s7XHJcbiAgICAgIG5hbWVzID0gICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArIFwiLlwiICsgbmFtZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5hbWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcGFyc2VzIHRoZSB0YXNrVVJMIHRhZ1xyXG4gIC8vLyBldmVyeSB0YXNrVVJMIHRhZyBpcyByZXBsYWNlZCBieSB0aGUgZGF0YSBvZiB0aGUgeG1sIGlzbGFuZCBpdCByZWZlcnMgdG88L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIFByb2Nlc3NUYXNrVVJMKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHhtbERhdGE6IHN0cmluZyA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1MZGF0YSgpO1xyXG4gICAgbGV0IGVuZFRhc2tVcmxJZHg6IG51bWJlciA9IHhtbERhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIERlYnVnLkFzc2VydChlbmRUYXNrVXJsSWR4ICE9PSAtMSAmJiBlbmRUYXNrVXJsSWR4IDwgeG1sRGF0YS5sZW5ndGgpO1xyXG5cclxuICAgIC8vIGV4dHJhY3QgdGhlIHRhc2sgdXJsIGFuZCB0aGUgcmVmIGxpc3RcclxuICAgIGxldCB0YWc6IHN0cmluZyA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZFRhc2tVcmxJZHgpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCk7XHJcblxyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgIGxldCB0YXNrQ2FjaGVVUkw6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbSgxKTtcclxuICAgIGxldCByZWZMaXN0U3RyOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMyk7XHJcblxyXG4gICAgbGV0IHRhc2tDb250ZW50T3JpZ2luYWw6IHN0cmluZyA9IFwiXCI7IC8vIGRhdGEgb2YgdGhlIHRhc2sgcmVhZCBmcm9tIHRhc2tDYWNoZVVSTFxyXG5cclxuICAgIGlmKHRhc2tDYWNoZVVSTC50cmltKCkgIT0gXCJcIikge1xyXG4gICAgICAvLyBicmluZyB0aGUgZGF0YVxyXG5cclxuICAgICAgaWYodGFza0NhY2hlVVJMLnN0YXJ0c1dpdGgoXCIuL1wiKSlcclxuICAgICAgIHRhc2tDYWNoZVVSTD0gTlN0cmluZy5SZXBsYWNlKHRhc2tDYWNoZVVSTCwgJy4vJywgJy4vYXNzZXRzL2NhY2hlLycpO1xyXG5cclxuICAgICAgdGFza0NvbnRlbnRPcmlnaW5hbCA9IGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuR2V0Q29udGVudCh0YXNrQ2FjaGVVUkwsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZWZpeCB0aGUgb3JpZ2luYWwgZGF0YSB0aWxsIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCA8dGFza1VSTD5cclxuICAgIGxldCB0YXNrQ29udGVudEZpbmFsOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoeG1sRGF0YS5zdWJzdHIoMCwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSAtIChDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGggKyAxKSksIHRhc2tDb250ZW50T3JpZ2luYWwubGVuZ3RoKTtcclxuICAgIC8vIHRoZSBudW1iZXIgb2YgdG9rZW5zIGluIHJlZkxpc3QgYW5kIHRoZSBudW1iZXIgb2YgbG9jYXRpb24gaW4gdGhlIHhtbCB0byBiZSByZXBsYWNlZCAoaS5lLiB0aGUgcGxhY2VzIHdpdGggWzopIHNob3VsZCBiZSBlcXVhbFxyXG4gICAgbGV0IHJlZmxpc3Q6IExpc3Q8c3RyaW5nPiA9IHRoaXMuZ2V0UmVmbGlzdChyZWZMaXN0U3RyLCAnOycsIHRydWUsIC0xKTtcclxuICAgIGxldCByZWZMaXN0SWR4ID0gMDtcclxuXHJcbiAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIik7XHJcbiAgICBsZXQgcHJldklkeDogbnVtYmVyID0gMDtcclxuICAgIHdoaWxlIChjdXJySWR4ICE9PSAtMSkge1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4LCBjdXJySWR4IC0gcHJldklkeCkpO1xyXG4gICAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZChyZWZsaXN0LmdldF9JdGVtKHJlZkxpc3RJZHgrKykpO1xyXG4gICAgICBjdXJySWR4ICs9IDI7XHJcbiAgICAgIHByZXZJZHggPSBjdXJySWR4O1xyXG4gICAgICBjdXJySWR4ID0gdGFza0NvbnRlbnRPcmlnaW5hbC5pbmRleE9mKFwiWzpcIiwgcHJldklkeCk7XHJcbiAgICB9XHJcbiAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh0YXNrQ29udGVudE9yaWdpbmFsLnN1YnN0cihwcmV2SWR4KSk7XHJcblxyXG4gICAgLy8gc3VmZml4IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCB4bWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IDwvdGFza1VSTD5cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHhtbERhdGEuc3Vic3RyKHhtbERhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRUYXNrVXJsSWR4ICsgMSkgKyAxKSk7XHJcbiAgICB4bWxEYXRhID0gdGFza0NvbnRlbnRGaW5hbC5Ub1N0cmluZygpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC0tLS0tLS0+IHsxfVwiLCB0YXNrQ2FjaGVVUkwsIHhtbERhdGEpKTtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldFhNTGRhdGEoeG1sRGF0YSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcGFyc2VzIHRoZSBkYXRhIGFjb3JkaW5nIHRvIHRoZSBkZWxpbWV0ZXIgYW5kIHRoZSByZWZsaXN0IGRlbGltZXRlcnMgbG9naWM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRydW5jXCI+aWYgdHJ1ZSB0cnVjYXRlIGZpcnN0ICdcXFxcJyAoaW4gdXNlIGZvciBpc2xhbmQgZGF0YSBwYXJzaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhUb2tlbnNcIj5pZiAtMSBhbGwgdG9rZW5zIGF2aWFsYWJsZSBlbHNlIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRvIHNlYXJjaDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVmbGlzdChkYXRhOiBzdHJpbmcsIGRlbGltOiBzdHJpbmcsIHRydW5jOiBib29sZWFuLCBtYXhUb2tlbnM6IG51bWJlcik6IExpc3Q8c3RyaW5nPiB7XHJcbiAgICBsZXQgY3VyclN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgbGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRva2Vuc0NudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzaW5jZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGFsd2F5cyAnOycgd2Ugc3RhcnQgZnJvbSAxXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY3Vycjogc3RyaW5nID0gZGF0YS5jaGFyQXQoaSk7XHJcblxyXG4gICAgICBpZiAoY3VyciAhPT0gJ1xcXFwnICYmIGN1cnIgIT09IGRlbGltKVxyXG4gICAgICAgIGN1cnJTdHIuQXBwZW5kKGN1cnIpO1xyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSBkZWxpbSkge1xyXG4gICAgICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGN1cnJTdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHRva2Vuc0NudCsrO1xyXG5cclxuICAgICAgICBpZiAodG9rZW5zQ250ID09PSBtYXhUb2tlbnMpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyID09PSAnXFxcXCcpIHtcclxuICAgICAgICAvLyB0aGUgZm9ybWF0ICdcXFxcZGVsaW1pdGVyJyBpcyBhbHdheXMgdHJ1bmNhdGVkXHJcbiAgICAgICAgaWYgKCF0cnVuYyAmJiBkYXRhLmNoYXJBdChpICsgMSkgIT09IGRlbGltKVxyXG4gICAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG5cclxuICAgICAgICBpKys7XHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoZGF0YS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXBwZW5kIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHJlZiBsaXN0XHJcbiAgICBsaXN0LnB1c2goY3VyclN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBhbmQgc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIFN0YXJ0UHJvZ3JhbShjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgb3JnU3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBhbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRBbGxvd0V2ZW50cygpO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoRXZlbnRzQWxsb3dlZFR5cGUuQUxMKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbCsrO1xyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7IC8vIFFDUiAjNzY5NzM0IC0gbm90aGluZyBjYW4gc3RvcCBhIHRhc2sgZnJvbSBzdGFydGluZyB1cC5cclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzI4MzY0NyBleGVjdXRlIGNvbXBvbmVudHMgbWFpbiBwcm9ncmFtcyAtICBpbiB0aGUgc2VydmVyIHdlIGV4ZWN1dGUgdGhlIHNhbWUgc2VlIGluaS5jcHAgbWV0aG9kIGV4ZWN1dGVfbWFpbl9wcm9ncygpXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBhd2FpdCB0aGlzLkV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgLy8gZXhlY3V0ZSBpbnRlcm5hbCBtYWluIHByb2dyYW1zXHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQpO1xyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oMCwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrUmVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkID0gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkUmVmLnZhbHVlO1xyXG5cclxuICAgIGlmICghVGFzay5faWRsZVRpbWVyU3RhcnRlZCkge1xyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLnN0YXJ0VGltZXIoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0SWRsZVRpbWUoMCksIHRydWUpO1xyXG4gICAgICBUYXNrLl9pZGxlVGltZXJTdGFydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLk9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICBhd2FpdCB0aGlzLkRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5Nb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuXHJcblxyXG4gICAgLy8gSGFuZGxlIHRoZSBldmVudHMgb25seSB3aGVuIGFsbCB0aGUgdGFza3MgYW5kIHRoZWlyIGZvcm1zIGFyZSBvcGVuZWQuXHJcbiAgICBpZiAoVGFzay5TdGFydFByb2dMZXZlbCA9PT0gMSkge1xyXG4gICAgICBsZXQgcmVzZXRBbGxvd0V2ZW50czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgY2FuRXhlY3V0ZUV2ZW50czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAvLyBzZXQgdGhlIHdpdGhpbiBub24gaW50ZXJhY3RpdmUgc2luY2UgdGhlIGhhbmRsZUV2ZW50cyBtaWdodCB0cnkgdG8gZXhlY3V0ZSBhbiBldmVudFxyXG4gICAgICAvLyB0aGF0IHdhcyByYWlzZWQgaW4gdGhlIDFzdCByZWMgcHJlZiAoYWRkZWQgaW4gbW92ZVRvRmlyc3Rjb250cm9scykuXHJcbiAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgIT09IG51bGwgJiYgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgcmVzZXRBbGxvd0V2ZW50cyA9IHRydWU7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlIHRhc2sgd2l0aCBhbGxvdyBldmVudHMgPSBOTyBpcyBhYm91dCB0byBydW4uXHJcbiAgICAgICAgLy8gZG9uJ3QgdHJ5IHRvIGV4ZWN1dGUgdGhlIGV2ZW50cyBiZWZvcmUgaXQgc3RhcnRzIGJlY2F1c2UgdGhleSB3aWxsIGJlIGxvc3QuICgjMTM4NDkzKVxyXG4gICAgICAgIGNhbkV4ZWN1dGVFdmVudHMgPSBhd2FpdCAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzQWxsb3dFdmVudHMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIGl0IGlzIGEgc3ViZm9ybSB3aXRoIHZpc2liaWxpdHkgZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gVFJVRSxcclxuICAgICAgLy8gc28gYWZ0ZXIgcmV0dXJuIGZyb20gdGhlIHNlcnZlciBkbyBub3QgZXhlY3V0ZSBldmVudHMgZnJvbSB0aGUgcXVldWUuXHJcbiAgICAgIC8vIFRoZXNlIGV2ZW50cyB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gdGhlICdzdGFydFByb2cnIG9mIHRoZSBwYXJlbnQgdGFzay5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSAhPT0gbnVsbCAmJiBjYW5FeGVjdXRlRXZlbnRzKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKSwgMCk7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXN0b3JlLiBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuIGl0IHdpbGwgYmUgc2V0IGFnYWluIG9uY2UgaW4gdGhlIGNvcnJlY3QgZXZlbnRzTG9vcC5cclxuICAgICAgaWYgKHJlc2V0QWxsb3dFdmVudHMpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0QWxsb3dFdmVudHMoYWxsb3dFdmVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIFRhc2suU3RhcnRQcm9nTGV2ZWwtLTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCBcXFwic3RhcnRQcm9nXFxcIlwiKTtcclxuXHJcbiAgICAvLyBJZiBvcmlnaW5hbGx5IHdlIHdlcmUgaW5zdHJ1Y3RlZCB0byBzdG9wIGV2ZW50cyBleGVjdXRpb24sIHRoZW4gcmVzdG9yZSB0aGlzXHJcbiAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihvcmdTdG9wRXhlY3V0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBjb21wb25lbnQncyBtYWluIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgbm9uIGludGVyYWN0aXZlIHRhc2sgaWYgYW55IHRoYXQgZXhlY3V0ZWQ8L3JldHVybnM+XHJcbiAgc3RhdGljIGFzeW5jIEV4ZWN1dGVDb21wb25lbnRNYWluUHJvZ3JhbXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8VGFzaz4geyAvLyBnbyB3aXRoIFN0YXJ0UHJvZ3JhbVxyXG4gICAgbGV0IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcblxyXG4gICAgbGV0IG1heEN0bElkeDogbnVtYmVyID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKS5nZXRNYXhDdGxJZHgoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG1heEN0bElkeDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjb21wb25lbnRNYWluUHJvZ3JhbTogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBpKTtcclxuXHJcbiAgICAgIGlmIChjb21wb25lbnRNYWluUHJvZ3JhbSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbShpLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgbWFpbiBwcm9ncmFtIG9mIEN0bEluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDdGxJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VycmVudE5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBFeGVjdXRlTWFpblByb2dyYW0oQ3RsSW5kZXg6IG51bWJlciwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4sIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogUmVmUGFyYW08VGFzaz4sIG1nRGF0YVRhYmxlOiBJTUdEYXRhQ29sbGVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1haW5Qcm9ncmFtVGFzazogVGFzayA9IDxUYXNrPm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIEN0bEluZGV4KTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcIiAgQ2xpZW50TWFuYWdlci5zdGFydFByb2c6IGN0bElkeD17MH0sIHRhc2s9ezF9XCIsIEN0bEluZGV4LCBtYWluUHJvZ3JhbVRhc2spKTtcclxuXHJcbiAgICBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlID0gIDxUYXNrPihhd2FpdCBtYWluUHJvZ3JhbVRhc2suU3RhcnQobW92ZVRvRmlyc3RDb250cm9sLCBjYWxsQnlEZXN0U3ViRm9ybSkpO1xyXG4gICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9PT0gbnVsbClcclxuICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID0gY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZTtcclxuICAgIGVsc2UgaWYgKGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBpbiBzdGFydFByb2dcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IE9wZW4gYWxsIHRoZSBmb3JtIHRoYXQgYXJlIHBlbmRpbmcgaW4gQ3JlYXRlZEZvcm1zIHZlY3Rvci4gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBPcGVuRm9ybXMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjcmVhdGVkRm9ybXM6IENyZWF0ZWRGb3JtVmVjdG9yID0gTWdGb3JtLkNyZWF0ZWRGb3JtcztcclxuXHJcbiAgICBpZiAoY3JlYXRlZEZvcm1zLkNvdW50KCkgPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICB3aGlsZSAoaSA8IGNyZWF0ZWRGb3Jtcy5Db3VudCgpKSB7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gY3JlYXRlZEZvcm1zLmdldChpKTtcclxuICAgICAgICBsZXQgY2FuT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBPcGVuIGEgc3ViZm9ybSBvbmx5IGlmIGl0cyBjb250YWluZXIgZm9ybSBpcyBPcGVuZWQuXHJcbiAgICAgICAgLy8gaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSBkb2Vzbid0IGdvIHdlbGwgZm9yIHN1YmZvcm1zIChRQ1IgIzkxOTExOSkuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgICAgbGV0IG9wZW5lZDogYm9vbGVhbiA9ICg8TWdGb3JtQmFzZT5tZ0Zvcm0uZ2V0U3ViRm9ybUN0cmwoKS5nZXRGb3JtKCkpLk9wZW5lZDtcclxuICAgICAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCg8VGFzaz5tZ0Zvcm0uZ2V0VGFzaygpKS5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpKSB7XHJcbiAgICAgICAgICAgIGNhbk9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbk9wZW4pIHtcclxuICAgICAgICAgIE1hbmFnZXIuT3BlbkZvcm0obWdGb3JtKTtcclxuICAgICAgICAgIGF3YWl0IE1hbmFnZXIuRG9GaXJzdFJlZnJlc2hUYWJsZShtZ0Zvcm0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1nRm9ybS5PcGVuZWQpIHtcclxuXHJcbiAgICAgICAgICBjcmVhdGVkRm9ybXMucmVtb3ZlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHb2VzIG92ZXIgZm9ybXMgaXMgY3JlYXRlZEZvcm1WZWMgYW5kIHBlcmZvcm1zIG1vdmUgdG8gZmlyc3QgcmVjb3JkIGN5Y2xlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIERvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbWdkLmdldFRhc2tzQ291bnQoKTsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgICAgaWYgKG1nRm9ybSAhPT0gbnVsbCAmJiB0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgIW1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlKSB7XHJcbiAgICAgICAgICAgIG1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5kb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIGV2ZXJ5IG1nZGF0YSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCB0byB0aGUgZm9ybVxyXG4gIC8vLyB0aGF0IHdlIG1hcmtlZCBiZWZvcmUgd2l0aCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgTW92ZVRvRmlyc3RDb250cm9scyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuXHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBsZXQgdGFza3NDb3VudDogbnVtYmVyID0gbWdkLmdldFRhc2tzQ291bnQoKTtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRhc2tzQ291bnQ7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiBtZ0Zvcm0gIT09IG51bGwgJiYgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWNhbGxCeURlc3RTdWJGb3JtKVxyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==