@magic-xpa/engine 4.801.0-dev481.243 → 4.801.0-dev481.249
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/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -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/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -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/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -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} +0 -0
- package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -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/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -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/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -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/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
- package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
- package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
- package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
- package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -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/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
- package/esm2020/src/event/EventsManager.mjs +2983 -0
- package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
- package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -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/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -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/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -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/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -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/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -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/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -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/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
- package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
- package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
- 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/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
- package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -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} +102 -5
- 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/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/env/EnvVariablesTable.d.ts +2 -15
- package/src/env/MirrorString.d.ts +15 -0
- package/src/exp/GlobalParamsTable.d.ts +2 -1
- package/src/http/client/HttpClientBase.d.ts +2 -2
- package/src/rt/DataviewHeaderBase.d.ts +1 -1
- package/src/tasks/TaskBase.d.ts +7 -7
- 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/bundles/magic-xpa-engine.umd.js +0 -37983
- 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/bridge/MagicBridge.js +0 -44
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
- 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 -1692
- package/esm2015/src/data/DataviewManager.js +0 -31
- package/esm2015/src/data/DataviewManagerBase.js +0 -18
- package/esm2015/src/data/Field.js +0 -671
- package/esm2015/src/data/FieldBase.js +0 -9
- package/esm2015/src/data/TaskTransactionManager.js +0 -110
- package/esm2015/src/env/EnvVariablesTable.js +0 -408
- package/esm2015/src/env/Environment.js +0 -557
- package/esm2015/src/env/LanguageData.js +0 -229
- package/esm2015/src/event/Event.js +0 -1441
- package/esm2015/src/event/EventHandler.js +0 -786
- package/esm2015/src/event/EventsManager.js +0 -3106
- package/esm2015/src/exp/Expression.js +0 -209
- package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
- 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 -424
- package/esm2015/src/gui/MgForm.js +0 -1291
- 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 -147
- 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 -901
- 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/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/Operation.js +0 -772
- 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/tasks/MGData.js +0 -561
- package/esm2015/src/tasks/MGDataCollection.js +0 -270
- package/esm2015/src/tasks/Task.js +0 -2601
- package/esm2015/src/tasks/TaskServiceBase.js +0 -30
- package/esm2015/src/tasks/TasksTable.js +0 -87
- package/esm2015/src/util/FlowMonitorQueue.js +0 -364
- package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
- package/esm2015/src/util/PrmMap.js +0 -157
- package/fesm2015/magic-xpa-engine.js.map +0 -1
|
@@ -0,0 +1,2983 @@
|
|
|
1
|
+
import { Constants, ForceExit, InternalInterface, Logger, Logger_LogLevels, MgControlType, Misc, MsgInterface, Priority, RaiseAt, StorageAttribute, StrUtil, SubformType } from '@magic-xpa/utils';
|
|
2
|
+
import { ApplicationException, Int32, List, NString, RefParam, Stack, StringBuilder, Thread, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
|
3
|
+
import { Commands, CommandType, DataModificationTypes, ExpVal, FocusManager, GuiConstants, GuiEnvironment, KeyboardItem, Manager, Modifiers, PropInterface, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
|
|
4
|
+
import { EventSubType } from '../enums';
|
|
5
|
+
import { RollbackEventCommand_RollbackType } from '../commands/ClientToServer/RollbackEventCommand';
|
|
6
|
+
import { MgControl } from '../gui/MgControl';
|
|
7
|
+
import { MgPriorityBlockingQueue } from '../util/MgPriorityBlockingQueue';
|
|
8
|
+
import { RunTimeEvent } from './RunTimeEvent';
|
|
9
|
+
import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
|
|
10
|
+
import { GUIManager } from '../GUIManager';
|
|
11
|
+
import { Task } from '../tasks/Task';
|
|
12
|
+
import { Task_SubformExecModeEnum } from '../tasks/TaskBase';
|
|
13
|
+
import { ArgumentsList } from '../rt/ArgumentsList';
|
|
14
|
+
import { MGData } from '../tasks/MGData';
|
|
15
|
+
import { MGDataCollection } from '../tasks/MGDataCollection';
|
|
16
|
+
import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
|
|
17
|
+
import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
|
|
18
|
+
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
|
19
|
+
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
|
20
|
+
import { ClientRefreshCommand } from '../commands/ServerToClient/ClientRefreshCommand';
|
|
21
|
+
import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
|
|
22
|
+
import { ExecutionStack } from '../rt/ExecutionStack';
|
|
23
|
+
import { EventHandlerPosition } from './EventHandlerPosition';
|
|
24
|
+
import { ConstInterface } from '../ConstInterface';
|
|
25
|
+
import { FlowMonitorInterface } from '../FlowMonitorInterface';
|
|
26
|
+
import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
|
|
27
|
+
import { ServerError } from '../remote/ServerError';
|
|
28
|
+
import { Environment } from '../env/Environment';
|
|
29
|
+
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
|
30
|
+
import { EventsAllowedType } from './IEventsManager';
|
|
31
|
+
import { LanguageData } from '../env/LanguageData';
|
|
32
|
+
import { Subject } from "rxjs";
|
|
33
|
+
import { ClientManager } from "../ClientManager";
|
|
34
|
+
var EventScope;
|
|
35
|
+
(function (EventScope) {
|
|
36
|
+
EventScope["NONE"] = " ";
|
|
37
|
+
EventScope["TRANS"] = "T";
|
|
38
|
+
})(EventScope || (EventScope = {}));
|
|
39
|
+
export class EventsManager {
|
|
40
|
+
constructor() {
|
|
41
|
+
this._eventsQueue = null;
|
|
42
|
+
this._execStack = null;
|
|
43
|
+
this._rtEvents = null;
|
|
44
|
+
this._serverExecStack = null;
|
|
45
|
+
this._allowEvents = EventsAllowedType.ALL;
|
|
46
|
+
this._compMainPrgTab = null;
|
|
47
|
+
this._currCtrl = null;
|
|
48
|
+
this._currField = null;
|
|
49
|
+
this._currKbdItem = null;
|
|
50
|
+
this._endOfWork = false;
|
|
51
|
+
this._eventScope = EventScope.NONE;
|
|
52
|
+
this._forceExit = ForceExit.None;
|
|
53
|
+
this._forceExitTask = null;
|
|
54
|
+
this._ignoreUnknownAbort = false;
|
|
55
|
+
this._initialized = false;
|
|
56
|
+
this._isHandlingForceExit = false;
|
|
57
|
+
this._isNonReversibleExit = false;
|
|
58
|
+
this._isInRecordFlushEvent = false;
|
|
59
|
+
this.lastSavedRouteEvent = null;
|
|
60
|
+
this._stopExecution = false;
|
|
61
|
+
this._processingTopMostEndTask = false;
|
|
62
|
+
this._stopExecutionCtrl = null;
|
|
63
|
+
this._isSorting = false;
|
|
64
|
+
this._nextParkedCtrl = null;
|
|
65
|
+
this.guiPendingEvent = null;
|
|
66
|
+
this.KBI_DOWN = null;
|
|
67
|
+
this.KBI_UP = null;
|
|
68
|
+
this.confirmationDialogMsg = "The server context serving this application is about to time out. Do you want to continue your work?";
|
|
69
|
+
this.confirmationDialogTitle = "Session is about to be terminated!";
|
|
70
|
+
this._lastFailedFocusedControl = null;
|
|
71
|
+
this.isSpinnerShown = false;
|
|
72
|
+
this.SpinnerStopped = new Subject();
|
|
73
|
+
this._rtEvents = new Stack();
|
|
74
|
+
this._eventsQueue = new MgPriorityBlockingQueue();
|
|
75
|
+
this._execStack = new Stack();
|
|
76
|
+
this._execStack.push(new ExecutionStack());
|
|
77
|
+
this._serverExecStack = new Stack();
|
|
78
|
+
this._serverExecStack.push(null);
|
|
79
|
+
this._nextParkedCtrl = null;
|
|
80
|
+
this.KBI_DOWN = new KeyboardItem(GuiConstants.KEY_DOWN, Modifiers.MODIFIER_NONE);
|
|
81
|
+
this.KBI_UP = new KeyboardItem(GuiConstants.KEY_UP, Modifiers.MODIFIER_NONE);
|
|
82
|
+
}
|
|
83
|
+
getPendingGuiEvent() {
|
|
84
|
+
return this.guiPendingEvent;
|
|
85
|
+
}
|
|
86
|
+
setPendingGuiEvent(guiEvent) {
|
|
87
|
+
this.guiPendingEvent = guiEvent;
|
|
88
|
+
}
|
|
89
|
+
addToTail(rtEvt) {
|
|
90
|
+
if (!rtEvt.isIdleTimer()) {
|
|
91
|
+
if (EventsManager.clientInactivityTimerON) {
|
|
92
|
+
EventsManager.clientContextInactivityTimerAborted = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (this.getLastSavedRouteEvent() != null) {
|
|
97
|
+
this.addToTail(this.getLastSavedRouteEvent());
|
|
98
|
+
this.setLastSavedRouteEvent(null);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this._eventsQueue.put(rtEvt);
|
|
102
|
+
}
|
|
103
|
+
AddKeyboardEvent(mgForm, mgControl, modifier, keyCode, start, end, text, isActChar, suggestedValue, code) {
|
|
104
|
+
let rtEvt = (mgControl !== null) ? new RunTimeEvent(mgControl, true, false) : new RunTimeEvent(mgForm.getTask(), true);
|
|
105
|
+
rtEvt.setInternal(code);
|
|
106
|
+
let newKbItem = new KeyboardItem(keyCode, modifier);
|
|
107
|
+
if (isActChar && (mgControl !== null && (mgControl.isTextControl())))
|
|
108
|
+
newKbItem.setAction(InternalInterface.MG_ACT_CHAR);
|
|
109
|
+
rtEvt.setKeyboardItem(newKbItem);
|
|
110
|
+
if (code === InternalInterface.MG_ACT_CTRL_KEYDOWN) {
|
|
111
|
+
rtEvt.setEditParms(start, end, text);
|
|
112
|
+
}
|
|
113
|
+
else
|
|
114
|
+
rtEvt.setValue(suggestedValue);
|
|
115
|
+
this.addToTail(rtEvt);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
async checkParkability() {
|
|
119
|
+
let current = LastFocusedManager.getLastFocusedControl();
|
|
120
|
+
if (current !== null && (current.getForm().getTask()).getLevel() === Constants.TASK_LEVEL_CONTROL && !await current.IsParkable())
|
|
121
|
+
await this.HandleNonParkableControls(current.getForm().getTask());
|
|
122
|
+
}
|
|
123
|
+
async HandleParkabilityOnRowChange(itask) {
|
|
124
|
+
await this.HandleNonParkableControls(itask);
|
|
125
|
+
}
|
|
126
|
+
async HandleNonParkableControls(itask) {
|
|
127
|
+
let task = itask;
|
|
128
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && task.IsInteractive) {
|
|
129
|
+
await task.enableModes();
|
|
130
|
+
let oldMode = task.getOriginalTaskMode();
|
|
131
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
132
|
+
if (!this.GetStopExecutionFlag()) {
|
|
133
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
|
134
|
+
task.setMode(oldMode);
|
|
135
|
+
await task.DataView.currRecCompute(true);
|
|
136
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
137
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
138
|
+
task.setLastParkedCtrl(null);
|
|
139
|
+
await FocusManager.SetFocus(task, null, -1, true);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL)
|
|
145
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
146
|
+
task.setLastParkedCtrl(null);
|
|
147
|
+
MgControl.ReturnToCtrl = null;
|
|
148
|
+
await FocusManager.SetFocus(task, null, -1, true);
|
|
149
|
+
}
|
|
150
|
+
async handleEvent(rtEvt, returnedFromServer) {
|
|
151
|
+
let handler = null;
|
|
152
|
+
let pos = new EventHandlerPosition();
|
|
153
|
+
let task = rtEvt.getTask();
|
|
154
|
+
let ctrl = task.getLastParkedCtrl();
|
|
155
|
+
let forceExitDone = false;
|
|
156
|
+
let endTaskError = false;
|
|
157
|
+
let oldRtEvt = null;
|
|
158
|
+
let oldForceExit = this.getForceExit();
|
|
159
|
+
let oldForceExitTask = this.getForceExitTask();
|
|
160
|
+
let oldIsHandlingForceExit = this._isHandlingForceExit;
|
|
161
|
+
let restoreIsForceExit = false;
|
|
162
|
+
let restoreCurrCtrl = null;
|
|
163
|
+
let restoreCurrField = null;
|
|
164
|
+
if ((rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL)) {
|
|
165
|
+
if (rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT && (!task.ActionManager.isEnabled(rtEvt.InternalEvent) || (!rtEvt.isImmediate() && this.NoEventsAllowed())))
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
else if (!rtEvt.isImmediate() && this.NoEventsAllowed())
|
|
169
|
+
return;
|
|
170
|
+
restoreCurrCtrl = this._currCtrl;
|
|
171
|
+
this._currCtrl = ctrl;
|
|
172
|
+
let propagate = rtEvt.getType() !== ConstInterface.EVENT_TYPE_INTERNAL || rtEvt.getInternalCode() < 1000;
|
|
173
|
+
try {
|
|
174
|
+
this.pushRtEvent(rtEvt);
|
|
175
|
+
await this.CheckAndShowSpinner(true);
|
|
176
|
+
let bRcBefore = await this.commonHandlerBefore(rtEvt);
|
|
177
|
+
restoreCurrField = this._currField;
|
|
178
|
+
this._currField = task.getCurrField();
|
|
179
|
+
if (bRcBefore) {
|
|
180
|
+
pos.init(rtEvt);
|
|
181
|
+
handler = pos.getNext();
|
|
182
|
+
if (handler !== null && handler.getEvent() !== null && handler.getEvent().UserEvt !== null)
|
|
183
|
+
this.setForceExit(handler.getEvent().UserEvt.ForceExit, task);
|
|
184
|
+
while (handler !== null) {
|
|
185
|
+
let handlerContextTask = null;
|
|
186
|
+
let rtEvtChanged;
|
|
187
|
+
try {
|
|
188
|
+
let enabledCndCheckedAndTrue = false;
|
|
189
|
+
handlerContextTask = handler.getTask().GetContextTask();
|
|
190
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() >= 1000 && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_VARIABLE)
|
|
191
|
+
handler.getTask().SetContextTask(handler.getTask());
|
|
192
|
+
else
|
|
193
|
+
handler.getTask().SetContextTask(rtEvt.getTask());
|
|
194
|
+
if (handler.getEvent().getType() === ConstInterface.EVENT_TYPE_USER && await handler.isEnabled()) {
|
|
195
|
+
enabledCndCheckedAndTrue = true;
|
|
196
|
+
this._isHandlingForceExit = false;
|
|
197
|
+
restoreIsForceExit = true;
|
|
198
|
+
if (await this.handleForceExitBefore(handler.getEvent(), rtEvt)) {
|
|
199
|
+
forceExitDone = true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (rtEvt !== handler.getEvent()) {
|
|
203
|
+
oldRtEvt = rtEvt;
|
|
204
|
+
rtEvt = new RunTimeEvent(handler.getEvent(), rtEvt);
|
|
205
|
+
rtEvtChanged = true;
|
|
206
|
+
this.popRtEvent();
|
|
207
|
+
this.pushRtEvent(rtEvt);
|
|
208
|
+
}
|
|
209
|
+
else
|
|
210
|
+
rtEvtChanged = false;
|
|
211
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
|
|
212
|
+
rtEvt.getTask().setInRecordSuffix(true);
|
|
213
|
+
this.createEventArguments(rtEvt);
|
|
214
|
+
let handlerRetVals = await handler.execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue);
|
|
215
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_REC_SUFFIX)
|
|
216
|
+
rtEvt.getTask().setInRecordSuffix(false);
|
|
217
|
+
propagate = handlerRetVals.Propagate;
|
|
218
|
+
if (!handlerRetVals.Enabled && rtEvtChanged) {
|
|
219
|
+
rtEvt = oldRtEvt;
|
|
220
|
+
oldRtEvt = null;
|
|
221
|
+
rtEvtChanged = false;
|
|
222
|
+
this.popRtEvent();
|
|
223
|
+
this.pushRtEvent(rtEvt);
|
|
224
|
+
}
|
|
225
|
+
if (rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TASK_PREFIX && task.isStarted() && task.getExecEndTask()) {
|
|
226
|
+
endTaskError = await task.endTask(true, false, false);
|
|
227
|
+
if (endTaskError)
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
if (this.GetStopExecutionFlag()) {
|
|
231
|
+
if (await this.handleStopExecution(rtEvt))
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
handler.getTask().SetContextTask(handlerContextTask);
|
|
237
|
+
}
|
|
238
|
+
if (!propagate)
|
|
239
|
+
break;
|
|
240
|
+
if (rtEvtChanged)
|
|
241
|
+
handler = pos.getNext(rtEvt);
|
|
242
|
+
else
|
|
243
|
+
handler = pos.getNext();
|
|
244
|
+
if (handler !== null)
|
|
245
|
+
FlowMonitorQueue.Instance.addTaskEvent(rtEvt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_PROPAGATE, task.GetTaskDetails());
|
|
246
|
+
}
|
|
247
|
+
if (propagate && !endTaskError)
|
|
248
|
+
await this.commonHandler(rtEvt);
|
|
249
|
+
}
|
|
250
|
+
if (!endTaskError) {
|
|
251
|
+
await this.commonHandlerAfter(rtEvt, bRcBefore);
|
|
252
|
+
}
|
|
253
|
+
if (forceExitDone && this._isHandlingForceExit) {
|
|
254
|
+
this._isHandlingForceExit = false;
|
|
255
|
+
await this.handleForceExitAfter(rtEvt);
|
|
256
|
+
}
|
|
257
|
+
this.setForceExit(oldForceExit, oldForceExitTask);
|
|
258
|
+
if (restoreIsForceExit)
|
|
259
|
+
this._isHandlingForceExit = oldIsHandlingForceExit;
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
this._currCtrl = restoreCurrCtrl;
|
|
263
|
+
this._currField = restoreCurrField;
|
|
264
|
+
this.popRtEvent();
|
|
265
|
+
}
|
|
266
|
+
GUIManager.Instance.execGuiCommandQueue();
|
|
267
|
+
}
|
|
268
|
+
async simulateSelection(ctrl, val, line, produceClick) {
|
|
269
|
+
let mgControl = ctrl;
|
|
270
|
+
let currTask = mgControl.getForm().getTask();
|
|
271
|
+
let cancelWasRaised = currTask.cancelWasRaised();
|
|
272
|
+
if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON) {
|
|
273
|
+
let aRtEvt = new RunTimeEvent(mgControl);
|
|
274
|
+
let raiseAt = (await (mgControl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt());
|
|
275
|
+
if (aRtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && (aRtEvt.InternalEvent === InternalInterface.MG_ACT_CANCEL || aRtEvt.InternalEvent === InternalInterface.MG_ACT_RT_QUIT)) {
|
|
276
|
+
if (raiseAt === RaiseAt.TaskInFocus)
|
|
277
|
+
currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
|
278
|
+
cancelWasRaised = currTask.cancelWasRaised();
|
|
279
|
+
currTask.setCancelWasRaised(true);
|
|
280
|
+
}
|
|
281
|
+
if (raiseAt === RaiseAt.TaskInFocus)
|
|
282
|
+
mgControl.setRtEvtTask(LastFocusedManager.Instance.getLastFocusedTask());
|
|
283
|
+
}
|
|
284
|
+
await this.handleFocus(mgControl, line, produceClick);
|
|
285
|
+
currTask.setCancelWasRaised(cancelWasRaised);
|
|
286
|
+
if (this._stopExecution)
|
|
287
|
+
return;
|
|
288
|
+
let controlIsParkable = await mgControl.IsParkable();
|
|
289
|
+
if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON || (mgControl.getField() === null || controlIsParkable)) {
|
|
290
|
+
if (mgControl.Type === MgControlType.CTRL_TYPE_BUTTON && !controlIsParkable) {
|
|
291
|
+
let subformTask = mgControl.getForm().getTask();
|
|
292
|
+
if (subformTask.IsSubForm) {
|
|
293
|
+
currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
|
294
|
+
if (subformTask !== currTask && subformTask.pathContains(currTask)) {
|
|
295
|
+
if (subformTask.getLevel() === Constants.TASK_LEVEL_TASK) {
|
|
296
|
+
await this.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_PREFIX);
|
|
297
|
+
}
|
|
298
|
+
await this.HandleNonParkableControls(subformTask);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
let rtEvt = new RunTimeEvent(mgControl);
|
|
303
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = mgControl;
|
|
304
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_HIT);
|
|
305
|
+
await this.handleEvent(rtEvt, false);
|
|
306
|
+
if (this._stopExecution)
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (mgControl.Type !== MgControlType.CTRL_TYPE_BUTTON)
|
|
310
|
+
await this.handleSelection(mgControl, line, val);
|
|
311
|
+
if (this._stopExecution)
|
|
312
|
+
return;
|
|
313
|
+
await this.handleMouseUp(mgControl, line, produceClick);
|
|
314
|
+
}
|
|
315
|
+
async handleInternalEventWithTask(itask, eventCode) {
|
|
316
|
+
await this.handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, false);
|
|
317
|
+
}
|
|
318
|
+
async handleInternalEventWithTaskAndSubformRefresh(itask, eventCode, subformRefresh) {
|
|
319
|
+
let task = itask;
|
|
320
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX && task.IsSubForm && task.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME) {
|
|
321
|
+
task.SubformExecMode = (subformRefresh ? Task_SubformExecModeEnum.REFRESH : Task_SubformExecModeEnum.SET_FOCUS);
|
|
322
|
+
}
|
|
323
|
+
if (subformRefresh)
|
|
324
|
+
await this.handleInternalEventWithTask(itask, InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT);
|
|
325
|
+
if (task.DataView.isEmptyDataview()) {
|
|
326
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX || eventCode === InternalInterface.MG_ACT_REC_SUFFIX) {
|
|
327
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
|
|
328
|
+
await task.emptyDataviewOpen(subformRefresh);
|
|
329
|
+
else
|
|
330
|
+
task.emptyDataviewClose();
|
|
331
|
+
if (task.getForm() !== null) {
|
|
332
|
+
if (eventCode === InternalInterface.MG_ACT_REC_PREFIX)
|
|
333
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
334
|
+
task.getForm().SelectRow();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else
|
|
338
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
|
|
339
|
+
}
|
|
340
|
+
else
|
|
341
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, eventCode, EventSubType.Normal);
|
|
342
|
+
}
|
|
343
|
+
async handleInternalEventWithMgControlBase(ctrl, eventCode) {
|
|
344
|
+
await this.handleInternalEventWithMgControl(ctrl, eventCode, EventSubType.Normal);
|
|
345
|
+
}
|
|
346
|
+
GetStopExecutionFlag() {
|
|
347
|
+
return this._stopExecution;
|
|
348
|
+
}
|
|
349
|
+
getStopExecutionCtrl() {
|
|
350
|
+
return this._stopExecutionCtrl;
|
|
351
|
+
}
|
|
352
|
+
Init() {
|
|
353
|
+
if (this._initialized) {
|
|
354
|
+
this._isHandlingForceExit = false;
|
|
355
|
+
this._forceExit = ForceExit.None;
|
|
356
|
+
this._forceExitTask = null;
|
|
357
|
+
this._currField = null;
|
|
358
|
+
this.setEndOfWork(true);
|
|
359
|
+
}
|
|
360
|
+
this._initialized = true;
|
|
361
|
+
}
|
|
362
|
+
addInternalEventWithItaskAndCode(itask, code) {
|
|
363
|
+
this.addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code);
|
|
364
|
+
}
|
|
365
|
+
addInternalEventWithCtrlAndCode(ctrl, code) {
|
|
366
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
|
367
|
+
rtEvt.setInternal(code);
|
|
368
|
+
this.addToTail(rtEvt);
|
|
369
|
+
}
|
|
370
|
+
addInternalEventWithCtrlAndDisplayLineAndCode(ctrl, DisplayLine, code) {
|
|
371
|
+
let rtEvt = new RunTimeEvent(ctrl, DisplayLine, false);
|
|
372
|
+
rtEvt.setInternal(code);
|
|
373
|
+
this.addToTail(rtEvt);
|
|
374
|
+
}
|
|
375
|
+
addInternalEventWithCtrlAndCodeAndPriority(ctrl, code, priority) {
|
|
376
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
|
377
|
+
rtEvt.setInternal(code);
|
|
378
|
+
rtEvt.setPriority(priority);
|
|
379
|
+
this.addToTail(rtEvt);
|
|
380
|
+
}
|
|
381
|
+
addGuiTriggeredEventWithTaskAndCodeAndOnMultiMark(itask, code) {
|
|
382
|
+
let task = itask;
|
|
383
|
+
let rtEvt = new RunTimeEvent(task);
|
|
384
|
+
rtEvt.setInternal(code);
|
|
385
|
+
this.addToTail(rtEvt);
|
|
386
|
+
}
|
|
387
|
+
addGuiTriggeredEventWithCtrlAndCodeAndLineAndModifier(ctrl, code, line) {
|
|
388
|
+
let rtEvt = new RunTimeEvent(ctrl, line, false);
|
|
389
|
+
rtEvt.setInternal(code);
|
|
390
|
+
this.addToTail(rtEvt);
|
|
391
|
+
}
|
|
392
|
+
addGuiTriggeredEventWithTaskAndCodeAndLine(task, code, line) {
|
|
393
|
+
let tsk = null;
|
|
394
|
+
if (task !== null)
|
|
395
|
+
tsk = task;
|
|
396
|
+
let rtEvt = new RunTimeEvent(tsk);
|
|
397
|
+
rtEvt.setInternal(code);
|
|
398
|
+
rtEvt.DisplayLine = line;
|
|
399
|
+
this.addToTail(rtEvt);
|
|
400
|
+
}
|
|
401
|
+
AddColumnClickEvent(columnCtrl, direction, columnHeader) {
|
|
402
|
+
let rtEvt = new RunTimeEvent(columnCtrl, direction, 0);
|
|
403
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_COL_CLICK);
|
|
404
|
+
let argsList = new Array();
|
|
405
|
+
argsList[0] = new ExpVal(StorageAttribute.UNICODE, false, columnHeader);
|
|
406
|
+
let args = new ArgumentsList(argsList);
|
|
407
|
+
rtEvt.setArgList(args);
|
|
408
|
+
this.addToTail(rtEvt);
|
|
409
|
+
}
|
|
410
|
+
AddRouteEvent(task, code, routerpath, routerOutletName, routeParams) {
|
|
411
|
+
let rtEvt = new RunTimeEvent(task, true);
|
|
412
|
+
rtEvt.setInternal(code);
|
|
413
|
+
let argsList = new Array(2);
|
|
414
|
+
argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, routerpath);
|
|
415
|
+
if (routerOutletName === null)
|
|
416
|
+
routerOutletName = "";
|
|
417
|
+
argsList[1] = new ExpVal(StorageAttribute.ALPHA, false, routerOutletName);
|
|
418
|
+
let args = new ArgumentsList(argsList);
|
|
419
|
+
rtEvt.setArgList(args);
|
|
420
|
+
rtEvt.setRouteParamList(routeParams);
|
|
421
|
+
this.addToTail(rtEvt);
|
|
422
|
+
}
|
|
423
|
+
AddRouterClosedEvent(task) {
|
|
424
|
+
let subFormControl = task.getForm().getSubFormCtrl();
|
|
425
|
+
let rtEvt = new RunTimeEvent(subFormControl.getForm().getTask(), true);
|
|
426
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_SUBFORM_CLOSE);
|
|
427
|
+
let argsList = new Array(1);
|
|
428
|
+
argsList[0] = new ExpVal(StorageAttribute.ALPHA, false, subFormControl.getName());
|
|
429
|
+
let args = new ArgumentsList(argsList);
|
|
430
|
+
rtEvt.setArgList(args);
|
|
431
|
+
EventsManager.Instance.addToTail(rtEvt);
|
|
432
|
+
}
|
|
433
|
+
AddLastSavedRouteEvent(srcTask, args) {
|
|
434
|
+
let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), true);
|
|
435
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_WEBCLIENT_ROUTE);
|
|
436
|
+
if (srcTask != null) {
|
|
437
|
+
rtEvt.setTask(srcTask);
|
|
438
|
+
if (args != null) {
|
|
439
|
+
rtEvt.setArgList(args);
|
|
440
|
+
}
|
|
441
|
+
this.setLastSavedRouteEvent(rtEvt);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
AddExternalValueEvent(ctrl, value, refreshDisplay) {
|
|
445
|
+
let rtEvt = new RunTimeEvent(ctrl, 0, true);
|
|
446
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_SET_EXTERNAL_VALUE);
|
|
447
|
+
rtEvt.setValue(value);
|
|
448
|
+
let argsList = new Array(1);
|
|
449
|
+
argsList[0] = new ExpVal(StorageAttribute.BOOLEAN, false, refreshDisplay ? '1' : '0');
|
|
450
|
+
let args = new ArgumentsList(argsList);
|
|
451
|
+
rtEvt.setArgList(args);
|
|
452
|
+
this.addToTail(rtEvt);
|
|
453
|
+
}
|
|
454
|
+
addGuiTriggeredEventWithCtrlAndCodeAndLine(ctrl, code, line) {
|
|
455
|
+
let rtEvt = new RunTimeEvent(ctrl, line, true);
|
|
456
|
+
rtEvt.setInternal(code);
|
|
457
|
+
this.addToTail(rtEvt);
|
|
458
|
+
}
|
|
459
|
+
addGuiTriggeredEventWithCtrlAndLineAndCodeAndIsProductClick(ctrl, code, line, isProduceClick) {
|
|
460
|
+
let rtEvt = new RunTimeEvent(ctrl, line, true);
|
|
461
|
+
rtEvt.setInternal(code);
|
|
462
|
+
rtEvt.setProduceClick(isProduceClick);
|
|
463
|
+
this.addToTail(rtEvt);
|
|
464
|
+
}
|
|
465
|
+
addGuiTriggeredEventWithCtrlAndCodeAndList(ctrl, code, list) {
|
|
466
|
+
let rtEvt = new RunTimeEvent(ctrl, list, true);
|
|
467
|
+
rtEvt.setInternal(code);
|
|
468
|
+
this.addToTail(rtEvt);
|
|
469
|
+
}
|
|
470
|
+
addGuiTriggeredEventWithTaskAndCode(task, code) {
|
|
471
|
+
let rtEvt = new RunTimeEvent(task, true);
|
|
472
|
+
rtEvt.setInternal(code);
|
|
473
|
+
this.addToTail(rtEvt);
|
|
474
|
+
}
|
|
475
|
+
addGuiTriggeredEventTaskAndCodeAndRaisedBy(task, code) {
|
|
476
|
+
this.addGuiTriggeredEventWithTaskAndCode(task, code);
|
|
477
|
+
}
|
|
478
|
+
getEvent() {
|
|
479
|
+
return this._eventsQueue.poll();
|
|
480
|
+
}
|
|
481
|
+
getForceExit() {
|
|
482
|
+
return this._forceExit;
|
|
483
|
+
}
|
|
484
|
+
setForceExit(forceExit, task) {
|
|
485
|
+
this._forceExit = forceExit;
|
|
486
|
+
this.setForceExitTask(task);
|
|
487
|
+
}
|
|
488
|
+
getForceExitTask() {
|
|
489
|
+
return this._forceExitTask;
|
|
490
|
+
}
|
|
491
|
+
setForceExitTask(task) {
|
|
492
|
+
this._forceExitTask = task;
|
|
493
|
+
}
|
|
494
|
+
isForceExitPreRecordUpdate(task) {
|
|
495
|
+
return this._isHandlingForceExit && this.getForceExit() === ForceExit.PreRecordUpdate && task === this.getForceExitTask();
|
|
496
|
+
}
|
|
497
|
+
async ExecuteClientContextInactivityTimer() {
|
|
498
|
+
let startTime = Misc.getSystemMilliseconds();
|
|
499
|
+
let currTime;
|
|
500
|
+
let clientCtxInactivityTimeout = Environment.Instance.getClientContextInactivityTimeout() * 100;
|
|
501
|
+
EventsManager.clientInactivityTimerON = true;
|
|
502
|
+
while (EventsManager.clientInactivityTimerON) {
|
|
503
|
+
await Thread.Sleep(1000);
|
|
504
|
+
var timeLapsed = Misc.getSystemMilliseconds() - startTime;
|
|
505
|
+
if (EventsManager.clientContextInactivityTimerAborted || timeLapsed >= clientCtxInactivityTimeout) {
|
|
506
|
+
EventsManager.clientInactivityTimerON = false;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
async CheckAndShowSpinner(show) {
|
|
511
|
+
let sendCommand = false;
|
|
512
|
+
if (this.getLastRtEvent() !== null && this.getLastRtEvent().getPriority() === Priority.LOWEST)
|
|
513
|
+
show = false;
|
|
514
|
+
if (show != this.isSpinnerShown) {
|
|
515
|
+
if (show) {
|
|
516
|
+
if (Misc.getSystemMilliseconds() - this.GetEventTime() > 1000) {
|
|
517
|
+
sendCommand = true;
|
|
518
|
+
EventsManager.clientBusyTimeStart = Misc.getSystemMilliseconds();
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
else
|
|
522
|
+
sendCommand = true;
|
|
523
|
+
if (sendCommand) {
|
|
524
|
+
Commands.addShowSpinner(show);
|
|
525
|
+
Commands.beginInvoke();
|
|
526
|
+
await Thread.Sleep(50);
|
|
527
|
+
this.isSpinnerShown = show;
|
|
528
|
+
if (!this.isSpinnerShown) {
|
|
529
|
+
let totalClientBusyTime = Misc.getSystemMilliseconds() - EventsManager.clientBusyTimeStart;
|
|
530
|
+
this.SpinnerStopped.next(totalClientBusyTime);
|
|
531
|
+
EventsManager.clientBusyTimeStart = 0;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
async EventsLoop(mgData) {
|
|
537
|
+
let savedAllowEvents = this.getAllowEvents();
|
|
538
|
+
this.setAllowEvents(EventsAllowedType.ALL);
|
|
539
|
+
this.pushNewExecStacks();
|
|
540
|
+
while (!mgData.IsAborting) {
|
|
541
|
+
await this.CheckAndShowSpinner(false);
|
|
542
|
+
await this._eventsQueue.waitForElement();
|
|
543
|
+
await this.handleEvents(mgData, 0);
|
|
544
|
+
if (!mgData.IsAborting)
|
|
545
|
+
await this.checkParkability();
|
|
546
|
+
}
|
|
547
|
+
this.popNewExecStacks();
|
|
548
|
+
this.setAllowEvents(savedAllowEvents);
|
|
549
|
+
}
|
|
550
|
+
async NonInteractiveEventsLoop(mgData, taskBase) {
|
|
551
|
+
let task = taskBase;
|
|
552
|
+
let savedAllowEvents = this.getAllowEvents();
|
|
553
|
+
this.setNonInteractiveAllowEvents(await task.isAllowEvents());
|
|
554
|
+
this.pushNewExecStacks();
|
|
555
|
+
while (!mgData.IsAborting) {
|
|
556
|
+
if (task.getMode() === Constants.TASK_MODE_DELETE)
|
|
557
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC);
|
|
558
|
+
else
|
|
559
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_CYCLE_NEXT_REC);
|
|
560
|
+
await Thread.Sleep(10);
|
|
561
|
+
if (!mgData.IsAborting && await task.isAllowEvents())
|
|
562
|
+
await this.handleEvents(mgData, 1);
|
|
563
|
+
}
|
|
564
|
+
this.popNewExecStacks();
|
|
565
|
+
this.setAllowEvents(savedAllowEvents);
|
|
566
|
+
}
|
|
567
|
+
async handleEvents(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt) {
|
|
568
|
+
if ((baseMgDataOrHandlersTab === null || baseMgDataOrHandlersTab instanceof MGData) && (eventsToHandleCntOrRtEvt === null || eventsToHandleCntOrRtEvt.constructor === Number)) {
|
|
569
|
+
await this.handleEvents_0(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
await this.handleEvents_1(baseMgDataOrHandlersTab, eventsToHandleCntOrRtEvt);
|
|
573
|
+
}
|
|
574
|
+
async handleEvents_0(baseMgData, eventsToHandleCnt) {
|
|
575
|
+
let task = null;
|
|
576
|
+
let delta = 0;
|
|
577
|
+
let eventsPolledCnt = 0;
|
|
578
|
+
this.setStopExecution(false);
|
|
579
|
+
while (!this._eventsQueue.isEmpty() && !this._stopExecution && (eventsToHandleCnt === 0 || eventsPolledCnt < eventsToHandleCnt)) {
|
|
580
|
+
let rtEvt = this.getEvent();
|
|
581
|
+
if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
|
|
582
|
+
delta = Misc.getSystemMilliseconds();
|
|
583
|
+
this._currKbdItem = null;
|
|
584
|
+
let blockedByModalWindow = rtEvt.isBlockedByModalWindow(baseMgData);
|
|
585
|
+
if (blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_TIMER) {
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
588
|
+
if (!rtEvt.isIdleTimer() && !blockedByModalWindow && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_ENABLE_EVENTS && rtEvt.getInternalCode() !== InternalInterface.MG_ACT_DISABLE_EVENTS && rtEvt.getTask() !== null && !rtEvt.getTask().getMGData().IsAborting) {
|
|
589
|
+
MGDataCollection.Instance.currMgdID = rtEvt.getTask().getMGData().GetId();
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
let currMgd = MGDataCollection.Instance.getCurrMGData();
|
|
593
|
+
if (currMgd !== null) {
|
|
594
|
+
while (currMgd !== null && currMgd.IsAborting) {
|
|
595
|
+
currMgd = currMgd.getParentMGdata();
|
|
596
|
+
if (currMgd !== null)
|
|
597
|
+
MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
task = rtEvt.getTask();
|
|
602
|
+
while (currMgd === null && task !== null && task.getParent() !== null) {
|
|
603
|
+
task = task.getParent();
|
|
604
|
+
currMgd = task.getMGData();
|
|
605
|
+
if (currMgd.IsAborting)
|
|
606
|
+
currMgd = null;
|
|
607
|
+
if (currMgd !== null)
|
|
608
|
+
MGDataCollection.Instance.currMgdID = MGDataCollection.Instance.getMgDataIdx(currMgd);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
if (currMgd === null)
|
|
612
|
+
break;
|
|
613
|
+
if (rtEvt.getTask() === null) {
|
|
614
|
+
task = LastFocusedManager.Instance.getLastFocusedTask();
|
|
615
|
+
while (task !== null && (task.isAborting() || task.InEndTask))
|
|
616
|
+
task = task.getParent();
|
|
617
|
+
if (task !== null) {
|
|
618
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
|
619
|
+
rtEvt.setTask(task);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
else
|
|
623
|
+
task = rtEvt.getTask();
|
|
624
|
+
if (task !== null) {
|
|
625
|
+
await this.handleEvent(rtEvt, false);
|
|
626
|
+
}
|
|
627
|
+
GUIManager.Instance.execGuiCommandQueue();
|
|
628
|
+
this._currCtrl = null;
|
|
629
|
+
if (task !== null)
|
|
630
|
+
await Task.CommandsProcessor.SendMonitorOnly();
|
|
631
|
+
else {
|
|
632
|
+
let mainProg = MGDataCollection.Instance.GetMainProgByCtlIdx(0);
|
|
633
|
+
await Task.CommandsProcessor.SendMonitorOnly();
|
|
634
|
+
}
|
|
635
|
+
if (rtEvt !== null && rtEvt.isGuiTriggeredEvent()) {
|
|
636
|
+
if (delta > 0) {
|
|
637
|
+
delta = Misc.getSystemMilliseconds() - delta;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
if (eventsToHandleCnt > 0 && rtEvt !== null && rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.InternalEvent < InternalInterface.MG_ACT_TOT_CNT)
|
|
641
|
+
eventsPolledCnt++;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
async handleStopExecution(rtEvt) {
|
|
645
|
+
let stop = false;
|
|
646
|
+
if (!this.GetStopExecutionFlag())
|
|
647
|
+
return stop;
|
|
648
|
+
let task = rtEvt.getTask();
|
|
649
|
+
let currCtrl = rtEvt.Control;
|
|
650
|
+
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
|
651
|
+
let endTaskDueToVerifyError = false;
|
|
652
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
|
653
|
+
switch (rtEvt.getInternalCode()) {
|
|
654
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
|
655
|
+
endTaskDueToVerifyError = true;
|
|
656
|
+
break;
|
|
657
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
|
658
|
+
endTaskDueToVerifyError = true;
|
|
659
|
+
break;
|
|
660
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
|
661
|
+
this.setStopExecutionCtrl(null);
|
|
662
|
+
this.setStopExecutionCtrl(task.getLastParkedCtrl());
|
|
663
|
+
break;
|
|
664
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
|
665
|
+
this.setStopExecution(false);
|
|
666
|
+
task.InCtrlPrefix = false;
|
|
667
|
+
if (lastParkedCtrl === null) {
|
|
668
|
+
task.setCurrField(null);
|
|
669
|
+
this.setStopExecutionCtrl(null);
|
|
670
|
+
this.setStopExecutionCtrl(currCtrl);
|
|
671
|
+
await this.HandleNonParkableControls(task);
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
task.setCurrField(lastParkedCtrl.getField());
|
|
675
|
+
await FocusManager.SetFocus(lastParkedCtrl, -1);
|
|
676
|
+
}
|
|
677
|
+
this.setStopExecution(true);
|
|
678
|
+
break;
|
|
679
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
|
680
|
+
currCtrl.setInControlSuffix(false);
|
|
681
|
+
break;
|
|
682
|
+
}
|
|
683
|
+
if (endTaskDueToVerifyError) {
|
|
684
|
+
await task.endTask(true, false, true);
|
|
685
|
+
stop = true;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
return stop;
|
|
689
|
+
}
|
|
690
|
+
async handleForceExitBefore(evt, rtEvt) {
|
|
691
|
+
let forceExit = evt.UserEvt.ForceExit;
|
|
692
|
+
let isNewRec = false;
|
|
693
|
+
let oldIdx = 0;
|
|
694
|
+
if (forceExit === ForceExit.None || rtEvt.isImmediate())
|
|
695
|
+
return false;
|
|
696
|
+
this._isHandlingForceExit = true;
|
|
697
|
+
let task = rtEvt.getTask();
|
|
698
|
+
let oldRec = task.DataView.getCurrRec();
|
|
699
|
+
if (oldRec !== null && oldRec.getMode() === DataModificationTypes.Insert && oldRec.isNewRec()) {
|
|
700
|
+
isNewRec = true;
|
|
701
|
+
oldIdx = oldRec.getId();
|
|
702
|
+
}
|
|
703
|
+
if (forceExit !== ForceExit.Editing && task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
|
704
|
+
let ctrl = task.getLastParkedCtrl();
|
|
705
|
+
if (ctrl !== null)
|
|
706
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
707
|
+
}
|
|
708
|
+
if ((forceExit === ForceExit.PreRecordUpdate || forceExit === ForceExit.PostRecordUpdate) && task.getLevel() === Constants.TASK_LEVEL_RECORD) {
|
|
709
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
710
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && !this._stopExecution)
|
|
711
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
712
|
+
let currRec = task.DataView.getCurrRec();
|
|
713
|
+
if (currRec !== null && this._stopExecution && isNewRec && oldIdx === currRec.getId() && task.getMode() === Constants.TASK_MODE_CREATE) {
|
|
714
|
+
currRec.clearMode();
|
|
715
|
+
currRec.restart(DataModificationTypes.Insert);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
if (forceExit === ForceExit.PostRecordUpdate && !this._stopExecution) {
|
|
719
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
720
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
721
|
+
}
|
|
722
|
+
if (forceExit === ForceExit.Editing) {
|
|
723
|
+
let evtCtrl = rtEvt.Control;
|
|
724
|
+
if (evtCtrl !== null && evtCtrl.getField() !== null) {
|
|
725
|
+
let ctrlVal = Manager.GetCtrlVal(evtCtrl);
|
|
726
|
+
let evtCtrlval = evtCtrl.Value;
|
|
727
|
+
await evtCtrl.validateAndSetValue(ctrlVal, true);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
return true;
|
|
731
|
+
}
|
|
732
|
+
async handleForceExitAfter(rtEvt) {
|
|
733
|
+
let forceExit = rtEvt.UserEvt.ForceExit;
|
|
734
|
+
let task = rtEvt.getTask();
|
|
735
|
+
if (forceExit === ForceExit.PreRecordUpdate) {
|
|
736
|
+
await this.commitRecord(task, true);
|
|
737
|
+
if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
|
|
738
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
|
|
739
|
+
await task.endTask(true, false, false);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
if (forceExit !== ForceExit.PostRecordUpdate) {
|
|
743
|
+
task = rtEvt.getTask();
|
|
744
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
745
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
746
|
+
}
|
|
747
|
+
let ctrl = LastFocusedManager.getLastFocusedControl();
|
|
748
|
+
if (ctrl !== null && forceExit !== ForceExit.Editing) {
|
|
749
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
|
750
|
+
}
|
|
751
|
+
if (forceExit === ForceExit.Editing) {
|
|
752
|
+
let evtCtrl = rtEvt.Control;
|
|
753
|
+
if (evtCtrl !== null && evtCtrl.getField() !== null)
|
|
754
|
+
await evtCtrl.getField().updateDisplay();
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
async handleEvents_1(handlersTab, rtEvt) {
|
|
758
|
+
try {
|
|
759
|
+
this.pushRtEvent(rtEvt);
|
|
760
|
+
for (let i = 0; i < handlersTab.getSize(); i++) {
|
|
761
|
+
let handler = handlersTab.getHandler(i);
|
|
762
|
+
if (rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION || handler.isSpecificHandlerOf(rtEvt) || handler.isNonSpecificHandlerOf(rtEvt) || handler.isGlobalHandlerOf(rtEvt)) {
|
|
763
|
+
await handler.execute(rtEvt, false, false);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
finally {
|
|
768
|
+
this.popRtEvent();
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
async handleKeyDown(task, ctrl, evt) {
|
|
772
|
+
let kbdItem = evt.getKbdItmAlways();
|
|
773
|
+
let keyCode = kbdItem.getKeyCode();
|
|
774
|
+
let modifier = kbdItem.getModifier();
|
|
775
|
+
this._currKbdItem = kbdItem;
|
|
776
|
+
if (evt.IgnoreSpecifiedControl) {
|
|
777
|
+
ctrl = this.getCurrCtrl();
|
|
778
|
+
task = (((ctrl.getForm().getTask() instanceof Task) ? ctrl.getForm().getTask() : null));
|
|
779
|
+
if (ctrl.Type !== MgControlType.CTRL_TYPE_TEXT)
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
Logger.Instance.WriteDevToLog("Start handling KEYDOWN event. Key code: " + keyCode);
|
|
783
|
+
try {
|
|
784
|
+
if (this._currKbdItem.equals(this.KBI_DOWN) || this._currKbdItem.equals(this.KBI_UP)) {
|
|
785
|
+
if (ctrl !== null && (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO))
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
let rtEvt = new RunTimeEvent(task, ctrl);
|
|
789
|
+
rtEvt.setSystem(this._currKbdItem);
|
|
790
|
+
rtEvt.setEditParms(evt.getStartSelection(), evt.getEndSelection(), evt.getValue());
|
|
791
|
+
try {
|
|
792
|
+
await this.handleEvent(rtEvt, false);
|
|
793
|
+
}
|
|
794
|
+
finally {
|
|
795
|
+
if (this._stopExecution) {
|
|
796
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
|
797
|
+
if (returnToCtrl !== null && MgControl.validReturnToCtrl())
|
|
798
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
let mgd = MGDataCollection.Instance.getCurrMGData();
|
|
802
|
+
if (mgd !== null && !mgd.IsAborting)
|
|
803
|
+
await this.handleExpressionHandlers();
|
|
804
|
+
Logger.Instance.WriteDevToLog("End handling KEYDOWN event. Key code: " + keyCode);
|
|
805
|
+
if (ctrl !== null && ctrl.IsRepeatable && ctrl === MgControl.ReturnToCtrl) {
|
|
806
|
+
await ctrl.getForm().bringRecordToPage();
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
finally {
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
async handleSelection(ctrl, line, val) {
|
|
813
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_TAB || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_COMBO || ctrl.Type === MgControlType.CTRL_TYPE_LIST) {
|
|
814
|
+
let checkFocus = (ctrl.Type !== MgControlType.CTRL_TYPE_TAB && ctrl.Type !== MgControlType.CTRL_TYPE_CHECKBOX);
|
|
815
|
+
let allowSelection = (checkFocus ? (ctrl.getForm().getTask().getLastParkedCtrl() === ctrl) : true);
|
|
816
|
+
if (!allowSelection || !ctrl.isModifiable() || !await ctrl.IsParkable())
|
|
817
|
+
await ctrl.restoreOldValue();
|
|
818
|
+
else {
|
|
819
|
+
if (ctrl.isChoiceControl())
|
|
820
|
+
Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, true);
|
|
821
|
+
if (ctrl.isDifferentValue(val, ctrl.IsNull, true)) {
|
|
822
|
+
ctrl.ModifiedByUser = true;
|
|
823
|
+
await this.handleCtrlModify(ctrl, InternalInterface.MG_ACT_SELECTION);
|
|
824
|
+
}
|
|
825
|
+
if (ctrl.isChoiceControl())
|
|
826
|
+
Commands.setGetSuggestedValueOfChoiceControlOnTagData(ctrl, ctrl.IsRepeatable ? line : 0, false);
|
|
827
|
+
if (!ctrl.IsMultipleSelectionListBox())
|
|
828
|
+
await ctrl.validateAndSetValue(val, true);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
async handleMouseUp(ctrl, line, produceClick) {
|
|
833
|
+
if (ctrl === null)
|
|
834
|
+
return;
|
|
835
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO)
|
|
836
|
+
RuntimeContextBase.Instance.CurrentClickedRadio = ctrl;
|
|
837
|
+
try {
|
|
838
|
+
if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE) {
|
|
839
|
+
if (!await ctrl.checkPropWithLine(PropInterface.PROP_TYPE_ENABLED, true, line)) {
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
let canGotoCtrl = this.canGoToControl(ctrl, true);
|
|
843
|
+
let StopFocus = ctrl.isFocusedStopExecution();
|
|
844
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
|
845
|
+
if ((!canGotoCtrl || ((this._stopExecution || StopFocus) && returnToCtrl !== ctrl)) && returnToCtrl !== null) {
|
|
846
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
|
847
|
+
if (returnToCtrl.IsRepeatable)
|
|
848
|
+
await returnToCtrl.getForm().bringRecordToPage();
|
|
849
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
|
850
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
|
851
|
+
}
|
|
852
|
+
if (this._stopExecution || StopFocus)
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
855
|
+
if (produceClick && (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST)) {
|
|
856
|
+
let rtEvt = new RunTimeEvent(ctrl);
|
|
857
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_WEB_CLICK);
|
|
858
|
+
this.addToTail(rtEvt);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
finally {
|
|
862
|
+
RuntimeContextBase.Instance.CurrentClickedRadio = null;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt) {
|
|
866
|
+
if (aRtEvt.getType() == ConstInterface.EVENT_TYPE_INTERNAL && aRtEvt.getInternalCode() ==
|
|
867
|
+
InternalInterface.MG_ACT_WEBCLIENT_ROUTE && RuntimeContextBase.Instance.RemovedContextFromServer) {
|
|
868
|
+
this.setLastSavedRouteEvent(aRtEvt);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
async handleFocus(ctrl, line, onClick) {
|
|
872
|
+
try {
|
|
873
|
+
if (ctrl !== this._lastFailedFocusedControl && ctrl.HasExpOrParentTaskField()) {
|
|
874
|
+
if (ctrl.isListBox() || ctrl.isCheckBox() || ctrl.isComboBox() || ctrl.isTextControl() || ctrl.isRadio() || ctrl.isTabControl()) {
|
|
875
|
+
Logger.Instance.WriteErrorToLog(NString.Format("Control either has expression or has parent task variable attached to it. Failed to park on control with name: {0}", ctrl.Name));
|
|
876
|
+
FocusManager.SetFocus(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl(), 0, LastFocusedManager.getLastFocusedControl() === null ? true : false);
|
|
877
|
+
this._lastFailedFocusedControl = ctrl;
|
|
878
|
+
return;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
this._lastFailedFocusedControl = null;
|
|
882
|
+
if (onClick)
|
|
883
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = ctrl;
|
|
884
|
+
let prevCtrl = LastFocusedManager.getLastFocusedControl();
|
|
885
|
+
if (ctrl === prevCtrl && !ctrl.isRepeatable()) {
|
|
886
|
+
await ctrl.getForm().bringRecordToPage();
|
|
887
|
+
return;
|
|
888
|
+
}
|
|
889
|
+
let prevTask = LastFocusedManager.Instance.getLastFocusedTask();
|
|
890
|
+
this._nextParkedCtrl = ctrl;
|
|
891
|
+
if (ctrl === null || ctrl.Type === MgControlType.CTRL_TYPE_TABLE) {
|
|
892
|
+
if (prevCtrl === null)
|
|
893
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
|
894
|
+
return;
|
|
895
|
+
}
|
|
896
|
+
let currTask;
|
|
897
|
+
if ((ctrl.Type === MgControlType.CTRL_TYPE_BUTTON) && ((await (ctrl.getProp(PropInterface.PROP_TYPE_RAISE_AT)).getValueInt()) === RaiseAt.TaskInFocus))
|
|
898
|
+
currTask = prevTask;
|
|
899
|
+
else
|
|
900
|
+
currTask = ctrl.getForm().getTask();
|
|
901
|
+
let canGotoCtrl = this.canGoToControl(ctrl, onClick);
|
|
902
|
+
if (canGotoCtrl) {
|
|
903
|
+
if (this.guiPendingEvent != null)
|
|
904
|
+
return;
|
|
905
|
+
let handled = await this.HandleSubformModality(ctrl, prevTask, currTask);
|
|
906
|
+
if (handled)
|
|
907
|
+
return;
|
|
908
|
+
let eventLine = (ctrl.isRepeatable() || ctrl.isRadio()) ? line : Int32.MinValue;
|
|
909
|
+
let rtEvt = new RunTimeEvent(ctrl, eventLine);
|
|
910
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_PREFIX);
|
|
911
|
+
await this.handleEvent(rtEvt, false);
|
|
912
|
+
}
|
|
913
|
+
else if (prevCtrl !== null) {
|
|
914
|
+
if (!prevCtrl.isModifiable()) {
|
|
915
|
+
if (prevCtrl.isChoiceControl())
|
|
916
|
+
await prevCtrl.restoreOldValue();
|
|
917
|
+
}
|
|
918
|
+
else if (!currTask.cancelWasRaised()) {
|
|
919
|
+
let newVal = Manager.GetCtrlVal(prevCtrl);
|
|
920
|
+
if (!await prevCtrl.validateAndSetValue(newVal, true))
|
|
921
|
+
this.setStopExecution(true);
|
|
922
|
+
}
|
|
923
|
+
MgControl.ReturnToCtrl = prevCtrl;
|
|
924
|
+
}
|
|
925
|
+
else
|
|
926
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
|
927
|
+
if (!this._stopExecution && MgControl.ReturnToCtrl === ctrl)
|
|
928
|
+
LastFocusedManager.setLastFocusedControl(ctrl.getForm().getTask(), ctrl);
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
finally {
|
|
932
|
+
ctrl.setFocusedStopExecution(this._stopExecution);
|
|
933
|
+
if (this._stopExecution) {
|
|
934
|
+
{
|
|
935
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
|
936
|
+
if (returnToCtrl !== null) {
|
|
937
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
|
938
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
|
939
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
async HandleSubformModality(ctrl, prevTask, currTask) {
|
|
946
|
+
let handledSubformModality = false;
|
|
947
|
+
let length = prevTask.getMGData().getTasksCount();
|
|
948
|
+
let topTask = prevTask.getMGData().getTask(length - 1);
|
|
949
|
+
if (currTask == prevTask || prevTask != topTask) {
|
|
950
|
+
if (topTask != null && prevTask != topTask && topTask.IsSubForm) {
|
|
951
|
+
let subformCtrl = topTask.getForm().getSubFormCtrl();
|
|
952
|
+
if (subformCtrl.IsModal())
|
|
953
|
+
prevTask = topTask;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
if (prevTask != ctrl.getForm().getTask() && prevTask.getIsDestinationCall()) {
|
|
957
|
+
if (!currTask.isDescendentOf(prevTask)) {
|
|
958
|
+
let subformCtrl = prevTask.getForm().getSubFormCtrl();
|
|
959
|
+
if (!subformCtrl.IsModal() && !currTask.getIsDestinationCall())
|
|
960
|
+
subformCtrl = prevTask.GetSubformModalParentTask();
|
|
961
|
+
if (subformCtrl != null && (ctrl != subformCtrl) && subformCtrl.IsModal()) {
|
|
962
|
+
await this.performSubformClose(subformCtrl);
|
|
963
|
+
if (!this._stopExecution)
|
|
964
|
+
this.guiPendingEvent = this.getLastRtEvent();
|
|
965
|
+
handledSubformModality = true;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
return handledSubformModality;
|
|
970
|
+
}
|
|
971
|
+
async handleFocusOnNonMagicControl(ctrl) {
|
|
972
|
+
try {
|
|
973
|
+
await EventsManager.Instance.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
974
|
+
}
|
|
975
|
+
finally {
|
|
976
|
+
ctrl.setFocusedStopExecution(this._stopExecution);
|
|
977
|
+
if (this._stopExecution) {
|
|
978
|
+
{
|
|
979
|
+
let returnToCtrl = MgControl.ReturnToCtrl;
|
|
980
|
+
if (returnToCtrl !== null) {
|
|
981
|
+
MGDataCollection.Instance.currMgdID = returnToCtrl.getForm().getTask().getMgdID();
|
|
982
|
+
await FocusManager.SetFocus(returnToCtrl, -1);
|
|
983
|
+
returnToCtrl.getForm().getTask().setLastParkedCtrl(returnToCtrl);
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
canGoToControl(ctrl, onClick) {
|
|
990
|
+
if (onClick && (ctrl.Type === MgControlType.CTRL_TYPE_SUBFORM || ctrl.Type === MgControlType.CTRL_TYPE_BROWSER))
|
|
991
|
+
return false;
|
|
992
|
+
let canGotoCtrl = true;
|
|
993
|
+
let currTask = ctrl.getForm().getTask();
|
|
994
|
+
if (!currTask.IsInteractive)
|
|
995
|
+
return false;
|
|
996
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_IMAGE && !ctrl.IsRepeatable)
|
|
997
|
+
canGotoCtrl = false;
|
|
998
|
+
return canGotoCtrl;
|
|
999
|
+
}
|
|
1000
|
+
async handleTimer(evt) {
|
|
1001
|
+
evt.setType(ConstInterface.EVENT_TYPE_TIMER);
|
|
1002
|
+
if (evt.isIdleTimer()) {
|
|
1003
|
+
await this.handleExpressionHandlers();
|
|
1004
|
+
await this.handleContextInactivityAlert(evt);
|
|
1005
|
+
}
|
|
1006
|
+
else {
|
|
1007
|
+
let mgd = MGDataCollection.Instance.getMGData(evt.getMgdID());
|
|
1008
|
+
await this.handleEvents(mgd.getTimerHandlers(), evt);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
async handleContextInactivityAlert(evt) {
|
|
1012
|
+
let timeNow = Misc.getSystemMilliseconds();
|
|
1013
|
+
let mgd = evt.getTask().getMGData();
|
|
1014
|
+
let lastRequestTime = RemoteCommandsProcessor.GetInstance().GetLastRequestTime;
|
|
1015
|
+
let contextInactivityTimeout = Environment.Instance.getContextInactivityTimeout() / 10;
|
|
1016
|
+
let contextInactivityWarningTime = Environment.Instance.getContextInactivityWarningTime() / 10;
|
|
1017
|
+
let idleTime = (timeNow - lastRequestTime) / 1000;
|
|
1018
|
+
if (contextInactivityTimeout == 0 || contextInactivityWarningTime == 0)
|
|
1019
|
+
return;
|
|
1020
|
+
if (EventsManager.userGrantedForContextActivity && idleTime >= (contextInactivityTimeout - contextInactivityWarningTime)) {
|
|
1021
|
+
let userConfirmation = await GUIManager.Instance.MessageBox(this.confirmationDialogTitle, this.confirmationDialogMsg, Styles.MSGBOX_BUTTON_YES_NO);
|
|
1022
|
+
if (userConfirmation == Styles.MSGBOX_RESULT_YES) {
|
|
1023
|
+
let cmd = CommandFactory.CreateContextTimeoutResetEventCommand();
|
|
1024
|
+
mgd.CmdsToServer.Add(cmd);
|
|
1025
|
+
await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
|
|
1026
|
+
}
|
|
1027
|
+
else {
|
|
1028
|
+
EventsManager.userGrantedForContextActivity = false;
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
async handleExpressionHandlers() {
|
|
1033
|
+
let rtEvt = new RunTimeEvent(LastFocusedManager.Instance.getLastFocusedTask(), LastFocusedManager.getLastFocusedControl());
|
|
1034
|
+
rtEvt.setExpression(null);
|
|
1035
|
+
rtEvt.setMainPrgCreator(rtEvt.getTask());
|
|
1036
|
+
for (let i = 0; i < MGDataCollection.Instance.getSize(); i++) {
|
|
1037
|
+
let mgd = MGDataCollection.Instance.getMGData(i);
|
|
1038
|
+
if (mgd !== null && !mgd.IsAborting)
|
|
1039
|
+
await this.handleEvents(mgd.getExpHandlers(), rtEvt);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
handleResize(ctrl, rowsInPage) {
|
|
1043
|
+
ctrl.getForm().setRowsInPage(rowsInPage);
|
|
1044
|
+
}
|
|
1045
|
+
async handleRowDataCurPage(table, desiredTopIndex, sendAll, lastFocusedVal) {
|
|
1046
|
+
let form = table.getForm();
|
|
1047
|
+
await form.setRowData(desiredTopIndex, sendAll);
|
|
1048
|
+
}
|
|
1049
|
+
async handleTransferDataToGui(ctrl) {
|
|
1050
|
+
let form = ctrl.getForm();
|
|
1051
|
+
await form.transferDataToGui();
|
|
1052
|
+
}
|
|
1053
|
+
async fetchRecordsAheadFromServer(ctrl) {
|
|
1054
|
+
let form = ctrl.getForm();
|
|
1055
|
+
await form.FetchRecordsAheadFromServer();
|
|
1056
|
+
}
|
|
1057
|
+
handleEnableEvents(evt, enable) {
|
|
1058
|
+
evt.getTask().ActionManager.enableList(evt.getActEnableList(), enable, true);
|
|
1059
|
+
}
|
|
1060
|
+
async handleCtrlPrefix(evt) {
|
|
1061
|
+
let task = evt.getTask();
|
|
1062
|
+
let currClickedCtrl = RuntimeContextBase.Instance.CurrentClickedCtrl;
|
|
1063
|
+
let form = task.getForm();
|
|
1064
|
+
let displayLine = evt.getDisplayLine();
|
|
1065
|
+
let ctrl = evt.Control;
|
|
1066
|
+
if (form.isLineMode()) {
|
|
1067
|
+
if (displayLine === Int32.MinValue || ctrl.isRadio())
|
|
1068
|
+
displayLine = form.DisplayLine;
|
|
1069
|
+
}
|
|
1070
|
+
else
|
|
1071
|
+
displayLine = Int32.MinValue;
|
|
1072
|
+
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
|
1073
|
+
if (lastParkedCtrl !== null && lastParkedCtrl.getForm().getTask().getMGData().GetId() === ctrl.getForm().getTask().getMGData().GetId() && lastParkedCtrl.getForm().getTask().getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
|
1074
|
+
if ((ctrl !== lastParkedCtrl || (ctrl.isRepeatable() && displayLine !== ctrl.getDisplayLine(true))) && !lastParkedCtrl.isInControlSuffix()) {
|
|
1075
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
1076
|
+
if (this._stopExecution) {
|
|
1077
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
|
|
1078
|
+
ctrl.resetPrevVal();
|
|
1079
|
+
await ctrl.RefreshDisplay();
|
|
1080
|
+
}
|
|
1081
|
+
return false;
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
else
|
|
1085
|
+
return false;
|
|
1086
|
+
}
|
|
1087
|
+
if (task.InCtrlPrefix)
|
|
1088
|
+
return false;
|
|
1089
|
+
task.InCtrlPrefix = true;
|
|
1090
|
+
let prevCtrl = lastParkedCtrl;
|
|
1091
|
+
if (currClickedCtrl !== null && currClickedCtrl.getForm().getTask().getMgdID() === ctrl.getForm().getTask().getMgdID() && ctrl.onDiffForm(currClickedCtrl))
|
|
1092
|
+
prevCtrl = currClickedCtrl;
|
|
1093
|
+
if (prevCtrl !== null && ctrl.onDiffForm(prevCtrl)) {
|
|
1094
|
+
let prevTask = prevCtrl.getForm().getTask();
|
|
1095
|
+
await prevTask.execSubformRecSuffix(ctrl.getForm().getTask());
|
|
1096
|
+
if (this._stopExecution) {
|
|
1097
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.isTabControl()) {
|
|
1098
|
+
ctrl.resetPrevVal();
|
|
1099
|
+
await ctrl.RefreshDisplay();
|
|
1100
|
+
}
|
|
1101
|
+
task.InCtrlPrefix = false;
|
|
1102
|
+
return false;
|
|
1103
|
+
}
|
|
1104
|
+
if (ctrl.getForm().getTask().isAborting()) {
|
|
1105
|
+
task.InCtrlPrefix = false;
|
|
1106
|
+
return false;
|
|
1107
|
+
}
|
|
1108
|
+
await EventsManager.doSyncForSubformParent(task);
|
|
1109
|
+
}
|
|
1110
|
+
if (task.DataView.isEmptyDataview())
|
|
1111
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1112
|
+
else {
|
|
1113
|
+
task.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
|
|
1114
|
+
let rtEvt = new RunTimeEvent(ctrl, displayLine);
|
|
1115
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_REC_PREFIX);
|
|
1116
|
+
await this.handleEvent(rtEvt, false);
|
|
1117
|
+
}
|
|
1118
|
+
if (this.GetStopExecutionFlag()) {
|
|
1119
|
+
task.InCtrlPrefix = false;
|
|
1120
|
+
return false;
|
|
1121
|
+
}
|
|
1122
|
+
if (!await ctrl.IsParkable() && ctrl !== lastParkedCtrl) {
|
|
1123
|
+
task.InCtrlPrefix = false;
|
|
1124
|
+
if (lastParkedCtrl === null || !await lastParkedCtrl.invoke())
|
|
1125
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
|
1126
|
+
return false;
|
|
1127
|
+
}
|
|
1128
|
+
Logger.Instance.WriteSupportToLog(NString.Format("{0} Entering control: control {1}, row {2}", task.GetTaskDetails(), ctrl.Name, displayLine < 0 ? 0 : displayLine), true);
|
|
1129
|
+
task.setLevel(Constants.TASK_LEVEL_CONTROL);
|
|
1130
|
+
ctrl.KeyStrokeOn = false;
|
|
1131
|
+
ctrl.ModifiedByUser = false;
|
|
1132
|
+
task.setCurrField(ctrl.getField());
|
|
1133
|
+
if (ctrl.IsRepeatable)
|
|
1134
|
+
await form.bringRecordToPage();
|
|
1135
|
+
if (lastParkedCtrl !== ctrl) {
|
|
1136
|
+
if ((lastParkedCtrl === null && ctrl.getForm().isSubForm()) || (lastParkedCtrl !== null && (ctrl.getForm().isSubForm() || lastParkedCtrl.getForm().isSubForm()))) {
|
|
1137
|
+
let lastParkedTask = null;
|
|
1138
|
+
if (lastParkedCtrl !== null)
|
|
1139
|
+
lastParkedTask = lastParkedCtrl.getForm().getTask();
|
|
1140
|
+
if (lastParkedTask !== task) {
|
|
1141
|
+
let firstTime = true;
|
|
1142
|
+
let isSonSubform;
|
|
1143
|
+
let parentTask;
|
|
1144
|
+
if (lastParkedTask !== null) {
|
|
1145
|
+
isSonSubform = lastParkedTask.IsSubForm;
|
|
1146
|
+
for (parentTask = lastParkedTask; parentTask !== null && isSonSubform; parentTask = parentTask.getParent()) {
|
|
1147
|
+
if (!firstTime) {
|
|
1148
|
+
isSonSubform = parentTask.IsSubForm;
|
|
1149
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
|
|
1150
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
|
|
1151
|
+
parentTask.enableCreateActs(false);
|
|
1152
|
+
}
|
|
1153
|
+
else
|
|
1154
|
+
firstTime = false;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
isSonSubform = task.IsSubForm;
|
|
1158
|
+
for (parentTask = task.getParent(); (parentTask !== null) && isSonSubform; parentTask = parentTask.getParent()) {
|
|
1159
|
+
isSonSubform = parentTask.IsSubForm;
|
|
1160
|
+
if (parentTask.getEnableZoomHandler())
|
|
1161
|
+
parentTask.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
|
1162
|
+
await parentTask.setCreateDeleteActsEnableState();
|
|
1163
|
+
}
|
|
1164
|
+
await task.enableModes();
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
|
|
1169
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
|
1170
|
+
if (ctrl.isTextControl() || ctrl.isChoiceControl())
|
|
1171
|
+
ctrl.SetKeyboardLanguage();
|
|
1172
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
|
|
1173
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, true);
|
|
1174
|
+
await task.setCreateDeleteActsEnableState();
|
|
1175
|
+
let field = ctrl.getField();
|
|
1176
|
+
if (field !== null && field.NullAllowed && ctrl.isModifiable() && ctrl.Type !== MgControlType.CTRL_TYPE_BUTTON)
|
|
1177
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, true);
|
|
1178
|
+
return true;
|
|
1179
|
+
}
|
|
1180
|
+
async commonHandlerBefore(evt) {
|
|
1181
|
+
let evtSave = evt;
|
|
1182
|
+
let task = evt.getTask();
|
|
1183
|
+
let rec = null;
|
|
1184
|
+
let prevRec = null;
|
|
1185
|
+
let val;
|
|
1186
|
+
let oldDisplayLine = Int32.MinValue;
|
|
1187
|
+
if (this._stopExecution)
|
|
1188
|
+
return false;
|
|
1189
|
+
if (task.isAborting())
|
|
1190
|
+
return false;
|
|
1191
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
|
|
1192
|
+
let actId = this.getMatchingAction(evt.getKbdItm());
|
|
1193
|
+
if (actId !== 0 && evt.Control !== null) {
|
|
1194
|
+
evt = new RunTimeEvent(evt, evt);
|
|
1195
|
+
evt.setInternal(actId);
|
|
1196
|
+
evt.setArgList(null);
|
|
1197
|
+
let mgControl = evt.Control;
|
|
1198
|
+
evtSave.setCtrl(mgControl);
|
|
1199
|
+
if (mgControl === null)
|
|
1200
|
+
return false;
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
|
1204
|
+
let form = task.getForm();
|
|
1205
|
+
let displayLine = evt.getDisplayLine();
|
|
1206
|
+
let dv = task.DataView;
|
|
1207
|
+
rec = dv.getCurrRec();
|
|
1208
|
+
let ctrl = evt.Control;
|
|
1209
|
+
let intEvtCode = evt.getInternalCode();
|
|
1210
|
+
let lastFocusedCtrl = LastFocusedManager.getLastFocusedControl();
|
|
1211
|
+
switch (intEvtCode) {
|
|
1212
|
+
case InternalInterface.MG_ACT_ZOOM:
|
|
1213
|
+
let boolval = await this.selectProg(ctrl);
|
|
1214
|
+
if (boolval)
|
|
1215
|
+
return false;
|
|
1216
|
+
case InternalInterface.MG_ACT_WEB_ON_DBLICK:
|
|
1217
|
+
break;
|
|
1218
|
+
case InternalInterface.MG_ACT_CTRL_FOCUS:
|
|
1219
|
+
await this.handleFocus(ctrl, displayLine, evt.isProduceClick());
|
|
1220
|
+
return false;
|
|
1221
|
+
case InternalInterface.MG_ACT_CTRL_FOCUS_ON_NON_MAGIC_CONTROL:
|
|
1222
|
+
await this.handleFocusOnNonMagicControl(ctrl);
|
|
1223
|
+
return false;
|
|
1224
|
+
case InternalInterface.MG_ACT_CTRL_KEYDOWN:
|
|
1225
|
+
await this.handleKeyDown(task, ctrl, evt);
|
|
1226
|
+
return false;
|
|
1227
|
+
case InternalInterface.MG_ACT_CTRL_MOUSEUP:
|
|
1228
|
+
await this.handleMouseUp(ctrl, displayLine, evt.isProduceClick());
|
|
1229
|
+
return false;
|
|
1230
|
+
case InternalInterface.MG_ACT_SELECTION:
|
|
1231
|
+
await this.onActSelection(ctrl, form, evt);
|
|
1232
|
+
return false;
|
|
1233
|
+
case InternalInterface.MG_ACT_TIMER:
|
|
1234
|
+
await this.handleTimer(evt);
|
|
1235
|
+
return false;
|
|
1236
|
+
case InternalInterface.MG_ACT_RESIZE:
|
|
1237
|
+
this.handleResize(ctrl, displayLine);
|
|
1238
|
+
return false;
|
|
1239
|
+
case InternalInterface.MG_ACT_ROW_DATA_CURR_PAGE:
|
|
1240
|
+
await this.handleRowDataCurPage(ctrl, displayLine, evt.isSendAll(), evt.LastFocusedVal);
|
|
1241
|
+
return false;
|
|
1242
|
+
case InternalInterface.MG_ACT_DV_TO_GUI:
|
|
1243
|
+
await this.handleTransferDataToGui(ctrl);
|
|
1244
|
+
return false;
|
|
1245
|
+
case InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER:
|
|
1246
|
+
await this.fetchRecordsAheadFromServer(ctrl);
|
|
1247
|
+
break;
|
|
1248
|
+
case InternalInterface.MG_ACT_ENABLE_EVENTS:
|
|
1249
|
+
this.handleEnableEvents(evt, true);
|
|
1250
|
+
return false;
|
|
1251
|
+
case InternalInterface.MG_ACT_DISABLE_EVENTS:
|
|
1252
|
+
this.handleEnableEvents(evt, false);
|
|
1253
|
+
return false;
|
|
1254
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
|
1255
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
1256
|
+
break;
|
|
1257
|
+
case InternalInterface.MG_ACT_TASK_SUFFIX:
|
|
1258
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
1259
|
+
break;
|
|
1260
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
|
1261
|
+
if (task.IsSubForm && task.getParent().InCommonHandlerBeforeRP)
|
|
1262
|
+
return false;
|
|
1263
|
+
task.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
|
1264
|
+
task.DataSynced = false;
|
|
1265
|
+
if (!task.isStarted())
|
|
1266
|
+
return false;
|
|
1267
|
+
if (form.getRowsInPage() > Int32.MinValue && displayLine > Int32.MinValue) {
|
|
1268
|
+
while (!dv.recExists(displayLine) && displayLine > 0) {
|
|
1269
|
+
displayLine--;
|
|
1270
|
+
}
|
|
1271
|
+
if (displayLine >= 0) {
|
|
1272
|
+
prevRec = dv.getCurrRec();
|
|
1273
|
+
let oldTaskMode = task.getMode();
|
|
1274
|
+
let oldRecId = prevRec.getId();
|
|
1275
|
+
try {
|
|
1276
|
+
oldDisplayLine = form.DisplayLine;
|
|
1277
|
+
form.PrevDisplayLine = oldDisplayLine;
|
|
1278
|
+
await form.setCurrRowByDisplayLine(displayLine, true, false);
|
|
1279
|
+
if (prevRec != null && !dv.recExistsById(prevRec.getId())) {
|
|
1280
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
|
|
1281
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1282
|
+
}
|
|
1283
|
+
rec = dv.getCurrRec();
|
|
1284
|
+
}
|
|
1285
|
+
catch (e) {
|
|
1286
|
+
if (e instanceof RecordOutOfDataViewException) {
|
|
1287
|
+
if (this._stopExecution) {
|
|
1288
|
+
if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0 &&
|
|
1289
|
+
!dv.recExistsById(oldRecId)) {
|
|
1290
|
+
let prevLine = form.getPrevLine(oldDisplayLine);
|
|
1291
|
+
await form.restoreOldDisplayLine(prevLine);
|
|
1292
|
+
}
|
|
1293
|
+
else
|
|
1294
|
+
await form.restoreOldDisplayLine(oldDisplayLine);
|
|
1295
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
1296
|
+
this.setStopExecution(false);
|
|
1297
|
+
lastFocusedCtrl = task.getLastParkedCtrl();
|
|
1298
|
+
task.getLastParkedCtrl();
|
|
1299
|
+
if (lastFocusedCtrl != null)
|
|
1300
|
+
await lastFocusedCtrl.invoke();
|
|
1301
|
+
this.setStopExecution(true);
|
|
1302
|
+
return false;
|
|
1303
|
+
}
|
|
1304
|
+
else
|
|
1305
|
+
Logger.Instance.WriteDevToLog(e.StackTrace);
|
|
1306
|
+
}
|
|
1307
|
+
else
|
|
1308
|
+
throw e;
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
else
|
|
1312
|
+
throw new ApplicationException("in EventsManager.commonHandlerBefore(): invalid line number: " +
|
|
1313
|
+
displayLine);
|
|
1314
|
+
}
|
|
1315
|
+
if (rec == null)
|
|
1316
|
+
throw new ApplicationException("in EventsManager.commonHandlerBefore(): no current record available !");
|
|
1317
|
+
if (!task.IsInteractive && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
1318
|
+
task.increaseCounter();
|
|
1319
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_BEFORE)) {
|
|
1320
|
+
await task.endTask(true, false, false);
|
|
1321
|
+
return false;
|
|
1322
|
+
}
|
|
1323
|
+
if (form.HasTable())
|
|
1324
|
+
await form.bringRecordToPage();
|
|
1325
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_TASK)
|
|
1326
|
+
return false;
|
|
1327
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1328
|
+
Logger.Instance.WriteDevToLog("RECORD PREFIX: " + task.queryTaskPath());
|
|
1329
|
+
(dv.getCurrRec()).setForceSaveOrg(false);
|
|
1330
|
+
(dv.getCurrRec()).Synced = false;
|
|
1331
|
+
dv.saveOriginal();
|
|
1332
|
+
if (task.IsSubForm && task.PerformParentRecordPrefix) {
|
|
1333
|
+
let parentTask = task.getParent();
|
|
1334
|
+
while (parentTask.IsSubForm) {
|
|
1335
|
+
if (parentTask.getLevel() === Constants.TASK_LEVEL_TASK) {
|
|
1336
|
+
await this.handleInternalEventWithTask(parentTask, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1337
|
+
parentTask = parentTask.getParent();
|
|
1338
|
+
if (this.GetStopExecutionFlag())
|
|
1339
|
+
break;
|
|
1340
|
+
}
|
|
1341
|
+
else
|
|
1342
|
+
break;
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
task.InCommonHandlerBeforeRP = true;
|
|
1346
|
+
if (await task.CheckRefreshSubTasks())
|
|
1347
|
+
await dv.computeSubForms();
|
|
1348
|
+
task.InCommonHandlerBeforeRP = false;
|
|
1349
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
1350
|
+
await task.enableRecordActions();
|
|
1351
|
+
break;
|
|
1352
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
|
1353
|
+
let forceSuffix = false;
|
|
1354
|
+
let isSelectionTable;
|
|
1355
|
+
task.ConfirmUpdateNo = false;
|
|
1356
|
+
if (rec == null)
|
|
1357
|
+
return false;
|
|
1358
|
+
forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
|
1359
|
+
if ((rec.Modified || forceSuffix) && rec.getMode() === DataModificationTypes.Delete &&
|
|
1360
|
+
task.getMode() === Constants.TASK_MODE_DELETE)
|
|
1361
|
+
return true;
|
|
1362
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
1363
|
+
return false;
|
|
1364
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
|
1365
|
+
task.setInRecordSuffix(true);
|
|
1366
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
1367
|
+
task.setInRecordSuffix(false);
|
|
1368
|
+
if (this._stopExecution)
|
|
1369
|
+
return false;
|
|
1370
|
+
}
|
|
1371
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1372
|
+
if (this._stopExecution)
|
|
1373
|
+
return false;
|
|
1374
|
+
Logger.Instance.WriteDevToLog("RECORD SUFFIX: " + task.queryTaskPath());
|
|
1375
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
1376
|
+
isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
|
|
1377
|
+
if (task.getMode() === Constants.TASK_MODE_QUERY && !forceSuffix && !rec.Modified &&
|
|
1378
|
+
!isSelectionTable)
|
|
1379
|
+
return false;
|
|
1380
|
+
if (!rec.Modified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
|
|
1381
|
+
if (rec.getMode() === DataModificationTypes.Delete) {
|
|
1382
|
+
return await this.executeControlVerification(task);
|
|
1383
|
+
}
|
|
1384
|
+
return false;
|
|
1385
|
+
}
|
|
1386
|
+
if (task.getMode() !== Constants.TASK_MODE_DELETE && rec.Modified) {
|
|
1387
|
+
if (!await this.updateConfirmed(task))
|
|
1388
|
+
return false;
|
|
1389
|
+
}
|
|
1390
|
+
let stopExecution = !await this.executeControlVerification(task);
|
|
1391
|
+
if (stopExecution)
|
|
1392
|
+
return false;
|
|
1393
|
+
break;
|
|
1394
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
|
1395
|
+
if (await this.handleCtrlPrefix(evt))
|
|
1396
|
+
return true;
|
|
1397
|
+
else {
|
|
1398
|
+
evt.Control.InControl = false;
|
|
1399
|
+
return false;
|
|
1400
|
+
}
|
|
1401
|
+
case InternalInterface.MG_ACT_CANCEL:
|
|
1402
|
+
Manager.CleanMessagePane(task);
|
|
1403
|
+
break;
|
|
1404
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
|
1405
|
+
if (ctrl == null || this.getStopExecutionCtrl() != null)
|
|
1406
|
+
return false;
|
|
1407
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL)
|
|
1408
|
+
return false;
|
|
1409
|
+
if (!ctrl.isSubform()) {
|
|
1410
|
+
val = Manager.GetCtrlVal(ctrl);
|
|
1411
|
+
task.CurrentEditingControl = null;
|
|
1412
|
+
if (!task.cancelWasRaised() &&
|
|
1413
|
+
(ctrl.Type !== MgControlType.CTRL_TYPE_BROWSER && (!isNullOrUndefined(ctrl._field) && ctrl._field.getType() === StorageAttribute.DATE || val !== null) && typeof val != "undefined" &&
|
|
1414
|
+
!await ctrl.validateAndSetValue(val, true))) {
|
|
1415
|
+
this.setStopExecution(true);
|
|
1416
|
+
return false;
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
if (!this._stopExecution)
|
|
1420
|
+
Manager.CleanMessagePane(task);
|
|
1421
|
+
ctrl.InControl = false;
|
|
1422
|
+
ctrl.ClipBoardDataExists = false;
|
|
1423
|
+
ctrl.ValidateControl = true;
|
|
1424
|
+
ctrl.setInControlSuffix(true);
|
|
1425
|
+
break;
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
return true;
|
|
1429
|
+
}
|
|
1430
|
+
async selectProg(ctrl) {
|
|
1431
|
+
let cmd;
|
|
1432
|
+
let value;
|
|
1433
|
+
let mgVal;
|
|
1434
|
+
let progExecuted = false;
|
|
1435
|
+
let task = ctrl.getForm().getTask();
|
|
1436
|
+
if (ctrl.HasSelectProgram()) {
|
|
1437
|
+
if (ctrl.IsParkable()) {
|
|
1438
|
+
value = Manager.GetCtrlVal(ctrl);
|
|
1439
|
+
if (!ctrl.validateAndSetValue(value, false))
|
|
1440
|
+
this.setStopExecution(true);
|
|
1441
|
+
else {
|
|
1442
|
+
let encodedVal = null;
|
|
1443
|
+
mgVal = await ctrl.getMgValue(value);
|
|
1444
|
+
var rec = task.DataView.getCurrRec();
|
|
1445
|
+
encodedVal = rec.getXMLForValue(ctrl.getField().getId(), mgVal);
|
|
1446
|
+
cmd = CommandFactory.CreateSelectProgramCommand(task.getTaskTag(), null, Int32.MinValue, ctrl.getDitIdx(), encodedVal);
|
|
1447
|
+
task.getMGData().CmdsToServer.Add(cmd);
|
|
1448
|
+
let commandsProcessorServer = CommandsProcessorManager.GetCommandsProcessor();
|
|
1449
|
+
await commandsProcessorServer.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1450
|
+
progExecuted = true;
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
return progExecuted;
|
|
1455
|
+
}
|
|
1456
|
+
async executeControlVerification(task) {
|
|
1457
|
+
let table = task.getHandlersTab();
|
|
1458
|
+
for (let i = 0; i < table.getSize(); i++) {
|
|
1459
|
+
let handler = table.getHandler(i);
|
|
1460
|
+
let evt = handler.getEvent();
|
|
1461
|
+
if (evt.getInternalCode() === InternalInterface.MG_ACT_CTRL_VERIFICATION) {
|
|
1462
|
+
let control = ((task.getForm() !== null) ? task.getForm().getCtrlByCtrlName(handler.getCtrlName()) : null);
|
|
1463
|
+
if (!isNullOrUndefined(control)) {
|
|
1464
|
+
let runTimeEvent = new RunTimeEvent(control);
|
|
1465
|
+
runTimeEvent.setInternal(InternalInterface.MG_ACT_CTRL_VERIFICATION);
|
|
1466
|
+
await this.handleEvent(runTimeEvent, false);
|
|
1467
|
+
if (this._stopExecution) {
|
|
1468
|
+
LastFocusedManager.setLastFocusedControl(task, control);
|
|
1469
|
+
this.setStopExecutionCtrl(null);
|
|
1470
|
+
this.setStopExecutionCtrl(control);
|
|
1471
|
+
return false;
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
return true;
|
|
1477
|
+
}
|
|
1478
|
+
async onActSelection(ctrl, form, evt) {
|
|
1479
|
+
let displayLine = evt.getDisplayLine();
|
|
1480
|
+
if (displayLine === Int32.MinValue)
|
|
1481
|
+
displayLine = form.DisplayLine;
|
|
1482
|
+
let simulate = ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_LIST || ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_BUTTON || (ctrl.Type === MgControlType.CTRL_TYPE_TAB && !evt.isProduceClick());
|
|
1483
|
+
if (simulate)
|
|
1484
|
+
await this.simulateSelection(ctrl, evt.getValue(), displayLine, evt.isProduceClick());
|
|
1485
|
+
else
|
|
1486
|
+
await this.handleSelection(ctrl, displayLine, evt.getValue());
|
|
1487
|
+
}
|
|
1488
|
+
async onSubformClose(task, evt) {
|
|
1489
|
+
if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
|
|
1490
|
+
let subformCtrl = null;
|
|
1491
|
+
let closingSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
|
|
1492
|
+
if (closingSubformName == null)
|
|
1493
|
+
return;
|
|
1494
|
+
for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
|
|
1495
|
+
subformCtrl = parentTask.getForm().getCtrlByName(closingSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
|
|
1496
|
+
if (subformCtrl != null) {
|
|
1497
|
+
let subformTask = subformCtrl.getSubformTask();
|
|
1498
|
+
if (subformTask != null && !subformTask.IsRoute()) {
|
|
1499
|
+
{
|
|
1500
|
+
await this.performSubformClose(subformCtrl);
|
|
1501
|
+
}
|
|
1502
|
+
break;
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
async performSubformClose(subformCtrl) {
|
|
1509
|
+
let subformTask = subformCtrl.getSubformTask();
|
|
1510
|
+
let parentTask = subformCtrl.getForm().getTask();
|
|
1511
|
+
let mgd = subformTask.getMGData();
|
|
1512
|
+
this.pushNewExecStacks();
|
|
1513
|
+
await subformTask.endTask(true, false, false, true);
|
|
1514
|
+
this.popNewExecStacks();
|
|
1515
|
+
if (!this._stopExecution) {
|
|
1516
|
+
parentTask.TaskService.RemoveRecomputes(parentTask);
|
|
1517
|
+
await subformTask.stop();
|
|
1518
|
+
subformCtrl.resetSubformTask();
|
|
1519
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1520
|
+
Commands.addClosesubform(CommandType.CLOSE_SUB_FORM, subformCtrl, subformTask.getTaskTag(), subformCtrl.getName(), subformTask.getForm().buildFormName());
|
|
1521
|
+
if (subformCtrl.IsModal())
|
|
1522
|
+
mgd.abort();
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
async moveToLine(form, displayLine, ctrl) {
|
|
1526
|
+
let runTimeEvent = new RunTimeEvent(ctrl, displayLine);
|
|
1527
|
+
runTimeEvent.setInternal(InternalInterface.MG_ACT_REC_PREFIX);
|
|
1528
|
+
await this.handleEvent(runTimeEvent, false);
|
|
1529
|
+
if (ctrl !== null)
|
|
1530
|
+
await ctrl.invoke();
|
|
1531
|
+
form.SelectRow(true);
|
|
1532
|
+
}
|
|
1533
|
+
createEventArguments(evt) {
|
|
1534
|
+
if (evt.getArgList() === null) {
|
|
1535
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
|
1536
|
+
switch (evt.getInternalCode()) {
|
|
1537
|
+
default:
|
|
1538
|
+
break;
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
async DoTaskLevelRecordSuffix(task, refDoSuffix) {
|
|
1544
|
+
let shouldReturn = false;
|
|
1545
|
+
if (task.getLevel() === Constants.TASK_LEVEL_RECORD) {
|
|
1546
|
+
refDoSuffix.value = false;
|
|
1547
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1548
|
+
if (this.GetStopExecutionFlag())
|
|
1549
|
+
shouldReturn = true;
|
|
1550
|
+
}
|
|
1551
|
+
return shouldReturn;
|
|
1552
|
+
}
|
|
1553
|
+
async DoTaskLevelRecordPrefix(task) {
|
|
1554
|
+
if (!this.GetStopExecutionFlag()) {
|
|
1555
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
async commonHandler(evt) {
|
|
1559
|
+
let task = evt.getTask();
|
|
1560
|
+
let mgData = task.getMGData();
|
|
1561
|
+
let form = task.getForm();
|
|
1562
|
+
let ctrl = evt.Control;
|
|
1563
|
+
let lastParkedCtrl;
|
|
1564
|
+
let doSuffix = true;
|
|
1565
|
+
let oldMode;
|
|
1566
|
+
let server = Task.CommandsProcessor;
|
|
1567
|
+
if (this._stopExecution)
|
|
1568
|
+
return;
|
|
1569
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_USER)
|
|
1570
|
+
evt = new RunTimeEvent(evt.getUserEvent(), evt);
|
|
1571
|
+
try {
|
|
1572
|
+
this.pushRtEvent(evt);
|
|
1573
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_SYSTEM) {
|
|
1574
|
+
let actId = this.getMatchingAction(evt.getKbdItm());
|
|
1575
|
+
if (actId !== 0) {
|
|
1576
|
+
evt = new RunTimeEvent(evt, evt);
|
|
1577
|
+
evt.setInternal(actId);
|
|
1578
|
+
evt.setArgList(null);
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
let cmd;
|
|
1582
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && !evt.isImmediate() && this.ActAllowed(evt.getInternalCode()) && !this._processingTopMostEndTask) {
|
|
1583
|
+
let cmdsToServer = mgData.CmdsToServer;
|
|
1584
|
+
let dv = task.DataView;
|
|
1585
|
+
let rec = dv.getCurrRec();
|
|
1586
|
+
let intEvtCode = evt.getInternalCode();
|
|
1587
|
+
switch (intEvtCode) {
|
|
1588
|
+
case InternalInterface.MG_ACT_SUBFORM_CLOSE:
|
|
1589
|
+
await this.onSubformClose(task, evt);
|
|
1590
|
+
break;
|
|
1591
|
+
case InternalInterface.MG_ACT_BUTTON:
|
|
1592
|
+
case InternalInterface.MG_ACT_CTRL_HIT:
|
|
1593
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON &&
|
|
1594
|
+
(intEvtCode === InternalInterface.MG_ACT_BUTTON || !evt.isGuiTriggeredEvent() || ctrl.isParkable(true))) {
|
|
1595
|
+
let aRtEvt = new RunTimeEvent(ctrl);
|
|
1596
|
+
if (ctrl.getRtEvtTask() != null)
|
|
1597
|
+
aRtEvt.setTask(ctrl.getRtEvtTask());
|
|
1598
|
+
if (ConstInterface.EVENT_TYPE_NONE !== aRtEvt.getType()) {
|
|
1599
|
+
if (ctrl.useZoomHandler()) {
|
|
1600
|
+
let taskToEnable = aRtEvt.getTask();
|
|
1601
|
+
if (taskToEnable != null)
|
|
1602
|
+
taskToEnable.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
|
1603
|
+
}
|
|
1604
|
+
aRtEvt.setArgList(ctrl.ArgList);
|
|
1605
|
+
await aRtEvt.setPublicName();
|
|
1606
|
+
this.addToTail(aRtEvt);
|
|
1607
|
+
this.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
else if (ctrl.Type === MgControlType.CTRL_TYPE_TAB) {
|
|
1611
|
+
this.addInternalEventWithCtrlAndCode(ctrl, InternalInterface.MG_ACT_ZOOM);
|
|
1612
|
+
}
|
|
1613
|
+
else if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO) {
|
|
1614
|
+
ctrl.setControlToFocus();
|
|
1615
|
+
}
|
|
1616
|
+
break;
|
|
1617
|
+
case InternalInterface.MG_ACT_TOGGLE_INSERT:
|
|
1618
|
+
RuntimeContextBase.Instance.ToggleInsertMode();
|
|
1619
|
+
break;
|
|
1620
|
+
case InternalInterface.MG_ACT_CLOSE:
|
|
1621
|
+
let rtEvt = new RunTimeEvent(evt, evt);
|
|
1622
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_EXIT);
|
|
1623
|
+
this.addToTail(rtEvt);
|
|
1624
|
+
break;
|
|
1625
|
+
case InternalInterface.MG_ACT_EXIT:
|
|
1626
|
+
let taskToEnd = (task.isMainProg() ? MGDataCollection.Instance.StartupMgData.getFirstTask() : task);
|
|
1627
|
+
await taskToEnd.endTask(evt.reversibleExit(), false, evt.ExitDueToError());
|
|
1628
|
+
break;
|
|
1629
|
+
case InternalInterface.MG_ACT_EXIT_SYSTEM:
|
|
1630
|
+
await MGDataCollection.Instance.StartupMgData.getFirstTask().endTask(evt.reversibleExit(), false, false);
|
|
1631
|
+
break;
|
|
1632
|
+
case InternalInterface.MG_ACT_TBL_NXTLINE:
|
|
1633
|
+
if (form != null)
|
|
1634
|
+
await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_NEXT);
|
|
1635
|
+
break;
|
|
1636
|
+
case InternalInterface.MG_ACT_TBL_PRVLINE:
|
|
1637
|
+
if (form != null)
|
|
1638
|
+
await form.moveInView(Constants.MOVE_UNIT_ROW, Constants.MOVE_DIRECTION_PREV);
|
|
1639
|
+
break;
|
|
1640
|
+
case InternalInterface.MG_ACT_TBL_NXTPAGE:
|
|
1641
|
+
if (form != null)
|
|
1642
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
|
|
1643
|
+
break;
|
|
1644
|
+
case InternalInterface.MG_ACT_TBL_PRVPAGE:
|
|
1645
|
+
if (form != null)
|
|
1646
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_PREV);
|
|
1647
|
+
break;
|
|
1648
|
+
case InternalInterface.MG_ACT_TBL_BEGPAGE:
|
|
1649
|
+
if (form != null)
|
|
1650
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_BEGIN);
|
|
1651
|
+
break;
|
|
1652
|
+
case InternalInterface.MG_ACT_TBL_ENDPAGE:
|
|
1653
|
+
if (form != null)
|
|
1654
|
+
await form.moveInView(Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_END);
|
|
1655
|
+
break;
|
|
1656
|
+
case InternalInterface.MG_ACT_TBL_BEGTBL:
|
|
1657
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
|
1658
|
+
if (lastParkedCtrl == null || !lastParkedCtrl.isListBox()) {
|
|
1659
|
+
if (form != null)
|
|
1660
|
+
await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_BEGIN);
|
|
1661
|
+
}
|
|
1662
|
+
break;
|
|
1663
|
+
case InternalInterface.MG_ACT_TBL_ENDTBL:
|
|
1664
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
|
1665
|
+
if (lastParkedCtrl === null || !lastParkedCtrl.isListBox()) {
|
|
1666
|
+
if (form != null)
|
|
1667
|
+
await form.moveInView(Constants.MOVE_UNIT_TABLE, Constants.MOVE_DIRECTION_END);
|
|
1668
|
+
}
|
|
1669
|
+
break;
|
|
1670
|
+
case InternalInterface.MG_ACT_WEB_ON_DBLICK:
|
|
1671
|
+
{
|
|
1672
|
+
let ctrlType = ctrl.Type;
|
|
1673
|
+
let putAction = InternalInterface.MG_ACT_NONE;
|
|
1674
|
+
if (ctrlType !== MgControlType.CTRL_TYPE_TABLE && ctrlType !== MgControlType.CTRL_TYPE_LABEL &&
|
|
1675
|
+
ctrlType !== MgControlType.CTRL_TYPE_IMAGE) {
|
|
1676
|
+
if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_SELECT))
|
|
1677
|
+
putAction = InternalInterface.MG_ACT_SELECT;
|
|
1678
|
+
else {
|
|
1679
|
+
if (ctrl.getForm().getTask().ActionManager.isEnabled(InternalInterface.MG_ACT_ZOOM))
|
|
1680
|
+
putAction = InternalInterface.MG_ACT_ZOOM;
|
|
1681
|
+
}
|
|
1682
|
+
if (putAction !== InternalInterface.MG_ACT_NONE)
|
|
1683
|
+
this.addInternalEventWithCtrlAndCode(ctrl, putAction);
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
break;
|
|
1687
|
+
case InternalInterface.MG_ACT_DELLINE:
|
|
1688
|
+
if (await this.HandleActionDelline(task, dv, rec, false))
|
|
1689
|
+
return;
|
|
1690
|
+
break;
|
|
1691
|
+
case InternalInterface.MG_ACT_CRELINE:
|
|
1692
|
+
case InternalInterface.MG_ACT_CRELINE_ABOVE:
|
|
1693
|
+
if (task.DataView.isEmptyDataview()) {
|
|
1694
|
+
await this.gotoCreateMode(task);
|
|
1695
|
+
break;
|
|
1696
|
+
}
|
|
1697
|
+
if (task.getInCreateLine())
|
|
1698
|
+
break;
|
|
1699
|
+
task.setInCreateLine(true);
|
|
1700
|
+
try {
|
|
1701
|
+
if (task.getLevel() === Constants.TASK_LEVEL_CONTROL) {
|
|
1702
|
+
await this.handleInternalEventWithMgControlBase(task.getLastParkedCtrl(), InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
1703
|
+
if (this.GetStopExecutionFlag())
|
|
1704
|
+
return;
|
|
1705
|
+
}
|
|
1706
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE && rec != null && !rec.Modified) {
|
|
1707
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
|
|
1708
|
+
doSuffix = false;
|
|
1709
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1710
|
+
if (this.GetStopExecutionFlag() || task.isAborting())
|
|
1711
|
+
return;
|
|
1712
|
+
}
|
|
1713
|
+
else {
|
|
1714
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
1715
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1716
|
+
if (!this.GetStopExecutionFlag() && form != null) {
|
|
1717
|
+
let lastParkedControl = task.getLastParkedCtrl();
|
|
1718
|
+
if (lastParkedControl !== null)
|
|
1719
|
+
await lastParkedControl.invoke();
|
|
1720
|
+
}
|
|
1721
|
+
return;
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
let refDoSuffix = new RefParam(doSuffix);
|
|
1725
|
+
if (await this.DoTaskLevelRecordSuffix(task, refDoSuffix))
|
|
1726
|
+
return;
|
|
1727
|
+
doSuffix = refDoSuffix.value;
|
|
1728
|
+
if (form != null) {
|
|
1729
|
+
let parentId = 0;
|
|
1730
|
+
let prevLine = 0;
|
|
1731
|
+
if ((task.getMode() !== Constants.TASK_MODE_CREATE) || !task.ConfirmUpdateNo)
|
|
1732
|
+
await form.addRec(doSuffix, intEvtCode == InternalInterface.MG_ACT_CRELINE_ABOVE ? true : false);
|
|
1733
|
+
}
|
|
1734
|
+
await this.DoTaskLevelRecordPrefix(task);
|
|
1735
|
+
await this.HandleActEnterRowEditing(task);
|
|
1736
|
+
}
|
|
1737
|
+
finally {
|
|
1738
|
+
task.setInCreateLine(false);
|
|
1739
|
+
}
|
|
1740
|
+
break;
|
|
1741
|
+
case InternalInterface.MG_ACT_CANCEL:
|
|
1742
|
+
await this.HandleActCancel(evt, task, form, ctrl, rec, true);
|
|
1743
|
+
break;
|
|
1744
|
+
case InternalInterface.MG_ACT_ENTER_ROW_EDITING:
|
|
1745
|
+
await this.HandleActEnterRowEditing(task);
|
|
1746
|
+
break;
|
|
1747
|
+
case InternalInterface.MG_ACT_RT_QUIT:
|
|
1748
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_QUIT);
|
|
1749
|
+
break;
|
|
1750
|
+
case InternalInterface.MG_ACT_RTO_CREATE:
|
|
1751
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE ||
|
|
1752
|
+
await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) {
|
|
1753
|
+
await this.gotoCreateMode(task);
|
|
1754
|
+
}
|
|
1755
|
+
break;
|
|
1756
|
+
case InternalInterface.MG_ACT_RTO_QUERY:
|
|
1757
|
+
if (task.getMode() !== Constants.TASK_MODE_QUERY &&
|
|
1758
|
+
(await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
|
|
1759
|
+
break;
|
|
1760
|
+
await task.enableModes();
|
|
1761
|
+
oldMode = task.getOriginalTaskMode();
|
|
1762
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1763
|
+
if (!this.GetStopExecutionFlag()) {
|
|
1764
|
+
task.setMode(Constants.TASK_MODE_QUERY);
|
|
1765
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
|
1766
|
+
await dv.currRecCompute(true);
|
|
1767
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1768
|
+
if (ctrl != null)
|
|
1769
|
+
await ctrl.invoke();
|
|
1770
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1771
|
+
}
|
|
1772
|
+
else {
|
|
1773
|
+
task.setPreventRecordSuffix(true);
|
|
1774
|
+
task.setPreventControlChange(true);
|
|
1775
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
|
1776
|
+
if (ctrl != null)
|
|
1777
|
+
await ctrl.invoke();
|
|
1778
|
+
task.setPreventRecordSuffix(false);
|
|
1779
|
+
task.setPreventControlChange(false);
|
|
1780
|
+
if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
|
1781
|
+
task.setMode(Constants.TASK_MODE_QUERY);
|
|
1782
|
+
else
|
|
1783
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
|
1784
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1785
|
+
}
|
|
1786
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_QUERY);
|
|
1787
|
+
await task.setCreateDeleteActsEnableState();
|
|
1788
|
+
}
|
|
1789
|
+
break;
|
|
1790
|
+
case InternalInterface.MG_ACT_RTO_MODIFY:
|
|
1791
|
+
if (task.getMode() !== Constants.TASK_MODE_MODIFY &&
|
|
1792
|
+
(await (task.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) === false)
|
|
1793
|
+
break;
|
|
1794
|
+
await task.enableModes();
|
|
1795
|
+
oldMode = task.getOriginalTaskMode();
|
|
1796
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1797
|
+
if (!this.GetStopExecutionFlag()) {
|
|
1798
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
1799
|
+
if (oldMode !== Constants.TASK_MODE_CREATE) {
|
|
1800
|
+
await dv.currRecCompute(true);
|
|
1801
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1802
|
+
if (ctrl != null)
|
|
1803
|
+
await ctrl.invoke();
|
|
1804
|
+
}
|
|
1805
|
+
else {
|
|
1806
|
+
task.setPreventRecordSuffix(true);
|
|
1807
|
+
task.setPreventControlChange(true);
|
|
1808
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
|
1809
|
+
if (ctrl != null)
|
|
1810
|
+
await ctrl.invoke();
|
|
1811
|
+
task.setPreventRecordSuffix(false);
|
|
1812
|
+
task.setPreventControlChange(false);
|
|
1813
|
+
if (!dv.isEmpty() && (dv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
|
1814
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
1815
|
+
else
|
|
1816
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
|
1817
|
+
await form.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1818
|
+
}
|
|
1819
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_MODIFY);
|
|
1820
|
+
await task.setCreateDeleteActsEnableState();
|
|
1821
|
+
}
|
|
1822
|
+
break;
|
|
1823
|
+
case InternalInterface.MG_ACT_SELECT:
|
|
1824
|
+
try {
|
|
1825
|
+
task.InSelect = true;
|
|
1826
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1827
|
+
}
|
|
1828
|
+
finally {
|
|
1829
|
+
task.InSelect = false;
|
|
1830
|
+
}
|
|
1831
|
+
if (!this._stopExecution) {
|
|
1832
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
|
|
1833
|
+
}
|
|
1834
|
+
break;
|
|
1835
|
+
case InternalInterface.MG_ACT_SUBFORM_REFRESH:
|
|
1836
|
+
if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 1)) {
|
|
1837
|
+
let subformCtrl = null;
|
|
1838
|
+
let RefreshedSubformName = await evt.getArgList().getArgValue(0, StorageAttribute.ALPHA, 0);
|
|
1839
|
+
if (RefreshedSubformName == null)
|
|
1840
|
+
break;
|
|
1841
|
+
for (let parentTask = task; parentTask.getForm() != null && parentTask.getMgdID() === task.getMgdID(); parentTask = parentTask.getParent()) {
|
|
1842
|
+
subformCtrl = parentTask.getForm().getCtrlByName(RefreshedSubformName.trim(), MgControlType.CTRL_TYPE_SUBFORM);
|
|
1843
|
+
if (subformCtrl != null) {
|
|
1844
|
+
let subformTask = subformCtrl.getSubformTask();
|
|
1845
|
+
if (subformTask == null) {
|
|
1846
|
+
if (await (subformCtrl.getProp(PropInterface.PROP_TYPE_SUBFORM_TYPE)).getValueInt() !== SubformType.None)
|
|
1847
|
+
await this.OpenSubform(parentTask, subformCtrl);
|
|
1848
|
+
}
|
|
1849
|
+
else
|
|
1850
|
+
await parentTask.SubformRefresh(subformTask, true);
|
|
1851
|
+
break;
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1855
|
+
else if ((evt.getArgList() != null) && (evt.getArgList().getSize() === 2)) {
|
|
1856
|
+
let subformTask = task, parentTask;
|
|
1857
|
+
let taskTag = await evt.getArgList().getArgValue(1, StorageAttribute.NUMERIC, 0);
|
|
1858
|
+
while (subformTask.IsSubForm) {
|
|
1859
|
+
parentTask = subformTask.getParent();
|
|
1860
|
+
if (subformTask.getTaskTag() === taskTag) {
|
|
1861
|
+
await parentTask.SubformRefresh(subformTask, true);
|
|
1862
|
+
break;
|
|
1863
|
+
}
|
|
1864
|
+
subformTask = parentTask;
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
break;
|
|
1868
|
+
case InternalInterface.MG_ACT_SUBFORM_OPEN:
|
|
1869
|
+
await this.OpenSubform(task, evt.Control);
|
|
1870
|
+
break;
|
|
1871
|
+
case InternalInterface.MG_ACT_RTO_SEARCH:
|
|
1872
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1873
|
+
if (!this.GetStopExecutionFlag()) {
|
|
1874
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
|
|
1875
|
+
task.getTaskCache().clearCache();
|
|
1876
|
+
await task.DataviewManager.Execute(cmd);
|
|
1877
|
+
if (!form.isScreenMode()) {
|
|
1878
|
+
dv.setTopRecIdx(0);
|
|
1879
|
+
if (form.HasTable()) {
|
|
1880
|
+
await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1884
|
+
if (ctrl != null)
|
|
1885
|
+
await ctrl.invoke();
|
|
1886
|
+
}
|
|
1887
|
+
break;
|
|
1888
|
+
case InternalInterface.MG_ACT_RT_REFRESH_SCREEN:
|
|
1889
|
+
case InternalInterface.MG_ACT_RT_REFRESH_VIEW:
|
|
1890
|
+
case InternalInterface.MG_ACT_RT_REFRESH_RECORD:
|
|
1891
|
+
await this.handleRefreshEvents(evt);
|
|
1892
|
+
break;
|
|
1893
|
+
case InternalInterface.MG_ACT_ACT_CLOSE_APPL:
|
|
1894
|
+
cmd =
|
|
1895
|
+
CommandFactory.CreateEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag(), InternalInterface.MG_ACT_BROWSER_ESC);
|
|
1896
|
+
cmdsToServer.Add(cmd);
|
|
1897
|
+
await server.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1898
|
+
break;
|
|
1899
|
+
case InternalInterface.MG_ACT_CONTEXT_REMOVE:
|
|
1900
|
+
let currRecord = LastFocusedManager.Instance.getLastFocusedTask().DataView.getCurrRec();
|
|
1901
|
+
if (ClientManager.TransCacheExists() || (currRecord != null && currRecord.Modified)) {
|
|
1902
|
+
console.log('Pending transaction/record is modified, discarded \'Context Remove\' event.');
|
|
1903
|
+
}
|
|
1904
|
+
else {
|
|
1905
|
+
if (Environment.Instance.getClientContextInactivityTimeout() > 0) {
|
|
1906
|
+
await this.ExecuteClientContextInactivityTimer();
|
|
1907
|
+
}
|
|
1908
|
+
if (!EventsManager.clientContextInactivityTimerAborted) {
|
|
1909
|
+
let contextTerminationEventCommand = CommandFactory.CreateContextTerminationEventCommand(MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag());
|
|
1910
|
+
MGDataCollection.Instance.getCurrMGData().CmdsToServer.Add(contextTerminationEventCommand);
|
|
1911
|
+
RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.ONLY_COMMANDS);
|
|
1912
|
+
console.log('Removed context from server');
|
|
1913
|
+
RuntimeContextBase.Instance.RemovingContextFromServer = true;
|
|
1914
|
+
}
|
|
1915
|
+
else {
|
|
1916
|
+
console.log('Discarded \'Context Remove\' event as user event occurred.');
|
|
1917
|
+
EventsManager.clientContextInactivityTimerAborted = false;
|
|
1918
|
+
break;
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
break;
|
|
1922
|
+
case InternalInterface.MG_ACT_SERVER_TERMINATION:
|
|
1923
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
|
|
1924
|
+
cmdsToServer.Add(cmd);
|
|
1925
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1926
|
+
break;
|
|
1927
|
+
case InternalInterface.MG_ACT_RT_EDT_NULL:
|
|
1928
|
+
if (this._currField != null && this._currField.NullAllowed) {
|
|
1929
|
+
await this._currField.setValueAndStartRecompute(this._currField.getMagicDefaultValue(), true, true, true, false);
|
|
1930
|
+
await this._currField.updateDisplay();
|
|
1931
|
+
}
|
|
1932
|
+
break;
|
|
1933
|
+
case InternalInterface.MG_ACT_ROLLBACK:
|
|
1934
|
+
await EventsManager.HandleRollbackAction(task, cmdsToServer, RollbackEventCommand_RollbackType.ROLLBACK);
|
|
1935
|
+
break;
|
|
1936
|
+
case InternalInterface.MG_ACT_OK:
|
|
1937
|
+
case InternalInterface.MG_ACT_INDEX_CHANGE:
|
|
1938
|
+
case InternalInterface.MG_ACT_COL_SORT:
|
|
1939
|
+
if ((intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE && task.DataviewManager.HasRemoteData) ||
|
|
1940
|
+
(intEvtCode === InternalInterface.MG_ACT_COL_SORT && ctrl.getField() != null)) {
|
|
1941
|
+
let lastFocusedTask = LastFocusedManager.Instance.getLastFocusedTask();
|
|
1942
|
+
let focusedCtrl = LastFocusedManager.getLastFocusedControl(LastFocusedManager.LastFocusMgdID);
|
|
1943
|
+
if (focusedCtrl != null)
|
|
1944
|
+
await this.handleInternalEventWithMgControlBase(focusedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
1945
|
+
if (!this.GetStopExecutionFlag())
|
|
1946
|
+
await task.ExecuteNestedRS(lastFocusedTask);
|
|
1947
|
+
if (!this.GetStopExecutionFlag() && task.getLevel() !== Constants.TASK_LEVEL_TASK)
|
|
1948
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1949
|
+
if (!this.GetStopExecutionFlag()) {
|
|
1950
|
+
task.getTaskCache().clearCache();
|
|
1951
|
+
if (intEvtCode === InternalInterface.MG_ACT_INDEX_CHANGE) {
|
|
1952
|
+
let taskForm = task.getForm();
|
|
1953
|
+
if (taskForm.HasTable())
|
|
1954
|
+
form.clearTableColumnSortMark(true);
|
|
1955
|
+
cmd = await CommandFactory.CreateIndexChangeCommand(task.getTaskTag(), task.DataView.GetCurrentRecId(), evt.getArgList());
|
|
1956
|
+
}
|
|
1957
|
+
else {
|
|
1958
|
+
cmd = CommandFactory.CreateColumnSortCommand(task.getTaskTag(), evt.Direction, ctrl.getDitIdx(), ctrl.getField().getId(), task.DataView.GetCurrentRecId());
|
|
1959
|
+
}
|
|
1960
|
+
await task.DataviewManager.Execute(cmd);
|
|
1961
|
+
dv.setTopRecIdx(0);
|
|
1962
|
+
await form.restoreOldDisplayLine(0);
|
|
1963
|
+
this._isSorting = true;
|
|
1964
|
+
if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask()))) {
|
|
1965
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1966
|
+
if (!this.GetStopExecutionFlag() && !task.getPreventControlChange())
|
|
1967
|
+
await lastFocusedTask.ExecuteNestedRS(task);
|
|
1968
|
+
if (!this.GetStopExecutionFlag() && focusedCtrl != null)
|
|
1969
|
+
await focusedCtrl.invoke();
|
|
1970
|
+
}
|
|
1971
|
+
else
|
|
1972
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
1973
|
+
this._isSorting = false;
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
break;
|
|
1977
|
+
case InternalInterface.MG_ACT_COL_CLICK:
|
|
1978
|
+
if (!this.GetStopExecutionFlag() && evt.isGuiTriggeredEvent() && ctrl.isColumnSortable()) {
|
|
1979
|
+
let columnChildControl = ctrl.getColumnChildControl();
|
|
1980
|
+
if (columnChildControl != null) {
|
|
1981
|
+
let aRtEvt = new RunTimeEvent(columnChildControl, evt.Direction, 0);
|
|
1982
|
+
aRtEvt.setInternal(InternalInterface.MG_ACT_COL_SORT);
|
|
1983
|
+
this.addToTail(aRtEvt);
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
break;
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
finally {
|
|
1991
|
+
this.popRtEvent();
|
|
1992
|
+
}
|
|
1993
|
+
}
|
|
1994
|
+
async HandleActEnterRowEditing(task) {
|
|
1995
|
+
if (task.getMode() === Constants.TASK_MODE_QUERY)
|
|
1996
|
+
task.WriteToMessagePane(`Cannot enter Row Editing when in Query Mode.`);
|
|
1997
|
+
else {
|
|
1998
|
+
let myform = task.getForm();
|
|
1999
|
+
await myform.startRowEditing(myform.DisplayLine);
|
|
2000
|
+
}
|
|
2001
|
+
}
|
|
2002
|
+
async HandleStopRowEditing(task) {
|
|
2003
|
+
let myform = task.getForm();
|
|
2004
|
+
await myform.stopRowEditing(myform.DisplayLine);
|
|
2005
|
+
}
|
|
2006
|
+
async OpenSubform(task, subformControl) {
|
|
2007
|
+
task.TaskService.RemoveRecomputes(task);
|
|
2008
|
+
let cmd = CommandFactory.CreateSubformOpenCommand(task.getTaskTag(), subformControl.getDitIdx());
|
|
2009
|
+
task.getMGData().CmdsToServer.Add(cmd);
|
|
2010
|
+
await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
2011
|
+
}
|
|
2012
|
+
static async HandleRollbackAction(task, cmdsToServer, rollbackType) {
|
|
2013
|
+
let commandsProcessor = Task.CommandsProcessor;
|
|
2014
|
+
ClientRefreshCommand.ClientIsInRollbackCommand = true;
|
|
2015
|
+
task = task.TaskService.GetOwnerTransactionTask(task);
|
|
2016
|
+
let cmd = CommandFactory.CreateRollbackEventCommand(task.getTaskTag(), rollbackType);
|
|
2017
|
+
cmdsToServer.Add(cmd);
|
|
2018
|
+
await commandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
2019
|
+
ClientRefreshCommand.ClientIsInRollbackCommand = false;
|
|
2020
|
+
}
|
|
2021
|
+
async HandleActCancel(evt, task, form, ctrl, rec, isMG_ACT_CANCEL) {
|
|
2022
|
+
if (task.InHandleActCancel)
|
|
2023
|
+
return;
|
|
2024
|
+
task.InHandleActCancel = true;
|
|
2025
|
+
let oldMode = task.getMode();
|
|
2026
|
+
let saveDisplayLine = task.getForm().DisplayLine;
|
|
2027
|
+
if (oldMode !== Constants.TASK_MODE_QUERY && !rec.Updated) {
|
|
2028
|
+
if (isMG_ACT_CANCEL) {
|
|
2029
|
+
if (rec.Modified || (task.getLastParkedCtrl() !== null && task.getLastParkedCtrl().ModifiedByUser)) {
|
|
2030
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_CANCEL, false)) {
|
|
2031
|
+
let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_CANCEL);
|
|
2032
|
+
if (!confirmed) {
|
|
2033
|
+
task.InHandleActCancel = false;
|
|
2034
|
+
return;
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
let oldRecMode = rec.getMode();
|
|
2040
|
+
if (GuiEnvironment.Environment.GetSpecialCancelOnCreate() && task.getMode() == Constants.TASK_MODE_CREATE
|
|
2041
|
+
&& task.getOriginalTaskMode() == Constants.TASK_MODE_CREATE) {
|
|
2042
|
+
let enable = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
|
|
2043
|
+
if (enable) {
|
|
2044
|
+
let allowEmptyDataView = await task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true);
|
|
2045
|
+
if (task.DataView.getSize() == 1 && allowEmptyDataView) {
|
|
2046
|
+
task.setMode('M');
|
|
2047
|
+
task.DataView.setEmptyDataview(true);
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
if (isMG_ACT_CANCEL) {
|
|
2052
|
+
if (task.isTransactionOnLevel(ConstInterface.TRANS_RECORD_PREFIX) && evt.RollbackInCancel()) {
|
|
2053
|
+
await EventsManager.HandleRollbackAction(task, task.getMGData().CmdsToServer, RollbackEventCommand_RollbackType.CANCEL);
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
await EventsManager.HandleCancelEdit(evt, task, form, rec, oldRecMode);
|
|
2057
|
+
}
|
|
2058
|
+
else {
|
|
2059
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
2060
|
+
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
|
2061
|
+
if (lastFocusedControl !== null) {
|
|
2062
|
+
lastFocusedControl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
|
|
2063
|
+
}
|
|
2064
|
+
if (!evt.isQuit()) {
|
|
2065
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2066
|
+
await this.HandleParkabilityOnRowChange(task);
|
|
2067
|
+
}
|
|
2068
|
+
}
|
|
2069
|
+
if (evt.isQuit())
|
|
2070
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_EXIT);
|
|
2071
|
+
await form.stopRowEditing(saveDisplayLine);
|
|
2072
|
+
task.InHandleActCancel = false;
|
|
2073
|
+
}
|
|
2074
|
+
static async HandleCancelEdit(evt, task, form, rec, oldRecMode) {
|
|
2075
|
+
if (rec.Synced && oldRecMode === DataModificationTypes.Insert)
|
|
2076
|
+
rec.setMode(oldRecMode);
|
|
2077
|
+
if (form !== null) {
|
|
2078
|
+
if (task.getLastParkedCtrl() !== null)
|
|
2079
|
+
task.getLastParkedCtrl().resetPrevVal();
|
|
2080
|
+
await form.cancelEdit(true, evt.isQuit());
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
async HandleActionDelline(task, dv, rec, nonInteractiveDelete) {
|
|
2084
|
+
let lastParkedCtrl;
|
|
2085
|
+
let myform = task.getForm();
|
|
2086
|
+
let saveIsRowEditing = myform.getIsRowEditingFromGui(myform.DisplayLine);
|
|
2087
|
+
let oldRecMode;
|
|
2088
|
+
if (await task.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true)) {
|
|
2089
|
+
lastParkedCtrl = task.getLastParkedCtrl();
|
|
2090
|
+
if (lastParkedCtrl !== null)
|
|
2091
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_SUFFIX);
|
|
2092
|
+
if (!this.GetStopExecutionFlag()) {
|
|
2093
|
+
oldRecMode = rec.getMode();
|
|
2094
|
+
rec.clearMode();
|
|
2095
|
+
rec.setMode(DataModificationTypes.Delete);
|
|
2096
|
+
if (oldRecMode === DataModificationTypes.Insert)
|
|
2097
|
+
rec.setSendToServer(false);
|
|
2098
|
+
if (rec.Modified || await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false)) {
|
|
2099
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
2100
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2101
|
+
if (this._stopExecution) {
|
|
2102
|
+
if (!rec.SendToServer) {
|
|
2103
|
+
await dv.addCurrToModified();
|
|
2104
|
+
rec.setSendToServer(true);
|
|
2105
|
+
}
|
|
2106
|
+
rec.clearMode();
|
|
2107
|
+
rec.setMode(oldRecMode);
|
|
2108
|
+
this.setStopExecution(false);
|
|
2109
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2110
|
+
this.setStopExecution(true);
|
|
2111
|
+
return true;
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
rec.setInDeleteProcess(true);
|
|
2115
|
+
task.setMode(Constants.TASK_MODE_DELETE);
|
|
2116
|
+
let skipConfirmDialog = nonInteractiveDelete;
|
|
2117
|
+
if (!skipConfirmDialog) {
|
|
2118
|
+
if (task.mustConfirmInDeleteMode() || await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false)) {
|
|
2119
|
+
let confirmed = await GUIManager.Instance.confirm_bool(MsgInterface.CONFIRM_STR_DELETE);
|
|
2120
|
+
if (!confirmed) {
|
|
2121
|
+
rec.clearMode();
|
|
2122
|
+
rec.setMode(oldRecMode);
|
|
2123
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
2124
|
+
if (lastParkedCtrl !== null)
|
|
2125
|
+
await this.handleInternalEventWithMgControlBase(lastParkedCtrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
|
2126
|
+
if (saveIsRowEditing) {
|
|
2127
|
+
let myform = task.getForm();
|
|
2128
|
+
await myform.startRowEditing(myform.DisplayLine);
|
|
2129
|
+
}
|
|
2130
|
+
return true;
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2135
|
+
rec.setInDeleteProcess(false);
|
|
2136
|
+
if (this._stopExecution) {
|
|
2137
|
+
if (!rec.SendToServer) {
|
|
2138
|
+
await dv.addCurrToModified();
|
|
2139
|
+
rec.setSendToServer(true);
|
|
2140
|
+
}
|
|
2141
|
+
rec.clearMode();
|
|
2142
|
+
rec.setMode(oldRecMode);
|
|
2143
|
+
this.setStopExecution(false);
|
|
2144
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
2145
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2146
|
+
this.setStopExecution(true);
|
|
2147
|
+
return true;
|
|
2148
|
+
}
|
|
2149
|
+
if (oldRecMode === DataModificationTypes.Insert) {
|
|
2150
|
+
rec.clearMode();
|
|
2151
|
+
rec.setMode(oldRecMode);
|
|
2152
|
+
}
|
|
2153
|
+
let newCurrRec = dv.getCurrRec();
|
|
2154
|
+
try {
|
|
2155
|
+
if (rec !== newCurrRec)
|
|
2156
|
+
await dv.setCurrRec(rec.getId(), false);
|
|
2157
|
+
if (!task.isAborting())
|
|
2158
|
+
await this.delCurrRec(task, false);
|
|
2159
|
+
}
|
|
2160
|
+
finally {
|
|
2161
|
+
if (rec !== newCurrRec) {
|
|
2162
|
+
await dv.setCurrRec(newCurrRec.getId(), false);
|
|
2163
|
+
if (dv.getSize() === 1)
|
|
2164
|
+
task.setMode(Constants.TASK_MODE_CREATE);
|
|
2165
|
+
}
|
|
2166
|
+
if (nonInteractiveDelete)
|
|
2167
|
+
task.setMode(Constants.TASK_MODE_DELETE);
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
}
|
|
2171
|
+
return false;
|
|
2172
|
+
}
|
|
2173
|
+
async handleRefreshEvents(evt) {
|
|
2174
|
+
let task = evt.getTask();
|
|
2175
|
+
let form = task.getForm();
|
|
2176
|
+
let dv = task.DataView;
|
|
2177
|
+
let intEvtCode = evt.getInternalCode();
|
|
2178
|
+
let cmd = null;
|
|
2179
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD)
|
|
2180
|
+
this._isInRecordFlushEvent = true;
|
|
2181
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && task.getMode() === Constants.TASK_MODE_CREATE && !await task.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true)) {
|
|
2182
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_EXIT);
|
|
2183
|
+
}
|
|
2184
|
+
else {
|
|
2185
|
+
await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
|
|
2186
|
+
if (!this.GetStopExecutionFlag()) {
|
|
2187
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2188
|
+
}
|
|
2189
|
+
if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
|
|
2190
|
+
if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN) {
|
|
2191
|
+
let currentRow = 0;
|
|
2192
|
+
if (!evt.getRefreshType()) {
|
|
2193
|
+
if (evt.RtViewRefreshUseCurrentRow() && task.IsInteractive) {
|
|
2194
|
+
currentRow = form.getCurrRecPosInForm();
|
|
2195
|
+
}
|
|
2196
|
+
cmd = CommandFactory.CreateInternalRefreshCommand(task.getTaskTag(), intEvtCode, dv.CurrentRecId, currentRow);
|
|
2197
|
+
}
|
|
2198
|
+
else {
|
|
2199
|
+
if (task.IsInteractive)
|
|
2200
|
+
currentRow = form.getCurrRecPosInForm();
|
|
2201
|
+
let refetchRecord = true;
|
|
2202
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && evt.getArgList() !== null && evt.getArgList().getSize() !== 0) {
|
|
2203
|
+
let refetchRecStr;
|
|
2204
|
+
refetchRecStr = await evt.getArgList().getArgValue(0, StorageAttribute.BOOLEAN, 0);
|
|
2205
|
+
refetchRecord = (isNullOrUndefined(refetchRecStr) || refetchRecStr === "1");
|
|
2206
|
+
}
|
|
2207
|
+
if (refetchRecord)
|
|
2208
|
+
cmd = await CommandFactory.CreateRealRefreshCommand(task.getTaskTag(), intEvtCode, currentRow, evt.getArgList(), dv.CurrentRecId);
|
|
2209
|
+
}
|
|
2210
|
+
}
|
|
2211
|
+
else {
|
|
2212
|
+
let id;
|
|
2213
|
+
if (task.getForm() === null)
|
|
2214
|
+
id = 0;
|
|
2215
|
+
else if (task.getForm().isScreenMode())
|
|
2216
|
+
id = (task.DataView.getCurrRec()).getId();
|
|
2217
|
+
else
|
|
2218
|
+
id = task.DataView.getRecByIdx(task.DataView.getTopRecIdx()).getId();
|
|
2219
|
+
cmd = CommandFactory.CreateScreenRefreshCommand(task.getTaskTag(), id, dv.CurrentRecId);
|
|
2220
|
+
}
|
|
2221
|
+
if (intEvtCode !== InternalInterface.MG_ACT_RT_REFRESH_SCREEN)
|
|
2222
|
+
task.getTaskCache().clearCache();
|
|
2223
|
+
if (cmd !== null)
|
|
2224
|
+
await task.DataviewManager.Execute(cmd);
|
|
2225
|
+
this._isInRecordFlushEvent = false;
|
|
2226
|
+
if (!this.GetStopExecutionFlag() && !task.InEndTask && !task.isAborting()) {
|
|
2227
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW && !form.isScreenMode()) {
|
|
2228
|
+
dv.setTopRecIdx(0);
|
|
2229
|
+
if (form.HasTable()) {
|
|
2230
|
+
form.clearTableColumnSortMark(true);
|
|
2231
|
+
await form.restoreOldDisplayLine(form.recordIdx2DisplayLine(dv.getCurrRecIdx()));
|
|
2232
|
+
}
|
|
2233
|
+
}
|
|
2234
|
+
if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_RECORD && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
|
|
2235
|
+
if (task.getMode() === Constants.TASK_MODE_CREATE) {
|
|
2236
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
2237
|
+
(task.DataView.getCurrRec()).setOldRec();
|
|
2238
|
+
}
|
|
2239
|
+
await dv.currRecCompute(true);
|
|
2240
|
+
}
|
|
2241
|
+
else if (intEvtCode === InternalInterface.MG_ACT_RT_REFRESH_SCREEN && task.getMode() !== Constants.TASK_MODE_QUERY && !task.getAfterRetry()) {
|
|
2242
|
+
await dv.currRecCompute(true);
|
|
2243
|
+
}
|
|
2244
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2245
|
+
if (!this.GetStopExecutionFlag() && !task.getPreventControlChange()) {
|
|
2246
|
+
if (!(task === LastFocusedManager.Instance.getLastFocusedTask() || !task.pathContains(LastFocusedManager.Instance.getLastFocusedTask())))
|
|
2247
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2248
|
+
}
|
|
2249
|
+
}
|
|
2250
|
+
}
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
async gotoCreateMode(task) {
|
|
2254
|
+
let cmd;
|
|
2255
|
+
await task.enableModes();
|
|
2256
|
+
await task.ExecuteNestedRS(LastFocusedManager.Instance.getLastFocusedTask());
|
|
2257
|
+
if (!this.GetStopExecutionFlag())
|
|
2258
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2259
|
+
if (!this.GetStopExecutionFlag()) {
|
|
2260
|
+
cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
|
|
2261
|
+
await task.DataviewManager.Execute(cmd);
|
|
2262
|
+
if (task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
2263
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2264
|
+
await this.HandleNonParkableControls(task);
|
|
2265
|
+
await task.setCreateDeleteActsEnableState();
|
|
2266
|
+
task.setOriginalTaskMode(Constants.TASK_MODE_CREATE);
|
|
2267
|
+
await this.HandleActEnterRowEditing(task);
|
|
2268
|
+
}
|
|
2269
|
+
}
|
|
2270
|
+
async commonHandlerAfter(evt, rcBefore) {
|
|
2271
|
+
let task = evt.getTask();
|
|
2272
|
+
let dv;
|
|
2273
|
+
let rec = null;
|
|
2274
|
+
let ctrl;
|
|
2275
|
+
let recModified = false;
|
|
2276
|
+
let recModeIsDelete = false;
|
|
2277
|
+
let forceSuffix;
|
|
2278
|
+
if (this._stopExecution && evt.getInternalCode() !== InternalInterface.MG_ACT_REC_SUFFIX && evt.getInternalCode() !== InternalInterface.MG_ACT_CTRL_SUFFIX)
|
|
2279
|
+
return;
|
|
2280
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
|
|
2281
|
+
dv = task.DataView;
|
|
2282
|
+
rec = dv.getCurrRec();
|
|
2283
|
+
ctrl = evt.Control;
|
|
2284
|
+
switch (evt.getInternalCode()) {
|
|
2285
|
+
case InternalInterface.MG_ACT_REC_PREFIX:
|
|
2286
|
+
if (rcBefore) {
|
|
2287
|
+
if (await task.CheckRefreshSubTasks())
|
|
2288
|
+
await task.doSubformRecPrefixSuffix();
|
|
2289
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
|
|
2290
|
+
await task.enableModes();
|
|
2291
|
+
}
|
|
2292
|
+
break;
|
|
2293
|
+
case InternalInterface.MG_ACT_REC_SUFFIX:
|
|
2294
|
+
task.isFirstRecordCycle(false);
|
|
2295
|
+
if (task.getPreventRecordSuffix()) {
|
|
2296
|
+
task.setPreventRecordSuffix(false);
|
|
2297
|
+
return;
|
|
2298
|
+
}
|
|
2299
|
+
task.DoSubformPrefixSuffix = false;
|
|
2300
|
+
if (this._stopExecution) {
|
|
2301
|
+
if (rec.getMode() === DataModificationTypes.Delete)
|
|
2302
|
+
rec.clearMode();
|
|
2303
|
+
if (task.getLevel() !== Constants.TASK_LEVEL_CONTROL) {
|
|
2304
|
+
let last = this.getStopExecutionCtrl();
|
|
2305
|
+
if (last === null)
|
|
2306
|
+
last = task.getLastParkedCtrl();
|
|
2307
|
+
this.setStopExecution(false);
|
|
2308
|
+
this.setStopExecutionCtrl(null);
|
|
2309
|
+
if (last != null) {
|
|
2310
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
2311
|
+
let inCtrlPrefix = task.InCtrlPrefix;
|
|
2312
|
+
task.InCtrlPrefix = false;
|
|
2313
|
+
await this.handleInternalEventWithMgControlBase(last, InternalInterface.MG_ACT_CTRL_PREFIX);
|
|
2314
|
+
task.InCtrlPrefix = inCtrlPrefix;
|
|
2315
|
+
}
|
|
2316
|
+
this.setStopExecution(true);
|
|
2317
|
+
}
|
|
2318
|
+
return;
|
|
2319
|
+
}
|
|
2320
|
+
else {
|
|
2321
|
+
await this.HandleStopRowEditing(task);
|
|
2322
|
+
}
|
|
2323
|
+
if (rec != null) {
|
|
2324
|
+
recModified = rec.Modified;
|
|
2325
|
+
if (!this._stopExecution && rec.isCauseInvalidation()) {
|
|
2326
|
+
task.getForm().invalidateTable();
|
|
2327
|
+
rec.setCauseInvalidation(false);
|
|
2328
|
+
}
|
|
2329
|
+
recModeIsDelete = (rec.getMode() === DataModificationTypes.Delete);
|
|
2330
|
+
forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
|
2331
|
+
if (recModeIsDelete && task.getMode() === Constants.TASK_MODE_DELETE ||
|
|
2332
|
+
!recModeIsDelete && !rec.inDeleteProcess() && (recModified || forceSuffix)) {
|
|
2333
|
+
rec.setMode(DataModificationTypes.Update);
|
|
2334
|
+
await dv.addCurrToModified();
|
|
2335
|
+
dv.setChanged(true);
|
|
2336
|
+
if (recModified && task.getMode() === Constants.TASK_MODE_QUERY) {
|
|
2337
|
+
if (rec.realModified() &&
|
|
2338
|
+
!Environment.Instance.allowUpdateInQueryMode(task.getCompIdx())) {
|
|
2339
|
+
await dv.cancelEdit(EventsManager.REAL_ONLY, false);
|
|
2340
|
+
task.WriteToMessagePanebyMsgId(MsgInterface.RT_STR_UPDATE_IN_QUERY);
|
|
2341
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
if (!this.isForceExitPreRecordUpdate(task) &&
|
|
2346
|
+
(!task.isAborting() || MGDataCollection.Instance.GetTaskByID(task.getTaskTag()) != null)) {
|
|
2347
|
+
if ((!recModeIsDelete || task.getMode() === Constants.TASK_MODE_DELETE))
|
|
2348
|
+
await this.commitRecord(task, evt.reversibleExit());
|
|
2349
|
+
}
|
|
2350
|
+
if (!task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) && !task.isAborting()) {
|
|
2351
|
+
if ((rec.getMode() === DataModificationTypes.Delete &&
|
|
2352
|
+
task.getMode() === Constants.TASK_MODE_DELETE) ||
|
|
2353
|
+
rec.getMode() !== DataModificationTypes.Delete)
|
|
2354
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_AFTER))
|
|
2355
|
+
await task.endTask(true, false, false);
|
|
2356
|
+
}
|
|
2357
|
+
}
|
|
2358
|
+
break;
|
|
2359
|
+
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
|
2360
|
+
if (rcBefore) {
|
|
2361
|
+
if (await ctrl.IsParkable() || ctrl === LastFocusedManager.getLastFocusedControl()) {
|
|
2362
|
+
ctrl.InControl = true;
|
|
2363
|
+
if (ctrl.ShouldRefreshOnControlEnter())
|
|
2364
|
+
await ctrl.getField().updateDisplay();
|
|
2365
|
+
task.setLastParkedCtrl(ctrl);
|
|
2366
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = null;
|
|
2367
|
+
await ctrl.SetFocus(ctrl, ctrl.getDisplayLine(false), true);
|
|
2368
|
+
this.setStopExecutionCtrl(null);
|
|
2369
|
+
MgControl.ReturnToCtrl = ctrl;
|
|
2370
|
+
task.InCtrlPrefix = false;
|
|
2371
|
+
}
|
|
2372
|
+
else {
|
|
2373
|
+
task.InCtrlPrefix = false;
|
|
2374
|
+
await this.HandleNonParkableControls(ctrl.getForm().getTask());
|
|
2375
|
+
}
|
|
2376
|
+
}
|
|
2377
|
+
break;
|
|
2378
|
+
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
|
2379
|
+
if (!this.GetStopExecutionFlag()) {
|
|
2380
|
+
if (ctrl.isChoiceControl()) {
|
|
2381
|
+
ctrl.SetKeyboardLanguage();
|
|
2382
|
+
}
|
|
2383
|
+
if (ctrl.Type === MgControlType.CTRL_TYPE_BUTTON)
|
|
2384
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_BUTTON, false);
|
|
2385
|
+
if (task.getEnableZoomHandler() || ctrl.useZoomHandler())
|
|
2386
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, false);
|
|
2387
|
+
task.ActionManager.enable(InternalInterface.MG_ACT_RT_EDT_NULL, false);
|
|
2388
|
+
}
|
|
2389
|
+
if (rcBefore) {
|
|
2390
|
+
if (this.GetStopExecutionFlag()) {
|
|
2391
|
+
ctrl.InControl = true;
|
|
2392
|
+
return;
|
|
2393
|
+
}
|
|
2394
|
+
this._nextParkedCtrl = null;
|
|
2395
|
+
let fld = ctrl.getField();
|
|
2396
|
+
if (fld != null && (ctrl.Type === MgControlType.CTRL_TYPE_TEXT))
|
|
2397
|
+
await fld.updateDisplay();
|
|
2398
|
+
task.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
2399
|
+
ctrl.setInControlSuffix(false);
|
|
2400
|
+
ctrl.IsInteractiveUpdate = false;
|
|
2401
|
+
if (ctrl.PropertyExists(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS))
|
|
2402
|
+
await ctrl.getProp(PropInterface.PROP_TYPE_CUSTOM_VALIDATORS).RefreshDisplay(true);
|
|
2403
|
+
ctrl.ValidateControl = false;
|
|
2404
|
+
LastFocusedManager.setLastFocusedControl(task, null);
|
|
2405
|
+
if (await task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE))
|
|
2406
|
+
await task.endTask(true, false, false);
|
|
2407
|
+
}
|
|
2408
|
+
break;
|
|
2409
|
+
case InternalInterface.MG_ACT_TASK_PREFIX:
|
|
2410
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
2411
|
+
break;
|
|
2412
|
+
case InternalInterface.MG_ACT_TASK_SUFFIX:
|
|
2413
|
+
task.setLevel(Constants.TASK_LEVEL_NONE);
|
|
2414
|
+
break;
|
|
2415
|
+
case InternalInterface.MG_ACT_CYCLE_NEXT_REC:
|
|
2416
|
+
let form = task.getForm();
|
|
2417
|
+
if (!task.isMainProg() && form != null) {
|
|
2418
|
+
await form.moveInView(form.isLineMode()
|
|
2419
|
+
? Constants.MOVE_UNIT_ROW
|
|
2420
|
+
: Constants.MOVE_UNIT_PAGE, Constants.MOVE_DIRECTION_NEXT);
|
|
2421
|
+
if (task.getExecEndTask())
|
|
2422
|
+
await task.endTask(true, false, false);
|
|
2423
|
+
}
|
|
2424
|
+
break;
|
|
2425
|
+
case InternalInterface.MG_ACT_CYCLE_NEXT_DELETE_REC:
|
|
2426
|
+
if (task.DataView.isEmptyDataview())
|
|
2427
|
+
(task).setExecEndTask();
|
|
2428
|
+
else
|
|
2429
|
+
await this.HandleActionDelline(task, dv, rec, true);
|
|
2430
|
+
if (task.getExecEndTask())
|
|
2431
|
+
await task.endTask(true, false, false);
|
|
2432
|
+
break;
|
|
2433
|
+
case InternalInterface.MG_ACT_SET_EXTERNAL_VALUE:
|
|
2434
|
+
let refreshDisplay = await evt.getArgList().getArgValue(1, StorageAttribute.BOOLEAN, 0) === '1' ? true : false;
|
|
2435
|
+
await ctrl.validateAndSetValueIfAllowed(evt.getValue(), refreshDisplay);
|
|
2436
|
+
break;
|
|
2437
|
+
}
|
|
2438
|
+
}
|
|
2439
|
+
}
|
|
2440
|
+
async handleNonReversibleEvent(task, eventCode) {
|
|
2441
|
+
let rtEvt = new RunTimeEvent(task);
|
|
2442
|
+
let exitCommand = (eventCode === InternalInterface.MG_ACT_EXIT || eventCode === InternalInterface.MG_ACT_CLOSE);
|
|
2443
|
+
rtEvt.setInternal(eventCode);
|
|
2444
|
+
if (exitCommand)
|
|
2445
|
+
this._isNonReversibleExit = true;
|
|
2446
|
+
try {
|
|
2447
|
+
rtEvt.setNonReversibleExit();
|
|
2448
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
|
2449
|
+
rtEvt.setArgList(null);
|
|
2450
|
+
await this.handleEvent(rtEvt, false);
|
|
2451
|
+
}
|
|
2452
|
+
finally {
|
|
2453
|
+
if (exitCommand)
|
|
2454
|
+
this._isNonReversibleExit = false;
|
|
2455
|
+
}
|
|
2456
|
+
}
|
|
2457
|
+
async handleInternalEventWithTaskAndEventSubtype(task, eventCode, eventSubType) {
|
|
2458
|
+
let lastParkedCtrl = task.getLastParkedCtrl();
|
|
2459
|
+
let rtEvt;
|
|
2460
|
+
if (eventCode < InternalInterface.MG_ACT_TOT_CNT && task != null && !(eventSubType === EventSubType.CancelIsQuit) && !task.ActionManager.isEnabled(eventCode))
|
|
2461
|
+
return;
|
|
2462
|
+
if (lastParkedCtrl !== null)
|
|
2463
|
+
await this.handleInternalEventWithMgControl(lastParkedCtrl, eventCode, eventSubType);
|
|
2464
|
+
else {
|
|
2465
|
+
if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
|
|
2466
|
+
await this.handleInternalEventWithTaskAndEventSubtype(task, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
|
|
2467
|
+
else {
|
|
2468
|
+
rtEvt = new RunTimeEvent(task);
|
|
2469
|
+
rtEvt.setInternal(eventCode);
|
|
2470
|
+
rtEvt.SetEventSubType(eventSubType);
|
|
2471
|
+
if (InternalInterface.BuiltinEvent(eventCode))
|
|
2472
|
+
await this.handleEvent(rtEvt, false);
|
|
2473
|
+
else
|
|
2474
|
+
await this.commonHandler(rtEvt);
|
|
2475
|
+
}
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2478
|
+
async handleInternalEventWithMgControl(ctrl, eventCode, eventSubType) {
|
|
2479
|
+
let rtEvt;
|
|
2480
|
+
if (eventCode === InternalInterface.MG_ACT_RT_QUIT)
|
|
2481
|
+
await this.handleInternalEventWithMgControl(ctrl, InternalInterface.MG_ACT_CANCEL, EventSubType.CancelIsQuit);
|
|
2482
|
+
else {
|
|
2483
|
+
rtEvt = new RunTimeEvent(ctrl);
|
|
2484
|
+
rtEvt.setInternal(eventCode);
|
|
2485
|
+
rtEvt.SetEventSubType(eventSubType);
|
|
2486
|
+
if (eventCode === InternalInterface.MG_ACT_RT_REFRESH_VIEW)
|
|
2487
|
+
rtEvt.setIsRealRefresh(false);
|
|
2488
|
+
if (InternalInterface.BuiltinEvent(eventCode))
|
|
2489
|
+
await this.handleEvent(rtEvt, false);
|
|
2490
|
+
else
|
|
2491
|
+
await this.commonHandler(rtEvt);
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
getCurrField() {
|
|
2495
|
+
return this._currField;
|
|
2496
|
+
}
|
|
2497
|
+
getCurrCtrl() {
|
|
2498
|
+
return this._currCtrl;
|
|
2499
|
+
}
|
|
2500
|
+
getCurrTask() {
|
|
2501
|
+
if (this._currField == null)
|
|
2502
|
+
return null;
|
|
2503
|
+
return this._currField.getTask();
|
|
2504
|
+
}
|
|
2505
|
+
setStopExecution(stop, clearSrvrEvents) {
|
|
2506
|
+
if (arguments.length === 1)
|
|
2507
|
+
this.setStopExecution_0(stop);
|
|
2508
|
+
else
|
|
2509
|
+
this.setStopExecution_1(stop, clearSrvrEvents);
|
|
2510
|
+
}
|
|
2511
|
+
setStopExecution_0(stop) {
|
|
2512
|
+
this.setStopExecution(stop, true);
|
|
2513
|
+
}
|
|
2514
|
+
setStopExecution_1(stop, clearSrvrEvents) {
|
|
2515
|
+
if (stop)
|
|
2516
|
+
if (clearSrvrEvents)
|
|
2517
|
+
this._eventsQueue.clear();
|
|
2518
|
+
else {
|
|
2519
|
+
let tmpVec = new List();
|
|
2520
|
+
let rtEvt;
|
|
2521
|
+
let i;
|
|
2522
|
+
while (!this._eventsQueue.isEmpty()) {
|
|
2523
|
+
rtEvt = this._eventsQueue.poll();
|
|
2524
|
+
if (rtEvt.isFromServer()) {
|
|
2525
|
+
rtEvt.resetFromServer();
|
|
2526
|
+
tmpVec.push(rtEvt);
|
|
2527
|
+
}
|
|
2528
|
+
}
|
|
2529
|
+
for (i = 0; i < tmpVec.length; i++)
|
|
2530
|
+
this._eventsQueue.put(tmpVec.get_Item(i));
|
|
2531
|
+
}
|
|
2532
|
+
this._stopExecution = stop;
|
|
2533
|
+
}
|
|
2534
|
+
setStopExecutionCtrl(ctrl) {
|
|
2535
|
+
if (this._stopExecutionCtrl === null || ctrl === null)
|
|
2536
|
+
this._stopExecutionCtrl = ctrl;
|
|
2537
|
+
}
|
|
2538
|
+
async delCurrRec(task, inForceDel) {
|
|
2539
|
+
let dv = task.DataView;
|
|
2540
|
+
task.setMode(Constants.TASK_MODE_MODIFY);
|
|
2541
|
+
await task.getForm().delCurrRec();
|
|
2542
|
+
if (!task.DataView.isEmptyDataview()) {
|
|
2543
|
+
if (dv.getCurrRecIdx() >= 0) {
|
|
2544
|
+
if ((dv.getCurrRec()).getMode() !== DataModificationTypes.Delete && !inForceDel) {
|
|
2545
|
+
let ctrl = task.getLastParkedCtrl();
|
|
2546
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2547
|
+
if (!this.GetStopExecutionFlag())
|
|
2548
|
+
if (ctrl === null)
|
|
2549
|
+
await this.HandleNonParkableControls(task);
|
|
2550
|
+
else
|
|
2551
|
+
await this.handleInternalEventWithMgControlBase(ctrl, InternalInterface.MG_ACT_CTRL_PREFIX);
|
|
2552
|
+
}
|
|
2553
|
+
}
|
|
2554
|
+
else if (!task.getInCreateLine())
|
|
2555
|
+
await this.handleNonReversibleEvent(task, InternalInterface.MG_ACT_EXIT);
|
|
2556
|
+
}
|
|
2557
|
+
else {
|
|
2558
|
+
await this.HandleNonParkableControls(task);
|
|
2559
|
+
await this.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
2560
|
+
}
|
|
2561
|
+
}
|
|
2562
|
+
async updateConfirmed(task) {
|
|
2563
|
+
let confirm;
|
|
2564
|
+
let answer;
|
|
2565
|
+
let ans;
|
|
2566
|
+
if (task == null)
|
|
2567
|
+
return false;
|
|
2568
|
+
confirm = await task.checkProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE, false);
|
|
2569
|
+
if (!this._isInRecordFlushEvent && confirm && !task.DataSynced) {
|
|
2570
|
+
ans = await GUIManager.Instance.confirm(MsgInterface.CRF_STR_CONF_UPD, Styles.MSGBOX_ICON_QUESTION | Styles.MSGBOX_BUTTON_YES_NO_CANCEL);
|
|
2571
|
+
if (ans === Styles.MSGBOX_RESULT_YES)
|
|
2572
|
+
answer = 'Y';
|
|
2573
|
+
else if (ans === Styles.MSGBOX_RESULT_NO)
|
|
2574
|
+
answer = 'N';
|
|
2575
|
+
else
|
|
2576
|
+
answer = 'C';
|
|
2577
|
+
}
|
|
2578
|
+
else
|
|
2579
|
+
answer = 'Y';
|
|
2580
|
+
switch (answer) {
|
|
2581
|
+
case 'Y':
|
|
2582
|
+
break;
|
|
2583
|
+
case 'N':
|
|
2584
|
+
await task.getForm().cancelEdit(false, false);
|
|
2585
|
+
await task.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
2586
|
+
task.ConfirmUpdateNo = true;
|
|
2587
|
+
return false;
|
|
2588
|
+
case 'C':
|
|
2589
|
+
this.setStopExecution(true);
|
|
2590
|
+
this.setStopExecutionCtrl(LastFocusedManager.getLastFocusedControl());
|
|
2591
|
+
await FocusManager.SetFocus(LastFocusedManager.getLastFocusedControl(), -1);
|
|
2592
|
+
return false;
|
|
2593
|
+
default:
|
|
2594
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in ClientManager.Instance.updateConfirmed() illegal confirmation code: " +
|
|
2595
|
+
confirm);
|
|
2596
|
+
break;
|
|
2597
|
+
}
|
|
2598
|
+
return true;
|
|
2599
|
+
}
|
|
2600
|
+
setCompMainPrgTab(compMainPrgTable) {
|
|
2601
|
+
this._compMainPrgTab = compMainPrgTable;
|
|
2602
|
+
}
|
|
2603
|
+
setEndOfWork(endOfWork_) {
|
|
2604
|
+
this._endOfWork = endOfWork_;
|
|
2605
|
+
}
|
|
2606
|
+
getEndOfWork() {
|
|
2607
|
+
return this._endOfWork;
|
|
2608
|
+
}
|
|
2609
|
+
getCompMainPrgTab() {
|
|
2610
|
+
return this._compMainPrgTab;
|
|
2611
|
+
}
|
|
2612
|
+
inNonReversibleExit() {
|
|
2613
|
+
return this._isNonReversibleExit;
|
|
2614
|
+
}
|
|
2615
|
+
pushRtEvent(rtEvt) {
|
|
2616
|
+
this._rtEvents.push(rtEvt);
|
|
2617
|
+
}
|
|
2618
|
+
popRtEvent() {
|
|
2619
|
+
if (this._rtEvents.count() === 0)
|
|
2620
|
+
return null;
|
|
2621
|
+
return this._rtEvents.pop();
|
|
2622
|
+
}
|
|
2623
|
+
storeLastSavedRouteEventOnLocalStorage() {
|
|
2624
|
+
let dataStorage = window.localStorage;
|
|
2625
|
+
if (this.getLastSavedRouteEvent() != null) {
|
|
2626
|
+
let rtEvt = this.getLastSavedRouteEvent();
|
|
2627
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT, "1");
|
|
2628
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK, JSON.stringify(rtEvt.getTask().TaskDefinitionId));
|
|
2629
|
+
if (rtEvt.getArgList().getSize() > 0) {
|
|
2630
|
+
let str = new StringBuilder();
|
|
2631
|
+
rtEvt.getArgList().buildXML(str);
|
|
2632
|
+
dataStorage.setItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST, str.toString());
|
|
2633
|
+
}
|
|
2634
|
+
}
|
|
2635
|
+
}
|
|
2636
|
+
restoreLastSavedRouteEventFromLocalStorage() {
|
|
2637
|
+
let dataStorage = window.localStorage;
|
|
2638
|
+
let lastRouteEvent = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT);
|
|
2639
|
+
if (lastRouteEvent === "1") {
|
|
2640
|
+
let srcTaskDefinitionStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_SRC_TSK);
|
|
2641
|
+
let routeArgListStr = dataStorage.getItem(ConstInterface.LAST_ROUTE_EVENT_ARG_LIST);
|
|
2642
|
+
let taskDefinitionId = new TaskDefinitionId();
|
|
2643
|
+
taskDefinitionId.fromJSON(srcTaskDefinitionStr);
|
|
2644
|
+
let srcTask = MGDataCollection.Instance.getCurrMGData().getTaskByTaskDefinitionID(taskDefinitionId);
|
|
2645
|
+
let args = null;
|
|
2646
|
+
if (routeArgListStr != null) {
|
|
2647
|
+
args = new ArgumentsList();
|
|
2648
|
+
args.fillList(routeArgListStr, srcTask);
|
|
2649
|
+
}
|
|
2650
|
+
EventsManager.Instance.AddLastSavedRouteEvent(srcTask, args);
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
getLastSavedRouteEvent() {
|
|
2654
|
+
return this.lastSavedRouteEvent;
|
|
2655
|
+
}
|
|
2656
|
+
setLastSavedRouteEvent(rtEvt) {
|
|
2657
|
+
if (rtEvt == null)
|
|
2658
|
+
this.lastSavedRouteEvent = null;
|
|
2659
|
+
else
|
|
2660
|
+
this.lastSavedRouteEvent = rtEvt.replicate();
|
|
2661
|
+
}
|
|
2662
|
+
getLastRtEvent() {
|
|
2663
|
+
if (this._rtEvents.count() === 0)
|
|
2664
|
+
return null;
|
|
2665
|
+
return this._rtEvents.peek();
|
|
2666
|
+
}
|
|
2667
|
+
setIgnoreUnknownAbort(val) {
|
|
2668
|
+
this._ignoreUnknownAbort = val;
|
|
2669
|
+
}
|
|
2670
|
+
ignoreUnknownAbort() {
|
|
2671
|
+
return this._ignoreUnknownAbort;
|
|
2672
|
+
}
|
|
2673
|
+
async failTaskOverlay(taskId, mgd) {
|
|
2674
|
+
let cmd;
|
|
2675
|
+
if (taskId !== null) {
|
|
2676
|
+
this.setIgnoreUnknownAbort(true);
|
|
2677
|
+
try {
|
|
2678
|
+
cmd = CommandFactory.CreateNonReversibleExitCommand(taskId, false);
|
|
2679
|
+
mgd.CmdsToServer.Add(cmd);
|
|
2680
|
+
await RemoteCommandsProcessor.GetInstance().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
2681
|
+
}
|
|
2682
|
+
finally {
|
|
2683
|
+
this.setIgnoreUnknownAbort(false);
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
}
|
|
2687
|
+
isEventScopeTrans() {
|
|
2688
|
+
return this._eventScope === EventScope.TRANS;
|
|
2689
|
+
}
|
|
2690
|
+
setEventScopeTrans() {
|
|
2691
|
+
this._eventScope = EventScope.TRANS;
|
|
2692
|
+
}
|
|
2693
|
+
clearEventScope() {
|
|
2694
|
+
this._eventScope = EventScope.NONE;
|
|
2695
|
+
}
|
|
2696
|
+
GetEventTime() {
|
|
2697
|
+
return this._eventsQueue.GetTime();
|
|
2698
|
+
}
|
|
2699
|
+
getMatchingAction(kbItm) {
|
|
2700
|
+
let act = 0;
|
|
2701
|
+
if (kbItm == null)
|
|
2702
|
+
return act;
|
|
2703
|
+
if (act === 0) {
|
|
2704
|
+
if (kbItm.getAction() !== 0)
|
|
2705
|
+
act = kbItm.getAction();
|
|
2706
|
+
else if (kbItm.getKeyCode() === 45 && kbItm.getModifier() === Modifiers.MODIFIER_NONE && kbItm.getStates() === 0)
|
|
2707
|
+
act = InternalInterface.MG_ACT_TOGGLE_INSERT;
|
|
2708
|
+
}
|
|
2709
|
+
return (act);
|
|
2710
|
+
}
|
|
2711
|
+
getExecStack() {
|
|
2712
|
+
return this._execStack.peek();
|
|
2713
|
+
}
|
|
2714
|
+
pushExecStack(taskId, handlerId, operIdx) {
|
|
2715
|
+
this._execStack.peek().push(MGDataCollection.Instance.getTaskIdById(taskId), handlerId, operIdx);
|
|
2716
|
+
}
|
|
2717
|
+
popExecStack() {
|
|
2718
|
+
return this._execStack.peek().pop();
|
|
2719
|
+
}
|
|
2720
|
+
pushNewExecStacks() {
|
|
2721
|
+
this._serverExecStack.push(null);
|
|
2722
|
+
this._execStack.push(new ExecutionStack());
|
|
2723
|
+
}
|
|
2724
|
+
popNewExecStacks() {
|
|
2725
|
+
this._serverExecStack.pop();
|
|
2726
|
+
this._execStack.pop();
|
|
2727
|
+
}
|
|
2728
|
+
pushServerExecStack(taskId, handlerId, operIdx) {
|
|
2729
|
+
if (this._serverExecStack.peek() === null) {
|
|
2730
|
+
this._serverExecStack.pop();
|
|
2731
|
+
this._serverExecStack.push(new ExecutionStack());
|
|
2732
|
+
}
|
|
2733
|
+
this._serverExecStack.peek().push(taskId, handlerId, operIdx);
|
|
2734
|
+
}
|
|
2735
|
+
clearServerExecStack() {
|
|
2736
|
+
if (this._serverExecStack.peek() !== null) {
|
|
2737
|
+
this._serverExecStack.peek().clear();
|
|
2738
|
+
}
|
|
2739
|
+
}
|
|
2740
|
+
reverseServerExecStack() {
|
|
2741
|
+
if (this._serverExecStack.peek() !== null)
|
|
2742
|
+
this._serverExecStack.peek().reverse();
|
|
2743
|
+
}
|
|
2744
|
+
getNextOperIdx(oper, clearWhenFound) {
|
|
2745
|
+
let tmpServerExecStackEntry = null;
|
|
2746
|
+
let nextOperIdx = -1;
|
|
2747
|
+
if (this._serverExecStack.count() !== 0 && this._serverExecStack.peek() !== null && !this._serverExecStack.peek().empty()) {
|
|
2748
|
+
if (this._serverExecStack.peek().size() > this._execStack.peek().size()) {
|
|
2749
|
+
let tmpServerExecStack = new ExecutionStack(this._serverExecStack.peek());
|
|
2750
|
+
while (tmpServerExecStack.size() > this._execStack.peek().size()) {
|
|
2751
|
+
tmpServerExecStackEntry = tmpServerExecStack.pop();
|
|
2752
|
+
}
|
|
2753
|
+
if (this._execStack.peek().Equals(tmpServerExecStack) && tmpServerExecStackEntry.TaskId === oper.getTaskTag() && tmpServerExecStackEntry.HandlerId === oper.getHandlerId() && tmpServerExecStackEntry.OperIdx >= oper.getServerId()) {
|
|
2754
|
+
nextOperIdx = tmpServerExecStackEntry.OperIdx;
|
|
2755
|
+
if (clearWhenFound && this._serverExecStack.peek().size() === this._execStack.peek().size() + 1) {
|
|
2756
|
+
this._serverExecStack.peek().clear();
|
|
2757
|
+
}
|
|
2758
|
+
}
|
|
2759
|
+
else
|
|
2760
|
+
nextOperIdx = EventsManager.MAX_OPER;
|
|
2761
|
+
}
|
|
2762
|
+
else {
|
|
2763
|
+
nextOperIdx = EventsManager.MAX_OPER;
|
|
2764
|
+
}
|
|
2765
|
+
}
|
|
2766
|
+
return nextOperIdx;
|
|
2767
|
+
}
|
|
2768
|
+
setProcessingTopMostEndTask(inProcessingTopMostEndTask) {
|
|
2769
|
+
this._processingTopMostEndTask = inProcessingTopMostEndTask;
|
|
2770
|
+
}
|
|
2771
|
+
getProcessingTopMostEndTask() {
|
|
2772
|
+
return this._processingTopMostEndTask;
|
|
2773
|
+
}
|
|
2774
|
+
setAllowEvents(AllowEvents) {
|
|
2775
|
+
this._allowEvents = AllowEvents;
|
|
2776
|
+
}
|
|
2777
|
+
setNonInteractiveAllowEvents(AllowEvents) {
|
|
2778
|
+
if (AllowEvents)
|
|
2779
|
+
this._allowEvents = EventsAllowedType.NON_INTERACTIVE;
|
|
2780
|
+
else
|
|
2781
|
+
this._allowEvents = EventsAllowedType.NONE;
|
|
2782
|
+
}
|
|
2783
|
+
getAllowEvents() {
|
|
2784
|
+
return this._allowEvents;
|
|
2785
|
+
}
|
|
2786
|
+
NoEventsAllowed() {
|
|
2787
|
+
return this._allowEvents === EventsAllowedType.NONE;
|
|
2788
|
+
}
|
|
2789
|
+
async handleCtrlModify(ctrl, act) {
|
|
2790
|
+
if (ctrl == null || !ctrl.isModifiable())
|
|
2791
|
+
return;
|
|
2792
|
+
switch (act) {
|
|
2793
|
+
case InternalInterface.MG_ACT_RT_EDT_NULL:
|
|
2794
|
+
case InternalInterface.MG_ACT_CTRL_MODIFY:
|
|
2795
|
+
case InternalInterface.MG_ACT_SELECTION:
|
|
2796
|
+
break;
|
|
2797
|
+
default:
|
|
2798
|
+
return;
|
|
2799
|
+
}
|
|
2800
|
+
let rtEvt;
|
|
2801
|
+
rtEvt = new RunTimeEvent(ctrl);
|
|
2802
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CTRL_MODIFY);
|
|
2803
|
+
await this.handleEvent(rtEvt, false);
|
|
2804
|
+
}
|
|
2805
|
+
ActAllowed(act) {
|
|
2806
|
+
let allowed = true;
|
|
2807
|
+
switch (this.getAllowEvents()) {
|
|
2808
|
+
case EventsAllowedType.ALL:
|
|
2809
|
+
allowed = true;
|
|
2810
|
+
break;
|
|
2811
|
+
case EventsAllowedType.NONE:
|
|
2812
|
+
allowed = (act === InternalInterface.MG_ACT_CRELINE);
|
|
2813
|
+
break;
|
|
2814
|
+
case EventsAllowedType.NON_INTERACTIVE:
|
|
2815
|
+
switch (act) {
|
|
2816
|
+
case InternalInterface.MG_ACT_EXIT_SYSTEM:
|
|
2817
|
+
case InternalInterface.MG_ACT_EXIT:
|
|
2818
|
+
case InternalInterface.MG_ACT_CLOSE:
|
|
2819
|
+
case InternalInterface.MG_ACT_CRELINE:
|
|
2820
|
+
case InternalInterface.MG_ACT_CRELINE_ABOVE:
|
|
2821
|
+
case InternalInterface.MG_ACT_ROLLBACK:
|
|
2822
|
+
allowed = true;
|
|
2823
|
+
break;
|
|
2824
|
+
default:
|
|
2825
|
+
allowed = false;
|
|
2826
|
+
break;
|
|
2827
|
+
}
|
|
2828
|
+
break;
|
|
2829
|
+
}
|
|
2830
|
+
return allowed;
|
|
2831
|
+
}
|
|
2832
|
+
async commitRecord(task, isReversibleExit) {
|
|
2833
|
+
let dv = task.DataView;
|
|
2834
|
+
let rec = dv.getCurrRec();
|
|
2835
|
+
let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
|
2836
|
+
let isSelectionTable = await task.checkProp(PropInterface.PROP_TYPE_SELECTION, false);
|
|
2837
|
+
let isNewRec = rec.isNewRec();
|
|
2838
|
+
let savePrevCurrRec = true;
|
|
2839
|
+
let recModified = rec.Modified;
|
|
2840
|
+
if (!dv.recInModifiedTab(rec.getId()))
|
|
2841
|
+
rec.clearFlagsHistory();
|
|
2842
|
+
await task.TaskTransactionManager.checkAndCommit(isReversibleExit, ConstInterface.TRANS_RECORD_PREFIX, task.ConfirmUpdateNo);
|
|
2843
|
+
if (task.transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
|
|
2844
|
+
try {
|
|
2845
|
+
task.DataSynced = true;
|
|
2846
|
+
this.setStopExecution(false);
|
|
2847
|
+
await task.handleEventOnSlaveTasks(InternalInterface.MG_ACT_REC_PREFIX);
|
|
2848
|
+
}
|
|
2849
|
+
finally {
|
|
2850
|
+
this.setStopExecution(true);
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
else if (task.isAborting())
|
|
2854
|
+
this.setStopExecution(true);
|
|
2855
|
+
else {
|
|
2856
|
+
if (recModified)
|
|
2857
|
+
rec.setLateCompute(true);
|
|
2858
|
+
if (!this._stopExecution)
|
|
2859
|
+
task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
2860
|
+
rec.resetUpdated();
|
|
2861
|
+
rec.resetModified();
|
|
2862
|
+
if (!recModified && !forceSuffix && (!isSelectionTable || !task.InSelect)) {
|
|
2863
|
+
if (isNewRec) {
|
|
2864
|
+
dv.setPrevCurrRec();
|
|
2865
|
+
savePrevCurrRec = false;
|
|
2866
|
+
rec.setNewRec();
|
|
2867
|
+
await task.getForm().cancelEdit(false, false);
|
|
2868
|
+
await this.HandleStopRowEditing(task);
|
|
2869
|
+
}
|
|
2870
|
+
else if (!rec.getForceSaveOrg())
|
|
2871
|
+
await dv.cancelEdit(EventsManager.REAL_ONLY, true);
|
|
2872
|
+
else
|
|
2873
|
+
dv.saveOriginal();
|
|
2874
|
+
}
|
|
2875
|
+
else
|
|
2876
|
+
dv.saveOriginal();
|
|
2877
|
+
}
|
|
2878
|
+
if (savePrevCurrRec)
|
|
2879
|
+
dv.setPrevCurrRec();
|
|
2880
|
+
}
|
|
2881
|
+
incLocateTimerCB(taskObj) {
|
|
2882
|
+
let task = taskObj;
|
|
2883
|
+
let rtEvt = new RunTimeEvent(task, true);
|
|
2884
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_INCREMENTAL_LOCATE);
|
|
2885
|
+
rtEvt.setMainPrgCreator(task);
|
|
2886
|
+
rtEvt.setCtrl(task.getLastParkedCtrl());
|
|
2887
|
+
this.addToTail(rtEvt);
|
|
2888
|
+
}
|
|
2889
|
+
static async doSyncForSubformParent(task) {
|
|
2890
|
+
let parentTask = task.getParent();
|
|
2891
|
+
let parentDv = parentTask.DataView;
|
|
2892
|
+
let parentRec = parentDv.getCurrRec();
|
|
2893
|
+
if (task.IsSubForm && parentRec != null && parentRec.Modified && !parentDv.isEmptyDataview()) {
|
|
2894
|
+
parentRec.setMode(DataModificationTypes.Update);
|
|
2895
|
+
await parentDv.addCurrToModified(false);
|
|
2896
|
+
((parentDv.getCurrRec())).Synced = true;
|
|
2897
|
+
parentDv.setChanged(true);
|
|
2898
|
+
let dataViewExecuteLocalUpdatesCommand = CommandFactory.CreateDataViewCommand(parentTask.getTaskTag(), DataViewCommandType.ExecuteLocalUpdates);
|
|
2899
|
+
let result = await parentTask.DataviewManager.Execute(dataViewExecuteLocalUpdatesCommand);
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
async ProcessAbortingError(ex) {
|
|
2903
|
+
let eMsg;
|
|
2904
|
+
let errForConsole;
|
|
2905
|
+
let errForMsgBox;
|
|
2906
|
+
if (ex instanceof ServerError)
|
|
2907
|
+
eMsg = ex.GetMessage();
|
|
2908
|
+
else
|
|
2909
|
+
eMsg = ((ex.Message !== null) ? ex.Message : ex.GetType());
|
|
2910
|
+
errForConsole = StrUtil.getConsoleErorString(eMsg);
|
|
2911
|
+
errForMsgBox = StrUtil.getMsgBoxErorString(eMsg);
|
|
2912
|
+
if (ex.InnerException !== null)
|
|
2913
|
+
Logger.Instance.WriteExceptionToLog(ex.InnerException, errForConsole);
|
|
2914
|
+
else {
|
|
2915
|
+
if (!(ex instanceof ServerError) || Logger.Instance.LogLevel !== Logger_LogLevels.Basic) {
|
|
2916
|
+
Logger.Instance.WriteExceptionToLogWithMsg(errForConsole);
|
|
2917
|
+
}
|
|
2918
|
+
}
|
|
2919
|
+
let sendUnloadToServer = RuntimeContextBase.Instance.ContextID !== RuntimeContextBase.noContextId;
|
|
2920
|
+
MGDataCollection.Instance.currMgdID = 0;
|
|
2921
|
+
let messageString = LanguageData.Instance.getConstMessage(MsgInterface.BRKTAB_STR_ERROR);
|
|
2922
|
+
let style = 16;
|
|
2923
|
+
if (ex.Message.startsWith("<HTML")) {
|
|
2924
|
+
this.processHTMLContent(ex.Message);
|
|
2925
|
+
}
|
|
2926
|
+
else {
|
|
2927
|
+
if (this.ShowErrorInMessageBox(ex)) {
|
|
2928
|
+
await GUIManager.Instance.MessageBox(messageString, errForMsgBox, style);
|
|
2929
|
+
}
|
|
2930
|
+
if (ex instanceof ServerError) {
|
|
2931
|
+
if (ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
|
|
2932
|
+
ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
|
|
2933
|
+
Commands.addGlobalCommand(CommandType.RELOAD_PAGE);
|
|
2934
|
+
Commands.beginInvoke();
|
|
2935
|
+
}
|
|
2936
|
+
}
|
|
2937
|
+
}
|
|
2938
|
+
if (ex instanceof ServerError) {
|
|
2939
|
+
if (ex.GetCode() === ServerError.ERR_CTX_NOT_FOUND ||
|
|
2940
|
+
ex.GetCode() === ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED ||
|
|
2941
|
+
ex.GetCode() === ServerError.ERR_EXECUTED_PROGRAM_CHANGED) {
|
|
2942
|
+
sendUnloadToServer = false;
|
|
2943
|
+
}
|
|
2944
|
+
}
|
|
2945
|
+
if (sendUnloadToServer) {
|
|
2946
|
+
try {
|
|
2947
|
+
let cmd = CommandFactory.CreateUnloadCommand();
|
|
2948
|
+
MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
|
|
2949
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
2950
|
+
}
|
|
2951
|
+
catch (ex3) {
|
|
2952
|
+
if (ex3 instanceof ApplicationException) {
|
|
2953
|
+
Logger.Instance.WriteExceptionToLog(ex3);
|
|
2954
|
+
}
|
|
2955
|
+
else
|
|
2956
|
+
throw ex3;
|
|
2957
|
+
}
|
|
2958
|
+
}
|
|
2959
|
+
GUIManager.Instance.abort();
|
|
2960
|
+
}
|
|
2961
|
+
processHTMLContent(htmlContent) {
|
|
2962
|
+
Commands.addShowHTMLError(CommandType.SHOW_HTML_ERROR, htmlContent);
|
|
2963
|
+
Commands.beginInvoke();
|
|
2964
|
+
}
|
|
2965
|
+
ShowErrorInMessageBox(ex) {
|
|
2966
|
+
if (!(ex instanceof ServerError))
|
|
2967
|
+
return true;
|
|
2968
|
+
if ((ex.GetCode() == ServerError.ERR_EXECUTED_PROGRAM_CHANGED ||
|
|
2969
|
+
ex.GetCode() == ServerError.ERR_WEBCLIENT_PROGRAM_RELOADED) &&
|
|
2970
|
+
RuntimeContextBase.Instance.ContextID === RuntimeContextBase.noContextId)
|
|
2971
|
+
return false;
|
|
2972
|
+
return true;
|
|
2973
|
+
}
|
|
2974
|
+
}
|
|
2975
|
+
EventsManager.Timer_Timeout_Infinite = -1;
|
|
2976
|
+
EventsManager.REAL_ONLY = true;
|
|
2977
|
+
EventsManager.MAX_OPER = 9999;
|
|
2978
|
+
EventsManager.userGrantedForContextActivity = true;
|
|
2979
|
+
EventsManager.clientInactivityTimerON = false;
|
|
2980
|
+
EventsManager.clientContextInactivityTimerAborted = false;
|
|
2981
|
+
EventsManager.Instance = new EventsManager();
|
|
2982
|
+
EventsManager.clientBusyTimeStart = 0;
|
|
2983
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFE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YUFBYSxFQUFFLENBQUM7QUFROUMsaUNBQW1CLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgRm9yY2VFeGl0LFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUHJpb3JpdHksXHJcbiAgUmFpc2VBdCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgU3ViZm9ybVR5cGVcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSW50MzIsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciwgVGhyZWFkLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBFeHBWYWwsXHJcbiAgRm9jdXNNYW5hZ2VyLFxyXG4gIEd1aUNvbnN0YW50cyxcclxuICBHdWlFbnZpcm9ubWVudCxcclxuICBJVGFzayxcclxuICBLZXlib2FyZEl0ZW0sXHJcbiAgTGFzdEZvY3VzZWRWYWwsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTW9kaWZpZXJzLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge1JvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvUm9sbGJhY2tFdmVudENvbW1hbmQnO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7TWdQcmlvcml0eUJsb2NraW5nUXVldWV9IGZyb20gJy4uL3V0aWwvTWdQcmlvcml0eUJsb2NraW5nUXVldWUnO1xyXG5pbXBvcnQge0NvbXBNYWluUHJnVGFibGV9IGZyb20gJy4uL3J0L0NvbXBNYWluUHJnVGFibGUnO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4vUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlciwgUmV0VmFsc30gZnJvbSAnLi9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7VGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSAnLi4vdGFza3MvTUdEYXRhJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuLi90YXNrcy9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vcnQvT3BlcmF0aW9uJztcclxuaW1wb3J0IHtDbGllbnRSZWZyZXNoQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvU2VydmVyVG9DbGllbnQvQ2xpZW50UmVmcmVzaENvbW1hbmQnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tICcuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3InO1xyXG5pbXBvcnQge0V4ZWN1dGlvblN0YWNrfSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFjayc7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2tFbnRyeX0gZnJvbSAnLi4vcnQvRXhlY3V0aW9uU3RhY2tFbnRyeSc7XHJcbmltcG9ydCB7UmV0dXJuUmVzdWx0fSBmcm9tICcuLi91dGlsL1JldHVyblJlc3VsdCc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4vRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi9FdmVudCc7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSAnLi4vRmxvd01vbml0b3JJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0RhdGFWaWV3Q29tbWFuZFR5cGV9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0RhdGF2aWV3Q29tbWFuZCc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0V2ZW50c0FsbG93ZWRUeXBlLCBJRXZlbnRzTWFuYWdlcn0gZnJvbSAnLi9JRXZlbnRzTWFuYWdlcic7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gXCIuLi9DbGllbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQnO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFRpbWVyX1RpbWVvdXRfSW5maW5pdGUgPSAtMTtcclxuICBwcml2YXRlIHN0YXRpYyBSRUFMX09OTFk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgc3RhdGljIE1BWF9PUEVSOiBudW1iZXIgPSA5OTk5O1xyXG4gIHByaXZhdGUgc3RhdGljIHVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gdHJ1ZTtcclxuICBwcml2YXRlIF9ldmVudHNRdWV1ZTogTWdQcmlvcml0eUJsb2NraW5nUXVldWUgPSBudWxsOyAvLyB0aGUgcXVldWUgb2YgZXZlbnRzIHRvIGV4ZWN1dGVcclxuICBwcml2YXRlIF9leGVjU3RhY2s6IFN0YWNrPEV4ZWN1dGlvblN0YWNrPiA9IG51bGw7IC8vIEV4ZWN1dGlvbiBzdGFjayBvZiByYWlzZSBldmVudCBvcGVyYXRpb24gb3IgY2FsbHMgdG8gdXNlclxyXG4gIHByaXZhdGUgX3J0RXZlbnRzOiBTdGFjazxSdW5UaW1lRXZlbnQ+ID0gbnVsbDsgLy8gQSBzdGFjayBvZiBpbi1wcm9jZXNzIHJ1bi10aW1lIGV2ZW50cyAodGhlIGxhc3Qgb25lIGlzIGF0IHRoZSB0b3ApLlxyXG4gIHByaXZhdGUgX3NlcnZlckV4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIEV4ZWN1dGlvbiBzdGFja3Mgb2Ygb3BlcmF0aW9ucyB0aGF0XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gRXZlbnRzQWxsb3dlZFR5cGUuQUxMO1xyXG4gIHByaXZhdGUgX2NvbXBNYWluUHJnVGFiOiBDb21wTWFpblByZ1RhYmxlID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIHByaXZhdGUgX2N1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N1cnJGaWVsZDogRmllbGQgPSBudWxsOyAvLyBmb3IgZXZlcnkgZXZlbnQgZXhlY3V0ZWQgdGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBldmVudCB3YXMgZmlyZWRcclxuICBwcml2YXRlIF9jdXJyS2JkSXRlbTogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICBwcml2YXRlIF9lbmRPZldvcms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmVudFNjb3BlOiBFdmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FOyAvLyBpbnN0cnVjdHMgaG93IHRvIHByb2Nlc3MgZXZlbnRzIHdoaWNoIGFyZSBwcm9wYWdhdGVkIHRvIHNsYXZlIHRhc2tzIGR1cmluZyBleGVjdXRpb24uXHJcbiAgcHJpdmF0ZSBfZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICBwcml2YXRlIF9mb3JjZUV4aXRUYXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF9pZ25vcmVVbmtub3duQWJvcnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSB3aGVuICdhYm9ydCcgY29tbWFuZHMgb24gdW5rbm93biB0YXNrcyBtYXkgYXJyaXZlXHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlY3QgcmUtaW5pdGlhbGl6YXRpb25cclxuICBwcml2YXRlIF9pc0hhbmRsaW5nRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGluZGljYXRlIHdlIGFyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBmb3JjZUV4aXQgcmVsYXRlZCBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfaXNOb25SZXZlcnNpYmxlRXhpdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpcyB0aGUgY29tbWFuZCBub25yZXZlcnNpYmxlXHJcbiAgcHJpdmF0ZSBfaXNJblJlY29yZEZsdXNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiBjdXJyZW50IGFjdCBpcyBNR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkRcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFNhdmVkUm91dGVFdmVudDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAvLyB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgYSBzdGFjayBvZiBleGVjc3RhY2tzXHJcbiAgLy8gaGVyZSBiZWNhdXNlIHdlIG1pZ2h0IGNhbGwgYSBuZXcgcHJvZ3JhbSBiZWZvcmUgd2UgaGFuZGxlZFxyXG4gIC8vIHRoZSBwcmV2aW91cyBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGlvbiB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBldmVudHMgZnJvbSB0aGVcclxuICBwcml2YXRlIF9zdG9wRXhlY3V0aW9uQ3RybDogTWdDb250cm9sID0gbnVsbDsgLy8gaG9sZHMgdGhlIGN0cmwgb24gd2hpY2ggd2UgZ2V0IHRoZSBmaXJzdCBzdG9wIGV4ZWN1dGlvblxyXG4gIHByaXZhdGUgX2lzU29ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX25leHRQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHB1YmxpYyAgZ3VpUGVuZGluZ0V2ZW50OmFueSAgPSBudWxsO1xyXG4gIC8vIEtFWUJPQVJEIEVWRU5UUyBDT05TVEFOVFNcclxuICByZWFkb25seSBLQklfRE9XTjogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICByZWFkb25seSBLQklfVVA6IEtleWJvYXJkSXRlbSA9IG51bGw7XHJcblxyXG4gIC8vIENPTlRFWFQgVEVSTUlOQVRJT04gV0FSTklORyBDT05TVEFOVFNcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dNc2c6IHN0cmluZyA9IFwiVGhlIHNlcnZlciBjb250ZXh0IHNlcnZpbmcgdGhpcyBhcHBsaWNhdGlvbiBpcyBhYm91dCB0byB0aW1lIG91dC4gRG8geW91IHdhbnQgdG8gY29udGludWUgeW91ciB3b3JrP1wiO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSBcIlNlc3Npb24gaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZCFcIjtcclxuXHJcbiAgc3RhdGljIEluc3RhbmNlOiBFdmVudHNNYW5hZ2VyID0gbmV3IEV2ZW50c01hbmFnZXIoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBpc1NwaW5uZXJTaG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBTcGlubmVyU3RvcHBlZDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc3RhdGljIGNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcml2YXRlIENUT1IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fcnRFdmVudHMgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZSA9IG5ldyBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSgpO1xyXG5cclxuICAgIHRoaXMuX2V4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcblxyXG4gICAgdGhpcy5fbmV4dFBhcmtlZEN0cmwgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuS0JJX0RPV04gPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfRE9XTiwgTW9kaWZpZXJzLk1PRElGSUVSX05PTkUpO1xyXG4gICAgdGhpcy5LQklfVVAgPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfVVAsIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRQZW5kaW5nR3VpRXZlbnQoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmd1aVBlbmRpbmdFdmVudDtcclxuICB9XHJcblxyXG4gIHNldFBlbmRpbmdHdWlFdmVudChndWlFdmVudCA6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSlcclxuICAgIHtcclxuICAgICAgaWYgKEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04pIHtcclxuICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkhPSBudWxsKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkpO1xyXG4gICAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGFuIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRm9ybVwiPmZvcm0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nQ29udHJvbFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGlmaWVyXCI+bW9kaWZpZXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0XCI+c3RhcnQgb2Ygc2VsZWN0ZWQgdGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kXCI+ZW5kIG9mIHNlbGVjdGVkIHRleHQgIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0ZXh0XCI+dGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW1cIj5pbSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDaGFyXCI+aXMga2V5Ym9hcmQgY2hhciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VnZ2VzdGVkVmFsdWVcIj5zdWdnZXN0ZWQgdmFsdWUgZm9yIGNob2ljZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgdG8gYmUgYWRkZWQgaW4gdGhlIHF1ZXVlIDwvcGFyYW0+XHJcbiAgQWRkS2V5Ym9hcmRFdmVudChtZ0Zvcm06IE1nRm9ybUJhc2UsIG1nQ29udHJvbDogTWdDb250cm9sQmFzZSwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBpc0FjdENoYXI6IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSAobWdDb250cm9sICE9PSBudWxsKSA/IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5tZ0NvbnRyb2wsIHRydWUsIGZhbHNlKSA6IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+bWdGb3JtLmdldFRhc2soKSwgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IG5ld0tiSXRlbTogS2V5Ym9hcmRJdGVtID0gbmV3IEtleWJvYXJkSXRlbShrZXlDb2RlLCBtb2RpZmllcik7XHJcblxyXG4gICAgaWYgKGlzQWN0Q2hhciAmJiAobWdDb250cm9sICE9PSBudWxsICYmIChtZ0NvbnRyb2wuaXNUZXh0Q29udHJvbCgpKSkpXHJcbiAgICAgIG5ld0tiSXRlbS5zZXRBY3Rpb24oSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NIQVIpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEtleWJvYXJkSXRlbShuZXdLYkl0ZW0pO1xyXG5cclxuICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOKSB7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhzdGFydCwgZW5kLCB0ZXh0KTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBydEV2dC5zZXRWYWx1ZShzdWdnZXN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFFDUiA3NjAzODEgaWYgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZSBjdXJyZW50IGNvbnRyb2wgaXMgdW5wYXJrYWJsZSB0cnlcclxuICAvLy8gICBhbiBtb3ZlIHRvIHRoZSBuZXh0IHBhcmthYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGNoZWNrUGFya2FiaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8qIFFDUiMgOTI1NDY0LiBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbiBkZWxldGluZyBhIHJlY29yZCwgQ1Mgb2YgdGhlIGNvbnRyb2wgZ2V0cyBleGVjdXRlZC5cclxuICAgICAqIFNvLCB0aGUgdGFzaydzIGxldmVsIGlzIHNldCB0byBUQVNLLiBUaGVuIHdlIGdvIHRvIHNlcnZlciBhbiBvbiByZXR1cm5pbmcgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAgKiB3ZSByZWZyZXNoIHRoZSBmb3JtLiBIZXJlLCBzaW5jZSB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpLmUuIFwiZnJvbVwiIChudW1lcmljKSBpcyBoaWRkZW4sXHJcbiAgICAgKiB3ZSB0cnkgdG8gcGFyayBvbiB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sIGZyb20gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKS4gVGhpcyBtYWtlcyB0aGVcclxuICAgICAqIHRhc2sncyBsZXZlbCBhcyBDT05UUk9MLiBOb3csIHdlIHRyeSB0byBleGVjdXRlIFJQLCBidXQgc2luY2UgdGhlIGxldmVsIGlzIENPTlRST0wsXHJcbiAgICAgKiB3ZSBkbyBub3QgZXhlY3V0ZSBpdC4gVGhlIHNvbHV0aW9uIGlzIHRoYXQgY2hlY2tQYXJrYWJpbGl0eSgpIHdoaWNoIGlzIGNhbGxlZCBmcm9tXHJcbiAgICAgKiBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpLCBzaG91bGQgdHJ5IHRvIHBhcmsgb24gdGhlIGNvbnRyb2wgb25seSBpZiB0aGUgdGFzaydzIGxldmVsIGlzIENPTlRST0wuXHJcbiAgICAgKi9cclxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgIWF3YWl0IGN1cnJlbnQuSXNQYXJrYWJsZSgpKVxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBzaXR1YXRpb24gd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhpdGFzazogSVRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICAvLyB3ZSBjYW4gbm90IHN0YXkgaW4gY3JlYXRlIG1vZGUgd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShvbGRNb2RlKTtcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIG9yIGluIHN0b3AgZXhlY3V0aW9uIHN0YXRlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgICAgLy8gRG8gbm90IGdpdmUgcGFyayBlcnJvciwgaWYgdGFzayBpcyBvcGVuZWQgaW4gY3JlYXRlIG1vZGUuIFRoaXMgaXMgdGVtcG9yYXJ5IGNoYW5nZSBmb3IgY3VzdG9tZXIgcHJvYmxlbS5cclxuICAgICAgLy90aGlzLmV4aXRXaXRoRXJyb3IodGFzaywgTXNnSW50ZXJmYWNlLlJUX1NUUl9DUlNSX0NBTlRfUEFSSyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hpbGUgaGFuZGxlIG5vbi1wYXJrYWJpbGl0eSBjb25kaXRpb24sIGVuc3VyZSBDUyBpcyBjYWxsZWQgZm9yIGNvbnRyb2wgaWYgaXQgaXMgaW4gQ29udHJvbCBsZXZlbCB0aGVuIHBhcmtpbmcgaXMgc2V0IG9uIGZvcm0uXHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBudWxsO1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYSBzaW5nbGUgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIHByb2Nlc3MgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHRvIGJlIHBhc3NlZCB0byBoYW5kbGVyLmV4ZWN1dGUoKSA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICBsZXQgcG9zOiBFdmVudEhhbmRsZXJQb3NpdGlvbiA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgZm9yY2VFeGl0RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZFRhc2tFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZFJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gICAgbGV0IG9sZEZvcmNlRXhpdDogRm9yY2VFeGl0ID0gdGhpcy5nZXRGb3JjZUV4aXQoKTtcclxuICAgIGxldCBvbGRGb3JjZUV4aXRUYXNrOiBUYXNrID0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDogYm9vbGVhbiA9IHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQ7XHJcbiAgICBsZXQgcmVzdG9yZUlzRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz4gaGFuZGxlci5nZXRUYXNrKCkuR2V0Q29udGV4dFRhc2soKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA+PSAxMDAwICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUpXHJcbiAgICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlci5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2socnRFdnQuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGFuZGxlIEZvcmNlRXhpdCBmb3Igbm9uLXVzZXIgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLmdldEV2ZW50KCkuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgYXdhaXQgaGFuZGxlci5pc0VuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJlc3RvcmVJc0ZvcmNlRXhpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIGZvcmNlRXhpdCBvbmx5IG9uY2VcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRCZWZvcmUoaGFuZGxlci5nZXRFdmVudCgpLCBydEV2dCkpIHtcclxuICAgICAgICAgICAgICAgIGZvcmNlRXhpdERvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcnVuIHRpbWUgZXZlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgIGlmIChydEV2dCAhPT0gaGFuZGxlci5nZXRFdmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBydW50aW1lIGV2ZW50IGlzIHRoYXQgb2YgdGhlIGhhbmRsZXIgY29tYmluZWQgd2l0aCB0aGVcclxuICAgICAgICAgICAgICAvLyBkYXRhIG9mIHRoZSBjdXJyZW50IHJ1bnRpbWUgZXZlbnQuXHJcbiAgICAgICAgICAgICAgLy8gdGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBwcm9wYWdhdGUgdGhlIGV2ZW50IG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgLy8gaW4gcGxhY2Ugb2YgdGhlIG9yaWdpbmFsIGV2ZW50XHJcbiAgICAgICAgICAgICAgb2xkUnRFdnQgPSBydEV2dDtcclxuICAgICAgICAgICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoaGFuZGxlci5nZXRFdmVudCgpLCBydEV2dCk7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWClcclxuICAgICAgICAgICAgICBydEV2dC5nZXRUYXNrKCkuc2V0SW5SZWNvcmRTdWZmaXgodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50QXJndW1lbnRzKHJ0RXZ0KTtcclxuICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXRWYWxzOiBSZXRWYWxzID0gYXdhaXQgaGFuZGxlci5leGVjdXRlKHJ0RXZ0LCByZXR1cm5lZEZyb21TZXJ2ZXIsIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHByb3BhZ2F0ZSA9IGhhbmRsZXJSZXRWYWxzLlByb3BhZ2F0ZTtcclxuICAgICAgICAgICAgaWYgKCFoYW5kbGVyUmV0VmFscy5FbmFibGVkICYmIHJ0RXZ0Q2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gb2xkUnRFdnQ7XHJcbiAgICAgICAgICAgICAgb2xkUnRFdnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgbmV3IHJ1bnRpbWUgZXZlbnQgdG8gaGFuZGxlIHNvIHBvcCB0aGUgb2xkIG9uZSBhbmQgcHVzaFxyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgb25lIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgZnVsZmlsbGVkIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgICAgICAgIC8vIEFmdGVyIGV4ZWN1dGluZyBhIGhhbmRsZXIsIGJlZm9yZSBlbmRpbmcgYSB0YXNrIChpZiB0aGUgZW5kIGNvbmRpdGlvbiBpcyBUUlVFKSxcclxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSB0YXNrIGlzIG5vdCBhbHJlYWR5IGNsb3NlZC4gVGhpcyBjYW4gaGFwcGVuIGxpa2UgaW4gY2FzZVxyXG4gICAgICAgICAgICAvLyBvZiBRQ1IgIzc5NjQ3NiAtLS0gYSBub24taW50ZXJhY3RpdmUgdGFzayBoYXMgY2FsbGVkIGFuIGludGVyYWN0aXZlIHRhc2sgZnJvbVxyXG4gICAgICAgICAgICAvLyB0YXNrIHN1ZmZpeC4gTm93IGlmIHdlIHByZXNzIEFsdCtGNCwgd2UgZ2V0IEVYSVRfU1lTVEVNIGFjdC4gQW5kIHNvIHdlIGNsb3NlXHJcbiAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBzdGFydGluZyBmcm9tIE1haW4gUHJvZ3JhbS4gU28sIHdoZW4gd2UgY29tZSBvdXQgb2YgdGhlIFRTIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gZXhlY3V0aW9uLCB0aGUgdGFzayBpcyBhbHJlYWR5IGNsb3NlZC5cclxuICAgICAgICAgICAgLy8gRm9yIE9mZmxpbmUgOiBUUCBpcyBleGVjdXRlZCBhdCBjbGllbnQgc2lkZS4gSWYgd2UgYXJlIGluIFRhc2sgUHJlZml4LCBkb250IGNoZWNrIGVuZFRhc2sgY29uZGl0aW9uIGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYICYmIHRhc2suaXNTdGFydGVkKCkgJiYgdGFzay5nZXRFeGVjRW5kVGFzaygpKSB7XHJcbiAgICAgICAgICAgICAgZW5kVGFza0Vycm9yID0gYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGVuZFRhc2tFcnJvcilcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlU3RvcEV4ZWN1dGlvbihydEV2dCkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgLy8gcmVzdG9yaW5nIHRoZSBjb250ZXh0XHJcbiAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKGhhbmRsZXJDb250ZXh0VGFzayk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFwcm9wYWdhdGUpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGlmIChydEV2dENoYW5nZWQpXHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dChydEV2dCk7XHJcbiAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgaGFuZGxlciBmb3IgdGhlIGN1cnJlbnQgZXZlbnRcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KCk7XHJcbiAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbClcclxuICAgICAgICAgICAgRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZS5hZGRUYXNrRXZlbnQocnRFdnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9QUk9QQUdBVEUsIHRhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wYWdhdGUgJiYgIWVuZFRhc2tFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFlbmRUYXNrRXJyb3IpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXJBZnRlcihydEV2dCwgYlJjQmVmb3JlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZm9yY2VFeGl0RG9uZSAmJiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0KSB7XHJcbiAgICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEZvcmNlRXhpdChvbGRGb3JjZUV4aXQsIG9sZEZvcmNlRXhpdFRhc2spO1xyXG4gICAgICBpZiAocmVzdG9yZUlzRm9yY2VFeGl0KVxyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBvbGRJc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSByZXN0b3JlQ3VyckN0cmw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IHJlc3RvcmVDdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHNpbXVsYXRlcyBhbGwgZXZlbnRzIHRoYXQgYXJlIGluIHNlbGVjdGlvbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIGZvY3VzIGV2ZW50XHJcbiAgLy8vICAgSXQgaXMgdXNlZCBpbiA6XHJcbiAgLy8vICAgYWN0aW9ucyBDVFJMK1RBQiAmJiBDVFJMK1NISUZUK1RBQiB0aGF0IG1vdmUgdXMgdG8gdGhlIG5leHQvcHJldmlvdXMgaXRlbSBpbiBUYWIgY29udHJvbFxyXG4gIC8vLyAgIGNsaWNrIG9yIGFjY2VsZXJhdG9yIG9uIHB1c2ggYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5jdHJsIGxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvZHVjZUNsaWNrXCI+dHJ1ZSBzaG91bGQgcHJvZHVjZSBjbGljayBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzaW11bGF0ZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2xCYXNlLCB2YWw6IGFueSwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybDtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGNhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG5cclxuICAgIC8vIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAvLyAgIGlmICghbWdDb250cm9sLmlzTW9kaWZpYWJsZSgpIHx8ICFtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpKSB7XHJcbiAgICAvLyAgICAgbWdDb250cm9sLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgLy8gICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IEdVSU1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAvLyAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgIC8vICAgICAgIE1hbmFnZXIuU2V0Rm9jdXMobGFzdEZvY3VzZWRDb250cm9sLCAtMSk7XHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gd2hlbiBhIHB1c2ggYnV0dG9uIGlzIGFib3V0IHRvIHJhaXNlIGEgJ0NhbmNlbCcgb3IgYSAnUXVpdCcgZXZlbnQuIHdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBmaWVsZC5cclxuICAgIC8vIFRoYXQgc2V0dGluZyBtaWdodCBjYXVzZSBhIHJlYyBzdWZmaXggYW5kIGEgdmFyaWFibGUgY2hhbmdlLlxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pIHtcclxuICAgICAgbGV0IGFSdEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgcmFpc2VBdDogUmFpc2VBdCA9IDxSYWlzZUF0Pihhd2FpdCAobWdDb250cm9sLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQpKS5nZXRWYWx1ZUludCgpKTtcclxuICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgKGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMIHx8IGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCkpIHtcclxuICAgICAgICBpZiAocmFpc2VBdCA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cylcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGNhbmNlbFdhc1JhaXNlZCA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZCh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgbWdDb250cm9sLnNldFJ0RXZ0VGFzayhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpcnN0IHdlIGhhbmRsZSBmb2N1c1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcblxyXG4gICAgY3VyclRhc2suc2V0Q2FuY2VsV2FzUmFpc2VkKGNhbmNlbFdhc1JhaXNlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IjIDk3NDA0NyA6IElmIHdlIGhhdmUgYSBQdXNoIEJ1dHRvbiB3aXRoIEFsbG93IFBhcmtpbmcgPSBObyBhbmQgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIGRvbid0IGhhbmRsZSB0aGUgZXZlbnQuXHJcbiAgICAvLyBUaGlzIGlzIHNhbWUgYXMgb25saW5lLiBJbiBvbmxpbmUsIGlmIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCB0byBub24gcGFya2FibGUgcHVzaCBCdXR0b24sIHdlIGhhbmRsZSB0aGUgZXZlbnRcclxuICAgIC8vIEJ1dCBpZiBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgd2UgZG9uJ3QgaGFuZGxlIGV2ZW50LlxyXG4gICAgLy8gU28gaWYgY29udHJvbCBpcyBwdXNoIGJ1dHRvbiwgZXhlY3V0ZSBoYW5kbGVFdmVudCBvbmx5IHdoZW4gZmllbGQgaXMgbm90IGF0dGFjaGVkIG9yIFBhcmtvbkNMaWNrIGlzIE5vIG9yXHJcbiAgICAvLyBQYXJrb25DTGljayBhbmQgYWxsb3dwYXJraW5nIGlzIGJvdGggWWVzXHJcbiAgICBsZXQgY29udHJvbElzUGFya2FibGU6IGJvb2xlYW4gPSBhd2FpdCBtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpO1xyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKG1nQ29udHJvbC5nZXRGaWVsZCgpID09PSBudWxsIHx8IGNvbnRyb2xJc1BhcmthYmxlKSkge1xyXG5cclxuICAgICAgLy8gUUNSICMzMDE2NTIuIEZvciBub24tcGFya2FibGUgYnV0dG9uIGNvbnRyb2wgd2l0aCBldmVudCByYWlzZWQgYXQgdGhlIGNvbnRhaW5lciB0YXNrIHdpbGwgYmUgY2hhbmdlZCBzb1xyXG4gICAgICAvLyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCB0aGVuIHRoZSB0YXNrIHdpbGwgZ2V0IGZvY3VzLiAoYXMgaW4gT25saW5lIGFuZCBhcyBpZiB0aGUgYnV0dG9uIHdhcyBwYXJrYWJsZSkuXHJcbiAgICAgIC8vIFRoZSBmb2N1cyB3aWxsIGJlIG9uIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJiAhY29udHJvbElzUGFya2FibGUpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU0NzQuIEZvciB0aGUgc2FtZSB0YXNrIGRvIG5vdCBtb3ZlIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9PSBjdXJyVGFzayAmJiBzdWJmb3JtVGFzay5wYXRoQ29udGFpbnMoY3VyclRhc2spKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykgeyAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIGNvZGUgY2FuIGJlIG1vdmVkIHRvIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHN1YmZvcm1UYXNrKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyB0aGVuIEFDVF9ISVQgaXMgc2VudFxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG1nQ29udHJvbDtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYW5kIHNlbGVjdGlvbiBpcyBoYW5kbGVkIGluIHRoZSBlbmQgaWYgcHJldmlvdXMgYWN0aW9ucyBzdWNjZWVkZWRcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgLy8gZm9yIGJ1dHRvblxcY2hlY2sgd2UgZG8gbm90IGNhbGwgdGhpcyB0byBwcmV2ZW50IHJlY3Vyc2lvblxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNlbGVjdGlvbihtZ0NvbnRyb2wsIGxpbmUsIHZhbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuICAgIC8vIHRoZW4gbW91c2UgdXBcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrLCBldmVudENvZGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVJlZnJlc2hcIj5pZGVudGlmaWVyIGlmIHRoZSBldmVudCBjYWxsZWQgYnkgc3ViZm9ybSByZWZyZXNoPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyLCBzdWJmb3JtUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuXHJcbiAgICAvLyBzZXQgU3ViZm9ybUV4ZWNNb2RlIChmb3IgU3ViZm9ybUV4ZWNNb2RlIGZ1bmN0aW9uKSBvbmx5IGluIHJlY29yZCBwcmVmaXguXHJcbiAgICAvLyBTdWJmb3JtRXhlY01vZGUgaXMgY2hhbmdlZCBpbiByZWNvcmQgcHJlZml4IGFuZCBpdCBpcyB0aGUgc2FtZSB1bnRpbCB0aGVcclxuICAgIC8vIG5leHQgcmVjb3JkIHByZWZpeCBleGVjdXRpb24sIGJlY2F1c2Ugd2UgZG8gbm90IG9wZW4gYSBzdWJmb3JtIHRhc2sgZWFjaCB0aW1lXHJcbiAgICAvLyBpbiBSQyBhcyBpdCBpcyBpbiBPbmxpbmUuIEJ1dCB3aGVuIHRoZSBzdWJmb3JtIGlzIHJlZnJlc2hlZCBmcm9tIHRoZSBwYXJlbnRcclxuICAgIC8vIGl0cyByZWNvcmQgcHJlZml4ICYgc3VmZml4IGFyZSBhbHNvIGV4ZWN1dGVkLlxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5Jc1N1YkZvcm0gJiYgdGFzay5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FKS8vIEZJUlNUX1RJTUUgaXMgc2V0IG9ubHkgb25jZSBpblxyXG4gICAgLy8gZG9GaXJzdFJlY29yZEN5Y2xlLlxyXG4gICAge1xyXG4gICAgICB0YXNrLlN1YmZvcm1FeGVjTW9kZSA9IChzdWJmb3JtUmVmcmVzaCA/IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5SRUZSRVNIIDogVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIHRoZSBzdWJmb3JtIHJlZnJlc2ggaXQgaXMgbmVlZGVkIHRvIGV4ZWN1dGUgTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQgaGFuZGxlciBiZWZvcmUgUkVDT1JEX1BSRUZJWCBoYW5kbGVyXHJcbiAgICBpZiAoc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCk7XHJcblxyXG4gICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggfHwgZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbXB0eURhdGF2aWV3T3BlbihzdWJmb3JtUmVmcmVzaCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGFzay5lbXB0eURhdGF2aWV3Q2xvc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5nZXRGb3JtKCkuU2VsZWN0Um93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKDxNZ0NvbnRyb2w+Y3RybCwgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN0cmwgb24gd2hpY2ggd2UgaGFkIGEgXCJzdG9wIGV4ZWN1dGlvblwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFN0b3BFeGVjdXRpb25DdHJsKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemVzIHRoZSBzdGF0aWMgc2VjdGlvbiBvZiB0aGUgZXZlbnRzIG1hbmFnZXIuIFVzdWFsbHkgZG9lcyBub3RoaW5nIGJ1dCBpbiB0aGVcclxuICAvLy8gICBldmVudCBvZiBhcHBsZXQgcmUtbG9hZCAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYSBicm93c2VyIHJlZnJlc2gpIGl0IGluaXRpYWxpemVzIHRoZVxyXG4gIC8vLyAgIHN0YXRpYyBwYXJ0IG9mIHRoaXMgY2xhc3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0ID0gRm9yY2VFeGl0Lk5vbmU7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSBudWxsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldEVuZE9mV29yayh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudDwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzaywgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZERpc3BsYXlMaW5lQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBEaXNwbGF5TGluZTogbnVtYmVyLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIERpc3BsYXlMaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByaW9yaXR5XCI+PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBwcmlvcml0eTogUHJpb3JpdHkpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcmlvcml0eShwcmlvcml0eSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGFkZCBndWkgdHJpZ2dlcmVkIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25NdWx0aU1hcmtcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd2lsbCBiZSB1c2VkIGZvciBtdWx0aW1hcmtpbmcgaW4gdGhlIGZ1dHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9kaWZpZXJzXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpbmVBbmRNb2RpZmllcihjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgbGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgaW4gYSB0YWJsZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRMaW5lKHRhc2s6IFRhc2ssIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdHNrOiBUYXNrID0gbnVsbDtcclxuICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICB0c2sgPSA8VGFzaz50YXNrO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0c2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5EaXNwbGF5TGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGhhbmRsZSBDb2x1bW4gQ2xpY2sgZXZlbnQgb24gQ29sdW1uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlDb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgQWRkQ29sdW1uQ2xpY2tFdmVudChjb2x1bW5DdHJsOiBNZ0NvbnRyb2xCYXNlLCBkaXJlY3Rpb246IG51bWJlciwgY29sdW1uSGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmNvbHVtbkN0cmwsIGRpcmVjdGlvbiwgMCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX0NMSUNLKTtcclxuXHJcbiAgICAvLyBQcmVwYXJlIGFuIGFyZ3VtZW50IGxpc3Qgd2l0aCBhcmd1bWVudCBhcyBjb2x1bW5IZWFkZXJTdHJpbmcuXHJcbiAgICBsZXQgYXJnc0xpc3QgPSBuZXcgQXJyYXk8RXhwVmFsPigpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSwgZmFsc2UsIGNvbHVtbkhlYWRlcik7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVFdmVudCh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyLCByb3V0ZXJwYXRoOiBzdHJpbmcsIHJvdXRlck91dGxldE5hbWU6IHN0cmluZywgcm91dGVQYXJhbXM6IExpc3Q8YW55Pikge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPnRhc2ssIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IGFyZ3NMaXN0OiBFeHBWYWxbXSA9IG5ldyBBcnJheTxFeHBWYWw+KDIpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJwYXRoKTtcclxuICAgIGlmIChyb3V0ZXJPdXRsZXROYW1lID09PSBudWxsKVxyXG4gICAgICByb3V0ZXJPdXRsZXROYW1lID0gXCJcIjtcclxuICAgIGFyZ3NMaXN0WzFdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVyT3V0bGV0TmFtZSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgcnRFdnQuc2V0Um91dGVQYXJhbUxpc3Qocm91dGVQYXJhbXMpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlckNsb3NlZEV2ZW50KHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBzdWJGb3JtQ29udHJvbDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5zdWJGb3JtQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHN1YkZvcm1Db250cm9sLmdldE5hbWUoKSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3JjVGFza1N0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJnTGlzdFN0clwiPjwvcGFyYW0+XHJcbiAgQWRkTGFzdFNhdmVkUm91dGVFdmVudCAoc3JjVGFzazogVGFzaywgYXJnczogQXJndW1lbnRzTGlzdCApIHtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKTtcclxuXHJcbiAgICBpZiAoc3JjVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHJ0RXZ0LnNldFRhc2soc3JjVGFzayk7XHJcbiAgICAgIGlmIChhcmdzICE9IG51bGwpIHtcclxuICAgICAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBBZGQgaW50ZXJuYWwgZXZlbnQgcm8gc2V0IHRoZSB2YWx1ZSBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj4gY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj4gdmFsdWUgb2YgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaERpc3BsYXlcIj4gcmVmcmVzaCBkaXNwbGF5IDwvcGFyYW0+XHJcbiAgQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KGN0cmw6IE1nQ29udHJvbCAsIHZhbHVlOiBhbnksIHJlZnJlc2hEaXNwbGF5OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgMCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFKTtcclxuICAgIHJ0RXZ0LnNldFZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCBmYWxzZSwgcmVmcmVzaERpc3BsYXkgPyAnMScgOiAnMCcpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpXHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgZm9yIG11bHRpbGluZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRMaW5lQW5kQ29kZUFuZElzUHJvZHVjdENsaWNrKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcm9kdWNlQ2xpY2soaXNQcm9kdWNlQ2xpY2spO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpc3RcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGlzdChjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaXN0LCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyYWlzZWRCeVwiPnJlbGV2YW50IG9ubHkgZm9yIG9ubGluZSAoZm9yIHdoaWNoIHN1YmZvcm0gYXJlIGhhbmRsZWQgYXMgb3JwaGFucyk8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50VGFza0FuZENvZGVBbmRSYWlzZWRCeSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpcnN0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9yY2VFeGl0KCk6IEZvcmNlRXhpdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXQoZm9yY2VFeGl0OiBGb3JjZUV4aXQsIHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdCA9IGZvcmNlRXhpdDtcclxuICAgIHRoaXMuc2V0Rm9yY2VFeGl0VGFzayh0YXNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9yY2VFeGl0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXRUYXNrKHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBFdmVudHNNYW5hZ2VyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBhIHVzZXIgZXZlbnQgd2l0aFxyXG4gICAqIEZvcmNlIEV4aXQgPSAnUHJlLVJlY29yZCBVcGRhdGUnXHJcbiAgICovXHJcbiAgaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ICYmIHRoaXMuZ2V0Rm9yY2VFeGl0KCkgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgJiYgdGFzayA9PT0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGUgQ2xpZW50Q29udGV4dEluYWN0aXZpdHkgVGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgY3VyclRpbWU7XHJcbiAgICAvLyBjb252ZXJ0IHRlbnRocyBvZiBzZWNvbmRzIHRvIG1pbGxpc2Vjb25kcy5cclxuICAgIGxldCBjbGllbnRDdHhJbmFjdGl2aXR5VGltZW91dCA9XHJcbiAgICAgIEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpICogMTAwO1xyXG5cclxuICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSB0cnVlO1xyXG4gICAgd2hpbGUgKEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gKSB7XHJcbiAgICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMDAwKTtcclxuICAgICAgICAgdmFyIHRpbWVMYXBzZWQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCB8fCB0aW1lTGFwc2VkID49IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3cgb3IgaGlkZSB0aGUgc3Bpbm5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzaG93XCI+IDwvcGFyYW0+XHJcbiAgYXN5bmMgQ2hlY2tBbmRTaG93U3Bpbm5lcihzaG93OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPlxyXG4gIHtcclxuICAgIGxldCBzZW5kQ29tbWFuZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGV2ZW50IGlzIG9mIGxvd2VzdCBwcmlvcml0eSwgaXQgaXMgYWN0dWFsbHkgc2FmZSB0byBvcGVuIHVzZXIgaW50ZXJhY3Rpb24uXHJcbiAgICAvLyBTbywgc3RvcCB0aGUgc3Bpbm5lci5cclxuICAgIGlmICh0aGlzLmdldExhc3RSdEV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5nZXRMYXN0UnRFdmVudCgpLmdldFByaW9yaXR5KCkgPT09IFByaW9yaXR5LkxPV0VTVClcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzaG93ICE9IHRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgaWYgKHNob3cpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBzcGlubmVyIG9ubHkgaWYgdGhyZXNob2xkIGlzIHJlYWNoZWQuXHJcbiAgICAgICAgLy9Ub0RvOiBEZWZpbmUgYSBjb25zdCBmb3IgMTAwMC4gQWxzbyBtYWtlIGl0IGN1c3RvbWl6YWJsZSBmcm9tIGFuZ3VsYXIgYXBwXHJcbiAgICAgICAgaWYgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSB0aGlzLkdldEV2ZW50VGltZSgpID4gMTAwMCkge1xyXG4gICAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gIE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoc2VuZENvbW1hbmQpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRTaG93U3Bpbm5lcihzaG93KTtcclxuICAgICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgICAgIC8vIHJlbGVhc2UgdGhlIHRocmVhZCBzbyB0aGF0IGZyYW1ld29yayBjYW4gc2hvdy9oaWRlIHRoZSBzcGlubmVyXHJcbiAgICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDUwKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1NwaW5uZXJTaG93biA9IHNob3c7XHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmlzU3Bpbm5lclNob3duKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRpbWUgZm9yIHdoaWNoIGNsaWVudCB3YXMgYnVzeVxyXG4gICAgICAgICAgbGV0IHRvdGFsQ2xpZW50QnVzeVRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0O1xyXG4gICAgICAgICAgdGhpcy5TcGlubmVyU3RvcHBlZC5uZXh0KHRvdGFsQ2xpZW50QnVzeVRpbWUpO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWluIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG1haW4gd2luZG93IGFuZCBmb3IgZXZlcnlcclxuICAvLy8gICBtb2RhbCB3aW5kb3cgUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj4gPC9wYXJhbT5cclxuICBhc3luYyBFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSghbWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICB7XHJcbiAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgYmVmb3JlIG1vdmluZyB0byBpZGxlXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcihmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLl9ldmVudHNRdWV1ZS53YWl0Rm9yRWxlbWVudCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDApO1xyXG5cclxuICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhcmthYmlsaXR5KCk7XHJcblxyXG4gIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBOb24gaW50ZXJhY3RpdmUgZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2tzXHJcbiAgLy8vICAgUmVzcG9uc2libGUgZm9yIGN5Y2xpbmcgZm9yd2FyZCBvbiByZWNvcmRzIGFuZCBoYW5kbGluZyBldmVudHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgTm9uSW50ZXJhY3RpdmVFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhLCB0YXNrQmFzZTogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGFza0Jhc2U7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgd2hpbGUgKCFtZ0RhdGEuSXNBYm9ydGluZykge1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX0RFTEVURV9SRUMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfUkVDKTtcclxuXHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMCk7XHJcblxyXG4gICAgICAvLyBwb2xsIG9ubHkgMSBldmVudC5cclxuICAgICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZyAmJiBhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhzYXZlZEFsbG93RXZlbnRzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWI6IGFueSwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICgoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgPT09IG51bGwgfHwgYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgaW5zdGFuY2VvZiBNR0RhdGEpICYmIChldmVudHNUb0hhbmRsZUNudE9yUnRFdnQgPT09IG51bGwgfHwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgYXdhaXQgIHRoaXMuaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzXzEoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGFuZCBoYW5kbGUgdGhlbSBvbmUgYnkgb25lIHRpbGwgdGhlIHF1ZXVlIGlzIGVtcHR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJhc2VNZ0RhdGFcIj4gbWdkYXRhIG9mIHRoZSB3aW5kb3cgdGhhdCBvcGVuZWRlZCB0aGF0IGhhYmRsZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudHNUb0hhbmRsZUNudFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBkZWx0YTogbnVtYmVyID0gMDtcclxuICAgIGxldCBldmVudHNQb2xsZWRDbnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAvLyBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgdGlsbCBpdHMgZW1wdHlcclxuICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIChldmVudHNUb0hhbmRsZUNudCA9PT0gMCB8fCBldmVudHNQb2xsZWRDbnQgPCBldmVudHNUb0hhbmRsZUNudCkpIHtcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSB0aGlzLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgdGhpcy5fY3VycktiZEl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgYmxvY2tlZEJ5TW9kYWxXaW5kb3c6IGJvb2xlYW4gPSBydEV2dC5pc0Jsb2NrZWRCeU1vZGFsV2luZG93KGJhc2VNZ0RhdGEpO1xyXG4gICAgICAgIGlmIChibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSKSAvLyBRQ1IgIzcyNjE5OCwgZXZlbnRzIGZyb20gLk5FVCBvYmplY3RzIHdoaWNoIGFyZSBub3Qgb24gZm9ybVxyXG4gICAgICAgIC8vIHNob3VsZCBiZSBoYW5kbGVkIG9uIHBhcmVudCBvZiBtb2RhbCB3aW5kb3cgYWxzb1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWRsZSB0aW1lciwgdGltZXIgZXZlbnRzIGFuZCBlbmFibGUvZGlzYWJsZSBldmVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgd2luZG93LlxyXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgY3VycmVudCB3aW5kb3cgZGV0ZXJtaW5lcyB0aGUgY3VycmVudCB0YXNrIGFuZCBjaGFuZ2luZyB0aGUgdGFza1xyXG4gICAgICAgIC8vIGNhdXNlcyBzb21lIHRhc2stc2NvcGVkIGV2ZW50cyB0byBydW4gb24gc3ViLXRhc2tzIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpICYmICFibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRUYXNrKCkgIT09IG51bGwgJiYgIXJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IHJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5HZXRJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgY3Vyck1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKSB7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgIT09IG51bGwgJiYgY3Vyck1nZC5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBjdXJyTWdkID0gY3Vyck1nZC5nZXRQYXJlbnRNR2RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvKiBRQ1JzICM3NzcyMTcgJiAjOTQyOTY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHdlIGhhdmUgcmVtb3ZlZCB0aGUgTUdEYXRhICAgICovXHJcbiAgICAgICAgLyogZnJvbSB0aGUgTUdUYWJsZSBpbiBNYW5hZ2VyLkNsb3NlRXZlbnQoKS4gICovXHJcbiAgICAgICAgLyogSXQgd2FzIGRvbmUgZm9yIGZpeGluZyBRQ1IjIDI5NjI3NyByZWxhdGluZyB0byBtZW0gKi9cclxuICAgICAgICAvKiBsZWFrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgbWdkIHdvdWxkIGJlIG51bGwgaGVyZS4gICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gc3VjaCBhIHNjZW5hcmlvLCB0YWtlIHRoZSBwYXJlbnQgbWdkIGZyb20gdGhlICAgKi9cclxuICAgICAgICAvKiByZWxhdGVkIHRhc2sgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGV2ZW50cy4gICAqL1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgPT09IG51bGwgJiYgdGFzayAhPT0gbnVsbCAmJiB0YXNrLmdldFBhcmVudCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgIGN1cnJNZ2QgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgY3Vyck1nZCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyTWdkID09PSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFRhc2soKSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKHRhc2sgIT09IG51bGwgJiYgKHRhc2suaXNBYm9ydGluZygpIHx8IHRhc2suSW5FbmRUYXNrKSlcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBydEV2dC5zZXRUYXNrKHRhc2spO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSBudWxsOyAvLyBkZWxldGUgY3VycmVudCBwcm9jZXNzZWQgY29udHJvbFxyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IG1haW5Qcm9nOiBUYXNrID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KDApO1xyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICAvLyBsb2dnaW5nIGZvciBwZXJmb3JtYW5jZVxyXG4gICAgICAgIGlmIChkZWx0YSA+IDApIHtcclxuICAgICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIGRlbHRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWR2YW5jZSBFdmVudHNQb2xsZWQgb25seSBpZiB0aGUgZXZlbnQgaXMgaW50ZXJuYWwuIG90aGVyd2lzZSBpbnRlcm5hbHMgdG8gYmUgZXhlY3V0ZWQgd2lsbCBiZSBuZXZlciByZWFjaGVkIGJ5IG5vbiBpbnRlcmFjdGl2ZSB0YXNrcy5cclxuICAgICAgaWYgKGV2ZW50c1RvSGFuZGxlQ250ID4gMCAmJiBydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuSW50ZXJuYWxFdmVudCA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UKVxyXG4gICAgICAgIGV2ZW50c1BvbGxlZENudCsrO1xyXG4gICAgfSAvLyB3aGlsZSAoIV9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgLi4uXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgYW55IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdG9wOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybiBzdG9wO1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGxldCBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEFuIGVycm9yIGluIHRoZSByZWNvcmQgcHJlZml4IHNlbmRzIHVzIHJpZ2h0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQgcHJlZml4LlxyXG4gICAgICAgICAgLy8gSXQgbWlnaHQgY3JlYXRlIGFuIGVuZGxlc3MgbG9vcCBidXQgaXQgaXMgT0sgdG8gZG8gc28uIEl0IGlzIGEgZGV2ZWxvcGVyIGJ1Zy5cclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSBoYW5kbGVkIGluIGNvbW1vbmhhbmRsZXJhZnRlclxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRXJyb3IgbWlnaHQgaGF2ZSBvY2N1cnJlZCBpbiBDUC5cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbClcclxuICAgICAgICAgIC8vIG9ubHkgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0b3AgZXhlY3V0aW9uIGN0cmxcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjdXJyQ3RybCk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDUCBnb3Qgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIGluIHRoaXMgaGFuZGxlciBhbmQgaXMgcGFya2FibGUuXHJcbiAgICAgICAgICAgIC8vIHdlIG1vdmUgdG8gdGhlIExhc3RQYXJrYWJsZSBjb250cm9sXHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChsYXN0UGFya2VkQ3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhsYXN0UGFya2VkQ3RybCwgLTEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gSXQgbXVzdCBiZSBzZXQgdG8gZmFsc2Ugc28gdGhhdCBuZXh0IHRpbWUgZm9yIGZhc3QgbW9kZSBDUyBtdXN0IGJlIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgY3VyckN0cmwuc2V0SW5Db250cm9sU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgICBpZiAoZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYmVmb3JlIHRoZSBoYW5kbGVyIGV4ZWN1dGUgaXRzIG9wZXJhdGlvbnMgcmV0dXJucyB0cnVlXHJcbiAgLy8vICAgaWYgdGhlIGZvcmNlIGV4aXQgd2FzIGhhbmRsZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRcIj50aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRCZWZvcmUoZXZ0OiBFdmVudCwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gZXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG4gICAgbGV0IGlzTmV3UmVjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgb2xkSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgZm9yY2VFeGl0ID09PSA8Rm9yY2VFeGl0PjBcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Ob25lIHx8IHJ0RXZ0LmlzSW1tZWRpYXRlKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSB0cnVlO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChvbGRSZWMgIT09IG51bGwgJiYgb2xkUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiBvbGRSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICBpc05ld1JlYyA9IHRydWU7XHJcbiAgICAgIG9sZElkeCA9IG9sZFJlYy5nZXRJZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaG91bGQgd2UgZXhpdCB0aGUgcmVjb3JkP1xyXG4gICAgaWYgKChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgfHwgZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgLy8gSWYgd2UgZmFpbGVkIGV4aXRpbmcgYSBuZXdseSBjcmVhdGVkIHJlY29yZCAtIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiB0aGlzLl9zdG9wRXhlY3V0aW9uICYmIGlzTmV3UmVjICYmIG9sZElkeCA9PT0gY3VyclJlYy5nZXRJZCgpICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgIC8vIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgY3VyclJlYy5yZXN0YXJ0KERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzMwMzc2MiAtIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgZm9yY2VFeGl0ID0gZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBjdHJsVmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwoZXZ0Q3RybCk7XHJcbiAgICAgICAgbGV0IGV2dEN0cmx2YWw6IHN0cmluZyA9IGV2dEN0cmwuVmFsdWU7XHJcbiAgICAgICAgLy8gdGVzdCB0aGUgbmV3IGNvbnRyb2wgdmFsdWVcclxuICAgICAgICBhd2FpdCBldnRDdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUoY3RybFZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnQgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHJ0RXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21taXRSZWNvcmQodGFzaywgdHJ1ZSk7XHJcbiAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBwb3N0LXJlY29yZCB0eXBlIHdlIGFscmVhZHkgZGlkIHJlYy1wcmVmaXggYW5kIGN0cmwgcHJlZml4IGluIHRoZSBoYW5kbGVGb3JjZUV4aXRCZWZvcmVcclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChjdHJsICE9PSBudWxsICYmIGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgODAxODczIC0gdXBkYXRlIHRoZSBkaXNwbGF5IGFmdGVyIGhhbmRsZXIgb2YgZm9yY2UgZXhpdCBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIGNvbnRyb2wgdGhhdCBpcyBhdHRhY2hlZCB0byBhIGZpZWxkXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCAoPEZpZWxkPmV2dEN0cmwuZ2V0RmllbGQoKSkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGEgc3BlY2lhbCByb3V0aW5lIHRvIGhhbmRsZSBkYXRhIGFuZCB0aW1lciBldmVudHNcclxuICAvLy8gICBpdCByZWNlaXZlcyBhIEhhbmRsZXJzVGFibGUgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYnkgb25lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJzVGFiXCI+dGhlIGhhbmRsZXJzIHRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+YSByZWZlcmVubmNlIHRvIHRoZSB0aW1lciBydW50aW1lIGV2ZW50IC0gZm9yIGV4cHJlc3Npb24gZXZlbnRzIGl0IG11c3QgYmUgbnVsbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMShoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBoYW5kbGVyc1RhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBoYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICAgIC8vIHRoZSBydEV2dCBpcyB1c2VkIHRvIHBhc3MgdGhlIGN0cmwsIHRoZXJlZm9yIGl0IG11c3QgYmUgdmFsaWQgKG5vdCBudWxsKVxyXG4gICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fCBoYW5kbGVyLmlzU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNOb25TcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc0dsb2JhbEhhbmRsZXJPZihydEV2dCkpIHtcclxuICAgICAgICAgIGF3YWl0IGhhbmRsZXIuZXhlY3V0ZShydEV2dCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRha2VzIGNhcmUgb2Yga2V5ZG93biBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCBwcmVzc2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtiZEl0ZW1cIj5rZXlib3JkIGl0ZW08L3BhcmFtPlxyXG4gcHJpdmF0ZSBhc3luYyBoYW5kbGVLZXlEb3duKHRhc2s6IFRhc2ssIGN0cmw6IE1nQ29udHJvbCwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBrYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBldnQuZ2V0S2JkSXRtQWx3YXlzKCk7XHJcbiAgICBsZXQga2V5Q29kZTogbnVtYmVyID0ga2JkSXRlbS5nZXRLZXlDb2RlKCk7XHJcbiAgICBsZXQgbW9kaWZpZXI6IE1vZGlmaWVycyA9IGtiZEl0ZW0uZ2V0TW9kaWZpZXIoKTtcclxuICAgIHRoaXMuX2N1cnJLYmRJdGVtID0ga2JkSXRlbTtcclxuXHJcbiAgICAvLyBJZiBrZXlib2FyZCBidWZmZXJpbmcgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgY29udHJvbCB0byByZWNlaXZlXHJcbiAgICAvLyB0aGlzIGV2ZW50XHJcbiAgICBpZiAoZXZ0Lklnbm9yZVNwZWNpZmllZENvbnRyb2wpIHtcclxuICAgICAgY3RybCA9IHRoaXMuZ2V0Q3VyckN0cmwoKTtcclxuICAgICAgdGFzayA9ICgoKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSBpbnN0YW5jZW9mIFRhc2spID8gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIDogbnVsbCkpO1xyXG4gICAgICAvLyBUaGUgY29udHJvbCByZWNlaXZpbmcga2V5cyBmcm9tIGtleWJvYXJkIGJ1ZmZlcmluZyBtdXN0IGJlIGEgdGV4dGJveFxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiBcIiArIGtleUNvZGUpO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAvLyBET1dOIG9yIFVQIGludm9rZWQgb24gYSBTRUxFQ1QvUkFESU8gY29udHJvbFxyXG4gICAgICBpZiAodGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX0RPV04pIHx8IHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9VUCkpIHtcclxuICAgICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzaywgY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldFN5c3RlbSh0aGlzLl9jdXJyS2JkSXRlbSk7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhldnQuZ2V0U3RhcnRTZWxlY3Rpb24oKSwgZXZ0LmdldEVuZFNlbGVjdGlvbigpLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCAmJiBNZ0NvbnRyb2wudmFsaWRSZXR1cm5Ub0N0cmwoKSlcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBNR0RhdGEgaXMgc3RpbGwgYWxpdmUgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50cyBhYm92ZVxyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogXCIgKyBrZXlDb2RlKTtcclxuICAgICAgLy8gaWYgYSBrZXkgd2FzIHByZXNzZWQgb24gdGFibGUgY2hpbGQsIG1ha2Ugc3VyZSB0aGF0IGlzIGlzIHZpc2libGVcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgY3RybC5Jc1JlcGVhdGFibGUgJiYgY3RybCA9PT0gTWdDb250cm9sLlJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkhhbmRsZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPnZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgdmFsOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpIHtcclxuICAgICAgbGV0IGNoZWNrRm9jdXM6IGJvb2xlYW4gPSAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCk7XHJcbiAgICAgIGxldCBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiA9IChjaGVja0ZvY3VzID8gKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpID09PSBjdHJsKSA6IHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFhbGxvd1NlbGVjdGlvbiB8fCAhY3RybC5pc01vZGlmaWFibGUoKSB8fCAhYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNEaWZmZXJlbnRWYWx1ZSh2YWwsIGN0cmwuSXNOdWxsLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gIzkzMTU0NSAtIHZhciBjaGFuZ2UgbXVzdCBiZSBpbnZva2VkIGZpcnN0IGJlZm9yZSBjb250cm9sIHZlcmlmaWNhdGlvbi5cclxuICAgICAgICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDdHJsTW9kaWZ5KGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24gTGlzdEJveCB2YWx1ZSB0byBmaWVsZCBhbmQgY3RybCB3b3VsZCBiZSBzZXQgb24gbGVhdmluZ1xyXG4gICAgICAgIC8vIGNvbnRyb2wsIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCBzdWZmaXguIFNvIHZhcmlhYmxlIGNoYW5nZSBpbnRlcm5hbCBldmVudCB3b3VsZCBiZVxyXG4gICAgICAgIC8vIGhhbmRsZWQgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC5cclxuICAgICAgICBpZiAoIWN0cmwuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKSlcclxuICAgICAgICAgIGF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIE1vdXNlIFVwIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250b2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9kdWNlQ2xpY2tcIj5pZiB0cnVlLCBwcm9kdWNlIGNsaWNrIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNb3VzZVVwKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSICMgNjE0NCBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIF9jdXJyQ2xpY2tlZFJhZGlvIG1lbWJlclxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pXHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gY3RybDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKCEgYXdhaXQgY3RybC5jaGVja1Byb3BXaXRoTGluZShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlLCBsaW5lKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIHRydWUpO1xyXG4gICAgICAgIGxldCBTdG9wRm9jdXM6IGJvb2xlYW4gPSBjdHJsLmlzRm9jdXNlZFN0b3BFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgaWYgKCghY2FuR290b0N0cmwgfHwgKCh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cykgJiYgcmV0dXJuVG9DdHJsICE9PSBjdHJsKSkgJiYgcmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJvZHVjZUNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkpIHtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9DTElDSyk7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRSYWRpbyA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBDaGVjayBpZiBjdHggaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciwgaWYgc28gYW5kIGN1cnJlbnQgZXZlbnQgaXMgcm91dGUgZXZlbnQgLCB0aGVuIHNhdmUgaXRcclxuICAvLyAgdG8gZXhlY3V0ZSBhZ2FpbiB3aGVuICBzZXJ2ZXIgY3R4IGlzIHJlY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyKGFSdEV2dDphbnkpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoYVJ0RXZ0LmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PVxyXG4gICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFICYmIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgRm9jdXMgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBvbkNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG5cclxuXHJcbiAgICAgIC8vIElmIHdlIGF0dGVtcHQgdG8gcGFyayBvbiBjb250cm9sIHdoZXJlIHdlIGRvIG5vdCB3YW50IHRvIGFsbG93IHRvIHBhcmsgbGlrZSBpZiBjb250cm9sIGhhcyBleHByZXNzaW9uIG9yIHBhcmVudCB0YXNrIGZpZWxkLCBkbyBub3QgYWxsb3cgdG8gZm9jdXMgb24gaXQuXHJcbiAgICAgIC8vIFNldCBGb2N1cyBiYWNrIHRvIGxhc3RGb2N1c2VkQ29udHJvbC4gV2UgbmVlZCBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sIGFzIHdlIGdldCBmb2N1cyBldmVudCBvbiBhIGNvbnRyb2wgdHdpY2UuIFNvIHRvIGF2b2lkIHRvIHNob3cgZXJyb3IgbXVsdGlwbGUgdGltZXMsXHJcbiAgICAgIC8vIG1haW50YWluIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wuXHJcbiAgICAgIGlmIChjdHJsICE9PSB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgJiYgY3RybC5IYXNFeHBPclBhcmVudFRhc2tGaWVsZCgpKSB7XHJcbiAgICAgICAgLy8gU2hvdyBlcnJvciBvbmx5IGZvciBjb250cm9scyBoYXZpbmcgRGF0YSBwcm9wZXJ0eSBhbmQgcGFya2FibGVcclxuICAgICAgICBpZihjdHJsLmlzTGlzdEJveCgpIHx8IGN0cmwuaXNDaGVja0JveCgpIHx8IGN0cmwuaXNDb21ib0JveCgpIHx8IGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sIGVpdGhlciBoYXMgZXhwcmVzc2lvbiBvciBoYXMgcGFyZW50IHRhc2sgdmFyaWFibGUgYXR0YWNoZWQgdG8gaXQuIEZhaWxlZCB0byBwYXJrIG9uIGNvbnRyb2wgd2l0aCBuYW1lOiB7MH1cIiwgY3RybC5OYW1lKSk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyNzI4OiBVc2UgbGFzdCBmb2N1c2VkIHRhc2sgaW5zdGVhZCBjb250cm9sIHRhc2sgYXMgY29udHJvbCBjYW4gYmUgZnJvbSBzdWJmb3JtLlxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAwLFxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY3RybDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAob25DbGljaylcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gY3RybDtcclxuXHJcbiAgICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAoY3RybCA9PT0gcHJldkN0cmwgJiYgIWN0cmwuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAvLyB3ZSByZWNlaXZlZCBmb2N1cyB0d2ljZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGVjayBpZiBsYXN0IHRhc2sgaXMgb3BlbmVkIGluIE1vZGFsIFN1YmZvcm0sIGlmIHllcywgY2xvc2UgaXQgYmVmb3JlIGZvY3Vzc2luZyBvbiBwYXJlbnQgdGFzaydzIGN0cmxcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuX25leHRQYXJrZWRDdHJsID0gY3RybDsgLy8gc2F2ZSB0aGUgTkVYVCBjb250cm9sICh1c2VkIHRvIGNoZWNrIHRoZSBkaXJlY3Rpb24pXHJcblxyXG4gICAgICBpZiAoY3RybCA9PT0gbnVsbCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKHByZXZDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICAgIGlmICgoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pICYmICg8UmFpc2VBdD4oYXdhaXQgKGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVCkpLmdldFZhbHVlSW50KCkpID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKSlcclxuICAgICAgICBjdXJyVGFzayA9IHByZXZUYXNrO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgY3VyclRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIG9uQ2xpY2spO1xyXG5cclxuICAgICAgLy8gR28gdG8gdGhlIGNvbnRyb2wgLSBpbnNlcnQgcHJlZml4XHJcbiAgICAgIGlmIChjYW5Hb3RvQ3RybCkge1xyXG5cdCAgICAvLyBNb2RhbCBzdWJmb3JtIHRhc2sgY2xvc2luZyBoYXMgYWxyZWFkeSBiZWd1bi4gRG8gbm90IGhhbmRsZSBIYW5kbGVTdWJmb3JtTW9kYWxpdHkoKSBhZ2Fpbi5cclxuICAgICAgICBpZiAodGhpcy5ndWlQZW5kaW5nRXZlbnQgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgaGFuZGxlZCA9IGF3YWl0IHRoaXMuSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmwsIHByZXZUYXNrLCBjdXJyVGFzayk7XHJcbiAgICAgICAgaWYgKGhhbmRsZWQpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBldmVudExpbmU6IG51bWJlciA9IChjdHJsLmlzUmVwZWF0YWJsZSgpIHx8IGN0cmwuaXNSYWRpbygpKSA/IGxpbmUgOiBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZXZlbnRMaW5lKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIGlmIChwcmV2Q3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghcHJldkN0cmwuaXNNb2RpZmlhYmxlKCkpIHtcclxuICAgICAgICAgIGlmIChwcmV2Q3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgICAgYXdhaXQgcHJldkN0cmwucmVzdG9yZU9sZFZhbHVlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghY3VyclRhc2suY2FuY2VsV2FzUmFpc2VkKCkpIHtcclxuICAgICAgICAgIGxldCBuZXdWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChwcmV2Q3RybCk7XHJcbiAgICAgICAgICBpZiAoISBhd2FpdCBwcmV2Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKG5ld1ZhbCwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IHByZXZDdHJsO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID09PSBjdHJsKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3ViZm9ybSBtb2RhbGl0eSBiZWZvciBmb3Vjc3Npbmcgb24gcGFyZW50IGN0cmxcclxuICAvLy8gMS5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gdGFzayBhbmQgdXNlciBjbGlja3Mgb24gaXQncyBwYXJlbnQgOiBjbG9zZSB0aGUgc3ViZm9ybSB0YXNrLlxyXG4gIC8vLyAyLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBhbm90aGVyIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiAgcGFyZW50J1AxJ1xyXG4gIC8vLyB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyAzLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbm9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uIFMxLCB3aWxsIG5vdCBjbG9zZSBTMlxyXG4gIC8vLyBidXQgY2xpY2tpbmcgb24gUDEgd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN0cmwgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlRhc2tcIj5wcmV2aW91cyB0YXNrIHdoaWNoIHdhcyBpbiBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzayB3aGljaCBpcyB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcblxyXG4gIHByaXZhdGUgIGFzeW5jIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsOiBNZ0NvbnRyb2wsIHByZXZUYXNrOiBUYXNrLCBjdXJyVGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj5cclxuICB7XHJcbiAgICBsZXQgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGV2YWx1YXRlIHRoZSBjb3JyZWN0IHByZXZUYXNrIHRvIGJlIGNsb3NlZCBpZiBpdCBpcyBNb2RhbC5cclxuICAgIC8vIGlmIG5ld2x5IHN1YmZvcm0gTW9kYWwgdGFzayBpcyBvcGVuZWQgYW5kIGl0IGlzIG5vdCB5ZXQgZm9jdXNzZWQsIGluIHRoYXQgY2FzZSBjdXJyIHRhc2sgaXMgc2FtZSBhcyBwcmV2dGFzay5cclxuICAgIC8vIG5vdyBjbGlja2luZyBvbiBpdCdzIHBhcmVudCB0YXNrLCBzaG91bGQgY2xvc2UgdGhlIE1vZGFsIHN1YmZvcm0gdGFza1xyXG4gICAgbGV0IGxlbmd0aCA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGxldCB0b3BUYXNrOiBUYXNrID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFzayhsZW5ndGgtMSk7XHJcbiAgICBpZiAoY3VyclRhc2sgPT0gcHJldlRhc2sgfHwgcHJldlRhc2sgIT0gdG9wVGFzayAvKiBuZXN0ZWQgc3ViZm9ybSAqLykge1xyXG4gICAgICAgIGlmKHRvcFRhc2sgIT0gbnVsbCAmJiBwcmV2VGFzayAhPSB0b3BUYXNrICYmIHRvcFRhc2suSXNTdWJGb3JtICkge1xyXG4gICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRvcFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICAgICAgICBwcmV2VGFzayA9IHRvcFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjbG9zZSBzdWJmb3JtIHRhc2sgaXMgTW9kYWwgaWYgdG8gYmUgcGFya2VkIG9uIHBhcmVudC5cclxuICAgIGlmIChwcmV2VGFzayAhPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgJiYgcHJldlRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG5cclxuICAgICAgICBpZiAoIWN1cnJUYXNrLmlzRGVzY2VuZGVudE9mKHByZXZUYXNrKSkge1xyXG4gICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnByZXZUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5Jc01vZGFsKCkgJiYgIWN1cnJUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpXHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gcHJldlRhc2suR2V0U3ViZm9ybU1vZGFsUGFyZW50VGFzaygpO1xyXG4gICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgKGN0cmwgIT0gc3ViZm9ybUN0cmwpICYmIHN1YmZvcm1DdHJsLklzTW9kYWwoKSkge1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKDxNZ0NvbnRyb2w+c3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENhbGxzIENvbnRyb2xzIFN1ZmZpeCB3aGVuIGZvY3VzIG9uIE5vbiBtYWdpYyBjb250cm9sIGkuZS4gY29udHJvbCB3aXRoIE1hZ2ljRHVtbXlDb250cm9sIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gZ28gdG8gdGhlIGNvbnRyb2wgYW5kIHRyeSB0byBwYXJrIG9uIGluXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj5yZWFsIGNsaWNrIGlzIHBlcmZvcm1lZCwgdGhpcyBub3QgY2xpY2sgc2ltdWxhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbkdvVG9Db250cm9sKGN0cmw6IE1nQ29udHJvbCwgb25DbGljazogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChvbkNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIFY5LjRTUDRkIGNoYW5nZSBvZiBiZWhhdmlvciAtIHdlIGRvIG5vdCBcImV4aXRcIiBmcm9tIHRoZSBjdXJyZW50IGN0cmxcclxuICAgIC8vIChpLmUuIG5vdCBwZXJmb3JtaW5nIGN0cmwgc3VmZml4IG9yIGN0cmwgdmVyaWZpY2F0aW9ucykgaWYgdGhlIHRhcmdldCBjdHJsXHJcbiAgICAvLyBpcyBJTUcgb3IgaHlwZXJ0ZXh0LlxyXG4gICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICBpZiAoIWN1cnJUYXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSAmJiAhY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGNhbkdvdG9DdHJsID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGNhbkdvdG9DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBUaW1lciBFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUaW1lcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZXZ0LnNldFR5cGUoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUik7XHJcbiAgICBpZiAoZXZ0LmlzSWRsZVRpbWVyKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoZXZ0LmdldE1nZElEKCkpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0VGltZXJIYW5kbGVycygpLCBldnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCBpcyBhYm91dCB0byBleHBpcmUsIHJhaXNlIGEgd2FybmluZyB0byB1c2VyXHJcbiAgLy8gICAgc28gdGhhdCB0aGUgc2Vzc2lvbiBjYW4gYmUgY29udGludWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRpbWVOb3c6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSBldnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGxhc3RSZXF1ZXN0VGltZTogbnVtYmVyID0gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5HZXRMYXN0UmVxdWVzdFRpbWU7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKS8xMDtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lOiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKCkvMTA7XHJcblxyXG4gICAgbGV0IGlkbGVUaW1lID0gKHRpbWVOb3cgLSBsYXN0UmVxdWVzdFRpbWUpLzEwMDA7XHJcblxyXG4gICAgLy8gRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIG9ubHkgZm9yIHZhbGlkIHRpbWVvdXRzXHJcbiAgICBpZihjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPT0gMCB8fCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZihFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ICYmIGlkbGVUaW1lID49IChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLSBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKSkge1xyXG4gICAgICAvLyByYWlzZSBhbiBhbGVydCB0byBub3RpZnkgdXNlciB3aGVuIHRoZSBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWRcclxuICAgICAgLy8gaWYgdXNlciBjbGlja3Mgb24gT0ssIHNlbmQgZHVtbXkgcmVxdWVzdCB0byBzZXJ2ZXIuIElmIENhbmNlbCBpcyBjbGlja2VkLCBkbyBub3RoaW5nLlxyXG4gICAgICBsZXQgdXNlckNvbmZpcm1hdGlvbjogbnVtYmVyID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KHRoaXMuY29uZmlybWF0aW9uRGlhbG9nVGl0bGUsIHRoaXMuY29uZmlybWF0aW9uRGlhbG9nTXNnLCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk8pO1xyXG4gICAgICBpZih1c2VyQ29uZmlybWF0aW9uID09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUylcclxuICAgICAge1xyXG4gICAgICAgIC8vIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gbWFyayB0aGUgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQgdG8gemVyb1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRpbWVvdXRSZXNldEV2ZW50Q29tbWFuZCgpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIGV4cHJlc3Npb24gaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICBydEV2dC5zZXRFeHByZXNzaW9uKG51bGwpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IocnRFdnQuZ2V0VGFzaygpKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0RXhwSGFuZGxlcnMoKSwgcnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2l6ZSBvZiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZShjdHJsOiBNZ0NvbnRyb2wsIHJvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLnNldFJvd3NJblBhZ2Uocm93c0luUGFnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGRhdGEgZm9yIFJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3Jkc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSb3dEYXRhQ3VyUGFnZSh0YWJsZTogTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YWJsZS5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2ZlcnMgZGF0YSB0byBHVUkgdGhyZWFkIGluIGZyZWUgd29ya2VyIHRocmVhZCB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0udHJhbnNmZXJEYXRhVG9HdWkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIGludGVybmFsIGFjdCBhc2tzIGZvciBlbmFibGUvZGlzYWJsZSBvZiBhbiBhY3QgbGlzdC5cclxuICAvLy8gICBjYWxsIGVuYWJsZUxpc3Qgd2l0aCBvbmx5SWZDaGFuZ2VkID0gdHJ1ZSB0byBtaW5pbWl6ZSBjYWxscyB0b3MgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUVuYWJsZUV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCwgZW5hYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBldnQuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChldnQuZ2V0QWN0RW5hYmxlTGlzdCgpLCBlbmFibGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgY29udHJvbCBQcmVmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybFByZWZpeChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDbGlja2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5SdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgaWYgKGZvcm0uaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUgfHwgY3RybC5pc1JhZGlvKCkpXHJcbiAgICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLy8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgIC8vIEZvciBGYXN0IE1vZGUsIENTIGlzIGV4ZWN1dGVkIGZyb20gaGVyZSwgd2hlcmVhcyBmb3Igc3RlcCBtb2RlIGl0IGlzIGRvbmVcclxuICAgIC8vIGluIG1vdmVJblJvdy4gc28sIGZvciBzdGVwIG1vZGUgZG91YmxlIGV4ZWN1dGlvbiBvZiBDUyBtdXN0IGJlIHN0b3BwZWQuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgJiYgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGlmICgoY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwgfHwgKGN0cmwuaXNSZXBlYXRhYmxlKCkgJiYgZGlzcGxheUxpbmUgIT09IGN0cmwuZ2V0RGlzcGxheUxpbmUodHJ1ZSkpKSAmJiAhbGFzdFBhcmtlZEN0cmwuaXNJbkNvbnRyb2xTdWZmaXgoKSlcclxuICAgICAgLy8gUUNSICM5NzA4MDZcclxuICAgICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFRPRE86IEZvY3VzICYgVGFiYmluZzogSGFuZGxlIFBhcmtpbmcgaW4gdGhpcyBjYXNlLiBTaG91bGQgbm90IHJldHVybiBmYWxzZSBpbiBzY3JlZW4gbW9kZVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suSW5DdHJsUHJlZml4KVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGFzay5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgbm90IGNvbWUgYWdhaW4gdGhyb3VnaCBtb3ZlaW5yb3cuXHJcbiAgICAvLyBlZzogaWYgY2xpY2tlZCBjdHJsIG9uIHN1YmZvcm0gaXMgbm9uIHBhcmthYmxlLCBmaXJzdCB0aW1lIGl0IGV4ZWN1dGVzIFJQIENWIGZvciBzdWJmb3JtcyBhbmQgdGhlblxyXG4gICAgLy8gZW50ZXJzIG1vdmVpbnJvdyBmb3IgcGFya2FibGUgY3RybC4gd2Ugc2hvdWxkbm90IGV4ZWN1dGUgdGhpcyBibG9jayB3aGVuIHdlIGNvbWUgZm9yIENQIG9mIHBhcmthYmxlIGN0cmwuXHJcbiAgICAvLyBGb3IgdGFiLCB3ZSBjb21lIGhlcmUgZGlyZWN0bHkgZm9yIHBhcmthYmxlIGN0cmwsIGFuZCB0aGlzIGJsb2NrIG11c3QgYWx3YXlzIGV4ZWN1dGUgaWYgb24gZGlmZiBmb3Jtcy5cclxuICAgIC8vIGlzU29ydCA6IGlmIGNsaWNrZWQgb24gdGFibGUgaGVhZGVyLCB3ZSBwYXJrIG9uIGNvbG9tbiBjdHJsIGFmdGVyIHNvcnQsIGFuZCB3ZSBtdXN0IGluY2x1ZGUgc3ViZm9ybXNcclxuICAgIC8vIGluIGV4ZWN1dGluZyBDVnNcclxuXHJcbiAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IENoZWNrIGdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24gaXMgcmVsZXZhbnQuIFdoaWxlIG1vdmluZyBiZXR3ZWVuIGNvbnRyb2xzIGJ5IFRhYiBjb2RlIGluIGlmIGJsb2NrIHdhcyBub3QgY2FsbGVkLlxyXG4gICAgLy8gQnV0IGl0IHdhcyBjYWxsZWQgb24gY2xpY2sgdG8gYW5vdGhlciBjb250cm9sLlxyXG4gICAgLy9pZiAodGFzay5nZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uKCkgPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9OT05FIHx8IHRoaXMuX2lzU29ydGluZykge1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGN0cmwgaXMgb24gYSBzdWJmb3JtLCB0aGVuIGV4ZWN1dGUgaW4gc2VxdWVuY2VcclxuICAgIC8vIDEuIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFpbmcgdGhlc2UgMiBzdWJmb3Jtcy4gd2UgbXVzdCBhbHNvIGV4ZWN1dGUgUlMgaWYgY2xpY2tlZFxyXG4gICAgLy8gICAgaW4gc3ViZm9ybSBhbmQgcGFya2VkIGJhY2sgb24gYSBjdHJsJ3MgdGFzay4gKCM3MjIxMTUtIGN1cnJDbGlja2VkQ3RybCBhbmQgY3RybCBzaG91bGQgbm90IGJlIG9uIGRpZmZlcmVudCB3aW5kb3cpXHJcbiAgICAvLyAyLiBDViBleGVjdXRpb24gb2YgTGFzdFBhcmtlZEN0cmwgdGlsbCBlbmRcclxuICAgIC8vIDMuIFJQLUNWcyBmb3IgYWxsIGludGVybWVkaWF0ZSBzdWJmb3Jtc1xyXG4gICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBsYXN0UGFya2VkQ3RybDtcclxuICAgIGlmIChjdXJyQ2xpY2tlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmN1cnJDbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpICYmIGN0cmwub25EaWZmRm9ybShjdXJyQ2xpY2tlZEN0cmwpKVxyXG4gICAgICBwcmV2Q3RybCA9IGN1cnJDbGlja2VkQ3RybDtcclxuXHJcbiAgICBpZiAocHJldkN0cmwgIT09IG51bGwgJiYgY3RybC5vbkRpZmZGb3JtKHByZXZDdHJsKSkge1xyXG4gICAgICAvLyBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhbmluZyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPnByZXZDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgIGF3YWl0IHByZXZUYXNrLmV4ZWNTdWJmb3JtUmVjU3VmZml4KDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdXRlIFJQIG9mIHRoZSBjdXJyZW50IHRhc2sgYmVmb3JlIGV4ZWN1dGluZyB0aGUgQ1ZzIGJlZm9yZSAnY3RybCdcclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90IG1vdmVkLCB3ZSBjb21lIHRvXHJcbiAgICAvLyBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICBpZiAoIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpICYmIGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgISBhd2FpdCBsYXN0UGFya2VkQ3RybC5pbnZva2UoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gRW50ZXJpbmcgY29udHJvbDogY29udHJvbCB7MX0sIHJvdyB7Mn1cIiwgIHRhc2suR2V0VGFza0RldGFpbHMoKSwgY3RybC5OYW1lLCBkaXNwbGF5TGluZSA8IDAgPyAwIDogZGlzcGxheUxpbmUpLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcCBleGVjdXRpb24gY3RybCwgd2UgbmVlZCB0byB1c2UgaXQgYXMgYSBzcmN0cmwsIG90aGVyd2lzZSB1c2VcclxuICAgIC8vIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGV4ZWN1dGVkIGxhc3QgQ1MuXHJcblxyXG5cclxuICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCk7XHJcbiAgICBjdHJsLktleVN0cm9rZU9uID0gZmFsc2U7XHJcbiAgICBjdHJsLk1vZGlmaWVkQnlVc2VyID0gZmFsc2U7XHJcblxyXG4gICAgdGFzay5zZXRDdXJyRmllbGQoY3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBTdWJmb3Jtc1xyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBjdHJsKSB7XHJcbiAgICAgIGlmICgobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgJiYgY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpIHx8IChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkgfHwgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSkpIHtcclxuICAgICAgICBsZXQgbGFzdFBhcmtlZFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGxhc3RQYXJrZWRUYXNrID0gPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRUYXNrICE9PSB0YXNrKSB7XHJcbiAgICAgICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBpc1NvblN1YmZvcm06IGJvb2xlYW47XHJcbiAgICAgICAgICBsZXQgcGFyZW50VGFzazogVGFzaztcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gbGFzdFBhcmtlZFRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gbGFzdFBhcmtlZFRhc2s7IHBhcmVudFRhc2sgIT09IG51bGwgJiYgaXNTb25TdWJmb3JtOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBwYXJlbnRUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgIGZvciAocGFyZW50VGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7IChwYXJlbnRUYXNrICE9PSBudWxsKSAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFdoZW5ldmVyIHdlIGFyZSBtb3ZpbmcgYmV0d2VlbiB0YXNrcywgcmUtZXZhbHVhdGUgQWxsb3dNb2Rlcy5cclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlbmFibGUgYWN0aW9ucyBhbmQgc3RhdGVzXHJcbiAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCB0cnVlKTtcclxuICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwgJiYgZmllbGQuTnVsbEFsbG93ZWQgJiYgY3RybC5pc01vZGlmaWFibGUoKSAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIHRydWUpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYW5kIHJldHVybiB0cnVlIHRvIHRlbGwgdGhlIGNhbGxlclxyXG4gIC8vLyAgIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQmVmb3JlKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZSA8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGV2dFNhdmU6IFJ1blRpbWVFdmVudCA9IGV2dDtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgcHJldlJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCB2YWw6IHN0cmluZztcclxuICAgIGxldCBvbGREaXNwbGF5TGluZTogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgbGV0IGFjdElkOiBudW1iZXIgPSB0aGlzLmdldE1hdGNoaW5nQWN0aW9uKCBldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICBpZiAoYWN0SWQgIT09IDAgJiYgZXZ0LkNvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIC8vICYmIGFjdElkICE9IE1HX0FDVF9TRUxFQ1QpXHJcbiAgICAgIHtcclxuICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgICAgZXZ0U2F2ZS5zZXRDdHJsKG1nQ29udHJvbCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCA9PT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTM5MjUzIC0gd2UgaGF2ZSB0byBwcm9jZXNzIGNvbW1vbkhhbmRsZXJCZWZvcmUgZXZlbiBmb3IgaW50ZXJuYWwgZXZlbnQgY29udmVydGVkXHJcbiAgICAvLyBmcm9tIHN5c3RlbSBFdmVudFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG4gICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NOlxyXG4gICAgICAgICAgIGxldCBib29sdmFsID0gYXdhaXQgdGhpcy5zZWxlY3RQcm9nKGN0cmwpO1xyXG4gICAgICAgICAgIGlmKGJvb2x2YWwpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVUzpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVU19PTl9OT05fTUFHSUNfQ09OVFJPTDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVLZXlEb3duKHRhc2ssIGN0cmwsIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9VU0VVUDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uQWN0U2VsZWN0aW9uKGN0cmwsIGZvcm0sIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUaW1lcihldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRVNJWkU6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVJlc2l6ZShjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPV19EQVRBX0NVUlJfUEFHRTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUm93RGF0YUN1clBhZ2UoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1NlbmRBbGwoKSwgZXZ0Lkxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcmFuc2ZlckRhdGFUb0d1aShjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKGN0cmwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIHRydWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgZmFsc2UpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1OTAzLiBEbyBub3QgZXhlY3V0ZSBSUCBpZiB0aGUgc3ViZm9ybSBwYXJlbnQgdGFzayBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgICAgICAgICAvLyBpdCdzIENvbW1vbkhhbmRsZXJCZWZvcmUgZm9yIFJQLlxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmICg8VGFzaz50YXNrLmdldFBhcmVudCgpKS5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIFJlY292ZXJ5IGZyb20gdHJhbnNhY3Rpb24gcmVzdGFydCB3YXMgY29tcGxldGVkLiBXZSBtYXkgbm93IGNsZWFyIHRoZSBmbGFnXHJcbiAgICAgICAgICB0YXNrLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcbiAgICAgICAgICB0YXNrLkRhdGFTeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNTdGFydGVkKCkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIGZvcm0gY29udGFpbnMgYSB0YWJsZSBhbmQgdGhlIGNvbnRyb2wgd2FzIGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV3IHJvd1xyXG4gICAgICAgICAgaWYgKGZvcm0uZ2V0Um93c0luUGFnZSgpID4gSW50MzIuTWluVmFsdWUgJiYgZGlzcGxheUxpbmUgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBlbnN1cmUgYSB2YWxpZCByb3dcclxuICAgICAgICAgICAgd2hpbGUgKCFkdi5yZWNFeGlzdHMoZGlzcGxheUxpbmUpICYmIGRpc3BsYXlMaW5lID4gMCkge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW5lLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRpc3BsYXlMaW5lID49IDApIHtcclxuICAgICAgICAgICAgICBwcmV2UmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSBwcmV2UmVjLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvbGREaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICAvLyBvbGREaXNwbGF5TGluZSA9IGZvcm0uZ2V0Q3VyclJvdygpXHJcbiAgICAgICAgICAgICAgICBmb3JtLlByZXZEaXNwbGF5TGluZSA9IG9sZERpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgcHJldmlvdXMgcmVjb3JkIHdhcyBkZWxldGVkIG9yIGNhbmNlbGVkXHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlYyAhPSBudWxsICYmICFkdi5yZWNFeGlzdHNCeUlkKHByZXZSZWMuZ2V0SWQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZWZyZXNoIGlzIGVzc2VudGlhbC4gSWYgaXQgZmFpbHMgYmVjYXVzZSBvZiBhblxyXG4gICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gdGhlbiB0aGUgb2xkIGN1cnIgcm93IGlzIHJlc3RvcmVkIChpbiB0aGUgY2F0Y2hcclxuICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50KS4gSXQgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmUgd2hpY2hcclxuICAgICAgICAgICAgICAgICAgLy8gYmVjb21lcyBibGFuayBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBvbGREaXNwbGF5TGluZSA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkdi5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZMaW5lOiBudW1iZXIgPSBmb3JtLmdldFByZXZMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKHByZXZMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RGb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGUuU3RhY2tUcmFjZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBpbnZhbGlkIGxpbmUgbnVtYmVyOiBcIiArXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBubyBjdXJyZW50IHJlY29yZCBhdmFpbGFibGUgIVwiKTtcclxuXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciBub24gaW50ZXJhY3RpdmUgdGFza3MuIEluY3JlYXNlIHRoZSB0YXNrJ3MgY291bnRlciBmb3IgZXZlcnkgcmVjb3JkIHdlIHBhc3MuXHJcbiAgICAgICAgICAvLyBkbyBpdCBiZWZvcmUgdGhlIGV2YWxFbmRDb25kIHNpbmNlIGl0IG1pZ2h0IGluY2x1ZGUgY291bnRlcigwKS5cclxuICAgICAgICAgIC8vIGluY3JlYXNlIG9ubHkgaWYgZ29pbmcgaW50byB0aGUgcmVjIHByZWZpeC5cclxuICAgICAgICAgIGlmICghdGFzay5Jc0ludGVyYWN0aXZlICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgdGFzay5pbmNyZWFzZUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgXCJ0YXNrIGVuZCBjb25kaXRpb25cIiBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlY29yZFxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9CRUZPUkUpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcblxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJSRUNPUkQgUFJFRklYOiBcIiArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLnNldEZvcmNlU2F2ZU9yZyhmYWxzZSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5TeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBSZWNvcmQgUHJlZml4IGZvciBhbGwgZmF0aGVycyB0aGF0IHRoZWlyIFJlY29yZCBQcmVmaXggaXMgbm90IGRvbmUgZWFybGllclxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHRhc2suUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCkge1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50VGFzayA9IHRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHBhcmVudFRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2sgPSBwYXJlbnRUYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGhhbmRsZSBzdWItZm9ybXNcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgYXdhaXQgZHYuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gZmFsc2U7XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEZvcmNlIHJlY29yZCBzdWZmaXg6XHJcbiAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIGxldCBpc1NlbGVjdGlvblRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgICAgICAgIHRhc2suQ29uZmlybVVwZGF0ZU5vID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gTm8gcmVjb3JkIC0+IG5vIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJlYyA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBub3QgZXhlY3V0ZSB0aGUgXCJiZWZvcmUgcmVjb3JkIHN1ZmZpeFwiIHdoZW4gZGVsZXRpbmcgdGhlIHJlY29yZCBhbmRcclxuICAgICAgICAgIC8vIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlICh0aGUgc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgaWYgKChyZWMuTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpICYmIHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiZcclxuICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJSRUNPUkQgU1VGRklYOiBcIiArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaW5kaWNhdGUgbmV4dCB2ZXJpZnlDdHJsIGlzIHRoZSBmaXJzdCBjdHJsIGluIHRoZSByZWNvcmRcclxuXHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIGlzU2VsZWN0aW9uVGFibGUgPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBRdWVyeSBtb2RlIC0+IGRvIHN1ZmZpeCBvbmx5IGlmIHdlIGZvcmNlIGl0IG9yIHNvbWVob3cgdGhlIHJlY29yZCB3YXMgdXBkYXRlZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICFmb3JjZVN1ZmZpeCAmJiAhcmVjLk1vZGlmaWVkICYmXHJcbiAgICAgICAgICAgICFpc1NlbGVjdGlvblRhYmxlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCFyZWMuTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpe1xyXG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFICYmIHJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICBpZiAoISBhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpcm1lZCh0YXNrKSlcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHN0b3BFeGVjdXRpb246IGJvb2xlYW4gPSAhYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgIC8vIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nIFJTIGlmIENWIHJldHVybnMgZXJyb3JcclxuICAgICAgICAgIGlmIChzdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDdHJsUHJlZml4KGV2dCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRpZCBub3Qgc3VjY2VlZCBpbiBlbnRlcmluZyB0aGUgY3RybFxyXG4gICAgICAgICAgICBldnQuQ29udHJvbC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7IC8vIFFDUiAjMzcxMzIxXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcblxyXG4gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0b3BleGVjdXRpb24gY3RybCB3ZSBzaG91bGQgbm90IGV4ZWN1dGUgQ1MuXHJcbiAgICAgICAgICBpZiAoY3RybCA9PSBudWxsIHx8IHRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKSAhPSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWN0cmwuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgICAgdmFsID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgLy8gV2UgYXJlIHJlc2V0dGluZyB0aGUgZmxhZyBhcyB3ZSBhcmUgbW92aW5nIGZyb20gb25lIGNvbnRyb2wgdG8gb3RoZXIgY29udHJvbC5cclxuICAgICAgICAgICAgdGFzay5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRyb2xzIHZhbHVlXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjc1ODc4OCwgdGhlIGJyb3dzZXIgY29udHJvbCB3aWxsIG5vdCBiZSB1cGRhdGUgZnJvbSB0aGUgZmlsZWQuXHJcbiAgICAgICAgICAgIC8vIFBhdGNoIGZvciBRQ1IgIzcyOTcwNjpcclxuICAgICAgICAgICAgLy8gTWFnaWMgdGhyZWFkIHB1dHMgdGhlIGZvbGxvd2luZyBHVUkgY29tbWFuZHM6XHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX0lNQUdFX0ZJTEVfTkFNRSB0byBzZXQgdGhlIGltYWdlIG9uIHRoZSBJbWFnZSBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBQUk9QX1NFVF9URVhUIHRvIHNldCB0aGUgdGV4dCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBTRVRfRk9DVVMgdG8gZm9jdXMgb24gdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gTm93LCB3aGVuIHRoZSBleGVjdXRpb24gaXMgYnkgRjcsIGlmIHRoZSBmaWxlIGlzIG5vdCByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIChpLmUuIGlmIHRoZXJlIGlzIDQwNCBlcnJvciksIEh0dHBDbGllbnQgcmUtdHJpZXMgdG8gZ2V0IHRoZSBmaWxlIGZvciBIVFRQdGltZW91dC5cclxuICAgICAgICAgICAgLy8gRHVyaW5nIHRoaXMgdGltZSBhbGwgdGhlIEdVSSBldmVudHMgaW4gR3VpQ29tbWFuZHNRdWV1ZSByZW1haW5zIHBlbmRpbmcgdW5oYW5kbGVkLlxyXG4gICAgICAgICAgICAvLyBJbiB0aGUgbWVhbiB0aW1lLCBNYWdpYyB0aHJlYWQgZXhlY3V0ZXMgdGhlIEV4aXQgZXZlbnQgYW5kIGR1cmluZyB0aGlzLCBpdCB0cmllc1xyXG4gICAgICAgICAgICAvLyB0byBleGVjdXRlIHRoZSBDdHJsIFN1ZmZpeCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBTaW5jZSBTRVRfRk9DVVMgaXMgc3RpbGwgcGVuZGluZyBpbiB0aGUgcXVldWUsIHRoZSBsb2dpY2FsIGNvbnRyb2wgKGlmIGFsbG93VGVzdGluZz1ObylcclxuICAgICAgICAgICAgLy8gaXMgbm90IG1hcHBlZCB3aXRoIGFueSBhY3R1YWwgd2luZG93cyBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3cgd2hlbiB3ZSB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGxvZ2ljYWwgY29udHJvbCwgTG9naWNhbENvbnRyb2wuZ2V0RWRpdG9yQ29udHJvbCgpXHJcbiAgICAgICAgICAgIC8vIHJldHVybnMgbnVsbCBhbmQgc28sIFN0YXRpY1RleHQuZ2V0VmFsdWUoKSByZXR1cm5zIExvZ2ljYWxDb250cm9sLlRleHQgaW5zdGVhZCBvZiBDb250cm9sLlRleHRcclxuICAgICAgICAgICAgLy8gQmVjYXVzZSBQUk9QX1NFVF9URVhUIGlzIGFsc28gcGVuZGluZywgTG9naWNhbENvbnRyb2wuVGV4dCBpcyBudWxsLlxyXG4gICAgICAgICAgICAvLyBBbmQgc28gdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdoZW4gdXNpbmcgaXQuXHJcbiAgICAgICAgICAgIC8vIElmIEFsbG93VGVzdGluZz1ZZXMsIHRoZSB2YWwgd2lsbCBiZSBhIGJsYW5rIHN0cmluZy4gU28sIHRoZXJlIGlzIG5vIGNyYXNoLlxyXG4gICAgICAgICAgICAvLyBCdXQgaGVyZSB3ZSBoYXZlIGFub3RoZXIgcHJvYmxlbS4gU3VwcG9zZSwgdGhlIGZpZWxkIGhhZCBhbiBJbml0IGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAgIC8vIE5vdywgTWdDb250cm9sJ3MgdmFsdWUgd291bGQgYmUgdGhlIGluaXRlZCB2YWx1ZSBhbmQgdGhlIHZhbCBpcyBhIGJsYW5rIHN0cmluZy5cclxuICAgICAgICAgICAgLy8gU28sIHdlIHdpbGwgaGF2ZSB2YXJpYWJsZSBjaGFuZ2UuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcm9ibGVtIGlzIHJlbGF0ZWQgdG8gYSB2ZXJ5IHNwZWNpZmljIHNjZW5hcmlvIC0tIHdoZW4gdGhlIGltYWdlIGNvbnRyb2wgd2FzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBkcm9wcGVkIGNvbnRyb2wgb24gdGhlIGZvcm0sIGltYWdlIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCB0aGUgdGltZSBvZiB0YXNrXHJcbiAgICAgICAgICAgIC8vIGxvYWRpbmcgYW5kIHRhc2sgbmVlZHMgdG8gYmUgY2xvc2VkLCB3ZSBhcmUgcHV0dGluZyBhIHBhdGNoIGhlcmUgYnkgY2hlY2tpbmcgdmFsIGZvciBOVUxMLlxyXG4gICAgICAgICAgICAvLyBUaGUgaWRlYWwgc29sdXRpb24gd291bGQgYmUgLS0tIGluc3RlYWQgb2Ygc2VuZGluZyB0aGUgaW1hZ2UgZmlsZSBuYW1lIGZyb20gTWFnaWMgdGhyZWFkXHJcbiAgICAgICAgICAgIC8vIHRvIEd1aSB0aHJlYWQgYW5kIGxvYWRpbmcgdGhlIGltYWdlIGZyb20gdGhlIEd1aSB0aHJlYWQsIHdlIGNhbiBsb2FkIHRoZSBpbWFnZSBmcm9tIHRoZVxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgKHVzaW5nIHN5bmMgZXhlY3V0aW9uIGkuZS4gdmlhIEd1aUludGVyYWN0aXZlKSBhbmQgc2VuZCBpdCB0byB0aGUgR3VpIHRocmVhZC5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbFdhc1JhaXNlZCgpICYmXHJcbiAgICAgICAgICAgICAgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUiAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKGN0cmwuX2ZpZWxkKSAmJiBjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB2YWwgIT09IG51bGwpICYmIHR5cGVvZiB2YWwgIT0gXCJ1bmRlZmluZWRcIiAmJlxyXG4gICAgICAgICAgICAgICAgIWF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyB3aGVuIHN0b3AgZXhlY3V0aW9uIGluIG9uLCBkb24ndCBjbGVhciB0aGUgbXNnIGZyb20gc3RhdHVzLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7XHJcblxyXG4gICAgICAgICAgLy8gcmVzZXQgSW5Db250cm9sIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCB2ZXJpZmljYXRpb25cclxuICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLkNsaXBCb2FyZERhdGFFeGlzdHMgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgIGN0cmwuc2V0SW5Db250cm9sU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBhIHNlbGVjdCBwcm9ncmFtIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2dyYW0gd2FzIGV4ZWN1dGVkICA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPnRoZSBzb3VyY2UgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvbXB0XCI+aWYgdHJ1ZSB0aGVuIHRoZSBjYWxsZXIgaXMgZXhlY3V0aW5nIHRoZSBjYWxsZWQgcHJvZ3JhbSBhdCB0aGUgZW5kIG9mIGNvbnRyb2wgcHJlZml4PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RQcm9nKCBjdHJsOk1nQ29udHJvbCk6IFByb21pc2U8Ym9vbGVhbj5cclxuICB7XHJcbiAgICBsZXQgY21kIDogSUNsaWVudENvbW1hbmQgO1xyXG4gICAgbGV0IHZhbHVlOiBTdHJpbmc7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIGxldCBwcm9nRXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNlbGVjdCBwcm9ncmFtIHRvIHRoZSBjb250cm9sXHJcbiAgICBpZiAoY3RybC5IYXNTZWxlY3RQcm9ncmFtKCkpXHJcbiAgICB7XHJcbiAgICAgIC8vY2hlY2sgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAgICAgaWYgKGN0cmwuSXNQYXJrYWJsZSgpKVxyXG4gICAgICB7XHJcblxyXG4gICAgICAgIHZhbHVlID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICBpZiAoIWN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UpKVxyXG4gICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0ICBlbmNvZGVkVmFsOnN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBtZ1ZhbCA9ICBhd2FpdCBjdHJsLmdldE1nVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgdmFyIHJlYyA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgZW5jb2RlZFZhbCA9IHJlYy5nZXRYTUxGb3JWYWx1ZShjdHJsLmdldEZpZWxkKCkuZ2V0SWQoKSwgbWdWYWwpO1xyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2VsZWN0UHJvZ3JhbUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIG51bGwsIEludDMyLk1pblZhbHVlLCBjdHJsLmdldERpdElkeCgpLCBlbmNvZGVkVmFsKTtcclxuICAgICAgICAgIHRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb21tYW5kc1Byb2Nlc3NvclNlcnZlcjpDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICAgICAgICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgIHByb2dFeGVjdXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgcmV0dXJuIHByb2dFeGVjdXRlZDtcclxufVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2s6VGFzayk6UHJvbWlzZSA8Ym9vbGVhbj4ge1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBoYW5kbGVycyBpZiBpdCBpcyBjb250cm9sIHZlcmlmaWNhdGlvbi4gRXhlY3V0ZSBhbGwgU1YgaGFuZGxlcnNcclxuICAgIGxldCB0YWJsZTpIYW5kbGVyc1RhYmxlICA9IHRhc2suZ2V0SGFuZGxlcnNUYWIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0YWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGFibGUuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTikge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSA/ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5nZXRDdHJsQnlDdHJsTmFtZShoYW5kbGVyLmdldEN0cmxOYW1lKCkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChjb250cm9sKSkge1xyXG4gICAgICAgICAgbGV0IHJ1blRpbWVFdmVudDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjb250cm9sKTtcclxuICAgICAgICAgIHJ1blRpbWVFdmVudC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydW5UaW1lRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgIGlmKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZXJyb3IsIHBhcmsvZm9jdXMgb24gdGhpcyBjb250cm9sIHdoZXJlIGVycm9yIG9jY3VycyBpbiBDViBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY29udHJvbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25BY3RTZWxlY3Rpb24oY3RybDogTWdDb250cm9sLCBmb3JtOiBNZ0Zvcm0sIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIGxldCBzaW11bGF0ZTogYm9vbGVhbiA9IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCICYmICFldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBpZiAoc2ltdWxhdGUpXHJcbiAgICAgIGF3YWl0IHRoaXMuc2ltdWxhdGVTZWxlY3Rpb24oY3RybCwgZXZ0LmdldFZhbHVlKCksIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgdGhlIE1HX0FDVF9TVUJGT1JNX0NMT1NFXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1cIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgb25TdWJmb3JtQ2xvc2UodGFzazogVGFzaywgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgIGxldCBjbG9zaW5nU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzI4MzExNC4gQXJndW1lbnQgb2YgJ1N1YmZvcm0gcmVmcmVzaCBldmVudCcgY2FuIGJlIHNraXBwZWQgb3Igbm90IGV4aXN0LlxyXG4gICAgICBpZiAoY2xvc2luZ1N1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAvLyBJZiBpdHMgYnJvdGhlciBpcyByZWZyZXNoZWQgd2UgZG8gbm90IG5lZWQgdG8gZXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCB0YXNrLlxyXG4gICAgICAgIGZvciAobGV0IHBhcmVudFRhc2s6IFRhc2sgPSB0YXNrOyBwYXJlbnRUYXNrLmdldEZvcm0oKSAhPSBudWxsICYmIHBhcmVudFRhc2suZ2V0TWdkSUQoKSA9PT0gdGFzay5nZXRNZ2RJRCgpOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY2xvc2luZ1N1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9IG51bGwgJiYgIXN1YmZvcm1UYXNrLklzUm91dGUoKSkge1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1YmZvcm1DbG9zZShzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm1TdWJmb3JtQ2xvc2UoKSAgIDogQ2xvc2VzIHRoZSBzdWJmb3JtIHRhc2sgb3BlbmVkIGluIHRoZSBzdWJmb3JtQ3RybFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtQ3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtU3ViZm9ybUNsb3NlIChzdWJmb3JtQ3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHN1YmZvcm1UYXNrLmdldE1HRGF0YSgpO1xyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICB7XHJcbiAgICAgIHBhcmVudFRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyhwYXJlbnRUYXNrKTtcclxuICAgICAgYXdhaXQgc3ViZm9ybVRhc2suc3RvcCgpO1xyXG5cclxuICAgICAgc3ViZm9ybUN0cmwucmVzZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgQ29tbWFuZHMuYWRkQ2xvc2VzdWJmb3JtKENvbW1hbmRUeXBlLkNMT1NFX1NVQl9GT1JNLCBzdWJmb3JtQ3RybCwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCAoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLmdldE5hbWUoKSwgc3ViZm9ybVRhc2suZ2V0Rm9ybSgpLmJ1aWxkRm9ybU5hbWUoKSk7XHJcblxyXG4gICAgICAvLyBTZXQgbWdkLmFib3J0KCksIGluIG9yZGVyIHRvIGNsb3NlIGN1cnJlbnQgZXZlbnQgbG9vcCBvZiBNb2RhbCBzdWJmb3JtLlxyXG4gICAgICAvLyBhbmQgcmVzZXQgaXQgYmFjayB0byBmYWxzZSBvbmNlIGl0IGNvbWVzIG91dCBvZiBjdXJyZW50IGV2ZW50c2xvb3AoKS5cclxuICAgICAgaWYgKCg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuSXNNb2RhbCgpKVxyXG4gICAgICAgIG1nZC5hYm9ydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92ZSB0byBhbiBvdGhlciBsaW5lIGFuZCBmb2N1cyBvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1cIj4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+bGluZSB0byBtb3ZlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCB0byBmb2N1cyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgbW92ZVRvTGluZShmb3JtOiBNZ0Zvcm0sIGRpc3BsYXlMaW5lOiBudW1iZXIsIGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ1blRpbWVFdmVudDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICBydW5UaW1lRXZlbnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ1blRpbWVFdmVudCwgZmFsc2UpO1xyXG4gICAgaWYgKGN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuXHJcbiAgICBmb3JtLlNlbGVjdFJvdyh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYXJndW1lbnRzIGZvciBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjcmVhdGVFdmVudEFyZ3VtZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dC5nZXRBcmdMaXN0KCkgPT09IG51bGwpIHtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBEb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrOiBUYXNrQmFzZSwgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc2hvdWxkUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgcmVmRG9TdWZmaXgudmFsdWUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHNob3VsZFJldHVybiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3VsZFJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2s6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gdGhlIG1hZ2ljIGRlZmF1bHQgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIGV2ZW50IGNvZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudCA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgbWdEYXRhOiBNR0RhdGEgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IGRvU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhIHVzZXIgZXZlbnQgdGhhdCBjb252ZXJ0cyB0byBhIHN5c3RlbSBvciBpbnRlcm5hbCBldmVuLCBjb252ZXJ0IGl0XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSKVxyXG4gICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dC5nZXRVc2VyRXZlbnQoKSwgZXZ0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KGV2dCk7XHJcblxyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oICBldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICAgIGlmIChhY3RJZCAhPT0gMClcclxuICAgICAgICAvLyBoYW5kbGVkIGludGVybmFsbHlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0vLyBlbmQgb2Ygc3lzdGVtIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tb24gaGFuZGxpbmcgb2YgaW50ZXJuYWwgZXZlbnRzIG9ubHkgaWYgdGhleSBhcmUgbm90IGltbWVkaWF0ZS5cclxuICAgICAgLy8gYW4gZXZlbnQgaXMgaW1tZWRpYXRlIHdoZW4gaXQgd2FzIHJhaXNlZCBieSBhIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiB0aGF0IGl0c1xyXG4gICAgICAvLyB3YWl0IGNvbmRpdGlvbiBpcyB5ZXMgb3IgZXZhbHVhdGVzIHRvIHRydWUuXHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAhZXZ0LmlzSW1tZWRpYXRlKCkgJiYgdGhpcy5BY3RBbGxvd2VkKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkgJiYgIXRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaykge1xyXG4gICAgICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5tZ0RhdGEuQ21kc1RvU2VydmVyO1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uU3ViZm9ybUNsb3NlKHRhc2ssIGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVDpcclxuICAgICAgICAgICAgLy8gaWYgYnV0dG9uIGlzIG5vdCBwYXJrYWJsZSwgcmFpc2UgaXRzIGV2ZW50IG9ubHkgaWYgdGhlIGFjdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBieSBndWkuXHJcbiAgICAgICAgICAgIC8vIGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uIHdpbGwgZ2V0IGhlcmUgYXMgY3RybCBoaXQgLCBidXQgaXMgbm90IHRyaWdnZXJlZCBieSBndWkgKGdvZXMgdmlhIHNlbGVjdGlvbiBldmVudCAxc3QpXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGN0cmxfaGl0IGFjdGlvbnMgc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJrYWJpbGl0eVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiZcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiB8fCAhZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSB8fCBjdHJsLmlzUGFya2FibGUodHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0UnRFdnRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRUYXNrKGN0cmwuZ2V0UnRFdnRUYXNrKCkpO1xyXG4gICAgICAgICAgICAgIGlmIChDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PTkUgIT09IGFSdEV2dC5nZXRUeXBlKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnVzZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tUb0VuYWJsZTogVGFzayA9IDxUYXNrPmFSdEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrVG9FbmFibGUgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0YXNrVG9FbmFibGUuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoY3RybC5BcmdMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIgKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM3MjQxNTA6IGFzIHdlIGRvaW5nIGZvciBvbmxpbmUgZm9yIHRhYiBjb250cm9sIHdlIHNlbmQgQUNUX1pPT00gKENob2ljZWlucC5jcHAgOjpEaXRHZXQoKSlcclxuICAgICAgICAgICAgICB0aGlzLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pIHtcclxuICAgICAgICAgICAgICBjdHJsLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ6XHJcbiAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Ub2dnbGVJbnNlcnRNb2RlKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICAgIC8vIGlmICdleGl0JyBhY2NlcHRlZCBvbiBNREksIGV4aXQgdGhlIHRvcCBtb3N0IHRhc2suIHNhbWUgYXMgd2hlbiBleGl0aW5nIHRoZSBzeXN0ZW0uXHJcbiAgICAgICAgICAgIGxldCB0YXNrVG9FbmQ6IFRhc2sgPSAodGFzay5pc01haW5Qcm9nKCkgPyBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkgOiB0YXNrKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFza1RvRW5kLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBldnQuRXhpdER1ZVRvRXJyb3IoKSk7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgICAgLy8gZW5kIHRoZSB0b3AgbW9zdCB0YXNrIHdpdGggZm9ybS5cclxuICAgICAgICAgICAgYXdhaXQgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gR2V0VG9wTW9zdFRhc2tXaXRoRm9ybSh0YXNrKS5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkU6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09IG51bGwgfHwgIWxhc3RQYXJrZWRDdHJsLmlzTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkw6XHJcbiAgICAgICAgICAgIC8vICM5MTg1ODg6IElmIGN0cmwraG9tZS9jdHJsK2VuZCBwcmVzc2VkIHdoZW4gcGFya2VkIG9uIGxpc3Rib3hcclxuICAgICAgICAgICAgLy8gdGhlbiBCZWdpbiB0YWJsZSBldmVudCBzaG91bGQgbm90IGJlIGhhbmRsZWQuXHJcbiAgICAgICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6IHtcclxuICAgICAgICAgICAgLy8gVW5saWtlIE9ubGluZSwgaGVyZSBTRUxFQ1Qgb3IgWk9PTSBjb21lcyBhZnRlciB0aGUgREJDTElDSy5cclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBEQkNMSUNLIGhhbmRsZXIgd2l0aCBwcm9wb2dhdGUgPSAnTk8nICwgdGhlc2UgYWN0aW9ucyB3aWxsIG5vdCBiZSByYWlzZWQuXHJcbiAgICAgICAgICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSA9IGN0cmwuVHlwZTtcclxuICAgICAgICAgICAgbGV0IHB1dEFjdGlvbjogbnVtYmVyID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkU7XHJcbiAgICAgICAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMICYmXHJcbiAgICAgICAgICAgICAgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUKSlcclxuICAgICAgICAgICAgICAgIHB1dEFjdGlvbiA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q7XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSlcclxuICAgICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT007XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAocHV0QWN0aW9uICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORSlcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBwdXRBY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkU6XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2ssIGR2LCByZWMsIGZhbHNlKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEluQ3JlYXRlTGluZSgpKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRJbkNyZWF0ZUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHJlY29yZCBpcyBub3QgYWxyZWFkeSBhIG5ldyBvbmVcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIHJlYyAhPSBudWxsICYmICFyZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgICBkb1N1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZWN0IDE1MjM1NTogUGFyayBvbiBsYXN0UGFya2VkQ29udHJvbCBpZiBuZXh0U2NyZWVuIGV2ZW50IG9jY3VycyBpZiBhbHJlYWR5IGluIGNyZWF0ZSBtb2RlIGFuZCByZWNvcmQgbm90IG1vZGlmaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJrZWRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0UGFya2VkQ29udHJvbC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9TdWZmaXgpO1xyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2ssIHJlZkRvU3VmZml4KSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICBkb1N1ZmZpeCA9IHJlZkRvU3VmZml4LnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldkxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHx8ICF0YXNrLkNvbmZpcm1VcGRhdGVObylcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5hZGRSZWMoZG9TdWZmaXgsaW50RXZ0Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRT8gdHJ1ZSA6IGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2spO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdENhbmNlbChldnQsIHRhc2ssIGZvcm0sIGN0cmwsIHJlYywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIHx8XHJcbiAgICAgICAgICAgICAgYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmXHJcbiAgICAgICAgICAgICAgKGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgICBvbGRNb2RlID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19NT0RJRlk6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUOlxyXG4gICAgICAgICAgICAvKiBwcmVmb3JtIHJlYyBzdWZmaXggKi9cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JblNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBzZWxlY3Rpb24gcHJvZ3JhbSAqL1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9SRUZSRVNIOlxyXG4gICAgICAgICAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgUmVmcmVzaGVkU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgICAgICAgICAgaWYgKFJlZnJlc2hlZFN1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAgICAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShSZWZyZXNoZWRTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyODc1NjIuIE9wZW4gdGhlIHN1YmZvcm0gdGFzayBvbmx5IGlmIHRoZSBzdWJmb3JtIGNvbnRyb2wgaXMgY29ubmVjdGVkIHRvIHRoZSB0YXNrLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCAoc3ViZm9ybUN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEUpKS5nZXRWYWx1ZUludCgpICE9PSBTdWJmb3JtVHlwZS5Ob25lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybShwYXJlbnRUYXNrLCBzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgaXQgaXMgU3ViZm9ybVJlZnJlc2ggdGhhdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHNlYXJjaCB0aGUgdGFzayBhY2NvcmRpbmcgdG8gaXRzIHRhc2sgaWQgKHRhZylcclxuICAgICAgICAgICAgZWxzZSBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAyKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IHRhc2ssIHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgbGV0IHRhc2tUYWc6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgd2hpbGUgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHN1YmZvcm1UYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSA9PT0gdGFza1RhZykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtVGFzayA9IHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fT1BFTjpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybSh0YXNrLCA8TWdDb250cm9sPmV2dC5Db250cm9sKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgICAgIGlmICghZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUNUX0NMT1NFX0FQUEw6XHJcbiAgICAgICAgICAgIGNtZCA9XHJcbiAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKFxyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CUk9XU0VSX0VTQyk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgc2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT05URVhUX1JFTU9WRTpcclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlzIHBlbmRpbmdcclxuICAgICAgICAgICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkuRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgaWYgKENsaWVudE1hbmFnZXIuVHJhbnNDYWNoZUV4aXN0cygpIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nICgnUGVuZGluZyB0cmFuc2FjdGlvbi9yZWNvcmQgaXMgbW9kaWZpZWQsIGRpc2NhcmRlZCBcXCdDb250ZXh0IFJlbW92ZVxcJyBldmVudC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBJcyB0aGVyZSBjbGllbnQgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQ/XHJcbiAgICAgICAgICAgICAgaWYgKEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpPjApIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTtcclxuICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgY29tbWFuZCB0byB0ZXJtaW5hdGUgY29udGV4dCBhdCBzZXJ2ZXIgc2lkZVxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZDogQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kXHJcbiAgICAgICAgICAgICAgICAgID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkpO1xyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZCg8SUNsaWVudENvbW1hbmQ+Y29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBuZWVkIG5vdCB0byBiZSBoYW5kbGVkIGFzIHRoZSB3ZSBhcmUgdGVybWluYXRpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nICgnUmVtb3ZlZCBjb250ZXh0IGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZmxhZyB0byB0aGF0IGNvbnRleHQgaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciBieSAnQ29udGV4dCBSZW1vdmUnIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50IGFzIHVzZXIgZXZlbnQgb2NjdXJyZWQuJyk7XHJcbiAgICAgICAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VSVkVSX1RFUk1JTkFUSU9OOlxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUpO1xyXG4gICAgICAgICAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJGaWVsZCAhPSBudWxsICYmIHRoaXMuX2N1cnJGaWVsZC5OdWxsQWxsb3dlZCkge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxpbmVzIGlzIGFuIGltbWl0YXRpb24gb2YgdGhlIGJlaGF2aW91ciBvZiBhbiBvbmxpbmUgcHJvZ3JhbTpcclxuICAgICAgICAgICAgICAvLyAxKSB0aGUgcmVjb3JkIG11c3QgYmUgdXBkYXRlZCBpbiB0aGlzIGV2ZW50XHJcbiAgICAgICAgICAgICAgLy8gMikgYSBcIm5leHQgZmllbGRcIiBldmVudCBpcyByYWlzZWRcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jdXJyRmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl9jdXJyRmllbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSBuZWVkIHRvIGNhbmNlbCB0aGUgZWRpdCBhbmQgdGhlbiBnbyByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24sIHRoZSBzYW1lIHdlIGRvaW5nIGZvciByZW1vdmUgd2hpbGUgcmV0dXJuIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgICAvLyBzZWUgZGF0YXZpZXcuY3MgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSzpcclxuICAgICAgICAgICAgLy8gZm9yIG9mZmxpbmUgd2Ugd2lsbCBub3QgZ2V0IHRvIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLXHJcbiAgICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzaywgY21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuUk9MTEJBQ0spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfT0s6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVDpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb25seSBvbiBjb2x1bW4gd2l0aCBhbiBhdHRhY2hlZCBmaWVsZC5cclxuICAgICAgICAgICAgLy8gY2FuIGNoYW5nZSBpbmRleCBvbmx5IGlmIHRoZSBkYXRhdmlldyBpcyByZW1vdGUuXHJcbiAgICAgICAgICAgIGlmICgoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRSAmJiB0YXNrLkRhdGF2aWV3TWFuYWdlci5IYXNSZW1vdGVEYXRhKSB8fFxyXG4gICAgICAgICAgICAgIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQgJiYgY3RybC5nZXRGaWVsZCgpICE9IG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyOTYzMjUgJiBRQ1IgIzQzMDI4OC5cclxuICAgICAgICAgICAgICAvLyBFeGVjdXRlIENTIG9mIHRoZSBjdXJyZW50IGNvbnRyb2wsIGJlY2F1c2UgaXQgY2FuIGJlIGEgcGFyYW1ldGVyIGZvciBhIHN1YmZvcm0uXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZCwgQ1Mgd2lsbCByZWZyZXNoIHRoZSBzdWJmb3JtIGJlZm9yZSB0aGUgc29ydC5cclxuICAgICAgICAgICAgICBsZXQgbGFzdEZvY3VzZWRUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgICAgIGxldCBmb2N1c2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbChMYXN0Rm9jdXNlZE1hbmFnZXIuTGFzdEZvY3VzTWdkSUQpO1xyXG4gICAgICAgICAgICAgIGlmIChmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoZm9jdXNlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMobGFzdEZvY3VzZWRUYXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICM0Mzg3NTMuIEV4ZWN1dGUgUlMgb2YgdGhlIHNvcnRlZCB0YXNrLlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIHRhc2suZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0YXNrRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRhc2tGb3JtLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbmRleENoYW5nZUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCksIGV2dC5nZXRBcmdMaXN0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29sdW1uU29ydENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGV2dC5EaXJlY3Rpb24sIGN0cmwuZ2V0RGl0SWR4KCksIGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLkdldEN1cnJlbnRSZWNJZCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZSgwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU29ydGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IncyAjMTY1ODE1ICYgIzI5MTk3NC4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHNvcnRlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgc29ydGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNDI4Njk3LiBFeGVjdXRlIFJTIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRUYXNrLkV4ZWN1dGVOZXN0ZWRSUyh0YXNrKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSzpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb24gY29sdW1uIG9ubHkgaWYgZXZlbnQgaXMgcmFpc2VkIGR1ZSB0byBjbGljayBhY3Rpb25cclxuICAgICAgICAgICAgLy8gYW5kIGEgZmllbGQgaXMgYXR0YWNoZWQgdG8gY29sdW1uLlxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSAmJiBjdHJsLmlzQ29sdW1uU29ydGFibGUoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjb2x1bW5DaGlsZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybC5nZXRDb2x1bW5DaGlsZENvbnRyb2woKTtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uQ2hpbGRDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBTb3J0IG9uIENvbHVtblxyXG4gICAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY29sdW1uQ2hpbGRDb250cm9sLCBldnQuRGlyZWN0aW9uLCAwKTtcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgb2YgaW50ZXJuYWwgZXZlbnRzIHByb2Nlc3NpbmdcclxuXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiogSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nXHJcbiogc3RhcnQgdGhlIGVkaXRpbmcgb24gcm93XHJcbiogKi9cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrOiBUYXNrKSB7XHJcbiAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpXHJcbiAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lKGBDYW5ub3QgZW50ZXIgUm93IEVkaXRpbmcgd2hlbiBpbiBRdWVyeSBNb2RlLmApO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IG15Zm9ybS5zdG9wUm93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGFuZCBleGVjdXRlcyBzdWJmb3JtIG9wZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1Db250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIE9wZW5TdWJmb3JtKHRhc2s6IFRhc2ssIHN1YmZvcm1Db250cm9sOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyh0YXNrKTtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybU9wZW5Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBzdWJmb3JtQ29udHJvbC5nZXREaXRJZHgoKSk7XHJcbiAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbWRzVG9TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvbGxiYWNrVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrOiBUYXNrLCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUsIHJvbGxiYWNrVHlwZTogUm9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3I6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcbiAgICBDbGllbnRSZWZyZXNoQ29tbWFuZC5DbGllbnRJc0luUm9sbGJhY2tDb21tYW5kID0gdHJ1ZTtcclxuICAgIC8vIGZvciByZW1vdGUgcHJvZ3JhbSA6ICh3aXRoXFx3aXRob3V0IGxvY2FsIGRhdGEpIHRoZSByb2xsYmFjayBldmVudCBpbiB0aGUgc2VydmVyIE1VU1RcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBiZSBleGVjdXRlIG9uIHRoZSB0YXNrIHRoYXQgb3BlbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBvZmZsaW5lIHByb2dyYW0gdGhlIHJvbGxiYWNrIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICB0YXNrID0gdGFzay5UYXNrU2VydmljZS5HZXRPd25lclRyYW5zYWN0aW9uVGFzayh0YXNrKTtcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJvbGxiYWNrRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCByb2xsYmFja1R5cGUpO1xyXG4gICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RQYXJrZWRDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0Q2FuY2VsKGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIGN0cmw6IE1nQ29udHJvbCwgcmVjOiBSZWNvcmQsIGlzTUdfQUNUX0NBTkNFTDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUHJldmVudCByZWN1cnNpdmUgbW9kZVxyXG4gICAgLy8gZml4ZWQgYnVncyAjOjI4NTQ5OCwgMjk3NDU1XFw0Mjc3MDNcXFxyXG4gICAgaWYgKHRhc2suSW5IYW5kbGVBY3RDYW5jZWwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICBsZXQgc2F2ZURpc3BsYXlMaW5lPSB0YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZTtcclxuXHJcbiAgICAvLyBXaGVuIGRvIHdlIHNob3cgdGhlICdDb25maXJtIENhbmNlbCB3aW5kb3cnID8gd2hlbiBhbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5OlxyXG4gICAgLy8gMS4gVGFzayBtb2RlIGlzIG5vdCBxdWVyeVxyXG4gICAgLy8gMi4gcmVjIGlzIG5vdCBVcGRhdGVkLiBVcGRhdGVkIGlzIHRydWUgd2hlbiB0aGVyZSB3YXMgYW4gVXBkYXRlIG9wZXJhdGlvbiB3aXRoICdmb3JjZSB1cGRhdGUnLiBJZiBpdCBpcyB0cnVlLCB0aGVuIHRoZXJlIGlzIG5vIG1lYW5pbmcgdG8gc2hvdyB0aGVcclxuICAgIC8vICAgIHdpbmRvdyBzaW5jZSB0aGUgdXBkYXRlIHN0YXlzIGFueXdheSAobGlrZSBpbiBvbmxpbmUgd2hlbiB3ZSBnbyB0byBDYW5jZWxXYXNUcmlnZ2VyZWQpLlxyXG4gICAgLy8gMy4gVGhlcmUgbXVzdCBiZSBhIG1vZGlmaWNhdGlvbiwgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBTbyBlaXRoZXIgTW9kaWZpZWQgaXMgdHJ1ZSwgbWVhbmluZyBhIGZpZWxkIHdhcyBtb2lkZmllZCAsIG9yXHJcbiAgICAvLyAgICBMYXN0UGFya2VkQ3RybCgpLm1vZGlmaWVkQnlVc2VyKCksIG1lYW5pbmcgdGhhdCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZyB0aGUgZmllbGQncyB2YWx1ZSAoVGhlIG1vZGlmaWVkIGlzIGZhbHNlIHVudGlsbCB3ZSBleGl0IHRoZSBmaWVsZCkuXHJcbiAgICAvLyBDcmVhdGUgbW9kZSBhbHNvIGdvZXMgaGVyZSAocmVjIHJlbW92ZWQgYW5kIG1vZGUgY2hhbmdlcyB0byBtb2RpZnkpICwgYnV0IGFsc28gd2lsbCBzaG93IHRoZSBjb25maXJtIGNhbmNlbCBvbmx5IGlmIHNvbWUgY2hhbmdlIHdhcyBkb25lIHRvIHRoZSBuZXcgcmVjb3JkLlxyXG4gICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXJlYy5VcGRhdGVkKSB7XHJcbiAgICAgIGlmIChpc01HX0FDVF9DQU5DRUwpIHtcclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8ICh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT09IG51bGwgJiYgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLk1vZGlmaWVkQnlVc2VyKSkge1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfQ0FOQ0VMKTtcclxuICAgICAgICAgICAgIGlmKCFjb25maXJtZWQpXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiAgdGFzay5nZXRNb2RlKCkgPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgJiYgdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG5cclxuICAgICAgICBsZXQgZW5hYmxlOiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZSkge1xyXG4gICAgICAgICAgbGV0IGFsbG93RW1wdHlEYXRhVmlldyA6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0U2l6ZSgpID09IDEgJiYgYWxsb3dFbXB0eURhdGFWaWV3KSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZSgnTScpO1xyXG4gICAgICAgICAgICB0YXNrLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2s6IFRhc2ssIGR2OiBEYXRhVmlldywgcmVjOiBSZWNvcmQsIG5vbkludGVyYWN0aXZlRGVsZXRlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgc2F2ZUlzUm93RWRpdGluZyA9IG15Zm9ybS5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKG15Zm9ybS5EaXNwbGF5TGluZSApOyAvL0NvbW1hbmRzLmdldElzUm90aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTt3RWRpdGluZyggdGFzay5nZXRGb3JtKCkuZ2V0TWFpbkNvbnRyb2woKSwgdGFzay5nZXRGb3JtKCkuRGlzcGxheUxpbmUpOyAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzO1xyXG4gICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpKSB7XHJcbiAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBvbGRSZWNNb2RlID0gcmVjLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgLy8gRm9yY2UgdGhlIGNoYW5nZSB0byBkZWxldGUgbW9kZVxyXG4gICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0YXNrIHN1ZmZpeCBpbiBNb2RpZnkgbW9kZSBvciB3aGVuIHRoZXJlIGlzICdmb3JjZSByZWNvcmQgc3VmZml4Jy5cclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlY29yZCBzdWZmaXggY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHJlY29yZCBzdWZmaXggaW4gRGVsZXRlIG1vZGVcclxuICAgICAgICAvLyBzZXQgdGhlIEluRGVsZXRlUHJvY2VzcyBmbGFnICwgc28gd2Ugd2lsbCBub3QgdHJ5IHRvIHNlbmQgdXBkYXRlcyBvbiB0aGUgcmVjb3JkIGFmdGVyXHJcbiAgICAgICAgLy8gd2UgZGVsZXRlIGl0IGluIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgKHJlYyBzdWZmaXgpLlxyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3ModHJ1ZSk7XHJcblxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgLy8gbm8gY29uZmlybSBtZXNzYWdlIGRpYWxvZyBpZiBpbiBub24gaW50ZXJhY3RpdmUgZGVsZXRlLlxyXG4gICAgICAgIGxldCBza2lwQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IG5vbkludGVyYWN0aXZlRGVsZXRlO1xyXG5cclxuICAgICAgICBpZiAoIXNraXBDb25maXJtRGlhbG9nKSB7XHJcbiAgICAgICAgICBpZiAodGFzay5tdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgbGV0IGNvbmZpcm1lZDogYm9vbGVhbiA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybV9ib29sKE1zZ0ludGVyZmFjZS5DT05GSVJNX1NUUl9ERUxFVEUpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2F2ZUlzUm93RWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgcmVjLnNldEluRGVsZXRlUHJvY2VzcyhmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXJlYy5TZW5kVG9TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgd2UncmUgZGVsZXRpbmcgYW4gaW5zZXJ0ZWQgcmVjb3JkLCB0aGUgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBpdFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHVwb24gZGVsZXRlLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kaWZpZWQgcmVjIGxpc3RcclxuICAgICAgICBpZiAob2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCkge1xyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmV3Q3VyclJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzU6IHdoZW4gdGhlIHVzZXIgZGVsZXRlcyBhIHJlY29yZCwgd2hpY2ggaXMgdGhlIHNpbmdsZVxyXG4gICAgICAgICAgLy8gcmVjb3JkIGluIHRoZSBkdiwgdGhlbiB3aGVuIGl0cyByZWNvcmQgc3VmZml4IGlzIGV4ZWN1dGVkIGFuZCB0aGVcclxuICAgICAgICAgIC8vIHNlcnZlciBzZW5kcyBhIG5ldyByZWNvcmQgdG8gdGhlIGNsaWVudCBhbmQgc2V0IGl0IHRvIGJlIHRoZVxyXG4gICAgICAgICAgLy8gY3VycmVudCByZWNvcmQuXHJcbiAgICAgICAgICAvLyBUaGlzIGZpeCBtYWtlcyB0aGUgZGVsZXRlZCByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgZm9yIGFcclxuICAgICAgICAgIC8vIG1vbWVudCBqdXN0IHRvIGRlbGV0ZSBpdCBmcm9tIHRoZSBjbGllbnRzIGNhY2hlLiBUaGVuLCBpdCBtYWtlc1xyXG4gICAgICAgICAgLy8gdGhlIG5ldyByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgYWdhaW4gYW5kIGVudGVycyBpbnRvIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgLy8gSSB0aGluayB0aGF0IGEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBjbGllbnQgaXNcclxuICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgYSBuZXcgcmVjb3JkIG9yIHRoZSBzZXJ2ZXIsIGFuZCBtYWtlIHN1cmVcclxuICAgICAgICAgIC8vIHRoYXQgaXQgaXMgZG9uZSBzeXN0ZW13aWRlLlxyXG4gICAgICAgICAgLy8gRWh1ZCAtIDEwLzA5LzIwMDFcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMocmVjLmdldElkKCksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBuZWVkIHRvIGRlbCB0aGUgY3VyciByZWMgYW5kIHBvc2l0aW9uIG9uIHRoZSBuZXggcmVjIGlmIHRoZSB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgLy8gVGhlIGRlbEN1cnJSZWMgbWF5IGNhdXNlIGEgY3Jhc2ggaWYgaXQgdHJpZXMgdG8gZ2V0IHRoZSBuZXh0IHJlYyBmcm9tIHRoZSBuZXh0IGNodW5rLlxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxDdXJyUmVjKHRhc2ssIGZhbHNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzUgLSBmaXggY29udGludWVcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuc2V0Q3VyclJlYyhuZXdDdXJyUmVjLmdldElkKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKGR2LmdldFNpemUoKSA9PT0gMSlcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gSW4gaW50ZXJhY3RpdmUsIHRoZSBtb2RlIG1pZ2h0IGNoYW5nZSB0byBtb2RpZnkgb3IgY3JlYXRlLiBIb3dldmVyLCBmb3Igbm9uIGludGVyYWN0aXZlIChkZWxldGUgbW9kZSlcclxuICAgICAgICAgIC8vIHRoZSBtb2RlIHNob3VsZCBiZSBzZXQgYmFjayB0byBkZWxldGUgYW5kIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCByZWNvcmQgY3ljbGUuXHJcbiAgICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVEZWxldGUpXHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIHZpZXcgcmVmcmVzaCwgc2NyZWVuIHJlZnJlc2ggYW5kIHJlY29yZCBmbHVzaCBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSB3aXRoIGFsbCBpdHMgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZWZyZXNoRXZlbnRzKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRClcclxuICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgaWYgd2UgdHJ5IHRvIHZpZXcgcmVmcmVzaCB3aXRoIGFsbG93X21vZGlmeT1uIGluIGNyZWF0ZSBtb2RlXHJcbiAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIWF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suSW5FbmRUYXNrICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pIHtcclxuICAgICAgICAgIGxldCBjdXJyZW50Um93OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKCFldnQuZ2V0UmVmcmVzaFR5cGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZ0LlJ0Vmlld1JlZnJlc2hVc2VDdXJyZW50Um93KCkgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudFJvdyA9IGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUludGVybmFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGR2LkN1cnJlbnRSZWNJZCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZWZldGNoUmVjb3JkOiBib29sZWFuID0gdHJ1ZTsgLy9SZWZldGNoIHJlY29yZCBmcm9tIHNlcnZlci5cclxuICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiBldnQuZ2V0QXJnTGlzdCgpICE9PSBudWxsICYmIGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHJlZmV0Y2hSZWNTdHI6IHN0cmluZztcclxuICAgICAgICAgICAgICByZWZldGNoUmVjU3RyID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApO1xyXG4gICAgICAgICAgICAgIHJlZmV0Y2hSZWNvcmQgPSAoaXNOdWxsT3JVbmRlZmluZWQocmVmZXRjaFJlY1N0cikgfHwgcmVmZXRjaFJlY1N0ciA9PT0gXCIxXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVmZXRjaFJlY29yZClcclxuICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVSZWFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGN1cnJlbnRSb3csIGV2dC5nZXRBcmdMaXN0KCksIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGV2ZW50XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaWQ6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGlkID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKHRhc2suZ2V0Rm9ybSgpLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgICBpZCA9ICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaWQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFJlY0J5SWR4KCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0VG9wUmVjSWR4KCkpLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2NyZWVuUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGlkLCBkdi5DdXJyZW50UmVjSWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVhbCB2aWV3IHJlZnJlc2ggY2F1c2VzIHRoZSBjYWNoZSBvZiB0aGUgY3VycmVudCBzdWIgZm9ybSB0YXNrIHRvIGJlIGNsZWFyZWRcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGRvZXMgbm90IGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgIGlmIChjbWQgIT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSICMyODkyMjIuIERvIG5vdCBjb250aW51ZSB3aXRoIFJlZnJlc2ggaWYgdGhlIHRhc2sgbXVzdCBiZSBlbmRlZC5cclxuICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5JbkVuZFRhc2sgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgIWZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUoZm9ybS5yZWNvcmRJZHgyRGlzcGxheUxpbmUoZHYuZ2V0Q3VyclJlY0lkeCgpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBBZnRlciByZWNvcmQgaGFzIGJlZW4gZmx1c2hlZCBpdCBpcyBub3QgY29uc2lkZXJlZCBhIG5ldyByZWNvcmQgYW55bW9yZS5cclxuICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuc2V0T2xkUmVjKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICM0MzAwNTkuIElmIHRoZSBmb2N1c2VkIHRhc2sgYW5kIHRoZSByZWZyZXNoZWQgdGFzayBpcyB0aGUgc2FtZSB0YXNrIG9yXHJcbiAgICAgICAgICAvLyB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHJlZnJlc2hlZCB0YXNrLCBnbyB0byB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgZmlyc3QgbGluZS5cclxuICAgICAgICAgIC8vIElmIHRoZSBmb2N1c2VkIHRhc2sgaXMgdGhlIHBhcmVudCB0YXNrLCBkbyBub3QgbGVhdmUgdGhlIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR28gdG8gY3JlYXRlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbWRzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdvdG9DcmVhdGVNb2RlKHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgLy8gUUNSICM0MTc3MzMuIEV4ZWN1dGUgUlMncyBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgb25lIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYWZ0ZXIgYWxsIHRoZSBoYW5kbGVycyBmaW5pc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyY0JlZm9yZVwiPnRoZSBSQyByZXR1cm5lZCBmcm9tIHRoZSBjb21tb25IYW5kbGVyQmVmb3JlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BvZ2F0ZVwiPmlmIGV2ZW50IHdhcyBwcm9wb2dhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50XCI+dGhlIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQWZ0ZXIoZXZ0OiBSdW5UaW1lRXZlbnQsIHJjQmVmb3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNNb2RlSXNEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbjtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBjdHJsID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVjb3JkIHByZWZpeCBmb3IgdGhlIHN1YiB0YXNrcyB0b29cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLmlzRmlyc3RSZWNvcmRDeWNsZShmYWxzZSk7XHJcbiAgICAgICAgICAvLyBPbmNlIGFyZSByZWFkeSB0byBlbmQgdGhlIFJTLCBpdCBtZWFucyB3ZSBjYW5ub3QgYmUgdGhlIEZJUlNUIHJlY29yZCBjeWNsZVxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzExNTk1MS4gRXZlbiBpZiByZWNvcmQgc3VmZml4IGlzIG5vdCBleGVjdXRlZCwgaW4gdGhlIG5leHQgdGltZSBkbyBub3QgZXhlY3V0ZSBSUCAmIFJTIG9mIHRoZSBzdWJmb3JtLlxyXG4gICAgICAgICAgdGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk4NDAzMTogaWYgdGhlIGRlbGV0ZSBvcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBcInZlcmlmeSBlcnJvclwiXHJcbiAgICAgICAgICAgIC8vIGluIHRoZSByZWNvcmQgc3VmZml4IHRoZW4gdGhlIHJlY29yZCBtb2RlIG11c3QgYmUgY2xlYXJlZFxyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIC8vIFFjciA3ODMwMzkgOiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiBjb250cm9sIGxldmVsIGl0IG1lYW5zIHRoYXQgY29udHJvbCBwcmVmaXggd2FzIGFscmVhZHkgZG9uZSBvciB0aGF0XHJcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgc3VmZml4IHdhcyBub3QgZG9uZS4gRWl0aGVyIHdheSB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGNvbnRyb2wgcHJlZml4IGFnYWluLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSA8TWdDb250cm9sPnRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGxhc3QgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgNDI2MjgzIGlzIHdlIGhhdmUgYSBzdWItZm9ybSB0aGF0IHdhcyBuZXZlciBiZWVuIGVudGVyZWRcclxuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY29udHJvbCBsZXZlbCB3aWxsIG5vdCBiZSBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG9ub3Qgd2FudCBDUyB0byBiZSBjYWxsZWQgYWdhaW4gZnJvbSBDUCBpbmNhc2Ugb2YgdmVyaWZ5IGVyciBpbiBDVlxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSB0YXNrLkluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0LCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBpbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlIGNoZWNrIHRoZSBzdG9wRXhlY3V0aW9uIGZsYWcgaGVyZSB0b28gYW5kIGRpc3BsYXkgYVxyXG4gICAgICAgICAgICAgIC8vIGNvbmZpcm0gY2FuY2VsIGRpYWxvZyB0aGF0IHdpbGwgY2xvc2UgdGhlIGJyb3dzZXIgaWYgdGhlIHZhbHVlIGlzIHRydWVcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRGVmZWN0IDE1Mjg3MTogV2l0aCBuZXcgd2F5IG9mIGVkaXRpbmcgcm93LCBSUyBpcyBub3QgZmlyZWQgaW5maW5pdGVseSwgYnV0IHJvdyBzZWxlY3Rpb24gaXMgc2hpZnRlZCB0byBuZXcgcm93LiBBbHNvIHJvdyBsZWF2ZXMgZWRpdGluZyBtb2RlLlxyXG4gICAgICAgICAgICAvLyBTbyBlbnN1cmUgcm93IGVkaXRpbmcgaXMgbGVmdCB3aGVuIHRoZXJlIGlzIG5vIHZlcmlmeSBlcnJvciBhbmQgbm90IHVuY29uZGl0aW9uYWxseS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmVjTW9kaWZpZWQgPSByZWMuTW9kaWZpZWQ7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiByZWMuaXNDYXVzZUludmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmludmFsaWRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjTW9kZUlzRGVsZXRlID0gKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBkZWxldGVkIHRoZW4gZXhlY3V0ZSB0aGUgXCJyZWMgc3VmZml4IGFmdGVyXCIgb25seVxyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlIChzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICAgIC8vIGluRGVsZXRlUHJvY2VzcyA6IGlmIHRoZXJlIGlzIGFuICdFTkQgVEFTSyBDT05EJyB3ZSB3aWxsIGhhdmUgYSAzcmQgY3ljbGUgaW4gcmVjb3JkIHN1ZmZpeCh3aGVuIHVwZCtkZWwgb3IgZm9yY2Ugc3VmZiArIGRlbCkuXHJcbiAgICAgICAgICAgIC8vIDFzdCBjeWNsZSA6IHVwZGFlIGN5Y2xlICh0YXNrIG1vZGUgd2lsbCBiZSB1cGRhdGUpLCAybmQgOiB0YXNrIG1vZGUgaXMgZGVsZXRlICwgdGhpcyBpcyB3aGVuIHdlIHNlbmQgdGhlIGRlbGV0ZSB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgICAgICAvLyAzcmQgLSBzdWZmaXggdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgZW5kVGFzay4gSW4gdGhlIDNyZCBjeWNsZSB0aGUgcmVjTW9kZUlzRGVsZXRlIHdpbGwgYmUgZmFsc2UgYWx0aG91Z2ggd2UgYXJlIHN0aWxsIGluIHRoZSBkZWxldGUgcHJvY2VzcyAod2UgYWxyZWFkeSBzZW50IHRoZSBkZWxldGUgb3BlcikuXHJcbiAgICAgICAgICAgIC8vIEEgY29tYmluYXRpb24gb2YgZm9yY2Ugc3VmZml4ICsgZW5kIHRhc2sgY29uZCArIGRlbCBsaW5lICwgd2lsbCBjcmFzaCB0aGUgc2VydmVyIG9uIHRoZSAzcmQgY3ljbGUgc2luY2Ugd2Ugd2lsbCBhc2sgZm9yIHVwZGF0ZSBvZmZcclxuICAgICAgICAgICAgLy8gYSByZWNvcmQgdGhhdCB0aGUgc2VydmVyIGhhZCBkZWxldGVkIG9uIHRoZSAybmQgY3ljbGUuIFRoYXQgaXQgd2h5IHdlIHVzZSAnaW5EZWxldGVQcm9jZXNzJywgc28gd2lsbCB3aWxsIGtub3cgbm90XHJcbiAgICAgICAgICAgIC8vIHRvIGFkZCB1cGRhdGUgb3BlciBvbiBhbiBhbHJlYWR5IGRlbGV0ZWQgcmVjb3JkLiAoUWNyICM3OTAyODMpLlxyXG4gICAgICAgICAgICAvLyAqIHRoZXJlIGlzIHN0aWxsIGEgcHJvYmxlbSBpbiAndXBkYXRlJyBhbmQgJ2luc2VydCcgd2l0aCAnZW5kIHRhc2sgY29uZCcgKyAnZm9yY2UnIDogYW4gZXh0cmEgdXBkYXRlIHdpbGwgYmUgc2VuZFxyXG4gICAgICAgICAgICAvLyAgIHRvIHRoZSBzZXJ2ZXIgb24gdGhlIHJlYyBzdWZmaXggb2YgdGhlIGVuZCB0YXNrLiBidXQgYXBhcnQgZnJvbSBzZXJ2ZXIgdXBkYXRlIGl0IGNhdXNlcyBubyByZWFsIHByb2JsZW0uXHJcbiAgICAgICAgICAgIGlmIChyZWNNb2RlSXNEZWxldGUgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgIXJlY01vZGVJc0RlbGV0ZSAmJiAhcmVjLmluRGVsZXRlUHJvY2VzcygpICYmIChyZWNNb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkpIHtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIGR2LnNldENoYW5nZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyZWNNb2RpZmllZCAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYy5yZWFsTW9kaWZpZWQoKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgcmVhbCBmaWVsZHMgd2VyZSBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChNc2dJbnRlcmZhY2UuUlRfU1RSX1VQREFURV9JTl9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgY29udGludWUgaGVyZSBhbmQgdHJ5IHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gYmVjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgYWxzbyBzb21lIHN1YiB0YXNrcyB0byB0aGlzIHRhc2tcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6MzA2OTI5LCBGb3JjZUV4aXRQcmUgaXMgcmVsZXZhbnQgb25seSBmb3IgdGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIHNlZSBhbHNvIGJ1ZyM6MjkyODc2XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrKSAmJlxyXG4gICAgICAgICAgICAgIC8vIERlZmVjdCAxNTQwNDcgOiBkbyBub3QgdHJ5IGFuZCBjb21taXQgaWYgdGFzayBpcyBhYm9ydGluZyBhbmQgd2FzIGFscmVhZHkgcmVtb3ZlZCAob3IgYWxsIE1HRCB3YXMgcmVtb3ZlZCkuXHJcbiAgICAgICAgICAgICAgKCF0YXNrLmlzQWJvcnRpbmcoKSB8fCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2suZ2V0VGFza1RhZygpKSAhPSBudWxsKSlcclxuICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaWYgKCghcmVjTW9kZUlzRGVsZXRlIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCBldnQucmV2ZXJzaWJsZUV4aXQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgMiBjeWNsZXMgKHVwZGF0ZS9mb3JjZSBzdWZmaXggKyBkZWxldGUpLCBkbyB0aGUgZW5kIHRhc2sgb25seSBpbiB0aGUgMm5kIGN5Y2xlLlxyXG4gICAgICAgICAgICAgIGlmICgocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSB8fFxyXG4gICAgICAgICAgICAgICAgcmVjLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSAvLyByZWMgIT0gbnVsbFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHBhcmthYmlsaXR5IG9uY2UgYWdhaW4gYXMgcHJvcGVydHkgbWlnaHQgaGF2ZSBjaGFuZ2VkIGluIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgIC8vIDkyNDExMiAtIGlnbm9yZSBkaXJlY3Rpb24gKGlmIGZsYWcgc2V0KSBhcyB3ZSBhcmUgZm9yY2luZyBwYXJrIGluc3BpdGUgb2YgZmFpbGVkIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAvLyBRQ1IjIDgwNjAxNTogSWYgd2UgaGF2ZSBhIHNpbmdsZSBmaWVsZCB3aXRoIGFsbG93IHBhcmtpbmcgPSBZZXMgYW5kIFRhYiBJbnRvID0gTm8sIHRoZW4gb24gcHJlc3NpbmcgdGFiIGlmIGN1cnNvciBpcyBub3RcclxuICAgICAgICAgICAgLy8gbW92ZWQsIHdlIGNvbWUgdG8gcGFyayBvbiBsYXN0UGFya2VkQ3RybCAod2hpY2ggaXMgc2FtZSBhcyBjdHJsKSBzaW5jZSBUYWJJbnRvIGlzIG5vdCBhbGxvd2VkLlxyXG4gICAgICAgICAgICAvLyBTbyB0byBhdmFvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB3ZSBzaG91bGQgbm90IGFnYWluIHRyeSB0byBwYXJrIG9uIGl0LlxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkgfHwgY3RybCA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IEluQ29udHJvbCB0cnVlIGFmdGVyIENvbnRyb2wgUHJlZml4XHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoY3RybC5TaG91bGRSZWZyZXNoT25Db250cm9sRW50ZXIoKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0ICg8RmllbGQ+Y3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29kZSBpcyByZWFjaGVkIHRoZW4gZXZlcnl0aGluZyBpcyBvayBpbiB0aGUgY29udHJvbCBwcmVmaXhcclxuICAgICAgICAgICAgICAvLyB1c2VyIGhhbmRsZXIuIE5vdywgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHBhcmtlZCBvbiBhIGN0cmwgc2V0IGNsaWNrZWQgY3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRvIHRha2UgY2FyZSBvZiB0ZW1wb3JhcnkgZWRpdG9yXHJcbiAgICAgICAgICAgICAgLy8gTWFuYWdlci5zZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5TZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgIHRydWUpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHBhcmtlZCBvbiBhIGN0cmwsIHNldCBzZXRzdG9wZXhlY3V0aW9uQ3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IGN0cmw7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gZGlzYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXMuIGRvIGl0IG9ubHkgaWYgd2UgYXJlIGdldHRpbmcgb3V0IG9mIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSB8fCBjdHJsLnVzZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIGNvbnRyb2wgc3VmZml4IGdldCAnc3RvcCBleGVjdXRpb24nIChlLmcuIHZlcmlmeSBlcnJvciksIHRoZSBmb2N1cyB3aWxsIGJlIHJlbWFpbiBvbiBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgLy8gU28gc2V0IEluQ29udHJvbCB0byB0cnVlXHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIG5leHRQYXJrZWRDdHJsIChzZXQgaW4gQ2xpZW50TWFuYWdlci5wcm9jZXNzRm9jdXMpXHJcbiAgICAgICAgICAgIHRoaXMuX25leHRQYXJrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWVsZHMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZXh0IGNvbnRyb2wgYW5kIHdpdGggdHlwZSB0aGF0IGhhcyBkZWZhdWx0IGRpc3BsYXlcclxuICAgICAgICAgICAgLy8gdmFsdWUgKG51bWVyaWMsIGRhdGUsIHRpbWUsIGxvZ2ljYWwgZXRjKVxyXG4gICAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSlcclxuICAgICAgICAgICAgICBhd2FpdCBmbGQudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGN0cmwuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3RybC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykpXHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRhc2ssIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfTk9ORSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gc2ltdWxhdGVzIHVzZXIgYXNraW5nIGZvciB0aGUgbmV4dCByZWMuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9SRUM6XHJcbiAgICAgICAgICBsZXQgZm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNNYWluUHJvZygpICYmIGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoZm9ybS5pc0xpbmVNb2RlKClcclxuICAgICAgICAgICAgICA/IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XXHJcbiAgICAgICAgICAgICAgOiBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsXHJcbiAgICAgICAgICAgICAgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICAvLyBlbmQgb2YgZGF0YSB3aWxsIHNpZ25hbCB1cyB0byBlbmQgdGhlIHRhc2sgKHVubGVzcyBpbiBjcmVhdGUgbW9kZSkuXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEV4ZWNFbmRUYXNrKCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gZGVsZXRlIHJlY29yZCBpbiBub24gaW50ZXJhY3RpdmUgdGFza1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfREVMRVRFX1JFQzpcclxuICAgICAgICAgIC8vIGNoZWNrIGVtcHR5IGRhdGF2aWV3IGJlZm9yZSB0cnlpbmcgdG8gZGVsZXRlLCBpbiBjYXNlIHRhc2sgc3RhcnRlZCB3aXRoIGVtcHR5IGRhdGF2aWV3LlxyXG4gICAgICAgICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgICh0YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2ssIGR2LCByZWMsIHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEV4ZWNFbmRUYXNrKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFVF9FWFRFUk5BTF9WQUxVRTpcclxuICAgICAgICAgIGxldCByZWZyZXNoRGlzcGxheSA6IGJvb2xlYW4gPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDEsIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCkgPT09ICcxJyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICAgIGF3YWl0ICg8TWdDb250cm9sPmN0cmwpLnZhbGlkYXRlQW5kU2V0VmFsdWVJZkFsbG93ZWQoZXZ0LmdldFZhbHVlKCksIHJlZnJlc2hEaXNwbGF5KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBub24gcmV2ZXJzaWJsZSBldmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlTm9uUmV2ZXJzaWJsZUV2ZW50KHRhc2s6IFRhc2tCYXNlLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgbGV0IGV4aXRDb21tYW5kOiBib29sZWFuID0gKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQgfHwgZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgaWYgKGV4aXRDb21tYW5kKVxyXG4gICAgICB0aGlzLl9pc05vblJldmVyc2libGVFeGl0ID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBydEV2dC5zZXROb25SZXZlcnNpYmxlRXhpdCgpO1xyXG4gICAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaWYgKGV4aXRDb21tYW5kKVxyXG4gICAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyLCBldmVudFN1YlR5cGU6IEV2ZW50U3ViVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVCAmJiB0YXNrICE9IG51bGwgJiYgIShldmVudFN1YlR5cGUgPT09IEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpICYmICF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKGV2ZW50Q29kZSkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2wobGFzdFBhcmtlZEN0cmwsIGV2ZW50Q29kZSwgZXZlbnRTdWJUeXBlKTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG4gICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpO1xyXG4gICAgICAgIGlmIChJbnRlcm5hbEludGVyZmFjZS5CdWlsdGluRXZlbnQoZXZlbnRDb2RlKSlcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBFdmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0XCI+aW5kaWNhdGVzIHdoZXRoZXIgTUdfQUNUX0NBTkNFTCBpcyBjYWxsZWQgZnJvbSBNR19BQ1RfUlRfUVVJVDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wsIGV2ZW50Q29kZTogbnVtYmVyLCBldmVudFN1YlR5cGU6IEV2ZW50U3ViVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG4gICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoZXZlbnRTdWJUeXBlKTsgLy8gKHVzZSBmb3IgYWN0X2NhbmNlbCAmIGFjdF9ydF92aWV3X3JlZnJlc2hcclxuICAgICAgLy8gYmFzaWNhbGx5IE1HX0FDVF9WSUVXX1JFRlJFU0ggcmVwcmVzZW50IHRoZSB2aWV3IHJlZnJlc2ggZXZlbnQgcmFpc2VkIGJ5IHRoZSB1c2VyXHJcbiAgICAgIC8vIGhvd2V2ZXIgd2UgdXNlIGludGVybmFsbHkgaW4gdGhlIGNvZGUgdG8gcmVmcmVzaCB0aGUgZGlzcGxheSAobWFpbmx5IGluIHN1YiBmb3JtcyByZWZyZXNoZXMpXHJcbiAgICAgIC8vIGluIG9yZGVyIHRoZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSByZWFsIHVzZSBhbmQgdGhlIGludGVybmFsIHVzZSB3ZSBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIHNpbmNlIHdlIG1ha2UgZGlmZmVyZW50IGFjdGlvbnMgd2hlbiBjYWNoaW5nIGEgc3ViZm9ybVxyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKVxyXG4gICAgICAgIHJ0RXZ0LnNldElzUmVhbFJlZnJlc2goZmFsc2UpO1xyXG5cclxuICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckZpZWxkKCk6IEZpZWxkIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyRmllbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjdXJyZW50IGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyckN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyVGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLl9jdXJyRmllbGQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5fY3VyckZpZWxkLmdldFRhc2soKTtcclxuICB9XHJcblxyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuLCBjbGVhclNydnJFdmVudHM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJTcnZyRXZlbnRzPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3ApO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25fMShzdG9wLCBjbGVhclNydnJFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzAoc3RvcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHN0b3AsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJTcnZyRXZlbnRzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyU3J2ckV2ZW50cylcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgdG1wVmVjID0gbmV3IExpc3Q8UnVuVGltZUV2ZW50PigpO1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8vIFdlIHdlcmUgcmVxdWVzdGVkIHRvIGxlYXZlIHRoZSBcInNlcnZlciBldmVudHNcIiBpbiB0aGUgcXVldWUuXHJcbiAgICAgICAgLy8gRG8gaXQsIGJ1dCBhbHNvIHJlbW92ZSB0aGUgXCJwcm90ZWN0aW9uXCIgZnJvbSB0aGVzZSBldmVudHMgc28gbmV4dFxyXG4gICAgICAgIC8vIHRpbWUgd2UgbmVlZCB0byBjbGVhciB0aGUgcXVldWUgdGhleSB3aWxsIGFsc28gYmUgZGVsZXRlZC5cclxuICAgICAgICB3aGlsZSAoIXRoaXMuX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSkge1xyXG4gICAgICAgICAgcnRFdnQgPSA8UnVuVGltZUV2ZW50PnRoaXMuX2V2ZW50c1F1ZXVlLnBvbGwoKTtcclxuICAgICAgICAgIGlmIChydEV2dC5pc0Zyb21TZXJ2ZXIoKSkge1xyXG4gICAgICAgICAgICBydEV2dC5yZXNldEZyb21TZXJ2ZXIoKTtcclxuICAgICAgICAgICAgdG1wVmVjLnB1c2gocnRFdnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRtcFZlYy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dCh0bXBWZWMuZ2V0X0l0ZW0oaSkpO1xyXG4gICAgICB9XHJcbiAgICB0aGlzLl9zdG9wRXhlY3V0aW9uID0gc3RvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN0cmwgb24gd2hpY2ggd2UgaGFkIGEgXCJzdG9wIGV4ZWN1dGlvblwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTdG9wRXhlY3V0aW9uQ3RybChjdHJsOiBNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybCA9PT0gbnVsbCB8fCBjdHJsID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybCA9IGN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZGVsZXRlIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dGhlIHRhc2sgdG8gcmVmZXIgdG8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluRm9yY2VEZWxcIj50cnVlIGlmIHRoZSBkZWxldGUgaXMgZG9uZSBiZWNhdXNlIG9mIGZvcmNlIGRlbGV0ZSA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZGVsQ3VyclJlYyh0YXNrOiBUYXNrLCBpbkZvcmNlRGVsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcblxyXG4gICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAvLyBkZWxldGUgdGhlIHJlY29yZCBhbmQgcnVuIHJlY29yZCBzdWZmaXggZm9yIHRoZSBuZXcgY3VycmVudCByZWNvcmRcclxuICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5kZWxDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gbm8gY3Vyci1yZWMgPT0+IHdlIGRlbGV0ZWQgdGhlIGxhc3QgcmVjb3JkIGFuZCBmYWlsZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSAoZS5nLlxyXG4gICAgLy8gQ1JFQVRFIG1vZGUgaXMgbm90IGFsbG93ZWQpID09PiBlbmQgdGhlIHRhc2suIEFuIGV4Y2VwdGlvbiB0byB0aGUgcnVsZSBpcyB3aGVuXHJcbiAgICAvLyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIHJlY29yZC5cclxuICAgIGlmICghdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBpZiAoZHYuZ2V0Q3VyclJlY0lkeCgpID49IDApIHtcclxuICAgICAgICAvLyBRQ1IgIzY1NjQ5NTogSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQgYW5kIHRoZSBjdXJyZW50IHJlY29yZCBpcyBzdGlsbCB0aGVcclxuICAgICAgICAvLyBkZWxldGVkIG9uZSB0aGVuIHRoZSByZWNvcmQgcHJlZml4IHdpbGwgYmUgaGFuZGxlZCBlbHNld2hlcmUuXHJcbiAgICAgICAgaWYgKChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJiAhaW5Gb3JjZURlbCkge1xyXG4gICAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCF0YXNrLmdldEluQ3JlYXRlTGluZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTm9uUmV2ZXJzaWJsZUV2ZW50KHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIHVzZXJzIGNvbmZpcm1hdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dG8gY2hlY2sgY29uZmlybSB1cGRhdGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSAtIHByb2Nlc3MgY29tbWFuZCwgZmFsc2UgLSBzdG9wIGNvbW1hbmQgcHJvY2Vzc2luZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNvbmZpcm1lZCh0YXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgY29uZmlybTogYm9vbGVhbjtcclxuICAgIGxldCBhbnN3ZXI6IHN0cmluZztcclxuICAgIGxldCBhbnM6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uZmlybSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFLCBmYWxzZSk7XHJcbiAgICBpZiAoIXRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ICYmIGNvbmZpcm0gJiYgIXRhc2suRGF0YVN5bmNlZCkge1xyXG4gICAgICBhbnMgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm0oTXNnSW50ZXJmYWNlLkNSRl9TVFJfQ09ORl9VUEQsXHJcbiAgICAgICAgU3R5bGVzLk1TR0JPWF9JQ09OX1FVRVNUSU9OIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PX0NBTkNFTCk7XHJcbiAgICAgIGlmIChhbnMgPT09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUylcclxuICAgICAgICBhbnN3ZXIgPSAnWSc7XHJcbiAgICAgIC8vIFllc1xyXG4gICAgICBlbHNlIGlmIChhbnMgPT09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX05PKVxyXG4gICAgICAgIGFuc3dlciA9ICdOJztcclxuICAgICAgLy8gTm9cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGFuc3dlciA9ICdDJzsgLy8gQ2FuY2VsXHJcbiAgICB9IGVsc2VcclxuICAgICAgYW5zd2VyID0gJ1knO1xyXG5cclxuICAgIHN3aXRjaCAoYW5zd2VyKSB7XHJcbiAgICAgIGNhc2UgJ1knOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnTic6XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgdGFzay5Db25maXJtVXBkYXRlTm8gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGNvbnRpbnVlIHJlY29yZCBzdWZmaXhcclxuXHJcbiAgICAgIGNhc2UgJ0MnOlxyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSwgLTEpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gc3RvcCBldmVudCBwcm9jZXNzaW5nXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIENsaWVudE1hbmFnZXIuSW5zdGFuY2UudXBkYXRlQ29uZmlybWVkKCkgaWxsZWdhbCBjb25maXJtYXRpb24gY29kZTogXCIgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgXCIxXCIpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSywgSlNPTi5zdHJpbmdpZnkoKDxUYXNrPnJ0RXZ0LmdldFRhc2soKSkuVGFza0RlZmluaXRpb25JZCkpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgcnRFdnQuZ2V0QXJnTGlzdCgpLmJ1aWxkWE1MKHN0cik7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNULCAgc3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudCBmcm9tIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXN0b3JlTGFzdFNhdmVkUm91dGVFdmVudEZyb21Mb2NhbFN0b3JhZ2UoKTogdm9pZFxyXG4gIHtcclxuICAgIC8vZ2V0IHJvdXRlIGV2ZW50IGlmIHN0b3JlZCBvbiBsb2NhbCBzdG9yYWdlXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG5cclxuICAgIGxldCBsYXN0Um91dGVFdmVudCA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCk7XHJcblxyXG4gICAgaWYgKGxhc3RSb3V0ZUV2ZW50ID09PSBcIjFcIikge1xyXG4gICAgICBsZXQgc3JjVGFza0RlZmluaXRpb25TdHIgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSyk7XHJcbiAgICAgIGxldCByb3V0ZUFyZ0xpc3RTdHIgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfQVJHX0xJU1QpO1xyXG5cclxuICAgICAgLy8gcGFyc2Ugc3JjVGFza0RlZmluaXRpb25TdHIgYW5kIHByZXBhcmUgdGFza0RlZmluaXRpb25JZFxyXG4gICAgICBsZXQgdGFza0RlZmluaXRpb25JZCA9IG5ldyBUYXNrRGVmaW5pdGlvbklkKCk7XHJcbiAgICAgIHRhc2tEZWZpbml0aW9uSWQuZnJvbUpTT04oc3JjVGFza0RlZmluaXRpb25TdHIpO1xyXG5cclxuICAgICAgLy9zZWFyY2ggc291cmNlIHRhc2sgaW4gbmV3bHkgbG9hZGVkIHRhc2sgdHJlZSBieSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCBzcmNUYXNrID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCkuZ2V0VGFza0J5VGFza0RlZmluaXRpb25JRCh0YXNrRGVmaW5pdGlvbklkKTtcclxuICAgICAgbGV0IGFyZ3MgPSBudWxsO1xyXG4gICAgICBpZiAocm91dGVBcmdMaXN0U3RyICE9IG51bGwpIHtcclxuICAgICAgICBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoKTtcclxuICAgICAgICBhcmdzLmZpbGxMaXN0KHJvdXRlQXJnTGlzdFN0ciwgc3JjVGFzayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuQWRkTGFzdFNhdmVkUm91dGVFdmVudChzcmNUYXNrLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBzYXZlIHRoZSBsYXN0IHJvdXRlIGV2ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TGFzdFNhdmVkUm91dGVFdmVudCAocnRFdnQ6UnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAocnRFdnQgPT0gbnVsbClcclxuICAgICAgdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50ID0gbnVsbDtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50ID0gcnRFdnQucmVwbGljYXRlKCk7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJ1bnRpbWUgZXZlbnQgbG9jYXRlZCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBlZWsoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgaWdub3JlIHVua25vd24gY29tbWFuZHNcclxuICAvLy8gICBhcnJpdmluZyBmcm9tIHRoZSBlbmdpbmUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJZ25vcmVVbmtub3duQWJvcnQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiaWdub3JlIHVua25vd24gYWJvcnRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpZ25vcmVVbmtub3duQWJvcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faWdub3JlVW5rbm93bkFib3J0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNvdmVyIGZyb20gYSBmYWlsdXJlIHRvIG92ZXJsYXkgYSB0YXNrLiBXaGVuIHRoZSBzZXJ2ZXIgb3JkZXJzIHRoZSBjbGllbnQgdG8gcnVuIGFcclxuICAvLy8gICBuZXcgdGFzayBpbiBhIGZyYW1lIHdoaWNoIGFscmVhZHkgY29udGFpbnMgYW4gYWN0aXZlIHRhc2ssIHRoZSBjbGllbnQgdHJpZXMgdG8gdGVybSB0aGVcclxuICAvLy8gICBleGlzdGluZyB0YXNrIGFuZCByZXBsYWNlIGhpbS4gV2hlbiB0aGlzIGFjdGlvbiBmYWlscywgdGhlIGNsaWVudCBoYXMgdG8gYXNrIHRoZSBzZXJ2ZXJcclxuICAvLy8gICB0byB0ZXJtaW5hdGUgdGhlIE5FVyBUQVNLLCBhbmQgaWdub3JlIHRoZSBvdmVybGF5IGFjdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza2lkXCI+LSB0aGUgaWQgb2YgdGhlIE5FVyBUQVNLPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nZFwiPiAgIC0gdGhlIE1HRGF0YSBvZiB0aGUgT0xEIFRBU0suPC9wYXJhbT5cclxuICBhc3luYyBmYWlsVGFza092ZXJsYXkodGFza0lkOiBzdHJpbmcsIG1nZDogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuXHJcbiAgICBpZiAodGFza0lkICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIFRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gdXMgJ2Fib3J0JyBjb21tYW5kcyBmb3IgdGhlIG5ldyB0YXNrLiBJZ25vcmUgdGhlbSwgc2luY2UgaXQgd2FzbnQgc3RhcnRlZCB5ZXRcclxuICAgICAgdGhpcy5zZXRJZ25vcmVVbmtub3duQWJvcnQodHJ1ZSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRhc2tJZCwgZmFsc2UpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgY3VycmVudCBldmVudCBzaG91bGQgYmUgcHJvcG9ndGF0ZWQgdG8gYWxsIHRhc2tzIGluIGEgc3BlY2lmaWMgdHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRXZlbnRTY29wZVRyYW5zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50U2NvcGUgPT09IEV2ZW50U2NvcGUuVFJBTlM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV2ZW50IHNjb3BlIHRvIFRSQU5TQUNUSU9OXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFdmVudFNjb3BlVHJhbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudFNjb3BlID0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gTk9OIFRSQU5TQUNUSU9OXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckV2ZW50U2NvcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aW1lIG9mIGZpc3QgZXZlbnQgaW4gc2VxdWVuY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGltZSBvZiBmaXRzdCBldmVudCBpbiBzZXF1ZW5jZTwvcmV0dXJucz5cclxuICBHZXRFdmVudFRpbWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudHNRdWV1ZS5HZXRUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2JJdG1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxhc3QgZW5hYmxlZCBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpYyBrZXkgKGluIGtiSXRlbSk8L3JldHVybnM+XHJcbiAgLy8vIDxjaGVja0FjY2Vzc0tleUluTWVudXM6PiAgaWYgdG8gY2hlY2sgdGhlIGtleWJvYXJkIGluIHRoZSBtZW51IDwvY2hlY2tBY2Nlc3NLZXlJbk1lbnVzOj5cclxuICBwdWJsaWMgZ2V0TWF0Y2hpbmdBY3Rpb24oICBrYkl0bTogS2V5Ym9hcmRJdGVtKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgYWN0OiBudW1iZXIgPSAwO1xyXG4gICAgLy8gd2hlbiBtZW51IGlzIGRlZmluZSB3aXRoIG5vIGtleWJvYXJkIGRlZmluZSwgdGhlIGtiSXRlbSBpcyByZXR1cm4gbnVsbDtcclxuICAgIGlmIChrYkl0bSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYWN0O1xyXG5cclxuXHJcbiAgICAvLyBUaGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LCBidXQgaXQgc3RpbGwgYmVsb25ncyB0byBhbiBhY3Rpb24uXHJcbiAgICAvLyBzZWUgaWYgdGhlIGtiSXRtIGhvbGQgYW4gYWN0aW9uIChvcmlnaW5hbGx5IG1hZGUgZm9yIE1HX0FDVF9DSEFSKS5cclxuICAgIGlmIChhY3QgPT09IDApIHtcclxuICAgICAgLy8gaWYgbWVudSB3YXMgZm91bmQgYW5kIGl0IGlzIGludGVybmFsIGV2ZW50IHB1dCBhY3Rpb24gdG8gdGhlIHF1ZXVlIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGtiZCBtYXBwaW5nIHRoZSB0aGF0IGtleS5cclxuICAgICAgaWYgKGtiSXRtLmdldEFjdGlvbigpICE9PSAwKVxyXG4gICAgICAgIGFjdCA9IGtiSXRtLmdldEFjdGlvbigpO1xyXG4gICAgICAvLyB0aGlzIGlzIG9ubHkgVEVNUCBoYXJkY29kZWQuIHRoZSBhY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGluIHRoZSBrZXlib2FyZCBtYXBwaW5nXHJcbiAgICAgIC8vIGFsc28gYSBjaGFuZ2UgdG8gdGhlIG9ubGluZSAoaWYgdGltZSBwZXJtaXRzKSBhbHNvIHRvIHR1cm4gdGhlIHRvZ2dsZSBpbnNlcnQgaW50byBhbiBhY3QuXHJcbiAgICAgIGVsc2UgaWYgKGtiSXRtLmdldEtleUNvZGUoKSA9PT0gNDUgJiYga2JJdG0uZ2V0TW9kaWZpZXIoKSA9PT0gTW9kaWZpZXJzLk1PRElGSUVSX05PTkUgJiYga2JJdG0uZ2V0U3RhdGVzKCkgPT09IDApXHJcbiAgICAgICAgYWN0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChhY3QpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHRlciBmb3IgdGhlIGV4ZWNTdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2s8L3JldHVybnM+XHJcbiAgZ2V0RXhlY1N0YWNrKCk6IEV4ZWN1dGlvblN0YWNrIHtcclxuICAgIHJldHVybiA8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgb25lIGVudHJ5IG9mIGFuIG9wZXJhdGlvbiBpbnRvIHRoZSBleGVjdXRpb24gc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+LSB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVySWRcIj4tIHRoZSBpZCBvZiB0aGUgaGFuZGxlciB3aGljaCBob2xkcyB0aGUgcmFpc2UgZXZlbnQgY29tbWFuZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlcklkeFwiPi0gdGhlIGlkeCBvZiB0aGUgY29tbWFuZCB3aGljaCBjcmVhdGVkIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSAocmFpc2UgZXZlbnQgb2YgZnVuY3Rpb24gY2FsbCk8L3BhcmFtPlxyXG4gIHB1c2hFeGVjU3RhY2sodGFza0lkOiBzdHJpbmcsIGhhbmRsZXJJZDogc3RyaW5nLCBvcGVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkucHVzaChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFRhc2tJZEJ5SWQodGFza0lkKSwgaGFuZGxlcklkLCBvcGVySWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIG9uZSBlbnRyeSBmcm9tIHRoZSBleGVjdXRpb24gc3RhY2sgLSBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBhbiBvcGVyYXRpb24gd2hpY2ggY2FuIGhvbGRcclxuICAvLy8gICBvdGhlciBvcGVyYXRpb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBlbnRyeSB0aGF0IHdhcyBwb3BwZWQ8L3JldHVybnM+XHJcbiAgcG9wRXhlY1N0YWNrKCk6IEV4ZWN1dGlvblN0YWNrRW50cnkge1xyXG4gICAgcmV0dXJuICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaCBhIG5ldyBlbnRyeSB0byB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWMgc3RhY2tzIC0gdGhpcyBpcyB0byBkZWZlciBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdFxyXG4gIC8vLyAgIGdldCBpbmZsdWVuY2VzIGJ5IHRoZSBjdXJyZW50IHNlcnZlciBleGVjdXRpb24gc3RhY2sgLSB3aGVuIHBlcmZvcm1pbmcgdGhlIHJlY29yZCBwcmVmaXggb2YgYSB0YXNrXHJcbiAgLy8vICAgdGhhdCB3YXMganVzdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHdoZW4gY2FsbGluZyBhIG1vZGFsIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1c2hOZXdFeGVjU3RhY2tzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucHVzaChuZXcgRXhlY3V0aW9uU3RhY2soKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgbmV3IGVudHJ5IGZyb20gdGhlIHN0YWNrIG9mIHNlcnZlciBleGVjdXRpb24gc3RhY2tzIHdoZW4gdGhlIHNlcXVlbmNlIHRoYXQgbmVlZHMgdG8gYXZvaWRcclxuICAvLy8gICBjdXJyZW50IHNlcnZlciBleGVjdXRpb24gc3RhY2sgaGFzIGVuZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BOZXdFeGVjU3RhY2tzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBhbiBleGVjdXRpb24gc3RhY2sgZW50cnkgaW50byB0aGUgc2VydmVyIGV4ZWMgc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+LSB0aGUgaWQgb2YgdGhlIHRhc2sgaW4gdGhlIGVudHJ5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gaGFuZGxlciBpZCBvZiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlcklkeFwiPi0gaWR4IG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggdGhlIGVudHJ5IHJlZmVycyB0bzwvcGFyYW0+XHJcbiAgcHVzaFNlcnZlckV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChuZXcgRXhlY3V0aW9uU3RhY2soKSk7XHJcbiAgICB9XHJcblxyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5wdXNoKHRhc2tJZCwgaGFuZGxlcklkLCBvcGVySWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhcnMgdGhlIHNlcnZlciBleGVjdXRpb24gc3RhY2sgYWZ0ZXIgd2UgZm91bmQgdGhlIGNvcnJlY3QgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGNvbnRpbnVlIGZyb21cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyU2VydmVyRXhlY1N0YWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwpIHtcclxuICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5jbGVhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldmVyc2UgdGhlIHNlcnZlciBleGVjdXRpb24gc3RhY2sgLSB3ZSBnZXQgaXQgZnJvbSB0aGUgc2VydmVyIGFuZCBwdXNoIGl0IGluIHRoZSBzYW1lIG9yZGVyXHJcbiAgLy8vICAgaXQgaXMgd3JpdHRlbiBpbiB0aGUgbWVzc2FnZSwgd2hpY2ggYWN0dWFsbHkgbWVhbnMgd2UgaGF2ZSB0byByZXZlcnNlIGl0IGluIG9yZGVyIHRvIGhhbmRsZSBpdCBjb3JyZWN0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJldmVyc2VTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbClcclxuICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5yZXZlcnNlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsY3VsYXRlIGFjY29yZGluZyB0byB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrIGFuZCB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2sgb24gdGhlIGNsaWVudCArXHJcbiAgLy8vICAgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHdoaWNoIHdlIGFyZSBvbiwgd2hpY2ggaXMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgd2UgbmVlZCB0byBleGVjdXRlXHJcbiAgLy8vICAgaW4gdGhlIGN1cnJlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVyXCI+LSB0aGUgb3BlcmF0aW9uIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgb248L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2xlYXJXaGVuRm91bmRcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgY2xlYXIgdGhlIHNlcnZlciBzdGFjayB3aGVuIHdlIHJlYWNoIGl0cyBlbmQsXHJcbiAgLy8vICAgb3IgaWYgd2UganVzdCB1c2luZyB0aGlzIG1ldGhvZCB0byBjaGVjayB3aGF0IHRoZSBuZXh0IG9wZXJhdGlvbiBpc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5zIHRoZSBuZXh0IG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCBieSB0aGUgY2xpZW50XHJcbiAgLy8vICAgaWYgaXQgcmV0dXJucyAtMSB0aGVuIHRoZSBjbGllbnQgc2hvdWxkIGNvbnRpbnVlIGFzIHVzdWFsXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXROZXh0T3BlcklkeChvcGVyOiBPcGVyYXRpb24sIGNsZWFyV2hlbkZvdW5kOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeTogRXhlY3V0aW9uU3RhY2tFbnRyeSA9IG51bGw7XHJcbiAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBlbXByeSBpdCBtZWFucyB3ZSBkaWQgbm90IHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnRpbnVlIHdpdGggZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIGluIHRoZSBjdXJyZW50IGhhbmRsZXIgYXMgdXN1YWxcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2suY291bnQoKSAhPT0gMCAmJiB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsICYmICEoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmVtcHR5KCkpIHtcclxuICAgICAgLy8gaWYgdGhlIHNlcnZlcidzIGV4ZWMgc3RhY2sgaXMgZGVlcGVyIHRoYW4gdGhlIGNsaWVudCdzIC1cclxuICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayB0aGUgZW50cnkgaW4gdGhlIGNsaWVudCdzIHN0YWNrIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2ZXIncyBzdGFjayBzaXplXHJcbiAgICAgIGlmICgoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgLy8gd2UgY29weSB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrIGFuZCBwb3AgZnJvbSBpdCB1bnRpbCB0aGUgc2l6ZSBvZiB0aGUgc2VydmVyXHJcbiAgICAgICAgLy8gYW5kIHRoZSBjbGllbnQgaXMgdGhlIHNhbWVcclxuICAgICAgICBsZXQgdG1wU2VydmVyRXhlY1N0YWNrOiBFeGVjdXRpb25TdGFjayA9IG5ldyBFeGVjdXRpb25TdGFjayg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSk7XHJcbiAgICAgICAgd2hpbGUgKHRtcFNlcnZlckV4ZWNTdGFjay5zaXplKCkgPiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSkge1xyXG4gICAgICAgICAgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkgPSB0bXBTZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBhbGwgZW50cmllcyBiZWZvcmUgdGhlIGxhc3Qgb25lIHdlIHBvcHBlZCBhcmUgdGhlIHNhbWUgYXMgaW4gdGhlIGNsaWVudCBhbmRcclxuICAgICAgICAvLyB0aGUgY3VycmVudCBlbnRyeSBpcyBvbiB0aGUgc2FtZSBoYW5kbGVyIGFzIHRoZSBzZXJ2ZXIncyBsYXN0IGVudHJ5LFxyXG4gICAgICAgIC8vIGFuZCB0aGUgb3BlcmF0aW9uIGlzIGFmdGVyIHRoZSBjdXJyZW50IG9wZXJhdGlvbixcclxuICAgICAgICAvLyB0aGVuIHRoaXMgZW50cnkgaW4gdGhlIHNlcnZlciBpbmRpY2F0ZXMgd2hpY2ggaXMgb3VyIG5leHQgb3BlcmF0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4ZWNTdGFjay5wZWVrKCkuRXF1YWxzKHRtcFNlcnZlckV4ZWNTdGFjaykgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuVGFza0lkID09PSBvcGVyLmdldFRhc2tUYWcoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5IYW5kbGVySWQgPT09IG9wZXIuZ2V0SGFuZGxlcklkKCkgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuT3BlcklkeCA+PSBvcGVyLmdldFNlcnZlcklkKCkpIHtcclxuICAgICAgICAgIG5leHRPcGVySWR4ID0gdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuT3BlcklkeDtcclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgc2VydmVyIGV4ZWMgc3RhY2sgaXMgZGVlcGVyIHRoYW4gdGhlIGNsaWVudCdzIGJ5IG9ubHkgMSxcclxuICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHdlIGFyZSBjaGVja2luZyB0aGUgdG9wIG1vc3QgZW50cnkgb24gdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayxcclxuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzdGFjayBpcyB0aGUgc2FtZSBub3csIHNvIHdlIGNhbiBjbGVhciB0aGUgc2VydmVyJ3Mgc3RhY2sgLVxyXG4gICAgICAgICAgLy8gd2UgZ290IHRvIHRoZSBwb2ludCB3aGljaCB3ZSBhcmUgb24gdGhlIGV4YWN0IG9wZXJhdGlvbiB3aGljaCB0aGUgc2VydmVyIGxlZnQgZXhlY3V0aW9uLlxyXG4gICAgICAgICAgaWYgKGNsZWFyV2hlbkZvdW5kICYmICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID09PSAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSArIDEpIHtcclxuICAgICAgICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5jbGVhcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5leHRPcGVySWR4ID0gRXZlbnRzTWFuYWdlci5NQVhfT1BFUjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHRPcGVySWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXCI+PC9wYXJhbT5cclxuICBzZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayA9IGluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFsbG93RXZlbnRzXCI+PC9wYXJhbT5cclxuICBzZXRBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FsbG93RXZlbnRzID0gQWxsb3dFdmVudHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBBbGxvd0V2ZW50cyBmb3IgYSBub24gaW50ZXJhY3RpdmUgdGFzay5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoQWxsb3dFdmVudHM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChBbGxvd0V2ZW50cylcclxuXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIFRoZSBGb3JtcyBDb250cm9sbGVyIG1lY2hhbmlzbSBpcyBkaXNhYmxlIGlmIHdlIGFyZSBpbiBOb24gaW50ZXJhY3RpdmUgdGFzayB3aXRoIEFsbG93RXZlbnRzID0gdHJ1ZSBhbmQgT3BlbiBXaW5kb3cgPSB0cnVlXHJcblxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBBbGxvd0V2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ3aXRoaW5Ob25JbnRlcmFjdGl2ZUxvb3BcIj48L3BhcmFtPlxyXG4gIGdldEFsbG93RXZlbnRzKCk6IEV2ZW50c0FsbG93ZWRUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gVFJVRSBpZiBubyBldmVudHMgYXJlIGFsbG93ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgTm9FdmVudHNBbGxvd2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzID09PSBFdmVudHNBbGxvd2VkVHlwZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGFuZCBleGVjdXRlIGNvbnRyb2wgbW9kaWZ5IGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUN0cmxNb2RpZnkoY3RybDogTWdDb250cm9sLCBhY3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgY2Fubm90IG1vZGlmeSwgZG8gbm90aGluZ1xyXG4gICAgaWYgKGN0cmwgPT0gbnVsbCB8fCAhY3RybC5pc01vZGlmaWFibGUoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHN3aXRjaCAoYWN0KSB7XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT0RJRlkpO1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGFjdGlvbiBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgQWxsb3dlZEV2ZW50cyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBBY3RBbGxvd2VkKGFjdDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYWxsb3dlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0QWxsb3dFdmVudHMoKSkge1xyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLkFMTDpcclxuICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTpcclxuICAgICAgICAvLyBhbGxvdyBjcmVsaW5lIGV2ZW4gaW4gYWxsb3c9bm8uIHdlIGhhdmUgbm8gY2hvaWNlLiBSQyBtZWNoYW5pc20gaXMgZGlmZmVyZW50IHRoZW4gYmF0Y2guIGl0IHVzZXMgQUNUX0NSRUFMSU5FXHJcbiAgICAgICAgLy8gd2hlbiBpbiBjcmVhdGUgbW9kZS4gV2Ugd2lsbCBuZWVkIHRvIGNoYW5nZSBpdCBpbiB0aGUgZnV0dXJlIHNvIHRoYXQgd2hlbiB1c2VyIHJhaXNlcyBjcmVsaW5lIGV2ZW50IGl0IHdpbGwgbm90IHdvcmsuIGp1c3QgaW50ZXJuYWxseS5cclxuICAgICAgICBhbGxvd2VkID0gKGFjdCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgLy8gT25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGFsbG93ZWQgd2hlbiBydW5uaW5nIGluc2lkZSBhIG5vbiBpbnRlcmFjdGl2ZSBsb29wIHdoZW4gYWxsb3cgZXZlbnRzID0gWUVTLlxyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLk5PTl9JTlRFUkFDVElWRTpcclxuXHJcbiAgICAgICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST0xMQkFDSzpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGFsbG93ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gY29tbWl0cyB0aGUgcmVjb3JkIGFuZCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRyYW5zYWN0aW9uLCBpdCBwZXJmb3JtcyBvdGhlciBhY3Rpb25zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUmV2ZXJzaWJsZUV4aXRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0UmVjb3JkKHRhc2s6IFRhc2ssIGlzUmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgIGxldCByZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgIGxldCBpc1NlbGVjdGlvblRhYmxlOiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OLCBmYWxzZSk7XHJcbiAgICBsZXQgaXNOZXdSZWM6IGJvb2xlYW4gPSByZWMuaXNOZXdSZWMoKTtcclxuICAgIGxldCBzYXZlUHJldkN1cnJSZWM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHJlY01vZGlmaWVkOiBib29sZWFuID0gcmVjLk1vZGlmaWVkO1xyXG5cclxuICAgIGlmICghZHYucmVjSW5Nb2RpZmllZFRhYihyZWMuZ2V0SWQoKSkpXHJcbiAgICAgIHJlYy5jbGVhckZsYWdzSGlzdG9yeSgpO1xyXG4gICAgYXdhaXQgdGFzay5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLmNoZWNrQW5kQ29tbWl0KGlzUmV2ZXJzaWJsZUV4aXQsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgsIHRhc2suQ29uZmlybVVwZGF0ZU5vKTtcclxuICAgIGlmICh0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpKSB7XHJcbiAgICAgIC8vIG9uIGZhaWx1cmUgb2YgdGhlIHRyYW5zYWN0aW9uIHJlZW50ZXIgdGhlIHJlY29yZCBsZXZlbCBieVxyXG4gICAgICAvLyBleGVjdXRpbmcgXCJyZWNvcmQgcHJlZml4XCIgZm9yIHRoZSBzdWJmb3JtcyB3aGljaCBleGVjdXRlZFxyXG4gICAgICAvLyB0aGUgc3VmZml4IHN1Y2Nlc3NmdWxseVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRhc2suRGF0YVN5bmNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocmVjTW9kaWZpZWQpXHJcbiAgICAgICAgcmVjLnNldExhdGVDb21wdXRlKHRydWUpO1xyXG5cclxuICAgICAgLy8gUUNSIDc4MzA3MSBpZiBhZnRlciBjaGVja0FuZENvbW1pdCBhbGwgaWYgTy5LLiB0aGVcclxuICAgICAgLy8gcmV0dXJuIHRoZSBsZXZlbCBiYWNrIHRvIHRhc2sgbGV2ZWwgaW4gb3JkZXIgdG8gbGV0IHJlY19wcmZpeCB0byBiZSBleGVjdXRlZC5cclxuICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHRhc2sgbGV2ZWwgc2hvdWxkIGJlIFRBU0tfTEVWRUxfVEFTS1xyXG4gICAgICAvLyB0aGUgY2hlY2tBbmRDb21taXQgcHJvY2VzcyBjb3VsZCBoYXZlIGNoYW5nZSBpdFxyXG4gICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgIHJlYy5yZXNldFVwZGF0ZWQoKTtcclxuICAgICAgcmVjLnJlc2V0TW9kaWZpZWQoKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjOTgzMTc4OiBjYW5jZWwgdGhlIHJlY29yZCBvbmx5IGFmdGVyIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgICAvLyBoYW5kbGluZyB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHJlY29yZCB3YXNuJ3RcclxuICAgICAgLy8gbW9kaWZpZWRcclxuICAgICAgaWYgKCFyZWNNb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgIGlmIChpc05ld1JlYykge1xyXG4gICAgICAgICAgLy8gUUNSICM0Mjg5NjU6IHNhdmUgdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIEJFRk9SRVxyXG4gICAgICAgICAgLy8gXCJjYW5jZWwgZWRpdFwiIHNvIHRoZSBjb3JyZWN0IHJlY29yZCBpcyBzYXZlZFxyXG4gICAgICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHNhdmVQcmV2Q3VyclJlYyA9IGZhbHNlO1xyXG4gICAgICAgICAgcmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghcmVjLmdldEZvcmNlU2F2ZU9yZygpKVxyXG4gICAgICAgICAgYXdhaXQgZHYuY2FuY2VsRWRpdChFdmVudHNNYW5hZ2VyLlJFQUxfT05MWSwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUUNSICM5OTUyMjI6IGlmIHRoZSByZWNvcmQgd2FzIG1vZGlmaWVkIHRoZW4gc2F2ZSB0aGVcclxuICAgICAgLy8gb3JpZ2luYWwgcmVjb3JkIGFnYWluIGluIGNhc2UgYSB0YXNrIGxhdmVsIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIHdpbGwgZmFpbCB3aXRoIHJldHJ5IHN0cmF0ZWd5LiBCZWZvcmUgdGhpcyBmaXgsIGlmIHN1Y2hcclxuICAgICAgLy8gdGhpbmcgaGFwcGVuZWQgb24gYSByZWNvcmQgd2hpY2ggd2Fzbid0IHRoZSBmaXJzdCB0aGVuXHJcbiAgICAgIC8vIHRoZSBcImJlZ2luIHRhYmxlXCIgZXZlbnQgcmFpc2VkIGEgcmVjb3JkIHN1ZmZpeCBldmVudCBhbmRcclxuICAgICAgLy8gY2F1c2VkIFwiY2FuY2VsIGVkaXRcIi5cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzYXZlUHJldkN1cnJSZWMpXHJcbiAgICAgIGR2LnNldFByZXZDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbGJhY2sgZm9yIGluY3JlbWVudGFsIGxvY2F0ZSB0aW1lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jTG9jYXRlVGltZXJDQih0YXNrT2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGFza09iajtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrLCB0cnVlKTtcclxuXHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5DUkVNRU5UQUxfTE9DQVRFKTtcclxuICAgIHJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKHRhc2spO1xyXG4gICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgbGV0IHBhcmVudER2ID0gPERhdGFWaWV3PnBhcmVudFRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgcGFyZW50UmVjOiBSZWNvcmQgPSBwYXJlbnREdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gZG8gbm90IHRvdWNoIHRoZSBwYXJlbnQgcmVjb3JkIGlmIHRoZSBwYXJlbnQgZGF0YXZpZXcgaXMgJ2VtcHR5IGRhdGF2aWV3Jy5cclxuICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiBwYXJlbnRSZWMgIT0gbnVsbCAmJiBwYXJlbnRSZWMuTW9kaWZpZWQgJiYgIXBhcmVudER2LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIHBhcmVudFJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUpO1xyXG4gICAgICBhd2FpdCBwYXJlbnREdi5hZGRDdXJyVG9Nb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICgocGFyZW50RHYuZ2V0Q3VyclJlYygpKSkuU3luY2VkID0gdHJ1ZTtcclxuICAgICAgcGFyZW50RHYuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgbGV0IGRhdGFWaWV3RXhlY3V0ZUxvY2FsVXBkYXRlc0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHBhcmVudFRhc2suZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkV4ZWN1dGVMb2NhbFVwZGF0ZXMpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQgPSBhd2FpdCBwYXJlbnRUYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3RXhlY3V0ZUxvY2FsVXBkYXRlc0NvbW1hbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZU1zZzogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvckNvbnNvbGU6IHN0cmluZztcclxuICAgIGxldCBlcnJGb3JNc2dCb3g6IHN0cmluZztcclxuXHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcilcclxuICAgICAgZU1zZyA9ICg8U2VydmVyRXJyb3I+ZXgpLkdldE1lc3NhZ2UoKTtcclxuICAgIGVsc2VcclxuICAgICAgZU1zZyA9ICgoZXguTWVzc2FnZSAhPT0gbnVsbCkgPyBleC5NZXNzYWdlIDogZXguR2V0VHlwZSgpKTtcclxuXHJcbiAgICBlcnJGb3JDb25zb2xlID0gU3RyVXRpbC5nZXRDb25zb2xlRXJvclN0cmluZyhlTXNnKTtcclxuICAgIGVyckZvck1zZ0JveCA9IFN0clV0aWwuZ2V0TXNnQm94RXJvclN0cmluZyhlTXNnKTtcclxuXHJcbiAgICBpZiAoZXguSW5uZXJFeGNlcHRpb24gIT09IG51bGwpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4LklubmVyRXhjZXB0aW9uLCBlcnJGb3JDb25zb2xlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIShleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB8fCBMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coZXJyRm9yQ29uc29sZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPIDogaGFuZGxlIGVycm9yc1xyXG4gICAgbGV0IHNlbmRVbmxvYWRUb1NlcnZlcjogYm9vbGVhbiA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Db250ZXh0SUQgIT09IFJ1bnRpbWVDb250ZXh0QmFzZS5ub0NvbnRleHRJZDsgIC8vIHVubG9hZCB0aGUgY29udGV4dCBpbiB0aGUgc2VydmVyIG9ubHkgaWYgYSBjb250ZXh0IHdhcyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBzZXNzaW9uXHJcblxyXG4gICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAwO1xyXG5cclxuICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5CUktUQUJfU1RSX0VSUk9SKTtcclxuXHJcbiAgICBsZXQgc3R5bGU6IG51bWJlciA9IDE2O1xyXG4gICAgaWYgKGV4Lk1lc3NhZ2Uuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|