@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
|
@@ -1,1692 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ApplicationException, Debug, Int32, Int64, List, NNumber, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
|
3
|
-
import { Constants, InternalInterface, Logger, Misc, StorageAttribute, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
4
|
-
import { DataModificationTypes, DisplayConvertor, PIC, PropInterface } from '@magic-xpa/gui';
|
|
5
|
-
import { ConstInterface } from '../ConstInterface';
|
|
6
|
-
import { RecordsTable } from './RecordsTable';
|
|
7
|
-
import { Record } from './Record';
|
|
8
|
-
import { TaskBase } from '../tasks/TaskBase';
|
|
9
|
-
import { FieldsTableExt as FieldsTable } from './FieldsTable';
|
|
10
|
-
import { RecordOutOfDataViewException, RecordOutOfDataViewException_ExceptionType } from './RecordOutOfDataViewException';
|
|
11
|
-
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
|
12
|
-
import { XMLBasedDcValuesBuilder } from './XMLBasedDcValuesBuilder';
|
|
13
|
-
import { Field } from './Field';
|
|
14
|
-
import { EventSubType } from '../enums';
|
|
15
|
-
import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
|
|
16
|
-
import { FieldBase } from './FieldBase';
|
|
17
|
-
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
|
18
|
-
import { DataViewBase } from './DataViewBase';
|
|
19
|
-
import { AccessHelper } from '../AccessHelper';
|
|
20
|
-
import { MGDataCollection } from '../tasks/MGDataCollection';
|
|
21
|
-
export const SET_DISPLAYLINE_BY_DV = Int32.MinValue;
|
|
22
|
-
const COMPUTE_NEWREC_ON_CLIENT = 'C';
|
|
23
|
-
const UNKNOWN_RCMPS_NOT_INITED = 'M';
|
|
24
|
-
const UNKNOWN_RCMPS_FOUND = 'Y';
|
|
25
|
-
const INVOKED_FROM_OFFLINE_TASK = "-99999";
|
|
26
|
-
const CHUNK_CACHE_NEXT = 'N';
|
|
27
|
-
const CHUNK_CACHE_PREV = 'P';
|
|
28
|
-
const CHUNK_DV_BOTTOM = 'B';
|
|
29
|
-
const CHUNK_DV_TOP = 'T';
|
|
30
|
-
const COMPUTE_FLUSH_UPDATES = 'H';
|
|
31
|
-
const COMPUTE_NEWREC_ON_SERVER = 'S';
|
|
32
|
-
const END_DV_TAG = "</" + ConstInterface.MG_TAG_DATAVIEW + ">";
|
|
33
|
-
const RECOVERY_ACT_BEGIN_SCREEN = 'S';
|
|
34
|
-
const RECOVERY_ACT_BEGIN_TABLE = 'T';
|
|
35
|
-
const RECOVERY_ACT_CANCEL = 'C';
|
|
36
|
-
const RECOVERY_ACT_MOVE_DIRECTION_BEGIN = 'B';
|
|
37
|
-
const RECOVERY_ACT_NONE = 'N';
|
|
38
|
-
const TRANS_STAT_CLOSED = 'C';
|
|
39
|
-
const TRANS_STAT_OPENED = 'O';
|
|
40
|
-
export class DataView extends DataViewBase {
|
|
41
|
-
constructor(taskOrDataView) {
|
|
42
|
-
super();
|
|
43
|
-
this._cacheLruTimeStamp = 0;
|
|
44
|
-
this._changed = false;
|
|
45
|
-
this._chunkSize = 30;
|
|
46
|
-
this._chunkSizeExpression = 0;
|
|
47
|
-
this._computeBy = '\0';
|
|
48
|
-
this._currRecId = 0;
|
|
49
|
-
this._currRecIdx = 0;
|
|
50
|
-
this._dvPosValue = 0;
|
|
51
|
-
this._firstDv = true;
|
|
52
|
-
this._flushUpdates = false;
|
|
53
|
-
this._hasMainTable = true;
|
|
54
|
-
this._insertAt = ' ';
|
|
55
|
-
this.InLocalDataviewCommand = false;
|
|
56
|
-
this._lastCreatedRecId = 0;
|
|
57
|
-
this._lastSessionCounter = Int64.MinValue;
|
|
58
|
-
this._locateFirstRec = -1;
|
|
59
|
-
this._modifiedRecordsTab = null;
|
|
60
|
-
this._oldTopRecIdx = Int32.MinValue;
|
|
61
|
-
this._original = null;
|
|
62
|
-
this._pendingRecovery = RECOVERY_ACT_NONE;
|
|
63
|
-
this._prevCurrRec = null;
|
|
64
|
-
this._recordsTab = null;
|
|
65
|
-
this._recovery = ConstInterface.RECOVERY_NONE;
|
|
66
|
-
this._rmIdx = 0;
|
|
67
|
-
this._rmSize = 0;
|
|
68
|
-
this._skipParsing = false;
|
|
69
|
-
this._topRecId = 0;
|
|
70
|
-
this._topRecIdx = Int32.MinValue;
|
|
71
|
-
this._topRecIdxModified = false;
|
|
72
|
-
this._transCleared = false;
|
|
73
|
-
this._unknownRcmp = UNKNOWN_RCMPS_NOT_INITED;
|
|
74
|
-
this.IsOneWayKey = false;
|
|
75
|
-
this._includesFirst = false;
|
|
76
|
-
this._includesLast = false;
|
|
77
|
-
this._serverTransCacheEmpty = true;
|
|
78
|
-
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = null;
|
|
79
|
-
this.DBViewSize = 0;
|
|
80
|
-
this.Dvcount = 0;
|
|
81
|
-
this.TotalRecordsCount = 0;
|
|
82
|
-
this.RecordsBeforeCurrentView = 0;
|
|
83
|
-
if (taskOrDataView instanceof TaskBase) {
|
|
84
|
-
this._task = taskOrDataView;
|
|
85
|
-
this._fieldsTab = new FieldsTable();
|
|
86
|
-
this._recordsTab = new RecordsTable(true);
|
|
87
|
-
this._modifiedRecordsTab = new RecordsTable(false);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
Object.assign(this, taskOrDataView);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
set InsertAt(value) {
|
|
94
|
-
this._insertAt = value;
|
|
95
|
-
}
|
|
96
|
-
get InsertAt() {
|
|
97
|
-
return this._insertAt;
|
|
98
|
-
}
|
|
99
|
-
get CurrRec() {
|
|
100
|
-
return this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER;
|
|
101
|
-
}
|
|
102
|
-
set CurrRec(value) {
|
|
103
|
-
if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null && value === null) {
|
|
104
|
-
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.resetDcValueId();
|
|
105
|
-
}
|
|
106
|
-
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = value;
|
|
107
|
-
if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null) {
|
|
108
|
-
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.SetDcValueId();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
get FlushUpdates() {
|
|
112
|
-
return this._flushUpdates;
|
|
113
|
-
}
|
|
114
|
-
get HasMainTable() {
|
|
115
|
-
return this._hasMainTable;
|
|
116
|
-
}
|
|
117
|
-
get CurrentRecId() {
|
|
118
|
-
return this._currRecId;
|
|
119
|
-
}
|
|
120
|
-
get FirstRecord() {
|
|
121
|
-
return this._recordsTab.getRecByIdx(0);
|
|
122
|
-
}
|
|
123
|
-
get LastRecord() {
|
|
124
|
-
return this._recordsTab.getRecByIdx(this._recordsTab.getSize() - 1);
|
|
125
|
-
}
|
|
126
|
-
Init() {
|
|
127
|
-
this.init();
|
|
128
|
-
}
|
|
129
|
-
IncludesFirst() {
|
|
130
|
-
return this._includesFirst;
|
|
131
|
-
}
|
|
132
|
-
get ServerTransactionCacheEmpty() {
|
|
133
|
-
return this._serverTransCacheEmpty;
|
|
134
|
-
}
|
|
135
|
-
IncludesLast() {
|
|
136
|
-
return this._includesLast;
|
|
137
|
-
}
|
|
138
|
-
fillHeaderData(parser) {
|
|
139
|
-
while (this.initHeaderInnerObjects(parser, parser.getNextTag())) {
|
|
140
|
-
}
|
|
141
|
-
this.Dvcount = this._task.ctl_itm_4_parent_vee(0, 1);
|
|
142
|
-
}
|
|
143
|
-
initHeaderInnerObjects(parser, foundTagName) {
|
|
144
|
-
if (foundTagName === null)
|
|
145
|
-
return false;
|
|
146
|
-
if (foundTagName === XMLConstants.MG_TAG_DVHEADER) {
|
|
147
|
-
Logger.Instance.WriteDevToLog("dvheader found");
|
|
148
|
-
this.getHeaderAttributes(parser);
|
|
149
|
-
this._fieldsTab.fillData(parser, this);
|
|
150
|
-
this._fieldsTab.setRMPos(this._rmSize, this._rmIdx);
|
|
151
|
-
}
|
|
152
|
-
else if (foundTagName === ('/' + XMLConstants.MG_TAG_DVHEADER)) {
|
|
153
|
-
parser.setCurrIndex2EndOfTag();
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
else
|
|
157
|
-
return false;
|
|
158
|
-
return true;
|
|
159
|
-
}
|
|
160
|
-
getHeaderAttributes(parser) {
|
|
161
|
-
let tokensVector;
|
|
162
|
-
let tag;
|
|
163
|
-
let attribute;
|
|
164
|
-
let valueStr;
|
|
165
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
166
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
167
|
-
tag = parser.getXMLsubstring(endContext);
|
|
168
|
-
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_DVHEADER) + XMLConstants.MG_TAG_DVHEADER.length);
|
|
169
|
-
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
170
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
171
|
-
attribute = (tokensVector.get_Item(j));
|
|
172
|
-
valueStr = (tokensVector.get_Item(j + 1));
|
|
173
|
-
switch (attribute) {
|
|
174
|
-
case ConstInterface.MG_ATTR_RMPOS: {
|
|
175
|
-
let i = valueStr.indexOf(",");
|
|
176
|
-
if (i > -1) {
|
|
177
|
-
this._rmSize = NNumber.Parse(valueStr.substr(0, i));
|
|
178
|
-
this._rmIdx = NNumber.Parse(valueStr.substr(i + 1));
|
|
179
|
-
}
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
case ConstInterface.MG_ATTR_COMPUTE_BY:
|
|
183
|
-
this._computeBy = valueStr[0];
|
|
184
|
-
if (this._computeBy === COMPUTE_FLUSH_UPDATES) {
|
|
185
|
-
this._computeBy = COMPUTE_NEWREC_ON_SERVER;
|
|
186
|
-
this._flushUpdates = true;
|
|
187
|
-
}
|
|
188
|
-
else
|
|
189
|
-
this._flushUpdates = false;
|
|
190
|
-
break;
|
|
191
|
-
case ConstInterface.MG_ATTR_HAS_MAIN_TBL:
|
|
192
|
-
this._hasMainTable = XmlParser.getBoolean(valueStr);
|
|
193
|
-
break;
|
|
194
|
-
case ConstInterface.MG_ATTR_CHUNK_SIZE:
|
|
195
|
-
this._chunkSize = XmlParser.getInt(valueStr);
|
|
196
|
-
break;
|
|
197
|
-
case ConstInterface.MG_ATTR_CHUNK_SIZE_EXPRESSION:
|
|
198
|
-
this._chunkSizeExpression = XmlParser.getInt(valueStr);
|
|
199
|
-
break;
|
|
200
|
-
default:
|
|
201
|
-
Logger.Instance.WriteExceptionToLogWithMsg("Unknown attribute for <" + XMLConstants.MG_TAG_DVHEADER + "> tag: " +
|
|
202
|
-
attribute);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
parser.setCurrIndex(++endContext);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.getHeaderAttributes(): out of bounds");
|
|
210
|
-
}
|
|
211
|
-
fillData(parser) {
|
|
212
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
-
this._skipParsing = false;
|
|
214
|
-
while (yield this.initInnerObjects(parser, parser.getNextTag())) {
|
|
215
|
-
}
|
|
216
|
-
this.ResetFirstDv();
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
GetTransactionBegin() {
|
|
220
|
-
let transBegin = '\0';
|
|
221
|
-
let transBeginProp = this._task.getProp(PropInterface.PROP_TYPE_TRASACTION_BEGIN);
|
|
222
|
-
if (transBeginProp !== null) {
|
|
223
|
-
transBegin = (transBeginProp.GetComputedValue()).charAt(0);
|
|
224
|
-
}
|
|
225
|
-
return transBegin;
|
|
226
|
-
}
|
|
227
|
-
initInnerObjects(parser, foundTagName) {
|
|
228
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
-
let form = this._task.getForm();
|
|
230
|
-
if (foundTagName == null)
|
|
231
|
-
return false;
|
|
232
|
-
if (foundTagName === (ConstInterface.MG_TAG_DATAVIEW)) {
|
|
233
|
-
let invalidate = yield this.getAttributes(parser);
|
|
234
|
-
if (this._skipParsing) {
|
|
235
|
-
let endContext = parser.getXMLdata().indexOf(END_DV_TAG, parser.getCurrIndex());
|
|
236
|
-
parser.setCurrIndex(endContext + END_DV_TAG.length);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
this.fillExecStack(parser);
|
|
240
|
-
this.fillDataDc(parser);
|
|
241
|
-
if (invalidate && form != null)
|
|
242
|
-
form.SetTableItemsCount(0, true);
|
|
243
|
-
let taskRefreshType = this._recordsTab.fillData(this, this._insertAt, parser);
|
|
244
|
-
if (form != null) {
|
|
245
|
-
if (form.Opened) {
|
|
246
|
-
if (this._insertAt === 'B' && (invalidate || this._recordsTab.InsertedRecordsCount > 0)) {
|
|
247
|
-
if (invalidate || !this._task.getForm().isTableWithPagination()) {
|
|
248
|
-
form.SetTableItemsCount(0, true);
|
|
249
|
-
form.setTableItemsCount(false);
|
|
250
|
-
}
|
|
251
|
-
else
|
|
252
|
-
form.InsertTableItems(0, this._recordsTab.InsertedRecordsCount);
|
|
253
|
-
}
|
|
254
|
-
else
|
|
255
|
-
form.setTableItemsCount(false);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
if (this.CurrRec != null && this.CurrRec.InRecompute && taskRefreshType === Constants.TASK_REFRESH_NONE)
|
|
259
|
-
taskRefreshType = Constants.TASK_REFRESH_CURR_REC;
|
|
260
|
-
if (invalidate) {
|
|
261
|
-
taskRefreshType = Constants.TASK_REFRESH_FORM;
|
|
262
|
-
if (this._task.IsSubForm)
|
|
263
|
-
this.getTask().DoSubformPrefixSuffix = true;
|
|
264
|
-
}
|
|
265
|
-
this.getTask().SetRefreshType(taskRefreshType);
|
|
266
|
-
this.UpdateDataviewAfterInsert();
|
|
267
|
-
let newRecId = this._recordsTab.getInitialCurrRecId();
|
|
268
|
-
if (newRecId !== Int32.MinValue && (this._recovery === ConstInterface.RECOVERY_NONE || this._firstDv)) {
|
|
269
|
-
if (this._firstDv && this._recovery === ConstInterface.RECOVERY_NONE &&
|
|
270
|
-
(this._task.getLevel().charCodeAt(0) === 0 || this._task.getLevel() === Constants.TASK_LEVEL_TASK))
|
|
271
|
-
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
272
|
-
this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
|
|
273
|
-
if (newRecId !== this._currRecId) {
|
|
274
|
-
yield this.setCurrRec(newRecId, !this._firstDv);
|
|
275
|
-
this._original = this.CurrRec.replicate();
|
|
276
|
-
if (this._firstDv)
|
|
277
|
-
this.takeFldValsFromCurrRec();
|
|
278
|
-
if (this._task.getForm() != null)
|
|
279
|
-
(this._task.getForm()).updateDisplayLineByDV();
|
|
280
|
-
}
|
|
281
|
-
else
|
|
282
|
-
this.takeFldValsFromCurrRec();
|
|
283
|
-
}
|
|
284
|
-
else if (invalidate && this._recordsTab.getSize() > 0) {
|
|
285
|
-
if (form == null || form.isScreenMode()) {
|
|
286
|
-
try {
|
|
287
|
-
yield this.setCurrRecByIdx(0, false, true, false, 0);
|
|
288
|
-
}
|
|
289
|
-
catch (exception) {
|
|
290
|
-
if (exception instanceof RecordOutOfDataViewException) {
|
|
291
|
-
}
|
|
292
|
-
else
|
|
293
|
-
throw exception;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
|
|
298
|
-
this.setTopRecIdx(0);
|
|
299
|
-
if (this._task.getForm() != null)
|
|
300
|
-
this._task.getForm().SetTableTopIndex();
|
|
301
|
-
try {
|
|
302
|
-
yield this.setCurrRecByIdx(0, false, true, true, 0);
|
|
303
|
-
if (this._task.getForm() != null)
|
|
304
|
-
(this._task.getForm()).updateDisplayLineByDV();
|
|
305
|
-
}
|
|
306
|
-
catch (exception) {
|
|
307
|
-
if (exception instanceof RecordOutOfDataViewException) {
|
|
308
|
-
}
|
|
309
|
-
else
|
|
310
|
-
throw exception;
|
|
311
|
-
}
|
|
312
|
-
if (this._task.getLevel() === Constants.TASK_LEVEL_CONTROL && this._task.getLastParkedCtrl() != null)
|
|
313
|
-
this._task.getLastParkedCtrl().resetPrevVal();
|
|
314
|
-
}
|
|
315
|
-
this.saveOriginal();
|
|
316
|
-
this._fieldsTab.invalidate(true, FieldBase.CLEAR_FLAGS);
|
|
317
|
-
}
|
|
318
|
-
if (this._firstDv)
|
|
319
|
-
this.setPrevCurrRec();
|
|
320
|
-
if (invalidate && this._task.IsSubForm)
|
|
321
|
-
this._task.getForm().getSubFormCtrl().RefreshOnVisible = false;
|
|
322
|
-
if (this._recovery === ConstInterface.RECOVERY_NONE) {
|
|
323
|
-
if (this.getTask().getAfterRetry(ConstInterface.RECOVERY_RETRY) &&
|
|
324
|
-
!this.getTask().IsAfterRetryBeforeBuildXML)
|
|
325
|
-
this._task.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
let transBegin = this.GetTransactionBegin();
|
|
329
|
-
let stopExecution = true;
|
|
330
|
-
switch (this._recovery) {
|
|
331
|
-
case ConstInterface.RECOVERY_ROLLBACK:
|
|
332
|
-
if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
|
|
333
|
-
if (this._task.getMode() === Constants.TASK_MODE_DELETE ||
|
|
334
|
-
!this._task.IsInteractive)
|
|
335
|
-
stopExecution = false;
|
|
336
|
-
else {
|
|
337
|
-
this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
|
|
338
|
-
this.CurrRec.restart(this.CurrRec.getMode());
|
|
339
|
-
this.CurrRec.resetModified();
|
|
340
|
-
this._original = this.CurrRec.replicate();
|
|
341
|
-
this._pendingRecovery = RECOVERY_ACT_CANCEL;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
else if (transBegin !== ConstInterface.TRANS_NONE) {
|
|
345
|
-
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
346
|
-
this._pendingRecovery = RECOVERY_ACT_BEGIN_TABLE;
|
|
347
|
-
this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
|
|
348
|
-
}
|
|
349
|
-
break;
|
|
350
|
-
case ConstInterface.RECOVERY_RETRY:
|
|
351
|
-
this.RecoveryRetry(transBegin);
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
if (stopExecution) {
|
|
355
|
-
AccessHelper.eventsManager.setStopExecution(true);
|
|
356
|
-
this.getTask().TaskSuffixExecuted = false;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
else if (foundTagName === '/' + ConstInterface.MG_TAG_DATAVIEW) {
|
|
362
|
-
if (this._includesFirst && this._includesLast && this.isEmpty()) {
|
|
363
|
-
this._currRecId = Int32.MinValue;
|
|
364
|
-
this._currRecIdx = Int32.MinValue;
|
|
365
|
-
this.CurrRec = null;
|
|
366
|
-
this.setTopRecIdx(Int32.MinValue);
|
|
367
|
-
}
|
|
368
|
-
parser.setCurrIndex2EndOfTag();
|
|
369
|
-
return false;
|
|
370
|
-
}
|
|
371
|
-
else
|
|
372
|
-
return false;
|
|
373
|
-
return true;
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
RecoveryRetry(transBegin) {
|
|
377
|
-
if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
|
|
378
|
-
this._task.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
379
|
-
this.getTask().setTransactionFailed(true);
|
|
380
|
-
this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
|
|
381
|
-
this.CurrRec.restart(this.CurrRec.getMode());
|
|
382
|
-
if (!this._firstDv) {
|
|
383
|
-
this.takeFldValsFromCurrRec();
|
|
384
|
-
this._pendingRecovery = RECOVERY_ACT_MOVE_DIRECTION_BEGIN;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
else if (transBegin !== ConstInterface.TRANS_NONE) {
|
|
388
|
-
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
389
|
-
this._pendingRecovery = RECOVERY_ACT_BEGIN_SCREEN;
|
|
390
|
-
this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
|
|
391
|
-
this.getTask().setTransactionFailed(true);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
InsertSingleRecord(record) {
|
|
395
|
-
this._recordsTab.InsertedRecordsCount = 0;
|
|
396
|
-
this._recordsTab.InsertRecord(this._insertAt, record);
|
|
397
|
-
this.UpdateDataviewAfterInsert();
|
|
398
|
-
}
|
|
399
|
-
UpdateDataviewAfterInsert() {
|
|
400
|
-
if (this._insertAt === 'B') {
|
|
401
|
-
let newRecs = this._recordsTab.InsertedRecordsCount;
|
|
402
|
-
if (this._currRecIdx !== Int32.MinValue)
|
|
403
|
-
this._currRecIdx += newRecs;
|
|
404
|
-
if (this._topRecIdx !== Int32.MinValue)
|
|
405
|
-
this._topRecIdx += newRecs;
|
|
406
|
-
if (this._oldTopRecIdx !== Int32.MinValue)
|
|
407
|
-
this._oldTopRecIdx += newRecs;
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
getAttributes(parser) {
|
|
411
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
412
|
-
let tokensVector;
|
|
413
|
-
let tag;
|
|
414
|
-
let boolVal;
|
|
415
|
-
let dataViewCommand = null;
|
|
416
|
-
let isEmptyDataview = false;
|
|
417
|
-
this._recovery = ConstInterface.RECOVERY_NONE;
|
|
418
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
419
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
420
|
-
tag = parser.getXMLsubstring(endContext);
|
|
421
|
-
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_DATAVIEW) + ConstInterface.MG_TAG_DATAVIEW.length);
|
|
422
|
-
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
423
|
-
this._insertAt = ' ';
|
|
424
|
-
let invalidate = this.peekInvalidate(tokensVector);
|
|
425
|
-
this._locateFirstRec = 0;
|
|
426
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
427
|
-
let attribute = (tokensVector.get_Item(j));
|
|
428
|
-
let valueStr = (tokensVector.get_Item(j + 1));
|
|
429
|
-
switch (attribute) {
|
|
430
|
-
case ConstInterface.MG_ATTR_INSERT_AT:
|
|
431
|
-
this._insertAt = valueStr[0];
|
|
432
|
-
break;
|
|
433
|
-
case ConstInterface.MG_ATTR_INCLUDE_FIRST:
|
|
434
|
-
boolVal = XmlParser.getBoolean(valueStr);
|
|
435
|
-
this.SetIncludesFirst(boolVal);
|
|
436
|
-
break;
|
|
437
|
-
case ConstInterface.MG_ATTR_INCLUDE_LAST:
|
|
438
|
-
boolVal = XmlParser.getBoolean(valueStr);
|
|
439
|
-
this.SetIncludesLast(boolVal);
|
|
440
|
-
break;
|
|
441
|
-
case ConstInterface.MG_ATTR_IS_ONEWAY_KEY:
|
|
442
|
-
boolVal = XmlParser.getBoolean(valueStr);
|
|
443
|
-
this.SetOneWayKey(boolVal);
|
|
444
|
-
break;
|
|
445
|
-
case ConstInterface.MG_ATTR_DBVIEWSIZE:
|
|
446
|
-
this.DBViewSize = XmlParser.getInt(valueStr);
|
|
447
|
-
break;
|
|
448
|
-
case ConstInterface.MG_ATTR_INVALIDATE:
|
|
449
|
-
{
|
|
450
|
-
}
|
|
451
|
-
break;
|
|
452
|
-
case ConstInterface.MG_ATTR_TOP_REC_ID:
|
|
453
|
-
this._topRecId = NNumber.Parse(valueStr);
|
|
454
|
-
break;
|
|
455
|
-
case ConstInterface.MG_ATTR_TASKMODE:
|
|
456
|
-
if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_NONE || invalidate)
|
|
457
|
-
this._task.setOriginalTaskMode(valueStr);
|
|
458
|
-
this._task.setProp(PropInterface.PROP_TYPE_TASK_MODE, valueStr);
|
|
459
|
-
break;
|
|
460
|
-
case ConstInterface.MG_ATTR_EMPTY_DATAVIEW:
|
|
461
|
-
isEmptyDataview = true;
|
|
462
|
-
break;
|
|
463
|
-
case XMLConstants.MG_ATTR_TASKID:
|
|
464
|
-
continue;
|
|
465
|
-
case ConstInterface.MG_ATTR_LOW_ID:
|
|
466
|
-
this._lastCreatedRecId = NNumber.Parse(valueStr);
|
|
467
|
-
break;
|
|
468
|
-
case ConstInterface.MG_ATTR_TRANS_STAT:
|
|
469
|
-
let transStat = valueStr[0];
|
|
470
|
-
switch (transStat) {
|
|
471
|
-
case TRANS_STAT_OPENED:
|
|
472
|
-
dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
|
|
473
|
-
yield this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
|
|
474
|
-
break;
|
|
475
|
-
case TRANS_STAT_CLOSED:
|
|
476
|
-
dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), false);
|
|
477
|
-
yield this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
|
|
478
|
-
this.getTask().setTransactionFailed(false);
|
|
479
|
-
break;
|
|
480
|
-
default:
|
|
481
|
-
break;
|
|
482
|
-
}
|
|
483
|
-
break;
|
|
484
|
-
case ConstInterface.MG_ATTR_RECOVERY:
|
|
485
|
-
if (this._task.IsTryingToStop)
|
|
486
|
-
this.getTask().setTryingToStop(false);
|
|
487
|
-
this.getTask().resetExecEndTask();
|
|
488
|
-
this._recovery = valueStr[0];
|
|
489
|
-
break;
|
|
490
|
-
case ConstInterface.MG_ATTR_DVPOS_VALUE:
|
|
491
|
-
this._dvPosValue = NNumber.Parse(valueStr);
|
|
492
|
-
break;
|
|
493
|
-
case ConstInterface.MG_ATTR_LOCATE_FIRST_ID:
|
|
494
|
-
this._locateFirstRec = NNumber.Parse(valueStr);
|
|
495
|
-
break;
|
|
496
|
-
case ConstInterface.MG_ATTR_OFFSET:
|
|
497
|
-
break;
|
|
498
|
-
case ConstInterface.MG_ATTR_USER_SORT:
|
|
499
|
-
let form = this._task.getForm();
|
|
500
|
-
form.clearTableColumnSortMark(XmlParser.getBoolean(valueStr));
|
|
501
|
-
break;
|
|
502
|
-
case ConstInterface.MG_ATTR_VAL_TOTAL_RECORDS_COUNT:
|
|
503
|
-
this.TotalRecordsCount = XmlParser.getInt(valueStr);
|
|
504
|
-
break;
|
|
505
|
-
case ConstInterface.MG_ATTR_VAL_RECORDS_BEFORE_CURRENT_VIEW:
|
|
506
|
-
this.RecordsBeforeCurrentView = XmlParser.getInt(valueStr);
|
|
507
|
-
break;
|
|
508
|
-
case ConstInterface.MG_ATTR_VAL_SERVER_TRANS_CACHE_EMPTY:
|
|
509
|
-
this._serverTransCacheEmpty = XmlParser.getBoolean(valueStr);
|
|
510
|
-
break;
|
|
511
|
-
default:
|
|
512
|
-
Logger.Instance.WriteExceptionToLogWithMsg("Unknown attribute for <" + ConstInterface.MG_TAG_DATAVIEW + "> tag: " + attribute);
|
|
513
|
-
break;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
this.setEmptyDataview(isEmptyDataview);
|
|
517
|
-
parser.setCurrIndex(++endContext);
|
|
518
|
-
return invalidate;
|
|
519
|
-
}
|
|
520
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.getAttributes(): out of bounds");
|
|
521
|
-
return false;
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
SetOneWayKey(val) {
|
|
525
|
-
this.IsOneWayKey = val;
|
|
526
|
-
}
|
|
527
|
-
SetIncludesLast(val) {
|
|
528
|
-
this._includesLast = val;
|
|
529
|
-
}
|
|
530
|
-
SetIncludesFirst(val) {
|
|
531
|
-
let prevIncludeFirst = this._includesFirst;
|
|
532
|
-
this._includesFirst = val;
|
|
533
|
-
if (this._includesFirst !== prevIncludeFirst) {
|
|
534
|
-
let form = this._task.getForm();
|
|
535
|
-
if (form !== null) {
|
|
536
|
-
form.SetTableItemsCount(0, true);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
fillDataDc(parser) {
|
|
541
|
-
let dcvBuilder = new XMLBasedDcValuesBuilder();
|
|
542
|
-
let foundTagName = parser.getNextTag();
|
|
543
|
-
while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_DC_VALS) {
|
|
544
|
-
let dcValsPosition = parser.getCurrIndex();
|
|
545
|
-
dcvBuilder.SerializedDCVals = parser.ReadToEndOfCurrentElement();
|
|
546
|
-
let dcv = dcvBuilder.Build();
|
|
547
|
-
if (dcv !== null)
|
|
548
|
-
this.AddDcValues(dcv);
|
|
549
|
-
else
|
|
550
|
-
Logger.Instance.WriteExceptionToLogWithMsg("Error while parsing DC values at position " + dcValsPosition);
|
|
551
|
-
foundTagName = parser.getNextTag();
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
AddDcValues(dcv) {
|
|
555
|
-
this._dcValsCollection.Add(dcv.getId().toString(), dcv);
|
|
556
|
-
}
|
|
557
|
-
fillExecStack(parser) {
|
|
558
|
-
let foundTagName = parser.getNextTag();
|
|
559
|
-
let execStackTagExists = false;
|
|
560
|
-
while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_EXEC_STACK_ENTRY) {
|
|
561
|
-
this.fillInnerExecStack(parser);
|
|
562
|
-
foundTagName = parser.getNextTag();
|
|
563
|
-
execStackTagExists = true;
|
|
564
|
-
}
|
|
565
|
-
if (execStackTagExists) {
|
|
566
|
-
AccessHelper.eventsManager.reverseServerExecStack();
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
fillInnerExecStack(parser) {
|
|
570
|
-
let tokensVector;
|
|
571
|
-
const endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
|
572
|
-
let attribute;
|
|
573
|
-
let taskId = "";
|
|
574
|
-
let handlerId = "";
|
|
575
|
-
let operIdx = 0;
|
|
576
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
577
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
578
|
-
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_EXEC_STACK_ENTRY) + ConstInterface.MG_TAG_EXEC_STACK_ENTRY.length);
|
|
579
|
-
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
580
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
581
|
-
attribute = (tokensVector.get_Item(j));
|
|
582
|
-
let valueStr = (tokensVector.get_Item(j + 1));
|
|
583
|
-
switch (attribute) {
|
|
584
|
-
case XMLConstants.MG_ATTR_TASKID:
|
|
585
|
-
taskId = valueStr;
|
|
586
|
-
break;
|
|
587
|
-
case ConstInterface.MG_ATTR_HANDLERID:
|
|
588
|
-
handlerId = valueStr;
|
|
589
|
-
break;
|
|
590
|
-
case ConstInterface.MG_ATTR_OPER_IDX:
|
|
591
|
-
operIdx = XmlParser.getInt(valueStr);
|
|
592
|
-
break;
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
AccessHelper.eventsManager.pushServerExecStack(taskId, handlerId, operIdx);
|
|
596
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
|
597
|
-
}
|
|
598
|
-
else
|
|
599
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.fillInnerExecStack() out of bounds");
|
|
600
|
-
}
|
|
601
|
-
peekInvalidate(tokensVector) {
|
|
602
|
-
let sessionCounter = CommandsProcessorManager.GetCommandsProcessor().GetSessionCounter();
|
|
603
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
604
|
-
let attribute = tokensVector.get_Item(j);
|
|
605
|
-
if (attribute === (ConstInterface.MG_ATTR_INVALIDATE)) {
|
|
606
|
-
let valueStr = tokensVector.get_Item(j + 1);
|
|
607
|
-
if (XmlParser.getBoolean(valueStr)) {
|
|
608
|
-
if (sessionCounter < this._lastSessionCounter)
|
|
609
|
-
this._skipParsing = true;
|
|
610
|
-
else {
|
|
611
|
-
this._lastSessionCounter = sessionCounter;
|
|
612
|
-
this.clear();
|
|
613
|
-
return true;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
return false;
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
return false;
|
|
620
|
-
}
|
|
621
|
-
getFieldByName(fldName) {
|
|
622
|
-
if (this._fieldsTab !== null)
|
|
623
|
-
return this._fieldsTab.getField(fldName);
|
|
624
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.getField(String): There is no fieldsTab object");
|
|
625
|
-
return null;
|
|
626
|
-
}
|
|
627
|
-
buildXML(message) {
|
|
628
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
629
|
-
let dcv;
|
|
630
|
-
let taskTag = this._task.getTaskTag();
|
|
631
|
-
let brkLevelIndex = this._task.getBrkLevelIndex();
|
|
632
|
-
let currRecDeleted = false;
|
|
633
|
-
let serverParent;
|
|
634
|
-
let contextTask = (this.getTask().GetContextTask());
|
|
635
|
-
let invokingTaskTag = contextTask.IsOffline ? INVOKED_FROM_OFFLINE_TASK : contextTask.getTaskTag();
|
|
636
|
-
message.Append("\n <" + ConstInterface.MG_TAG_DATAVIEW + " " + XMLConstants.MG_ATTR_TASKID + "=\"" +
|
|
637
|
-
taskTag + "\"");
|
|
638
|
-
message.Append(" " + ConstInterface.MG_ATTR_TASKLEVEL + "=\"" + brkLevelIndex + "\"");
|
|
639
|
-
serverParent = "0";
|
|
640
|
-
let triggeringTask = this.getTask().getTriggeringTask();
|
|
641
|
-
if (triggeringTask != null) {
|
|
642
|
-
if (triggeringTask.IsOffline) {
|
|
643
|
-
let ctlIdx = triggeringTask.getCtlIdx();
|
|
644
|
-
let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
|
|
645
|
-
serverParent = mainPrg.getTaskTag();
|
|
646
|
-
}
|
|
647
|
-
else
|
|
648
|
-
serverParent = triggeringTask.getTaskTag();
|
|
649
|
-
}
|
|
650
|
-
if (this._currRecId > Int32.MinValue) {
|
|
651
|
-
if (this.CurrRec != null)
|
|
652
|
-
message.Append(" " + ConstInterface.MG_ATTR_CURR_REC + "=\"" + this._currRecId + "\"");
|
|
653
|
-
message.Append(" " + ConstInterface.MG_ATTR_TASKMODE + "=\"" + this._task.getMode() + "\"");
|
|
654
|
-
if (this._transCleared && !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI)) {
|
|
655
|
-
message.Append(" " + ConstInterface.MG_ATTR_TRANS_CLEARED + "=\"1\"");
|
|
656
|
-
this._transCleared = false;
|
|
657
|
-
}
|
|
658
|
-
message.Append(" " + ConstInterface.MG_ATTR_INVOKER_ID + "=\"" + invokingTaskTag + "," + serverParent + "\"");
|
|
659
|
-
if (yield this.getTask().isCached())
|
|
660
|
-
message.Append(" " + ConstInterface.MG_ATTR_DVPOS_VALUE + "=\"" + this._dvPosValue + "\"");
|
|
661
|
-
message.Append(" " + ConstInterface.MG_ATTR_LOOP_COUNTER + "=\"" + this.getTask().getLoopCounter() + "\"");
|
|
662
|
-
if (this._task.IsSubForm) {
|
|
663
|
-
let subformCtrl = this._task.getForm().getSubFormCtrl();
|
|
664
|
-
if (!subformCtrl.isVisible() &&
|
|
665
|
-
!(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)))
|
|
666
|
-
message.Append(" " + ConstInterface.MG_ATTR_SUBFORM_VISIBLE + "=\"0\"");
|
|
667
|
-
}
|
|
668
|
-
if (!this._task.IsInteractive)
|
|
669
|
-
message.Append(" " + ConstInterface.MG_ATTR_TASK_COUNTER + "=\"" + this.getTask().getCounter() + "\"");
|
|
670
|
-
if (this._task != null && this._task.GetComputedProperty(PropInterface.PROP_TYPE_PRELOAD_VIEW).GetComputedValueBoolean()) {
|
|
671
|
-
message.Append(" " + ConstInterface.MG_ATTR_LAST_REC_ID + "=\"" +
|
|
672
|
-
(this._recordsTab.getRecByIdx(this.getSize() - 1).getId()) + "\"");
|
|
673
|
-
message.Append(" " + ConstInterface.MG_ATTR_OLD_FIRST_REC_ID + "=\"" +
|
|
674
|
-
this._recordsTab.getRecByIdx(0).getId() + "\"");
|
|
675
|
-
}
|
|
676
|
-
if (this._task.IsInteractive) {
|
|
677
|
-
let form = this._task.getForm();
|
|
678
|
-
if (form != null && this._recordsTab.getSize() > 1) {
|
|
679
|
-
message.Append(" " + ConstInterface.MG_ATTR_CURR_REC_POS_IN_FORM + "=\"" +
|
|
680
|
-
form.getCurrRecPosInForm() + "\"");
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
message.Append(XMLConstants.TAG_CLOSE);
|
|
684
|
-
if (this.getTask().ResetRange || this.getTask().UserRngs != null) {
|
|
685
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.USER_RANGES);
|
|
686
|
-
if (this.getTask().ResetRange) {
|
|
687
|
-
message.Append(" " + ConstInterface.CLEAR_RANGE + "=\"1\"");
|
|
688
|
-
this.getTask().ResetRange = false;
|
|
689
|
-
}
|
|
690
|
-
if (this.getTask().UserRngs != null) {
|
|
691
|
-
this.getTask().buildXMLForRngs(message, this.getTask().UserRngs, false);
|
|
692
|
-
this.getTask().UserRngs.Clear();
|
|
693
|
-
this.getTask().UserRngs = null;
|
|
694
|
-
}
|
|
695
|
-
else
|
|
696
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
697
|
-
}
|
|
698
|
-
if (this.getTask().ResetLocate || this.getTask().UserLocs != null) {
|
|
699
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.USER_LOCATES);
|
|
700
|
-
if (this.getTask().ResetLocate) {
|
|
701
|
-
message.Append(" " + ConstInterface.CLEAR_LOCATES + "=\"1\"");
|
|
702
|
-
this.getTask().ResetLocate = false;
|
|
703
|
-
}
|
|
704
|
-
if (this.getTask().UserLocs != null) {
|
|
705
|
-
this.getTask().buildXMLForRngs(message, this.getTask().UserLocs, true);
|
|
706
|
-
this.getTask().UserLocs.Clear();
|
|
707
|
-
this.getTask().UserLocs = null;
|
|
708
|
-
}
|
|
709
|
-
else
|
|
710
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
711
|
-
}
|
|
712
|
-
if (this.getTask().ResetSort || this.getTask().UserSorts != null) {
|
|
713
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_SORTS);
|
|
714
|
-
if (this.getTask().ResetSort) {
|
|
715
|
-
message.Append(" " + ConstInterface.CLEAR_SORTS + "=\"1\"");
|
|
716
|
-
this.getTask().ResetSort = false;
|
|
717
|
-
}
|
|
718
|
-
if (this.getTask().UserSorts != null)
|
|
719
|
-
this.getTask().buildXMLForSorts(message);
|
|
720
|
-
else
|
|
721
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
722
|
-
}
|
|
723
|
-
if (yield this.getTask().isCached()) {
|
|
724
|
-
let delList = this.getTask().getTaskCache().getDeletedListToXML();
|
|
725
|
-
if (delList !== "") {
|
|
726
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DEL_LIST);
|
|
727
|
-
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._task.getTaskTag() + "\"");
|
|
728
|
-
message.Append(" " + ConstInterface.MG_ATTR_REMOVE + "=\"" + delList + "\"");
|
|
729
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
730
|
-
if (this.getTask().getTaskCache().isDeleted(this._dvPosValue))
|
|
731
|
-
this.setChanged(true);
|
|
732
|
-
this.getTask().getTaskCache().clearDeletedList();
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
let dcValKeys = this._dcValsCollection.Keys;
|
|
736
|
-
dcValKeys.forEach((dcValKey) => {
|
|
737
|
-
dcv = this._dcValsCollection.get_Item(dcValKey);
|
|
738
|
-
if (!dcv.HasReferences) {
|
|
739
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DC_VALS);
|
|
740
|
-
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + dcv.getId() + "\"");
|
|
741
|
-
message.Append(" " + ConstInterface.MG_ATTR_REMOVE + "=\"1\"");
|
|
742
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
743
|
-
this._dcValsCollection.Remove(dcValKey);
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
if (this.CurrRec != null)
|
|
747
|
-
currRecDeleted = (this.CurrRec.getMode() === DataModificationTypes.Delete
|
|
748
|
-
&& this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null && this.CurrRec.SendToServer);
|
|
749
|
-
let skipCurrRec = false;
|
|
750
|
-
if (this.CurrRec != null && this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null)
|
|
751
|
-
skipCurrRec = AccessHelper.eventsManager.isForceExitPreRecordUpdate(this.getTask());
|
|
752
|
-
this._modifiedRecordsTab.buildXML(message, skipCurrRec, this.CurrRec.getId());
|
|
753
|
-
if (this._original != null)
|
|
754
|
-
this._original.clearMode();
|
|
755
|
-
for (let i = this._modifiedRecordsTab.getSize() - 1; i >= 0; i--) {
|
|
756
|
-
if (skipCurrRec && this._modifiedRecordsTab.getRecByIdx(i).getId() === this.CurrRec.getId())
|
|
757
|
-
continue;
|
|
758
|
-
this._modifiedRecordsTab.getRecByIdx(i).clearFlagsHistory();
|
|
759
|
-
this._modifiedRecordsTab.removeRecord(i);
|
|
760
|
-
}
|
|
761
|
-
if (this.CurrRec != null && !currRecDeleted) {
|
|
762
|
-
let forceBuild = (this._task.isMainProg() && (RemoteCommandsProcessor.IsSessionReInitializing));
|
|
763
|
-
this.CurrRec.buildXML(message, true, forceBuild);
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
else {
|
|
767
|
-
message.Append(" " + ConstInterface.MG_ATTR_INVOKER_ID + "=\"" + invokingTaskTag + "," + serverParent + "\"" +
|
|
768
|
-
XMLConstants.TAG_CLOSE);
|
|
769
|
-
}
|
|
770
|
-
message.Append("\n </" + ConstInterface.MG_TAG_DATAVIEW + XMLConstants.TAG_CLOSE);
|
|
771
|
-
});
|
|
772
|
-
}
|
|
773
|
-
getCurrRec() {
|
|
774
|
-
if (this.CurrRec === null && this._currRecId > Int32.MinValue) {
|
|
775
|
-
Logger.Instance.WriteExceptionToLogWithMsg("DataView.getCurrRec(): record " + this._currRecId + " not found");
|
|
776
|
-
}
|
|
777
|
-
return this.CurrRec;
|
|
778
|
-
}
|
|
779
|
-
getPrevCurrRec() {
|
|
780
|
-
return this._prevCurrRec;
|
|
781
|
-
}
|
|
782
|
-
getOriginalRec() {
|
|
783
|
-
if (this._original === null || this._original.getId() !== this.CurrRec.getId())
|
|
784
|
-
return this.CurrRec;
|
|
785
|
-
return this._original;
|
|
786
|
-
}
|
|
787
|
-
setCurrRec(id, compute) {
|
|
788
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
789
|
-
let oldRecId = this._currRecId;
|
|
790
|
-
if (id > Int32.MinValue) {
|
|
791
|
-
let newIdx = this._recordsTab.getRecIdx(id);
|
|
792
|
-
if (newIdx === -1)
|
|
793
|
-
this._original = null;
|
|
794
|
-
else {
|
|
795
|
-
try {
|
|
796
|
-
let ignoreCurrRec = this._currRecId === Int32.MinValue;
|
|
797
|
-
yield this.setCurrRecByIdx(newIdx, !ignoreCurrRec, ignoreCurrRec, compute, Int32.MinValue);
|
|
798
|
-
if (id !== oldRecId)
|
|
799
|
-
this.saveOriginal();
|
|
800
|
-
return true;
|
|
801
|
-
}
|
|
802
|
-
catch (exception) {
|
|
803
|
-
if (exception instanceof RecordOutOfDataViewException) {
|
|
804
|
-
}
|
|
805
|
-
else
|
|
806
|
-
throw exception;
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
else {
|
|
811
|
-
this.CurrRec = null;
|
|
812
|
-
this._original = null;
|
|
813
|
-
this._currRecId = Int32.MinValue;
|
|
814
|
-
}
|
|
815
|
-
return false;
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
setCurrRecByIdx(newIdx, doSuffix, ignoreCurrRec, compute, newDisplayLine) {
|
|
819
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
820
|
-
let lastRecIdx = this._recordsTab.getSize() - 1;
|
|
821
|
-
let oldFirstRec, nextRec;
|
|
822
|
-
let recordSuff = false;
|
|
823
|
-
if (newIdx === Constants.MG_DATAVIEW_FIRST_RECORD) {
|
|
824
|
-
if (this.getTask().isTableWithAbsolutesScrollbar()) {
|
|
825
|
-
this.RecordsBeforeCurrentView = 0;
|
|
826
|
-
}
|
|
827
|
-
if (this._includesFirst) {
|
|
828
|
-
if (this._currRecIdx >= 0 || this._currRecIdx === Int32.MinValue) {
|
|
829
|
-
newIdx = 0;
|
|
830
|
-
recordSuff = true;
|
|
831
|
-
}
|
|
832
|
-
else
|
|
833
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
836
|
-
yield this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
|
|
837
|
-
yield this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
|
838
|
-
return;
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
else if (newIdx === Constants.MG_DATAVIEW_LAST_RECORD) {
|
|
842
|
-
if (this._includesLast) {
|
|
843
|
-
if (this._currRecIdx <= lastRecIdx) {
|
|
844
|
-
newIdx = lastRecIdx;
|
|
845
|
-
recordSuff = true;
|
|
846
|
-
}
|
|
847
|
-
else
|
|
848
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
|
849
|
-
}
|
|
850
|
-
else {
|
|
851
|
-
if (this.getTask().isTableWithAbsolutesScrollbar())
|
|
852
|
-
this.RecordsBeforeCurrentView = this.TotalRecordsCount;
|
|
853
|
-
yield this.fetchChunkFromServer(CHUNK_DV_BOTTOM, doSuffix);
|
|
854
|
-
if (!this._includesLast)
|
|
855
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
|
856
|
-
let form = this._task.getForm();
|
|
857
|
-
if (form != null) {
|
|
858
|
-
while (!this._includesFirst && form.getRowsInPage() >= this.getSize()) {
|
|
859
|
-
yield this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
yield this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
|
863
|
-
return;
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
else if (newIdx < 0) {
|
|
867
|
-
if (this._includesFirst)
|
|
868
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
|
|
869
|
-
oldFirstRec = this._recordsTab.getRecByIdx(0);
|
|
870
|
-
if (this._recordsTab.getSize() > 0 || this.IncludesLast())
|
|
871
|
-
yield this.fetchChunkFromServer(CHUNK_CACHE_PREV, doSuffix);
|
|
872
|
-
else if (this._recordsTab.getSize() === 0 && this.IncludesFirst())
|
|
873
|
-
yield this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
|
|
874
|
-
else
|
|
875
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.fetchChunkFromServer() wrong option");
|
|
876
|
-
let oldFirstNewIdx = oldFirstRec != null
|
|
877
|
-
? this._recordsTab.getRecIdx(oldFirstRec.getId())
|
|
878
|
-
: this._recordsTab.getSize();
|
|
879
|
-
if (oldFirstNewIdx !== 0)
|
|
880
|
-
yield this.setCurrRecByIdx(oldFirstNewIdx + newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
|
881
|
-
return;
|
|
882
|
-
}
|
|
883
|
-
else if (newIdx > lastRecIdx) {
|
|
884
|
-
if (this._includesLast)
|
|
885
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
|
886
|
-
if (this.getForm().isRowCreated(newIdx))
|
|
887
|
-
this.getForm().markRowNOTCreated(newIdx);
|
|
888
|
-
yield this.fetchChunkFromServer(CHUNK_CACHE_NEXT, doSuffix);
|
|
889
|
-
yield this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
|
890
|
-
return;
|
|
891
|
-
}
|
|
892
|
-
let isCreateLineAboveAct = false;
|
|
893
|
-
let lastEvent = isNullOrUndefined(AccessHelper.eventsManager.getLastRtEvent()) ? 0 :
|
|
894
|
-
AccessHelper.eventsManager.getLastRtEvent().getInternalCode();
|
|
895
|
-
if (newIdx >= 0 && !this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) &&
|
|
896
|
-
lastEvent === InternalInterface.MG_ACT_CRELINE_ABOVE) {
|
|
897
|
-
if ((this.getTask().getInCreateLine()) && newIdx == this._currRecIdx) {
|
|
898
|
-
let newRec = this._recordsTab.getRecByIdx(newIdx);
|
|
899
|
-
if (newRec.getMode() == DataModificationTypes.Insert)
|
|
900
|
-
isCreateLineAboveAct = true;
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
if (recordSuff || isCreateLineAboveAct || newIdx !== this._currRecIdx || ignoreCurrRec && compute) {
|
|
904
|
-
if (!ignoreCurrRec && doSuffix && this.CurrRec != null) {
|
|
905
|
-
let oldRecTabSize = this._recordsTab.getSize();
|
|
906
|
-
nextRec = this._recordsTab.getRecByIdx(newIdx);
|
|
907
|
-
if (nextRec.isNewRec()) {
|
|
908
|
-
if (this._task.getMode() !== Constants.TASK_MODE_CREATE &&
|
|
909
|
-
!(yield this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)))
|
|
910
|
-
AccessHelper.eventsManager.setStopExecution(true);
|
|
911
|
-
}
|
|
912
|
-
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
913
|
-
let orgTopRecIdx = 0;
|
|
914
|
-
if (this._topRecIdxModified) {
|
|
915
|
-
orgTopRecIdx = this.getTopRecIdx();
|
|
916
|
-
this.restoreTopRecIdx();
|
|
917
|
-
}
|
|
918
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
919
|
-
if (this._topRecIdxModified)
|
|
920
|
-
this.setTopRecIdx(orgTopRecIdx);
|
|
921
|
-
}
|
|
922
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
923
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
|
|
924
|
-
if (nextRec !== this.CurrRec && this.getTask().getAfterRetry())
|
|
925
|
-
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
926
|
-
if (oldRecTabSize - 1 === this._recordsTab.getSize() && this._currRecIdx < newIdx)
|
|
927
|
-
newIdx--;
|
|
928
|
-
if (newIdx === this._currRecIdx) {
|
|
929
|
-
if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
|
|
930
|
-
!this._task.getForm().inRefreshDisplay())
|
|
931
|
-
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
|
932
|
-
return;
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
this.CurrRec = this._recordsTab.getRecByIdx(newIdx);
|
|
936
|
-
if (this.CurrRec == null)
|
|
937
|
-
throw new ApplicationException("in DataView.setCurrRecByIdx() current record not found!");
|
|
938
|
-
this._currRecId = this.CurrRec.getId();
|
|
939
|
-
this._currRecIdx = newIdx;
|
|
940
|
-
if (this._task.getForm() != null) {
|
|
941
|
-
if (newDisplayLine === SET_DISPLAYLINE_BY_DV) {
|
|
942
|
-
(this._task.getForm()).updateDisplayLineByDV();
|
|
943
|
-
}
|
|
944
|
-
else
|
|
945
|
-
this._task.getForm().DisplayLine = newDisplayLine;
|
|
946
|
-
}
|
|
947
|
-
if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
|
|
948
|
-
!this._task.getForm().inRefreshDisplay())
|
|
949
|
-
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
|
950
|
-
if (compute)
|
|
951
|
-
yield this.currRecCompute(false);
|
|
952
|
-
}
|
|
953
|
-
});
|
|
954
|
-
}
|
|
955
|
-
currRecCompute(forceClientCompute) {
|
|
956
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
957
|
-
this._fieldsTab.invalidate(false, true);
|
|
958
|
-
yield this.compute(false, forceClientCompute);
|
|
959
|
-
});
|
|
960
|
-
}
|
|
961
|
-
saveOriginal() {
|
|
962
|
-
if (!this.CurrRec.Modified)
|
|
963
|
-
this._original = this.CurrRec.replicate();
|
|
964
|
-
}
|
|
965
|
-
fetchChunkFromServer(chunkId, doSuffix) {
|
|
966
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
967
|
-
this._task.getForm().FormRefreshed = true;
|
|
968
|
-
if (doSuffix && this.CurrRec != null) {
|
|
969
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
970
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag() || this._task.isAborting())
|
|
971
|
-
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
|
|
972
|
-
this._task.getForm().setSuffixDone();
|
|
973
|
-
}
|
|
974
|
-
let eventCode;
|
|
975
|
-
let clientRecId = this._currRecId;
|
|
976
|
-
switch (chunkId) {
|
|
977
|
-
case CHUNK_DV_TOP:
|
|
978
|
-
eventCode = InternalInterface.MG_ACT_DATAVIEW_TOP;
|
|
979
|
-
break;
|
|
980
|
-
case CHUNK_DV_BOTTOM:
|
|
981
|
-
eventCode = InternalInterface.MG_ACT_DATAVIEW_BOTTOM;
|
|
982
|
-
break;
|
|
983
|
-
case CHUNK_CACHE_PREV:
|
|
984
|
-
clientRecId = this.FirstRecord == null ? 0 : this.FirstRecord.getId();
|
|
985
|
-
eventCode = InternalInterface.MG_ACT_CACHE_PREV;
|
|
986
|
-
break;
|
|
987
|
-
case CHUNK_CACHE_NEXT:
|
|
988
|
-
eventCode = InternalInterface.MG_ACT_CACHE_NEXT;
|
|
989
|
-
clientRecId = this.LastRecord == null ? 0 : this.LastRecord.getId();
|
|
990
|
-
break;
|
|
991
|
-
default:
|
|
992
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in DataView.fetchChunkFromServer() unknown chunk id: " + chunkId);
|
|
993
|
-
return;
|
|
994
|
-
}
|
|
995
|
-
let cmd = CommandFactory.CreateEventCommand(this._task.getTaskTag(), eventCode);
|
|
996
|
-
cmd.ClientRecId = clientRecId;
|
|
997
|
-
yield this.getTask().DataviewManager.Execute(cmd);
|
|
998
|
-
});
|
|
999
|
-
}
|
|
1000
|
-
FetchRecordsAheadFromServer() {
|
|
1001
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1002
|
-
if (!this._includesLast)
|
|
1003
|
-
yield this.fetchChunkFromServer(CHUNK_CACHE_NEXT, false);
|
|
1004
|
-
else if (!this._includesFirst)
|
|
1005
|
-
yield this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
|
-
recExists(recIdx) {
|
|
1009
|
-
let lastRecIdx = this._recordsTab.getSize() - 1;
|
|
1010
|
-
return recIdx >= 0 && recIdx <= lastRecIdx;
|
|
1011
|
-
}
|
|
1012
|
-
checkFirst(locateFirst) {
|
|
1013
|
-
return this._recordsTab.getRecord(locateFirst) !== null;
|
|
1014
|
-
}
|
|
1015
|
-
getCurrRecIdx() {
|
|
1016
|
-
if (this._currRecIdx === Int32.MinValue) {
|
|
1017
|
-
if (!this.setCurrRec(this._currRecId, true)) {
|
|
1018
|
-
Logger.Instance.WriteWarningToLogWithMsg("DataView.getCurrRecIdx(): _task " +
|
|
1019
|
-
(this.getTask()).PreviouslyActiveTaskId +
|
|
1020
|
-
", record " + this._currRecId + " not found");
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
return this._currRecIdx;
|
|
1024
|
-
}
|
|
1025
|
-
getCurrDBViewRowIdx() {
|
|
1026
|
-
return this.CurrRec.getDBViewRowIdx();
|
|
1027
|
-
}
|
|
1028
|
-
setTopRecIdx(newTopRecIdx) {
|
|
1029
|
-
this._oldTopRecIdx = this.getTopRecIdx();
|
|
1030
|
-
this._topRecIdx = newTopRecIdx;
|
|
1031
|
-
}
|
|
1032
|
-
getTopRecIdx() {
|
|
1033
|
-
return this._topRecIdx;
|
|
1034
|
-
}
|
|
1035
|
-
setTopRecIdxModified(val) {
|
|
1036
|
-
this._topRecIdxModified = val;
|
|
1037
|
-
}
|
|
1038
|
-
getChunkSize() {
|
|
1039
|
-
return this._chunkSize;
|
|
1040
|
-
}
|
|
1041
|
-
restoreTopRecIdx() {
|
|
1042
|
-
this._topRecIdx = this._oldTopRecIdx;
|
|
1043
|
-
}
|
|
1044
|
-
clear() {
|
|
1045
|
-
this._recordsTab.removeAll();
|
|
1046
|
-
this._original = null;
|
|
1047
|
-
let mgForm = this._task.getForm();
|
|
1048
|
-
if (mgForm !== null) {
|
|
1049
|
-
this._task.getForm().SetTableItemsCount(0, true);
|
|
1050
|
-
}
|
|
1051
|
-
this._modifiedRecordsTab.removeAll();
|
|
1052
|
-
this.init();
|
|
1053
|
-
}
|
|
1054
|
-
init() {
|
|
1055
|
-
this._currRecId = Int32.MinValue;
|
|
1056
|
-
this._currRecIdx = Int32.MinValue;
|
|
1057
|
-
this.CurrRec = null;
|
|
1058
|
-
this._prevCurrRec = null;
|
|
1059
|
-
this._includesFirst = false;
|
|
1060
|
-
this._includesLast = false;
|
|
1061
|
-
this.IsOneWayKey = false;
|
|
1062
|
-
this.setTopRecIdx(Int32.MinValue);
|
|
1063
|
-
this._fieldsTab.invalidate(false, true);
|
|
1064
|
-
}
|
|
1065
|
-
computeSubForms() {
|
|
1066
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1067
|
-
if (yield this.getTask().prepareCache(true)) {
|
|
1068
|
-
if (!(yield this.getTask().testAndSet(true)))
|
|
1069
|
-
yield this.compute(true, false);
|
|
1070
|
-
}
|
|
1071
|
-
else
|
|
1072
|
-
yield this.compute(true, false);
|
|
1073
|
-
});
|
|
1074
|
-
}
|
|
1075
|
-
compute(subForms, forceClientCompute) {
|
|
1076
|
-
const _super = Object.create(null, {
|
|
1077
|
-
isEmptyDataview: { get: () => super.isEmptyDataview }
|
|
1078
|
-
});
|
|
1079
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1080
|
-
let tmpRec = null;
|
|
1081
|
-
let computeByServer = !this.computeByClient();
|
|
1082
|
-
let orgComputeBy = this._computeBy;
|
|
1083
|
-
if (forceClientCompute)
|
|
1084
|
-
this._computeBy = COMPUTE_NEWREC_ON_CLIENT;
|
|
1085
|
-
try {
|
|
1086
|
-
this.CurrRec.setInCompute(true);
|
|
1087
|
-
if (!subForms) {
|
|
1088
|
-
if (this.CurrRec.isNewRec()) {
|
|
1089
|
-
if (this._task.getMode() !== Constants.TASK_MODE_CREATE && !_super.isEmptyDataview.call(this)) {
|
|
1090
|
-
this._task.setMode(Constants.TASK_MODE_CREATE);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
else if (this._task.getMode() === Constants.TASK_MODE_CREATE) {
|
|
1094
|
-
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
let getRecordData = computeByServer;
|
|
1098
|
-
if (subForms || (getRecordData && !this.CurrRec.isComputed() && !forceClientCompute)) {
|
|
1099
|
-
let command = CommandFactory.CreateComputeEventCommand(this._task.getTaskTag(), subForms, this._currRecId);
|
|
1100
|
-
yield this._task.DataviewManager.Execute(command);
|
|
1101
|
-
}
|
|
1102
|
-
else {
|
|
1103
|
-
if (getRecordData) {
|
|
1104
|
-
tmpRec = new Record(this.CurrRec.getId(), this);
|
|
1105
|
-
tmpRec.Initialize();
|
|
1106
|
-
tmpRec.setInitialFldVals(true, true);
|
|
1107
|
-
}
|
|
1108
|
-
this._fieldsTab.setServerRcmp(false);
|
|
1109
|
-
let from = this._fieldsTab.getRMIdx();
|
|
1110
|
-
let size = this._fieldsTab.getRMSize();
|
|
1111
|
-
for (let i = from; i < from + size; i = i + 1) {
|
|
1112
|
-
let fld = this._fieldsTab.getField(i);
|
|
1113
|
-
if (getRecordData && this._fieldsTab.serverRcmpDone() && fld.IsVirtual && !fld.VirAsReal && !fld.hasInitExp()) {
|
|
1114
|
-
let currRec2 = this.CurrRec;
|
|
1115
|
-
this.CurrRec = tmpRec;
|
|
1116
|
-
try {
|
|
1117
|
-
fld.takeValFromRec();
|
|
1118
|
-
}
|
|
1119
|
-
finally {
|
|
1120
|
-
this.CurrRec = currRec2;
|
|
1121
|
-
}
|
|
1122
|
-
}
|
|
1123
|
-
if (!this._task.getForm().TransferringDataToGUI)
|
|
1124
|
-
yield fld.compute(false);
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
finally {
|
|
1129
|
-
this.CurrRec.setInCompute(false);
|
|
1130
|
-
this.CurrRec.setLateCompute(false);
|
|
1131
|
-
this._computeBy = orgComputeBy;
|
|
1132
|
-
}
|
|
1133
|
-
});
|
|
1134
|
-
}
|
|
1135
|
-
addRecord(doSuffix, ignoreCurrRec, isCrelineAbove) {
|
|
1136
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1137
|
-
let newCurrRecId = (--this._lastCreatedRecId);
|
|
1138
|
-
let mode = DataModificationTypes.Insert;
|
|
1139
|
-
return yield this.addRecord_1(doSuffix, ignoreCurrRec, false, newCurrRecId, mode, isCrelineAbove);
|
|
1140
|
-
});
|
|
1141
|
-
}
|
|
1142
|
-
addRecord_1(doSuffix, ignoreCurrRec, isFirstRecord, newCurrRecId, mode, isCrelineAbove) {
|
|
1143
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1144
|
-
let rec = new Record(newCurrRecId, this);
|
|
1145
|
-
rec.Initialize();
|
|
1146
|
-
rec.setInitialFldVals(false, !isFirstRecord);
|
|
1147
|
-
let newCurrRecIdx = 0;
|
|
1148
|
-
if (isCrelineAbove) {
|
|
1149
|
-
newCurrRecIdx = (this._currRecIdx >= 0
|
|
1150
|
-
? this._currRecIdx
|
|
1151
|
-
: 0);
|
|
1152
|
-
}
|
|
1153
|
-
else
|
|
1154
|
-
newCurrRecIdx = (this._currRecIdx != Int32.MinValue
|
|
1155
|
-
? this._currRecIdx + 1
|
|
1156
|
-
: 0);
|
|
1157
|
-
this._recordsTab.insertRecord(rec, newCurrRecIdx);
|
|
1158
|
-
rec.setMode(mode);
|
|
1159
|
-
try {
|
|
1160
|
-
let compute = !isFirstRecord;
|
|
1161
|
-
yield this.setCurrRecByIdx(newCurrRecIdx, doSuffix, ignoreCurrRec, compute, Int32.MinValue);
|
|
1162
|
-
if (isFirstRecord && this.getTask().getMode() !== Constants.TASK_MODE_CREATE)
|
|
1163
|
-
rec.setOldRec();
|
|
1164
|
-
}
|
|
1165
|
-
catch (execption) {
|
|
1166
|
-
if (execption instanceof RecordOutOfDataViewException) {
|
|
1167
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
1168
|
-
newCurrRecIdx = -1;
|
|
1169
|
-
else
|
|
1170
|
-
throw new ApplicationException("in DataView.addRecord() invalid exception");
|
|
1171
|
-
}
|
|
1172
|
-
else
|
|
1173
|
-
throw execption;
|
|
1174
|
-
}
|
|
1175
|
-
return newCurrRecIdx;
|
|
1176
|
-
});
|
|
1177
|
-
}
|
|
1178
|
-
removeCurrRec() {
|
|
1179
|
-
const _super = Object.create(null, {
|
|
1180
|
-
isEmptyDataview: { get: () => super.isEmptyDataview }
|
|
1181
|
-
});
|
|
1182
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1183
|
-
let mgForm = this._task.getForm();
|
|
1184
|
-
let onDelete;
|
|
1185
|
-
if (this.CurrRec.getMode() === DataModificationTypes.Insert &&
|
|
1186
|
-
!this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
|
|
1187
|
-
this._modifiedRecordsTab.removeRecord(this.CurrRec);
|
|
1188
|
-
onDelete = false;
|
|
1189
|
-
}
|
|
1190
|
-
else {
|
|
1191
|
-
this.CurrRec.clearMode();
|
|
1192
|
-
this.CurrRec.setMode(DataModificationTypes.Delete);
|
|
1193
|
-
onDelete = true;
|
|
1194
|
-
}
|
|
1195
|
-
this.CurrRec.removeRecFromDc();
|
|
1196
|
-
this._recordsTab.removeRecord(this._currRecIdx);
|
|
1197
|
-
this.setChanged(true);
|
|
1198
|
-
if (this.isEmpty() && !this._task.IsTryingToStop) {
|
|
1199
|
-
yield this.MoveToEmptyDataviewIfAllowed();
|
|
1200
|
-
}
|
|
1201
|
-
let newDisplayLine = this.calcLineToMove(onDelete);
|
|
1202
|
-
try {
|
|
1203
|
-
if (mgForm.isScreenMode()) {
|
|
1204
|
-
yield this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
|
|
1205
|
-
}
|
|
1206
|
-
else {
|
|
1207
|
-
yield mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
catch (exception) {
|
|
1211
|
-
if (exception instanceof RecordOutOfDataViewException) {
|
|
1212
|
-
try {
|
|
1213
|
-
if (!_super.isEmptyDataview.call(this))
|
|
1214
|
-
newDisplayLine = mgForm.getPrevLine(newDisplayLine);
|
|
1215
|
-
if (mgForm.isScreenMode())
|
|
1216
|
-
yield this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
|
|
1217
|
-
else
|
|
1218
|
-
yield mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
|
|
1219
|
-
}
|
|
1220
|
-
catch (exception) {
|
|
1221
|
-
if (exception instanceof RecordOutOfDataViewException) {
|
|
1222
|
-
this.reset();
|
|
1223
|
-
}
|
|
1224
|
-
else
|
|
1225
|
-
throw exception;
|
|
1226
|
-
}
|
|
1227
|
-
}
|
|
1228
|
-
else
|
|
1229
|
-
throw exception;
|
|
1230
|
-
}
|
|
1231
|
-
});
|
|
1232
|
-
}
|
|
1233
|
-
RemoveRecord(record) {
|
|
1234
|
-
let recIdx = this._recordsTab.getRecIdx(record.getId());
|
|
1235
|
-
if (this._topRecIdx > recIdx)
|
|
1236
|
-
this._topRecIdx--;
|
|
1237
|
-
if (this._oldTopRecIdx > recIdx)
|
|
1238
|
-
this._oldTopRecIdx--;
|
|
1239
|
-
if (this._currRecIdx > recIdx)
|
|
1240
|
-
this._currRecIdx--;
|
|
1241
|
-
this._recordsTab.removeRecord(record);
|
|
1242
|
-
}
|
|
1243
|
-
MoveToEmptyDataviewIfAllowed() {
|
|
1244
|
-
const _super = Object.create(null, {
|
|
1245
|
-
isEmptyDataview: { get: () => super.isEmptyDataview },
|
|
1246
|
-
setEmptyDataview: { get: () => super.setEmptyDataview }
|
|
1247
|
-
});
|
|
1248
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1249
|
-
if (!_super.isEmptyDataview.call(this) && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
|
|
1250
|
-
if (yield this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true))
|
|
1251
|
-
_super.setEmptyDataview.call(this, true);
|
|
1252
|
-
}
|
|
1253
|
-
else {
|
|
1254
|
-
if (this._task.getMode() === Constants.TASK_MODE_CREATE && _super.isEmptyDataview.call(this))
|
|
1255
|
-
_super.setEmptyDataview.call(this, false);
|
|
1256
|
-
}
|
|
1257
|
-
});
|
|
1258
|
-
}
|
|
1259
|
-
calcLineToMove(onDelete) {
|
|
1260
|
-
let newDisplayLine;
|
|
1261
|
-
if (onDelete)
|
|
1262
|
-
newDisplayLine = this._currRecIdx;
|
|
1263
|
-
else {
|
|
1264
|
-
if (this._currRecIdx > 0)
|
|
1265
|
-
newDisplayLine = this._currRecIdx - 1;
|
|
1266
|
-
else
|
|
1267
|
-
newDisplayLine = this._currRecIdx;
|
|
1268
|
-
}
|
|
1269
|
-
return newDisplayLine;
|
|
1270
|
-
}
|
|
1271
|
-
reset() {
|
|
1272
|
-
this._currRecId = Int32.MinValue;
|
|
1273
|
-
this._currRecIdx = Int32.MinValue;
|
|
1274
|
-
this.CurrRec = null;
|
|
1275
|
-
this.setTopRecIdx(Int32.MinValue);
|
|
1276
|
-
this.SetIncludesFirst(true);
|
|
1277
|
-
this.SetIncludesLast(true);
|
|
1278
|
-
}
|
|
1279
|
-
cancelEdit(onlyReal, recomputeUnknowns) {
|
|
1280
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1281
|
-
let tempCurrRec = null;
|
|
1282
|
-
let recRemoved = false;
|
|
1283
|
-
let inEndTask = this._task.InEndTask;
|
|
1284
|
-
if (inEndTask)
|
|
1285
|
-
onlyReal = true;
|
|
1286
|
-
if (this.CurrRec.getMode() === DataModificationTypes.Insert && this.CurrRec.isNewRec()) {
|
|
1287
|
-
if ((this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 1)) || !this.HasMainTable) {
|
|
1288
|
-
if (this._original !== null) {
|
|
1289
|
-
this.CurrRec.setSameAs(this._original, onlyReal);
|
|
1290
|
-
}
|
|
1291
|
-
}
|
|
1292
|
-
else {
|
|
1293
|
-
yield this.removeCurrRec();
|
|
1294
|
-
recRemoved = true;
|
|
1295
|
-
this._original = this.CurrRec.replicate();
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
|
-
else {
|
|
1299
|
-
if (!this.CurrRec.Modified) {
|
|
1300
|
-
let currCtrl = this._task.getLastParkedCtrl();
|
|
1301
|
-
if (currCtrl !== null)
|
|
1302
|
-
currCtrl.resetPrevVal();
|
|
1303
|
-
}
|
|
1304
|
-
if (recomputeUnknowns)
|
|
1305
|
-
tempCurrRec = this.CurrRec.replicate();
|
|
1306
|
-
if (this._original !== null)
|
|
1307
|
-
this.CurrRec.setSameAs(this._original, onlyReal);
|
|
1308
|
-
if ((this._original !== null && recomputeUnknowns) && !this.CurrRec.isSameRecData(tempCurrRec, false, false))
|
|
1309
|
-
yield this.execUnknownRcmps(this._original);
|
|
1310
|
-
this.takeFldValsFromCurrRec();
|
|
1311
|
-
this._original = this.CurrRec.replicate();
|
|
1312
|
-
}
|
|
1313
|
-
return recRemoved;
|
|
1314
|
-
});
|
|
1315
|
-
}
|
|
1316
|
-
isEmpty() {
|
|
1317
|
-
return this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 0);
|
|
1318
|
-
}
|
|
1319
|
-
addCurrToModified(setRecToOld) {
|
|
1320
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1321
|
-
if (isNullOrUndefined(setRecToOld)) {
|
|
1322
|
-
yield this.addCurrToModified_0();
|
|
1323
|
-
return;
|
|
1324
|
-
}
|
|
1325
|
-
yield this.addCurrToModified_1(setRecToOld);
|
|
1326
|
-
});
|
|
1327
|
-
}
|
|
1328
|
-
addCurrToModified_0() {
|
|
1329
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1330
|
-
yield this.addCurrToModified(true);
|
|
1331
|
-
});
|
|
1332
|
-
}
|
|
1333
|
-
addCurrToModified_1(setRecToOld) {
|
|
1334
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1335
|
-
this._modifiedRecordsTab.addRecord(this.CurrRec);
|
|
1336
|
-
if (setRecToOld) {
|
|
1337
|
-
this.CurrRec.setOldRec();
|
|
1338
|
-
}
|
|
1339
|
-
let command = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
|
|
1340
|
-
yield this.getTask().DataviewManager.RemoteDataviewManager.Execute(command);
|
|
1341
|
-
});
|
|
1342
|
-
}
|
|
1343
|
-
takeFldValsFromCurrRec() {
|
|
1344
|
-
this._fieldsTab.takeValsFromRec();
|
|
1345
|
-
}
|
|
1346
|
-
currEqualsPrev(fldList) {
|
|
1347
|
-
if (this.CurrRec !== null && this._prevCurrRec !== null) {
|
|
1348
|
-
if (this.CurrRec === this._prevCurrRec)
|
|
1349
|
-
return true;
|
|
1350
|
-
for (let i = 0; i < fldList.length; i = i + 1) {
|
|
1351
|
-
if (!this.CurrRec.fldValsEqual(this._prevCurrRec, fldList[i]))
|
|
1352
|
-
return false;
|
|
1353
|
-
}
|
|
1354
|
-
}
|
|
1355
|
-
else if (this.CurrRec !== this._prevCurrRec)
|
|
1356
|
-
return false;
|
|
1357
|
-
return true;
|
|
1358
|
-
}
|
|
1359
|
-
getTask() {
|
|
1360
|
-
Debug.Assert(this._task instanceof TaskBase);
|
|
1361
|
-
return this._task;
|
|
1362
|
-
}
|
|
1363
|
-
getForm() {
|
|
1364
|
-
return this._task.getForm();
|
|
1365
|
-
}
|
|
1366
|
-
modifiedRecordsNumber() {
|
|
1367
|
-
return this._modifiedRecordsTab.getSize();
|
|
1368
|
-
}
|
|
1369
|
-
getSize() {
|
|
1370
|
-
return this._recordsTab.getSize();
|
|
1371
|
-
}
|
|
1372
|
-
computeByClient() {
|
|
1373
|
-
return this._computeBy === COMPUTE_NEWREC_ON_CLIENT;
|
|
1374
|
-
}
|
|
1375
|
-
recExistsById(id) {
|
|
1376
|
-
return this._recordsTab.getRecord(id) !== null;
|
|
1377
|
-
}
|
|
1378
|
-
ParametersExist(iPos, iLen) {
|
|
1379
|
-
if (arguments.length === 2)
|
|
1380
|
-
return this.ParametersExist_0(iPos, iLen);
|
|
1381
|
-
return this.ParametersExist_1();
|
|
1382
|
-
}
|
|
1383
|
-
ParametersExist_0(iPos, iLen) {
|
|
1384
|
-
for (let i = iPos; i < iPos + iLen; i = i + 1) {
|
|
1385
|
-
if (super.getField(i).isParam())
|
|
1386
|
-
return true;
|
|
1387
|
-
}
|
|
1388
|
-
return false;
|
|
1389
|
-
}
|
|
1390
|
-
ParametersExist_1() {
|
|
1391
|
-
return this.ParametersExist(this._rmIdx, this._rmSize);
|
|
1392
|
-
}
|
|
1393
|
-
recInModifiedTab(id) {
|
|
1394
|
-
let record = this._modifiedRecordsTab.getRecord(id);
|
|
1395
|
-
return record !== null;
|
|
1396
|
-
}
|
|
1397
|
-
setPrevCurrRec(rec) {
|
|
1398
|
-
if (arguments.length === 0) {
|
|
1399
|
-
this.setPrevCurrRec_0();
|
|
1400
|
-
return;
|
|
1401
|
-
}
|
|
1402
|
-
this.setPrevCurrRec_1(rec);
|
|
1403
|
-
}
|
|
1404
|
-
setPrevCurrRec_0() {
|
|
1405
|
-
this._prevCurrRec = this.CurrRec;
|
|
1406
|
-
}
|
|
1407
|
-
setPrevCurrRec_1(rec) {
|
|
1408
|
-
this._prevCurrRec = rec;
|
|
1409
|
-
}
|
|
1410
|
-
isPrevCurrRecNull() {
|
|
1411
|
-
return this._prevCurrRec === null;
|
|
1412
|
-
}
|
|
1413
|
-
execUnknownRcmps(orgRec) {
|
|
1414
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1415
|
-
let i;
|
|
1416
|
-
let from = this._fieldsTab.getRMIdx();
|
|
1417
|
-
let size = this._fieldsTab.getRMSize();
|
|
1418
|
-
let rec = this.getCurrRec();
|
|
1419
|
-
if (this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED) {
|
|
1420
|
-
for (i = from; i < from + size && this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED; i++) {
|
|
1421
|
-
let field = this._fieldsTab.getField(i);
|
|
1422
|
-
if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp())
|
|
1423
|
-
this._unknownRcmp = UNKNOWN_RCMPS_FOUND;
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
|
-
if (this._unknownRcmp === UNKNOWN_RCMPS_FOUND && rec !== null) {
|
|
1427
|
-
for (i = from; i < from + size; i = i + 1) {
|
|
1428
|
-
let field = this._fieldsTab.getField(i);
|
|
1429
|
-
if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp() && !rec.fldValsEqual(orgRec, i)) {
|
|
1430
|
-
let fieldValue = rec.GetFieldValue(i);
|
|
1431
|
-
let isNullFld = rec.IsNull(i);
|
|
1432
|
-
rec.setFieldValue(i, orgRec.GetFieldValue(i), false);
|
|
1433
|
-
yield field.setValueAndStartRecompute(fieldValue, isNullFld, false, false, false);
|
|
1434
|
-
}
|
|
1435
|
-
}
|
|
1436
|
-
}
|
|
1437
|
-
});
|
|
1438
|
-
}
|
|
1439
|
-
setTransCleared() {
|
|
1440
|
-
this._transCleared = true;
|
|
1441
|
-
}
|
|
1442
|
-
processRecovery() {
|
|
1443
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1444
|
-
if (!this._task.isAborting()) {
|
|
1445
|
-
let orgAction = this._pendingRecovery;
|
|
1446
|
-
let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
|
|
1447
|
-
this._pendingRecovery = RECOVERY_ACT_NONE;
|
|
1448
|
-
if (orgStopExecution)
|
|
1449
|
-
AccessHelper.eventsManager.setStopExecution(false);
|
|
1450
|
-
let temporaryResetInCtrlPrefix = this._task.InCtrlPrefix;
|
|
1451
|
-
if (temporaryResetInCtrlPrefix)
|
|
1452
|
-
this._task.InCtrlPrefix = false;
|
|
1453
|
-
switch (orgAction) {
|
|
1454
|
-
case RECOVERY_ACT_CANCEL:
|
|
1455
|
-
(this._task.DataView.getCurrRec()).resetUpdated();
|
|
1456
|
-
this.getTask().getTaskCache().clearCache();
|
|
1457
|
-
if (this.getSize() === 1 && this._task.getMode() === Constants.TASK_MODE_CREATE) {
|
|
1458
|
-
this.CurrRec.resetModified();
|
|
1459
|
-
this.CurrRec.clearMode();
|
|
1460
|
-
this.CurrRec.setMode(DataModificationTypes.Insert);
|
|
1461
|
-
this.CurrRec.setNewRec();
|
|
1462
|
-
this._original.setSameAs(this.CurrRec, false);
|
|
1463
|
-
}
|
|
1464
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTaskAndEventSubtype(this.getTask(), InternalInterface.MG_ACT_CANCEL, EventSubType.CancelWithNoRollback);
|
|
1465
|
-
break;
|
|
1466
|
-
case RECOVERY_ACT_MOVE_DIRECTION_BEGIN:
|
|
1467
|
-
let lastParkedControl = this._task.getLastParkedCtrl();
|
|
1468
|
-
if (lastParkedControl !== null)
|
|
1469
|
-
yield lastParkedControl.invoke();
|
|
1470
|
-
break;
|
|
1471
|
-
case RECOVERY_ACT_BEGIN_SCREEN:
|
|
1472
|
-
this.getTask().setPreventRecordSuffix(true);
|
|
1473
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGPAGE);
|
|
1474
|
-
this.getTask().setPreventRecordSuffix(false);
|
|
1475
|
-
break;
|
|
1476
|
-
case RECOVERY_ACT_BEGIN_TABLE:
|
|
1477
|
-
this._task.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
|
1478
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGTBL);
|
|
1479
|
-
this.getTask().getTaskCache().clearCache();
|
|
1480
|
-
break;
|
|
1481
|
-
default:
|
|
1482
|
-
AccessHelper.eventsManager.setStopExecution(orgStopExecution);
|
|
1483
|
-
break;
|
|
1484
|
-
}
|
|
1485
|
-
if (temporaryResetInCtrlPrefix)
|
|
1486
|
-
this._task.InCtrlPrefix = true;
|
|
1487
|
-
if (orgAction !== RECOVERY_ACT_NONE)
|
|
1488
|
-
AccessHelper.eventsManager.setStopExecution(true, orgAction !== RECOVERY_ACT_BEGIN_TABLE);
|
|
1489
|
-
}
|
|
1490
|
-
});
|
|
1491
|
-
}
|
|
1492
|
-
replicate() {
|
|
1493
|
-
let rep = new DataView(this);
|
|
1494
|
-
rep._recordsTab = this._recordsTab.replicate();
|
|
1495
|
-
rep._currRecId = rep._recordsTab.getRecByIdx(0).getId();
|
|
1496
|
-
rep._currRecIdx = 0;
|
|
1497
|
-
rep.CurrRec = rep._recordsTab.getRecByIdx(0);
|
|
1498
|
-
rep._prevCurrRec = rep._recordsTab.getRecByIdx(0);
|
|
1499
|
-
rep._original = rep._recordsTab.getRecByIdx(0);
|
|
1500
|
-
rep.setTopRecIdx(Int32.MinValue);
|
|
1501
|
-
return rep;
|
|
1502
|
-
}
|
|
1503
|
-
getDvPosValue() {
|
|
1504
|
-
return this._dvPosValue;
|
|
1505
|
-
}
|
|
1506
|
-
getFirstDv() {
|
|
1507
|
-
return this._firstDv;
|
|
1508
|
-
}
|
|
1509
|
-
ResetFirstDv() {
|
|
1510
|
-
this._firstDv = false;
|
|
1511
|
-
}
|
|
1512
|
-
getCacheLRU() {
|
|
1513
|
-
return this._cacheLruTimeStamp;
|
|
1514
|
-
}
|
|
1515
|
-
setCacheLRU() {
|
|
1516
|
-
this._cacheLruTimeStamp = Misc.getSystemMilliseconds();
|
|
1517
|
-
}
|
|
1518
|
-
setSameAs(newDv) {
|
|
1519
|
-
const _super = Object.create(null, {
|
|
1520
|
-
setEmptyDataview: { get: () => super.setEmptyDataview }
|
|
1521
|
-
});
|
|
1522
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1523
|
-
this._rmSize = newDv._rmSize;
|
|
1524
|
-
this._rmIdx = newDv._rmIdx;
|
|
1525
|
-
this._computeBy = newDv._computeBy;
|
|
1526
|
-
this._flushUpdates = newDv._flushUpdates;
|
|
1527
|
-
this._currRecId = newDv._currRecId;
|
|
1528
|
-
this._currRecIdx = newDv._currRecIdx;
|
|
1529
|
-
this._topRecId = newDv._topRecId;
|
|
1530
|
-
this.CurrRec = newDv.CurrRec;
|
|
1531
|
-
this._original = newDv._original;
|
|
1532
|
-
this._prevCurrRec = null;
|
|
1533
|
-
this._fieldsTab = newDv._fieldsTab;
|
|
1534
|
-
this._recordsTab = newDv._recordsTab;
|
|
1535
|
-
this._modifiedRecordsTab = newDv._modifiedRecordsTab;
|
|
1536
|
-
this._includesFirst = newDv._includesFirst;
|
|
1537
|
-
this._includesLast = newDv._includesLast;
|
|
1538
|
-
this._insertAt = newDv._insertAt;
|
|
1539
|
-
this._lastCreatedRecId = newDv._lastCreatedRecId;
|
|
1540
|
-
this._task = newDv._task;
|
|
1541
|
-
this._dcValsCollection = newDv._dcValsCollection;
|
|
1542
|
-
this._recovery = newDv._recovery;
|
|
1543
|
-
this._pendingRecovery = newDv._pendingRecovery;
|
|
1544
|
-
this._hasMainTable = newDv._hasMainTable;
|
|
1545
|
-
this._chunkSize = newDv._chunkSize;
|
|
1546
|
-
this._firstDv = newDv._firstDv;
|
|
1547
|
-
this._lastSessionCounter = newDv._lastSessionCounter;
|
|
1548
|
-
this._skipParsing = newDv._skipParsing;
|
|
1549
|
-
this._unknownRcmp = newDv._unknownRcmp;
|
|
1550
|
-
this._transCleared = newDv._transCleared;
|
|
1551
|
-
this._dvPosValue = newDv._dvPosValue;
|
|
1552
|
-
this._cacheLruTimeStamp = newDv._cacheLruTimeStamp;
|
|
1553
|
-
this._changed = newDv._changed;
|
|
1554
|
-
this._locateFirstRec = newDv._locateFirstRec;
|
|
1555
|
-
_super.setEmptyDataview.call(this, newDv.isEmptyDataview());
|
|
1556
|
-
this._task.setMode(newDv.taskModeFromCache);
|
|
1557
|
-
try {
|
|
1558
|
-
if (this.getTask().HasLoacte()) {
|
|
1559
|
-
yield this.setCurrRec(this._locateFirstRec, true);
|
|
1560
|
-
this.setTopRecIdx(this._recordsTab.getRecIdx(this._locateFirstRec));
|
|
1561
|
-
}
|
|
1562
|
-
else {
|
|
1563
|
-
this.getTask().setPreventRecordSuffix(true);
|
|
1564
|
-
yield this.setCurrRecByIdx(Int32.MinValue, true, false, true, Int32.MinValue);
|
|
1565
|
-
this.getTask().setPreventRecordSuffix(false);
|
|
1566
|
-
this.setTopRecIdx(0);
|
|
1567
|
-
}
|
|
1568
|
-
if (!this._task.getForm().isScreenMode()) {
|
|
1569
|
-
if (this._task.getForm().isTableWithPagination()) {
|
|
1570
|
-
this.TotalRecordsCount = newDv.TotalRecordsCount;
|
|
1571
|
-
this.RecordsBeforeCurrentView = newDv.RecordsBeforeCurrentView;
|
|
1572
|
-
}
|
|
1573
|
-
yield this.setCurrRecByIdx(this._topRecIdx, true, false, true, Int32.MinValue);
|
|
1574
|
-
}
|
|
1575
|
-
if (this._task.getForm() !== null)
|
|
1576
|
-
this._task.getForm().updateDisplayLineByDV();
|
|
1577
|
-
}
|
|
1578
|
-
catch (ex) {
|
|
1579
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
1580
|
-
Logger.Instance.WriteDevToLog("wrong top record idx in DataView.setSameAs" + ex.Message);
|
|
1581
|
-
}
|
|
1582
|
-
else
|
|
1583
|
-
throw ex;
|
|
1584
|
-
}
|
|
1585
|
-
});
|
|
1586
|
-
}
|
|
1587
|
-
setChanged(val) {
|
|
1588
|
-
this._changed = val;
|
|
1589
|
-
}
|
|
1590
|
-
getChanged() {
|
|
1591
|
-
return this._changed;
|
|
1592
|
-
}
|
|
1593
|
-
getLocateFirstRec() {
|
|
1594
|
-
return this._locateFirstRec;
|
|
1595
|
-
}
|
|
1596
|
-
setLocateFirstRec(newFirst) {
|
|
1597
|
-
this._locateFirstRec = newFirst;
|
|
1598
|
-
}
|
|
1599
|
-
getRecByIdx(idx) {
|
|
1600
|
-
return this._recordsTab.getRecByIdx(idx);
|
|
1601
|
-
}
|
|
1602
|
-
getServerCurrRec() {
|
|
1603
|
-
return this._recordsTab.getServerCurrRec();
|
|
1604
|
-
}
|
|
1605
|
-
zeroServerCurrRec() {
|
|
1606
|
-
this._recordsTab.zeroServerCurrRec();
|
|
1607
|
-
}
|
|
1608
|
-
inRollback() {
|
|
1609
|
-
let inRollback = false;
|
|
1610
|
-
if (this._recovery === ConstInterface.RECOVERY_ROLLBACK && this.getTask().isTransactionOwner()) {
|
|
1611
|
-
inRollback = true;
|
|
1612
|
-
}
|
|
1613
|
-
return inRollback;
|
|
1614
|
-
}
|
|
1615
|
-
getRecIdx(id) {
|
|
1616
|
-
return this._recordsTab.getRecIdx(id);
|
|
1617
|
-
}
|
|
1618
|
-
backupCurrent() {
|
|
1619
|
-
return this.CurrRec.replicate();
|
|
1620
|
-
}
|
|
1621
|
-
restoreCurrent(recBackup) {
|
|
1622
|
-
Debug.Assert(recBackup !== null);
|
|
1623
|
-
this._currRecId = recBackup.getId();
|
|
1624
|
-
this._currRecIdx = this._recordsTab.getRecIdx(this._currRecId);
|
|
1625
|
-
this.CurrRec = this._recordsTab.getRecByIdx(this._currRecIdx);
|
|
1626
|
-
this.CurrRec.setSameAs(recBackup, false);
|
|
1627
|
-
this.takeFldValsFromCurrRec();
|
|
1628
|
-
}
|
|
1629
|
-
GetRecordById(id) {
|
|
1630
|
-
return this._recordsTab.getRecord(id);
|
|
1631
|
-
}
|
|
1632
|
-
GetModifiedRecord() {
|
|
1633
|
-
let record = null;
|
|
1634
|
-
if (this._modifiedRecordsTab.getSize() > 0) {
|
|
1635
|
-
Debug.Assert(this._modifiedRecordsTab.getSize() === 1);
|
|
1636
|
-
record = this._modifiedRecordsTab.getRecByIdx(0);
|
|
1637
|
-
}
|
|
1638
|
-
return record;
|
|
1639
|
-
}
|
|
1640
|
-
GetCurrentRecId() {
|
|
1641
|
-
return this._currRecId;
|
|
1642
|
-
}
|
|
1643
|
-
DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast) {
|
|
1644
|
-
return orgIncludesFirst !== this.IncludesFirst() || orgIncludesLast !== this.IncludesLast();
|
|
1645
|
-
}
|
|
1646
|
-
GetRecordMainIdx() {
|
|
1647
|
-
return this._rmIdx;
|
|
1648
|
-
}
|
|
1649
|
-
GetRecordMainSize() {
|
|
1650
|
-
return this._rmSize;
|
|
1651
|
-
}
|
|
1652
|
-
GetRouteParams() {
|
|
1653
|
-
let params = new List();
|
|
1654
|
-
for (let i = 0; i < this._fieldsTab.getSize(); i++) {
|
|
1655
|
-
let field = this._fieldsTab.getField(i);
|
|
1656
|
-
let val;
|
|
1657
|
-
if (field.IsExposedRouteParam && !field.isNull()) {
|
|
1658
|
-
switch (field.getType()) {
|
|
1659
|
-
case StorageAttribute.ALPHA:
|
|
1660
|
-
case StorageAttribute.UNICODE:
|
|
1661
|
-
{
|
|
1662
|
-
val = field.getDispValue();
|
|
1663
|
-
if (field.isNull())
|
|
1664
|
-
val = field.getNullDisplay();
|
|
1665
|
-
val = val.trim();
|
|
1666
|
-
params.push(val.length === 0 ? " " : val);
|
|
1667
|
-
}
|
|
1668
|
-
break;
|
|
1669
|
-
case StorageAttribute.BOOLEAN:
|
|
1670
|
-
{
|
|
1671
|
-
if (field.isNull())
|
|
1672
|
-
params.push(false);
|
|
1673
|
-
else
|
|
1674
|
-
params.push((field.getDispValue()).charAt(0) === '1');
|
|
1675
|
-
}
|
|
1676
|
-
break;
|
|
1677
|
-
case StorageAttribute.NUMERIC: {
|
|
1678
|
-
val = field.getDispValue();
|
|
1679
|
-
if (field.isNull())
|
|
1680
|
-
val = field.getNullDisplay();
|
|
1681
|
-
let pic = new PIC(field.getPicture(), field.getType(), this.getTask().getCompIdx());
|
|
1682
|
-
val = DisplayConvertor.Instance.mg2disp(val, "", pic, true, 0, false);
|
|
1683
|
-
params.push(val);
|
|
1684
|
-
break;
|
|
1685
|
-
}
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
}
|
|
1689
|
-
return (params.length > 0) ? params : null;
|
|
1690
|
-
}
|
|
1691
|
-
}
|
|
1692
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRGF0YVZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFpQixpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDdkgsT0FBTyxFQUNMLHFCQUFxQixFQUVyQixnQkFBZ0IsRUFJaEIsR0FBRyxFQUVILGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUFDLGNBQWMsSUFBSSxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFFLDBDQUEwQyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEgsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUV0QyxPQUFPLEVBQUMs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Y0FBYyxFQUFFLENBQUM7d0JBQy9CLElBQUksR0FBRyxHQUFRLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7d0JBQ3pGLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIERlYnVnLCBJbnQzMiwgSW50NjQsIExpc3QsIE5OdW1iZXIsIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7Q29uc3RhbnRzLCBJbnRlcm5hbEludGVyZmFjZSwgTG9nZ2VyLCBNaXNjLCBTdG9yYWdlQXR0cmlidXRlLCBYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERjVmFsdWVzLFxyXG4gIERpc3BsYXlDb252ZXJ0b3IsXHJcbiAgSVJlY29yZCxcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgUElDLFxyXG4gIFByb3BlcnR5LFxyXG4gIFByb3BJbnRlcmZhY2VcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtSZWNvcmRzVGFibGV9IGZyb20gJy4vUmVjb3Jkc1RhYmxlJztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4vUmVjb3JkJztcclxuaW1wb3J0IHtUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RmllbGRzVGFibGVFeHQgYXMgRmllbGRzVGFibGV9IGZyb20gJy4vRmllbGRzVGFibGUnO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24sIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZX0gZnJvbSAnLi9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7WE1MQmFzZWREY1ZhbHVlc0J1aWxkZXJ9IGZyb20gJy4vWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXInO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuL0ZpZWxkJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge0V2ZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRXZlbnRDb21tYW5kJztcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSAnLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yJztcclxuaW1wb3J0IHtGaWVsZEJhc2V9IGZyb20gJy4vRmllbGRCYXNlJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7RGF0YVZpZXdCYXNlfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gJy4uL3Rhc2tzL1Rhc2snO1xyXG5cclxuXHJcbi8vIENPTlNUQU5UU1xyXG5leHBvcnQgY29uc3QgU0VUX0RJU1BMQVlMSU5FX0JZX0RWOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuY29uc3QgQ09NUFVURV9ORVdSRUNfT05fQ0xJRU5UOiBzdHJpbmcgPSAnQyc7XHJcbmNvbnN0IFVOS05PV05fUkNNUFNfTk9UX0lOSVRFRDogc3RyaW5nID0gJ00nO1xyXG5jb25zdCBVTktOT1dOX1JDTVBTX0ZPVU5EOiBzdHJpbmcgPSAnWSc7XHJcblxyXG5jb25zdCBJTlZPS0VEX0ZST01fT0ZGTElORV9UQVNLOiBzdHJpbmcgPSBcIi05OTk5OVwiO1xyXG5cclxuY29uc3QgQ0hVTktfQ0FDSEVfTkVYVDogc3RyaW5nID0gJ04nO1xyXG5jb25zdCBDSFVOS19DQUNIRV9QUkVWOiBzdHJpbmcgPSAnUCc7XHJcbmNvbnN0IENIVU5LX0RWX0JPVFRPTTogc3RyaW5nID0gJ0InO1xyXG5jb25zdCBDSFVOS19EVl9UT1A6IHN0cmluZyA9ICdUJztcclxuXHJcbmNvbnN0IENPTVBVVEVfRkxVU0hfVVBEQVRFUzogc3RyaW5nID0gJ0gnO1xyXG5cclxuY29uc3QgQ09NUFVURV9ORVdSRUNfT05fU0VSVkVSOiBzdHJpbmcgPSAnUyc7XHJcbmNvbnN0IEVORF9EVl9UQUc6IHN0cmluZyA9IFwiPC9cIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArIFwiPlwiO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfQkVHSU5fU0NSRUVOOiBzdHJpbmcgPSAnUyc7XHJcblxyXG4vLyByZWNvdmVyeSBhY3Rpb24gdGFrZW4gYnkgdGhlIGNsaWVudCBpbiByZXNwb25zZSB0byByZWNvdmVyeSB0eXBlXHJcbmNvbnN0IFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRTogc3RyaW5nID0gJ1QnO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfQ0FOQ0VMOiBzdHJpbmcgPSAnQyc7XHJcbmNvbnN0IFJFQ09WRVJZX0FDVF9NT1ZFX0RJUkVDVElPTl9CRUdJTjogc3RyaW5nID0gJ0InO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfTk9ORTogc3RyaW5nID0gJ04nO1xyXG5jb25zdCBUUkFOU19TVEFUX0NMT1NFRDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBUUkFOU19TVEFUX09QRU5FRDogc3RyaW5nID0gJ08nO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGRhdGF2aWV3IG9mIGEgdGFza1xyXG5leHBvcnQgY2xhc3MgRGF0YVZpZXcgZXh0ZW5kcyBEYXRhVmlld0Jhc2Uge1xyXG4gIHByaXZhdGUgX2NhY2hlTHJ1VGltZVN0YW1wOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jaHVua1NpemU6IG51bWJlciA9IDMwO1xyXG4gIHByaXZhdGUgX2NodW5rU2l6ZUV4cHJlc3Npb246IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY29tcHV0ZUJ5OiBzdHJpbmcgPSAnXFwwJzsgLy8gdGVsbHMgdGhlIGNsaWVudCB0byBleGVjdXRlIHRoZSBjb21wdXRlIG9mIG5ldyByZWNvcmRzIG9uIHRoZSBjbGllbnQgb3Igb24gdGhlIHNlcnZlclxyXG4gIHByaXZhdGUgX2N1cnJSZWNJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9jdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2R2UG9zVmFsdWU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZmlyc3REdjogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZmx1c2hVcGRhdGVzOiBib29sZWFuID0gZmFsc2U7IC8vIFRSVUUgbWVhbnMgdGhhdCB3aGVuZXZlciBhIHJlY29yZCBpcyBjaGFuZ2VkIHdlIG11c3Qgc2VuZCBpdCB0byB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfaGFzTWFpblRhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBfaW5zZXJ0QXQ6IHN0cmluZyA9ICcgJztcclxuXHJcbiAgc2V0IEluc2VydEF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2luc2VydEF0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5zZXJ0QXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnNlcnRBdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdHJ1ZSwgaWYgd2UgYXJlIGV4ZWN1dGluZyBsb2NhbCBkYXRhdmlldyBjb21tYW5kXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbkxvY2FsRGF0YXZpZXdDb21tYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbGFzdENyZWF0ZWRSZWNJZDogbnVtYmVyID0gMDsgLy8gdGhlIHJlY29yZCBpZCBvZiB0aGUgbGFzdCBjcmVhdGVkIHJlY29yZCBpZFxyXG4gIHByaXZhdGUgX2xhc3RTZXNzaW9uQ291bnRlcjogbnVtYmVyID0gSW50NjQuTWluVmFsdWU7XHJcbiAgcHJpdmF0ZSBfbG9jYXRlRmlyc3RSZWM6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgX21vZGlmaWVkUmVjb3Jkc1RhYjogUmVjb3Jkc1RhYmxlID0gbnVsbDsgLy8gYWZ0ZXIgc2VuZGluZyB0aGVzZSByZWNvcmRzIHRvIHRoZSBzZXJ2ZXIgdGhlIGxpc3QgaXMgY2xlYXJlZFxyXG5cclxuICBwcml2YXRlIF9vbGRUb3BSZWNJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX29yaWdpbmFsOiBSZWNvcmQgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BlbmRpbmdSZWNvdmVyeTogc3RyaW5nID0gUkVDT1ZFUllfQUNUX05PTkU7IC8vIHdoZW4gZGlmZmVyZW50IHRoYW4gTk9ORSwgbWVhbnMgdGhlIHNlcnZlciBvcmRlciBmb3IgcmVjb3Zlcnkgd2FzIG5vdCBwZXJmb3JtZWQgKHlldCkuXHJcbiAgcHJpdmF0ZSBfcHJldkN1cnJSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVjb3Jkc1RhYjogUmVjb3Jkc1RhYmxlID0gbnVsbDsgLy8gPGRhdGF2aWV3PiAuLi48L2RhdGF2aWV3PiB0YWdcclxuICBwcml2YXRlIF9yZWNvdmVyeTogc3RyaW5nID0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORTsgLy8gcmVjb3ZlcnkgYWN0aW9uIHJlcXVlc3QsIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxyXG4gIHByaXZhdGUgX3JtSWR4OiBudW1iZXIgPSAwOyAvLyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSByZWNvcmQgbWFpblxyXG4gIHByaXZhdGUgX3JtU2l6ZTogbnVtYmVyID0gMDsgLy8gbnVtYmVyIG9mIFwic2VsZWN0XCJzIGluIHRoZSByZWNvcmQgbWFpblxyXG4gIHByaXZhdGUgX3NraXBQYXJzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdG9wUmVjSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfdG9wUmVjSWR4OiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF90b3BSZWNJZHhNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3RyYW5zQ2xlYXJlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBJZiB0cnVlLCBfdGFzayBpcyB0aGUgb3duZXIgb2YgYSBSZWMgbGV2ZWwgdHJhbnNhY3Rpb24gYW5kIHRoZSBfdGFzayBpcyBpbiBfdGFzayBzdWZmaXhcclxuICBwcml2YXRlIF91bmtub3duUmNtcDogc3RyaW5nID0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEOyAvLyBzaWduYWxzIGlmIGEgdmlydHVhbCBmaWVsZCB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBoYXMgc2VydmVyIHJjbXAgYWN0aW9uXHJcblxyXG4gIElzT25lV2F5S2V5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9pbmNsdWRlc0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2luY2x1ZGVzTGFzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHk6IGJvb2xlYW4gPSB0cnVlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIHNlcnZlciBzaWRlIHRyYW5zYWN0aW9uIGNhY2hlIGlzIGVtcHR5XHJcblxyXG4gIHByaXZhdGUgX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUjogUmVjb3JkID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBnZXQgQ3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IEN1cnJSZWModmFsdWU6IFJlY29yZCkge1xyXG4gICAgLy8gcmVzZXQgdGhlIHByZXYgZGNWYWxJZHMgaW4gbWdjb250cm9sXHJcbiAgICBpZiAodGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSICE9PSBudWxsICYmIHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUi5yZXNldERjVmFsdWVJZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSID0gdmFsdWU7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBkY1ZhbElkcyBpbiBtZ2NvbnRyb2xcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSLlNldERjVmFsdWVJZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IEZsdXNoVXBkYXRlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mbHVzaFVwZGF0ZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSGFzTWFpblRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc01haW5UYWJsZTtcclxuICB9XHJcblxyXG4gIERCVmlld1NpemU6IG51bWJlciA9IDA7XHJcbiAgdGFza01vZGVGcm9tQ2FjaGU6IHN0cmluZztcclxuXHJcbiAgZ2V0IEN1cnJlbnRSZWNJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJSZWNJZDtcclxuICB9XHJcblxyXG4gIER2Y291bnQ6IG51bWJlciA9IDA7XHJcbiAgVG90YWxSZWNvcmRzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSAwO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGZpcnN0IERhdGF2aWV3IFJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IEZpcnN0UmVjb3JkKCk6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGxhc3QgZGF0YXZpZXcgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgTGFzdFJlY29yZCgpOiBJUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IodGFzazogVGFza0Jhc2UpO1xyXG4gIGNvbnN0cnVjdG9yKERhdGFWaWV3OiBEYXRhVmlldyk7XHJcbiAgY29uc3RydWN0b3IodGFza09yRGF0YVZpZXc6IERhdGFWaWV3fFRhc2tCYXNlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKHRhc2tPckRhdGFWaWV3IGluc3RhbmNlb2YgVGFza0Jhc2UpIHtcclxuICAgICAgdGhpcy5fdGFzayA9IDxUYXNrQmFzZT50YXNrT3JEYXRhVmlldztcclxuICAgICAgdGhpcy5fZmllbGRzVGFiID0gbmV3IEZpZWxkc1RhYmxlKCk7XHJcbiAgICAgIHRoaXMuX3JlY29yZHNUYWIgPSBuZXcgUmVjb3Jkc1RhYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIgPSBuZXcgUmVjb3Jkc1RhYmxlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRhc2tPckRhdGFWaWV3KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGZpcnN0IHJvdyBvZiBkYXRhIGlzIGV4aXN0cyBpbiB0aGUgY2xpZW50J3MgZGF0YSB2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaXMgdGhlIGZpcnN0IHJvdyBvZiBkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQgPC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVzRmlyc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZXNGaXJzdDtcclxuICB9XHJcblxyXG4gIGdldCBTZXJ2ZXJUcmFuc2FjdGlvbkNhY2hlRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyVHJhbnNDYWNoZUVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB0aGUgbGFzdCByb3cgb2YgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgY2xpZW50J3MgZGF0YSB2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIGxhc3Qgcm93IG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlldyA8L3JldHVybnM+XHJcbiAgSW5jbHVkZXNMYXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzTGFzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgRFZIRUFERVIgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsSGVhZGVyRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdEhlYWRlcklubmVyT2JqZWN0cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLkR2Y291bnQgPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmN0bF9pdG1fNF9wYXJlbnRfdmVlKDAsIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBEVkhFQURFUiBpbm5lciBvYmplY3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPiAgbmFtZSBvZiB0YWcsIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaXMgZmluaXNoZWQgaW5uZXIgdGFnPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5pdEhlYWRlcklubmVyT2JqZWN0cyhwYXJzZXI6IFhtbFBhcnNlciwgZm91bmRUYWdOYW1lOiBTdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZHZoZWFkZXIgZm91bmRcIik7XHJcbiAgICAgIHRoaXMuZ2V0SGVhZGVyQXR0cmlidXRlcyhwYXJzZXIpO1xyXG4gICAgICB0aGlzLl9maWVsZHNUYWIuZmlsbERhdGEocGFyc2VyLCB0aGlzKTtcclxuICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNldFJNUG9zKHRoaXMuX3JtU2l6ZSwgdGhpcy5fcm1JZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAoJy8nICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUikpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgRFZIRUFERVIgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhlYWRlckF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCB0YWc6IHN0cmluZztcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUi5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUk1QT1M6IHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoXCIsXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JtU2l6ZSA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgICAgICAgICB0aGlzLl9ybUlkeCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKGkgKyAxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ09NUFVURV9CWTpcclxuICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gdmFsdWVTdHJbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY29tcHV0ZUJ5ID09PSBDT01QVVRFX0ZMVVNIX1VQREFURVMpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jb21wdXRlQnkgPSBDT01QVVRFX05FV1JFQ19PTl9TRVJWRVI7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZmx1c2hVcGRhdGVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fZmx1c2hVcGRhdGVzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQVNfTUFJTl9UQkw6XHJcbiAgICAgICAgICAgIHRoaXMuX2hhc01haW5UYWJsZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ0hVTktfU0laRTpcclxuICAgICAgICAgICAgdGhpcy5fY2h1bmtTaXplID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIVU5LX1NJWkVfRVhQUkVTU0lPTjpcclxuICAgICAgICAgICAgdGhpcy5fY2h1bmtTaXplRXhwcmVzc2lvbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlVua25vd24gYXR0cmlidXRlIGZvciA8XCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSICsgXCI+IHRhZzogXCIgK1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRGF0YVZpZXcuZ2V0SGVhZGVyQXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBEQVRBVklFVyB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9za2lwUGFyc2luZyA9IGZhbHNlO1xyXG4gICAgd2hpbGUgKGF3YWl0IHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlc2V0Rmlyc3REdigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdHJhbnNhY3Rpb24gYmVnaW4gb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRUcmFuc2FjdGlvbkJlZ2luKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdHJhbnNCZWdpbjogc3RyaW5nID0gJ1xcMCc7XHJcbiAgICBsZXQgdHJhbnNCZWdpblByb3A6IFByb3BlcnR5ID0gdGhpcy5fdGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQVNBQ1RJT05fQkVHSU4pO1xyXG4gICAgaWYgKHRyYW5zQmVnaW5Qcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHRyYW5zQmVnaW4gPSAodHJhbnNCZWdpblByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpKS5jaGFyQXQoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRyYW5zQmVnaW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERBVEFWSUVXIGlubmVyIG9iamVjdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+ICBuYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpcyBmaW5pc2hlZCBpbm5lciB0YWc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykpIHtcclxuICAgICAgbGV0IGludmFsaWRhdGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZXMocGFyc2VyKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9za2lwUGFyc2luZykge1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoRU5EX0RWX1RBRywgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBFTkRfRFZfVEFHLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGV4ZWMgc3RhY2sgZW50cmllcyB2YWx1ZXNcclxuICAgICAgICB0aGlzLmZpbGxFeGVjU3RhY2socGFyc2VyKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGRhdGEgY29udHJvbHMgdmFsdWVzXHJcbiAgICAgICAgdGhpcy5maWxsRGF0YURjKHBhcnNlcik7XHJcbiAgICAgICAgaWYgKGludmFsaWRhdGUgJiYgZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG5cclxuICAgICAgICBsZXQgdGFza1JlZnJlc2hUeXBlOiBzdHJpbmcgPSB0aGlzLl9yZWNvcmRzVGFiLmZpbGxEYXRhKHRoaXMsIHRoaXMuX2luc2VydEF0LCBwYXJzZXIpO1xyXG5cclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUsIGFzIHRoZSB0YWJsZSBjb250cm9sIGlzIG5vdCB5ZXQgY3JlYXRlZCwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHRhYmxlIGl0ZW0ncyBjb3VudC5cclxuICAgICAgICAgIC8vIFNldCB0aGUgdXBkYXRlZCB0YWJsZSBpdGVtcyBjb3VudCBvbmx5IHdoZW4gZm9ybSBpcyBhbHJlYWR5IG9wZW5lZC5cclxuICAgICAgICAgIGlmIChmb3JtLk9wZW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5zZXJ0QXQgPT09ICdCJyAmJiAoaW52YWxpZGF0ZSB8fCB0aGlzLl9yZWNvcmRzVGFiLkluc2VydGVkUmVjb3Jkc0NvdW50ID4gMCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZSB8fCAhKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGZvcm0uc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZm9ybS5JbnNlcnRUYWJsZUl0ZW1zKDAsIHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBmb3JtLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiB0aGlzLkN1cnJSZWMuSW5SZWNvbXB1dGUgJiYgdGFza1JlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkUpXHJcbiAgICAgICAgICB0YXNrUmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDO1xyXG5cclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSkge1xyXG4gICAgICAgICAgdGFza1JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suSXNTdWJGb3JtKVxyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuU2V0UmVmcmVzaFR5cGUodGFza1JlZnJlc2hUeXBlKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZURhdGF2aWV3QWZ0ZXJJbnNlcnQoKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgICAgICogdGhlIHJlY29yZHMgdGFibGUgbWlnaHQgc2V0IGEgbmV3IGN1cnJlbnQgcmVjb3JkLiBJdFxyXG4gICAgICAgICAgICAgKiBhY3R1YWxseSBiZWNvbWVzIHRoZSBjdXJyZW50IHJlY29yZCBieSBjYWxsaW5nIHNldEN1cnJSZWMoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICBsZXQgbmV3UmVjSWQ6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0SW5pdGlhbEN1cnJSZWNJZCgpO1xyXG5cclxuICAgICAgICBpZiAobmV3UmVjSWQgIT09IEludDMyLk1pblZhbHVlICYmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSB8fCB0aGlzLl9maXJzdER2KSkge1xyXG5cclxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2xpZW50IHBlcmZvcm1zIHRoZSBmaXJzdCByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgICBpZiAodGhpcy5fZmlyc3REdiAmJiB0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSAmJlxyXG4gICAgICAgICAgICAodGhpcy5fdGFzay5nZXRMZXZlbCgpLmNoYXJDb2RlQXQoMCkgPT09IDAgfHwgdGhpcy5fdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHNlbnQgdXMgYW4gdXBkYXRlZCBjdXJyUmVjIHRoZW4gaW52YWxpZGF0ZSBhbGwgY3VycmVudCB2YWx1ZXMuXHJcbiAgICAgICAgICAvLyB0aGlzIHdpbGwgZm9yY2UgYWxsIG5ldyB2YWx1ZXMgdG8gYmUgY29waWVkIGZyb20gdGhlIGN1cnJSZWMgdG8gdGhlIGRhdGF2aWV3LFxyXG4gICAgICAgICAgLy8gZXNwZWNpYWxseSB2aXJ0dWFsIGZpZWxkcyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKHRydWUsIEZpZWxkLkxFQVZFX0ZMQUdTKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3UmVjSWQgIT09IHRoaXMuX2N1cnJSZWNJZCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWMobmV3UmVjSWQsICF0aGlzLl9maXJzdER2KTtcclxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaXggYnVnICM3Nzk4NTg6IGZvcmNlIGNvbXB1dGUgZm9yIHRoZSBmaXJzdCByZWNvcmQgaW4gYSBzY3JlZW4gbW9kZSBfdGFza1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZmlyc3REdilcclxuICAgICAgICAgICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTgxMzIwOiBtYWtlIHN1cmUgdGhhdCB2aXJ0dWFscyB3aXRoIG5vIGluaXQgb3IgY29udHJvbCBhcmUgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbnZhbGlkYXRlICYmIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgICAgaWYgKGZvcm0gPT0gbnVsbCB8fCBmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoMCwgZmFsc2UsIHRydWUsIGZhbHNlLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiAjNDMxNjMwOiBGb3IgZm9ybXMgaW4gbGluZSBtb2RlIHRoZXJlIHdhcyBhIHNpdHVhdGlvbiBpbiB3aGljaFxyXG4gICAgICAgICAgICAvLyBhZnRlciBpbnZhbGlkYXRpb24sIHRoZSBjdXJyZW50IHJlY29yZCB3YXMgc2V0IHRvIGJlIHRoZSBmaXJzdCBvZlxyXG4gICAgICAgICAgICAvLyB0aGUgZGF0YXZpZXcgYnV0IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIGZvcm0gd2FzIGdyZWF0ZXIgdGhhbiAwLlxyXG4gICAgICAgICAgICAvLyBJdCBjYXVzZWQgc2F2aW5nIGFuIG9yaWdpbmFsIHJlY29yZCB3aGljaCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVcclxuICAgICAgICAgICAgLy8gb3JpZ2luYWwgb2YgdGhlIGN1cnJlbnQgZm9ybSBsaW5lLiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0gd2UgZmlyc3RcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnNvciBwYXJrcyBvbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBkYXRhdmlldy5cclxuICAgICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGQuTEVBVkVfRkxBR1MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCgwKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICg8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpKS5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KDAsIGZhbHNlLCB0cnVlLCB0cnVlLCAwKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAvLyB0byB1cGRhdGUgdHJlZSB3ZSBuZWVkIHRvIGxvYWQgbm9kZXMgZmlyc3RcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPih0aGlzLl90YXNrLmdldEZvcm0oKSkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgdGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlT3JpZ2luYWwoKTsgLy8gQWZ0ZXIgaW52YWxpZGF0aW9uLCB3ZSBtdXN0IHNhdmUgdGhlIG9yaWdpbmFsIHJlY29yZCB0b29cclxuICAgICAgICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBRQ1IgIzc2MTg0OCBwcmV2Q3VyclJlYyBzaG91bGQgc2V0IHRoZSBmaXJzdCB0aW1lIHRoZSBkYXRhdmlldyBpcyBpbml0aWFsaXplZFxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdER2KVxyXG4gICAgICAgICAgdGhpcy5zZXRQcmV2Q3VyclJlYygpO1xyXG5cclxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3ViIGZvcm1zIGFyZSBub3QgdW5uZWNlc3NhcmlseSByZWZyZXNoZWQ6XHJcbiAgICAgICAgLy8gQWZ0ZXIgc2V0dGluZyB0aGUgY3VycmVudCByZWNvcmQgYW5kIGJlZm9yZSBleGVjdXRpbmcgcmVjb3JkIHByZWZpeFxyXG4gICAgICAgIC8vIHdlIHNhdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGFzIHRoZSBwcmV2aW91cyByZWNvcmQgc28gd2hlbiB0aGUgcmVjb3JkIHByZWZpeFxyXG4gICAgICAgIC8vIGlzIGV4ZWN1dGVkIGl0IHdpbGwgc2tpcCByZWZyZXNoaW5nIHRoZSBzdWIgZm9ybXMuIFdlIGRvIHRoYXQgYmVjYXVzZVxyXG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIgYWxyZWFkeSBwYXNzZXMgYmFjayB0byB0aGUgY2xpZW50IGFsbCB0aGUgZGF0YXZpZXdzIG9mIHRoZVxyXG4gICAgICAgIC8vIHN1YiBmb3JtcyBpbiBhIHNpbmdsZSBpdGVyYXRpb24uXHJcbiAgICAgICAgaWYgKGludmFsaWRhdGUgJiYgdGhpcy5fdGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAoPE1nQ29udHJvbEJhc2U+dGhpcy5fdGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKSkuUmVmcmVzaE9uVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVjb3ZlcnkgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpIHtcclxuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcGVyZm9ybSByZWNvcmQgcHJlZml4IGFmdGVyIGEgcmVjb3JkIGxldmVsIHRyYW5zYWN0aW9uIHJldHJ5XHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuZ2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSkgJiZcclxuICAgICAgICAgICAgIXRoaXMuZ2V0VGFzaygpLklzQWZ0ZXJSZXRyeUJlZm9yZUJ1aWxkWE1MKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHRyYW5zQmVnaW4gPSA8c3RyaW5nPiB0aGlzLkdldFRyYW5zYWN0aW9uQmVnaW4oKTtcclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLl9yZWNvdmVyeSkge1xyXG4gICAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG5cclxuICAgICAgICAgICAgICBpZiAodHJhbnNCZWdpbiA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUUNSICM3NDczMTYgY2FuJ3Qgcm9sbGJhY2sgYSBsb3N0IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgLy8gQWxzbywgaW4gY2FzZSBvZiBub24gaW50ZXJhY3RpdmUgX3Rhc2ssIHNraXAgdG8gdGhlIG5leHQgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSB8fFxyXG4gICAgICAgICAgICAgICAgICAhdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgICAgICAgICAgICBzdG9wRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXN0YXJ0KHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkN1cnJSZWMucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0NBTkNFTDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNCZWdpbiAhPT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfTk9ORSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0spO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5zdXJlIF90YXNrIGNsb3NlIGFjdGlvbiBpcyBzdG9wcGVkICh0YXNrRW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlk6XHJcbiAgICAgICAgICAgICAgdGhpcy5SZWNvdmVyeVJldHJ5KHRyYW5zQmVnaW4pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGUgdGFzayBzdWZmaXggd2FzIGFscmVhZHkgZXhlY3V0ZWQsIG5lZWQgdG8gc2V0IHRoaXMgZmxhZyB0byBmYWxzZSBpbiBvcmRlciB0byBlbmFibGUgaXQgdG8gZXhlY3V0ZSBUUyBhZ2Fpbi5cclxuICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09ICcvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCAmJiB0aGlzLl9pbmNsdWRlc0xhc3QgJiYgdGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICB0aGlzLl9jdXJyUmVjSWR4ID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeChJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0cmFuc0JlZ2luXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFJlY292ZXJ5UmV0cnkodHJhbnNCZWdpbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHJhbnNCZWdpbiA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkge1xyXG4gICAgICAvLyBObyBuZWVkIHRvIHJlLXBlcmZvcm0gcmVjb3JkIHByZWZpeCBkdXJpbmcgcmV0cnkuXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSByZWNvcmQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlciBhZnRlciBjb3JyZWN0aW9uXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyYW5zYWN0aW9uRmFpbGVkKHRydWUpO1xyXG5cclxuICAgICAgLy8gZW5zdXJlIHJlY29yZCBwcmVmaXggaXMgbm90IGV4ZWN1dGVkIGZvciBhbGwgdGFza3Mgd2hpY2ggcGFydGljaXBhdGUgaW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlkpO1xyXG5cclxuICAgICAgLy8gUUNSICM0Nzk2ODY6IG5vIG5lZWQgdG8gYWRkIHRoZSBjdXJyIHJlYyB0byB0aGUgbGlzdCBhbnltb3JlXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGluc2VydC9tb2RpZnkgbWF5IGJlIGNhbmNlbGVkIGFuZCBhIHJvbGxiYWNrIGV2ZW50XHJcbiAgICAgIC8vIHdvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlclxyXG4gICAgICB0aGlzLkN1cnJSZWMucmVzdGFydCh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpKTtcclxuXHJcbiAgICAgIC8vIEFuIGVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBfdGFzayBuZWVkcyBubyBtb3ZlbWVudCAoZXJyb3IgaW4gcmVjLXByZWZpeClcclxuICAgICAgaWYgKCF0aGlzLl9maXJzdER2KSB7XHJcbiAgICAgICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX01PVkVfRElSRUNUSU9OX0JFR0lOO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cmFuc0JlZ2luICE9PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9CRUdJTl9TQ1JFRU47XHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUkVUUlkpO1xyXG4gICAgICAvLyBlbnN1cmUgX3Rhc2sgY2xvc2UgYWN0aW9uIGlzIHN0b3BwZWQgKHRhc2tFbmQpXHJcbiAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyYW5zYWN0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnNlcnQgc2luZ2xlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjb3JkXCI+PC9wYXJhbT5cclxuICBJbnNlcnRTaW5nbGVSZWNvcmQocmVjb3JkOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQgPSAwO1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRSZWNvcmQodGhpcy5faW5zZXJ0QXQsIHJlY29yZCk7XHJcbiAgICB0aGlzLlVwZGF0ZURhdGF2aWV3QWZ0ZXJJbnNlcnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIERhdGF2aWV3IEFmdGVyIGluc2VydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBVcGRhdGVEYXRhdmlld0FmdGVySW5zZXJ0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luc2VydEF0ID09PSAnQicvKidCJyovKSB7XHJcblxyXG4gICAgICBsZXQgbmV3UmVjczogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudDtcclxuICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggKz0gbmV3UmVjcztcclxuXHJcbiAgICAgIGlmICh0aGlzLl90b3BSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX3RvcFJlY0lkeCArPSBuZXdSZWNzO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29sZFRvcFJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgdGhpcy5fb2xkVG9wUmVjSWR4ICs9IG5ld1JlY3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBEQVRBVklFVyB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgbGV0IHRhZzogU3RyaW5nO1xyXG4gICAgbGV0IGJvb2xWYWw6IGJvb2xlYW47XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcbiAgICBsZXQgaXNFbXB0eURhdGF2aWV3ID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcubGVuZ3RoKTtcclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgdGhpcy5faW5zZXJ0QXQgPSAnICc7XHJcbiAgICAgIC8vIGZpbmQgYW5kIGV4ZWN1dGUgaW52YWxpZGF0ZSBpbW1lZGlhdGVseVxyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IHRoaXMucGVla0ludmFsaWRhdGUodG9rZW5zVmVjdG9yKTtcclxuXHJcblxyXG5cclxuICAgICAgLy8gbG9jYXRlRmlyc3RSZWMgaXMgc2VudCBieSBzZXJ2ZXIgb25seSBpZiByZWNvcmRzIGFyZSBsb2NhdGVkIGZvciB0aGUgc3ViZm9ybS5cclxuICAgICAgLy8gU28sIGl0IHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAwLlxyXG4gICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IDA7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5TRVJUX0FUOlxyXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnRBdCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTkNMVURFX0ZJUlNUOlxyXG4gICAgICAgICAgICBib29sVmFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLlNldEluY2x1ZGVzRmlyc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOQ0xVREVfTEFTVDpcclxuICAgICAgICAgICAgYm9vbFZhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRJbmNsdWRlc0xhc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX09ORVdBWV9LRVk6XHJcbiAgICAgICAgICAgIGJvb2xWYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0T25lV2F5S2V5KGJvb2xWYWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlZJRVdTSVpFOlxyXG4gICAgICAgICAgICB0aGlzLkRCVmlld1NpemUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURToge1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVE9QX1JFQ19JRDpcclxuICAgICAgICAgICAgdGhpcy5fdG9wUmVjSWQgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS01PREU6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9OT05FIHx8IGludmFsaWRhdGUpXHJcbiAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRPcmlnaW5hbFRhc2tNb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTVBUWV9EQVRBVklFVzpcclxuICAgICAgICAgICAgaXNFbXB0eURhdGF2aWV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9XX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sYXN0Q3JlYXRlZFJlY0lkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX1NUQVQ6XHJcbiAgICAgICAgICAgIGxldCB0cmFuc1N0YXQ6IHN0cmluZyA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRyYW5zU3RhdCkge1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9PUEVORUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9DTE9TRUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRUcmFuc2FjdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVDT1ZFUlk6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnJlc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfVkFMVUU6XHJcbiAgICAgICAgICAgIHRoaXMuX2R2UG9zVmFsdWUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9DQVRFX0ZJUlNUX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PRkZTRVQ6XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9VU0VSX1NPUlQ6XHJcbiAgICAgICAgICAgIC8vIFFDUiAjIDkyMzM4MDpHZXR0aW5nIHRoZSB2YWx1ZSBvZiB1c2VyU29ydCBmcm9tIHRoZSBkYXRhdmlldyBoZWFkZXIuSWYgdHJ1ZSB0aGVuIHNvcnQgc2lnbiB3aWxsIGJlIHJlbW92ZWQgb3IgZWxzZSBzaG93bi5cclxuICAgICAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgIGZvcm0uY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9UT1RBTF9SRUNPUkRTX0NPVU5UOlxyXG4gICAgICAgICAgICB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVc6XHJcbiAgICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQUxfU0VSVkVSX1RSQU5TX0NBQ0hFX0VNUFRZOlxyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHkgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlVua25vd24gYXR0cmlidXRlIGZvciA8XCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyBcIj4gdGFnOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRFbXB0eURhdGF2aWV3KGlzRW1wdHlEYXRhdmlldyk7XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRGF0YVZpZXcuZ2V0QXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzXCIpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIFNldE9uZVdheUtleSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuSXNPbmVXYXlLZXkgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0xhc3QodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0ZpcnN0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHByZXZJbmNsdWRlRmlyc3Q6IGJvb2xlYW4gPSB0aGlzLl9pbmNsdWRlc0ZpcnN0O1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IHZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCAhPT0gcHJldkluY2x1ZGVGaXJzdCkge1xyXG4gICAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IHRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICBmb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuZCBmaWxsIGlubmVyIGRhdGEgZm9yIGFsbCA8ZGNfdmFsPiB0YWdzIGFyZSBjb250YWluZWQgaW50byB0aGUgPGRhdGF2aWV3PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsRGF0YURjKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgREMgdmFsdWVzIGJ1aWxkZXIuXHJcbiAgICBsZXQgZGN2QnVpbGRlcjogWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIgPSBuZXcgWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIoKTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIFwiZGNfdmFsc1wiIHRhZ3MuXHJcbiAgICBsZXQgZm91bmRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIHdoaWxlIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRENfVkFMUykge1xyXG5cclxuICAgICAgLy8gU2F2ZSBjdXJyZW50IGluZGV4IGZvciBmdXR1cmUgcmVmZXJlbmNlLCBpbiBjYXNlIG9mIGFuIGVycm9yLlxyXG4gICAgICBsZXQgZGNWYWxzUG9zaXRpb246IG51bWJlciA9IHBhcnNlci5nZXRDdXJySW5kZXgoKTtcclxuXHJcbiAgICAgIGRjdkJ1aWxkZXIuU2VyaWFsaXplZERDVmFscyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGN2QnVpbGRlci5CdWlsZCgpO1xyXG5cclxuICAgICAgaWYgKGRjdiAhPT0gbnVsbClcclxuICAgICAgICB0aGlzLkFkZERjVmFsdWVzKGRjdik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJFcnJvciB3aGlsZSBwYXJzaW5nIERDIHZhbHVlcyBhdCBwb3NpdGlvbiBcIiArIGRjVmFsc1Bvc2l0aW9uKTtcclxuXHJcbiAgICAgIGZvdW5kVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBBZGREY1ZhbHVlcyhkY3Y6IERjVmFsdWVzKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLkFkZChkY3YuZ2V0SWQoKS50b1N0cmluZygpLCBkY3YpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuZCBmaWxsIGlubmVyIGRhdGEgZm9yIGFsbCA8ZXhlY3N0YWNrZW50cnk+IHRhZ3MgYXJlIGNvbnRhaW5lZCBpbnRvIHRoZSA8ZGF0YXZpZXc+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxFeGVjU3RhY2socGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBmb3VuZFRhZ05hbWU6IHN0cmluZyA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICBsZXQgZXhlY1N0YWNrVGFnRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgd2hpbGUgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWEVDX1NUQUNLX0VOVFJZKSB7XHJcbiAgICAgIHRoaXMuZmlsbElubmVyRXhlY1N0YWNrKHBhcnNlcik7XHJcbiAgICAgIGZvdW5kVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICAgIGV4ZWNTdGFja1RhZ0V4aXN0cyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoZXhlY1N0YWNrVGFnRXhpc3RzKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnJldmVyc2VTZXJ2ZXJFeGVjU3RhY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaWxsIGlubmVyIG9iamVjdHMgb2YgPGV4ZWNzdGFja2VudHJ5PiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbElubmVyRXhlY1N0YWNrKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz47XHJcbiAgICBjb25zdCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBoYW5kbGVySWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgb3BlcklkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWSkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWS5sZW5ndGgpO1xyXG5cclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQ6XHJcbiAgICAgICAgICAgIHRhc2tJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSSUQ6XHJcbiAgICAgICAgICAgIGhhbmRsZXJJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PUEVSX0lEWDpcclxuICAgICAgICAgICAgb3BlcklkeCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaFNlcnZlckV4ZWNTdGFjayh0YXNrSWQsIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBEYXRhVmlldy5maWxsSW5uZXJFeGVjU3RhY2soKSBvdXQgb2YgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlYXJjaCBmb3IgdGhlIGludmFsaWRhdGUgYXR0cmlidXRlIGFuZCBpZiBpdCBpcyB0cnVlIHRoZW4gaXQgYWxzbyBjbGVhcnMgdGhlIGRhdGF2aWV3XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGlzIG1ldGhvZCBCRUZPUkUgcGFyc2luZyB0aGUgcmVjb3Jkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5vZiBhbGwgYXR0cmlidXRlcyBhbmQgdmFsdWVzPC9wYXJhbT5cclxuICBwcml2YXRlIHBlZWtJbnZhbGlkYXRlKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2Vzc2lvbkNvdW50ZXI6IG51bWJlciA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkdldFNlc3Npb25Db3VudGVyKCk7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSAoQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZBTElEQVRFKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcblxyXG4gICAgICAgIGlmIChYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cikpIHtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzI4NjM6IFdoZW4gZXhlY3V0aW5nIFJFQ1VSU0lWRSBjYWxscyB0byB0aGUgc2VydmVyIHRoZXJlIHdlcmUgY2FzZXNcclxuICAgICAgICAgIC8vIGluIHdoaWNoIGFuIG9sZGVyIGRhdGF2aWV3IHN1cGVyc2VkcyBhIG5ldyBvbmUgYmVjYXVzZSBpdHMgcGFyc2luZyBjb21lc1xyXG4gICAgICAgICAgLy8gYWZ0ZXIgdGhlIHBhcnNpbmcgb2YgdGhlIG5ldyBkYXRhdmlldy4gVGhlIHNvbHV0aW9uIGlzIHRvIHNraXAgdGhlXHJcbiAgICAgICAgICAvLyBwYXJzaW5nIG9mIHRoZSBvbGRlciBkYXRhdmlldyBpZiB0aGUgbmV3ZXIgZGF0YXZpZXcgaGFzIGludmFsaWRhdGU9dHJ1ZVxyXG4gICAgICAgICAgaWYgKHNlc3Npb25Db3VudGVyIDwgdGhpcy5fbGFzdFNlc3Npb25Db3VudGVyKVxyXG4gICAgICAgICAgICB0aGlzLl9za2lwUGFyc2luZyA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFNlc3Npb25Db3VudGVyID0gc2Vzc2lvbkNvdW50ZXI7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIGJ5IGl0cyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5vZiB0aGUgZmllbGQgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHJlcXVpcmVkIGZpZWxkIChvciBudWxsIGlmIG5vdCBmb3VuZCkgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuXHJcbiAgICBpZiAodGhpcy5fZmllbGRzVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBEYXRhVmlldy5nZXRGaWVsZChTdHJpbmcpOiBUaGVyZSBpcyBubyBmaWVsZHNUYWIgb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZXNzYWdlXCI+dGhlIG1lc3NhZ2UgYnVmZmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzO1xyXG4gICAgbGV0IHRhc2tUYWc6IFN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpO1xyXG4gICAgbGV0IGJya0xldmVsSW5kZXg6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWxJbmRleCgpO1xyXG4gICAgbGV0IGN1cnJSZWNEZWxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc2VydmVyUGFyZW50OiBTdHJpbmc7XHJcblxyXG4gICAgbGV0IGNvbnRleHRUYXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT4odGhpcy5nZXRUYXNrKCkuR2V0Q29udGV4dFRhc2soKSk7XHJcbiAgICBsZXQgaW52b2tpbmdUYXNrVGFnOiBzdHJpbmcgPSBjb250ZXh0VGFzay5Jc09mZmxpbmUgPyBJTlZPS0VEX0ZST01fT0ZGTElORV9UQVNLIDogY29udGV4dFRhc2suZ2V0VGFza1RhZygpO1xyXG5cclxuICAgIC8vIHB1dCB0aGUgZGF0YXZpZXcgdGFnIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG1vZGlmaWVkIHJlY29yZHMganVzdCB0byBsZXRcclxuICAgIC8vIHRoZSBzZXJ2ZXIga25vdyB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgICAgPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQgKyBcIj1cXFwiXCIgK1xyXG4gICAgICB0YXNrVGFnICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIC8vIFFDUiA0MjMwNjQgcHV0cyB0aGUgY3VycmVudCBleGVjdXRpbmcgaGFuZGxlciBpbmRleFxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tMRVZFTCArIFwiPVxcXCJcIiArIGJya0xldmVsSW5kZXggKyBcIlxcXCJcIik7XHJcblxyXG4gICAgLy8gSWYgdGhlIHRyaWdnZXIgdGFzayBpcyBhbiBPZmZsaW5lIHByb2dyYW0sIHRoZSBwYXJlbnQgb24gdGhlIHNlcnZlciBzaG91bGQgYmVcclxuICAgIC8vIHRoZSBNYWluIFByb2dyYW0gb2YgdGhlIGN1cnJlbnQgQ1RMLlxyXG4gICAgc2VydmVyUGFyZW50ID0gXCIwXCI7XHJcbiAgICBsZXQgdHJpZ2dlcmluZ1Rhc2s6IFRhc2tCYXNlID0gdGhpcy5nZXRUYXNrKCkuZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuICAgIGlmICh0cmlnZ2VyaW5nVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0cmlnZ2VyaW5nVGFzay5Jc09mZmxpbmUpIHtcclxuICAgICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0cmlnZ2VyaW5nVGFzay5nZXRDdGxJZHgoKTtcclxuICAgICAgICBsZXQgbWFpblByZzogVGFza0Jhc2UgPSA8VGFza0Jhc2U+IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICAgIHNlcnZlclBhcmVudCA9IG1haW5QcmcuZ2V0VGFza1RhZygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZXJ2ZXJQYXJlbnQgPSB0cmlnZ2VyaW5nVGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNJZCA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUMgKyBcIj1cXFwiXCIgKyB0aGlzLl9jdXJyUmVjSWQgKyBcIlxcXCJcIik7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLTU9ERSArIFwiPVxcXCJcIiArIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3RyYW5zQ2xlYXJlZCAmJiAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX0NMRUFSRUQgKyBcIj1cXFwiMVxcXCJcIik7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFFDUiA3Nzk5ODIgcHV0cyB0aGUgaW52b2tpbmcgX3Rhc2sgaWQgYW5kIHRoZSBkaXJlY3QgcGFyZW50IF90YXNrIGlkXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZPS0VSX0lEICsgXCI9XFxcIlwiICsgaW52b2tpbmdUYXNrVGFnICsgXCIsXCIgKyBzZXJ2ZXJQYXJlbnQgKyBcIlxcXCJcIik7XHJcblxyXG4vLyBwdXQgdGhlIGN1cnJlbnQgKChEYXRhVmlldylkYXRhVmlldykgZHZQb3MgdmFsdWVcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0VGFzaygpLmlzQ2FjaGVkKCkpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TX1ZBTFVFICsgXCI9XFxcIlwiICsgdGhpcy5fZHZQb3NWYWx1ZSArIFwiXFxcIlwiKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MT09QX0NPVU5URVIgKyBcIj1cXFwiXCIgKyB0aGlzLmdldFRhc2soKS5nZXRMb29wQ291bnRlcigpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgLy8gc2VuZCBzdWJmb3JtIHZpc2liaWxpdHkgb25seSBpZiB0aGUgc3ViZm9ybSB3aXRoIHByb3BlcnR5IFwiUmVmcmVzaFdoZW5IaWRkZW49TlwiIGFuZCBpdCBpcyBub3QgdmlzaWJsZSxcclxuICAgICAgLy8gaS5lLiBub3QgbmVlZGVkIHJlZnJlc2ggZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICEgYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSlcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TVUJGT1JNX1ZJU0lCTEUgKyBcIj1cXFwiMFxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX0NPVU5URVIgKyBcIj1cXFwiXCIgKyB0aGlzLmdldFRhc2soKS5nZXRDb3VudGVyKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgICAvLyBRQ1IjNTkxOTczOiBsYXN0UmVjaWQgYW5kIG9sZEZpcnN0UmVjSUQgc2hvdWxkIGJlIHNlbnQgYnkgY2xpZW50LlxyXG4gICAgICAvLyBJbiBjYXNlIG9mIG1vdXNlIHNjcm9sbGluZywgd2UgcGFyayBvbiB0aGUgc2FtZSByZWNvcmQgKGRvbid0IGxlYXZlIHRoZSBjdXJyZW50IHJlY29yZCkuIFNvIG9uIHNlcnZlciB3ZSBnZXQgY3VyciByZWNvcmQgb24gd2hpY2hcclxuICAgICAgLy8gd2Ugd2VyZSBwYXJrZWQgYmVmb3JlIHNjcm9sbGluZy4gU28gd2UgY2FuIG5vdCB1c2UgdGhpcyBpbmRleCB0byBmZXRjaCB0aGUgcmVjb3JkLlxyXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gc2VuZCB0aGUgbGFzdCBmZXRjaGVkIHJlY29yZCdzIGlkeCBmcm9tIGNsaWVudCBpbiBjYXNlIG9mIHNjcm9sbCBkb3duXHJcbiAgICAgIC8vIGFuZCBvbGRGaXJzdFJlY0lEIChmaXJzdCByZWNvcmQgb2YgbGFzdCBzZW50IGNodW5rKSBpbiBjYXNlIG9mIHNjcm9sbCB1cCwgZnJvbSB3aGljaCB3ZSBuZWVkIHRvIGZldGNoIHRoZSBjaHVuayBvZiByZWNvcmRzLlxyXG4gICAgICBpZiAodGhpcy5fdGFzayAhPSBudWxsICYmICB0aGlzLl90YXNrLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJFTE9BRF9WSUVXKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0xBU1RfUkVDX0lEICsgXCI9XFxcIlwiICtcclxuICAgICAgICAgICh0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KHRoaXMuZ2V0U2l6ZSgpIC0gMSkuZ2V0SWQoKSkgKyBcIlxcXCJcIik7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX09MRF9GSVJTVF9SRUNfSUQgKyBcIj1cXFwiXCIgK1xyXG4gICAgICAgICAgdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKS5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gc2VuZCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCByZWMgaW4gdGhlIGZvcm1zIHRhYmxlLlxyXG4gICAgICAvLyBpdCBjYW4gYmUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGtlZXAgdGhlIHJlY29yZCBpbiB0aGlzIHBvc2l0aW9uIGFmdGVyIHRoZSB2aWV3IHJlZnJlc2guXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMSkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDX1BPU19JTl9GT1JNICsgXCI9XFxcIlwiICtcclxuICAgICAgICAgICAgZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCkgKyBcIlxcXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgICAgLy8gQWRkIFVzZXIgUmFuZ2VzXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFJhbmdlIHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9SQU5HRVMpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFJhbmdlKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLkNMRUFSX1JBTkdFICsgXCI9XFxcIjFcXFwiXCIpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuUmVzZXRSYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2UsIHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzLCBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncy5DbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIExvY2F0ZXNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlIHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRMb2NhdGUpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuQ0xFQVJfTE9DQVRFUyArIFwiPVxcXCIxXFxcIlwiKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5Vc2VyTG9jcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5idWlsZFhNTEZvclJuZ3MobWVzc2FnZSwgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MsIHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlckxvY3MuQ2xlYXIoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gQWRkIFVzZXIgU29ydHNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0U29ydCB8fCB0aGlzLmdldFRhc2soKS5Vc2VyU29ydHMgIT0gbnVsbCkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFMpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFNvcnQpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuQ0xFQVJfU09SVFMgKyBcIj1cXFwiMVxcXCJcIik7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5SZXNldFNvcnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlVzZXJTb3J0cyAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JTb3J0cyhtZXNzYWdlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZW5kIGRlbGV0ZWQgY2FjaGUgZW50cmllc1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5nZXRUYXNrKCkuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgIGxldCBkZWxMaXN0OiBTdHJpbmcgPSB0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5nZXREZWxldGVkTGlzdFRvWE1MKCk7XHJcbiAgICAgICAgaWYgKGRlbExpc3QgIT09IFwiXCIpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREVMX0xJU1QpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFTU9WRSArIFwiPVxcXCJcIiArIGRlbExpc3QgKyBcIlxcXCJcIik7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBkYXRhdmlldyBpcyBpbiB0aGUgZGVsdGVkZSBsaXN0IG1hcmsgaXQgYXMgdW4tdmFsaWQgc29cclxuICAgICAgICAgIC8vIGl0IHdvbnQgZW50ZXIgdGhlIGNhY2hlIG9uIHJldHVybiBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmlzRGVsZXRlZCh0aGlzLl9kdlBvc1ZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJEZWxldGVkTGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIHVubmVjZXNzYXJ5IGRhdGEgY29udHJvbCB2YWx1ZXNcclxuICAgICAgbGV0IGRjVmFsS2V5czogc3RyaW5nW10gPSB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLktleXM7XHJcblxyXG4gICAgICBkY1ZhbEtleXMuZm9yRWFjaCgoZGNWYWxLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGRjdiA9IHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uZ2V0X0l0ZW0oZGNWYWxLZXkpO1xyXG5cclxuICAgICAgICBpZiAoIWRjdi5IYXNSZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RDX1ZBTFMpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIGRjdi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFTU9WRSArIFwiPVxcXCIxXFxcIlwiKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5SZW1vdmUoZGNWYWxLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwpXHJcbiAgICAgICAgY3VyclJlY0RlbGV0ZWQgPSAodGhpcy5DdXJyUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZVxyXG4gICAgICAgICAgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSkgIT0gbnVsbCAmJiB0aGlzLkN1cnJSZWMuU2VuZFRvU2VydmVyKTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHVzZXIgZXZlbnQgYmVpbmcgaGFuZGxlZCBoYXMgRm9yY2UgZXhpdCA9ICdQcmUgUmVjb3JkIFVwZGF0ZScsIHRoZW5cclxuICAgICAgLy8gZG8gbm90IGFkZCBjdXJyZW50IHJlY29yZCB0byB0aGUgbW9kaWZpZWQgcmVjb3JkcyBsaXN0LiBXZSBhbnl3YXkgc2VuZCBjdXJyZW50XHJcbiAgICAgIC8vIHJlY29yZCBzZXBhcmF0ZWx5LlxyXG4gICAgICBsZXQgc2tpcEN1cnJSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjb3JkKHRoaXMuQ3VyclJlYy5nZXRJZCgpKSAhPSBudWxsKVxyXG4gICAgICAgIHNraXBDdXJyUmVjID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGhpcy5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmJ1aWxkWE1MKCBtZXNzYWdlLCBza2lwQ3VyclJlYywgdGhpcy5DdXJyUmVjLmdldElkKCkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29yaWdpbmFsICE9IG51bGwpXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWwuY2xlYXJNb2RlKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAoc2tpcEN1cnJSZWMgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY0J5SWR4KGkpLmdldElkKCkgPT09IHRoaXMuQ3VyclJlYy5nZXRJZCgpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChpKS5jbGVhckZsYWdzSGlzdG9yeSgpO1xyXG4gICAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQoaSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgIT0gbnVsbCAmJiAhY3VyclJlY0RlbGV0ZWQpIHtcclxuXHJcbiAgICAgICAgLy8gV2hlbiB3ZSByZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBvbmNlIGl0IGlzIGRpc2Nvbm5lY3RlZCwgc2VydmVyIHdpbGwgY3JlYXRlIGEgbmV3IGNvbnRleHQgYW5kXHJcbiAgICAgICAgLy8gdGhlcmVmb3JlIE1QIHZhcmlhYmxlcyBhcmUgd2l0aCB0aGVpciBpbnRpYWwgKGVtcHR5KSB2YWx1ZSBhbmQgbm90IHdpdGggdGhlaXIgcmVhbCB2YWx1ZXMuXHJcbiAgICAgICAgLy8gU28sIHdlIG11c3QgYWx3YXlzIHNlbmQgTWFpbiBwcm9ncmFtJ3MgZmllbGQncyBsYXRlc3QgIHZhbHVlcyB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgIGxldCBmb3JjZUJ1aWxkOiBib29sZWFuID0gKHRoaXMuX3Rhc2suaXNNYWluUHJvZygpICYmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZykpO1xyXG4gICAgICAgIHRoaXMuQ3VyclJlYy5idWlsZFhNTChtZXNzYWdlLCB0cnVlLCBmb3JjZUJ1aWxkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiA3Nzk5ODIgaWYgd2UgaGF2ZSBtYWluIHByb2cgd2l0aCBubyBzZWxlY3QncyBzZW5kIHRoZSBpbnZva2VyIGFuZCBwYXJlbnQgX3Rhc2tcclxuICAgIGVsc2Uge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WT0tFUl9JRCArIFwiPVxcXCJcIiArIGludm9raW5nVGFza1RhZyArIFwiLFwiICsgc2VydmVyUGFyZW50ICsgXCJcXFwiXCIgK1xyXG4gICAgICAgIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICAgICA8L1wiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBSZWNvcmQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZWNvcmQgPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWMoKTogUmVjb3JkIHtcclxuICAgIGlmICh0aGlzLkN1cnJSZWMgPT09IG51bGwgJiYgdGhpcy5fY3VyclJlY0lkID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJEYXRhVmlldy5nZXRDdXJyUmVjKCk6IHJlY29yZCBcIiArIHRoaXMuX2N1cnJSZWNJZCArIFwiIG5vdCBmb3VuZFwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBSZWNvcmQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgPC9yZXR1cm5zPlxyXG4gIGdldFByZXZDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUmVjb3JkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0T3JpZ2luYWxSZWMoKTogUmVjb3JkIHtcclxuXHJcbiAgICBpZiAodGhpcy5fb3JpZ2luYWwgPT09IG51bGwgfHwgdGhpcy5fb3JpZ2luYWwuZ2V0SWQoKSAhPT0gdGhpcy5DdXJyUmVjLmdldElkKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLkN1cnJSZWM7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdXJyZW50IHJlY29yZCAtIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIHJlY29yZCBpZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tcHV0ZVwiPmlmIHRydWUgdGhlbiBleGVjdXRlIGNvbXB1dGUgZm9yIHRoZSBuZXcgcmVjb3JkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q3VyclJlYyhpZDogbnVtYmVyLCBjb21wdXRlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IHRoaXMuX2N1cnJSZWNJZDtcclxuICAgIGlmIChpZCA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGxldCBuZXdJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KGlkKTtcclxuXHJcbiAgICAgIGlmIChuZXdJZHggPT09IC0xKVxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBpZ25vcmVDdXJyUmVjOiBib29sZWFuID0gdGhpcy5fY3VyclJlY0lkID09PSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgIWlnbm9yZUN1cnJSZWMsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIEludDMyLk1pblZhbHVlKTtcclxuICAgICAgICAgIGlmIChpZCAhPT0gb2xkUmVjSWQpXHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIGRvIG5vdCBwb2ludCB0byBhbnkgY3VycmVudCByZWNvcmRcclxuICAgICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgICAgdGhpcy5fb3JpZ2luYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGN1cnJlbnQgcmVjb3JkIGluZGV4IGFuZCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NcclxuICAvLy8gICBVc2UgdGhlIE1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCBhbmQgTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQgY29uc3RhbnRzXHJcbiAgLy8vICAgdG8gcmV0cmlldmUgdGhlIGZpcnN0IG9yIHRoZSBsYXN0IHJlY29yZCByZXNwZWN0aXZlbHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3SWR4XCI+dGhlIG5ldyBpbmRleCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZG9TdWZmaXhcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQgd2hlbiB0aGUgcmVjb3JkIHdhcyBjaGFuZ2VkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVDdXJyUmVjXCI+aWYgdHJ1ZSBhbGwgdGhlIG9wZXJhdGlvbnMgYXJlIGRvbmUgaXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbXB1dGVcIj5pZiB0cnVlIHRoZW4gZXhlY3V0ZSBjb21wdXRlIGZvciB0aGUgbmV3IHJlY29yZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3RGlzcGxheUxpbmVcIj50byB1cGRhdGUgZm9ybSA8L3BhcmFtPlxyXG4gIGFzeW5jIHNldEN1cnJSZWNCeUlkeChuZXdJZHg6IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGNvbXB1dGU6IGJvb2xlYW4sIG5ld0Rpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsYXN0UmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7XHJcbiAgICBsZXQgb2xkRmlyc3RSZWM6IFJlY29yZCwgbmV4dFJlYzogUmVjb3JkO1xyXG5cclxuICAgIC8vIFFDUiAjOTg0OTYwOiB0aGUgdmFyaWFibGUgcmVjb3JkU3VmZiBpcyB1c2VkIHRvIHJlY29nbml6ZSBpZiB3ZSBoYXZlIHByZXNzZWRcclxuICAgIC8vIGN0cmwraG9tZSBvciBjdHJsK2VuZCBpbiB0aGVzZSBjYXNlcyB3ZSBtdXN0IGluaXRpYXRlIHJlY29yZCBzdWZmaXhcclxuICAgIC8vIHRoZSBjb3JyZWN0IHdheSB0byBkbyB0aGlzIGlzIHVzaW5nIHRoZSBkb1N1ZmZpeCBwYXJhbWV0ZXIgYnV0IHNpbmNlIGl0IGlzIHVzZWRcclxuICAgIC8vIGluIGEgbG90IG9mIGNhc2VzIHNvbWV0aW1lIG5vdCBpbiBhIGNvcnJlY3Qgd2F5LCBmb3JjaW5nIHJlY29yZCBzdWZmaXhcclxuICAgIC8vIHVzaW5nIGRvU3VmZml4IHdpbGwgY2F1c2UgbWFueSBjaGFuZ2VzIGluIHRoZSBjb2RlLlxyXG4gICAgbGV0IHJlY29yZFN1ZmY6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAobmV3SWR4ID09PSBDb25zdGFudHMuTUdfREFUQVZJRVdfRklSU1RfUkVDT1JEKSB7XHJcblxyXG4gICAgICAvLyBBcyBtb3ZpbmcgdG8gZmlyc3QgcmVjb3JkIGluIHRoZSB2aWV3LCByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgc2hvdWxkIGJlIDAuXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5pc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpKSB7XHJcbiAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBhbHJlYWR5IHRoZSBmaXJzdCByZWNvcmQgb2YgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID49IDAgfHwgdGhpcy5fY3VyclJlY0lkeCA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgIG5ld0lkeCA9IDA7XHJcblxyXG4gICAgICAgICAgLy8gY3RybCtob21lIHdhc2UgcHJlc3NlZFxyXG4gICAgICAgICAgcmVjb3JkU3VmZiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5UT1ApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfRFZfVE9QLCBkb1N1ZmZpeCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3SWR4LCBmYWxzZSwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5ld0lkeCA9PT0gQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0xBU1RfUkVDT1JEKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0xhc3QpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgYWxyZWFkeSB0aGUgbGFzdCByZWNvcmQgb2YgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4IDw9IGxhc3RSZWNJZHgpIHtcclxuICAgICAgICAgIG5ld0lkeCA9IGxhc3RSZWNJZHg7XHJcbiAgICAgICAgICAvLyBjdHJsK2VuZCB3YXMgcHJlc3NlZFxyXG4gICAgICAgICAgcmVjb3JkU3VmZiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLkJPVFRPTSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gSWYgbGFzdCByZWNvcmQgaXMgbm90IGluIHRoZSB2aWV3LCBhbmQgYmVpbmcgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIsIFJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IFRvdGFsUmVjb3Jkc0NvdW50LiBBbmQgYXMgdGhpcyBjaHVuayBnZXQgYWRkZWRcclxuICAgICAgICAvLyBpbnRvIHJlY29yZHMgdGFibGUsIHRoZSBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgd2lsbCBiZSBkZWNyZW1lbnRlZCBieSBubyBvZiByb3dzIGluIHZpZXcuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlLCB3ZSBvcGVuIHRoZSBjdXJzb3Igd2l0aCByZXZlcnNlIGRpcmVjdGlvbiBmb3Igd2hpY2ggZG8gbm90IGJyaW5nIHRoZSBjb3VudHMgZnJvbSBnYXRld2F5LlxyXG4gICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5pc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpKVxyXG4gICAgICAgICAgdGhpcy5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50O1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX0JPVFRPTSwgZG9TdWZmaXgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG5cclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICB3aGlsZSAoIXRoaXMuX2luY2x1ZGVzRmlyc3QgJiYgZm9ybS5nZXRSb3dzSW5QYWdlKCkgPj0gdGhpcy5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIG5vdCBmb3VuZCBiZXlvbmQgdGhlIFRPUCBlbmRcclxuICAgIGVsc2UgaWYgKG5ld0lkeCA8IDApIHtcclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzRmlyc3QpXHJcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlRPUCk7XHJcblxyXG4gICAgICBvbGRGaXJzdFJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwIHx8IHRoaXMuSW5jbHVkZXNMYXN0KCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBkb1N1ZmZpeCk7XHJcbiAgICAgIC8vIGlmIG5vIHJlY29yZHMgYW5kIGl0cyBmaXJzdCBzaW11bGF0ZSBzdGFydCB0YWJsZVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMCAmJiB0aGlzLkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX1RPUCwgZG9TdWZmaXgpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRGF0YVZpZXcuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoKSB3cm9uZyBvcHRpb25cIik7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIG5ldyBpbmRleCBvZiB0aGUgcmVjb3JkIHdoaWNoIHdhcyBmaXJzdCBiZWZvcmUgdGhlIGZldGNoXHJcbiAgICAgIGxldCBvbGRGaXJzdE5ld0lkeDogbnVtYmVyID0gb2xkRmlyc3RSZWMgIT0gbnVsbFxyXG4gICAgICAgID8gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgob2xkRmlyc3RSZWMuZ2V0SWQoKSlcclxuICAgICAgICA6IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgICBpZiAob2xkRmlyc3ROZXdJZHggIT09IDApXHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgob2xkRmlyc3ROZXdJZHggKyBuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIG5vdCBmb3VuZCBiZXlvbmQgdGhlIEJPVFRPTSBlbmRcclxuICAgIGVsc2UgaWYgKG5ld0lkeCA+IGxhc3RSZWNJZHgpIHtcclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuQk9UVE9NKTtcclxuICAgICAgLy90aGUgcm93IGlzIGFjdHVhbGx5IG5vdCBjcmVhdGVkIHlldCBpbiBVSSwgaXQgd2lsbCBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgd2UgYnJpbmcgdGhlIG5ldyBjaHVua1xyXG4gICAgICBpZiAodGhpcy5nZXRGb3JtKCkuaXNSb3dDcmVhdGVkKG5ld0lkeCkpXHJcbiAgICAgICAgdGhpcy5nZXRGb3JtKCkubWFya1Jvd05PVENyZWF0ZWQobmV3SWR4KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfTkVYVCwgZG9TdWZmaXgpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0ICBpc0NyZWF0ZUxpbmVBYm92ZUFjdCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBsYXN0RXZlbnQgOiBudW1iZXIgPSBpc051bGxPclVuZGVmaW5lZChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpKSA/IDAgOlxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgIGlmIChuZXdJZHggPj0gMCAmJiAhdGhpcy5nZXRUYXNrKCkudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiZcclxuICAgIGxhc3RFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkUpIHtcclxuICAgICAgaWYgKCgoPFRhc2s+dGhpcy5nZXRUYXNrKCkpLmdldEluQ3JlYXRlTGluZSgpKSAmJiBuZXdJZHggPT0gdGhpcy5fY3VyclJlY0lkeCkge1xyXG4gICAgICAgIGxldCBuZXdSZWM6IFJlY29yZCA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgobmV3SWR4KTtcclxuICAgICAgICBpZiAobmV3UmVjLmdldE1vZGUoKSA9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgaXNDcmVhdGVMaW5lQWJvdmVBY3QgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICMgOTg0OTYwIC0gc2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB2YXJpYWJsZSByZWNvcmRTdWZmIGluIHRoZSB0b3Agb2YgdGhpcyBtZXRob2RcclxuICAgIGlmIChyZWNvcmRTdWZmIHx8IGlzQ3JlYXRlTGluZUFib3ZlQWN0IHx8IG5ld0lkeCAhPT0gdGhpcy5fY3VyclJlY0lkeCB8fCBpZ25vcmVDdXJyUmVjICYmIGNvbXB1dGUpIHtcclxuICAgICAgaWYgKCFpZ25vcmVDdXJyUmVjICYmIGRvU3VmZml4ICYmIHRoaXMuQ3VyclJlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG9sZFJlY1RhYlNpemU6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBuZXh0UmVjID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChuZXdJZHgpO1xyXG4gICAgICAgIGlmIChuZXh0UmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiZcclxuICAgICAgICAgICAgIWF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgIGxldCBvcmdUb3BSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdG9wUmVjSWR4TW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgb3JnVG9wUmVjSWR4ID0gdGhpcy5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3RvcFJlY0lkeE1vZGlmaWVkKVxyXG4gICAgICAgICAgICB0aGlzLnNldFRvcFJlY0lkeChvcmdUb3BSZWNJZHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5SRUNfU1VGRklYX0ZBSUxFRCk7XHJcblxyXG4gICAgICAgIC8vIFFDUiAjMjA0Njogd2hlbiB0aGUgbmV4dCByZWNvcmQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHdlIHNob3VsZFxyXG4gICAgICAgIC8vIGFsbG93IHRoZSBleGVjdXRpb24gb2YgdGhlIHJlY29yZCBwcmVmaXggYnkgc2V0dGluZyB0aGUgX3Rhc2sgbGV2ZWwgdG8gVEFTSy5cclxuICAgICAgICBpZiAobmV4dFJlYyAhPT0gdGhpcy5DdXJyUmVjICYmIHRoaXMuZ2V0VGFzaygpLmdldEFmdGVyUmV0cnkoKSlcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSByZWNvcmRzIHRhYmxlIHNpemUgd2FzIGRlY3JlYXNlZCBkdXJpbmcgaGFuZGxpbmcgdGhlXHJcbiAgICAgICAgLy8gcmVjb3JkIHN1ZmZpeCAoZS5nLiBjYW5jZWwgZWRpdCkgYW5kIHRoZSB1c2VyIHRyaWVzIHRvIG1vdmUgdG9cclxuICAgICAgICAvLyBhIHJlY29yZCB3aXRoIGEgaGlnaGVyIGluZGV4IHRoZW4gd2Ugc2hvdWxkIGFsc28gZGVjcmVhc2UgdGhlXHJcbiAgICAgICAgLy8gbmV3SWR4IHRvIHJlZmxlY3QgdGhlIGNoYW5nZVxyXG4gICAgICAgIGlmIChvbGRSZWNUYWJTaXplIC0gMSA9PT0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgJiYgdGhpcy5fY3VyclJlY0lkeCA8IG5ld0lkeClcclxuICAgICAgICAgIG5ld0lkeC0tO1xyXG5cclxuICAgICAgICAvLyB0aGUgbmV3IGN1cnIgcmVjIG1heSBiZSBhbHJlYWR5IHNldCBieSB0aGUgZXZlbnRzIGNoYWluIHRyaWdnZXJlZCBieSB0aGVcclxuICAgICAgICAvLyByZWNvcmQgc3VmZml4IGFib3ZlIC0gaW4gdGhhdCBjYXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWVcclxuICAgICAgICBpZiAobmV3SWR4ID09PSB0aGlzLl9jdXJyUmVjSWR4KSB7XHJcblxyXG4gICAgICAgICAgLy8gUUNSIDkxODk4MyBjaGFuZ2VzIHRvIHRoZSBfdGFzayBtb2RlIG11c3QgYmUgZG9uZSBiZWZvcmUgcmVjb21wdXRlXHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5fdGFzay5nZXRGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLkN1cnJSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KG5ld0lkeCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjID09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gRGF0YVZpZXcuc2V0Q3VyclJlY0J5SWR4KCkgY3VycmVudCByZWNvcmQgbm90IGZvdW5kIVwiKTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IHRoaXMuQ3VyclJlYy5nZXRJZCgpO1xyXG4gICAgICB0aGlzLl9jdXJyUmVjSWR4ID0gbmV3SWR4O1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gUUNSICMxMDc5MjYsIHdlIG11c3QgdXBkYXRlIGRpc3BsYXkgbGluZSBoZXJlLCBzaW5jZSBjdXJyUmVjQ29tcHV0ZSB3aGljaCBpcyBhY3RpdmF0ZWQgbGF0ZXJcclxuICAgICAgICAvLyBtYXkgZ28gdG8gc2VydmVyIGFuZCBjYXVzZSByZWZyZXNoIGRpc3BsYXkuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhZGRpbmcgbmV3IG5vZGUgdG8gdGhlIHRyZWUsIHRoZSBub2RlIG11c3QgYmUgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHRyZWUuXHJcbiAgICAgICAgaWYgKG5ld0Rpc3BsYXlMaW5lID09PSBTRVRfRElTUExBWUxJTkVfQllfRFYpIHtcclxuICAgICAgICAgICg8TWdGb3JtPih0aGlzLl90YXNrLmdldEZvcm0oKSkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZSA9IG5ld0Rpc3BsYXlMaW5lO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFFDUiA5MTg5ODMgY2hhbmdlcyB0byB0aGUgX3Rhc2sgbW9kZSBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlY29tcHV0ZVxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSAmJlxyXG4gICAgICAgICF0aGlzLl90YXNrLmdldEZvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgIGlmIChjb21wdXRlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY29tcHV0ZSBBTEwgdGhlIGluaXQgZXhwcmVzc2lvbnMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIC0gY2FsbCB0aGlzIG1ldGhvZCB3aGVuXHJcbiAgLy8vICAgZW50ZXJpbmcgYSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VDbGllbnRDb21wdXRlXCI+aWYgVFJVRSBmb3JjZXMgdGhlIGNsaWVudCB0byBjb21wdXRlIHRoZSByZWNvcmQgZXZlbiBpZiBpdCBpcyBmbGFnZ2VkXHJcbiAgLy8vICAgYXMgXCJzZXJ2ZXIgY29tcHV0ZWRcIi5cclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBjdXJyUmVjQ29tcHV0ZShmb3JjZUNsaWVudENvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKGZhbHNlLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZShmYWxzZSwgZm9yY2VDbGllbnRDb21wdXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlcyBhIHJlcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2F2ZU9yaWdpbmFsKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLkN1cnJSZWMuTW9kaWZpZWQpXHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZldGNoIGEgY2h1bmsgb2YgcmVjb3JkcyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoY2h1bmtJZDogc3RyaW5nLCBkb1N1ZmZpeDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vIFFDUiAjNDMwMTM0OiBpZiB0aGUgc2VydmVyIHNlbnQgdXMgcmVjb3JkcyBmZXdlciB0aGFuIHRoZSBudW1iZXIgdGhhdCBmaXRzIGludG8gYSB0YWJsZVxyXG4gICAgLy8gdGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBzZXJ2ZXIgYW5kIG11c3QgcmVmcmVzaCB0aGUgc2NyZWVuLlxyXG4gICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChkb1N1ZmZpeCAmJiB0aGlzLkN1cnJSZWMgIT0gbnVsbCkge1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0aGlzLl90YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuUkVDX1NVRkZJWF9GQUlMRUQpO1xyXG4gICAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuc2V0U3VmZml4RG9uZSgpOyAvLyBRQ1IgNzU4NjM5XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGV2ZW50Q29kZTogbnVtYmVyO1xyXG4gICAgbGV0IGNsaWVudFJlY0lkOiBudW1iZXIgPSB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgICBzd2l0Y2ggKGNodW5rSWQpIHtcclxuICAgICAgY2FzZSBDSFVOS19EVl9UT1A6XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX1RPUDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19EVl9CT1RUT006XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX0JPVFRPTTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9QUkVWOlxyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5GaXJzdFJlY29yZCA9PSBudWxsID8gMCA6IHRoaXMuRmlyc3RSZWNvcmQuZ2V0SWQoKTtcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FDSEVfUFJFVjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9ORVhUOlxyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQUNIRV9ORVhUO1xyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5MYXN0UmVjb3JkID09IG51bGwgPyAwIDogdGhpcy5MYXN0UmVjb3JkLmdldElkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRGF0YVZpZXcuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoKSB1bmtub3duIGNodW5rIGlkOiBcIiArIGNodW5rSWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBjbWQ6IEV2ZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLl90YXNrLmdldFRhc2tUYWcoKSwgZXZlbnRDb2RlKTtcclxuICAgIGNtZC5DbGllbnRSZWNJZCA9IGNsaWVudFJlY0lkO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX2luY2x1ZGVzTGFzdClcclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9ORVhULCBmYWxzZSk7XHJcbiAgICBlbHNlIGlmICghdGhpcy5faW5jbHVkZXNGaXJzdClcclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9QUkVWLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBpbmRleCBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNJZHhcIj5pbmRleCB0byBjaGVjayA8L3BhcmFtPlxyXG4gIHJlY0V4aXN0cyhyZWNJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxhc3RSZWNJZHg6IG51bWJlciA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpIC0gMTtcclxuICAgIHJldHVybiByZWNJZHggPj0gMCAmJiByZWNJZHggPD0gbGFzdFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGlmIHRoZSBjdXJyZW50IGZpcnN0IHJlY29yZCBleGlzdFxyXG4gIC8vLyAgIGluIGNhc2UgdGhlcmUgaXMgbm8gbG9jYXRlIGNoZWNrIGluY2x1ZGUgZmlyc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNoZWNrRmlyc3QobG9jYXRlRmlyc3Q6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjb3JkKGxvY2F0ZUZpcnN0KSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGN1cnJlbnQgcmVjb3JkIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZWNvcmQgaW5kZXggPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNJZHgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoIXRoaXMuc2V0Q3VyclJlYyh0aGlzLl9jdXJyUmVjSWQsIHRydWUpKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhcIkRhdGFWaWV3LmdldEN1cnJSZWNJZHgoKTogX3Rhc2sgXCIgK1xyXG4gICAgICAgICAgKHRoaXMuZ2V0VGFzaygpKS5QcmV2aW91c2x5QWN0aXZlVGFza0lkICtcclxuICAgICAgICAgIFwiLCByZWNvcmQgXCIgKyB0aGlzLl9jdXJyUmVjSWQgKyBcIiBub3QgZm91bmRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jdXJyUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGRidmlld3Jvd2lkIGZvciB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJEQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN1cnJSZWMuZ2V0REJWaWV3Um93SWR4KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdG9wIHJlY29yZCBpbmRleCBhbmQgc2F2ZXMgdGhlIG9sZCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUb3BSZWNJZHhcIj50aGUgbmV3IHZhbHVlIGZvciB0aGUgdG9wIHJlY29yZCBpbmRleCA8L3BhcmFtPlxyXG4gIHNldFRvcFJlY0lkeChuZXdUb3BSZWNJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fb2xkVG9wUmVjSWR4ID0gdGhpcy5nZXRUb3BSZWNJZHgoKTtcclxuICAgIHRoaXMuX3RvcFJlY0lkeCA9IG5ld1RvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcFJlY0lkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRvcCByZWNvcmQgaW5kZXggbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBmb3IgdG9wUmVjSWR4TW9kaWZpZWQgPC9wYXJhbT5cclxuICBzZXRUb3BSZWNJZHhNb2RpZmllZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RvcFJlY0lkeE1vZGlmaWVkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY2h1bmsgc2l6ZSBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2h1bmtTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIG9sZCBzYXZlZCB2YWx1ZSBvZiB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZVRvcFJlY0lkeCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RvcFJlY0lkeCA9IHRoaXMuX29sZFRvcFJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmVzIGFsbCB0aGUgcmVjb3JkcyBmcm9tIHRoZSBEYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZUFsbCgpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWwgPSBudWxsO1xyXG4gICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgIGlmIChtZ0Zvcm0gIT09IG51bGwpIHtcclxuICAgICAgIHRoaXMuX3Rhc2suZ2V0Rm9ybSgpLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVBbGwoKTtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemUgdGhlIGNsYXNzIG1lbWJlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX2luY2x1ZGVzRmlyc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luY2x1ZGVzTGFzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc09uZVdheUtleSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUoZmFsc2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2hlcyB0aGUgc3ViRm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBhc3luYyBjb21wdXRlU3ViRm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBkdWUgdG8gdXBkYXRlc1xyXG4gICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5wcmVwYXJlQ2FjaGUodHJ1ZSkpIHtcclxuXHJcbiAgICAgICAvLyBvbmUgb2YgdGhlIG5lZWRlZCBkLnYgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGVcclxuICAgICAgIGlmICghYXdhaXQgdGhpcy5nZXRUYXNrKCkudGVzdEFuZFNldCh0cnVlKSlcclxuICAgICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRydWUsIGZhbHNlKTtcclxuICAgICB9XHJcbiAgICAgZWxzZVxyXG4gICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRydWUsIGZhbHNlKTtcclxuICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZSB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgd2l0aG91dCB1cGRhdGluZyB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJGb3Jtc1wiPmlmIHRydWUgdGhlIGEgc3ViRm9ybXMgY29tcHV0ZSBpcyB0byBiZSBkb25lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ2xpZW50Q29tcHV0ZVwiPmlmIFRSVUUgZm9yY2VzIHRoZSBjbGllbnQgdG8gY29tcHV0ZSB0aGUgcmVjb3JkIGV2ZW4gaWYgaXQgaXMgZmxhZ2dlZFxyXG4gIC8vLyAgIGFzIFwic2VydmVyIGNvbXB1dGVkXCIuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlKHN1YkZvcm1zOiBib29sZWFuLCBmb3JjZUNsaWVudENvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0bXBSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgY29tcHV0ZUJ5U2VydmVyOiBib29sZWFuID0gIXRoaXMuY29tcHV0ZUJ5Q2xpZW50KCk7XHJcbiAgICBsZXQgb3JnQ29tcHV0ZUJ5OiBzdHJpbmcgPSB0aGlzLl9jb21wdXRlQnk7XHJcbiAgICAvKidDJyovXHJcbiAgICBpZiAoZm9yY2VDbGllbnRDb21wdXRlKVxyXG4gICAgICB0aGlzLl9jb21wdXRlQnkgPSBDT01QVVRFX05FV1JFQ19PTl9DTElFTlQvKidDJyovO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRJbkNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIXN1YkZvcm1zKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyclJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIC8qJ0MnKi8gJiYgIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkvKidDJyovO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSkvKidNJyovO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGdldFJlY29yZERhdGE6IGJvb2xlYW4gPSBjb21wdXRlQnlTZXJ2ZXI7XHJcbiAgICAgIC8vIGZvciBuZXdseSBjcmVhdGVkIHJlY29yZHMgLSBnbyB0byB0aGUgc2VydmVyIChpZiB0aGV5IHdlcmUgbm90IGNvbXB1dGVkIGFscmVhZHkpXHJcbiAgICAgIGlmIChzdWJGb3JtcyB8fCAoZ2V0UmVjb3JkRGF0YSAmJiAhdGhpcy5DdXJyUmVjLmlzQ29tcHV0ZWQoKSAmJiAhZm9yY2VDbGllbnRDb21wdXRlKSkge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbXB1dGVFdmVudENvbW1hbmQodGhpcy5fdGFzay5nZXRUYXNrVGFnKCksIHN1YkZvcm1zLCB0aGlzLl9jdXJyUmVjSWQpO1xyXG4gICAgICAgIGF3YWl0ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY29tbWFuZCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gUUNSICM5MjE0NzUgLSByZWxpbmsgZHVyaW5nIGNvbXB1dGUgZGVzdHJveXMgdmFsdWVzIG9mIHZpcnR1YWwgZmllbGRzIHdpdGggbm8gaW5pdCBleHAuXHJcbiAgICAgICAgLy8gdGh1cyB3ZSBzYXZlIHRoZW0gYmVmb3JlIHRoZSBjb21wdXRlIGFuZCByZXN0b3JlIHRoZW0gZHVyaW5nIHRoZSBsb29wLlxyXG4gICAgICAgIGlmIChnZXRSZWNvcmREYXRhKSB7XHJcbiAgICAgICAgICB0bXBSZWMgPSBuZXcgUmVjb3JkKHRoaXMuQ3VyclJlYy5nZXRJZCgpLCB0aGlzKTtcclxuICAgICAgICAgIHRtcFJlYy5Jbml0aWFsaXplKCk7XHJcbiAgICAgICAgICB0bXBSZWMuc2V0SW5pdGlhbEZsZFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2V0U2VydmVyUmNtcChmYWxzZSk7XHJcbiAgICAgICAgbGV0IGZyb206IG51bWJlciA9ICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5nZXRSTUlkeCgpO1xyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1TaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgICBpZiAoZ2V0UmVjb3JkRGF0YSAmJiAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2VydmVyUmNtcERvbmUoKSAmJiBmbGQuSXNWaXJ0dWFsICYmICFmbGQuVmlyQXNSZWFsICYmICFmbGQuaGFzSW5pdEV4cCgpKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyUmVjMjogUmVjb3JkID0gdGhpcy5DdXJyUmVjO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMgPSB0bXBSZWM7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgZmxkLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5DdXJyUmVjID0gY3VyclJlYzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL1RPRE86IENoZWNrIGlmIHdlIGNhbiB1c2UgYW5vdGhlciAobWF5YmUsIG5ldykgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkYXRhIHdoaWxlIHRyYW5zZmVycmluZyB0aGVtIHRvIFVJIGluc3RlYWQgb2YgY29tcHV0ZSgpLlxyXG4gICAgICAgICAgaWYgKCEoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuVHJhbnNmZXJyaW5nRGF0YVRvR1VJKVxyXG4gICAgICAgICAgICBhd2FpdCBmbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldEluQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRMYXRlQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IG9yZ0NvbXB1dGVCeTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlY29yZChkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbiwgaXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IG5ld0N1cnJSZWNJZDogbnVtYmVyID0gKC0tdGhpcy5fbGFzdENyZWF0ZWRSZWNJZCk7XHJcbiAgICBsZXQgbW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydDtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFkZFJlY29yZF8xKGRvU3VmZml4LCBpZ25vcmVDdXJyUmVjLCBmYWxzZSwgbmV3Q3VyclJlY0lkLCBtb2RlLCBpc0NyZWxpbmVBYm92ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPmlmIHRydWUgdGhlbiBkbyB0aGUgc3VmZml4IG9mIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlnbm9yZUN1cnJSZWNcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHN1ZmZpeCBvZiB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0ZpcnN0UmVjb3JkXCI+IGlzIGZpcnN0IHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3Q3VyclJlY0lkXCI+IG5ldyByZWNvcmQgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGVcIj4gb3BlcmF0aW9uIG1vZGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgbmV3IHJlYyBpbmRleDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGFkZFJlY29yZF8xKGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBpc0ZpcnN0UmVjb3JkOiBib29sZWFuLCBuZXdDdXJyUmVjSWQ6IG51bWJlciwgbW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzLCBpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyPiB7XHJcblxyXG4gICAgLy8gZ2l2ZSB0aGUgbmV3IHJlY29yZCBhIG5lZ2F0aXZlIGlkXHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBuZXcgUmVjb3JkKG5ld0N1cnJSZWNJZCwgdGhpcyk7XHJcbiAgICByZWMuSW5pdGlhbGl6ZSgpO1xyXG4gICAgcmVjLnNldEluaXRpYWxGbGRWYWxzKGZhbHNlLCAhaXNGaXJzdFJlY29yZCk7XHJcblxyXG4gICAgbGV0IG5ld0N1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICB7XHJcbiAgICAgIG5ld0N1cnJSZWNJZHggPSAodGhpcy5fY3VyclJlY0lkeCA+PSAwXHJcbiAgICAgICAgPyB0aGlzLl9jdXJyUmVjSWR4XHJcbiAgICAgICAgOiAwKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIG5ld0N1cnJSZWNJZHggPSAodGhpcy5fY3VyclJlY0lkeCAhPSBJbnQzMi5NaW5WYWx1ZVxyXG4gICAgICAgID8gdGhpcy5fY3VyclJlY0lkeCArIDFcclxuICAgICAgICA6IDApO1xyXG5cclxuXHJcbiAgICAvL2xldCBuZXdDdXJyUmVjSWR4OiBudW1iZXIgPSAodGhpcy5fY3VyclJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpID9cclxuICAgICAgLy8odGhpcy5fY3VyclJlY0lkeCArIDEpXHJcbiAgICAgIC8vOiAwO1xyXG5cclxuICAgIHRoaXMuX3JlY29yZHNUYWIuaW5zZXJ0UmVjb3JkKHJlYywgbmV3Q3VyclJlY0lkeCk7XHJcbiAgICByZWMuc2V0TW9kZShtb2RlKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgY29tcHV0ZTogYm9vbGVhbiA9ICFpc0ZpcnN0UmVjb3JkO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdDdXJyUmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgY29tcHV0ZSwgSW50MzIuTWluVmFsdWUpO1xyXG5cclxuICAgICAgLy8gd2hpbGUgd2UgaW4gY3JlYXRlIG1vZGUgZG9uJ3Qgc2V0IHJlc2V0IHRvIF9uZXdSZWNcclxuICAgICAgaWYgKGlzRmlyc3RSZWNvcmQgJiYgdGhpcy5nZXRUYXNrKCkuZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICByZWMuc2V0T2xkUmVjKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhlY3B0aW9uKSB7XHJcbiAgICAgIGlmIChleGVjcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBuZXdDdXJyUmVjSWR4ID0gLTE7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gRGF0YVZpZXcuYWRkUmVjb3JkKCkgaW52YWxpZCBleGNlcHRpb25cIik7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleGVjcHRpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3Q3VyclJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZW1vdmVDdXJyUmVjKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBvbkRlbGV0ZTogYm9vbGVhbjsgLy8gdHJ1ZSBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIHJlY29yZCBkdWUgdG8gZGVsZXRlLiBmYWxzZSBpZiBkdWUgdG8gY2FuY2VsIG9uIGluc2VydFxyXG5cclxuICAgIGlmICh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmXHJcbiAgICAgICF0aGlzLmdldFRhc2soKS50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSkge1xyXG4gICAgICAvLyB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkIGJ5IHRoZSBjbGllbnQgc28gaXQgaGFzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGVcclxuICAgICAgLy8gbW9kaWZpZWQgcmVjb3JkcyB0YWJsZSAoaWYgaXQgaXMgYWxyZWFkeSB0aGVyZSkgYmVjYXVzZSB0aGUgc2VydmVyXHJcbiAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0byBrbm93IGFueXRoaW5nIGFib3V0IGl0XHJcbiAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQodGhpcy5DdXJyUmVjKTtcclxuICAgICAgb25EZWxldGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBtb3ZlIHRoZSBjdXJyZW50IHJlY29yZCBmcm9tIHRoZSByZWNvcmRzIHRhYmxlIHRvIHRoZSBtb2RpZmllZCB0YWJsZVxyXG4gICAgICB0aGlzLkN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG4gICAgICBvbkRlbGV0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLkN1cnJSZWMucmVtb3ZlUmVjRnJvbURjKCk7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZVJlY29yZCh0aGlzLl9jdXJyUmVjSWR4KTtcclxuICAgIHRoaXMuc2V0Q2hhbmdlZCh0cnVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgYXdhaXQgdGhpcy5Nb3ZlVG9FbXB0eURhdGF2aWV3SWZBbGxvd2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld0Rpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLmNhbGNMaW5lVG9Nb3ZlKG9uRGVsZXRlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChtZ0Zvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdEaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IG1nRm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShuZXdEaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgaW5kZXggaXMgYmV5b25kIHRoZSBib3R0b20gZW5kIG9mIHRoZSBkYXRhdmlld1xyXG4gICAgICAgIC8vIHRyeSB0byBzZXQgaXQgdG8gdGhlIHByZWNlZGluZyByZWNvcmRcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKCFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgbmV3RGlzcGxheUxpbmUgPSBtZ0Zvcm0uZ2V0UHJldkxpbmUobmV3RGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgaWYgKG1nRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3RGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXdhaXQgbWdGb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBubyBtb3JlIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgICAgIC8vIG9yIG5vIG5vZGVzIGluIHRoZSB0cmVlXHJcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZW1vdmUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvcmRcIj48L3BhcmFtPlxyXG4gIFJlbW92ZVJlY29yZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgocmVjb3JkLmdldElkKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl90b3BSZWNJZHggPiByZWNJZHgpXHJcbiAgICAgIHRoaXMuX3RvcFJlY0lkeC0tO1xyXG4gICAgaWYgKHRoaXMuX29sZFRvcFJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fb2xkVG9wUmVjSWR4LS07XHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fY3VyclJlY0lkeC0tO1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5yZW1vdmVSZWNvcmQocmVjb3JkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbW92ZSB0byBlbXB0eSBkYXRhdmlldyBpZiBhbGxvd2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBNb3ZlVG9FbXB0eURhdGF2aWV3SWZBbGxvd2VkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0VNUFRZX0RBVEFWSUVXLCB0cnVlKSlcclxuICAgICAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgc3VwZXIuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgc3VwZXIuc2V0RW1wdHlEYXRhdmlldyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBkaXNwbGF5IGxpbmUgdG8gbW92ZSBhZnRlciBkZWxldGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25EZWxldGVcIj50cnVlIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgcmVjb3JkIGR1ZSB0byBkZWxldGUuIGZhbHNlIGlmIGR1ZSB0byBjYW5jZWwgb24gaW5zZXJ0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjYWxjTGluZVRvTW92ZShvbkRlbGV0ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgbmV3RGlzcGxheUxpbmU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVjb3JkIGlzIHJlbW92ZWQgZHVlIHRvIGl0cyBkZWxldGlvbiwgd2UgbmVlZCB0byBnb3QgdG8gdGhlIG5leHQgcmVjb3JkIGluIHRoZSB2aWV3IC1cclxuICAgIC8vIG5vdyB0aGF0IHdlIGRlbGV0ZWQgdGhlIGN1cnJlbnQgcmVjb3JkLCB0aGUgaW5kZXggb2YgdGhlIG5leHQgcmVjb3JkIGlzIHRoZSBzYW1lIGluZGV4IHRoYXQgd2FzXHJcbiAgICAvLyBvZiB0aGUgcmVjb3JkIHRoYXQgd2FzIGRlbGV0ZWQuXHJcblxyXG4gICAgaWYgKG9uRGVsZXRlKVxyXG4gICAgICBuZXdEaXNwbGF5TGluZSA9IHRoaXMuX2N1cnJSZWNJZHg7XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gIzc1MDE5MCBTaGF5YVxyXG4gICAgICAvLyBtb3ZlIHRvIHRoZSBQUkVWIHJlY29yZCBhZnRlciBjYW5jZWxcclxuICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggPiAwKVxyXG4gICAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeCAtIDE7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBuZXdEaXNwbGF5TGluZSA9IHRoaXMuX2N1cnJSZWNJZHg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3RGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdmFsdWVzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkeCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgIHRoaXMuU2V0SW5jbHVkZXNGaXJzdCh0cnVlKTtcclxuICAgIHRoaXMuU2V0SW5jbHVkZXNMYXN0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbmNlbCB0aGUgZWRpdGluZyBvZiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMgb2ZcclxuICAvLy8gICB0aGUgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZWFsXCI+aWYgdHJ1ZSBvbmx5IHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIHJlYWwgZmllbGRzLiA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjb21wdXRlVW5rbm93bnNcIj5yZS1wZXJmb3JtIHVua25vd24gcmVjb21wdXRlcy4gPC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KG9ubHlSZWFsOiBib29sZWFuLCByZWNvbXB1dGVVbmtub3duczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRlbXBDdXJyUmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpbkVuZFRhc2s6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaztcclxuXHJcbiAgICAvLyBRQ1IgIzM2MjkwMyAtIEF0IF90YXNrIHN1ZmZpeCwgd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGUgbGFzdCB2YWx1ZXMgb2YgdGhlIHZpcnR1YWxzLlxyXG4gICAgaWYgKGluRW5kVGFzaylcclxuICAgICAgb25seVJlYWwgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLkN1cnJSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIHRoaXMuQ3VyclJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgIGlmICgodGhpcy5faW5jbHVkZXNGaXJzdCAmJiB0aGlzLl9pbmNsdWRlc0xhc3QgJiYgKHRoaXMuX3JlY29yZHNUYWIgPT09IG51bGwgfHwgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDEpKSB8fCAhdGhpcy5IYXNNYWluVGFibGUpIHtcclxuXHJcbiAgICAgICAgLy8gZGVmZWN0IDEyMTk2OC4gV2hlbiBmcm9tIHRoZSBwYXJlbnQgdGFzayBcIlZpZXdSZWZyZXNoXCIgb3IgXCJDYW5jZWxcIiBhcmUgZG9uZSBhbmQgdGhlIHN1YmZvcm0gaXMgaW4gQ3JlYXRlIG5vZGVcclxuICAgICAgICAvLyBhbmQgdGhlIHN1YmZvcm0gaGFzIG5vIHJlY29yZHMsIF9vcmlnaW5hbCBpcyBudWxsLiBTbyBwYXNzIGl0LlxyXG4gICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5DdXJyUmVjLnNldFNhbWVBcyh0aGlzLl9vcmlnaW5hbCwgb25seVJlYWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUN1cnJSZWMoKTtcclxuICAgICAgICByZWNSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTsgLy8gbXVzdCBjb3B5IGFnYWluIHRvIHByZXZlbnQgYWx0ZXJpbmcgdGhlIG9yaWdpbmFsIHZhbHVlc1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiAoY3VyclJlYy5tb2RpZmllZCgpKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5DdXJyUmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgbGV0IGN1cnJDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAoY3VyckN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICBjdXJyQ3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlY29tcHV0ZVVua25vd25zKVxyXG4gICAgICAgIHRlbXBDdXJyUmVjID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG5cclxuICAgICAgLy8gQVRURU5USU9OICEhIVxyXG4gICAgICAvLyB3ZSBkb24ndCBzdGVwIG92ZXIgdGhlIGN1cnJSZWMgcmVmZXJlbmNlIHdpdGggdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gICAgICAvLyB0byBhc3N1cmUgdGhhdCBpZiB0aGlzIHJlY29yZCBpcyBib3RoIGluIHRoZSByZWNvcmRzIHRhYmxlIGFuZCBpblxyXG4gICAgICAvLyB0aGUgbW9kaWZpZWQgdGFibGUgdGhlc2UgdGFibGVzIHdpbGwga2VlcCByZWZlcmVuY2luZyB0aGUgc2FtZSBpbnN0YW5jZVxyXG4gICAgICBpZiAodGhpcy5fb3JpZ2luYWwgIT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5DdXJyUmVjLnNldFNhbWVBcyh0aGlzLl9vcmlnaW5hbCwgb25seVJlYWwpO1xyXG5cclxuICAgICAgaWYgKCh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbCAmJiByZWNvbXB1dGVVbmtub3ducykgJiYgIXRoaXMuQ3VyclJlYy5pc1NhbWVSZWNEYXRhKHRlbXBDdXJyUmVjLCBmYWxzZSwgZmFsc2UpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY1Vua25vd25SY21wcyh0aGlzLl9vcmlnaW5hbCk7XHJcblxyXG4gICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICAgICAgdGhpcy5fb3JpZ2luYWwgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7IC8vIG11c3QgY29weSBhZ2FpbiB0byBwcmV2ZW50IGFsdGVyaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXNcclxuICAgIH1cclxuICAgIHJldHVybiByZWNSZW1vdmVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiAodGhpcy5fcmVjb3Jkc1RhYiA9PT0gbnVsbCB8fCB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZCgpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZChzZXRSZWNUb09sZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKHNldFJlY1RvT2xkPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHNldFJlY1RvT2xkKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmFkZEN1cnJUb01vZGlmaWVkXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJyVG9Nb2RpZmllZF8xKHNldFJlY1RvT2xkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlIC0gaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWRfMCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuYWRkQ3VyclRvTW9kaWZpZWQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZSAtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1NldE9sZFJlY1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZF8xKHNldFJlY1RvT2xkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuYWRkUmVjb3JkKHRoaXMuQ3VyclJlYyk7XHJcbiAgICBpZiAoc2V0UmVjVG9PbGQpIHtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldE9sZFJlYygpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2V0VHJhbnNhY3Rpb25TdGF0ZURhdGF2aWV3Q29tbWFuZCh0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgdGhlIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpOiB2b2lkIHtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS50YWtlVmFsc0Zyb21SZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIGEgc2VsZWN0ZWQgZmllbGRzIHZhbHVlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgdGhlIHByZXZpb3VzIHJlY29yZFxyXG4gIC8vLyAgIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZExpc3RcIj50aGUgbGlzdCBvZiBmaWVsZCBpbmRleGVzIHRvIGNvbXBhcmVcclxuICAvLy8gPC9wYXJhbT5cclxuICBjdXJyRXF1YWxzUHJldihmbGRMaXN0OiBudW1iZXJbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuQ3VyclJlYyAhPT0gbnVsbCAmJiB0aGlzLl9wcmV2Q3VyclJlYyAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjID09PSB0aGlzLl9wcmV2Q3VyclJlYylcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGRMaXN0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkN1cnJSZWMuZmxkVmFsc0VxdWFsKHRoaXMuX3ByZXZDdXJyUmVjLCBmbGRMaXN0W2ldKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5DdXJyUmVjICE9PSB0aGlzLl9wcmV2Q3VyclJlYylcclxuICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBfdGFzayBvZiB0aGlzIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl90YXNrIGluc3RhbmNlb2YgVGFza0Jhc2UpO1xyXG4gICAgcmV0dXJuIDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybSBmb3IgX3Rhc2sgb2YgdGhpcyBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm0ge1xyXG4gICAgcmV0dXJuIDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgbW9kaWZpZWQgcmVjb3JkcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbW9kaWZpZWRSZWNvcmRzTnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpZW50IGtub3dzIGhvdyB0byBpbml0IGEgbmV3IHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbXB1dGVCeUNsaWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wdXRlQnkgPT09IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVC8qJ0MnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgUmVjb3JkIGV4aXN0cyBpbiB0aGUgRGF0YVZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5vZiBuZWVkZWQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSByZWNvcmQgZXhpc3RzIDwvcmV0dXJucz5cclxuICByZWNFeGlzdHNCeUlkKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY29yZChpZCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgUGFyYW1ldGVyc0V4aXN0KGlQb3M6IG51bWJlciwgaUxlbjogbnVtYmVyKTogYm9vbGVhbjtcclxuICBQYXJhbWV0ZXJzRXhpc3QoKTogYm9vbGVhbjtcclxuICBQYXJhbWV0ZXJzRXhpc3QoaVBvcz86IG51bWJlciwgaUxlbj86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHJldHVybiB0aGlzLlBhcmFtZXRlcnNFeGlzdF8wKGlQb3MsIGlMZW4pO1xyXG4gICAgcmV0dXJuIHRoaXMuUGFyYW1ldGVyc0V4aXN0XzEoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGVyZSBhcmUgcGFyYW1zIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaVBvc1wiPnBvc2l0aW9uIG9mIGZpcnN0IGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlMZW5cIj5udW1iZXIgb2YgZmllbGRzIGluIHRoZSByYW5nZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlID0gdGhlcmUgYXJlIHBhcmFtZXRlcnMgaW4gdGhlIHJhbmdlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgUGFyYW1ldGVyc0V4aXN0XzAoaVBvczogbnVtYmVyLCBpTGVuOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGlQb3M7IGkgPCBpUG9zICsgaUxlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmICgoPEZpZWxkPnN1cGVyLmdldEZpZWxkKGkpKS5pc1BhcmFtKCkpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXJhbXMgaW4gRGF0YXZpZXcgdGFiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgUGFyYW1ldGVyc0V4aXN0XzEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5QYXJhbWV0ZXJzRXhpc3QodGhpcy5fcm1JZHgsIHRoaXMuX3JtU2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgcmVjb3JkIGlzIGluIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHJlY0luTW9kaWZpZWRUYWIoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlY29yZDogUmVjb3JkID0gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZChpZCk7XHJcbiAgICByZXR1cm4gcmVjb3JkICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldkN1cnJSZWMoKTogdm9pZDtcclxuICBzZXRQcmV2Q3VyclJlYyhyZWM6IFJlY29yZCk6IHZvaWQ7XHJcbiAgc2V0UHJldkN1cnJSZWMocmVjPzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNldFByZXZDdXJyUmVjXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRQcmV2Q3VyclJlY18xKHJlYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2F2ZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGFzIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRQcmV2Q3VyclJlY18wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSB0aGlzLkN1cnJSZWM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFByZXZDdXJyUmVjXzEocmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gcmVjO1xyXG4gIH1cclxuXHJcbiAgaXNQcmV2Q3VyclJlY051bGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldkN1cnJSZWMgPT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjb21wdXRlIGFsbCB2aXJ0dWFscyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbiB3aGljaCBoYXZlIHNlcnZlciByZWNvbXB1dGUgZGVmaW5lZCBmb3IgdGhlbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3JnUmVjXCI+Y29udGFpbnMgdGhlIHZpcnR1YWwncyBvcmlnaW5hbCB2YWx1ZSA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY1Vua25vd25SY21wcyhvcmdSZWM6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNSWR4KCk7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNU2l6ZSgpO1xyXG5cclxuICAgIGxldCByZWM6IFJlY29yZCA9IHRoaXMuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIEZpcnN0IHRpbWUgLSBpbml0aWFsaXplIHVua25vd25SY21wIHZhbHVlXHJcbiAgICBpZiAodGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfTk9UX0lOSVRFRCkge1xyXG5cclxuICAgICAgZm9yIChpID0gZnJvbTtcclxuICAgICAgICAgICBpIDwgZnJvbSArIHNpemUgJiYgdGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfTk9UX0lOSVRFRDtcclxuICAgICAgICAgICBpKyspIHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5Jc1ZpcnR1YWwgJiYgIWZpZWxkLmhhc0luaXRFeHAoKSAmJiBmaWVsZC5pc1NlcnZlclJjbXAoKSlcclxuICAgICAgICAgIHRoaXMuX3Vua25vd25SY21wID0gVU5LTk9XTl9SQ01QU19GT1VORC8qJ1knKi87XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3Vua25vd25SY21wID09PSBVTktOT1dOX1JDTVBTX0ZPVU5EIC8qJ1knKi8gJiYgcmVjICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGkpO1xyXG4gICAgICAgIGlmIChmaWVsZC5Jc1ZpcnR1YWwgJiYgIWZpZWxkLmhhc0luaXRFeHAoKSAmJiBmaWVsZC5pc1NlcnZlclJjbXAoKSAmJiAhcmVjLmZsZFZhbHNFcXVhbChvcmdSZWMsIGkpKSB7XHJcbiAgICAgICAgICBsZXQgZmllbGRWYWx1ZTogc3RyaW5nID0gcmVjLkdldEZpZWxkVmFsdWUoaSk7XHJcbiAgICAgICAgICBsZXQgaXNOdWxsRmxkOiBib29sZWFuID0gcmVjLklzTnVsbChpKTtcclxuICAgICAgICAgIHJlYy5zZXRGaWVsZFZhbHVlKGksIG9yZ1JlYy5HZXRGaWVsZFZhbHVlKGkpLCBmYWxzZSk7XHJcbiAgICAgICAgICBhd2FpdCBmaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkVmFsdWUsIGlzTnVsbEZsZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0cmFuc0NsZWFyZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VHJhbnNDbGVhcmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwZXJmb3JtIGFueSBkYXRhIGVycm9yIHJlY292ZXJ5IGFjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIHByb2Nlc3NSZWNvdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5fdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgbGV0IG9yZ0FjdGlvbjogc3RyaW5nID0gdGhpcy5fcGVuZGluZ1JlY292ZXJ5O1xyXG4gICAgICBsZXQgb3JnU3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcblxyXG4gICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfTk9ORTtcclxuICAgICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICBsZXQgdGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeDtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBlcnJvciBmcm9tIHdoaWNoIHdlIHJlY292ZXIgaGFwcGVuZWQgd2hpbGUgaW4gY3RybCBwcmVmaXgsIHJlc2V0IGl0IGZvciB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkIGhlcmUsXHJcbiAgICAgIC8vIHNvIHRoYXQgZW50ZXJpbmcgYSBuZXcgY29udHJvbCB3aWxsIHdvcmsgKERlZmVjdCAxMjIzODcpLlxyXG4gICAgICBpZiAodGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXgpXHJcbiAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgIHN3aXRjaCAob3JnQWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgKCg8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5yZXNldFVwZGF0ZWQoKTtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzc3Mzk3OSAodXBkYXRlZCByZWNvcmQgY2FudCBiZSBjYW5jZWxlZClcclxuXHJcbiAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAvLyBxY3IgIzc3Njk1Mi4gY3JlYXRlIG1vZGUgYW5kIG9ubHkgMSByZWMgb24gZHYuIFRoZSBzZXJ2ZXIgaGFzIG9yZGVyZWRcclxuICAgICAgICAgIC8vIGEgcm9sbGJhY2suIEhlcmUsIHdlIHJlc2V0IG9yaWdpbmFsIHJlYyBhbmQgY3VyciByZWMgdG8gaW5zZXJ0IG1vZGUsXHJcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIG5leHQgdGltZSB0aGUgY2xpZW50IHdpbGwgc2V0IHVwZGF0ZSBtb2RlIGZvciB0aGUgcmVjIGluc3RlYWQgb2YgaW5zZXJ0LlxyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpID09PSAxICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMucmVzZXRNb2RpZmllZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICAgICAgICB0aGlzLkN1cnJSZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsLnNldFNhbWVBcyh0aGlzLkN1cnJSZWMsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBUaGUgY2FuY2VsIGhhbmRsZWQgaGVyZSB3aWxsIG5vdCBjYXVzZWQgYSByb2xsYmFjayBzaW5jZSBpdCB3YXMgcmFpc2VkIGJ5IHJvbGxiYWNrLiAocm9sbGIgYWxyZWFkeSBkb25lIGluIHNlcnZlcikuXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGhpcy5nZXRUYXNrKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsXHJcbiAgICAgICAgICAgIEV2ZW50U3ViVHlwZS5DYW5jZWxXaXRoTm9Sb2xsYmFjayk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyMzIwOiBXaGVuIERhdGFiYXNlIGVycm9yIG9jY3VycyB3ZSBuZWVkIG5vdCBjYWxsIFJlY29yZCBzdWZmaXggYWdhaW4gYXMgdGhpcyBpcyBjYWxsZWQgZnJvbSBSZWNvcmQgc3VmZml4LlxyXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBhdHRlbXB0IHRvIHBhcmsgb24gbGFzdHBhcmtlZEN0cmwgYW5kIHdhaXQgdGhlcmVcclxuICAgICAgICAgIGxldCBsYXN0UGFya2VkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBpZihsYXN0UGFya2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgYXdhaXQgbGFzdFBhcmtlZENvbnRyb2wuaW52b2tlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQkVHSU5fU0NSRUVOOlxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1BBR0UpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEU6XHJcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGFjdGlvbiBpcyBlbmFibGVkIG5vIG1hdHRlciBvdXIgbG9jYXRpb24gaW4gdGhlIHRhYmxlLiBvdGhlcndpc2UsIHJlYyBwcmVmaXggd2lsbCBub3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgcm9sbGJhY2suXHJcbiAgICAgICAgICB0aGlzLl90YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCk7XHJcbiAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24ob3JnU3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGVtcG9yYXJ5UmVzZXRJbkN0cmxQcmVmaXgpXHJcbiAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKG9yZ0FjdGlvbiAhPT0gUkVDT1ZFUllfQUNUX05PTkUpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlLCBvcmdBY3Rpb24gIT09IFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGVjaWF0ZXMgdGhlIGN1cnJlbnQgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlcGxpY2F0ZSgpOiBEYXRhVmlldyB7XHJcbiAgICBsZXQgcmVwOiBEYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHJlcC5fcmVjb3Jkc1RhYiA9IHRoaXMuX3JlY29yZHNUYWIucmVwbGljYXRlKCk7XHJcbiAgICByZXAuX2N1cnJSZWNJZCA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKS5nZXRJZCgpO1xyXG4gICAgcmVwLl9jdXJyUmVjSWR4ID0gMDtcclxuICAgIHJlcC5DdXJyUmVjID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG4gICAgcmVwLl9wcmV2Q3VyclJlYyA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIHJlcC5fb3JpZ2luYWwgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICByZXAuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgIC8vIHdlIG11c3QgY2hlY2sgZGNWYWxzIGlmIGl0IG5lZWQgdG8gYmUgcmVwbGljYXRlZCBhcyB3ZWxsIGN1cnJlbnR5IHdlIHRoaW5rIG5vdFxyXG4gICAgcmV0dXJuIHJlcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZSBub24gaGFzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREdlBvc1ZhbHVlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZQb3NWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZC52IGlzIHBhcnNlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rmlyc3REdigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdER2O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBkLnYgaXMgcGFyc2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldEZpcnN0RHYoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdER2ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoaXMgZGF0YXZpZXcgY2FjaGUgdGltZSBzdGFtcFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2FjaGVMUlUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB0aW1lIHN0YW1wIG9mIHRoZSBkYXRhdmlld1xyXG4gIC8vLyAgIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YXZpZXcgaW4gY2FjaGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldENhY2hlTFJVKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGVMcnVUaW1lU3RhbXAgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG5ld3MgdG8gdGFrZSB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGR2IGFuZCB0byBzZXQgdGhlbSBhcyB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAvLy8gICB0aGUgZ2l2ZW4gZHYgaXMgdXN1YWxseSBjcmVhdGVkIHZpYSBkYXRhdmlldy5yZXBsaWNhdGUoKVxyXG4gIC8vLyAgIHRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2UgdGhlIHZhbHVlcyBvZiAgbGFzdFNlc3Npb25Db3VudCBhbmQgY2FjaGVMUlVUaW1lU3RhbXBcclxuICAvLy8gICBmcm9tIHRoZSBnaXZlbiBkdiBzaW5jZSB0aGV5IHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gb25lIGN1cnJlbnQgZHYgdG8gdGhlIG90aGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBzZXRTYW1lQXMobmV3RHY6IERhdGFWaWV3KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9ybVNpemUgPSBuZXdEdi5fcm1TaXplO1xyXG4gICAgdGhpcy5fcm1JZHggPSBuZXdEdi5fcm1JZHg7XHJcbiAgICB0aGlzLl9jb21wdXRlQnkgPSBuZXdEdi5fY29tcHV0ZUJ5O1xyXG4gICAgdGhpcy5fZmx1c2hVcGRhdGVzID0gbmV3RHYuX2ZsdXNoVXBkYXRlcztcclxuICAgIHRoaXMuX2N1cnJSZWNJZCA9IG5ld0R2Ll9jdXJyUmVjSWQ7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gbmV3RHYuX2N1cnJSZWNJZHg7XHJcbiAgICB0aGlzLl90b3BSZWNJZCA9IG5ld0R2Ll90b3BSZWNJZDtcclxuICAgIHRoaXMuQ3VyclJlYyA9IG5ld0R2LkN1cnJSZWM7XHJcbiAgICB0aGlzLl9vcmlnaW5hbCA9IG5ld0R2Ll9vcmlnaW5hbDtcclxuICAgIHRoaXMuX3ByZXZDdXJyUmVjID0gbnVsbDtcclxuICAgIHRoaXMuX2ZpZWxkc1RhYiA9IG5ld0R2Ll9maWVsZHNUYWI7XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiID0gbmV3RHYuX3JlY29yZHNUYWI7XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIgPSBuZXdEdi5fbW9kaWZpZWRSZWNvcmRzVGFiO1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IG5ld0R2Ll9pbmNsdWRlc0ZpcnN0O1xyXG4gICAgdGhpcy5faW5jbHVkZXNMYXN0ID0gbmV3RHYuX2luY2x1ZGVzTGFzdDtcclxuICAgIHRoaXMuX2luc2VydEF0ID0gbmV3RHYuX2luc2VydEF0O1xyXG4gICAgdGhpcy5fbGFzdENyZWF0ZWRSZWNJZCA9IG5ld0R2Ll9sYXN0Q3JlYXRlZFJlY0lkO1xyXG4gICAgdGhpcy5fdGFzayA9IG5ld0R2Ll90YXNrO1xyXG4gICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbiA9IG5ld0R2Ll9kY1ZhbHNDb2xsZWN0aW9uO1xyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSBuZXdEdi5fcmVjb3Zlcnk7XHJcbiAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBuZXdEdi5fcGVuZGluZ1JlY292ZXJ5O1xyXG4gICAgdGhpcy5faGFzTWFpblRhYmxlID0gbmV3RHYuX2hhc01haW5UYWJsZTtcclxuICAgIHRoaXMuX2NodW5rU2l6ZSA9IG5ld0R2Ll9jaHVua1NpemU7XHJcbiAgICB0aGlzLl9maXJzdER2ID0gbmV3RHYuX2ZpcnN0RHY7XHJcbiAgICB0aGlzLl9sYXN0U2Vzc2lvbkNvdW50ZXIgPSBuZXdEdi5fbGFzdFNlc3Npb25Db3VudGVyO1xyXG4gICAgdGhpcy5fc2tpcFBhcnNpbmcgPSBuZXdEdi5fc2tpcFBhcnNpbmc7XHJcbiAgICB0aGlzLl91bmtub3duUmNtcCA9IG5ld0R2Ll91bmtub3duUmNtcDtcclxuICAgIHRoaXMuX3RyYW5zQ2xlYXJlZCA9IG5ld0R2Ll90cmFuc0NsZWFyZWQ7XHJcbiAgICB0aGlzLl9kdlBvc1ZhbHVlID0gbmV3RHYuX2R2UG9zVmFsdWU7XHJcbiAgICB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcCA9IG5ld0R2Ll9jYWNoZUxydVRpbWVTdGFtcDtcclxuICAgIHRoaXMuX2NoYW5nZWQgPSBuZXdEdi5fY2hhbmdlZDtcclxuICAgIHRoaXMuX2xvY2F0ZUZpcnN0UmVjID0gbmV3RHYuX2xvY2F0ZUZpcnN0UmVjO1xyXG4gICAgc3VwZXIuc2V0RW1wdHlEYXRhdmlldyhuZXdEdi5pc0VtcHR5RGF0YXZpZXcoKSk7XHJcbiAgICB0aGlzLl90YXNrLnNldE1vZGUobmV3RHYudGFza01vZGVGcm9tQ2FjaGUpO1xyXG5cclxuICAgIC8vIFVQREFURSBUSEUgVEFCTEUgRElTUExBWVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLkhhc0xvYWN0ZSgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjKHRoaXMuX2xvY2F0ZUZpcnN0UmVjLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCh0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeCh0aGlzLl9sb2NhdGVGaXJzdFJlYykpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoSW50MzIuTWluVmFsdWUsIHRydWUsIGZhbHNlLCB0cnVlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBpZiAoKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgICB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50ID0gbmV3RHYuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgICAgICB0aGlzLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IG5ld0R2LlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgodGhpcy5fdG9wUmVjSWR4LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgSW50MzIuTWluVmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT09IG51bGwpXHJcbiAgICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIndyb25nIHRvcCByZWNvcmQgaWR4IGluIERhdGFWaWV3LnNldFNhbWVBc1wiICsgZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q2hhbmdlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NoYW5nZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRMb2NhdGVGaXJzdFJlYygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvY2F0ZUZpcnN0UmVjO1xyXG4gIH1cclxuXHJcbiAgc2V0TG9jYXRlRmlyc3RSZWMobmV3Rmlyc3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBuZXdGaXJzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgcmVjb3JkIGJ5IGl0cyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJlY0J5SWR4KGlkeDogbnVtYmVyKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgfVxyXG5cclxuICBnZXRTZXJ2ZXJDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICB6ZXJvU2VydmVyQ3VyclJlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIuemVyb1NlcnZlckN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIGluUm9sbGJhY2soKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW5Sb2xsYmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0sgLyonUicqLyAmJiB0aGlzLmdldFRhc2soKS5pc1RyYW5zYWN0aW9uT3duZXIoKSkge1xyXG4gICAgICBpblJvbGxiYWNrID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBpblJvbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldFJlY0lkeChpZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChpZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYmFja3VwIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBiYWNrdXBDdXJyZW50KCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgY3VycmVudCByZWNvcmQgZnJvbSBiYWNrdXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjQmFja3VwXCI+YmFja3VwIG9mIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgcmVzdG9yZUN1cnJlbnQocmVjQmFja3VwOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChyZWNCYWNrdXAgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gcmVjQmFja3VwLmdldElkKCk7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgodGhpcy5fY3VyclJlY0lkKTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fY3VyclJlY0lkeCk7XHJcbiAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHJlY0JhY2t1cCwgZmFsc2UpO1xyXG4gICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICBHZXRSZWNvcmRCeUlkKGlkOiBudW1iZXIpOiBJUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY29yZChpZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgbW9kaWZpZWQgcmVjb3JkIG9mIHRoZSB0YXNrIC0gbnVsbCBpZiBubyByZWNvcmQgd2FzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldE1vZGlmaWVkUmVjb3JkKCk6IFJlY29yZCB7XHJcbiAgICBsZXQgcmVjb3JkOiBSZWNvcmQgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAvLyBpbiBtb2RSZWNvcmRUYmwgd2UgbmVlZCB0byBoYXZlIG9ubHkgMSByZWNvcmRcclxuICAgICAgRGVidWcuQXNzZXJ0KHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDEpO1xyXG4gICAgICByZWNvcmQgPSB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjb3JkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGlkIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDdXJyZW50UmVjSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRhdGF2aWV3IGJvdW5kYXJpZXMgYXJlIGNoYW5nZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzRmlyc3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzTGFzdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBEYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiwgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb3JnSW5jbHVkZXNGaXJzdCAhPT0gdGhpcy5JbmNsdWRlc0ZpcnN0KCkgfHwgb3JnSW5jbHVkZXNMYXN0ICE9PSB0aGlzLkluY2x1ZGVzTGFzdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGluZGV4IG9mIGZpcnN0IGZpZWxkIGluIERhdGFWaWV3IFRhYlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWNvcmRNYWluSWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm1JZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgbnVtYmVyIG9mIGZpZWxkcyBpbiBEYXRhVmlldyBUYWJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVjb3JkTWFpblNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ybVNpemU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJvdXRlIHBhcmFtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0Um91dGVQYXJhbXMoKTogTGlzdDxhbnk+IHtcclxuICAgIGxldCBwYXJhbXM6IExpc3Q8YW55PiA9IG5ldyBMaXN0KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2ZpZWxkc1RhYi5nZXRTaXplKCk7IGkrKykge1xyXG5cclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGxldCB2YWw6IGFueTtcclxuICAgICAgaWYgKGZpZWxkLklzRXhwb3NlZFJvdXRlUGFyYW0gJiYgIWZpZWxkLmlzTnVsbCgpKSB7XHJcbiAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwudHJpbSgpO1xyXG4gICAgICAgICAgICBwYXJhbXMucHVzaCgoPHN0cmluZz52YWwpLmxlbmd0aCA9PT0gMCA/IFwiIFwiIDogdmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaCgoZmllbGQuZ2V0RGlzcFZhbHVlKCkpLmNoYXJBdCgwKSA9PT0gJzEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICBsZXQgcGljOiBQSUMgPSBuZXcgUElDKGZpZWxkLmdldFBpY3R1cmUoKSwgZmllbGQuZ2V0VHlwZSgpLCB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgICAgICB2YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AodmFsLCBcIlwiLCBwaWMsIHRydWUsIDAsIGZhbHNlKTtcclxuICAgICAgICAgICAgcGFyYW1zLnB1c2godmFsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHBhcmFtcy5sZW5ndGggPiAwKSA/IHBhcmFtcyA6IG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|