@magic-xpa/engine 4.801.0-dev481.245 → 4.801.0-dev481.248

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
  3. package/{esm2015/src/AccessHelper.js → esm2020/src/AccessHelper.mjs} +0 -0
  4. package/esm2020/src/ClientManager.mjs +403 -0
  5. package/esm2020/src/CommandsProcessorBase.mjs +58 -0
  6. package/esm2020/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2020/src/CommandsTable.mjs +163 -0
  8. package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
  9. package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
  10. package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
  11. package/esm2020/src/GUIManager.mjs +63 -0
  12. package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
  13. package/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -0
  14. package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
  15. package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
  16. package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
  17. package/esm2020/src/bridge/MagicBridge.mjs +41 -0
  18. package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
  19. package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
  20. package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
  21. package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
  22. package/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
  23. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
  24. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
  25. package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -0
  26. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
  27. package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
  28. package/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
  29. package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
  30. package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -0
  31. package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
  32. package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
  33. package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +0 -0
  34. package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
  35. package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
  36. package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
  37. package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -0
  38. package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
  39. package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
  40. package/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
  41. package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
  42. package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
  43. package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
  44. package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
  45. package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
  46. package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
  47. package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -0
  48. package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
  49. package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
  50. package/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
  51. package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
  52. package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -0
  55. package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
  56. package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
  57. package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
  58. package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
  59. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
  61. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
  64. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
  65. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
  67. package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
  68. package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
  69. package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
  70. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
  72. package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
  73. package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
  74. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
  75. package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
  76. package/esm2020/src/data/DataView.mjs +1634 -0
  77. package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
  78. package/esm2020/src/data/DataviewManager.mjs +28 -0
  79. package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
  80. package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
  81. package/esm2020/src/data/Field.mjs +645 -0
  82. package/esm2020/src/data/FieldBase.mjs +18 -0
  83. package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
  84. package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
  85. package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
  86. package/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -0
  91. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  92. package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2020/src/env/Environment.mjs +554 -0
  94. package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
  95. package/esm2020/src/env/LanguageData.mjs +222 -0
  96. package/{esm2015/src/env/MirrorString.js → esm2020/src/env/MirrorString.mjs} +0 -0
  97. package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
  98. package/esm2020/src/event/Event.mjs +1436 -0
  99. package/esm2020/src/event/EventHandler.mjs +773 -0
  100. package/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
  103. package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -0
  104. package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
  105. package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
  106. package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
  107. package/esm2020/src/exp/Expression.mjs +200 -0
  108. package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
  110. package/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -0
  111. package/{esm2015/src/exp/GlobalParamsTable.js → esm2020/src/exp/GlobalParamsTable.mjs} +0 -0
  112. package/esm2020/src/exp/YesNoExp.mjs +41 -0
  113. package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
  114. package/esm2020/src/gui/FormsTable.mjs +66 -0
  115. package/esm2020/src/gui/MgControl.mjs +357 -0
  116. package/esm2020/src/gui/MgForm.mjs +1195 -0
  117. package/esm2020/src/http/HttpManager.mjs +97 -0
  118. package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
  119. package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
  120. package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
  121. package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
  122. package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
  123. package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
  124. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
  128. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
  131. package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
  132. package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
  133. package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
  134. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
  136. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -0
  138. package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
  139. package/esm2020/src/rt/Argument.mjs +274 -0
  140. package/esm2020/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2020/src/rt/Boundary.mjs +158 -0
  142. package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
  143. package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
  144. package/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -0
  147. package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
  148. package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
  149. package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
  150. package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
  151. package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
  152. package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
  153. package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
  154. package/esm2020/src/rt/Operation.mjs +745 -0
  155. package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
  156. package/esm2020/src/rt/Recompute.mjs +355 -0
  157. package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
  158. package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
  159. package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
  160. package/esm2020/src/rt/TableCache.mjs +177 -0
  161. package/esm2020/src/rt/TableCacheManager.mjs +67 -0
  162. package/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -0
  163. package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
  164. package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
  165. package/esm2020/src/tasks/MGData.mjs +552 -0
  166. package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
  167. package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
  168. package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
  169. package/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -0
  170. package/esm2020/src/tasks/Task.mjs +2501 -0
  171. package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
  172. package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
  173. package/esm2020/src/tasks/TasksTable.mjs +80 -0
  174. package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
  175. package/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
  178. package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
  179. package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +1 -0
  180. package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
  181. package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
  182. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
  183. package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
  184. package/{esm2015/src/util/ParamParseResult.js → esm2020/src/util/ParamParseResult.mjs} +0 -0
  185. package/{esm2015/src/util/PrmMap.js → esm2020/src/util/PrmMap.mjs} +0 -0
  186. package/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
  187. package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -0
  188. package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
  189. package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
  190. package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
  191. package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
  192. package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +98 -3
  193. package/fesm2015/magic-xpa-engine.mjs.map +1 -0
  194. package/fesm2020/magic-xpa-engine.mjs +30705 -0
  195. package/fesm2020/magic-xpa-engine.mjs.map +1 -0
  196. package/package.json +27 -13
  197. package/src/CommandsProcessorBase.d.ts +3 -3
  198. package/src/commands/DataViewCommandBase.d.ts +2 -2
  199. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  200. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  201. package/src/data/FieldBase.d.ts +3 -3
  202. package/src/http/client/HttpClientBase.d.ts +2 -2
  203. package/src/rt/DataviewHeaderBase.d.ts +1 -1
  204. package/src/tasks/TaskBase.d.ts +7 -7
  205. package/bundles/magic-xpa-engine.umd.js +0 -37985
  206. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  207. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  208. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  209. package/esm2015/src/ClientManager.js +0 -412
  210. package/esm2015/src/CommandsProcessorBase.js +0 -54
  211. package/esm2015/src/CommandsProcessorManager.js +0 -31
  212. package/esm2015/src/CommandsTable.js +0 -166
  213. package/esm2015/src/GUIManager.js +0 -72
  214. package/esm2015/src/bridge/MagicBridge.js +0 -44
  215. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  216. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  217. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  218. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  219. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  220. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  221. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  222. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  223. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  224. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  225. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  226. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  227. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  228. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  229. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  230. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  231. package/esm2015/src/data/DataView.js +0 -1692
  232. package/esm2015/src/data/DataviewManager.js +0 -31
  233. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  234. package/esm2015/src/data/Field.js +0 -671
  235. package/esm2015/src/data/FieldBase.js +0 -9
  236. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  237. package/esm2015/src/env/EnvVariablesTable.js +0 -347
  238. package/esm2015/src/env/Environment.js +0 -557
  239. package/esm2015/src/env/LanguageData.js +0 -229
  240. package/esm2015/src/event/Event.js +0 -1441
  241. package/esm2015/src/event/EventHandler.js +0 -786
  242. package/esm2015/src/event/EventsManager.js +0 -3106
  243. package/esm2015/src/exp/Expression.js +0 -209
  244. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
  245. package/esm2015/src/exp/YesNoExp.js +0 -44
  246. package/esm2015/src/gui/FormsTable.js +0 -73
  247. package/esm2015/src/gui/MgControl.js +0 -424
  248. package/esm2015/src/gui/MgForm.js +0 -1291
  249. package/esm2015/src/http/HttpManager.js +0 -100
  250. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  251. package/esm2015/src/http/client/HttpClientBase.js +0 -147
  252. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  253. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  254. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  255. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  256. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -901
  257. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  258. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  259. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  260. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  261. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  262. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  263. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  264. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  265. package/esm2015/src/rt/Argument.js +0 -281
  266. package/esm2015/src/rt/ArgumentsList.js +0 -108
  267. package/esm2015/src/rt/Boundary.js +0 -161
  268. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  269. package/esm2015/src/rt/Operation.js +0 -772
  270. package/esm2015/src/rt/Recompute.js +0 -372
  271. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  272. package/esm2015/src/rt/TableCache.js +0 -182
  273. package/esm2015/src/rt/TableCacheManager.js +0 -70
  274. package/esm2015/src/tasks/MGData.js +0 -561
  275. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  276. package/esm2015/src/tasks/Task.js +0 -2601
  277. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  278. package/esm2015/src/tasks/TasksTable.js +0 -87
  279. package/esm2015/src/util/FlowMonitorQueue.js +0 -364
  280. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  281. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -0,0 +1,1436 @@
