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