1
+ import { ApplicationException, Char, Exception, HashUtils, Int32, NNumber, NString, NumberStyles, RefParam, StringBuilder } from "@magic-xpa/mscorelib";
2
+ import { Base64, ForceExit, InternalInterface, Logger, Misc, StorageAttribute, StrUtil, XMLConstants, XmlParser } from "@magic-xpa/utils";
3
+ import { BlobType, DisplayConvertor, KeyboardItem, Modifiers, PIC, RecordUtils, TaskDefinitionIdTableSaxHandler } from "@magic-xpa/gui";
4
+ import { ConstInterface } from "../ConstInterface";
5
+ import { LastFocusedManager } from "../rt/LastFocusedManager";
6
+ import { AccessHelper } from "../AccessHelper";
7
+ export class Event {
8
+ constructor() {
9
+ this.Exp = null;
10
+ this._forceExit = ForceExit.None;
11
+ this.kbdItm = null;
12
+ this._osCommandShow = 0;
13
+ this._osCommandText = null;
14
+ this._osCommandWait = false;
15
+ this._paramAttrs = null;
16
+ this._paramNulls = null;
17
+ this._paramVals = null;
18
+ this._parameters = 0;
19
+ this._returnExp = 0;
20
+ this._seconds = Int32.MinValue;
21
+ this._timestamp = 0;
22
+ this._type = Char.MinValue;
23
+ this._userDefinedFuncName = null;
24
+ this._userDefinedFuncNameHashCode = 0;
25
+ this._userEvtDesc = "";
26
+ this._userEvtIdx = Int32.MinValue;
27
+ this.ownerTaskDefinitionId = null;
28
+ this.InternalEvent = 0;
29
+ this.PrgDescription = null;
30
+ this.PublicName = null;
31
+ this.UserEvt = null;
32
+ this.UserEvtTaskTag = null;
33
+ this.constructor_0();
34
+ }
35
+ constructor_0() {
36
+ this.InternalEvent = Int32.MinValue;
37
+ this.setTimestamp();
38
+ }
39
+ constructor_1(evt) {
40
+ this._type = evt._type;
41
+ this.kbdItm = evt.kbdItm;
42
+ this.InternalEvent = evt.InternalEvent;
43
+ this._seconds = evt._seconds;
44
+ this.Exp = evt.Exp;
45
+ this._forceExit = evt._forceExit;
46
+ this.UserEvt = evt.UserEvt;
47
+ this.UserEvtTaskTag = evt.UserEvtTaskTag;
48
+ this._userEvtIdx = evt._userEvtIdx;
49
+ this._timestamp = 0;
50
+ }
51
+ get ForceExit() {
52
+ return this._forceExit;
53
+ }
54
+ fillData(xmlParser, taskRef) {
55
+ let userValue;
56
+ let endContext = xmlParser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, xmlParser.getCurrIndex());
57
+ if (endContext !== -1 && endContext < xmlParser.getXMLdata().length) {
58
+ let tag = xmlParser.getXMLsubstring(endContext);
59
+ xmlParser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_EVENT) + ConstInterface.MG_TAG_EVENT.length);
60
+ let tokensVector = XmlParser.getTokens(xmlParser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
61
+ let refUserValue = new RefParam(userValue);
62
+ this.initElements(tokensVector, taskRef, refUserValue);
63
+ userValue = refUserValue.value;
64
+ xmlParser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
65
+ this.InitInnerObjects(xmlParser);
66
+ if (userValue !== null)
67
+ this.InitUserData(taskRef, userValue);
68
+ }
69
+ else
70
+ Logger.Instance.WriteExceptionToLogWithMsg("in Event.FillData() out of string bounds");
71
+ }
72
+ InitInnerObjects(xmlParser) {
73
+ let nextTag = xmlParser.getNextTag();
74
+ switch (nextTag) {
75
+ case XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY:
76
+ let xmlBuffer = xmlParser.ReadToEndOfCurrentElement();
77
+ this.InitTaskDefinitionId(xmlBuffer);
78
+ let endContext = xmlParser.getXMLdata().indexOf(ConstInterface.MG_TAG_EVENT + XMLConstants.TAG_CLOSE, xmlParser.getCurrIndex());
79
+ xmlParser.setCurrIndex(endContext + (ConstInterface.MG_TAG_EVENT + XMLConstants.TAG_CLOSE).length);
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ initElements(tokensVector, taskRef, refUserValue) {
86
+ let modifier = Modifiers.MODIFIER_NONE;
87
+ let keyCode = -1;
88
+ refUserValue.value = null;
89
+ for (let j = 0; j < tokensVector.length; j += 2) {
90
+ let attribute = (tokensVector.get_Item(j));
91
+ let valueStr = (tokensVector.get_Item(j + 1));
92
+ switch (attribute) {
93
+ case ConstInterface.MG_ATTR_EVENTTYPE:
94
+ this._type = valueStr[0];
95
+ break;
96
+ case ConstInterface.MG_ATTR_MODIFIER:
97
+ modifier = valueStr[0];
98
+ break;
99
+ case ConstInterface.MG_ATTR_INTERNALEVENT:
100
+ this.InternalEvent = XmlParser.getInt(valueStr);
101
+ break;
102
+ case ConstInterface.MG_ATTR_KEYCODE:
103
+ keyCode = XmlParser.getInt(valueStr);
104
+ break;
105
+ case ConstInterface.MG_ATTR_SECONDS:
106
+ this._seconds = XmlParser.getInt(valueStr);
107
+ break;
108
+ case XMLConstants.MG_ATTR_EXP:
109
+ this.Exp = taskRef.getExpById(XmlParser.getInt(valueStr));
110
+ break;
111
+ case ConstInterface.MG_ATTR_FORCE_EXIT:
112
+ this._forceExit = valueStr[0];
113
+ break;
114
+ case ConstInterface.MG_ATTR_DESC:
115
+ this._userEvtDesc = XmlParser.unescape(valueStr);
116
+ break;
117
+ case ConstInterface.MG_ATTR_PUBLIC:
118
+ this.PublicName = XmlParser.unescape(valueStr);
119
+ break;
120
+ case ConstInterface.MG_ATTR_PARAMS:
121
+ this._parameters = XmlParser.getInt(valueStr);
122
+ break;
123
+ case ConstInterface.MG_ATTR_PAR_ATTRS:
124
+ this._paramAttrs = valueStr;
125
+ break;
126
+ case XMLConstants.MG_ATTR_VALUE:
127
+ let paramStr = XmlParser.unescape(valueStr);
128
+ this._paramVals = new Array(this._parameters);
129
+ this.parseParamVal(paramStr);
130
+ break;
131
+ case ConstInterface.MG_ATTR_NULLS:
132
+ this._paramNulls = valueStr;
133
+ break;
134
+ case ConstInterface.MG_ATTR_USER:
135
+ refUserValue.value = valueStr;
136
+ break;
137
+ case XMLConstants.MG_ATTR_NAME:
138
+ this.setUserDefinedFuncName(valueStr);
139
+ break;
140
+ case ConstInterface.MG_TAG_USR_DEF_FUC_RET_EXP_ID:
141
+ this._returnExp = XmlParser.getInt(valueStr);
142
+ break;
143
+ case ConstInterface.MG_TAG_USR_DEF_FUC_RET_EXP_ATTR:
144
+ break;
145
+ default:
146
+ Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("There is no such tag in Event class. Insert case to Event.initElements for {0}", attribute));
147
+ break;
148
+ }
149
+ }
150
+ if (this._type === ConstInterface.EVENT_TYPE_SYSTEM)
151
+ this.kbdItm = new KeyboardItem(keyCode, modifier);
152
+ }
153
+ InitUserData(taskRef, userValue) {
154
+ let comma = userValue.indexOf(",");
155
+ if (comma > -1) {
156
+ let ueTaskId = userValue.substr(0, comma);
157
+ if (taskRef !== null)
158
+ ueTaskId = taskRef.TaskService.GetEventTaskId(ueTaskId);
159
+ let ueTask = AccessHelper.mgDataTable.GetTaskByID(ueTaskId);
160
+ let ueIdx = XmlParser.getInt(userValue.substr(comma + 1));
161
+ if (ueTask !== null) {
162
+ this.UserEvt = ueTask.getUserEvent(ueIdx);
163
+ if (this.UserEvt === null) {
164
+ throw new ApplicationException("in Event.fillData(): user event not found. task id = " + ueTaskId +
165
+ ", user event index = " + ueIdx);
166
+ }
167
+ this.UserEvtTaskTag = ueTaskId;
168
+ this._userEvtIdx = ueIdx;
169
+ }
170
+ else {
171
+ this.UserEvtTaskTag = ueTaskId;
172
+ this._userEvtIdx = ueIdx;
173
+ this.UserEvt = null;
174
+ }
175
+ }
176
+ }
177
+ InitTaskDefinitionId(xmlBuffer) {
178
+ let handler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
179
+ handler.parse(xmlBuffer);
180
+ }
181
+ SetTaskDefinitionId(taskDefinitionId) {
182
+ this.ownerTaskDefinitionId = taskDefinitionId;
183
+ }
184
+ findUserEvent() {
185
+ if (this._type === ConstInterface.EVENT_TYPE_USER && this.UserEvt === null) {
186
+ let ueTask = AccessHelper.mgDataTable.GetTaskByID(this.UserEvtTaskTag);
187
+ if (ueTask !== null)
188
+ this.UserEvt = ueTask.getUserEvent(this._userEvtIdx);
189
+ if (this.UserEvt === null)
190
+ throw new ApplicationException(NString.Format("in Event.findUserEvent(): user event not found. task id = {0} doesn't exist", this.UserEvtTaskTag));
191
+ }
192
+ }
193
+ equals(evt) {
194
+ let bEqual = false;
195
+ if (this === evt)
196
+ bEqual = true;
197
+ else if (this._type === evt._type) {
198
+ switch (this._type) {
199
+ case ConstInterface.EVENT_TYPE_SYSTEM:
200
+ bEqual = this.kbdItm.equals(evt.kbdItm);
201
+ break;
202
+ case ConstInterface.EVENT_TYPE_INTERNAL:
203
+ bEqual = (this.InternalEvent === evt.InternalEvent);
204
+ break;
205
+ case ConstInterface.EVENT_TYPE_TIMER:
206
+ bEqual = (this._seconds === evt._seconds);
207
+ break;
208
+ case ConstInterface.EVENT_TYPE_EXPRESSION:
209
+ case ConstInterface.EVENT_TYPE_PUBLIC:
210
+ bEqual = (this.Exp === evt.Exp);
211
+ break;
212
+ case ConstInterface.EVENT_TYPE_USER:
213
+ bEqual = (this.UserEvt === evt.UserEvt);
214
+ break;
215
+ case ConstInterface.EVENT_TYPE_USER_FUNC:
216
+ if (this._userDefinedFuncNameHashCode === evt.getUserDefinedFuncNameHashCode()) {
217
+ if (NString.Equals(evt.getUserDefinedFuncName(), this._userDefinedFuncName, true))
218
+ bEqual = true;
219
+ }
220
+ break;
221
+ default:
222
+ bEqual = false;
223
+ break;
224
+ }
225
+ }
226
+ if (this._type === ConstInterface.EVENT_TYPE_PUBLIC || evt._type === ConstInterface.EVENT_TYPE_PUBLIC) {
227
+ let name1 = null;
228
+ let name2 = null;
229
+ if (this._type !== ConstInterface.EVENT_TYPE_USER && evt._type !== ConstInterface.EVENT_TYPE_USER)
230
+ bEqual = false;
231
+ else if (this._type === ConstInterface.EVENT_TYPE_PUBLIC) {
232
+ name1 = this.PublicName;
233
+ name2 = evt.getUserEvent().PublicName;
234
+ }
235
+ else {
236
+ name1 = evt.PublicName;
237
+ name2 = this.getUserEvent().PublicName;
238
+ }
239
+ if (name1 === null || name2 === null)
240
+ bEqual = false;
241
+ else
242
+ bEqual = (name1 === name2);
243
+ }
244
+ else if (this._type === ConstInterface.EVENT_TYPE_INTERNAL && evt._type === ConstInterface.EVENT_TYPE_SYSTEM) {
245
+ if (LastFocusedManager.Instance.getCurrTask() !== null && (AccessHelper.eventsManager.getMatchingAction(evt.getKbdItm())) === this.getInternalCode())
246
+ bEqual = true;
247
+ }
248
+ else if (this._type === ConstInterface.EVENT_TYPE_USER && evt._type !== ConstInterface.EVENT_TYPE_USER) {
249
+ this.findUserEvent();
250
+ bEqual = this.UserEvt.equals(evt);
251
+ }
252
+ return bEqual;
253
+ }
254
+ async setPublicName() {
255
+ if (this._type === ConstInterface.EVENT_TYPE_PUBLIC && this.Exp !== null) {
256
+ this.PublicName = (await this.Exp.evaluateWithResLength(255)).mgVal;
257
+ if (this.PublicName !== null)
258
+ this.PublicName = StrUtil.rtrim(this.PublicName);
259
+ }
260
+ }
261
+ setInternal(code) {
262
+ this._type = ConstInterface.EVENT_TYPE_INTERNAL;
263
+ this.InternalEvent = code;
264
+ if (code === InternalInterface.MG_ACT_HIT || code === InternalInterface.MG_ACT_CTRL_HIT)
265
+ LastFocusedManager.Instance.LastActionTime = Misc.getSystemMilliseconds();
266
+ }
267
+ setExpression(expRef) {
268
+ this._type = ConstInterface.EVENT_TYPE_EXPRESSION;
269
+ this.Exp = expRef;
270
+ }
271
+ getExpression() {
272
+ return this.Exp;
273
+ }
274
+ getUsrEvntDesc() {
275
+ return (this.UserEvt !== null) ? this.UserEvt._userEvtDesc : this._userEvtDesc;
276
+ }
277
+ setSystem(keyboardItem) {
278
+ this._type = ConstInterface.EVENT_TYPE_SYSTEM;
279
+ this.kbdItm = keyboardItem;
280
+ }
281
+ setKeyboardItem(keyboardItem) {
282
+ this.kbdItm = keyboardItem;
283
+ }
284
+ getType() {
285
+ return this._type;
286
+ }
287
+ setType(aType) {
288
+ this._type = aType;
289
+ }
290
+ getInternalCode() {
291
+ if (this._type === ConstInterface.EVENT_TYPE_INTERNAL)
292
+ return this.InternalEvent;
293
+ return Int32.MinValue;
294
+ }
295
+ getKbdItm() {
296
+ if (this._type === ConstInterface.EVENT_TYPE_SYSTEM)
297
+ return this.kbdItm;
298
+ return null;
299
+ }
300
+ getKbdItmAlways() {
301
+ return this.kbdItm;
302
+ }
303
+ async dataEventIsTrue() {
304
+ if (this._type !== ConstInterface.EVENT_TYPE_EXPRESSION &&
305
+ !(this._type === ConstInterface.EVENT_TYPE_USER && this.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION))
306
+ return true;
307
+ if (this._type !== ConstInterface.EVENT_TYPE_USER)
308
+ return DisplayConvertor.toBoolean(await this.Exp.evaluateWithResultTypeAndLength(StorageAttribute.BOOLEAN, 0));
309
+ return DisplayConvertor.toBoolean(await this.UserEvt.getExpression().evaluateWithResultTypeAndLength(StorageAttribute.BOOLEAN, 0));
310
+ }
311
+ getSeconds() {
312
+ return this._seconds;
313
+ }
314
+ getBrkLevel(flowMonitor) {
315
+ if (arguments.length === 0) {
316
+ return this.getBrkLevel_0();
317
+ }
318
+ return this.getBrkLevel_1(flowMonitor);
319
+ }
320
+ getBrkLevel_0() {
321
+ return this.getBrkLevel(false);
322
+ }
323
+ getBrkLevel_1(flowMonitor) {
324
+ let level = "";
325
+ switch (this._type) {
326
+ case ConstInterface.EVENT_TYPE_INTERNAL:
327
+ switch (this.InternalEvent) {
328
+ case InternalInterface.MG_ACT_TASK_PREFIX:
329
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_TASK_PREFIX_FM : ConstInterface.BRK_LEVEL_TASK_PREFIX;
330
+ break;
331
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
332
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_TASK_SUFFIX_FM : ConstInterface.BRK_LEVEL_TASK_SUFFIX;
333
+ break;
334
+ case InternalInterface.MG_ACT_REC_PREFIX:
335
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_REC_PREFIX_FM : ConstInterface.BRK_LEVEL_REC_PREFIX;
336
+ break;
337
+ case InternalInterface.MG_ACT_REC_SUFFIX:
338
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_REC_SUFFIX_FM : ConstInterface.BRK_LEVEL_REC_SUFFIX;
339
+ break;
340
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
341
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_CTRL_PREFIX_FM : ConstInterface.BRK_LEVEL_CTRL_PREFIX + '_';
342
+ break;
343
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
344
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_CTRL_SUFFIX_FM : ConstInterface.BRK_LEVEL_CTRL_SUFFIX + '_';
345
+ break;
346
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
347
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_CTRL_VERIFICATION_FM : ConstInterface.BRK_LEVEL_CTRL_VERIFICATION + '_';
348
+ break;
349
+ case InternalInterface.MG_ACT_VARIABLE:
350
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_VARIABLE_FM : ConstInterface.BRK_LEVEL_VARIABLE + '_';
351
+ break;
352
+ default:
353
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_HANDLER_INTERNAL_FM : ConstInterface.BRK_LEVEL_HANDLER_INTERNAL + '_';
354
+ break;
355
+ }
356
+ level += Event.getInternalEvtDescription(this.InternalEvent);
357
+ break;
358
+ case ConstInterface.EVENT_TYPE_SYSTEM:
359
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_HANDLER_SYSTEM_FM : ConstInterface.BRK_LEVEL_HANDLER_SYSTEM + '_';
360
+ level += this.getKeyboardItemString();
361
+ break;
362
+ case ConstInterface.EVENT_TYPE_TIMER:
363
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_HANDLER_TIMER_FM + ' ' + this.seconds2String() : ConstInterface.BRK_LEVEL_HANDLER_TIMER + '_' + this.seconds2String();
364
+ break;
365
+ case ConstInterface.EVENT_TYPE_EXPRESSION:
366
+ level = flowMonitor ? ConstInterface.BRK_LEVEL_HANDLER_EXPRESSION_FM : ConstInterface.BRK_LEVEL_HANDLER_EXPRESSION + '_' + this.Exp.getId();
367
+ break;
368
+ case ConstInterface.EVENT_TYPE_USER:
369
+ level = (flowMonitor ? (ConstInterface.BRK_LEVEL_HANDLER_USER_FM + ": ") : (ConstInterface.BRK_LEVEL_HANDLER_USER + '_')) + (this.UserEvt != null ? this.UserEvt._userEvtDesc : this._userEvtDesc);
370
+ break;
371
+ case ConstInterface.EVENT_TYPE_USER_FUNC:
372
+ level = (flowMonitor ? (ConstInterface.BRK_LEVEL_USER_FUNCTION_FM + ':') : (ConstInterface.BRK_LEVEL_USER_FUNCTION + '_')) + this._userDefinedFuncName;
373
+ break;
374
+ }
375
+ return level;
376
+ }
377
+ static getInternalEvtDescription(internalEventCode) {
378
+ let description;
379
+ switch (internalEventCode) {
380
+ case InternalInterface.MG_ACT_ABOUT:
381
+ description = "About Magic";
382
+ break;
383
+ case InternalInterface.MG_ACT_ACTION_LIST:
384
+ description = "Action List";
385
+ break;
386
+ case InternalInterface.MG_ACT_ADD_HYPERLINK:
387
+ description = "";
388
+ break;
389
+ case InternalInterface.MG_ACT_ALIGN_LEFT:
390
+ description = "Left";
391
+ break;
392
+ case InternalInterface.MG_ACT_ALIGN_RIGHT:
393
+ description = "Right";
394
+ break;
395
+ case InternalInterface.MG_ACT_APPL_PROPERTIES:
396
+ description = "";
397
+ break;
398
+ case InternalInterface.MG_ACT_APPLICATIONS:
399
+ description = "Applications";
400
+ break;
401
+ case InternalInterface.MG_ACT_APPLICATIONS_LIST:
402
+ description = "Applications List";
403
+ break;
404
+ case InternalInterface.MG_ACT_ATTACH_TO_TABLE:
405
+ description = "Attach to Table";
406
+ break;
407
+ case InternalInterface.MG_ACT_AUTHORIZE:
408
+ description = "Authorize";
409
+ break;
410
+ case InternalInterface.MG_ACT_EDT_BEGFLD:
411
+ description = "Begin Field";
412
+ break;
413
+ case InternalInterface.MG_ACT_EDT_BEGFORM:
414
+ description = "Begin Form";
415
+ break;
416
+ case InternalInterface.MG_ACT_EDT_BEGLINE:
417
+ description = "Begin Line";
418
+ break;
419
+ case InternalInterface.MG_ACT_EDT_BEGNXTLINE:
420
+ description = "Begin Next Line";
421
+ break;
422
+ case InternalInterface.MG_ACT_EDT_BEGPAGE:
423
+ description = "Begin Page";
424
+ break;
425
+ case InternalInterface.MG_ACT_TBL_BEGLINE:
426
+ description = "Begin Row";
427
+ break;
428
+ case InternalInterface.MG_ACT_TBL_BEGPAGE:
429
+ description = "Begin Screen";
430
+ break;
431
+ case InternalInterface.MG_ACT_TBL_BEGTBL:
432
+ description = "Begin table";
433
+ break;
434
+ case InternalInterface.MG_ACT_BOTTOM:
435
+ description = "Bottom";
436
+ break;
437
+ case InternalInterface.MG_ACT_BULLET:
438
+ description = "Bullet";
439
+ break;
440
+ case InternalInterface.MG_ACT_BUTTON:
441
+ description = "Button Press";
442
+ break;
443
+ case InternalInterface.MG_ACT_CANCEL:
444
+ description = "Cancel";
445
+ break;
446
+ case InternalInterface.MG_ACT_RT_QUIT:
447
+ description = "Quit";
448
+ break;
449
+ case InternalInterface.MG_ACT_CENTER:
450
+ description = "Center";
451
+ break;
452
+ case InternalInterface.MG_ACT_CHECK_SYNTAX:
453
+ description = "Check Syntax";
454
+ break;
455
+ case InternalInterface.MG_ACT_CHECK_TO_END:
456
+ description = "Check to End";
457
+ break;
458
+ case InternalInterface.MG_ACT_CLEAR_TEMPLATE:
459
+ description = "Clear Template";
460
+ break;
461
+ case InternalInterface.MG_ACT_CLEAR_VALUE:
462
+ description = "Clear Value";
463
+ break;
464
+ case InternalInterface.MG_ACT_CLOSE:
465
+ description = "Close";
466
+ break;
467
+ case InternalInterface.MG_ACT_ACT_CLOSE_APPL:
468
+ description = "Close Application";
469
+ break;
470
+ case InternalInterface.MG_ACT_COMMUNICATIONS:
471
+ description = "Communications";
472
+ break;
473
+ case InternalInterface.MG_ACT_COMPONENTS:
474
+ description = "Components";
475
+ break;
476
+ case InternalInterface.MG_ACT_CTRL_HIT:
477
+ description = "Control Hit";
478
+ break;
479
+ case InternalInterface.MG_ACT_CONTROL_NAME_LIST:
480
+ description = "Control Name List";
481
+ break;
482
+ case InternalInterface.MG_ACT_CLIP_COPY:
483
+ description = "Copy";
484
+ break;
485
+ case InternalInterface.MG_ACT_COPY_LAYOUT:
486
+ description = "Copy Layout";
487
+ break;
488
+ case InternalInterface.MG_ACT_COPY_SUBTREE:
489
+ description = "Copy Subtree";
490
+ break;
491
+ case InternalInterface.MG_ACT_CRELINE:
492
+ description = "Create Line";
493
+ break;
494
+ case InternalInterface.MG_ACT_CRELINE_ABOVE:
495
+ description = "Create Line Above";
496
+ break;
497
+ case InternalInterface.MG_ACT_CREATE_PARENT:
498
+ description = "Create Parent";
499
+ break;
500
+ case InternalInterface.MG_ACT_RTO_CREATE:
501
+ description = "Create Records";
502
+ break;
503
+ case InternalInterface.MG_ACT_CREATE_SUBTASK:
504
+ description = "Create Subtask";
505
+ break;
506
+ case InternalInterface.MG_ACT_CROSS_REFERENCE:
507
+ description = "Cross Reference";
508
+ break;
509
+ case InternalInterface.MG_ACT_CUT:
510
+ description = "Cut";
511
+ break;
512
+ case InternalInterface.MG_ACT_DB_TABLES:
513
+ description = "";
514
+ break;
515
+ case InternalInterface.MG_ACT_DBMS:
516
+ description = "DBMS";
517
+ break;
518
+ case InternalInterface.MG_ACT_DDF_MAKE:
519
+ description = "DDF Make";
520
+ break;
521
+ case InternalInterface.MG_ACT_DATABASES:
522
+ description = "Databases";
523
+ break;
524
+ case InternalInterface.MG_ACT_DEFAULT_LAYOUT:
525
+ description = "Default Layout";
526
+ break;
527
+ case InternalInterface.MG_ACT_DEFINE_EXPRESSION:
528
+ description = "Define Expression";
529
+ break;
530
+ case InternalInterface.MG_ACT_EDT_DELCURCH:
531
+ description = "Current Char";
532
+ break;
533
+ case InternalInterface.MG_ACT_EDT_DELPRVCH:
534
+ description = "Previous Char";
535
+ break;
536
+ case InternalInterface.MG_ACT_DELETE_HYPERLINK:
537
+ description = "Delete Hyperlink";
538
+ break;
539
+ case InternalInterface.MG_ACT_DELLINE:
540
+ description = "Delete Line";
541
+ break;
542
+ case InternalInterface.MG_ACT_DELETE_SUBTREE:
543
+ description = "Delete Subtree";
544
+ break;
545
+ case InternalInterface.MG_ACT_RT_COPYFLD:
546
+ description = "Ditto";
547
+ break;
548
+ case InternalInterface.MG_ACT_DISPLAY_REFRESH:
549
+ description = "Display Refresh";
550
+ break;
551
+ case InternalInterface.MG_ACT_EDIT_MAIN_FORM:
552
+ description = "Edit Main Form";
553
+ break;
554
+ case InternalInterface.MG_ACT_EDT_ENDFLD:
555
+ description = "End Field";
556
+ break;
557
+ case InternalInterface.MG_ACT_EDT_ENDFORM:
558
+ description = "End Form";
559
+ break;
560
+ case InternalInterface.MG_ACT_EDT_ENDLINE:
561
+ description = "End Line";
562
+ break;
563
+ case InternalInterface.MG_ACT_EDT_ENDPAGE:
564
+ description = "End Page";
565
+ break;
566
+ case InternalInterface.MG_ACT_TBL_ENDLINE:
567
+ description = "End Row";
568
+ break;
569
+ case InternalInterface.MG_ACT_TBL_ENDPAGE:
570
+ description = "End Screen";
571
+ break;
572
+ case InternalInterface.MG_ACT_TBL_ENDTBL:
573
+ description = "End Table";
574
+ break;
575
+ case InternalInterface.MG_ACT_ENVIRONMENT:
576
+ description = "Environment";
577
+ break;
578
+ case InternalInterface.MG_ACT_EXECUTE_PROGRAM:
579
+ description = "Execute Program";
580
+ break;
581
+ case InternalInterface.MG_ACT_EXECUTE_REPORT:
582
+ description = "Execute Report";
583
+ break;
584
+ case InternalInterface.MG_ACT_EXIT:
585
+ description = "Exit";
586
+ break;
587
+ case InternalInterface.MG_ACT_EXIT_SYSTEM:
588
+ description = "Exit System";
589
+ break;
590
+ case InternalInterface.MG_ACT_EXPORT_IMPORT:
591
+ description = "Export/Import";
592
+ break;
593
+ case InternalInterface.MG_ACT_EXPRESSION_RULES:
594
+ description = "Expression rules";
595
+ break;
596
+ case InternalInterface.MG_ACT_EXTERNAL_EDITOR:
597
+ description = "External Editor";
598
+ break;
599
+ case InternalInterface.MG_ACT_EXT_EVENT:
600
+ description = "External Event";
601
+ break;
602
+ case InternalInterface.MG_ACT_FORMS:
603
+ description = "Forms";
604
+ break;
605
+ case InternalInterface.MG_ACT_FROM_VALUE:
606
+ description = "From Value";
607
+ break;
608
+ case InternalInterface.MG_ACT_FUNCTION_LIST:
609
+ description = "Function List";
610
+ break;
611
+ case InternalInterface.MG_ACT_GENERATE_FORM:
612
+ description = "Generate Form";
613
+ break;
614
+ case InternalInterface.MG_ACT_GENERATE_PROGRAM:
615
+ description = "Generate Program";
616
+ break;
617
+ case InternalInterface.MG_ACT_GO_TO_TOP:
618
+ description = "Go to Top";
619
+ break;
620
+ case InternalInterface.MG_ACT_H_CENTER_OF_FORM:
621
+ description = "";
622
+ break;
623
+ case InternalInterface.MG_ACT_HTML_STYLES:
624
+ description = "HTML Styles";
625
+ break;
626
+ case InternalInterface.MG_ACT_HELP:
627
+ description = "Help";
628
+ break;
629
+ case InternalInterface.MG_ACT_HELP_SCREENS:
630
+ description = "Help Screens";
631
+ break;
632
+ case InternalInterface.MG_ACT_HORIZ_CENTER:
633
+ description = "Horiz. Center";
634
+ break;
635
+ case InternalInterface.MG_ACT_I_O_FILES:
636
+ description = "Tables";
637
+ break;
638
+ case InternalInterface.MG_ACT_INDENT:
639
+ description = "Indent";
640
+ break;
641
+ case InternalInterface.MG_ACT_INSERT_OBJECT:
642
+ description = "Insert Object";
643
+ break;
644
+ case InternalInterface.MG_ACT_JUMP_TO_ROW:
645
+ description = "Jump to Row";
646
+ break;
647
+ case InternalInterface.MG_ACT_KEYBOARD_LIST:
648
+ description = "Keyboard List";
649
+ break;
650
+ case InternalInterface.MG_ACT_KEYBOARD_MAPPING:
651
+ description = "Keyboard Mapping";
652
+ break;
653
+ case InternalInterface.MG_ACT_LANGUAGES:
654
+ description = "languages";
655
+ break;
656
+ case InternalInterface.MG_ACT_RTO_SEARCH:
657
+ description = "Locate Next";
658
+ break;
659
+ case InternalInterface.MG_ACT_RTO_LOCATE:
660
+ description = "Locate a Record";
661
+ break;
662
+ case InternalInterface.MG_ACT_LOGICALPNAMES:
663
+ description = "";
664
+ break;
665
+ case InternalInterface.MG_ACT_LOGON:
666
+ description = "Logon";
667
+ break;
668
+ case InternalInterface.MG_ACT_USING_HELP:
669
+ description = "Help Topics";
670
+ break;
671
+ case InternalInterface.MG_ACT_EDT_MARKNXTCH:
672
+ description = "Mark Next Char";
673
+ break;
674
+ case InternalInterface.MG_ACT_MARK_NEXT_LINE:
675
+ description = "Mark Next Line MLE";
676
+ break;
677
+ case InternalInterface.MG_ACT_EDT_MARKPRVCH:
678
+ description = "Mark Previous Char";
679
+ break;
680
+ case InternalInterface.MG_ACT_EDT_MARKPRVLINE:
681
+ description = "Mark Previous Line MLE";
682
+ break;
683
+ case InternalInterface.MG_ACT_MARK_SUBTREE:
684
+ description = "";
685
+ break;
686
+ case InternalInterface.MG_ACT_EDT_MARKTOBEG:
687
+ description = "Mark To Beginning";
688
+ break;
689
+ case InternalInterface.MG_ACT_EDT_MARKTOEND:
690
+ description = "Mark To End";
691
+ break;
692
+ case InternalInterface.MG_ACT_MAXIMUM_HEIGHT:
693
+ description = "Maximum Height";
694
+ break;
695
+ case InternalInterface.MG_ACT_MAXIMUM_WIDTH:
696
+ description = "Maximum Width";
697
+ break;
698
+ case InternalInterface.MG_ACT_MENU_BAR:
699
+ description = "Menu Bar";
700
+ break;
701
+ case InternalInterface.MG_ACT_MENUS:
702
+ description = "";
703
+ break;
704
+ case InternalInterface.MG_ACT_MINIMUM_HEIGHT:
705
+ description = "Minimum Height";
706
+ break;
707
+ case InternalInterface.MG_ACT_MINIMUM_WIDTH:
708
+ description = "Minimum Width";
709
+ break;
710
+ case InternalInterface.MG_ACT_RTO_MODIFY:
711
+ description = "Modify Records";
712
+ break;
713
+ case InternalInterface.MG_ACT_MONITOR_DEBUGGER:
714
+ description = "Monitor/Debugger";
715
+ break;
716
+ case InternalInterface.MG_ACT_MOVE_ENTRY:
717
+ description = "Move Entry";
718
+ break;
719
+ case InternalInterface.MG_ACT_MOVE_SUBTREE:
720
+ description = "Move Subtree";
721
+ break;
722
+ case InternalInterface.MG_ACT_NULL_SETTINGS:
723
+ description = "NULL Settings";
724
+ break;
725
+ case InternalInterface.MG_ACT_EDT_NXTCHAR:
726
+ description = "Next Char";
727
+ break;
728
+ case InternalInterface.MG_ACT_EDT_NXTLINE:
729
+ description = "Next Line";
730
+ break;
731
+ case InternalInterface.MG_ACT_EDT_NXTPAGE:
732
+ description = "Next Page";
733
+ break;
734
+ case InternalInterface.MG_ACT_TBL_NXTLINE:
735
+ description = "Next Row";
736
+ break;
737
+ case InternalInterface.MG_ACT_TBL_NXTPAGE:
738
+ description = "Next Screen";
739
+ break;
740
+ case InternalInterface.MG_ACT_EDT_NXTTAB:
741
+ description = "Next Tab";
742
+ break;
743
+ case InternalInterface.MG_ACT_EDT_NXTWORD:
744
+ description = "Next Word";
745
+ break;
746
+ case InternalInterface.MG_ACT_NORMAL:
747
+ description = "Normal";
748
+ break;
749
+ case InternalInterface.MG_ACT_OK:
750
+ description = "OK";
751
+ break;
752
+ case InternalInterface.MG_ACT_OLE2:
753
+ description = "OLE2";
754
+ break;
755
+ case InternalInterface.MG_ACT_OPEN_APPLICATION:
756
+ description = "Open Application";
757
+ break;
758
+ case InternalInterface.MG_ACT_OVERWRITE_ENTRY:
759
+ description = "Overwrite Entry";
760
+ break;
761
+ case InternalInterface.MG_ACT_OVERWRITE_SUBTREE:
762
+ description = "Overwrite Subtree";
763
+ break;
764
+ case InternalInterface.MG_ACT_PPD:
765
+ description = "PPD";
766
+ break;
767
+ case InternalInterface.MG_ACT_PAGE_FOOTER:
768
+ description = "Page Footer";
769
+ break;
770
+ case InternalInterface.MG_ACT_PAGE_HEADER:
771
+ description = "Page Header";
772
+ break;
773
+ case InternalInterface.MG_ACT_CLIP_PASTE:
774
+ description = "Paste";
775
+ break;
776
+ case InternalInterface.MG_ACT_PASTE_LINK:
777
+ description = "Paste Link";
778
+ break;
779
+ case InternalInterface.MG_ACT_PASTE_SUBTREE:
780
+ description = "Paste Subtree";
781
+ break;
782
+ case InternalInterface.MG_ACT_EDT_PRVCHAR:
783
+ description = "Previous Char";
784
+ break;
785
+ case InternalInterface.MG_ACT_EDT_PRVLINE:
786
+ description = "Previous Line";
787
+ break;
788
+ case InternalInterface.MG_ACT_EDT_PRVPAGE:
789
+ description = "Previous Page";
790
+ break;
791
+ case InternalInterface.MG_ACT_TBL_PRVLINE:
792
+ description = "Previous Row";
793
+ break;
794
+ case InternalInterface.MG_ACT_TBL_PRVPAGE:
795
+ description = "Previous Screen";
796
+ break;
797
+ case InternalInterface.MG_ACT_EDT_PRVTAB:
798
+ description = "Previous Tab";
799
+ break;
800
+ case InternalInterface.MG_ACT_EDT_PRVWORD:
801
+ description = "Previous Word";
802
+ break;
803
+ case InternalInterface.MG_ACT_PRINT_ATTRIBUTES:
804
+ description = "Print Attributes";
805
+ break;
806
+ case InternalInterface.MG_ACT_PRINTER_SETUP:
807
+ description = "Printer Setup";
808
+ break;
809
+ case InternalInterface.MG_ACT_PRINTERS:
810
+ description = "Printers";
811
+ break;
812
+ case InternalInterface.MG_ACT_PROGRAMS:
813
+ description = "Programs";
814
+ break;
815
+ case InternalInterface.MG_ACT_PROPERTIES:
816
+ description = "Properties";
817
+ break;
818
+ case InternalInterface.MG_ACT_RTO_QUERY:
819
+ description = "Query Records";
820
+ break;
821
+ case InternalInterface.MG_ACT_RTO_RANGE:
822
+ description = "Range of Records";
823
+ break;
824
+ case InternalInterface.MG_ACT_RT_REFRESH_RECORD:
825
+ description = "Record Flush";
826
+ break;
827
+ case InternalInterface.MG_ACT_REDIRECT_FILES:
828
+ description = "Redirect Files";
829
+ break;
830
+ case InternalInterface.MG_ACT_REDRAW_LAYOUT:
831
+ description = "";
832
+ break;
833
+ case InternalInterface.MG_ACT_REPEAT_ENTRY:
834
+ description = "Repeat Entry";
835
+ break;
836
+ case InternalInterface.MG_ACT_REPEAT_SUBTREE:
837
+ description = "Repeat Subtree";
838
+ break;
839
+ case InternalInterface.MG_ACT_REPORT_GENERATOR:
840
+ description = "";
841
+ break;
842
+ case InternalInterface.MG_ACT_RESTORE_DEFAULTS:
843
+ description = "Restore Defaults";
844
+ break;
845
+ case InternalInterface.MG_ACT_RETURN_TO_TREE:
846
+ description = "";
847
+ break;
848
+ case InternalInterface.MG_ACT_RIGHT:
849
+ description = "Right";
850
+ break;
851
+ case InternalInterface.MG_ACT_RIGHTS:
852
+ description = "";
853
+ break;
854
+ case InternalInterface.MG_ACT_RIGHTS_LIST:
855
+ description = "Rights List";
856
+ break;
857
+ case InternalInterface.MG_ACT_SQL_ASSIST:
858
+ description = "SQL Assist";
859
+ break;
860
+ case InternalInterface.MG_ACT_SQL_COLUMNS:
861
+ description = "SQL Columns";
862
+ break;
863
+ case InternalInterface.MG_ACT_SQL_COMMAND:
864
+ description = "SQL Command";
865
+ break;
866
+ case InternalInterface.MG_ACT_SQL_FLIP_DESC:
867
+ description = "SQL Flip Desc.";
868
+ break;
869
+ case InternalInterface.MG_ACT_SQL_KEYWORDS:
870
+ description = "SQL Keywords";
871
+ break;
872
+ case InternalInterface.MG_ACT_SQL_OPERATORS:
873
+ description = "SQL Operators";
874
+ break;
875
+ case InternalInterface.MG_ACT_SQL_TABLES:
876
+ description = "SQL Tables";
877
+ break;
878
+ case InternalInterface.MG_ACT_SQL_WHERE_CLAUSE:
879
+ description = "";
880
+ break;
881
+ case InternalInterface.MG_ACT_RT_REFRESH_SCREEN:
882
+ description = "Screen Refresh";
883
+ break;
884
+ case InternalInterface.MG_ACT_SECRET_NAMES:
885
+ description = "Secret Names";
886
+ break;
887
+ case InternalInterface.MG_ACT_SELECT:
888
+ description = "Select";
889
+ break;
890
+ case InternalInterface.MG_ACT_EDT_MARKALL:
891
+ description = "Select All";
892
+ break;
893
+ case InternalInterface.MG_ACT_SERVERS:
894
+ description = "";
895
+ break;
896
+ case InternalInterface.MG_ACT_SERVICES:
897
+ description = "";
898
+ break;
899
+ case InternalInterface.MG_ACT_RT_EDT_NULL:
900
+ description = "Set to NULL";
901
+ break;
902
+ case InternalInterface.MG_ACT_SHELL_TO_OS:
903
+ description = "Shell to OS";
904
+ break;
905
+ case InternalInterface.MG_ACT_SHOW_EXPRESSION:
906
+ description = "Show Expression";
907
+ break;
908
+ case InternalInterface.MG_ACT_SHOW_FULL_LAYOUT:
909
+ description = "";
910
+ break;
911
+ case InternalInterface.MG_ACT_SHRINK_TREE:
912
+ description = "";
913
+ break;
914
+ case InternalInterface.MG_ACT_SORT:
915
+ description = "Sort";
916
+ break;
917
+ case InternalInterface.MG_ACT_SORT_RECORDS:
918
+ description = "Sort Records";
919
+ break;
920
+ case InternalInterface.MG_ACT_TABLE_LOCATE:
921
+ description = "Table Locate";
922
+ break;
923
+ case InternalInterface.MG_ACT_TABLE_LOCATE_NEXT:
924
+ description = "Table Locate Next";
925
+ break;
926
+ case InternalInterface.MG_ACT_TABLES:
927
+ description = "";
928
+ break;
929
+ case InternalInterface.MG_ACT_TASK_CONTROL:
930
+ description = "";
931
+ break;
932
+ case InternalInterface.MG_ACT_TASK_EVENTS:
933
+ description = "";
934
+ break;
935
+ case InternalInterface.MG_ACT_TO_VALUE:
936
+ description = "To Value";
937
+ break;
938
+ case InternalInterface.MG_ACT_TOOLKIT_RUNTIME:
939
+ description = "Toolkit/Runtime";
940
+ break;
941
+ case InternalInterface.MG_ACT_TOP:
942
+ description = "Top";
943
+ break;
944
+ case InternalInterface.MG_ACT_TYPES:
945
+ description = "";
946
+ break;
947
+ case InternalInterface.MG_ACT_EDT_UNDO:
948
+ description = "Undo Editing";
949
+ break;
950
+ case InternalInterface.MG_ACT_UNINDENT:
951
+ description = "Unindent";
952
+ break;
953
+ case InternalInterface.MG_ACT_UPDATE_LINK:
954
+ description = "";
955
+ break;
956
+ case InternalInterface.MG_ACT_USER_ACTION_1:
957
+ case InternalInterface.MG_ACT_USER_ACTION_2:
958
+ case InternalInterface.MG_ACT_USER_ACTION_3:
959
+ case InternalInterface.MG_ACT_USER_ACTION_4:
960
+ case InternalInterface.MG_ACT_USER_ACTION_5:
961
+ case InternalInterface.MG_ACT_USER_ACTION_6:
962
+ case InternalInterface.MG_ACT_USER_ACTION_7:
963
+ case InternalInterface.MG_ACT_USER_ACTION_8:
964
+ case InternalInterface.MG_ACT_USER_ACTION_9:
965
+ case InternalInterface.MG_ACT_USER_ACTION_10:
966
+ case InternalInterface.MG_ACT_USER_ACTION_11:
967
+ case InternalInterface.MG_ACT_USER_ACTION_12:
968
+ case InternalInterface.MG_ACT_USER_ACTION_13:
969
+ case InternalInterface.MG_ACT_USER_ACTION_14:
970
+ case InternalInterface.MG_ACT_USER_ACTION_15:
971
+ case InternalInterface.MG_ACT_USER_ACTION_16:
972
+ case InternalInterface.MG_ACT_USER_ACTION_17:
973
+ case InternalInterface.MG_ACT_USER_ACTION_18:
974
+ case InternalInterface.MG_ACT_USER_ACTION_19:
975
+ case InternalInterface.MG_ACT_USER_ACTION_20:
976
+ description = "User Action " + (internalEventCode - InternalInterface.MG_ACT_USER_ACTION_1 + 1);
977
+ break;
978
+ case InternalInterface.MG_ACT_USER_GROUPS:
979
+ description = "";
980
+ break;
981
+ case InternalInterface.MG_ACT_USER_IDS:
982
+ description = "User IDs";
983
+ break;
984
+ case InternalInterface.MG_ACT_V_CENTER_OF_FORM:
985
+ description = "Center of Form";
986
+ break;
987
+ case InternalInterface.MG_ACT_VERTICAL_CENTER:
988
+ description = "Vertical Center";
989
+ break;
990
+ case InternalInterface.MG_ACT_VIEW_BY_KEY:
991
+ description = "View by Key";
992
+ break;
993
+ case InternalInterface.MG_ACT_RT_REFRESH_VIEW:
994
+ description = "View Refresh";
995
+ break;
996
+ case InternalInterface.MG_ACT_VIRTUAL_VARIABLES:
997
+ description = "Variables";
998
+ break;
999
+ case InternalInterface.MG_ACT_VISUAL_CONNECTION:
1000
+ description = "Visual Connection";
1001
+ break;
1002
+ case InternalInterface.MG_ACT_HIT:
1003
+ description = "Window Hit";
1004
+ break;
1005
+ case InternalInterface.MG_ACT_WINMOVE:
1006
+ description = "Window Reposition";
1007
+ break;
1008
+ case InternalInterface.MG_ACT_WINSIZE:
1009
+ description = "Window Resize";
1010
+ break;
1011
+ case InternalInterface.MG_ACT_ZOOM:
1012
+ description = "Zoom";
1013
+ break;
1014
+ case InternalInterface.MG_ACT_LOCKING_DETAILS:
1015
+ description = "Locking Details";
1016
+ break;
1017
+ case InternalInterface.MG_ACT_LOCKING_ABORT:
1018
+ description = "Locking Abort";
1019
+ break;
1020
+ case InternalInterface.MG_ACT_LOCKING_RETRY:
1021
+ description = "Locking Retry";
1022
+ break;
1023
+ case InternalInterface.MG_ACT_CHECK_OBJECT_LIST:
1024
+ description = "Check Object List";
1025
+ break;
1026
+ case InternalInterface.MG_ACT_USERS_LIST:
1027
+ description = "Users List";
1028
+ break;
1029
+ case InternalInterface.MG_ACT_MODELS:
1030
+ description = "Models";
1031
+ break;
1032
+ case InternalInterface.MG_ACT_WEB_CLICK:
1033
+ description = "Click";
1034
+ break;
1035
+ case InternalInterface.MG_ACT_WEB_ON_DBLICK:
1036
+ description = "DblClick";
1037
+ break;
1038
+ case InternalInterface.MG_ACT_BROWSER_ESC:
1039
+ description = "Esc";
1040
+ break;
1041
+ case InternalInterface.MG_ACT_ROLLBACK:
1042
+ description = "Rollback";
1043
+ break;
1044
+ case InternalInterface.MG_ACT_EMPTY_DATAVIEW:
1045
+ description = "Empty Dataview";
1046
+ break;
1047
+ case InternalInterface.MG_ACT_CTRL_MODIFY:
1048
+ description = "Control Modify";
1049
+ break;
1050
+ case InternalInterface.MG_ACT_PRINT_DATA:
1051
+ description = "Print Data";
1052
+ break;
1053
+ case InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT:
1054
+ description = "Post Refresh by Parent";
1055
+ break;
1056
+ case InternalInterface.MG_ACT_SWITCH_TO_OFFLINE:
1057
+ description = "Switch To Offline";
1058
+ break;
1059
+ case InternalInterface.MG_ACT_UNAVAILABLE_SERVER:
1060
+ description = "Unavailable Server";
1061
+ break;
1062
+ case InternalInterface.MG_ACT_CONTEXT_MENU:
1063
+ description = "Context Menu";
1064
+ break;
1065
+ case InternalInterface.MG_ACT_ENTER_ROW_EDITING:
1066
+ description = "Enter Row Editing";
1067
+ break;
1068
+ case InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS:
1069
+ description = "No Program Execution Rights";
1070
+ break;
1071
+ case InternalInterface.MG_ACT_WEBCLIENT_ROUTE:
1072
+ description = 'Route';
1073
+ break;
1074
+ case InternalInterface.MG_ACT_COL_SORT:
1075
+ description = 'Column Sort';
1076
+ break;
1077
+ case InternalInterface.MG_ACT_ROW_DATA_CURR_PAGE:
1078
+ description = 'Get Rows';
1079
+ break;
1080
+ case InternalInterface.MG_ACT_SUBFORM_CLOSE:
1081
+ description = 'Subform Close';
1082
+ break;
1083
+ case InternalInterface.MG_ACT_SUBFORM_REFRESH:
1084
+ description = 'Subform Refresh';
1085
+ break;
1086
+ case InternalInterface.MG_ACT_SUBFORM_OPEN:
1087
+ description = 'Subform Open';
1088
+ break;
1089
+ case InternalInterface.MG_ACT_COMPUTE:
1090
+ description = 'Compute';
1091
+ break;
1092
+ case InternalInterface.MG_ACT_CACHE_NEXT:
1093
+ description = 'Get Next Data';
1094
+ break;
1095
+ case InternalInterface.MG_ACT_CACHE_PREV:
1096
+ description = 'Get Previous Data';
1097
+ break;
1098
+ case InternalInterface.MG_ACT_FETCH_DATA_CONTROL_VALUES:
1099
+ description = 'Fetch data control values';
1100
+ break;
1101
+ case InternalInterface.MG_ACT_INDEX_CHANGE:
1102
+ description = 'Index Change';
1103
+ break;
1104
+ default:
1105
+ description = "";
1106
+ break;
1107
+ }
1108
+ return description;
1109
+ }
1110
+ getUserEventType() {
1111
+ if (this.UserEvt === null)
1112
+ return ConstInterface.EVENT_TYPE_NOTINITED;
1113
+ return this.UserEvt.getType();
1114
+ }
1115
+ getSecondsOfUserEvent() {
1116
+ return this.UserEvt.getSeconds();
1117
+ }
1118
+ getUserEvent() {
1119
+ return this.UserEvt;
1120
+ }
1121
+ getKeyboardItemString() {
1122
+ let kbi = this.getKbdItm();
1123
+ if (kbi === null)
1124
+ return "";
1125
+ return kbi.ToString();
1126
+ }
1127
+ seconds2String() {
1128
+ let time = new Array(3);
1129
+ let buffer = "";
1130
+ time[0] = Math.floor(this._seconds / 3600);
1131
+ time[1] = Math.floor((this._seconds - time[0] * 3600) / 60);
1132
+ time[2] = this._seconds % 60;
1133
+ for (let i = 0; i < time.length; i++) {
1134
+ if (time[i] === 0)
1135
+ buffer += "00";
1136
+ else if (time[i] < 10)
1137
+ buffer += ("0" + time[i]);
1138
+ else
1139
+ buffer += time[i];
1140
+ if (i < time.length - 1)
1141
+ buffer += ":";
1142
+ }
1143
+ return buffer;
1144
+ }
1145
+ getParamVal(idx) {
1146
+ return this._paramVals[idx];
1147
+ }
1148
+ parseParamVal(valueStr) {
1149
+ let startOfs = 0, endOfs = 0, nLen, j;
1150
+ let sLen, sValue = null;
1151
+ for (j = 0; j < this._parameters; j++) {
1152
+ switch (this._paramAttrs[j]) {
1153
+ case StorageAttribute.SKIP:
1154
+ sValue = "";
1155
+ break;
1156
+ case StorageAttribute.ALPHA:
1157
+ case StorageAttribute.BLOB_VECTOR:
1158
+ case StorageAttribute.BLOB:
1159
+ case StorageAttribute.MEMO:
1160
+ case StorageAttribute.UNICODE:
1161
+ endOfs = startOfs + 4;
1162
+ sLen = valueStr.substr(startOfs, (endOfs) - (startOfs));
1163
+ nLen = NNumber.Parse(sLen, NumberStyles.HexNumber);
1164
+ startOfs = endOfs;
1165
+ if (AccessHelper.environment.GetDebugLevel() > 1 || this._paramAttrs[j] === StorageAttribute.ALPHA || this._paramAttrs[j] === StorageAttribute.UNICODE || this._paramAttrs[j] === StorageAttribute.MEMO) {
1166
+ if ((nLen & 0x8000) > 0) {
1167
+ nLen = (nLen & 0x7FFF);
1168
+ nLen *= 2;
1169
+ let res = new StringBuilder();
1170
+ endOfs += RecordUtils.getSpannedField(valueStr, nLen, startOfs, this._paramAttrs[j], res, true);
1171
+ valueStr = res.ToString();
1172
+ }
1173
+ else {
1174
+ endOfs = startOfs + nLen;
1175
+ sValue = valueStr.substr(startOfs, (endOfs) - (startOfs));
1176
+ }
1177
+ }
1178
+ else {
1179
+ if ((nLen & 0x8000) > 0) {
1180
+ nLen = (nLen & 0x7FFF);
1181
+ nLen = Math.floor((nLen + 2) / 3) * 4;
1182
+ let res = new StringBuilder();
1183
+ endOfs += RecordUtils.getSpannedField(valueStr, nLen, startOfs, this._paramAttrs[j], res, false);
1184
+ sValue = res.ToString();
1185
+ }
1186
+ else {
1187
+ endOfs = startOfs + Math.floor((nLen + 2) / 3) * 4;
1188
+ sValue = Base64.decode(valueStr.substr(startOfs, (endOfs) - (startOfs)));
1189
+ }
1190
+ }
1191
+ break;
1192
+ case StorageAttribute.NUMERIC:
1193
+ case StorageAttribute.DATE:
1194
+ case StorageAttribute.TIME:
1195
+ if (AccessHelper.environment.GetDebugLevel() > 1) {
1196
+ endOfs = startOfs + AccessHelper.environment.GetSignificantNumSize() * 2;
1197
+ sValue = valueStr.substr(startOfs, (endOfs) - (startOfs));
1198
+ }
1199
+ else {
1200
+ endOfs = startOfs + (Math.floor((AccessHelper.environment.GetSignificantNumSize() + 2) / 3) * 4);
1201
+ sValue = Base64.decodeToHex(valueStr.substr(startOfs, (endOfs) - (startOfs)));
1202
+ }
1203
+ break;
1204
+ case StorageAttribute.BOOLEAN:
1205
+ endOfs = startOfs + 1;
1206
+ sValue = valueStr.substr(startOfs, (endOfs) - (startOfs));
1207
+ break;
1208
+ }
1209
+ this._paramVals[j] = sValue;
1210
+ startOfs = endOfs;
1211
+ }
1212
+ return endOfs;
1213
+ }
1214
+ setParamVals(paramVals_) {
1215
+ this._paramVals = paramVals_;
1216
+ this._paramAttrs = this._paramNulls = "";
1217
+ this._parameters = 0;
1218
+ if (this._paramVals !== null) {
1219
+ this._parameters = this._paramVals.length;
1220
+ for (let i = 0; i < this._parameters; i++) {
1221
+ this._paramAttrs += StorageAttribute.ALPHA;
1222
+ this._paramNulls += "0";
1223
+ }
1224
+ }
1225
+ }
1226
+ setParamType(paramNum, fld) {
1227
+ let currType;
1228
+ let currValue;
1229
+ let newType = fld.getType();
1230
+ let pic = null;
1231
+ let sameType = false;
1232
+ if (this._paramVals != null && this.getParamNum() >= paramNum) {
1233
+ currType = this._paramAttrs[paramNum];
1234
+ sameType = (currType === newType);
1235
+ if (!sameType) {
1236
+ let charArr = null;
1237
+ currValue = this._paramVals[paramNum];
1238
+ switch (newType) {
1239
+ case StorageAttribute.ALPHA:
1240
+ case StorageAttribute.BLOB:
1241
+ case StorageAttribute.BLOB_VECTOR:
1242
+ case StorageAttribute.MEMO:
1243
+ case StorageAttribute.UNICODE:
1244
+ break;
1245
+ case StorageAttribute.NUMERIC:
1246
+ case StorageAttribute.DATE:
1247
+ case StorageAttribute.TIME:
1248
+ if (currType === StorageAttribute.ALPHA) {
1249
+ try {
1250
+ pic = PIC.buildPicture(newType, currValue, fld.getTask().getCompIdx(), true);
1251
+ this._paramVals[paramNum] = DisplayConvertor.Instance.disp2mg(currValue, pic, fld.getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
1252
+ sameType = true;
1253
+ }
1254
+ catch (exception) {
1255
+ if (exception instanceof Exception) {
1256
+ sameType = false;
1257
+ Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Event.setParamType() cannot transfer {0} to Numeric with picture {1}", currValue, (pic != null ? pic.getFormat() : "null")));
1258
+ }
1259
+ else
1260
+ throw exception;
1261
+ }
1262
+ }
1263
+ break;
1264
+ case StorageAttribute.BOOLEAN:
1265
+ if (currType === StorageAttribute.ALPHA) {
1266
+ currValue = currValue.trim();
1267
+ if (currValue === "1" || currValue.toLowerCase() === "true")
1268
+ this._paramVals[paramNum] = "1";
1269
+ else
1270
+ this._paramVals[paramNum] = "0";
1271
+ sameType = true;
1272
+ }
1273
+ break;
1274
+ }
1275
+ if (sameType) {
1276
+ charArr = NString.ToCharArray(this._paramAttrs);
1277
+ charArr[paramNum] = newType;
1278
+ this._paramAttrs = NString.FromChars(charArr);
1279
+ }
1280
+ }
1281
+ }
1282
+ return sameType;
1283
+ }
1284
+ getParamNum() {
1285
+ return this._parameters;
1286
+ }
1287
+ getParamNull(idx) {
1288
+ if ('0' === this._paramNulls.charAt(idx))
1289
+ return false;
1290
+ else
1291
+ return true;
1292
+ }
1293
+ getParamAttr(idx) {
1294
+ return this._paramAttrs.charAt(idx);
1295
+ }
1296
+ isControlHeader() {
1297
+ return this.getType() == ConstInterface.EVENT_TYPE_INTERNAL &&
1298
+ (this.getInternalCode() == InternalInterface.MG_ACT_CTRL_PREFIX ||
1299
+ this.getInternalCode() == InternalInterface.MG_ACT_CTRL_SUFFIX ||
1300
+ this.getInternalCode() == InternalInterface.MG_ACT_CTRL_VERIFICATION);
1301
+ }
1302
+ isVariableHeader() {
1303
+ return this.getType() == ConstInterface.EVENT_TYPE_INTERNAL &&
1304
+ this.getInternalCode() == InternalInterface.MG_ACT_VARIABLE;
1305
+ }
1306
+ AppendDescription(buffer) {
1307
+ switch (this._type) {
1308
+ case ConstInterface.EVENT_TYPE_INTERNAL:
1309
+ buffer.Append(Event.getInternalEvtDescription(this.InternalEvent));
1310
+ break;
1311
+ case ConstInterface.EVENT_TYPE_SYSTEM:
1312
+ buffer.Append(this.getKeyboardItemString());
1313
+ break;
1314
+ case ConstInterface.EVENT_TYPE_USER:
1315
+ buffer.Append(this.getUsrEvntDesc());
1316
+ break;
1317
+ case ConstInterface.EVENT_TYPE_USER_FUNC:
1318
+ buffer.Append(this._userDefinedFuncName);
1319
+ break;
1320
+ case ConstInterface.EVENT_TYPE_TIMER:
1321
+ buffer.Append(this.seconds2String());
1322
+ break;
1323
+ case ConstInterface.EVENT_TYPE_EXPRESSION:
1324
+ buffer.Append('ID ' + this.Exp.getId().toString());
1325
+ break;
1326
+ default:
1327
+ buffer.Append("unknown event type ");
1328
+ break;
1329
+ }
1330
+ }
1331
+ isNewInternalEvent() {
1332
+ return this.InternalEvent >= 1001 && this.InternalEvent <= 1008;
1333
+ }
1334
+ getNewInternalEventDescription() {
1335
+ let eventDesc = NString.Empty;
1336
+ switch (this.InternalEvent) {
1337
+ case InternalInterface.MG_ACT_TASK_PREFIX:
1338
+ eventDesc = ConstInterface.BRK_LEVEL_TASK_PREFIX_FM;
1339
+ break;
1340
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
1341
+ eventDesc = ConstInterface.BRK_LEVEL_TASK_SUFFIX_FM;
1342
+ break;
1343
+ case InternalInterface.MG_ACT_REC_PREFIX:
1344
+ eventDesc = ConstInterface.BRK_LEVEL_REC_PREFIX_FM;
1345
+ break;
1346
+ case InternalInterface.MG_ACT_REC_SUFFIX:
1347
+ eventDesc = ConstInterface.BRK_LEVEL_REC_SUFFIX_FM;
1348
+ break;
1349
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
1350
+ eventDesc = ConstInterface.BRK_LEVEL_CTRL_PREFIX_FM;
1351
+ break;
1352
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
1353
+ eventDesc = ConstInterface.BRK_LEVEL_CTRL_SUFFIX_FM;
1354
+ break;
1355
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
1356
+ eventDesc = ConstInterface.BRK_LEVEL_CTRL_VERIFICATION_FM;
1357
+ break;
1358
+ case InternalInterface.MG_ACT_VARIABLE:
1359
+ eventDesc = ConstInterface.BRK_LEVEL_VARIABLE_FM;
1360
+ break;
1361
+ }
1362
+ return eventDesc;
1363
+ }
1364
+ getEventType() {
1365
+ return this.isNewInternalEvent()
1366
+ ? NString.TrimEnd(this.getNewInternalEventDescription())
1367
+ : this.getEventTypeString();
1368
+ }
1369
+ getEventTypeString() {
1370
+ let eventType;
1371
+ switch (this.getType()) {
1372
+ case ConstInterface.EVENT_TYPE_INTERNAL:
1373
+ eventType = 'Internal Event:';
1374
+ break;
1375
+ case ConstInterface.EVENT_TYPE_SYSTEM:
1376
+ eventType = 'System Event:';
1377
+ break;
1378
+ case ConstInterface.EVENT_TYPE_EXPRESSION:
1379
+ eventType = 'Expression Event:';
1380
+ break;
1381
+ case ConstInterface.EVENT_TYPE_TIMER:
1382
+ eventType = 'Timer Event:';
1383
+ break;
1384
+ case ConstInterface.EVENT_TYPE_USER:
1385
+ eventType = 'User Event:';
1386
+ break;
1387
+ default:
1388
+ eventType = '';
1389
+ break;
1390
+ }
1391
+ return eventType;
1392
+ }
1393
+ setUserDefinedFuncName(name) {
1394
+ this._userDefinedFuncName = name;
1395
+ let functionNameUpper = this._userDefinedFuncName.toUpperCase();
1396
+ this._userDefinedFuncNameHashCode = HashUtils.GetHashCode(functionNameUpper);
1397
+ }
1398
+ getUserDefinedFuncName() {
1399
+ return this._userDefinedFuncName;
1400
+ }
1401
+ getUserDefinedFuncNameHashCode() {
1402
+ return this._userDefinedFuncNameHashCode;
1403
+ }
1404
+ getUserDefinedFuncRetExp() {
1405
+ return this._returnExp;
1406
+ }
1407
+ getOsCommandText() {
1408
+ return this._osCommandText;
1409
+ }
1410
+ setOsCommandText(osCommandText) {
1411
+ this._osCommandText = osCommandText;
1412
+ }
1413
+ getOsCommandWait() {
1414
+ return this._osCommandWait;
1415
+ }
1416
+ setOsCommandWait(wait) {
1417
+ this._osCommandWait = wait;
1418
+ }
1419
+ getOsCommandShow() {
1420
+ return this._osCommandShow;
1421
+ }
1422
+ setOsCommandShow(osShow) {
1423
+ this._osCommandShow = osShow;
1424
+ }
1425
+ setTimestamp() {
1426
+ this._timestamp = Event._lastTimestamp++;
1427
+ }
1428
+ getTimestamp() {
1429
+ return this._timestamp;
1430
+ }
1431
+ toString() {
1432
+ return NString.Format("{{Event: {0}}}", this.getBrkLevel());
1433
+ }
1434
+ }
1435
+ Event._lastTimestamp = 0;
1436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2V2ZW50L0V2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUVMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osU0FBUyxFQUNULEdBQUcsRUFDSCxXQUFXLEVBRVgsK0JBQStCLEVBQ2hDLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUs3QyxNQUFNLE9BQU8sS0FBSztJQWlDaEI7UUE1QkEsUUFBRyxHQUFlLElBQUksQ0FBQztRQUN2QixlQUFVLEdBQWMsU0FBUyxDQUFDLElBQUksQ0FBQztRQUN2QyxXQUFNLEdBQWlCLElBQUksQ0FBQztRQUNwQixtQkFBYyxHQUFlLENBQUMsQ0FBQztRQUMvQixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUN4QyxnQkFBVyxHQUFXLElBQUksQ0FBQztRQUMzQixnQkFBVyxHQUFXLElBQUksQ0FBQztRQUMzQixl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LEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDOztBQXQrRGMsb0JBQWMsR0FBVyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIENoYXIsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIEhhc2hVdGlscyxcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBOdW1iZXJTdHlsZXMsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBDYWxsT3NTaG93LFxyXG4gIEZvcmNlRXhpdCxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWlzYyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgQmxvYlR5cGUsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBLZXlib2FyZEl0ZW0sXHJcbiAgTW9kaWZpZXJzLFxyXG4gIFBJQyxcclxuICBSZWNvcmRVdGlscyxcclxuICBUYXNrRGVmaW5pdGlvbklkLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXJcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtFeHByZXNzaW9ufSBmcm9tIFwiLi4vZXhwL0V4cHJlc3Npb25cIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gXCIuLi9kYXRhL0ZpZWxkXCI7XHJcbmltcG9ydCB7VGFza0Jhc2V9IGZyb20gXCIuLi90YXNrcy9UYXNrQmFzZVwiO1xyXG5pbXBvcnQge0xhc3RGb2N1c2VkTWFuYWdlcn0gZnJvbSBcIi4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlclwiO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudCB0aGUgZXZlbnQgZW50aXR5XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudCB7XHJcbiAgLy8gQVRURU5USU9OICFcclxuICAvLyBhbnkgY2hhbmdlIHRvIHRoZSBtZW1iZXIgdmFyaWFibGVzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjaGFuZ2UgdG8gdGhlIENUT1IgdGhhdFxyXG4gIC8vIGdldHMgb25lIGFyZ3VtZW50IG9mIHRoZSB0eXBlICdFdmVudCcuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2xhc3RUaW1lc3RhbXA6IG51bWJlciA9IDA7IC8vIGxhc3QgdGltZXN0YW1wXHJcbiAgRXhwOiBFeHByZXNzaW9uID0gbnVsbDsgLy8gZm9yIGV4cHJlc3Npb24gZXZlbnRzIC0gdGhlIGV4cHJlc3Npb24gbnVtYmVyXHJcbiAgX2ZvcmNlRXhpdDogRm9yY2VFeGl0ID0gRm9yY2VFeGl0Lk5vbmU7IC8vIFRoZSDigJxmb3JjZSBleGl0P2lzIG9uZSBvZjogUmVjb3JkLCBDb250cm9sLCBOb25lLiBUaGlzIGF0dHJpYnV0ZSBpcyByZWxldmFudCBvbmx5IGZvciBldmVudHMgaW4gdGhlIOKAnHVzZXIgZXZlbnRzP3RhYmxlLlxyXG4gIGtiZEl0bTogS2V5Ym9hcmRJdGVtID0gbnVsbDsgLy8gZm9yIHN5c3RlbSBldmVudHNcclxuICBwcml2YXRlIF9vc0NvbW1hbmRTaG93OiBDYWxsT3NTaG93ID0gMDtcclxuICBwcml2YXRlIF9vc0NvbW1hbmRUZXh0OiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX29zQ29tbWFuZFdhaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfcGFyYW1BdHRyczogc3RyaW5nID0gbnVsbDtcclxuICBfcGFyYW1OdWxsczogc3RyaW5nID0gbnVsbDtcclxuICBfcGFyYW1WYWxzOiBzdHJpbmdbXSA9IG51bGw7XHJcbiAgX3BhcmFtZXRlcnM6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfcmV0dXJuRXhwOiBudW1iZXIgPSAwO1xyXG4gIC8qIGV4cHJlc3Npb24gbnVtYmVyIHRvIHNwZWNpZnkgdGhlIEZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlICovXHJcbiAgX3NlY29uZHM6IG51bWJlciA9IEludDMyLk1pblZhbHVlOyAvLyBmb3IgdGltZXIgZXZlbnRzXHJcbiAgX3RpbWVzdGFtcDogbnVtYmVyID0gMDtcclxuICBfdHlwZTogc3RyaW5nID0gQ2hhci5NaW5WYWx1ZTsgLy8gU3lzdGVtfEludGVybmFsfFRpbWVyfEV4cHJlc3Npb258VXNlcnxOb25lXHJcbiAgcHJpdmF0ZSBfdXNlckRlZmluZWRGdW5jTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF91c2VyRGVmaW5lZEZ1bmNOYW1lSGFzaENvZGU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfdXNlckV2dERlc2M6IHN0cmluZyA9IFwiXCI7XHJcbiAgX3VzZXJFdnRJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlOyAvLyB0aGUgaW5kZXggb2YgdGhlIHVzZXIgZXZlbnQgaW4gdGhlIHRhc2tzIHVzZXIgZXZlbnRzIHRhYmxlXHJcblxyXG4gIHByaXZhdGUgb3duZXJUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkID0gbnVsbDtcclxuICBJbnRlcm5hbEV2ZW50OiBudW1iZXIgPSAwOyAvLyBpbnRlcm5hbCBldmVudCBjb2RlXHJcbiAgUHJnRGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XHJcbiAgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBVc2VyRXZ0OiBFdmVudCA9IG51bGw7XHJcbiAgVXNlckV2dFRhc2tUYWc6IHN0cmluZyA9IG51bGw7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuSW50ZXJuYWxFdmVudCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5zZXRUaW1lc3RhbXAoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb3B5IENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcl8xKGV2dDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3R5cGUgPSBldnQuX3R5cGU7XHJcbiAgICB0aGlzLmtiZEl0bSA9IGV2dC5rYmRJdG07XHJcbiAgICB0aGlzLkludGVybmFsRXZlbnQgPSBldnQuSW50ZXJuYWxFdmVudDtcclxuICAgIHRoaXMuX3NlY29uZHMgPSBldnQuX3NlY29uZHM7XHJcbiAgICB0aGlzLkV4cCA9IGV2dC5FeHA7XHJcbiAgICB0aGlzLl9mb3JjZUV4aXQgPSBldnQuX2ZvcmNlRXhpdDtcclxuICAgIHRoaXMuVXNlckV2dCA9IGV2dC5Vc2VyRXZ0O1xyXG4gICAgdGhpcy5Vc2VyRXZ0VGFza1RhZyA9IGV2dC5Vc2VyRXZ0VGFza1RhZztcclxuICAgIHRoaXMuX3VzZXJFdnRJZHggPSBldnQuX3VzZXJFdnRJZHg7XHJcbiAgICB0aGlzLl90aW1lc3RhbXAgPSAwO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBGb3JjZUV4aXQoKTogRm9yY2VFeGl0IHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTmVlZCBwYXJ0IGlucHV0IFN0cmluZyB0byByZWxldmFudCBmb3IgdGhlIGNsYXNzIGRhdGEuXHJcbiAgLy8vICAgaW5kZXggb2YgZW5kIDxldmVudCAuLi4+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ4bWxQYXJzZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgZmlsbERhdGEoeG1sUGFyc2VyOiBYbWxQYXJzZXIsIHRhc2tSZWY6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICBsZXQgdXNlclZhbHVlOiBzdHJpbmdcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSB4bWxQYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgeG1sUGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgeG1sUGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHhtbFBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHhtbFBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVCkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlQubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoeG1sUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIGxldCByZWZVc2VyVmFsdWU6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW0odXNlclZhbHVlKTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvciwgdGFza1JlZiwgcmVmVXNlclZhbHVlKTtcclxuICAgICAgdXNlclZhbHVlID0gcmVmVXNlclZhbHVlLnZhbHVlO1xyXG5cclxuICAgICAgeG1sUGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGgpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcblxyXG4gICAgICB0aGlzLkluaXRJbm5lck9iamVjdHMoeG1sUGFyc2VyKTtcclxuXHJcbiAgICAgIGlmICh1c2VyVmFsdWUgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5Jbml0VXNlckRhdGEodGFza1JlZiwgdXNlclZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRXZlbnQuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdElubmVyT2JqZWN0cyh4bWxQYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IG5leHRUYWc6IHN0cmluZyA9IHhtbFBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICBzd2l0Y2ggKG5leHRUYWcpIHtcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0tERUZJTklUSU9OSURfRU5UUlk6XHJcbiAgICAgICAgbGV0IHhtbEJ1ZmZlcjogc3RyaW5nID0geG1sUGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgICAgICB0aGlzLkluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcik7XHJcblxyXG4gICAgICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSB4bWxQYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5UICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgeG1sUGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICB4bWxQYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5UICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSkubGVuZ3RoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmRlbGVtZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+LCB0YXNrUmVmOiBUYXNrQmFzZSwgcmVmVXNlclZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICBsZXQgbW9kaWZpZXI6IE1vZGlmaWVycyA9IE1vZGlmaWVycy5NT0RJRklFUl9OT05FO1xyXG4gICAgbGV0IGtleUNvZGU6IG51bWJlciA9IC0xO1xyXG4gICAgcmVmVXNlclZhbHVlLnZhbHVlID0gbnVsbDtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpe1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FVkVOVFRZUEU6XHJcbiAgICAgICAgICB0aGlzLl90eXBlID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICAvLyBTeXN0ZW18SW50ZXJuYWx8VXNlcnxUaW1lcnxFeHByZXNzaW9ufFJlY29tcHV0ZVxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9NT0RJRklFUjpcclxuICAgICAgICAgIG1vZGlmaWVyID0gPE1vZGlmaWVycz52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIEFsdHxDdHJsfFNoaWZ0fE5vbmVcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5URVJOQUxFVkVOVDpcclxuICAgICAgICAgIHRoaXMuSW50ZXJuYWxFdmVudCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0tFWUNPREU6XHJcbiAgICAgICAgICBrZXlDb2RlID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU0VDT05EUzpcclxuICAgICAgICAgIHRoaXMuX3NlY29uZHMgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVhQOlxyXG4gICAgICAgICAgLy8gZm9yIGV4cHJlc3Npb24gZXZlbnRzIC0gdGhlIGV4cHJlc3Npb24gbnVtYmVyXHJcbiAgICAgICAgICB0aGlzLkV4cCA9IHRhc2tSZWYuZ2V0RXhwQnlJZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRk9SQ0VfRVhJVDpcclxuICAgICAgICAgIHRoaXMuX2ZvcmNlRXhpdCA9IDxGb3JjZUV4aXQ+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREVTQzpcclxuICAgICAgICAgIHRoaXMuX3VzZXJFdnREZXNjID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QVUJMSUM6XHJcbiAgICAgICAgICB0aGlzLlB1YmxpY05hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BBUkFNUzpcclxuICAgICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QQVJfQVRUUlM6XHJcbiAgICAgICAgICB0aGlzLl9wYXJhbUF0dHJzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHBhcmFtU3RyOiBzdHJpbmcgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgdGhpcy5fcGFyYW1WYWxzID0gbmV3IEFycmF5KHRoaXMuX3BhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgLy8gcHV0IHRoZSBwYXJhbVZhbHMgaW4gcGxhY2VcclxuICAgICAgICAgIHRoaXMucGFyc2VQYXJhbVZhbChwYXJhbVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTlVMTFM6XHJcbiAgICAgICAgICB0aGlzLl9wYXJhbU51bGxzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVVNFUjpcclxuICAgICAgICAgIHJlZlVzZXJWYWx1ZS52YWx1ZSA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gVVNFUiBldmVudFxyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIHRoaXMuc2V0VXNlckRlZmluZWRGdW5jTmFtZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU1JfREVGX0ZVQ19SRVRfRVhQX0lEOlxyXG4gICAgICAgICAgdGhpcy5fcmV0dXJuRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU1JfREVGX0ZVQ19SRVRfRVhQX0FUVFI6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnQgY2xhc3MuIEluc2VydCBjYXNlIHRvIEV2ZW50LmluaXRFbGVtZW50cyBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl90eXBlID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSlcclxuICAgICAgdGhpcy5rYmRJdG0gPSBuZXcgS2V5Ym9hcmRJdGVtKGtleUNvZGUsIG1vZGlmaWVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUGVyZm9ybSB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSBmcm9tIHRoZSBcInVzZXJcIiBhdHRyaWJ1dGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBJbml0VXNlckRhdGEodGFza1JlZjogVGFza0Jhc2UsIHVzZXJWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgY29tbWE6IG51bWJlciA9IHVzZXJWYWx1ZS5pbmRleE9mKFwiLFwiKTtcclxuICAgIGlmIChjb21tYSA+IC0xKSB7XHJcbiAgICAgIGxldCB1ZVRhc2tJZDogc3RyaW5nID0gdXNlclZhbHVlLnN1YnN0cigwLCBjb21tYSk7XHJcbiAgICAgIGlmICh0YXNrUmVmICE9PSBudWxsKVxyXG4gICAgICAgIHVlVGFza0lkID0gdGFza1JlZi5UYXNrU2VydmljZS5HZXRFdmVudFRhc2tJZCggdWVUYXNrSWQpO1xyXG5cclxuICAgICAgbGV0IHVlVGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldFRhc2tCeUlEKHVlVGFza0lkKTtcclxuXHJcbiAgICAgIGxldCB1ZUlkeDogbnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh1c2VyVmFsdWUuc3Vic3RyKGNvbW1hICsgMSkpO1xyXG5cclxuICAgICAgaWYgKHVlVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuVXNlckV2dCA9IHVlVGFzay5nZXRVc2VyRXZlbnQodWVJZHgpO1xyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnQgPT09IG51bGwpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEV2ZW50LmZpbGxEYXRhKCk6IHVzZXIgZXZlbnQgbm90IGZvdW5kLiB0YXNrIGlkID0gXCIgKyB1ZVRhc2tJZCArXHJcbiAgICAgICAgICAgIFwiLCB1c2VyIGV2ZW50IGluZGV4ID0gXCIgKyB1ZUlkeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuVXNlckV2dFRhc2tUYWcgPSB1ZVRhc2tJZDtcclxuICAgICAgICB0aGlzLl91c2VyRXZ0SWR4ID0gdWVJZHg7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhlIHRhc2sgaGFzbid0IGJlZW4gZm91bmQsIGl0IG5vdCBwYXJzZWQsIHlldFxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLlVzZXJFdnRUYXNrVGFnID0gdWVUYXNrSWQ7XHJcbiAgICAgICAgdGhpcy5fdXNlckV2dElkeCA9IHVlSWR4O1xyXG4gICAgICAgIHRoaXMuVXNlckV2dCA9IG51bGw7IC8vIGNhbiBub3QgYmUgaW5pdGlhbGl6ZWQgb24gdGhpcyBzdGVwXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdFRhc2tEZWZpbml0aW9uSWQoeG1sQnVmZmVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBoYW5kbGVyOiBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyID0gbmV3IFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIodGhpcy5TZXRUYXNrRGVmaW5pdGlvbklkKTtcclxuICAgIGhhbmRsZXIucGFyc2UoeG1sQnVmZmVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FsbGJhY2sgZm9yIHRoZSBzYXggcGFyc2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrRGVmaW5pdGlvbklkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ4bWxJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVmYXVsdFRhZ0xpc3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0VGFza0RlZmluaXRpb25JZCh0YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogdm9pZCB7XHJcbiAgICB0aGlzLm93bmVyVGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmluZCB0YXNrIGZvciBVc2VyIEV2ZW50IGlmIGl0IHdhcyBub3QgZm91bmQgZHVyaW5nIHBhcnNpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbmRVc2VyRXZlbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuVXNlckV2dCA9PT0gbnVsbCkge1xyXG4gICAgICBsZXQgdWVUYXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0VGFza0J5SUQodGhpcy5Vc2VyRXZ0VGFza1RhZyk7XHJcbiAgICAgIGlmICh1ZVRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0ID0gdWVUYXNrLmdldFVzZXJFdmVudCh0aGlzLl91c2VyRXZ0SWR4KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLlVzZXJFdnQgPT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKE5TdHJpbmcuRm9ybWF0KFwiaW4gRXZlbnQuZmluZFVzZXJFdmVudCgpOiB1c2VyIGV2ZW50IG5vdCBmb3VuZC4gdGFzayBpZCA9IHswfSBkb2Vzbid0IGV4aXN0XCIsIHRoaXMuVXNlckV2dFRhc2tUYWcpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcGFyZSB0aGlzIGV2ZW50IHRvIGFub3RoZXIgLSByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGV2ZW50cyBhcmUgaWRlbnRpY2FsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlcXVhbHMoZXZ0OiBFdmVudCk6IGJvb2xlYW57XHJcbiAgICBsZXQgYkVxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gY29tcGFyZSByZWZlcmVuY2VzXHJcbiAgICBpZiAodGhpcyA9PT0gZXZ0KVxyXG4gICAgICBiRXF1YWwgPSB0cnVlO1xyXG4gICAgLy8gZG8gc2hhbGxvdyBjb21wYXJpc2lvblxyXG4gICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gZXZ0Ll90eXBlKSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU06XHJcbiAgICAgICAgICBiRXF1YWwgPSB0aGlzLmtiZEl0bS5lcXVhbHMoZXZ0LmtiZEl0bSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMOlxyXG4gICAgICAgICAgYkVxdWFsID0gKHRoaXMuSW50ZXJuYWxFdmVudCA9PT0gZXZ0LkludGVybmFsRXZlbnQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUjpcclxuICAgICAgICAgIGJFcXVhbCA9ICh0aGlzLl9zZWNvbmRzID09PSBldnQuX3NlY29uZHMpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OOlxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9QVUJMSUM6XHJcbiAgICAgICAgICBiRXF1YWwgPSAodGhpcy5FeHAgPT09IGV2dC5FeHApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSOlxyXG4gICAgICAgICAgYkVxdWFsID0gKHRoaXMuVXNlckV2dCA9PT0gZXZ0LlVzZXJFdnQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSX0ZVTkM6XHJcbiAgICAgICAgICBpZiAodGhpcy5fdXNlckRlZmluZWRGdW5jTmFtZUhhc2hDb2RlID09PSBldnQuZ2V0VXNlckRlZmluZWRGdW5jTmFtZUhhc2hDb2RlKCkpIHtcclxuICAgICAgICAgICAgaWYgKE5TdHJpbmcuRXF1YWxzKGV2dC5nZXRVc2VyRGVmaW5lZEZ1bmNOYW1lKCksIHRoaXMuX3VzZXJEZWZpbmVkRnVuY05hbWUsIHRydWUpKVxyXG4gICAgICAgICAgICAgIGJFcXVhbCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJFcXVhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgaW50ZXJuYWwgZXZlbnRzLCBjb21wYXJlIHRoZSBpbnRlcm5hbCBuYW1lc1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfUFVCTElDIHx8IGV2dC5fdHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9QVUJMSUMpIHtcclxuICAgICAgbGV0IG5hbWUxOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgbmFtZTI6IFN0cmluZyA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLl90eXBlICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgZXZ0Ll90eXBlICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpXHJcbiAgICAgICAgYkVxdWFsID0gZmFsc2U7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfUFVCTElDKSB7XHJcbiAgICAgICAgbmFtZTEgPSB0aGlzLlB1YmxpY05hbWU7XHJcbiAgICAgICAgbmFtZTIgPSBldnQuZ2V0VXNlckV2ZW50KCkuUHVibGljTmFtZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBuYW1lMSA9IGV2dC5QdWJsaWNOYW1lO1xyXG4gICAgICAgIG5hbWUyID0gdGhpcy5nZXRVc2VyRXZlbnQoKS5QdWJsaWNOYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuYW1lMSA9PT0gbnVsbCB8fCBuYW1lMiA9PT0gbnVsbClcclxuICAgICAgICBiRXF1YWwgPSBmYWxzZTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJFcXVhbCA9IChuYW1lMSA9PT0gbmFtZTIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBldnQuX3R5cGUgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKSB7XHJcbiAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0Q3VyclRhc2soKSAhPT0gbnVsbCAmJiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TWF0Y2hpbmdBY3Rpb24oIGV2dC5nZXRLYmRJdG0oKSkpID09PSB0aGlzLmdldEludGVybmFsQ29kZSgpKVxyXG4gICAgICAgIGJFcXVhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLl90eXBlID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgZXZ0Ll90eXBlICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpIHtcclxuICAgICAgLy8gYmVmb3JlIHVzaW5nIHRoZSB1c2VyIGV2ZW50LCBjaGVjayB0aGF0IGl0IGlzIHZhbGlkXHJcbiAgICAgIHRoaXMuZmluZFVzZXJFdmVudCgpO1xyXG5cclxuICAgICAgLy8gaWYgb25lIGV2ZW50IG9mIHRoZSB0d28gaXMgYSB1c2VyIGV2ZW50IGFuZCB0aGUgb3RoZXIgaXNuJ3QgdGhlblxyXG4gICAgICAvLyBjb21wYXJlIHRoZSB0cmlnZ2VyIG9mIHRoZSB1c2VyIGV2ZW50IHRvIHRoZSBub24tdXNlciBldmVudFxyXG4gICAgICBiRXF1YWwgPSAgdGhpcy5Vc2VyRXZ0LmVxdWFscyhldnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJFcXVhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGludGVybmFsIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHNldFB1YmxpY05hbWUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBGb3IgYSBydW50aW1lIGludGVybmFsIGV2ZW50IC0gY2FsY3VsYXRlIHRoZSBpbnRlcm5hbCBuYW1lLlxyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfUFVCTElDICYmIHRoaXMuRXhwICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUHVibGljTmFtZSA9IChhd2FpdCB0aGlzLkV4cC5ldmFsdWF0ZVdpdGhSZXNMZW5ndGgoMjU1KSkubWdWYWw7XHJcbiAgICAgIGlmICh0aGlzLlB1YmxpY05hbWUgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5QdWJsaWNOYW1lID0gU3RyVXRpbC5ydHJpbSh0aGlzLlB1YmxpY05hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhbiBJbnRlcm5hbCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgc2V0SW50ZXJuYWwoY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl90eXBlID0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTDtcclxuICAgIHRoaXMuSW50ZXJuYWxFdmVudCA9IGNvZGU7XHJcblxyXG4gICAgLy8gTUdfQUNUX0hJVC9NR19BQ1RfQ1RSTF9ISVQgYXJlIGNhdXNlZCBieSBtb3VzZSBjbGljay4gSW4gdGhpcyBjYXNlXHJcbiAgICAvLyB0aW1lIG9mIGxhc3QgdXNlciBhY3Rpb24gZm9yIElETEUgZnVuY3Rpb24gc2hvdWxkIGJlIHJlLWV2YWx1YXRlZC5cclxuICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSElUIHx8IGNvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVClcclxuICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLkxhc3RBY3Rpb25UaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYW4gRXhwcmVzc2lvbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBSZWZcIj5hIHJlZmVyZW5jZSB0byB0aGUgZXhwcmVzc2lvbiBvYmplY3QgPC9wYXJhbT5cclxuICBzZXRFeHByZXNzaW9uKGV4cFJlZjogRXhwcmVzc2lvbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdHlwZSA9IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTjtcclxuICAgIHRoaXMuRXhwID0gZXhwUmVmO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBFeHByZXNzaW9uIG9mIHRoZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHtcclxuICAgIHJldHVybiB0aGlzLkV4cDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgVXNlckV2ZW50IGRlc2NyaXB0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFVzckV2bnREZXNjKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRoaXMuVXNlckV2dCAhPT0gbnVsbCkgPyB0aGlzLlVzZXJFdnQuX3VzZXJFdnREZXNjIDogdGhpcy5fdXNlckV2dERlc2M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgU3lzdGVtIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtleWJvYXJkSXRlbVwiPnRoZSBrZXlib2FyZCBpdGVtIG9iamVjdCA8L3BhcmFtPlxyXG4gIHNldFN5c3RlbShrZXlib2FyZEl0ZW06IEtleWJvYXJkSXRlbSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHlwZSA9IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNO1xyXG4gICAgdGhpcy5rYmRJdG0gPSBrZXlib2FyZEl0ZW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgU3lzdGVtIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtleWJvYXJkSXRlbVwiPnRoZSBrZXlib2FyZCBpdGVtIG9iamVjdCA8L3BhcmFtPlxyXG4gIHNldEtleWJvYXJkSXRlbShrZXlib2FyZEl0ZW06IEtleWJvYXJkSXRlbSk6IHZvaWQge1xyXG4gICAgdGhpcy5rYmRJdG0gPSBrZXlib2FyZEl0ZW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHR5cGUgcmV0dXJucyBTeXN0ZW18SW50ZXJuYWx8VXNlcnxUaW1lcnxFeHByZXNzaW9ufFJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHR5cGUgcmVjZWl2ZXMgU3lzdGVtfEludGVybmFsfFVzZXJ8VGltZXJ8RXhwcmVzc2lvbnxSZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFR5cGUoYVR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHlwZSA9IGFUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBpbnRlcm5hbCBldmVudCBjb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGludCBpcyB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZSA8L3JldHVybnM+XHJcbiAgZ2V0SW50ZXJuYWxDb2RlKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTClcclxuICAgICAgcmV0dXJuIHRoaXMuSW50ZXJuYWxFdmVudDtcclxuICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGtleWJvYXJkIGl0ZW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEtiZEl0bSgpOiBLZXlib2FyZEl0ZW0ge1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKVxyXG4gICAgICByZXR1cm4gdGhpcy5rYmRJdG07XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGtleWJvYXJkIGl0ZW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEtiZEl0bUFsd2F5cygpOiBLZXlib2FyZEl0ZW0ge1xyXG4gICAgcmV0dXJuIHRoaXMua2JkSXRtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBmb3Igbm9uIGRhdGEgZXZlbnRzIG9yIGRhdGEgZXZlbnRzIHdoaWNoIHRoZWlyIGV4cHJlc3Npb25cclxuICAvLy8gICBldmFsdWF0ZXMgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZGF0YUV2ZW50SXNUcnVlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGlmICh0aGlzLl90eXBlICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiZcclxuICAgICAgISh0aGlzLl90eXBlID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUilcclxuICAgICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGF3YWl0IHRoaXMuRXhwLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgoU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSk7XHJcbiAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4oYXdhaXQgdGhpcy5Vc2VyRXZ0LmdldEV4cHJlc3Npb24oKS5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbnVtYmVyIG9mIHNlY29uZHMgKGZvciB0aW1lciBldmVudHMpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTZWNvbmRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kcztcclxuICB9XHJcblxyXG4gIGdldEJya0xldmVsKCk6IHN0cmluZztcclxuICBnZXRCcmtMZXZlbChmbG93TW9uaXRvcjogYm9vbGVhbik6IHN0cmluZztcclxuICBnZXRCcmtMZXZlbChmbG93TW9uaXRvcj86IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnJrTGV2ZWxfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QnJrTGV2ZWxfMShmbG93TW9uaXRvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBicmVhayBsZXZlbCBvZiBFdmVudCBub3QgZm9yIEZsb3cgTW9uaXRvcmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRCcmtMZXZlbF8wKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRCcmtMZXZlbChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBicmVhayBsZXZlbCBvZiBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbG93TW9uaXRvclwiPmlzIGl0IG5lZWRlZCBmb3IgRmxvdyBNb25pdG9yaW5nIHVzYWdlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRCcmtMZXZlbF8xKGZsb3dNb25pdG9yOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBsZXZlbDogc3RyaW5nID0gXCJcIjtcclxuICAgIHN3aXRjaCAodGhpcy5fdHlwZSkge1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUw6XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLkludGVybmFsRXZlbnQpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBsZXZlbCA9IGZsb3dNb25pdG9yID8gQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1RBU0tfUFJFRklYX0ZNIDogQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1RBU0tfUFJFRklYO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgICAgbGV2ZWwgPSBmbG93TW9uaXRvciA/IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9UQVNLX1NVRkZJWF9GTSA6IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9UQVNLX1NVRkZJWDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgbGV2ZWwgPSBmbG93TW9uaXRvciA/IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfUFJFRklYX0ZNIDogQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1JFQ19QUkVGSVg7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAgIGxldmVsID0gZmxvd01vbml0b3IgPyBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfUkVDX1NVRkZJWF9GTSA6IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfU1VGRklYO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgbGV2ZWwgPSBmbG93TW9uaXRvciA/IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9DVFJMX1BSRUZJWF9GTSA6IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9DVFJMX1BSRUZJWCArICdfJztcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAgIGxldmVsID0gZmxvd01vbml0b3IgPyBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfQ1RSTF9TVUZGSVhfRk0gOiBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfQ1RSTF9TVUZGSVggKyAnXyc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OOlxyXG4gICAgICAgICAgICBsZXZlbCA9IGZsb3dNb25pdG9yID8gQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX0NUUkxfVkVSSUZJQ0FUSU9OX0ZNIDogQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX0NUUkxfVkVSSUZJQ0FUSU9OICsgJ18nO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgICAgbGV2ZWwgPSBmbG93TW9uaXRvciA/IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9WQVJJQUJMRV9GTSA6IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9WQVJJQUJMRSArICdfJztcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgbGV2ZWwgPSBmbG93TW9uaXRvciA/IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9IQU5ETEVSX0lOVEVSTkFMX0ZNIDogQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX0hBTkRMRVJfSU5URVJOQUwgKyAnXyc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXZlbCArPSBFdmVudC5nZXRJbnRlcm5hbEV2dERlc2NyaXB0aW9uKHRoaXMuSW50ZXJuYWxFdmVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNOlxyXG4gICAgICAgIGxldmVsID0gZmxvd01vbml0b3IgPyBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9TWVNURU1fRk0gOiBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9TWVNURU0gKyAnXyc7XHJcbiAgICAgICAgbGV2ZWwgKz0gdGhpcy5nZXRLZXlib2FyZEl0ZW1TdHJpbmcoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUjpcclxuICAgICAgICBsZXZlbCA9IGZsb3dNb25pdG9yID8gQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX0hBTkRMRVJfVElNRVJfRk0gKyAnICcgKyB0aGlzLnNlY29uZHMyU3RyaW5nKCkgOiBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9USU1FUiArICdfJyArIHRoaXMuc2Vjb25kczJTdHJpbmcoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OOlxyXG4gICAgICAgIGxldmVsID0gZmxvd01vbml0b3IgPyBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9FWFBSRVNTSU9OX0ZNIDogQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX0hBTkRMRVJfRVhQUkVTU0lPTiArICdfJyArIHRoaXMuRXhwLmdldElkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUjpcclxuICAgICAgICBsZXZlbCA9IChmbG93TW9uaXRvciA/IChDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9VU0VSX0ZNICsgXCI6IFwiKSA6IChDb25zdEludGVyZmFjZS5CUktfTEVWRUxfSEFORExFUl9VU0VSICsgJ18nKSkgKyAodGhpcy5Vc2VyRXZ0ICE9IG51bGwgPyB0aGlzLlVzZXJFdnQuX3VzZXJFdnREZXNjIDogdGhpcy5fdXNlckV2dERlc2MpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVJfRlVOQzpcclxuICAgICAgICBsZXZlbCA9IChmbG93TW9uaXRvciA/IChDb25zdEludGVyZmFjZS5CUktfTEVWRUxfVVNFUl9GVU5DVElPTl9GTSArICc6JykgOiAoQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1VTRVJfRlVOQ1RJT04gKyAnXycpKSArIHRoaXMuX3VzZXJEZWZpbmVkRnVuY05hbWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJuYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gZGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50IDwvcmV0dXJucz5cclxuICBwdWJsaWMgc3RhdGljIGdldEludGVybmFsRXZ0RGVzY3JpcHRpb24oaW50ZXJuYWxFdmVudENvZGU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZztcclxuICAgIHN3aXRjaCAoaW50ZXJuYWxFdmVudENvZGUpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUJPVVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkFib3V0IE1hZ2ljXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RJT05fTElTVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQWN0aW9uIExpc3RcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0FERF9IWVBFUkxJTks6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUxJR05fTEVGVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTGVmdFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUxJR05fUklHSFQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlJpZ2h0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BUFBMX1BST1BFUlRJRVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQVBQTElDQVRJT05TOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJBcHBsaWNhdGlvbnNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0FQUExJQ0FUSU9OU19MSVNUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJBcHBsaWNhdGlvbnMgTGlzdFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQVRUQUNIX1RPX1RBQkxFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJBdHRhY2ggdG8gVGFibGVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0FVVEhPUklaRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQXV0aG9yaXplXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfQkVHRkxEOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJCZWdpbiBGaWVsZFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURUX0JFR0ZPUk06XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkJlZ2luIEZvcm1cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9CRUdMSU5FOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJCZWdpbiBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfQkVHTlhUTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQmVnaW4gTmV4dCBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfQkVHUEFHRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQmVnaW4gUGFnZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR0xJTkU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkJlZ2luIFJvd1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1BBR0U6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkJlZ2luIFNjcmVlblwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQmVnaW4gdGFibGVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JPVFRPTTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQm90dG9tXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVUxMRVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkJ1bGxldFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJCdXR0b24gUHJlc3NcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ2FuY2VsXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJRdWl0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DRU5URVI6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNlbnRlclwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0hFQ0tfU1lOVEFYOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDaGVjayBTeW50YXhcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NIRUNLX1RPX0VORDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ2hlY2sgdG8gRW5kXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTEVBUl9URU1QTEFURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ2xlYXIgVGVtcGxhdGVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMRUFSX1ZBTFVFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDbGVhciBWYWx1ZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNsb3NlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RfQ0xPU0VfQVBQTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ2xvc2UgQXBwbGljYXRpb25cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT01NVU5JQ0FUSU9OUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ29tbXVuaWNhdGlvbnNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTVBPTkVOVFM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNvbXBvbmVudHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDb250cm9sIEhpdFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09OVFJPTF9OQU1FX0xJU1Q6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNvbnRyb2wgTmFtZSBMaXN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTElQX0NPUFk6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNvcHlcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPUFlfTEFZT1VUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDb3B5IExheW91dFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09QWV9TVUJUUkVFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDb3B5IFN1YnRyZWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNyZWF0ZSBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDcmVhdGUgTGluZSBBYm92ZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFQVRFX1BBUkVOVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ3JlYXRlIFBhcmVudFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ3JlYXRlIFJlY29yZHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUFURV9TVUJUQVNLOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDcmVhdGUgU3VidGFza1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JPU1NfUkVGRVJFTkNFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDcm9zcyBSZWZlcmVuY2VcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NVVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ3V0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EQl9UQUJMRVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREJNUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiREJNU1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRERGX01BS0U6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRERiBNYWtlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EQVRBQkFTRVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRhdGFiYXNlc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVGQVVMVF9MQVlPVVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRlZmF1bHQgTGF5b3V0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUZJTkVfRVhQUkVTU0lPTjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRGVmaW5lIEV4cHJlc3Npb25cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9ERUxDVVJDSDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ3VycmVudCBDaGFyXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfREVMUFJWQ0g6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByZXZpb3VzIENoYXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTEVURV9IWVBFUkxJTks6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRlbGV0ZSBIeXBlcmxpbmtcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRlbGV0ZSBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxFVEVfU1VCVFJFRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRGVsZXRlIFN1YnRyZWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0NPUFlGTEQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRpdHRvXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNQTEFZX1JFRlJFU0g6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkRpc3BsYXkgUmVmcmVzaFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURJVF9NQUlOX0ZPUk06XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkVkaXQgTWFpbiBGb3JtXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfRU5ERkxEOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFbmQgRmllbGRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9FTkRGT1JNOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFbmQgRm9ybVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURUX0VORExJTkU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkVuZCBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfRU5EUEFHRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRW5kIFBhZ2VcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRMSU5FOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFbmQgUm93XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EUEFHRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRW5kIFNjcmVlblwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRW5kIFRhYmxlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlZJUk9OTUVOVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRW52aXJvbm1lbnRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYRUNVVEVfUFJPR1JBTTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRXhlY3V0ZSBQcm9ncmFtXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWEVDVVRFX1JFUE9SVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRXhlY3V0ZSBSZXBvcnRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkV4aXRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFeGl0IFN5c3RlbVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhQT1JUX0lNUE9SVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRXhwb3J0L0ltcG9ydFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhQUkVTU0lPTl9SVUxFUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRXhwcmVzc2lvbiBydWxlc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhURVJOQUxfRURJVE9SOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFeHRlcm5hbCBFZGl0b3JcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWFRfRVZFTlQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkV4dGVybmFsIEV2ZW50XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GT1JNUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRm9ybXNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZST01fVkFMVUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkZyb20gVmFsdWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZVTkNUSU9OX0xJU1Q6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkZ1bmN0aW9uIExpc3RcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0dFTkVSQVRFX0ZPUk06XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkdlbmVyYXRlIEZvcm1cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0dFTkVSQVRFX1BST0dSQU06XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkdlbmVyYXRlIFByb2dyYW1cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0dPX1RPX1RPUDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiR28gdG8gVG9wXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9IX0NFTlRFUl9PRl9GT1JNOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hUTUxfU1RZTEVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJIVE1MIFN0eWxlc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSEVMUDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiSGVscFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSEVMUF9TQ1JFRU5TOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJIZWxwIFNjcmVlbnNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hPUklaX0NFTlRFUjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiSG9yaXouIENlbnRlclwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSV9PX0ZJTEVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJUYWJsZXNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVOVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiSW5kZW50XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTlNFUlRfT0JKRUNUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJJbnNlcnQgT2JqZWN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9KVU1QX1RPX1JPVzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiSnVtcCB0byBSb3dcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0tFWUJPQVJEX0xJU1Q6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIktleWJvYXJkIExpc3RcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0tFWUJPQVJEX01BUFBJTkc6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIktleWJvYXJkIE1hcHBpbmdcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0xBTkdVQUdFUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwibGFuZ3VhZ2VzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNIOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJMb2NhdGUgTmV4dFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0xPQ0FURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTG9jYXRlIGEgUmVjb3JkXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9MT0dJQ0FMUE5BTUVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0xPR09OOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJMb2dvblwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNJTkdfSEVMUDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiSGVscCBUb3BpY3NcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9NQVJLTlhUQ0g6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1hcmsgTmV4dCBDaGFyXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9NQVJLX05FWFRfTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTWFyayBOZXh0IExpbmUgTUxFXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTUFSS1BSVkNIOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJNYXJrIFByZXZpb3VzIENoYXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9NQVJLUFJWTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTWFyayBQcmV2aW91cyBMaW5lIE1MRVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTUFSS19TVUJUUkVFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9NQVJLVE9CRUc6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1hcmsgVG8gQmVnaW5uaW5nXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTUFSS1RPRU5EOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJNYXJrIFRvIEVuZFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTUFYSU1VTV9IRUlHSFQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1heGltdW0gSGVpZ2h0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9NQVhJTVVNX1dJRFRIOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJNYXhpbXVtIFdpZHRoXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9NRU5VX0JBUjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTWVudSBCYXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX01FTlVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX01JTklNVU1fSEVJR0hUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJNaW5pbXVtIEhlaWdodFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTUlOSU1VTV9XSURUSDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTWluaW11bSBXaWR0aFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTW9kaWZ5IFJlY29yZHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX01PTklUT1JfREVCVUdHRVI6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1vbml0b3IvRGVidWdnZXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX01PVkVfRU5UUlk6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1vdmUgRW50cnlcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX01PVkVfU1VCVFJFRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTW92ZSBTdWJ0cmVlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OVUxMX1NFVFRJTkdTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJOVUxMIFNldHRpbmdzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTlhUQ0hBUjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTmV4dCBDaGFyXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTlhUTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTmV4dCBMaW5lXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTlhUUEFHRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTmV4dCBQYWdlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTmV4dCBSb3dcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJOZXh0IFNjcmVlblwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURUX05YVFRBQjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTmV4dCBUYWJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9OWFRXT1JEOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJOZXh0IFdvcmRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PUk1BTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTm9ybWFsXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiT0tcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX09MRTI6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk9MRTJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX09QRU5fQVBQTElDQVRJT046XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk9wZW4gQXBwbGljYXRpb25cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX09WRVJXUklURV9FTlRSWTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiT3ZlcndyaXRlIEVudHJ5XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PVkVSV1JJVEVfU1VCVFJFRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiT3ZlcndyaXRlIFN1YnRyZWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BQRDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUFBEXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QQUdFX0ZPT1RFUjpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUGFnZSBGb290ZXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BBR0VfSEVBREVSOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQYWdlIEhlYWRlclwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xJUF9QQVNURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUGFzdGVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BBU1RFX0xJTks6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlBhc3RlIExpbmtcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BBU1RFX1NVQlRSRUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlBhc3RlIFN1YnRyZWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9QUlZDSEFSOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQcmV2aW91cyBDaGFyXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfUFJWTElORTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUHJldmlvdXMgTGluZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURUX1BSVlBBR0U6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByZXZpb3VzIFBhZ2VcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQcmV2aW91cyBSb3dcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQcmV2aW91cyBTY3JlZW5cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9QUlZUQUI6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByZXZpb3VzIFRhYlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRURUX1BSVldPUkQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByZXZpb3VzIFdvcmRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0FUVFJJQlVURVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByaW50IEF0dHJpYnV0ZXNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5URVJfU0VUVVA6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByaW50ZXIgU2V0dXBcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5URVJTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQcmludGVyc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUFJPR1JBTVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByb2dyYW1zXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QUk9QRVJUSUVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJQcm9wZXJ0aWVzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlk6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlF1ZXJ5IFJlY29yZHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19SQU5HRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUmFuZ2Ugb2YgUmVjb3Jkc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlJlY29yZCBGbHVzaFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVESVJFQ1RfRklMRVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlJlZGlyZWN0IEZpbGVzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRURSQVdfTEFZT1VUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFUEVBVF9FTlRSWTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUmVwZWF0IEVudHJ5XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRVBFQVRfU1VCVFJFRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUmVwZWF0IFN1YnRyZWVcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFUE9SVF9HRU5FUkFUT1I6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVTVE9SRV9ERUZBVUxUUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiUmVzdG9yZSBEZWZhdWx0c1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVUVVJOX1RPX1RSRUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUklHSFQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlJpZ2h0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SSUdIVFM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUklHSFRTX0xJU1Q6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlJpZ2h0cyBMaXN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TUUxfQVNTSVNUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTUUwgQXNzaXN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TUUxfQ09MVU1OUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU1FMIENvbHVtbnNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NRTF9DT01NQU5EOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTUUwgQ29tbWFuZFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1FMX0ZMSVBfREVTQzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU1FMIEZsaXAgRGVzYy5cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NRTF9LRVlXT1JEUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU1FMIEtleXdvcmRzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TUUxfT1BFUkFUT1JTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTUUwgT3BlcmF0b3JzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TUUxfVEFCTEVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTUUwgVGFibGVzXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TUUxfV0hFUkVfQ0xBVVNFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTY3JlZW4gUmVmcmVzaFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VDUkVUX05BTUVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTZWNyZXQgTmFtZXNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU2VsZWN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FRFRfTUFSS0FMTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU2VsZWN0IEFsbFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VSVkVSUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVJWSUNFUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU2V0IHRvIE5VTExcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NIRUxMX1RPX09TOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTaGVsbCB0byBPU1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0hPV19FWFBSRVNTSU9OOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTaG93IEV4cHJlc3Npb25cIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NIT1dfRlVMTF9MQVlPVVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0hSSU5LX1RSRUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiU29ydFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVF9SRUNPUkRTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTb3J0IFJlY29yZHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBQkxFX0xPQ0FURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiVGFibGUgTG9jYXRlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQUJMRV9MT0NBVEVfTkVYVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiVGFibGUgTG9jYXRlIE5leHRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBQkxFUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX0NPTlRST0w6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19FVkVOVFM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9fVkFMVUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlRvIFZhbHVlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT09MS0lUX1JVTlRJTUU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlRvb2xraXQvUnVudGltZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9QOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJUb3BcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RZUEVTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VEVF9VTkRPOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJVbmRvIEVkaXRpbmdcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1VOSU5ERU5UOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJVbmluZGVudFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVBEQVRFX0xJTks6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMjpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMzpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fNDpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fNTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fNjpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fNzpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fODpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fOTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMTA6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1VTRVJfQUNUSU9OXzExOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0FDVElPTl8xMjpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMTM6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1VTRVJfQUNUSU9OXzE0OlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0FDVElPTl8xNTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMTY6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1VTRVJfQUNUSU9OXzE3OlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0FDVElPTl8xODpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVVNFUl9BQ1RJT05fMTk6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1VTRVJfQUNUSU9OXzIwOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJVc2VyIEFjdGlvbiBcIiArIChpbnRlcm5hbEV2ZW50Q29kZSAtIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0FDVElPTl8xICsgMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0dST1VQUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSX0lEUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiVXNlciBJRHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZfQ0VOVEVSX09GX0ZPUk06XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNlbnRlciBvZiBGb3JtXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WRVJUSUNBTF9DRU5URVI6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlZlcnRpY2FsIENlbnRlclwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklFV19CWV9LRVk6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlZpZXcgYnkgS2V5XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVc6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlZpZXcgUmVmcmVzaFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklSVFVBTF9WQVJJQUJMRVM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlZhcmlhYmxlc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklTVUFMX0NPTk5FQ1RJT046XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlZpc3VhbCBDb25uZWN0aW9uXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ISVQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIldpbmRvdyBIaXRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dJTk1PVkU6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIldpbmRvdyBSZXBvc2l0aW9uXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XSU5TSVpFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJXaW5kb3cgUmVzaXplXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJab29tXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9MT0NLSU5HX0RFVEFJTFM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkxvY2tpbmcgRGV0YWlsc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTE9DS0lOR19BQk9SVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTG9ja2luZyBBYm9ydFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTE9DS0lOR19SRVRSWTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiTG9ja2luZyBSZXRyeVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0hFQ0tfT0JKRUNUX0xJU1Q6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkNoZWNrIE9iamVjdCBMaXN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9VU0VSU19MSVNUOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJVc2VycyBMaXN0XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9NT0RFTFM6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIk1vZGVsc1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX0NMSUNLOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJDbGlja1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRGJsQ2xpY2tcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JST1dTRVJfRVNDOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJFc2NcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJSb2xsYmFja1wiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVc6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIkVtcHR5IERhdGF2aWV3XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ29udHJvbCBNb2RpZnlcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0RBVEE6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlByaW50IERhdGFcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQ6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBcIlBvc3QgUmVmcmVzaCBieSBQYXJlbnRcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NXSVRDSF9UT19PRkZMSU5FOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJTd2l0Y2ggVG8gT2ZmbGluZVwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVU5BVkFJTEFCTEVfU0VSVkVSOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJVbmF2YWlsYWJsZSBTZXJ2ZXJcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTlRFWFRfTUVOVTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiQ29udGV4dCBNZW51XCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlRFUl9ST1dfRURJVElORzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiRW50ZXIgUm93IEVkaXRpbmdcIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9fUFJPR19FWEVfUklHSFRTOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gXCJObyBQcm9ncmFtIEV4ZWN1dGlvbiBSaWdodHNcIjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdSb3V0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdDb2x1bW4gU29ydCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST1dfREFUQV9DVVJSX1BBR0U6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnR2V0IFJvd3MnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9DTE9TRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdTdWJmb3JtIENsb3NlJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fUkVGUkVTSDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdTdWJmb3JtIFJlZnJlc2gnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gJ1N1YmZvcm0gT3Blbic7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT01QVVRFOlxyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gJ0NvbXB1dGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FDSEVfTkVYVDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdHZXQgTmV4dCBEYXRhJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBQ0hFX1BSRVY6XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnR2V0IFByZXZpb3VzIERhdGEnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfREFUQV9DT05UUk9MX1ZBTFVFUzpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdGZXRjaCBkYXRhIGNvbnRyb2wgdmFsdWVzJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9ICdJbmRleCBDaGFuZ2UnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdHlwZSBvZiBVc2VyIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHR5cGUgb2YgdXNlciBldmVudCA8L3JldHVybnM+XHJcbiAgZ2V0VXNlckV2ZW50VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuVXNlckV2dCA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfTk9USU5JVEVEO1xyXG5cclxuICAgIHJldHVybiB0aGlzLlVzZXJFdnQuZ2V0VHlwZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBzZWNvbmRzIG9mIHRoZSB1c2VyIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTZWNvbmRzT2ZVc2VyRXZlbnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLlVzZXJFdnQuZ2V0U2Vjb25kcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdXNlciBldmVudCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHVzZXIgZXZlbnQgb2JqZWN0IDwvcmV0dXJucz5cclxuICBnZXRVc2VyRXZlbnQoKTogRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuVXNlckV2dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQga2V5Ym9hcmQgaXRlbSAoIGZvciBzeXN0ZW0gZXZlbnQgKSBpbiBmb3JtIG9mIHN0cmluZ1xyXG4gIC8vLyAgIGZvciBzeXN0ZW0gZXZlbnRzIE9OTFlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0S2V5Ym9hcmRJdGVtU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBsZXQga2JpOiBLZXlib2FyZEl0ZW0gPSB0aGlzLmdldEtiZEl0bSgpO1xyXG4gICAgaWYgKGtiaSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICByZXR1cm4ga2JpLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5zZXJ0IHRoZSBzZWNvbmRzIHRvIHRoZSBwaWN0dXJlIFwiSEg6TU06U1NcIiBmb3IgU1RPUkFHRV9BVFRSX1RJTUVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gZm9ybWF0ZWQgc3RyaW5nIG9mIHNlY29uZHNcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2Vjb25kczJTdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGxldCB0aW1lOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDMpO1xyXG4gICAgbGV0IGJ1ZmZlcjogc3RyaW5nID0gXCJcIjtcclxuICAgIHRpbWVbMF0gPSBNYXRoLmZsb29yKHRoaXMuX3NlY29uZHMgLyAzNjAwKTtcclxuICAgIHRpbWVbMV0gPSBNYXRoLmZsb29yKCh0aGlzLl9zZWNvbmRzIC0gdGltZVswXSAqIDM2MDApIC8gNjApO1xyXG4gICAgdGltZVsyXSA9IHRoaXMuX3NlY29uZHMgJSA2MDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aW1lLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aW1lW2ldID09PSAwKVxyXG4gICAgICAgIGJ1ZmZlciArPSBcIjAwXCI7XHJcbiAgICAgIGVsc2UgaWYgKHRpbWVbaV0gPCAxMClcclxuICAgICAgICBidWZmZXIgKz0gKFwiMFwiICsgdGltZVtpXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBidWZmZXIgKz0gdGltZVtpXTtcclxuICAgICAgLy8gZG9uJ3QgaW5zZXJ0IGRlbGltaXRlciBhZnRlciB0aGUgbGFzdCBjYXNlXHJcbiAgICAgIGlmIChpIDwgdGltZS5sZW5ndGggLSAxKVxyXG4gICAgICAgIGJ1ZmZlciArPSBcIjpcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPi0gdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgKCAwID0gZmlyc3QgcGFyYW0pIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgdmFsdWUgaW4gYSBzdHJpbmcgPC9yZXR1cm5zPlxyXG4gIGdldFBhcmFtVmFsKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJhbVZhbHNbaWR4XTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgcGFyYW1ldGVycyB2YWx1ZXMgZnJvbSB0aGUgdmFsdWUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+aW5kZXggb2YgdGhlIHBhcmFtIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcGFyYW1ldGVyIHZhbHVlIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHBhcnNlUGFyYW1WYWwodmFsdWVTdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnRPZnM6IG51bWJlciA9IDAsIGVuZE9mcyA9IDAsIG5MZW4sIGo7XHJcbiAgICBsZXQgc0xlbjogc3RyaW5nLCBzVmFsdWUgPSBudWxsO1xyXG5cclxuICAgIC8vIGZpbmQgdGhlIHZhbHVlIGxvY2F0aW9uXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5fcGFyYW1ldGVyczsgaisrKSB7XHJcbiAgICAgIHN3aXRjaCAoPFN0b3JhZ2VBdHRyaWJ1dGU+dGhpcy5fcGFyYW1BdHRyc1tqXSkge1xyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQOlxyXG4gICAgICAgICAgc1ZhbHVlID0gXCJcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5NRU1POlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgZW5kT2ZzID0gc3RhcnRPZnMgKyA0O1xyXG4gICAgICAgICAgc0xlbiA9IHZhbHVlU3RyLnN1YnN0cihzdGFydE9mcywgKGVuZE9mcykgLSAoc3RhcnRPZnMpKTtcclxuICAgICAgICAgIG5MZW4gPSBOTnVtYmVyLlBhcnNlKHNMZW4sIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpO1xyXG4gICAgICAgICAgc3RhcnRPZnMgPSBlbmRPZnM7XHJcblxyXG4gICAgICAgICAgLy8gUUNSIDE2OTkgZGVjb2RlIHRoZSBwYXJhbWV0ZXIgZnJvbSBiYXNlNjQgaWYgbmVlZGVkXHJcbiAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmVudmlyb25tZW50LkdldERlYnVnTGV2ZWwoKSA+IDEgfHwgKDxTdG9yYWdlQXR0cmlidXRlPnRoaXMuX3BhcmFtQXR0cnNbal0pID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8ICg8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl9wYXJhbUF0dHJzW2pdKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFIHx8ICg8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl9wYXJhbUF0dHJzW2pdKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSB7XHJcbiAgICAgICAgICAgIGlmICgobkxlbiAmIDB4ODAwMCkgPiAwKVxyXG4gICAgICAgICAgICAvLyBwYXJzZSBzcGFubmVkIHJlY29yZCBlbmNvZGVkIHRvIEhleFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgbGVuIG9mIHRoZSBwYXJhbWV0ZXIgZGF0YVxyXG4gICAgICAgICAgICAgIG5MZW4gPSAobkxlbiAmIDB4N0ZGRik7XHJcbiAgICAgICAgICAgICAgbkxlbiAqPSAyO1xyXG5cclxuICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgU3RyaW5nXHJcbiAgICAgICAgICAgICAgbGV0IHJlczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgZW5kT2ZzICs9IFJlY29yZFV0aWxzLmdldFNwYW5uZWRGaWVsZCh2YWx1ZVN0ciwgbkxlbiwgc3RhcnRPZnMsIDxTdG9yYWdlQXR0cmlidXRlPnRoaXMuX3BhcmFtQXR0cnNbal0sIHJlcywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgdmFsdWVTdHIgPSByZXMuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBub24gc3Bhbm5lZCBwYXJhbXNcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgZW5kT2ZzID0gc3RhcnRPZnMgKyBuTGVuO1xyXG4gICAgICAgICAgICAgIHNWYWx1ZSA9IHZhbHVlU3RyLnN1YnN0cihzdGFydE9mcywgKGVuZE9mcykgLSAoc3RhcnRPZnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgobkxlbiAmIDB4ODAwMCkgPiAwKVxyXG4gICAgICAgICAgICAvLyBwYXJzZSBzcGFubmVkIHJlY29yZCBlbmNvZGVkIHRvIEhleFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgbGVuIG9mIHRoZSBwYXJhbWV0ZXIgZGF0YVxyXG4gICAgICAgICAgICAgIG5MZW4gPSAobkxlbiAmIDB4N0ZGRik7XHJcbiAgICAgICAgICAgICAgbkxlbiA9IE1hdGguZmxvb3IoKG5MZW4gKyAyKSAvIDMpICogNDtcclxuXHJcbiAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIFN0cmluZ1xyXG4gICAgICAgICAgICAgIGxldCByZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgICAgIGVuZE9mcyArPSBSZWNvcmRVdGlscy5nZXRTcGFubmVkRmllbGQodmFsdWVTdHIsIG5MZW4sIHN0YXJ0T2ZzLCA8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl9wYXJhbUF0dHJzW2pdLCByZXMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBzVmFsdWUgPSByZXMuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBlbmRPZnMgPSBzdGFydE9mcyArIE1hdGguZmxvb3IoKG5MZW4gKyAyKSAvIDMpICogNDtcclxuICAgICAgICAgICAgICBzVmFsdWUgPSBCYXNlNjQuZGVjb2RlKHZhbHVlU3RyLnN1YnN0cihzdGFydE9mcywgKGVuZE9mcykgLSAoc3RhcnRPZnMpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAvLyBRQ1IgMTY5OSBkZWNvZGUgdGhlIHBhcmFtZXRlciBmcm9tIGJhc2U2NCBpZiBuZWVkZWRcclxuICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQuR2V0RGVidWdMZXZlbCgpID4gMSkge1xyXG4gICAgICAgICAgICBlbmRPZnMgPSBzdGFydE9mcyArIEFjY2Vzc0hlbHBlci5lbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKSAqIDI7XHJcbiAgICAgICAgICAgIHNWYWx1ZSA9IHZhbHVlU3RyLnN1YnN0cihzdGFydE9mcywgKGVuZE9mcykgLSAoc3RhcnRPZnMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBlbmRPZnMgPSBzdGFydE9mcyArIChNYXRoLmZsb29yKChBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCkgKyAyKSAvIDMpICogNCk7XHJcbiAgICAgICAgICAgIHNWYWx1ZSA9IEJhc2U2NC5kZWNvZGVUb0hleCh2YWx1ZVN0ci5zdWJzdHIoc3RhcnRPZnMsIChlbmRPZnMpIC0gKHN0YXJ0T2ZzKSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgZW5kT2ZzID0gc3RhcnRPZnMgKyAxO1xyXG4gICAgICAgICAgc1ZhbHVlID0gdmFsdWVTdHIuc3Vic3RyKHN0YXJ0T2ZzLCAoZW5kT2ZzKSAtIChzdGFydE9mcykpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcGFyYW1WYWxzW2pdID0gc1ZhbHVlO1xyXG4gICAgICBzdGFydE9mcyA9IGVuZE9mcztcclxuICAgIH1cclxuICAgIHJldHVybiBlbmRPZnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IEFyZ3VtZW50IFZhbHVlcyAsIHdpdGhvdXQgc2V0dGluZyBvZiB0aGUgcGFyYW1BdHRyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0UGFyYW1WYWxzKHBhcmFtVmFsc186IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYXJhbVZhbHMgPSBwYXJhbVZhbHNfO1xyXG4gICAgdGhpcy5fcGFyYW1BdHRycyA9IHRoaXMuX3BhcmFtTnVsbHMgPSBcIlwiO1xyXG4gICAgdGhpcy5fcGFyYW1ldGVycyA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmFtVmFscyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gdGhpcy5fcGFyYW1WYWxzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BhcmFtZXRlcnM7IGkrKykge1xyXG4gICAgICAgIHRoaXMuX3BhcmFtQXR0cnMgKz0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTsgLy8gdGVtcG9yYXJ5IHR5cGUgb2YgdGhlIGRhdGFcclxuICAgICAgICB0aGlzLl9wYXJhbU51bGxzICs9IFwiMFwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJ5IHRvIGV2YWx1YXRlIHZhbHVlIHRvIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZpZWxkIHR5cGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyYW1OdW1cIj5udW1iZXIgb2YgdGhlIHBhcmFtZXRlciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkXCI+LSBmaWVsZCB3aXRoIGl0J3MgdHlwZSwgdG8gZW5mb3JjZSBpdHMgdHlwZSB0byB0aGUgcGFyYW1ldGVyIHZhbHVlIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gaWYgc2V0dGluZyBvZiB0aGUgdHlwZSBoYXMgb3ZlciB3aXRob3V0IHByb2JsZW1zIGFuZCBub3cgdGhlIHBhcmFtZXRlciBhbmQgdGhlIGZpZWxkcyBoYXZlIHRoZSBzYW1lIHR5cGUsXHJcbiAgLy8vICAgZmFsc2UgLSB0aGUgc2V0dGluZyBpbXBvc3NpYmxlLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIHNldFBhcmFtVHlwZShwYXJhbU51bTogbnVtYmVyLCBmbGQ6IEZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VyclR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGU7XHJcbiAgICBsZXQgY3VyclZhbHVlOiBzdHJpbmc7XHJcbiAgICBsZXQgbmV3VHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRUeXBlKCk7XHJcbiAgICBsZXQgcGljOiBQSUMgPSBudWxsO1xyXG4gICAgbGV0IHNhbWVUeXBlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmFtVmFscyAhPSBudWxsICYmIHRoaXMuZ2V0UGFyYW1OdW0oKSA+PSBwYXJhbU51bSkge1xyXG4gICAgICBjdXJyVHlwZSA9IDxTdG9yYWdlQXR0cmlidXRlPnRoaXMuX3BhcmFtQXR0cnNbcGFyYW1OdW1dO1xyXG5cclxuICAgICAgc2FtZVR5cGUgPSAoY3VyclR5cGUgPT09IG5ld1R5cGUpO1xyXG4gICAgICBpZiAoIXNhbWVUeXBlKSB7XHJcbiAgICAgICAgLy8gdHJ5IHRvIHNldCB0aGUgbmV3IHR5cGUgdG8gdGhlIHBhcmFtZXRlclxyXG4gICAgICAgIGxldCBjaGFyQXJyOiBzdHJpbmdbXSA9IG51bGw7XHJcbiAgICAgICAgY3VyclZhbHVlID0gdGhpcy5fcGFyYW1WYWxzW3BhcmFtTnVtXTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChuZXdUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5NRU1POlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgICAgaWYgKGN1cnJUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgICAgICAgICAgLy8gZnJvbSBhbHBoYSB0byBudW1lcmljXHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHBpYyA9IFBJQy5idWlsZFBpY3R1cmUobmV3VHlwZSwgY3VyclZhbHVlLCBmbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbVZhbHNbcGFyYW1OdW1dID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKGN1cnJWYWx1ZSwgIHBpYyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxkLmdldFRhc2soKS5nZXRDb21wSWR4KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgICAgICAgICAgIHNhbWVUeXBlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAvLyBjYW5Ob3RFdmFsdWF0ZUFzTnVtZXJpY1xyXG4gICAgICAgICAgICAgICAgICBzYW1lVHlwZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJFdmVudC5zZXRQYXJhbVR5cGUoKSBjYW5ub3QgdHJhbnNmZXIgezB9IHRvIE51bWVyaWMgd2l0aCBwaWN0dXJlIHsxfVwiLCBjdXJyVmFsdWUsIChwaWMgIT0gbnVsbCA/IHBpYy5nZXRGb3JtYXQoKSA6IFwibnVsbFwiKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgICBpZiAoY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgICAgICAgICAvLyBmcm9tIGFscGhhIHRvIGxvZ2ljYWxcclxuICAgICAgICAgICAgICBjdXJyVmFsdWUgPSBjdXJyVmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICAgIGlmIChjdXJyVmFsdWUgPT09IFwiMVwiIHx8IGN1cnJWYWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIilcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmFtVmFsc1twYXJhbU51bV0gPSBcIjFcIjtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbVZhbHNbcGFyYW1OdW1dID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgc2FtZVR5cGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNhbWVUeXBlKSB7XHJcbiAgICAgICAgICBjaGFyQXJyID0gTlN0cmluZy5Ub0NoYXJBcnJheSh0aGlzLl9wYXJhbUF0dHJzKTtcclxuICAgICAgICAgIGNoYXJBcnJbcGFyYW1OdW1dID0gPHN0cmluZz5uZXdUeXBlO1xyXG4gICAgICAgICAgdGhpcy5fcGFyYW1BdHRycyA9IE5TdHJpbmcuRnJvbUNoYXJzKGNoYXJBcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSAvLyBub3QgdGhlIHNhbWUgdHlwZVxyXG4gICAgfS8vIHRoZXJlIGlzIG5vIHN1Y2ggcGFyYW1ldGVyXHJcblxyXG4gICAgcmV0dXJuIHNhbWVUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbnVtYmVyIG9mIHBhcmFtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgcGFyYW1zIDwvcmV0dXJucz5cclxuICBnZXRQYXJhbU51bSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBudWxsIGZsYWcgb2YgdGhlIHBhcmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBwYXJhbSBpbmRleCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVsbCBmbGFnIDwvcmV0dXJucz5cclxuICBnZXRQYXJhbU51bGwoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICgnMCcgPT09IHRoaXMuX3BhcmFtTnVsbHMuY2hhckF0KGlkeCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIHBhcmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBwYXJhbSBpbmRleCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYXR0cmlidXRlIGNoYXIgPC9yZXR1cm5zPlxyXG4gIGdldFBhcmFtQXR0cihpZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1BdHRycy5jaGFyQXQoaWR4KTtcclxuICB9XHJcblxyXG4gIGlzQ29udHJvbEhlYWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmXHJcbiAgICAgICh0aGlzLmdldEludGVybmFsQ29kZSgpID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCB8fFxyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYIHx8XHJcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbENvZGUoKSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pO1xyXG4gIH1cclxuXHJcbiAgaXNWYXJpYWJsZUhlYWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmXHJcbiAgICAgIHRoaXMuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBcHBlbmRzIHRoZSBldmVudCdzIGRlc2NyaXB0aW9uIHRvIHRoZSBnaXZlbiBTdHJpbmdCdWlsZGVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJidWZmZXJcIj5UaGUgYnVmZmVyIHRvIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiBzaG91bGQgYmUgYXBwZW5kZWQuPC9wYXJhbT5cclxuICBwdWJsaWMgQXBwZW5kRGVzY3JpcHRpb24oYnVmZmVyOiBTdHJpbmdCdWlsZGVyKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3R5cGUpIHtcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoRXZlbnQuZ2V0SW50ZXJuYWxFdnREZXNjcmlwdGlvbih0aGlzLkludGVybmFsRXZlbnQpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU06XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLmdldEtleWJvYXJkSXRlbVN0cmluZygpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5nZXRVc3JFdm50RGVzYygpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSX0ZVTkM6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl91c2VyRGVmaW5lZEZ1bmNOYW1lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUjpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuc2Vjb25kczJTdHJpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTjpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCAnSUQgJyArIHRoaXMuRXhwLmdldElkKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJ1bmtub3duIGV2ZW50IHR5cGUgXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgd2hldGhlciB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZSBpcyBiZXR3ZWVuIDEwMDEgJiAxMDA4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgaXNOZXdJbnRlcm5hbEV2ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSW50ZXJuYWxFdmVudCA+PSAxMDAxICYmIHRoaXMuSW50ZXJuYWxFdmVudCA8PSAxMDA4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciBuZXcgaW50ZXJuYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXROZXdJbnRlcm5hbEV2ZW50RGVzY3JpcHRpb24oKTogc3RyaW5nIHtcclxuICAgIGxldCBldmVudERlc2M6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5JbnRlcm5hbEV2ZW50KSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICBldmVudERlc2MgPSBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfVEFTS19QUkVGSVhfRk07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICBldmVudERlc2MgPSBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfVEFTS19TVUZGSVhfRk07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIGV2ZW50RGVzYyA9IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfUFJFRklYX0ZNO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICBldmVudERlc2MgPSBDb25zdEludGVyZmFjZS5CUktfTEVWRUxfUkVDX1NVRkZJWF9GTTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGV2ZW50RGVzYyA9IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9DVFJMX1BSRUZJWF9GTTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIGV2ZW50RGVzYyA9IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9DVFJMX1NVRkZJWF9GTTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgIGV2ZW50RGVzYyA9IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9DVFJMX1ZFUklGSUNBVElPTl9GTTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgIGV2ZW50RGVzYyA9IENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9WQVJJQUJMRV9GTTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgcmV0dXJuIGV2ZW50RGVzYztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIG5ldyBpbnRlcm5hbCBldmVudHMgb3IgcmV0dXJuIHRoZSB0eXBlIGluIHN0cmluZyBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXRFdmVudFR5cGUoKSA6IHN0cmluZyB7XHJcbiAgICAvLyBGb3IgdGhlIG5ldyBpbnRlcm5hbCBldmVudHMsIHRoZXJlIGlzIG5vIHR5cGUgc28gaW5zdGVhZCBnZXQgdGhlIGRlc2NyaXB0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5pc05ld0ludGVybmFsRXZlbnQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTlN0cmluZy5UcmltRW5kKHRoaXMuZ2V0TmV3SW50ZXJuYWxFdmVudERlc2NyaXB0aW9uKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldEV2ZW50VHlwZVN0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgZXZlbnQgaW4gc3RyaW5nIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldEV2ZW50VHlwZVN0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IGV2ZW50VHlwZTogc3RyaW5nO1xyXG4gICAgc3dpdGNoICh0aGlzLmdldFR5cGUoKSkge1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUw6XHJcbiAgICAgIGV2ZW50VHlwZSA9ICdJbnRlcm5hbCBFdmVudDonO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNOlxyXG4gICAgICAgIGV2ZW50VHlwZSA9ICdTeXN0ZW0gRXZlbnQ6JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT046XHJcbiAgICAgICAgZXZlbnRUeXBlID0gJ0V4cHJlc3Npb24gRXZlbnQ6JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSOlxyXG4gICAgICAgIGV2ZW50VHlwZSA9ICdUaW1lciBFdmVudDonO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUjpcclxuICAgICAgICBldmVudFR5cGUgPSAnVXNlciBFdmVudDonO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBldmVudFR5cGUgPSAnJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZXZlbnRUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHVzZXIgZGVmaW5lZCBmdW5jdGlvbidzIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFVzZXJEZWZpbmVkRnVuY05hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl91c2VyRGVmaW5lZEZ1bmNOYW1lID0gbmFtZTtcclxuICAgIGxldCBmdW5jdGlvbk5hbWVVcHBlcjogc3RyaW5nID0gdGhpcy5fdXNlckRlZmluZWRGdW5jTmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgdGhpcy5fdXNlckRlZmluZWRGdW5jTmFtZUhhc2hDb2RlID0gSGFzaFV0aWxzLkdldEhhc2hDb2RlKGZ1bmN0aW9uTmFtZVVwcGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB1c2VyIGRlZmluZWQgZnVuY3Rpb24ncyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRVc2VyRGVmaW5lZEZ1bmNOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXNlckRlZmluZWRGdW5jTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB1c2VyIGRlZmluZWQgZnVuY3Rpb24ncyBuYW1lJ3MgaGFzaCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VXNlckRlZmluZWRGdW5jTmFtZUhhc2hDb2RlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXNlckRlZmluZWRGdW5jTmFtZUhhc2hDb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHVzZXIgZGVmaW5lZCBmdW5jdGlvbidzIHJldHVybiBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRVc2VyRGVmaW5lZEZ1bmNSZXRFeHAoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXR1cm5FeHA7XHJcbiAgfVxyXG5cclxuICBnZXRPc0NvbW1hbmRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3NDb21tYW5kVGV4dDtcclxuICB9XHJcblxyXG4gIHNldE9zQ29tbWFuZFRleHQob3NDb21tYW5kVGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vc0NvbW1hbmRUZXh0ID0gb3NDb21tYW5kVGV4dDtcclxuICB9XHJcblxyXG4gIGdldE9zQ29tbWFuZFdhaXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3NDb21tYW5kV2FpdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0T3NDb21tYW5kV2FpdCh3YWl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vc0NvbW1hbmRXYWl0ID0gd2FpdDtcclxuICB9XHJcblxyXG4gIGdldE9zQ29tbWFuZFNob3coKTogQ2FsbE9zU2hvdyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3NDb21tYW5kU2hvdztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0T3NDb21tYW5kU2hvdyhvc1Nob3c6IENhbGxPc1Nob3cpOiB2b2lkIHtcclxuICAgIHRoaXMuX29zQ29tbWFuZFNob3cgPSBvc1Nob3c7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHNldFRpbWVzdGFtcCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RpbWVzdGFtcCA9IEV2ZW50Ll9sYXN0VGltZXN0YW1wKys7XHJcbiAgfVxyXG5cclxuICBnZXRUaW1lc3RhbXAoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90aW1lc3RhbXA7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwie3tFdmVudDogezB9fX1cIiwgdGhpcy5nZXRCcmtMZXZlbCgpKTtcclxuICB9XHJcbn1cclxuIl19