@magic-xpa/engine 4.1100.0-dev4110.2 → 4.1100.0-dev4110.202
Sign up to get free protection for your applications and to get access to all the features.
- package/{esm2020 → esm2022}/index.mjs +188 -188
- package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
- package/esm2022/src/AccessHelper.mjs +15 -0
- package/esm2022/src/ClientManager.mjs +409 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/esm2022/src/CommandsProcessorManager.mjs +26 -0
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +517 -0
- package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/FlowMonitorInterface.mjs +16 -0
- package/esm2022/src/GUIManager.mjs +62 -0
- package/esm2022/src/GlobalCommandsManager.mjs +34 -0
- package/esm2022/src/GuiEventsProcessor.mjs +157 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +122 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
- package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
- package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
- package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
- package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
- package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
- package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
- package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
- package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
- package/esm2022/src/data/DataView.mjs +1613 -0
- package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
- package/esm2022/src/data/DataviewManager.mjs +28 -0
- package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
- package/esm2022/src/data/DvCache.mjs +67 -0
- package/esm2022/src/data/Field.mjs +646 -0
- package/esm2022/src/data/FieldBase.mjs +15 -0
- package/esm2022/src/data/FieldsTable.mjs +103 -0
- package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +88 -0
- package/esm2022/src/data/Record.mjs +866 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2020 → esm2022}/src/enums.mjs +23 -23
- package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2022/src/env/Environment.mjs +487 -0
- package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +227 -0
- package/esm2022/src/env/MirrorString.mjs +65 -0
- package/esm2022/src/event/ActionManager.mjs +91 -0
- package/esm2022/src/event/Event.mjs +1333 -0
- package/esm2022/src/event/EventHandler.mjs +766 -0
- package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
- package/esm2022/src/event/EventsManager.mjs +2988 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +399 -0
- package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
- package/esm2022/src/event/UserEventsTable.mjs +47 -0
- package/esm2022/src/exp/ExpTable.mjs +57 -0
- package/esm2022/src/exp/Expression.mjs +200 -0
- package/esm2022/src/exp/ExpressionDict.mjs +727 -0
- package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2022/src/exp/YesNoExp.mjs +36 -0
- package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
- package/esm2022/src/gui/FormsTable.mjs +66 -0
- package/esm2022/src/gui/MgControl.mjs +363 -0
- package/esm2022/src/gui/MgForm.mjs +1181 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
- package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
- package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
- package/esm2022/src/http/client/HttpUtility.mjs +84 -0
- package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
- package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
- package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
- package/esm2022/src/rt/Argument.mjs +265 -0
- package/esm2022/src/rt/ArgumentsList.mjs +103 -0
- package/esm2022/src/rt/Boundary.mjs +152 -0
- package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
- package/esm2022/src/rt/ExecutionStack.mjs +94 -0
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/esm2022/src/rt/HandlersTable.mjs +96 -0
- package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
- package/esm2022/src/rt/Operation.mjs +735 -0
- package/esm2022/src/rt/OperationTable.mjs +67 -0
- package/esm2022/src/rt/Recompute.mjs +355 -0
- package/esm2022/src/rt/RecomputeTable.mjs +63 -0
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
- package/esm2022/src/rt/ResultValue.mjs +10 -0
- package/esm2022/src/rt/TableCache.mjs +177 -0
- package/esm2022/src/rt/TableCacheManager.mjs +67 -0
- package/esm2022/src/rt/Transaction.mjs +53 -0
- package/esm2022/src/security/UserDetails.mjs +71 -0
- package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +552 -0
- package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
- package/esm2022/src/tasks/RCTimer.mjs +63 -0
- package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2022/src/tasks/Task.mjs +2498 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
- package/esm2022/src/util/ConstUtils.mjs +14 -0
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/esm2022/src/util/HeapSort.mjs +70 -0
- package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
- package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
- package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
- package/esm2022/src/util/PrmMap.mjs +152 -0
- package/esm2022/src/util/ReturnResult.mjs +46 -0
- package/esm2022/src/util/ReturnResultBase.mjs +18 -0
- package/esm2022/src/util/Scrambler.mjs +89 -0
- package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
- package/esm2022/src/util/cookie.service.mjs +92 -0
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29750 -29694
- package/fesm2022/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +187 -187
- package/package.json +8 -14
- package/src/AccessHelper.d.ts +20 -20
- package/src/ClientManager.d.ts +34 -32
- package/src/CommandsProcessorBase.d.ts +23 -23
- package/src/CommandsProcessorManager.d.ts +6 -6
- package/src/CommandsTable.d.ts +22 -22
- package/src/ConstInterface.d.ts +516 -515
- package/src/CurrentClientVersion.d.ts +1 -1
- package/src/FlowMonitorInterface.d.ts +15 -15
- package/src/GUIManager.d.ts +17 -17
- package/src/GlobalCommandsManager.d.ts +17 -17
- package/src/GuiEventsProcessor.d.ts +24 -24
- package/src/ICommandsTable.d.ts +9 -9
- package/src/ServerConfig.d.ts +35 -34
- package/src/bridge/IGuiEvent.d.ts +19 -19
- package/src/bridge/MagicBridge.d.ts +16 -16
- package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
- package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
- package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
- package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
- package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
- package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
- package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
- package/src/commands/DataViewCommandBase.d.ts +6 -6
- package/src/commands/IClientCommand.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +12 -12
- package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
- package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
- package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
- package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
- package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
- package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
- package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
- package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
- package/src/communications/IConnectionStateManager.d.ts +4 -4
- package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
- package/src/data/DataSourceIdKey.d.ts +2 -2
- package/src/data/DataView.d.ts +162 -162
- package/src/data/DataViewBase.d.ts +12 -12
- package/src/data/DataviewManager.d.ts +14 -14
- package/src/data/DataviewManagerBase.d.ts +11 -11
- package/src/data/DvCache.d.ts +15 -15
- package/src/data/Field.d.ts +103 -103
- package/src/data/FieldBase.d.ts +23 -23
- package/src/data/FieldsTable.d.ts +27 -27
- package/src/data/IRecordsTable.d.ts +7 -7
- package/src/data/Key.d.ts +15 -15
- package/src/data/Record.d.ts +156 -156
- package/src/data/RecordOutOfDataViewException.d.ts +10 -10
- package/src/data/RecordsTable.d.ts +38 -38
- package/src/data/TaskTransactionManager.d.ts +17 -17
- package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
- package/src/enums.d.ts +21 -21
- package/src/env/EnvVariablesTable.d.ts +17 -17
- package/src/env/Environment.d.ts +118 -118
- package/src/env/ILanguageData.d.ts +3 -3
- package/src/env/LanguageData.d.ts +20 -20
- package/src/env/MirrorString.d.ts +15 -15
- package/src/event/ActionManager.d.ts +14 -14
- package/src/event/Event.d.ts +79 -79
- package/src/event/EventHandler.d.ts +66 -66
- package/src/event/EventHandlerPosition.d.ts +25 -25
- package/src/event/EventsManager.d.ts +205 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +126 -123
- package/src/event/RunTimeEventBase.d.ts +5 -5
- package/src/event/UserEventsTable.d.ts +11 -11
- package/src/exp/ExpTable.d.ts +11 -11
- package/src/exp/Expression.d.ts +37 -37
- package/src/exp/ExpressionDict.d.ts +12 -12
- package/src/exp/ExpressionEvaluator.d.ts +198 -198
- package/src/exp/ExpressionLocalJpn.d.ts +18 -18
- package/src/exp/GlobalParamsTable.d.ts +19 -19
- package/src/exp/YesNoExp.d.ts +9 -9
- package/src/gui/CreatedFormVector.d.ts +10 -10
- package/src/gui/FormsTable.d.ts +15 -15
- package/src/gui/MgControl.d.ts +60 -60
- package/src/gui/MgForm.d.ts +93 -93
- package/src/http/HttpManager.d.ts +25 -25
- package/src/http/client/HttpClientAsync.d.ts +16 -16
- package/src/http/client/HttpClientBase.d.ts +30 -30
- package/src/http/client/HttpClientEvents.d.ts +18 -18
- package/src/http/client/HttpClientSync.d.ts +17 -17
- package/src/http/client/HttpUtility.d.ts +10 -10
- package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
- package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
- package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
- package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
- package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
- package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
- package/src/remote/RemoteDataviewManager.d.ts +9 -9
- package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
- package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ServerError.d.ts +16 -16
- package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
- package/src/rt/Argument.d.ts +36 -36
- package/src/rt/ArgumentsList.d.ts +24 -24
- package/src/rt/Boundary.d.ts +27 -27
- package/src/rt/CompMainPrgTable.d.ts +10 -10
- package/src/rt/DataviewHeaderBase.d.ts +34 -34
- package/src/rt/DataviewHeaderFactory.d.ts +5 -5
- package/src/rt/DataviewHeaders.d.ts +12 -12
- package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
- package/src/rt/ExecutionStack.d.ts +22 -22
- package/src/rt/ExecutionStackEntry.d.ts +7 -7
- package/src/rt/HandlersTable.d.ts +19 -19
- package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
- package/src/rt/IDataviewHeader.d.ts +10 -10
- package/src/rt/IResultValue.d.ts +4 -4
- package/src/rt/LastFocusedManager.d.ts +23 -23
- package/src/rt/Operation.d.ts +97 -97
- package/src/rt/OperationTable.d.ts +15 -15
- package/src/rt/Recompute.d.ts +41 -41
- package/src/rt/RecomputeTable.d.ts +9 -9
- package/src/rt/RemoteDataviewHeader.d.ts +14 -14
- package/src/rt/ResultValue.d.ts +7 -7
- package/src/rt/TableCache.d.ts +29 -29
- package/src/rt/TableCacheManager.d.ts +10 -10
- package/src/rt/Transaction.d.ts +23 -23
- package/src/security/UserDetails.d.ts +16 -16
- package/src/tasks/IMGDataCollection.d.ts +26 -26
- package/src/tasks/MGData.d.ts +63 -63
- package/src/tasks/MGDataCollection.d.ts +42 -42
- package/src/tasks/RCTimer.d.ts +13 -13
- package/src/tasks/RemoteTaskService.d.ts +16 -16
- package/src/tasks/Task.d.ts +312 -312
- package/src/tasks/TaskBase.d.ts +123 -123
- package/src/tasks/TaskServiceBase.d.ts +16 -16
- package/src/tasks/TasksTable.d.ts +21 -21
- package/src/tasks/sort/Sort.d.ts +4 -4
- package/src/tasks/sort/SortCollection.d.ts +11 -11
- package/src/util/ConstUtils.d.ts +3 -3
- package/src/util/FlowMonitorQueue.d.ts +70 -70
- package/src/util/HeapSort.d.ts +6 -6
- package/src/util/IMirrorXML.d.ts +6 -6
- package/src/util/IServerConfig.d.ts +11 -11
- package/src/util/MgBlockingQueue.d.ts +5 -5
- package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
- package/src/util/MgPriorityQueue.d.ts +13 -13
- package/src/util/ParamParseResult.d.ts +6 -6
- package/src/util/PrmMap.d.ts +28 -28
- package/src/util/ReturnResult.d.ts +18 -18
- package/src/util/ReturnResultBase.d.ts +11 -11
- package/src/util/Scrambler.d.ts +10 -10
- package/src/util/UniqueIDUtils.d.ts +4 -4
- package/src/util/cookie.service.d.ts +8 -8
- package/esm2020/src/AccessHelper.mjs +0 -9
- package/esm2020/src/ClientManager.mjs +0 -399
- package/esm2020/src/CommandsProcessorBase.mjs +0 -58
- package/esm2020/src/CommandsProcessorManager.mjs +0 -26
- package/esm2020/src/CommandsTable.mjs +0 -162
- package/esm2020/src/ConstInterface.mjs +0 -516
- package/esm2020/src/FlowMonitorInterface.mjs +0 -16
- package/esm2020/src/GUIManager.mjs +0 -62
- package/esm2020/src/GlobalCommandsManager.mjs +0 -34
- package/esm2020/src/GuiEventsProcessor.mjs +0 -154
- package/esm2020/src/ServerConfig.mjs +0 -117
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
- package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
- package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
- package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
- package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
- package/esm2020/src/data/DataView.mjs +0 -1610
- package/esm2020/src/data/DataviewManager.mjs +0 -28
- package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
- package/esm2020/src/data/DvCache.mjs +0 -67
- package/esm2020/src/data/Field.mjs +0 -646
- package/esm2020/src/data/FieldBase.mjs +0 -18
- package/esm2020/src/data/FieldsTable.mjs +0 -103
- package/esm2020/src/data/Key.mjs +0 -88
- package/esm2020/src/data/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
- package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
- package/esm2020/src/env/Environment.mjs +0 -489
- package/esm2020/src/env/LanguageData.mjs +0 -226
- package/esm2020/src/env/MirrorString.mjs +0 -65
- package/esm2020/src/event/ActionManager.mjs +0 -91
- package/esm2020/src/event/Event.mjs +0 -1333
- package/esm2020/src/event/EventHandler.mjs +0 -766
- package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
- package/esm2020/src/event/EventsManager.mjs +0 -2975
- package/esm2020/src/event/RunTimeEvent.mjs +0 -392
- package/esm2020/src/event/UserEventsTable.mjs +0 -47
- package/esm2020/src/exp/ExpTable.mjs +0 -59
- package/esm2020/src/exp/Expression.mjs +0 -200
- package/esm2020/src/exp/ExpressionDict.mjs +0 -727
- package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
- package/esm2020/src/exp/YesNoExp.mjs +0 -36
- package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
- package/esm2020/src/gui/FormsTable.mjs +0 -66
- package/esm2020/src/gui/MgControl.mjs +0 -353
- package/esm2020/src/gui/MgForm.mjs +0 -1181
- package/esm2020/src/http/HttpManager.mjs +0 -97
- package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
- package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
- package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
- package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
- package/esm2020/src/http/client/HttpUtility.mjs +0 -84
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
- package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
- package/esm2020/src/remote/ServerError.mjs +0 -40
- package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
- package/esm2020/src/rt/Argument.mjs +0 -265
- package/esm2020/src/rt/ArgumentsList.mjs +0 -103
- package/esm2020/src/rt/Boundary.mjs +0 -152
- package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
- package/esm2020/src/rt/ExecutionStack.mjs +0 -94
- package/esm2020/src/rt/HandlersTable.mjs +0 -96
- package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
- package/esm2020/src/rt/Operation.mjs +0 -735
- package/esm2020/src/rt/OperationTable.mjs +0 -67
- package/esm2020/src/rt/Recompute.mjs +0 -355
- package/esm2020/src/rt/RecomputeTable.mjs +0 -63
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
- package/esm2020/src/rt/ResultValue.mjs +0 -12
- package/esm2020/src/rt/TableCache.mjs +0 -177
- package/esm2020/src/rt/TableCacheManager.mjs +0 -67
- package/esm2020/src/rt/Transaction.mjs +0 -53
- package/esm2020/src/security/UserDetails.mjs +0 -71
- package/esm2020/src/tasks/MGData.mjs +0 -552
- package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
- package/esm2020/src/tasks/RCTimer.mjs +0 -63
- package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
- package/esm2020/src/tasks/Task.mjs +0 -2496
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
- package/esm2020/src/util/ConstUtils.mjs +0 -14
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- package/esm2020/src/util/HeapSort.mjs +0 -70
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
- package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
- package/esm2020/src/util/PrmMap.mjs +0 -151
- package/esm2020/src/util/ReturnResult.mjs +0 -46
- package/esm2020/src/util/ReturnResultBase.mjs +0 -18
- package/esm2020/src/util/Scrambler.mjs +0 -89
- package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
- package/esm2020/src/util/cookie.service.mjs +0 -92
- package/fesm2015/magic-xpa-engine.mjs +0 -30836
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,1181 @@
|
|
1
|
+
import { Commands, CommandType, DataModificationTypes, GuiEnvironment, Manager, MgFormBase, PropInterface } from '@magic-xpa/gui';
|
2
|
+
import { Constants, InternalInterface, Logger, MgControlType, Misc, Priority, XMLConstants } from '@magic-xpa/utils';
|
3
|
+
import { ApplicationException, Debug, Exception, Int32, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
4
|
+
import { MgControl } from './MgControl';
|
5
|
+
import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
|
6
|
+
import { SET_DISPLAYLINE_BY_DV } from '../data/DataView';
|
7
|
+
import { TaskBase } from '../tasks/TaskBase';
|
8
|
+
import { ServerError } from '../remote/ServerError';
|
9
|
+
import { ConstInterface } from '../ConstInterface';
|
10
|
+
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
11
|
+
import { CreatedFormVector } from './CreatedFormVector';
|
12
|
+
import { AccessHelper } from '../AccessHelper';
|
13
|
+
export class MgForm extends MgFormBase {
|
14
|
+
static TIME_LIMIT = 50;
|
15
|
+
IsMovingInView = false;
|
16
|
+
PrevDisplayLine = 0;
|
17
|
+
RefreshAllRows = false;
|
18
|
+
IgnoreFirstRecordCycle = false;
|
19
|
+
MovedToFirstControl = false;
|
20
|
+
_suffixDone = false;
|
21
|
+
hiddenControlsIsnsList = null;
|
22
|
+
static _createdForms = new CreatedFormVector();
|
23
|
+
_transferringDataToGUI = false;
|
24
|
+
isFetchingRecordsAhead = false;
|
25
|
+
constructor() {
|
26
|
+
super();
|
27
|
+
}
|
28
|
+
static get CreatedForms() {
|
29
|
+
return MgForm._createdForms;
|
30
|
+
}
|
31
|
+
get InRestore() {
|
32
|
+
return this._inRestore;
|
33
|
+
}
|
34
|
+
get TransferringDataToGUI() {
|
35
|
+
return this._transferringDataToGUI;
|
36
|
+
}
|
37
|
+
get shouldFetchRecordsAheadFromServer() {
|
38
|
+
if (this.isTableWithPagination()) {
|
39
|
+
let prop = this._tableMgControl.GetComputedProperty(PropInterface.PROP_TYPE_SERVER_READ_AHEAD);
|
40
|
+
return (prop != null ? prop.GetComputedValueBoolean() : false);
|
41
|
+
}
|
42
|
+
else
|
43
|
+
return false;
|
44
|
+
}
|
45
|
+
async FetchRecordsAheadFromServer() {
|
46
|
+
this.isFetchingRecordsAhead = true;
|
47
|
+
await this.GetDataview().FetchRecordsAheadFromServer();
|
48
|
+
this.isFetchingRecordsAhead = false;
|
49
|
+
}
|
50
|
+
GetDataview() {
|
51
|
+
let dv = null;
|
52
|
+
if (this._task != null)
|
53
|
+
dv = this._task.DataView;
|
54
|
+
return (dv);
|
55
|
+
}
|
56
|
+
async moveInView(unit, direction) {
|
57
|
+
let oldRecId = Int32.MinValue;
|
58
|
+
let currRec = this.GetDataview().getCurrRec();
|
59
|
+
let oldTaskMode = ' ';
|
60
|
+
let returnToVisibleLine = false;
|
61
|
+
let recordOutOfView = false;
|
62
|
+
let visibleLine = 0;
|
63
|
+
try {
|
64
|
+
this.IsMovingInView = true;
|
65
|
+
let oldDisplayLine = this.DisplayLine;
|
66
|
+
if (unit === Constants.MOVE_UNIT_TABLE) {
|
67
|
+
try {
|
68
|
+
if (direction === Constants.MOVE_DIRECTION_BEGIN) {
|
69
|
+
await this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_FIRST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
|
70
|
+
if (this.isLineMode()) {
|
71
|
+
this.GetDataview().setTopRecIdx(0);
|
72
|
+
await this.setCurrRowByDisplayLine(0, false, false);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
else {
|
76
|
+
await this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_LAST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
|
77
|
+
if (this.isLineMode()) {
|
78
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage + 1);
|
79
|
+
if (this.GetDataview().getTopRecIdx() >= 0)
|
80
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
|
81
|
+
else {
|
82
|
+
this.GetDataview().setTopRecIdx(0);
|
83
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
this.updateDisplayLineByDV();
|
88
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
89
|
+
}
|
90
|
+
catch (ex) {
|
91
|
+
if (ex instanceof RecordOutOfDataViewException)
|
92
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
else {
|
96
|
+
this.getTopIndexFromGUI();
|
97
|
+
let size;
|
98
|
+
if (unit === Constants.MOVE_UNIT_PAGE && this.isLineMode()) {
|
99
|
+
switch (direction) {
|
100
|
+
case Constants.MOVE_DIRECTION_BEGIN:
|
101
|
+
size = this.GetDataview().getCurrRecIdx() - this.GetDataview().getTopRecIdx();
|
102
|
+
break;
|
103
|
+
case Constants.MOVE_DIRECTION_END:
|
104
|
+
let last = this.GetDataview().getTopRecIdx() + this._rowsInPage - 1;
|
105
|
+
last = Math.min(last, this.GetDataview().getSize() - 1);
|
106
|
+
size = last - this.GetDataview().getCurrRecIdx();
|
107
|
+
break;
|
108
|
+
default:
|
109
|
+
returnToVisibleLine = true;
|
110
|
+
size = this._rowsInPage;
|
111
|
+
break;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
else
|
115
|
+
size = 1;
|
116
|
+
size = (direction === Constants.MOVE_DIRECTION_PREV ||
|
117
|
+
direction === Constants.MOVE_DIRECTION_BEGIN
|
118
|
+
? -size
|
119
|
+
: size);
|
120
|
+
if (this.isLineMode()) {
|
121
|
+
visibleLine = this.getVisibleLine();
|
122
|
+
if (visibleLine < 0) {
|
123
|
+
visibleLine = 0;
|
124
|
+
recordOutOfView = true;
|
125
|
+
}
|
126
|
+
if (visibleLine > this._rowsInPage + 1) {
|
127
|
+
visibleLine = this._rowsInPage;
|
128
|
+
recordOutOfView = true;
|
129
|
+
}
|
130
|
+
if (unit === Constants.MOVE_UNIT_PAGE &&
|
131
|
+
(direction === Constants.MOVE_DIRECTION_NEXT ||
|
132
|
+
direction === Constants.MOVE_DIRECTION_PREV) ||
|
133
|
+
unit === Constants.MOVE_UNIT_ROW &&
|
134
|
+
(direction === Constants.MOVE_DIRECTION_NEXT && visibleLine === this._rowsInPage - 1 ||
|
135
|
+
direction === Constants.MOVE_DIRECTION_PREV && visibleLine === 0)) {
|
136
|
+
if (direction === Constants.MOVE_DIRECTION_PREV &&
|
137
|
+
(unit === Constants.MOVE_UNIT_ROW || unit === Constants.MOVE_UNIT_PAGE) &&
|
138
|
+
visibleLine === 0 && this.GetDataview().getCurrRecIdx() === 0 && this.GetDataview().IncludesFirst())
|
139
|
+
return;
|
140
|
+
if (direction === Constants.MOVE_DIRECTION_NEXT && unit === Constants.MOVE_UNIT_PAGE &&
|
141
|
+
visibleLine === this.getLastValidRow() && this.GetDataview().getCurrRecIdx() === this.GetDataview().getSize() - 1 && this.GetDataview().IncludesLast())
|
142
|
+
return;
|
143
|
+
oldRecId = (this.GetDataview().getCurrRec()).getId();
|
144
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + size);
|
145
|
+
this.GetDataview().setTopRecIdxModified(true);
|
146
|
+
try {
|
147
|
+
this._suffixDone = false;
|
148
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx() + size, true, false);
|
149
|
+
this.GetDataview().setTopRecIdxModified(false);
|
150
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
151
|
+
}
|
152
|
+
catch (ex) {
|
153
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
154
|
+
this.GetDataview().setTopRecIdxModified(false);
|
155
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
156
|
+
this.GetDataview().restoreTopRecIdx();
|
157
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
158
|
+
return;
|
159
|
+
}
|
160
|
+
if (this.GetDataview().getTopRecIdx() < 0) {
|
161
|
+
this.GetDataview().setTopRecIdx(0);
|
162
|
+
try {
|
163
|
+
await this.setCurrRowByDisplayLine(0, true, false);
|
164
|
+
}
|
165
|
+
catch (exception) {
|
166
|
+
if (exception instanceof Exception) {
|
167
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
168
|
+
this.GetDataview().restoreTopRecIdx();
|
169
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
170
|
+
return;
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
175
|
+
}
|
176
|
+
else if (unit !== Constants.MOVE_UNIT_ROW && this.GetDataview().recExists(this.GetDataview().getTopRecIdx())) {
|
177
|
+
let newRecId = (this.GetDataview().getCurrRec()).getId();
|
178
|
+
if (newRecId === oldRecId && !this._suffixDone) {
|
179
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
180
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
181
|
+
this.GetDataview().restoreTopRecIdx();
|
182
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
183
|
+
return;
|
184
|
+
}
|
185
|
+
try {
|
186
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
187
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + this.getLastValidRow(), false, true);
|
188
|
+
visibleLine = this.getLastValidRow();
|
189
|
+
}
|
190
|
+
catch (Exception) {
|
191
|
+
}
|
192
|
+
}
|
193
|
+
}
|
194
|
+
else {
|
195
|
+
this.GetDataview().restoreTopRecIdx();
|
196
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
197
|
+
if (unit === Constants.MOVE_UNIT_ROW && direction === Constants.MOVE_DIRECTION_NEXT) {
|
198
|
+
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
199
|
+
this._task.setExecEndTask();
|
200
|
+
else
|
201
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
202
|
+
}
|
203
|
+
return;
|
204
|
+
}
|
205
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
else {
|
210
|
+
try {
|
211
|
+
oldTaskMode = this._task.getMode();
|
212
|
+
oldRecId = (this.GetDataview().getCurrRec()).getId();
|
213
|
+
await this.setCurrRowByDisplayLine(oldDisplayLine + size, true, false);
|
214
|
+
if (!this.GetDataview().recExistsById(oldRecId)) {
|
215
|
+
if (size > 0 || oldTaskMode !== Constants.TASK_MODE_CREATE)
|
216
|
+
if (size !== -1 || this.GetDataview().recExists(oldDisplayLine))
|
217
|
+
await this.setCurrRowByDisplayLine(oldDisplayLine, false, false);
|
218
|
+
else
|
219
|
+
Logger.Instance.WriteDevToLog(NString.Format("skipped setcurrRow for row {0}", oldDisplayLine));
|
220
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
221
|
+
}
|
222
|
+
else if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
223
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
catch (ex) {
|
227
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
228
|
+
if (this.GetDataview().recExistsById(oldRecId)) {
|
229
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
230
|
+
if (!currRec.Synced && oldTaskMode === Constants.TASK_MODE_CREATE) {
|
231
|
+
this._task.setMode(Constants.TASK_MODE_CREATE);
|
232
|
+
currRec.clearMode();
|
233
|
+
currRec.setMode(DataModificationTypes.Insert);
|
234
|
+
currRec.setNewRec();
|
235
|
+
}
|
236
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
237
|
+
}
|
238
|
+
else {
|
239
|
+
if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0)
|
240
|
+
await this.restoreOldDisplayLine(oldDisplayLine - 1);
|
241
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
242
|
+
}
|
243
|
+
if (size <= 0 || AccessHelper.eventsManager.GetStopExecutionFlag())
|
244
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
245
|
+
else {
|
246
|
+
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
|
247
|
+
this._task.setExecEndTask();
|
248
|
+
return;
|
249
|
+
}
|
250
|
+
else {
|
251
|
+
if (this._task.ActionManager.isEnabled(InternalInterface.MG_ACT_CRELINE))
|
252
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
253
|
+
else {
|
254
|
+
let doRecordSuffix = true;
|
255
|
+
let refdoRecordSuffix = new RefParam(doRecordSuffix);
|
256
|
+
if (!await AccessHelper.eventsManager.DoTaskLevelRecordSuffix(this._task, refdoRecordSuffix))
|
257
|
+
await AccessHelper.eventsManager.DoTaskLevelRecordPrefix(this._task);
|
258
|
+
doRecordSuffix = refdoRecordSuffix.value;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
}
|
262
|
+
return;
|
263
|
+
}
|
264
|
+
}
|
265
|
+
}
|
266
|
+
}
|
267
|
+
else {
|
268
|
+
try {
|
269
|
+
await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx() + size, true, false, true, SET_DISPLAYLINE_BY_DV);
|
270
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
271
|
+
}
|
272
|
+
catch (ex) {
|
273
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
274
|
+
if (size > 0) {
|
275
|
+
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
276
|
+
this._task.setExecEndTask();
|
277
|
+
else
|
278
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
279
|
+
}
|
280
|
+
else
|
281
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
282
|
+
return;
|
283
|
+
}
|
284
|
+
else if (ex instanceof ServerError) {
|
285
|
+
await this._task.stop();
|
286
|
+
this._task.abort();
|
287
|
+
await AccessHelper.eventsManager.ProcessAbortingError(ex);
|
288
|
+
}
|
289
|
+
else if (ex instanceof Exception) {
|
290
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
291
|
+
return;
|
292
|
+
}
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
if (returnToVisibleLine) {
|
297
|
+
if (recordOutOfView) {
|
298
|
+
if (visibleLine === 0)
|
299
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
|
300
|
+
else
|
301
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage);
|
302
|
+
this.SetTableTopIndex();
|
303
|
+
}
|
304
|
+
else {
|
305
|
+
this.SetTableTopIndex();
|
306
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + visibleLine, false, true);
|
307
|
+
}
|
308
|
+
}
|
309
|
+
else
|
310
|
+
this.SetTableTopIndex();
|
311
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
|
312
|
+
}
|
313
|
+
catch (e) {
|
314
|
+
if (e instanceof RecordOutOfDataViewException) {
|
315
|
+
Logger.Instance.WriteDevToLog(e.Message);
|
316
|
+
}
|
317
|
+
}
|
318
|
+
finally {
|
319
|
+
this.SelectRow();
|
320
|
+
this.IsMovingInView = false;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
async addRec(doSuffix, isCrelineAbove) {
|
324
|
+
let newLine = 1;
|
325
|
+
let currLine = -1;
|
326
|
+
if (!this._task.DataView.isEmptyDataview())
|
327
|
+
currLine = this.getVisibleLine();
|
328
|
+
if (this.isTableWithAbsoluteScrollbar()) {
|
329
|
+
this.GetDataview().TotalRecordsCount += 1;
|
330
|
+
this.RefreshAllRows = true;
|
331
|
+
}
|
332
|
+
let newRecIdx = await this.GetDataview().addRecord(doSuffix, false, isCrelineAbove);
|
333
|
+
if (newRecIdx > -1) {
|
334
|
+
if (this.isLineMode()) {
|
335
|
+
let newCurrRow;
|
336
|
+
if (this.GetDataview().getSize() === 0 || this.GetDataview().getTopRecIdx() === Int32.MinValue) {
|
337
|
+
this.GetDataview().setTopRecIdx(0);
|
338
|
+
newCurrRow = 0;
|
339
|
+
}
|
340
|
+
else if (currLine === this._rowsInPage - 1) {
|
341
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + 1);
|
342
|
+
newCurrRow = this.getVisibleLine();
|
343
|
+
}
|
344
|
+
else {
|
345
|
+
if (isCrelineAbove)
|
346
|
+
newCurrRow = currLine > 0 ? currLine : 0;
|
347
|
+
else
|
348
|
+
newCurrRow = currLine + 1;
|
349
|
+
}
|
350
|
+
newLine = this.GetDataview().getTopRecIdx() + newCurrRow;
|
351
|
+
this.removeRecordsAfterIdx(this.GetDataview().getTopRecIdx() + newCurrRow);
|
352
|
+
try {
|
353
|
+
if (!this._task.DataView.isEmptyDataview())
|
354
|
+
this._task.setMode(Constants.TASK_MODE_CREATE);
|
355
|
+
await this.setCurrRowByDisplayLine(newLine, false, false);
|
356
|
+
}
|
357
|
+
catch (ex) {
|
358
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
359
|
+
Logger.Instance.WriteDevToLog(NString.Format("in Form.addRec() {0}", ex.Message));
|
360
|
+
}
|
361
|
+
}
|
362
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
|
363
|
+
}
|
364
|
+
}
|
365
|
+
else if (this.isTableWithAbsoluteScrollbar()) {
|
366
|
+
this.GetDataview().TotalRecordsCount -= 1;
|
367
|
+
this.RefreshAllRows = false;
|
368
|
+
}
|
369
|
+
}
|
370
|
+
async delCurrRec() {
|
371
|
+
let topTableRow = super.isLineMode() && this.GetDataview().getTopRecIdx() === this.GetDataview().getCurrRecIdx();
|
372
|
+
await this.GetDataview().removeCurrRec();
|
373
|
+
if (this.GetDataview().isEmpty() && !this._task.IsTryingToStop) {
|
374
|
+
if (this._task.DataView.isEmptyDataview()) {
|
375
|
+
await this.addRec(false, false);
|
376
|
+
}
|
377
|
+
else {
|
378
|
+
if (await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) {
|
379
|
+
if (this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
380
|
+
this._task.setMode(Constants.TASK_MODE_CREATE);
|
381
|
+
this._task.enableCreateActs(true);
|
382
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
383
|
+
}
|
384
|
+
else
|
385
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_EXIT);
|
386
|
+
}
|
387
|
+
}
|
388
|
+
if (!this.GetDataview().isEmpty()) {
|
389
|
+
if (topTableRow)
|
390
|
+
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
|
391
|
+
if (super.isLineMode()) {
|
392
|
+
if (super.HasTable()) {
|
393
|
+
if (this.isTableWithAbsoluteScrollbar()) {
|
394
|
+
this.GetDataview().TotalRecordsCount--;
|
395
|
+
this.RefreshAllRows = true;
|
396
|
+
}
|
397
|
+
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
398
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
399
|
+
}
|
400
|
+
else
|
401
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
402
|
+
}
|
403
|
+
else {
|
404
|
+
try {
|
405
|
+
await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), true, true, true, SET_DISPLAYLINE_BY_DV);
|
406
|
+
}
|
407
|
+
catch (ex) {
|
408
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
409
|
+
}
|
410
|
+
else
|
411
|
+
throw ex;
|
412
|
+
}
|
413
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
414
|
+
}
|
415
|
+
}
|
416
|
+
}
|
417
|
+
async cancelEdit(isActCancel, isQuitEvent) {
|
418
|
+
let mode = this._task.getMode();
|
419
|
+
let newMode;
|
420
|
+
let row = 0;
|
421
|
+
let execRecPrefix = false;
|
422
|
+
if (this.GetDataview().getSize() === 1 && mode === Constants.TASK_MODE_CREATE)
|
423
|
+
newMode = Constants.TASK_MODE_CREATE;
|
424
|
+
else
|
425
|
+
newMode = Constants.TASK_MODE_MODIFY;
|
426
|
+
let recRemoved = await this.GetDataview().cancelEdit(false, false);
|
427
|
+
this.GetDataview().setPrevCurrRec(null);
|
428
|
+
if ((this.GetDataview().isEmpty() || ((isActCancel && recRemoved) && (!GuiEnvironment.Environment.GetSpecialCancelOnCreate()) && this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE)) && !this._task.IsTryingToStop) {
|
429
|
+
let orgCancelWasRaised = this._task.cancelWasRaised();
|
430
|
+
this._task.setCancelWasRaised(isActCancel);
|
431
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
432
|
+
this._task.setCancelWasRaised(orgCancelWasRaised);
|
433
|
+
}
|
434
|
+
else if (isActCancel)
|
435
|
+
execRecPrefix = true;
|
436
|
+
if (!this.GetDataview().isEmpty()) {
|
437
|
+
if (super.isLineMode()) {
|
438
|
+
try {
|
439
|
+
if (super.HasTable()) {
|
440
|
+
row = this.getVisibleLine();
|
441
|
+
if (row < 0 || row >= this._rowsInPage) {
|
442
|
+
let topRecIdx = this.GetDataview().getTopRecIdx();
|
443
|
+
let currRecIdx = this.GetDataview().getCurrRecIdx();
|
444
|
+
if (topRecIdx > currRecIdx)
|
445
|
+
this.GetDataview().setTopRecIdx(currRecIdx);
|
446
|
+
row = 0;
|
447
|
+
}
|
448
|
+
await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + row, false, true);
|
449
|
+
}
|
450
|
+
}
|
451
|
+
catch (ex) {
|
452
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
453
|
+
if (row !== 0)
|
454
|
+
Logger.Instance.WriteDevToLog(NString.Format("in Form.cancelEdit() {0}", ex.Message));
|
455
|
+
}
|
456
|
+
else
|
457
|
+
throw ex;
|
458
|
+
}
|
459
|
+
if (super.HasTable()) {
|
460
|
+
if (this.isTableWithAbsoluteScrollbar() && recRemoved) {
|
461
|
+
this.GetDataview().TotalRecordsCount--;
|
462
|
+
this.RefreshAllRows = true;
|
463
|
+
}
|
464
|
+
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
465
|
+
}
|
466
|
+
}
|
467
|
+
else {
|
468
|
+
try {
|
469
|
+
await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), false, true, true, SET_DISPLAYLINE_BY_DV);
|
470
|
+
}
|
471
|
+
catch (ex) {
|
472
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
473
|
+
Logger.Instance.WriteDevToLog("in Form.cancelEdit() error in Screen mode for Current Record");
|
474
|
+
}
|
475
|
+
else
|
476
|
+
throw ex;
|
477
|
+
}
|
478
|
+
}
|
479
|
+
this._task.setMode(newMode);
|
480
|
+
if (!this._task.InEndTask)
|
481
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
482
|
+
if (!this._task.InEndTask)
|
483
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
484
|
+
}
|
485
|
+
if (execRecPrefix) {
|
486
|
+
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
487
|
+
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
488
|
+
if (lastParkedCtrl !== null) {
|
489
|
+
if (lastParkedCtrl.getForm().getTask().pathContains(this._task))
|
490
|
+
for (let parent = lastParkedCtrl.getForm().getTask(); parent !== null && parent !== this._task; parent = parent.getParent()) {
|
491
|
+
parent.setLevel(Constants.TASK_LEVEL_TASK);
|
492
|
+
(parent.DataView.getCurrRec()).resetModified();
|
493
|
+
}
|
494
|
+
else
|
495
|
+
lastParkedCtrl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
|
496
|
+
}
|
497
|
+
if (!isQuitEvent) {
|
498
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
|
499
|
+
await AccessHelper.eventsManager.HandleParkabilityOnRowChange(this._task);
|
500
|
+
}
|
501
|
+
}
|
502
|
+
}
|
503
|
+
async refreshOnExpressions() {
|
504
|
+
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
505
|
+
let mgControl = ((this.CtrlTab.getCtrl(i) instanceof MgControl) ? this.CtrlTab.getCtrl(i) : null);
|
506
|
+
if (mgControl != null)
|
507
|
+
await mgControl.refreshOnExpression();
|
508
|
+
else
|
509
|
+
Debug.Assert(false);
|
510
|
+
}
|
511
|
+
await super.refreshPropsOnExpression();
|
512
|
+
}
|
513
|
+
removeRefsToCtrls() {
|
514
|
+
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
515
|
+
if (lastFocusedControl !== null && lastFocusedControl.getForm() === this)
|
516
|
+
LastFocusedManager.setLastFocusedControl(this._task, null);
|
517
|
+
super.removeRefsToCtrls();
|
518
|
+
}
|
519
|
+
getCtrlByCtrlName(ctrlName) {
|
520
|
+
return this.CtrlTab.getCtrl(ctrlName);
|
521
|
+
}
|
522
|
+
getSubFormCtrlByName(ctrlName) {
|
523
|
+
let guiParentTask;
|
524
|
+
let destSubForm = null;
|
525
|
+
for (guiParentTask = this._task; destSubForm === null && guiParentTask !== null && guiParentTask.getForm() !== null; guiParentTask = guiParentTask.getParent()) {
|
526
|
+
destSubForm = guiParentTask.getForm().getCtrlByName(ctrlName, MgControlType.CTRL_TYPE_SUBFORM);
|
527
|
+
if (destSubForm == null) {
|
528
|
+
if (!guiParentTask.IsSubForm || NString.Equals(guiParentTask.getForm().getSubFormCtrl().Name, ctrlName, true))
|
529
|
+
break;
|
530
|
+
}
|
531
|
+
}
|
532
|
+
return destSubForm;
|
533
|
+
}
|
534
|
+
setSuffixDone() {
|
535
|
+
this._suffixDone = true;
|
536
|
+
}
|
537
|
+
getDestinationRow() {
|
538
|
+
return this._destTblRow;
|
539
|
+
}
|
540
|
+
setSubFormCtrl(subFormCtrl) {
|
541
|
+
Debug.Assert(this._subFormCtrl === null && subFormCtrl !== null);
|
542
|
+
this._subFormCtrl = subFormCtrl;
|
543
|
+
}
|
544
|
+
getSubFormCtrlForTask(taskId) {
|
545
|
+
let curr = null;
|
546
|
+
let parentCtrlTab;
|
547
|
+
let guiParentForm = null;
|
548
|
+
let destSubForm = null;
|
549
|
+
for (guiParentForm = this; guiParentForm != null; guiParentForm = guiParentForm.ParentForm) {
|
550
|
+
parentCtrlTab = guiParentForm.CtrlTab;
|
551
|
+
for (let i = 0; i < parentCtrlTab.getSize(); i++) {
|
552
|
+
curr = ((parentCtrlTab.getCtrl(i) instanceof MgControl) ? parentCtrlTab.getCtrl(i) : null);
|
553
|
+
if (curr != null && curr.isSubform() && (curr.getSubformTaskId() != null))
|
554
|
+
if (curr.getSubformTaskId() === taskId) {
|
555
|
+
destSubForm = curr;
|
556
|
+
break;
|
557
|
+
}
|
558
|
+
}
|
559
|
+
if (destSubForm != null)
|
560
|
+
break;
|
561
|
+
}
|
562
|
+
return destSubForm;
|
563
|
+
}
|
564
|
+
removeRecordsAfterIdx(idx) {
|
565
|
+
let removeAll = false;
|
566
|
+
if (this.isTableWithPagination())
|
567
|
+
this.setTableItemsCount(false);
|
568
|
+
else {
|
569
|
+
if (idx <= this._rowsInPage + 1 && this.GetDataview().getSize() > this._rowsInPage)
|
570
|
+
idx = 0;
|
571
|
+
if (idx === 0)
|
572
|
+
removeAll = true;
|
573
|
+
super.SetTableItemsCount(idx, removeAll);
|
574
|
+
this.setTableItemsCount(false);
|
575
|
+
}
|
576
|
+
}
|
577
|
+
isRowValidated(idx) {
|
578
|
+
if (this.Rows.length <= idx || idx < 0)
|
579
|
+
return false;
|
580
|
+
let row = this.Rows.get_Item(idx);
|
581
|
+
if (row == null)
|
582
|
+
return false;
|
583
|
+
return row.Created && row.Validated;
|
584
|
+
}
|
585
|
+
async transferDataToGui() {
|
586
|
+
let saveRowIdx = this.GetDataview().getCurrRecIdx();
|
587
|
+
let maxTime = Misc.getSystemMilliseconds() + MgForm.TIME_LIMIT;
|
588
|
+
let updated = false;
|
589
|
+
let currentEditingControl = super.getTask().CurrentEditingControl;
|
590
|
+
try {
|
591
|
+
let bkpRecord = this.GetDataview().backupCurrent();
|
592
|
+
while (Misc.getSystemMilliseconds() < maxTime && this.RefreshRepeatableAllowed) {
|
593
|
+
if (this._lastRowSent + 1 >= this.GetDataview().getSize()) {
|
594
|
+
this.RefreshUI();
|
595
|
+
break;
|
596
|
+
}
|
597
|
+
else if (this.isTableWithPagination() && this._lastRowSent + 1 >= this.getMaxRowsInPaginatedTable()) {
|
598
|
+
this.RefreshUI();
|
599
|
+
break;
|
600
|
+
}
|
601
|
+
this._lastRowSent++;
|
602
|
+
this._transferringDataToGUI = true;
|
603
|
+
this.AllowedSubformRecompute = false;
|
604
|
+
if (!this.isRowValidated(this._lastRowSent)) {
|
605
|
+
super.checkAndCreateRow(this._lastRowSent);
|
606
|
+
if (this._lastRowSent !== saveRowIdx) {
|
607
|
+
super.getTask().CurrentEditingControl = null;
|
608
|
+
await this.setCurrRowByDisplayLine(this._lastRowSent, false, true);
|
609
|
+
await super.refreshControls(true);
|
610
|
+
updated = true;
|
611
|
+
}
|
612
|
+
}
|
613
|
+
this.AllowedSubformRecompute = true;
|
614
|
+
this._transferringDataToGUI = false;
|
615
|
+
}
|
616
|
+
if (updated) {
|
617
|
+
await this.restoreBackup(saveRowIdx, bkpRecord);
|
618
|
+
await super.refreshControls(true);
|
619
|
+
super.getTask().CurrentEditingControl = currentEditingControl;
|
620
|
+
}
|
621
|
+
}
|
622
|
+
catch (ex) {
|
623
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
624
|
+
Logger.Instance.WriteDevToLog(ex.Message);
|
625
|
+
}
|
626
|
+
else
|
627
|
+
throw ex;
|
628
|
+
}
|
629
|
+
this._transferingData = false;
|
630
|
+
this.checkAndCreateRowsEvent();
|
631
|
+
}
|
632
|
+
checkAndCreateRowsEvent() {
|
633
|
+
if (this._tableMgControl !== null && this.Opened && this.RefreshRepeatableAllowed) {
|
634
|
+
let size = this.GetDataview().getSize();
|
635
|
+
if (this._lastRowSent >= this.Rows.length) {
|
636
|
+
this._lastRowSent = this.Rows.length - 1;
|
637
|
+
}
|
638
|
+
let transferDataToGui = this._lastRowSent < (size - 1);
|
639
|
+
if (this.isTableWithPagination() && (this._lastRowSent + 1) >= this.getMaxRowsInPaginatedTable())
|
640
|
+
transferDataToGui = false;
|
641
|
+
if (transferDataToGui && !this._transferingData) {
|
642
|
+
AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_DV_TO_GUI, Priority.LOWEST);
|
643
|
+
this._transferingData = true;
|
644
|
+
}
|
645
|
+
else if (this.shouldFetchRecordsAheadFromServer && !transferDataToGui && (!this.GetDataview().IncludesLast() || !this.GetDataview().IncludesFirst())) {
|
646
|
+
AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER, Priority.LOWEST);
|
647
|
+
}
|
648
|
+
}
|
649
|
+
}
|
650
|
+
async setRowData(desiredTopIndex, sendAll) {
|
651
|
+
let saveRowIdx = this.GetDataview().getCurrRecIdx();
|
652
|
+
let diff = 0;
|
653
|
+
let getPrevChunk = false;
|
654
|
+
let getNextChunk = false;
|
655
|
+
let updated = false;
|
656
|
+
if (desiredTopIndex !== Int32.MinValue) {
|
657
|
+
if (desiredTopIndex < 0) {
|
658
|
+
getPrevChunk = true;
|
659
|
+
this.GetDataview().setTopRecIdx(0);
|
660
|
+
}
|
661
|
+
else if (desiredTopIndex + this._rowsInPage + 1 >= this.GetDataview().getSize())
|
662
|
+
getNextChunk = true;
|
663
|
+
}
|
664
|
+
else
|
665
|
+
desiredTopIndex = this.GetDataview().getTopRecIdx();
|
666
|
+
let bkpRecord = this.GetDataview().backupCurrent();
|
667
|
+
this._transferringDataToGUI = true;
|
668
|
+
this.AllowedSubformRecompute = false;
|
669
|
+
let diffRef = new RefParam(diff);
|
670
|
+
updated = await this.refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef);
|
671
|
+
diff = diffRef.value;
|
672
|
+
if ((getPrevChunk && diff !== 0) || getNextChunk) {
|
673
|
+
this.GetDataview().setTopRecIdx(desiredTopIndex + diff);
|
674
|
+
this.SetTableTopIndex();
|
675
|
+
if (this._topIndexUpdated) {
|
676
|
+
this._topIndexUpdated = false;
|
677
|
+
}
|
678
|
+
}
|
679
|
+
this.AllowedSubformRecompute = true;
|
680
|
+
this._transferringDataToGUI = false;
|
681
|
+
if (updated) {
|
682
|
+
await this.restoreBackup(saveRowIdx + diff, bkpRecord);
|
683
|
+
await super.refreshControls(true);
|
684
|
+
}
|
685
|
+
super.SelectRow();
|
686
|
+
if (getPrevChunk) {
|
687
|
+
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
688
|
+
if (lastFocusedControl !== null && lastFocusedControl.getParentTable() === this._tableMgControl) {
|
689
|
+
}
|
690
|
+
}
|
691
|
+
}
|
692
|
+
async refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef) {
|
693
|
+
let index = 0;
|
694
|
+
let updated = false;
|
695
|
+
diffRef.value = 0;
|
696
|
+
let orgIncludesFirst = this.GetDataview().IncludesFirst();
|
697
|
+
let orgIncludesLast = this.GetDataview().IncludesLast();
|
698
|
+
for (let i = 0; i < this._rowsInPage; i++) {
|
699
|
+
let idx = desiredTopIndex + i;
|
700
|
+
let prevTopIdx = this.GetDataview().getTopRecIdx();
|
701
|
+
try {
|
702
|
+
index = idx + diffRef.value;
|
703
|
+
if (!this.isRowValidated(idx) || sendAll || this.RefreshAllRows) {
|
704
|
+
if (index >= 0)
|
705
|
+
super.checkAndCreateRow(index);
|
706
|
+
if (saveRowIdx + diffRef.value !== index) {
|
707
|
+
await this.setCurrRowByDisplayLine(index, false, true);
|
708
|
+
await super.refreshControls(true);
|
709
|
+
}
|
710
|
+
updated = true;
|
711
|
+
}
|
712
|
+
}
|
713
|
+
catch (ex) {
|
714
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
715
|
+
if (super.isRowCreated(index))
|
716
|
+
super.markRowNOTCreated(index);
|
717
|
+
break;
|
718
|
+
}
|
719
|
+
else
|
720
|
+
throw ex;
|
721
|
+
}
|
722
|
+
finally {
|
723
|
+
diffRef.value = diffRef.value + (this.GetDataview().getTopRecIdx() - prevTopIdx);
|
724
|
+
prevTopIdx = this.GetDataview().getTopRecIdx();
|
725
|
+
if (!updated && this.GetDataview().DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast))
|
726
|
+
updated = true;
|
727
|
+
}
|
728
|
+
}
|
729
|
+
this.RefreshUI();
|
730
|
+
this.RefreshAllRows = false;
|
731
|
+
return updated;
|
732
|
+
}
|
733
|
+
getVisibleLine() {
|
734
|
+
let currRecIdx = 0;
|
735
|
+
if (this.GetDataview().getCurrRecIdx() !== Int32.MinValue)
|
736
|
+
currRecIdx = this.GetDataview().getCurrRecIdx();
|
737
|
+
return currRecIdx - Math.max(this.GetDataview().getTopRecIdx(), 0);
|
738
|
+
}
|
739
|
+
async bringRecordToPage() {
|
740
|
+
if (this._tableMgControl !== null && !this._task.DataView.isEmptyDataview()) {
|
741
|
+
let topIndex = Commands.getTopIndex(this._tableMgControl);
|
742
|
+
let currIdx = this.GetDataview().getCurrRecIdx();
|
743
|
+
let newTopIndex = topIndex;
|
744
|
+
if (!this.isTableWithPagination()) {
|
745
|
+
if (topIndex > currIdx) {
|
746
|
+
this._topIndexUpdated = true;
|
747
|
+
newTopIndex = currIdx;
|
748
|
+
}
|
749
|
+
else if (topIndex + this._rowsInPage - 1 < currIdx) {
|
750
|
+
this._topIndexUpdated = true;
|
751
|
+
if (this._rowsInPage > 0)
|
752
|
+
newTopIndex = currIdx - this._rowsInPage + 1;
|
753
|
+
else
|
754
|
+
newTopIndex = currIdx;
|
755
|
+
}
|
756
|
+
}
|
757
|
+
else {
|
758
|
+
let currGuiIdx = this.getGuiRowidx(currIdx);
|
759
|
+
let newTopGuiIndex = (currGuiIdx) - ((currGuiIdx) % this._rowsInPage);
|
760
|
+
newTopIndex = this.getDvRowIdx(newTopGuiIndex);
|
761
|
+
if (newTopIndex !== this._prevGuiTopIndex || this.IsMovingInView)
|
762
|
+
this._topIndexUpdated = true;
|
763
|
+
}
|
764
|
+
if (this.GetDataview().getTopRecIdx() !== newTopIndex || this._topIndexUpdated) {
|
765
|
+
this.GetDataview().setTopRecIdx(newTopIndex);
|
766
|
+
this.SetTableTopIndex();
|
767
|
+
await this.setRowData(Int32.MinValue, false);
|
768
|
+
this._topIndexUpdated = false;
|
769
|
+
}
|
770
|
+
}
|
771
|
+
}
|
772
|
+
invalidateTable() {
|
773
|
+
for (let i = 0; i < this.Rows.length; i++) {
|
774
|
+
let row = this.Rows.get_Item(i);
|
775
|
+
if (row !== null)
|
776
|
+
row.Validated = false;
|
777
|
+
}
|
778
|
+
this._lastRowSent = -1;
|
779
|
+
this.checkAndCreateRowsEvent();
|
780
|
+
}
|
781
|
+
getPrevLine(line) {
|
782
|
+
return line - 1;
|
783
|
+
}
|
784
|
+
clearTableColumnSortMark(clearSortMark) {
|
785
|
+
if (clearSortMark) {
|
786
|
+
}
|
787
|
+
}
|
788
|
+
async stopRowEditing(idx) {
|
789
|
+
if (this.getIsRowEditingFromGui(idx)) {
|
790
|
+
Commands.addValueWithLine(CommandType.SET_NOT_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
|
791
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
792
|
+
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
793
|
+
}
|
794
|
+
}
|
795
|
+
async startRowEditing(idx) {
|
796
|
+
if (!this.getIsRowEditingFromGui(idx)) {
|
797
|
+
Commands.addValueWithLine(CommandType.SET_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
|
798
|
+
await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
799
|
+
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
800
|
+
}
|
801
|
+
}
|
802
|
+
getIsRowEditingFromGui(displayIndex) {
|
803
|
+
let isRowEditing = Commands.getIsRowEditing(this, this.isLineMode() ? displayIndex : 0, this.isLineMode());
|
804
|
+
return isRowEditing;
|
805
|
+
}
|
806
|
+
async RefreshDisplay(refreshType) {
|
807
|
+
let task = this._task;
|
808
|
+
if (this.isFetchingRecordsAhead)
|
809
|
+
return false;
|
810
|
+
if (task.isAborting())
|
811
|
+
return false;
|
812
|
+
let currRec = this.GetDataview().getCurrRec();
|
813
|
+
if (currRec !== null && currRec.InCompute && !currRec.isNewRec())
|
814
|
+
return false;
|
815
|
+
if (this._inRefreshDisp)
|
816
|
+
return false;
|
817
|
+
this._inRefreshDisp = true;
|
818
|
+
try {
|
819
|
+
if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_TABLE) {
|
820
|
+
if (super.HasTable() && this.Opened)
|
821
|
+
await this.refreshTable();
|
822
|
+
}
|
823
|
+
if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_CURR_REC) {
|
824
|
+
if (refreshType === Constants.TASK_REFRESH_CURR_REC && super.hasTable()) {
|
825
|
+
this.SetTableTopIndex();
|
826
|
+
super.SelectRow();
|
827
|
+
await this.fetchPrevChunkForCurrentPage();
|
828
|
+
}
|
829
|
+
await super.refreshProps();
|
830
|
+
await super.refreshControls(false);
|
831
|
+
}
|
832
|
+
}
|
833
|
+
catch (ex) {
|
834
|
+
if (ex instanceof Exception) {
|
835
|
+
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("{0} : {1} in task {2}", ex.GetType(), ex.Message, super.getTask().PreviouslyActiveTaskId));
|
836
|
+
}
|
837
|
+
else
|
838
|
+
throw ex;
|
839
|
+
}
|
840
|
+
finally {
|
841
|
+
this._inRefreshDisp = false;
|
842
|
+
}
|
843
|
+
if (refreshType === Constants.TASK_REFRESH_CURR_REC && (!super.isLineMode() || this._tableRefreshed)) {
|
844
|
+
this.FormRefreshed = true;
|
845
|
+
if (this._task.isFirstRecordCycle() || AccessHelper.eventsManager.getIsInViewRefresh()) {
|
846
|
+
Commands.addNoParameters(CommandType.SET_WC_IDLE, this);
|
847
|
+
AccessHelper.eventsManager.setIsInViewRefresh(false);
|
848
|
+
}
|
849
|
+
}
|
850
|
+
return true;
|
851
|
+
}
|
852
|
+
RefreshUI() {
|
853
|
+
if (!this.getTask().isMainProg()) {
|
854
|
+
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
855
|
+
}
|
856
|
+
}
|
857
|
+
async refreshTable() {
|
858
|
+
if (this.isFetchingRecordsAhead)
|
859
|
+
return;
|
860
|
+
Logger.Instance.WriteGuiToLog("Start form.refreshTable()");
|
861
|
+
this.updateDisplayLineByDV();
|
862
|
+
let oldCurrRow = this.DisplayLine;
|
863
|
+
let currRecIdx = this.GetDataview().getCurrRecIdx();
|
864
|
+
if (!this._tableRefreshed && currRecIdx >= 0) {
|
865
|
+
oldCurrRow = this.GetDataview().getCurrRecIdx();
|
866
|
+
if (oldCurrRow + 1 > this._rowsInPage)
|
867
|
+
this.GetDataview().setTopRecIdx(oldCurrRow - Math.floor(this._rowsInPage / 2) + 1);
|
868
|
+
else
|
869
|
+
this.GetDataview().setTopRecIdx(0);
|
870
|
+
}
|
871
|
+
else {
|
872
|
+
if (oldCurrRow === Int32.MinValue)
|
873
|
+
oldCurrRow = 0;
|
874
|
+
if (this.GetDataview().getTopRecIdx() === Int32.MinValue)
|
875
|
+
this.GetDataview().setTopRecIdx(currRecIdx);
|
876
|
+
}
|
877
|
+
if (this.GetDataview().getTopRecIdx() < 0)
|
878
|
+
return;
|
879
|
+
oldCurrRow = oldCurrRow - this.GetDataview().getTopRecIdx();
|
880
|
+
let bkpRecord = this.GetDataview().backupCurrent();
|
881
|
+
this._tableRefreshed = true;
|
882
|
+
let oriTransferDataToGui = this._transferringDataToGUI;
|
883
|
+
if (!oriTransferDataToGui)
|
884
|
+
this._transferringDataToGUI = true;
|
885
|
+
this.AllowedSubformRecompute = false;
|
886
|
+
for (let i = 0; i < this._rowsInPage; i++) {
|
887
|
+
let topIndex = this.GetDataview().getTopRecIdx();
|
888
|
+
if (topIndex < 0) {
|
889
|
+
this.GetDataview().setTopRecIdx(0);
|
890
|
+
topIndex = 0;
|
891
|
+
}
|
892
|
+
let idx = topIndex + i;
|
893
|
+
try {
|
894
|
+
super.checkAndCreateRow(idx);
|
895
|
+
if (i !== oldCurrRow) {
|
896
|
+
await this.setCurrRowByDisplayLine(idx, false, true);
|
897
|
+
await super.refreshControls(true);
|
898
|
+
}
|
899
|
+
}
|
900
|
+
catch (ex) {
|
901
|
+
if (ex.name == "RecordOutOfDataViewException") {
|
902
|
+
if (super.isRowCreated(idx))
|
903
|
+
super.markRowNOTCreated(idx);
|
904
|
+
break;
|
905
|
+
}
|
906
|
+
else
|
907
|
+
throw ex;
|
908
|
+
}
|
909
|
+
}
|
910
|
+
this.AllowedSubformRecompute = true;
|
911
|
+
if (!oriTransferDataToGui)
|
912
|
+
this._transferringDataToGUI = false;
|
913
|
+
await this.restoreBackup(oldCurrRow + this.GetDataview().getTopRecIdx(), bkpRecord);
|
914
|
+
await super.refreshControls(true);
|
915
|
+
this.RefreshUI();
|
916
|
+
Logger.Instance.WriteGuiToLog("End form.refreshTable()");
|
917
|
+
}
|
918
|
+
updateDisplayLineByDV() {
|
919
|
+
this.DisplayLine = this.recordIdx2DisplayLine(this.GetDataview().getCurrRecIdx());
|
920
|
+
}
|
921
|
+
async setCurrRowByDisplayLine(displayLine, doSuffix, ignoreCurrRec) {
|
922
|
+
let recIdx = this.displayLine2RecordIdx(displayLine);
|
923
|
+
await this.setCurrRowByRecIdx(recIdx, doSuffix, ignoreCurrRec, displayLine);
|
924
|
+
if (super.HasTable())
|
925
|
+
this.updateDisplayLineByDV();
|
926
|
+
else
|
927
|
+
this.DisplayLine = displayLine;
|
928
|
+
}
|
929
|
+
async setCurrRowByRecIdx(rowNum, doSuffix, ignoreCurrRec, displayLine) {
|
930
|
+
if (this.GetDataview() === null || (!super.hasTable() && rowNum !== 0))
|
931
|
+
throw new ApplicationException("in Form.setCurrRow() no table ");
|
932
|
+
try {
|
933
|
+
this._destTblRow = rowNum;
|
934
|
+
await this.GetDataview().setCurrRecByIdx(rowNum, doSuffix, ignoreCurrRec, true, displayLine);
|
935
|
+
}
|
936
|
+
finally {
|
937
|
+
this._destTblRow = rowNum - this.GetDataview().getTopRecIdx();
|
938
|
+
}
|
939
|
+
}
|
940
|
+
getLastValidRow() {
|
941
|
+
return Math.min(this._rowsInPage - 1, this.GetDataview().getSize() - 1 - this.GetDataview().getTopRecIdx());
|
942
|
+
}
|
943
|
+
recordIdx2DisplayLine(recIdx) {
|
944
|
+
return recIdx;
|
945
|
+
}
|
946
|
+
displayLine2RecordIdx(displayLine) {
|
947
|
+
return displayLine;
|
948
|
+
}
|
949
|
+
async restoreOldDisplayLine(displayLine) {
|
950
|
+
try {
|
951
|
+
this._inRestore = true;
|
952
|
+
await this.setCurrRowByDisplayLine(displayLine, false, true);
|
953
|
+
}
|
954
|
+
catch (ex) {
|
955
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
956
|
+
}
|
957
|
+
else
|
958
|
+
throw ex;
|
959
|
+
}
|
960
|
+
finally {
|
961
|
+
this._inRestore = false;
|
962
|
+
}
|
963
|
+
}
|
964
|
+
getTopIndexFromGUI() {
|
965
|
+
let topDisplayLine = super.getTopIndexFromGUI();
|
966
|
+
if (super.hasTable())
|
967
|
+
this.GetDataview().setTopRecIdx(this.displayLine2RecordIdx(topDisplayLine));
|
968
|
+
return topDisplayLine;
|
969
|
+
}
|
970
|
+
getCurrRecPosInForm() {
|
971
|
+
let topDisplayLine = super.getTopIndexFromGUI();
|
972
|
+
return this.DisplayLine - topDisplayLine + 1;
|
973
|
+
}
|
974
|
+
async restoreBackup(oldDisplayLine, bkpRecord) {
|
975
|
+
if (bkpRecord.getId() >= 0 && this.GetDataview().getRecIdx(bkpRecord.getId()) >= 0 && oldDisplayLine >= 0 && oldDisplayLine < this.GetDataview().getSize() && this.GetDataview().getCurrRecIdx() >= 0 && bkpRecord.getMode() === DataModificationTypes.None) {
|
976
|
+
this.GetDataview().restoreCurrent(bkpRecord);
|
977
|
+
this.updateDisplayLineByDV();
|
978
|
+
}
|
979
|
+
else
|
980
|
+
await this.restoreOldDisplayLine(oldDisplayLine);
|
981
|
+
}
|
982
|
+
ConstructMgControl(type, taskOrParentMgForm, parentControlOrParentControlIdx) {
|
983
|
+
if (arguments.length === 0) {
|
984
|
+
return this.ConstructMgControl_0();
|
985
|
+
}
|
986
|
+
if (arguments.length === 3 && (type === null || type.constructor === Number) && (taskOrParentMgForm === null || taskOrParentMgForm instanceof TaskBase) && (parentControlOrParentControlIdx === null || parentControlOrParentControlIdx.constructor === Number)) {
|
987
|
+
return this.ConstructMgControl_1(type, taskOrParentMgForm, parentControlOrParentControlIdx);
|
988
|
+
}
|
989
|
+
return this.ConstructMgControl_2(type, taskOrParentMgForm, parentControlOrParentControlIdx);
|
990
|
+
}
|
991
|
+
ConstructMgControl_0() {
|
992
|
+
return new MgControl();
|
993
|
+
}
|
994
|
+
ConstructMgControl_1(type, task, parentControl) {
|
995
|
+
return new MgControl(type, task, parentControl);
|
996
|
+
}
|
997
|
+
ConstructMgControl_2(type, parentMgForm, parentControlIdx) {
|
998
|
+
return new MgControl(type, parentMgForm, parentControlIdx);
|
999
|
+
}
|
1000
|
+
alreadyMovedToFirstControl() {
|
1001
|
+
return this._task.getMGData().AlreadyMovedToFirstControl();
|
1002
|
+
}
|
1003
|
+
async firstTableRefresh() {
|
1004
|
+
if (this._tableMgControl !== null) {
|
1005
|
+
super.firstTableRefresh();
|
1006
|
+
this.setTableItemsCount(false);
|
1007
|
+
await this.refreshTable();
|
1008
|
+
super.SelectRow();
|
1009
|
+
}
|
1010
|
+
}
|
1011
|
+
InsertTableItems(idx, count) {
|
1012
|
+
if (this._tableMgControl != null) {
|
1013
|
+
this.Rows.InsertRange(new Array(count));
|
1014
|
+
this.InsertTableChildrenArrays(idx, count);
|
1015
|
+
this._lastRowSent = -1;
|
1016
|
+
}
|
1017
|
+
this.setTableItemsCount(false);
|
1018
|
+
}
|
1019
|
+
setTableItemsCount(removeAll) {
|
1020
|
+
let tableItemsCount;
|
1021
|
+
if (this.isTableWithAbsoluteScrollbar()) {
|
1022
|
+
if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE
|
1023
|
+
&& this._task.getMode() == Constants.TASK_MODE_CREATE) {
|
1024
|
+
tableItemsCount = this.GetDataview().getSize();
|
1025
|
+
if (this.GetDataview().RecordsBeforeCurrentView > 0) {
|
1026
|
+
this.GetDataview().RecordsBeforeCurrentView = 0;
|
1027
|
+
this.SetRecordsBeforeCurrentView(0);
|
1028
|
+
this.RefreshUI();
|
1029
|
+
}
|
1030
|
+
}
|
1031
|
+
else {
|
1032
|
+
tableItemsCount = (this.GetDataview().TotalRecordsCount > 0) ? this.GetDataview().TotalRecordsCount : 1;
|
1033
|
+
this.SetRecordsBeforeCurrentView(this.GetDataview().RecordsBeforeCurrentView);
|
1034
|
+
}
|
1035
|
+
}
|
1036
|
+
else {
|
1037
|
+
tableItemsCount = this.GetDataview().getSize();
|
1038
|
+
}
|
1039
|
+
super.SetTableItemsCount(this.GetDataview().getSize(), tableItemsCount, removeAll);
|
1040
|
+
}
|
1041
|
+
InitTableControl(dvSize, tableItemsCount, removeAll) {
|
1042
|
+
if (arguments.length === 0) {
|
1043
|
+
this.InitTableControl_00();
|
1044
|
+
return;
|
1045
|
+
}
|
1046
|
+
this.InitTableControl_01(dvSize, tableItemsCount, removeAll);
|
1047
|
+
}
|
1048
|
+
InitTableControl_00() {
|
1049
|
+
let dvSize = 1;
|
1050
|
+
let tableItemsCount = 1;
|
1051
|
+
if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
|
1052
|
+
let recordsBeforeCurrentView = this.GetDataview().RecordsBeforeCurrentView;
|
1053
|
+
tableItemsCount = this.GetDataview().TotalRecordsCount;
|
1054
|
+
Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, recordsBeforeCurrentView);
|
1055
|
+
}
|
1056
|
+
this.InitTableControl(dvSize, tableItemsCount, false);
|
1057
|
+
this.SetTableTopIndex();
|
1058
|
+
}
|
1059
|
+
InitTableControl_01(dvSize, tableItemsCount, removeAll) {
|
1060
|
+
if (this._tableMgControl !== null) {
|
1061
|
+
if (removeAll) {
|
1062
|
+
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, true);
|
1063
|
+
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, true);
|
1064
|
+
}
|
1065
|
+
else {
|
1066
|
+
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, this.GetDataview().IncludesFirst() || this.GetDataview().IsOneWayKey);
|
1067
|
+
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, this.GetDataview().IncludesLast());
|
1068
|
+
Commands.addBoolWithLine(CommandType.SET_EMPTY_DATAVIEW, this._tableMgControl, 0, this.GetDataview().isEmptyDataview());
|
1069
|
+
}
|
1070
|
+
super.InitTableControl(dvSize, tableItemsCount, removeAll);
|
1071
|
+
this.checkAndCreateRowsEvent();
|
1072
|
+
}
|
1073
|
+
}
|
1074
|
+
SetTableTopIndex() {
|
1075
|
+
if (this._tableMgControl !== null) {
|
1076
|
+
let index = this.GetDataview().getTopRecIdx();
|
1077
|
+
if (index === Int32.MinValue)
|
1078
|
+
index = 0;
|
1079
|
+
if (!this.isTableWithPagination()) {
|
1080
|
+
if (this.GetDataview().IncludesLast()) {
|
1081
|
+
if (index + this._rowsInPage > this.GetDataview().getSize()) {
|
1082
|
+
if (this.GetDataview().IncludesFirst() || this.GetDataview().getSize() > this._rowsInPage + 1) {
|
1083
|
+
index = Math.max(this.GetDataview().getSize() - this._rowsInPage, 0);
|
1084
|
+
this.GetDataview().setTopRecIdx(index);
|
1085
|
+
this._topIndexUpdated = true;
|
1086
|
+
}
|
1087
|
+
}
|
1088
|
+
}
|
1089
|
+
}
|
1090
|
+
if (index !== this._prevGuiTopIndex || this.IsMovingInView) {
|
1091
|
+
Commands.addWithNumber(CommandType.SET_TABLE_TOP_INDEX, this._tableMgControl, index);
|
1092
|
+
this._prevGuiTopIndex = this.getGuiRowidx(index);
|
1093
|
+
}
|
1094
|
+
}
|
1095
|
+
}
|
1096
|
+
async createForm() {
|
1097
|
+
await super.createForm();
|
1098
|
+
MgForm.CreatedForms.add(this);
|
1099
|
+
}
|
1100
|
+
UpdateStatusBar() {
|
1101
|
+
}
|
1102
|
+
initInnerObjects(foundTagName) {
|
1103
|
+
if (foundTagName === null)
|
1104
|
+
return false;
|
1105
|
+
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
1106
|
+
if (foundTagName === XMLConstants.MG_TAG_RECOMPUTE) {
|
1107
|
+
Logger.Instance.WriteDevToLog("goes to recompute form");
|
1108
|
+
this._task.RecomputeFillData(parser);
|
1109
|
+
return true;
|
1110
|
+
}
|
1111
|
+
return super.initInnerObjects(foundTagName);
|
1112
|
+
}
|
1113
|
+
toString() {
|
1114
|
+
return "{" + this.constructor.name + ": task=" + this._task + ", Id=" + this._userStateId + "}";
|
1115
|
+
}
|
1116
|
+
GetHiddenControlListXML() {
|
1117
|
+
let xml = new StringBuilder();
|
1118
|
+
if (this.hiddenControlsIsnsList !== null && this.hiddenControlsIsnsList.length > 0) {
|
1119
|
+
xml.Append("<" + ConstInterface.MG_TAG_HIDDEN_CONTOLS + " " + ConstInterface.MG_ATTR_ISNS + "=\"");
|
1120
|
+
this.hiddenControlsIsnsList.forEach((change) => {
|
1121
|
+
xml.Append(change + ",");
|
1122
|
+
});
|
1123
|
+
xml.Remove(xml.Length - 1, 1);
|
1124
|
+
xml.Append("\"/>");
|
1125
|
+
this.hiddenControlsIsnsList = null;
|
1126
|
+
}
|
1127
|
+
return xml.ToString();
|
1128
|
+
}
|
1129
|
+
ShouldBehaveAsModal() {
|
1130
|
+
let shouldBeModal = false;
|
1131
|
+
if (!this._task.IsInteractive && !this._task.isMainProg())
|
1132
|
+
shouldBeModal = TaskBase.ShouldNonInteractiveBeModal();
|
1133
|
+
else {
|
1134
|
+
let parentTask = this._task.ParentTask;
|
1135
|
+
if (parentTask !== null && !parentTask.IsInteractive && !parentTask.isMainProg())
|
1136
|
+
shouldBeModal = parentTask.ShouldNonInteractiveChildBeModal();
|
1137
|
+
}
|
1138
|
+
return shouldBeModal;
|
1139
|
+
}
|
1140
|
+
isTableWithPagination() {
|
1141
|
+
return this.isTableWithAbsoluteScrollbar();
|
1142
|
+
}
|
1143
|
+
isTableWithAbsoluteScrollbar() {
|
1144
|
+
let tableWithAbsoluteScrollbar = false;
|
1145
|
+
if (this._tableMgControl !== null)
|
1146
|
+
tableWithAbsoluteScrollbar = this._tableMgControl.IsTableWithAbsoluteScrollbar();
|
1147
|
+
return tableWithAbsoluteScrollbar;
|
1148
|
+
}
|
1149
|
+
SetRecordsBeforeCurrentView(value) {
|
1150
|
+
if (this._tableMgControl !== null) {
|
1151
|
+
Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, value);
|
1152
|
+
}
|
1153
|
+
}
|
1154
|
+
buildFormName() {
|
1155
|
+
let name = this.UniqueName;
|
1156
|
+
let task = this.getTask();
|
1157
|
+
name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
|
1158
|
+
while (task.IsSubtask) {
|
1159
|
+
task = task.StudioParentTask;
|
1160
|
+
name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
|
1161
|
+
}
|
1162
|
+
name = name.replace(/ /g, "_");
|
1163
|
+
name = name.replace(/-/g, "_");
|
1164
|
+
return name;
|
1165
|
+
}
|
1166
|
+
async fetchPrevChunkForCurrentPage() {
|
1167
|
+
if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
|
1168
|
+
let recPosOnPage = this.GetDataview().RecordsBeforeCurrentView % this._rowsInPage;
|
1169
|
+
if (recPosOnPage > 0 && this.DisplayLine === 0) {
|
1170
|
+
await this.setRowData(-recPosOnPage, false);
|
1171
|
+
}
|
1172
|
+
}
|
1173
|
+
}
|
1174
|
+
getGuiRowidx(dvRowIdx) {
|
1175
|
+
return dvRowIdx + this.GetDataview().RecordsBeforeCurrentView;
|
1176
|
+
}
|
1177
|
+
getDvRowIdx(guiRowIdx) {
|
1178
|
+
return guiRowIdx - this.GetDataview().RecordsBeforeCurrentView;
|
1179
|
+
}
|
1180
|
+
}
|
1181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFXLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE1BQU0sT0FBTyxNQUFPLFNBQVEsVUFBVTtJQUM1QixNQUFNLENBQUMsVUFBVSxH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QUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBDb21tYW5kVHlwZSxcclxuICBDb250cm9sVGFibGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbn0gZnJvbSAnLi4vZGF0YS9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHtEYXRhVmlldywgU0VUX0RJU1BMQVlMSU5FX0JZX0RWfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIE1nRm9ybSBleHRlbmRzIE1nRm9ybUJhc2Uge1xyXG4gIHByaXZhdGUgc3RhdGljIFRJTUVfTElNSVQ6IG51bWJlciA9IDUwOyAvLyB0aW1lIGxpbWl0IGZvciBvbmUgdHJhbnNmZXIgb3BlcmF0aW9uIChpbiBtaWxsaSBzZWNvbmRzKVxyXG4gIElzTW92aW5nSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJldkRpc3BsYXlMaW5lOiBudW1iZXIgPSAwOyAvLyBkaXNwbGF5IGlkZW50aWZpZXIgb2YgcHJldiBsaW5lXHJcbiAgUmVmcmVzaEFsbFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgSWdub3JlRmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1vdmVkVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIG1vdmUgdG8gZmlyc3QgY29udHJvbCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGZvcm1cclxuXHJcbiAgcHJpdmF0ZSBfc3VmZml4RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGhpZGRlbkNvbnRyb2xzSXNuc0xpc3Q6IExpc3Q8bnVtYmVyPiA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IG5ldyBDcmVhdGVkRm9ybVZlY3RvcigpO1xyXG5cclxuICAvL1RPRE86IE1heWJlIHRoZSBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlIGFsbG93RmllbGRDb21wdXRlXHJcbiAgcHJpdmF0ZSBfdHJhbnNmZXJyaW5nRGF0YVRvR1VJOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaXNGZXRjaGluZ1JlY29yZHNBaGVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IENyZWF0ZWRGb3JtcygpOiBDcmVhdGVkRm9ybVZlY3RvciB7XHJcbiAgICByZXR1cm4gTWdGb3JtLl9jcmVhdGVkRm9ybXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5SZXN0b3JlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVzdG9yZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2ZlcnJpbmdEYXRhVG9HVUkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgIGxldCBwcm9wID0gdGhpcy5fdGFibGVNZ0NvbnRyb2wuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRCk7XHJcblxyXG4gICAgICByZXR1cm4gKHByb3AgIT0gbnVsbCA/IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSA6IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSB0YXNrIGRhdGF2aWV3LCBpZiB0aGUgdGFzayBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSB0YXNrIGRhdGF2aWV3PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0RGF0YXZpZXcoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbClcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuXHJcbiAgICByZXR1cm4gKGR2KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICBhc3luYyBtb3ZlSW5WaWV3KHVuaXQ6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgbGV0IHJldHVyblRvVmlzaWJsZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNvcmRPdXRPZlZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB2aXNpYmxlTGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gdHJ1ZTtcclxuICAgICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgICAgLy8gdGFibGUgbW92ZW1lbnRzIChmaXJzdCAvIGxhc3QgcmVjb3JkKVxyXG4gICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBCRUdJTklORyBPRiBUQUJMRVxyXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRU5EIE9GIFRBQkxFXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSArIDEpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPj0gMClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFnZSBhbmQgcm93IG1vdmVtZW50c1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlY29yZHMgdG8gc2tpcFxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJiB0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORDpcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3Q6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxO1xyXG4gICAgICAgICAgICAgIGxhc3QgPSBNYXRoLm1pbihsYXN0LCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IGxhc3QgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVyblRvVmlzaWJsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzaXplID0gMTtcclxuXHJcbiAgICAgICAgc2l6ZSA9IChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWIHx8XHJcbiAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU5cclxuICAgICAgICAgID8gLXNpemVcclxuICAgICAgICAgIDogc2l6ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPCAwKSB7XHJcbiAgICAgICAgICAgIHZpc2libGVMaW5lID0gMDtcclxuICAgICAgICAgICAgcmVjb3JkT3V0T2ZWaWV3ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA+IHRoaXMuX3Jvd3NJblBhZ2UgKyAxKSB7XHJcbiAgICAgICAgICAgIHZpc2libGVMaW5lID0gdGhpcy5fcm93c0luUGFnZTtcclxuICAgICAgICAgICAgcmVjb3JkT3V0T2ZWaWV3ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHNjcm9sbGluZyB0aGUgdGFibGUgb25lIHBhZ2Ugb3Igb25lIHJvdyB1cCBvciBkb3duXHJcbiAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUIHx8XHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVikgfHxcclxuICAgICAgICAgICAgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdmlzaWJsZUxpbmUgPT09IHRoaXMuX3Jvd3NJblBhZ2UgLSAxIHx8XHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJiB2aXNpYmxlTGluZSA9PT0gMCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgd2UgbW92ZSB0byB0aGUgcHJldmlvdXMgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUgYW5kIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgJiZcclxuICAgICAgICAgICAgICAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgfHwgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFKSAmJlxyXG4gICAgICAgICAgICAgIHZpc2libGVMaW5lID09PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBuZXh0IHJvdyBidXQgd2UgYXJlIGF0IHRoZSBsYXN0IHJvdyBvZiB0aGUgdGFibGUgYW5kIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUICYmIHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJlxyXG4gICAgICAgICAgICAgIHZpc2libGVMaW5lID09PSB0aGlzLmdldExhc3RWYWxpZFJvdygpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPT09IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBvbGRSZWNJZCA9ICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHNpemUpO1xyXG4gICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3VmZml4RG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgKyBzaXplLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKDAsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUUNSICM5OTU0OTY6IHdoZW4gdGhlIHJlY29yZCBzdWZmaXggZmFpbGVkIGdvIGJhY2sgdG8gdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCByb3dcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh1bml0ICE9PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJiAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM5OTIxMDE6IGlmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCBpdCBtZWFucyB0aGF0IHRoZSByZWMgc3VmZml4XHJcbiAgICAgICAgICAgICAgICAgIC8vIHdhc24ndCBleGVjdXRlZCBzbyB3ZSBtdXN0IGhhbmRsZSBpdCBiZWZvcmUgd2UgZ28gdG8gYSBuZXcgcm93XHJcbiAgICAgICAgICAgICAgICAgIGxldCBuZXdSZWNJZDogbnVtYmVyID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWNJZCA9PT0gb2xkUmVjSWQgJiYgIXRoaXMuX3N1ZmZpeERvbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSIDc1ODYzOVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5nZXRMYXN0VmFsaWRSb3coKSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLmdldExhc3RWYWxpZFJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIG1vdmluZyB0aGUgbWFya2luZyBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIG9sZFRhc2tNb2RlID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCB3YXMgZGVsZXRlZCBpbiBSdW4gVGltZSBieSBGb3JjZSBEZWxldGUgZm9yIGV4YW1wbGVcclxuICAgICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwIHx8IG9sZFRhc2tNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IC0xIHx8ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHMob2xkRGlzcGxheUxpbmUpKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFFDUiAjMjkzNjY4XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwic2tpcHBlZCBzZXRjdXJyUm93IGZvciByb3cgezB9XCIsIG9sZERpc3BsYXlMaW5lKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBpZiBldmVyeXRoaW5nIGlzIE9LLCBjdXJyIHJlYyB3aWxsIGxhdGVyIGJlIHJlZnJlc2hlZCBpblxyXG4gICAgICAgICAgICAgICAgLy8gUkVDX1BSRUZJWFxyXG4gICAgICAgICAgICAgICAgLy8gdGh1cywgcmVmcmVzaCBvbmx5IGluIGNhc2Ugb2YgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGVycm9yIGlzIGJlY2F1c2UgdGhlIG9sZC1yZWMgd2FzIHJlbW92ZWQgKGNhbmNlbEVkaXQnZWQpLCBzbyByZWZyZXNoIGZvcm0uXHJcbiAgICAgICAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNzc1MzA5OiBpZiBsZWF2aW5nIHRoZSBuZXcgY3JlYXRlZCByZWNvcmQgZmFpbGVkIHRoZW4gcmVzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAvLyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGEgbmV3IHJlY29yZCBzbyB0aGUgbmV4dCBhY3Rpb24gd291bGRcclxuICAgICAgICAgICAgICAgICAgLy8gXCJrbm93XCIgdGhhdCBpdCBpcyBzdGlsbCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAjIDgxNjI3IDogSWYgdGFzayBpcyBoYXZpbmcgYSBzdWJmb3JtLCB0aGVuIHdoaWxlIG1vdmluZyB0byBzdWJmb3JtLCBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAvLyBpcyBzeW5jZWQgYW5kIGl0IGlzIGluc2VydGVkIGluIF9tb2RpZmllZFRhYiBhcyAnaW5zZXJ0JyByZWNvcmQuIFNvLCBhbnkgcmVxdWVzdCB0byBzZXJ2ZXIgaW5zZXJ0c1xyXG4gICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdG8gc2VydmVyLiBFdmVuIGlmIHdlIGRvbnQgZ28gdG8gc2VydmVyLCBpdCBpcyB0aGVyZSBpbiBfbW9kaWZpZWRUYWIgYXMgbmV3IHJlY29yZC4gSW5zZXJ0aW5nXHJcbiAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYWxyZWFkeSBzeW5jZWQgcmVjb3JkIGNhdXNlcyBpbnNlcnRpb24gb2YgcmVjb3JkIHR3aWNlLiBTbywgSWYgY3VycmVudCByZWNvcmQgaXMgbm90IHN5bmNlZCB0aGVuIG9ubHkgaW5zZXJ0LlxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyUmVjLlN5bmNlZCAmJiBvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM5ODA1Mjg6IFJlZnJlc2ggdGhlIGN1cnJlbnQgcm93IGFmdGVyIGNhbmNlbCBlZGl0IHRvIHJlZmxlY3RcclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3RvcmVkIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDAgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKSlcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCBidWcgIzo5NDE3NjMsIHdoaWxlIGNyZWF0ZSBpc24ndCBhbGxvd2VkIG5lZWQgdG8gZG8gc3VmZml4IGFuZCBwcmVmaXggb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmRvUmVjb3JkU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1JlY29yZFN1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgcmVmZG9SZWNvcmRTdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFByZWZpeCh0aGlzLl90YXNrKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGRvUmVjb3JkU3VmZml4ID0gcmVmZG9SZWNvcmRTdWZmaXgudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHRoZSBmb3JtIGRvZXMgbm90IGhhdmUgYSB0YWJsZSwgbW92ZSB0byBvbmUgcm93IGluIHRoZSBjaG9zZW4gRGlyZWN0aW9uXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgKyBzaXplLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuYWJvcnQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Qcm9jZXNzQWJvcnRpbmdFcnJvcihleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHVyblRvVmlzaWJsZUxpbmUpIHtcclxuICAgICAgICBpZiAocmVjb3JkT3V0T2ZWaWV3KSB7XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPT09IDApXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuX3Jvd3NJblBhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHZpc2libGVMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93KCk7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgcmVjb3JkIHRvIHRoZSBmb3JtIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYWRkUmVjKGRvU3VmZml4OiBib29sZWFuLGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbmV3TGluZTogbnVtYmVyID0gMTtcclxuICAgIGxldCBjdXJyTGluZTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKCF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBjdXJyTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuXHJcbiAgICAvLyBJbmNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBhZGRlZCBpbnRvIHRoZSB2aWV3LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgKz0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1JlY0lkeDogbnVtYmVyID0gYXdhaXQgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLmFkZFJlY29yZChkb1N1ZmZpeCwgZmFsc2UsIGlzQ3JlbGluZUFib3ZlKTtcclxuXHJcbiAgICBpZiAobmV3UmVjSWR4ID4gLTEpIHtcclxuICAgICAgLy8gZm9ybXMgd2l0aCBhIHRhYmxlXHJcbiAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIC8vIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSBzbyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyXHJcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgdG9wIHJlY29yZCB0byAwIGFuZCB0aGUgY3VycmVudCByb3cgdG8gMFxyXG4gICAgICAgIGxldCBuZXdDdXJyUm93OiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDAgfHwgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgY3Vyc29yIGlzIHBhcmtpbmcgb24gdGhlIGxhc3Qgcm93IG9mIHRoZSBkaXNwbGF5ZWQgdGFibGUgc28gdGhlXHJcbiAgICAgICAgLy8gbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyIGluY3JlbWVudGluZyB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gICAgICAgIGVsc2UgaWYgKGN1cnJMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyAxKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgdG9wIHJlY29yZFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSA+IDAgPyBjdXJyTGluZSA6IDA7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbmV3TGluZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3c7XHJcblxyXG4gICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93KTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uYWRkUmVjKCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCAtPSAxO1xyXG4gICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZGVsZXRlIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZGVsQ3VyclJlYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0b3BUYWJsZVJvdzogYm9vbGVhbiA9IHN1cGVyLmlzTGluZU1vZGUoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnJlbW92ZUN1cnJSZWMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICBpZiAodGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYWRkUmVjKGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpIHtcclxuICAgICAgICAgIC8vIGNoYW5nZSB0byBjcmVhdGUgbW9kZVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuXHJcbiAgICAgICAgICAvLyBNR19BQ1RfQ1JFTElORSBtYXkgYmUgZGlzYWJsZWQgLmkuZS4gUFJPUF9UWVBFX0FMTE9XX0NSRUFURSBleHByZXNzaW9uIGNhbiBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBleGl0IGZyb20gdGhlIG93bmVyVGFza1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGUgZW1wdGluZXNzIG9mIHRoZSBEViBtdXN0IGJlIGNoZWNrZWQgYWdhaW4gYmVjYXVzZSB0aGUgXCJjcmVhdGUgbGluZVwiIG1heSBmYWlsXHJcbiAgICBpZiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHRvcFRhYmxlUm93KVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcblxyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCB0cnVlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYW5jZWwgdGhlIGVkaXRpbmcgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCByZXN0b3JlIHRoZSBvbGQgdmFsdWVzIG9mIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDYW5jZWxcIj50cnVlIGlmIGNhbGxlZCBmb3IgQUNUX0NBTkNFTCwgZmFsc2Ugb3RoZXJ3aXNlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdEV2ZW50XCI+PC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KGlzQWN0Q2FuY2VsOiBib29sZWFuLCBpc1F1aXRFdmVudDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1vZGU6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IG5ld01vZGU6IHN0cmluZztcclxuICAgIGxldCByb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhlY1JlY1ByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFdlIHJldHVybiB0byBjcmVhdGUgbW9kZSBvbmx5IGlmIHRoZXJlIGlzIG5vIHJlY29yZCB0byBnbyB0byBhZnRlciB0aGUgY2FuY2VsIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDEgJiYgbW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIGVsc2VcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgLy8gOTk3MDczICYgOTMxMDIxLlxyXG4gICAgLy8gRXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGNhbmNlbCBldmVudCwgZm9yIGEgbmV3IHJlY29yZDpcclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBub3QgY3JlYXRlLCBkZWxldGUgdGhlIG5ldyByZWNvcmQgYW5kIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBjcmVhdGUsIHN0YXkgb24gdGhlIG5ldyByZWNvcmQuXHJcblxyXG4gICAgLy8gZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBTbywgaW4gY2FzZSBvZiBvcmdUYXNrTW9kZT1DLCBzaW5jZSB3ZSB3YW50IHRvIHN0YXkgb24gdGhlIG5ldyByZWNvcmQsIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGEgcmVjb3JkLlxyXG5cclxuICAgIC8vIEJ1dCBhcyBzYWlkLCBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCBPTkxZIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gVGhlIGNvbmRpdGlvbiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgLy8gVGhlIHJlY29yZCBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIGR2IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEuIFNvLCBpZiB0aGUgZHYgc2l6ZSBpcyAxLCBkdi5jYW5jZWxFZGl0KClcclxuICAgIC8vIGRvZXMgbm90IHJlbW92ZSB0aGUgcmVjb3JkIGFuZCBoZW5jZSBpbiB0aGlzIGNhc2UsIGZvcm0uY2FuY2VsRWRpdCgpIHNob3VsZCBub3QgY3JlYXRlIGEgbmV3IHJlY29yZC5cclxuICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgdGhlIHNpZ25hdHVyZSBvZiBkdi5jYW5jZWxFZGl0KCkgaXMgY2hhbmdlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHJlbW92ZWQgb3Igbm90LlxyXG5cclxuICAgIC8vIFRoaXMgaXMgb25lIHBhcnQuXHJcblxyXG4gICAgLy8gTm93LCBhZnRlciBjYW5jZWxFZGl0LCBSUCBoYXMgdG8gYmUgZXhlY3V0ZWQuIFRoaXMgd2FzIGRvbmUgaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTC5cclxuICAgIC8vIEJ1dCB3aGF0IGhhcHBlbnMgaXMsIGlmIGZvcm0uY2FuY2VsRWRpdCgpIGNyZWF0ZWQgYSBuZXcgbGluZSwgUlAgd2FzIGFscmVhZHkgZXhlY3V0ZWQgZnJvbSB0aGVyZS4gQW5kIGZyb21cclxuICAgIC8vIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLCBSUCBpcyBleGVjdXRlZCBmb3IgdGhlIHNlY29uZCB0aW1lLlxyXG4gICAgLy8gU28sIG1vdmVkIHRoZSBjb2RlIG9mIGV4ZWN1dGluZyBSUCBmcm9tIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwgdG8gZm9ybS5jYW5jZWxFZGl0KClcclxuICAgIC8vIGFuZCB0aGF0IHdpbGwgYmUgZG9uZSBvbmx5IGlmIHRoZSBjcmVhdGUgbGluZSB3YXMgbm90IGV4ZWN1dGVkLlxyXG5cclxuICAgIC8vIE5vdywgd2UgaGF2ZSBvbmUgbW9yZSBpc3N1ZS5cclxuXHJcbiAgICAvLyBVbnRpbCBub3csIHRoZSBSUCB3YXMgZXhlY3V0ZWQgYWZ0ZXIgZm9ybS5jYW5jZWxFZGl0KCkuXHJcbiAgICAvLyBTbywgd2hlbiB0aGUgY29kZSBpcyBtb3ZlZCB0byBmb3JtLmNhbmNlbEVkaXQoKSwgaXQgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgdGhpcy5HZXREYXRhdmlldygpLnNldFByZXZDdXJyUmVjKG51bGwpO1xyXG4gICAgaWYgKCh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpIHx8ICgoaXNBY3RDYW5jZWwgJiYgcmVjUmVtb3ZlZCkgJiYgKCFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSkmJig8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIC8vIFNldCBDYW5jZWwgaW5kaWNhdGlvbiBvbiB0aGUgdGFzayBmb3IgdG8gbm90IHBlcmZvcm0gY29udHJvbCB2YWx1ZSB2YWxpZGF0aW9uIGluIHRoZSBDcmVhdGUgbGluZSBhY3Rpb24uXHJcbiAgICAgIGxldCBvcmdDYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChpc0FjdENhbmNlbCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKG9yZ0NhbmNlbFdhc1JhaXNlZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc0FjdENhbmNlbClcclxuICAgICAgZXhlY1JlY1ByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgcm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gdGhpcy5fcm93c0luUGFnZSkge1xyXG4gICAgICAgICAgICAgIGxldCB0b3BSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBpZiAodG9wUmVjSWR4ID4gY3VyclJlY0lkeClcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICAgICAgICAgICAgcm93ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHJvdywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChyb3cgIT09IDApXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgcmVjUmVtb3ZlZClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgZXJyb3IgaW4gU2NyZWVuIG1vZGUgZm9yIEN1cnJlbnQgUmVjb3JkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKG5ld01vZGUpO1xyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXhlY1JlY1ByZWZpeCkge1xyXG4gICAgICAvLyBRQ1IgIzkyNTY0NiwgIzQ1NDE2NzogZXhpdCB0byB0aGUgb3duZXJUYXNrIGxldmVsIGluIG9yZGVyIHRvIHNraXAgY29udHJvbCBzdWZmaXhcclxuICAgICAgLy8gYW5kIHJlY29yZCBzdWZmaXggb2YgdGhlIGNhbmNlbGVkIG5ldyByZWNvcmQgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZVxyXG4gICAgICAvLyBuZXh0IHJlY29yZCBwZXJmaXggd291bGQgYmUgZXhlY3V0ZWRcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgb3duZXJUYXNrIHdoaWxlIGZvY3VzZWQgb24gc3ViZm9ybS9vd25lclRhc2suIFdlIGRvIG5vdCB3YW50IHRoZSBjdHJsIG9uIHRoZSBzdWJmb3JtIHRvIGRvIGN0cmwgc3VmZml4LlxyXG4gICAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCg8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkucGF0aENvbnRhaW5zKDxUYXNrQmFzZT50aGlzLl90YXNrKSlcclxuICAgICAgICAgIGZvciAobGV0IHBhcmVudCA9IDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50ICE9PSB0aGlzLl90YXNrO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgPSA8VGFza0Jhc2U+cGFyZW50LmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgKCg8RGF0YVZpZXc+cGFyZW50LkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnJlc2V0TW9kaWZpZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNRdWl0RXZlbnQpIHtcclxuICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBmb2xsb3dpbmcgMiBsaW5lcyBjYW4gYmUgbWVyZ2VkIGluIG9uZSBtZXRob2RcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UodGhpcy5fdGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzY2FuIGFsbCBjb250cm9scyBpbiB0aGUgZm9ybS4gRXZlcnkgY29udHJvbCB3aGljaCBoYXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGFuIGV4cHJlc3Npb24gd2lsbCBiZVxyXG4gIC8vLyAgIHJlZnJlc2hlZC4gVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGUgY29udHJvbCdzIGRpc3BsYXkgaXMgc3luY2hlZCB3aXRoIHRoZSBleHByZXNzaW4ncyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaE9uRXhwcmVzc2lvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9ICgodGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG5cclxuICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbC5yZWZyZXNoT25FeHByZXNzaW9uKCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoUHJvcHNPbkV4cHJlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgY29udHJvbHMgb2YgdGhpcyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZzVG9DdHJscygpOiB2b2lkIHtcclxuICAgIC8vIGlmIGxhc3QgZm9jdXNlZCBjb250cm9sIHdhcyBmcm9tIHRoaXMgdGFzayAtIHplcm8gaXQuXHJcbiAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsICYmIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkgPT09IHRoaXMpXHJcbiAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIG51bGwpO1xyXG5cclxuICAgIHN1cGVyLnJlbW92ZVJlZnNUb0N0cmxzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBjb250cm9sIHdpdGggYSBnaXZlbiBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5Q3RybE5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBzdWJmb3JtIGNvbnRyb2wgd2l0aCB0aGUgdHlwZWQgbmFtZSBmcm9tIGFsbCBwYXJlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+IHRoZSByZXF1ZXN0ZWQgc3ViZm9ybSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldFN1YkZvcm1DdHJsQnlOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGd1aVBhcmVudFRhc2s6IFRhc2tCYXNlO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50VGFzayA9IDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG4gICAgICAgICBkZXN0U3ViRm9ybSA9PT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrICE9PSBudWxsICYmIGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpICE9PSBudWxsO1xyXG4gICAgICAgICBndWlQYXJlbnRUYXNrID0gZ3VpUGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBkZXN0U3ViRm9ybSA9IDxNZ0NvbnRyb2w+Z3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSA9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFndWlQYXJlbnRUYXNrLklzU3ViRm9ybSB8fCBOU3RyaW5nLkVxdWFscyhndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpLk5hbWUsIGN0cmxOYW1lLCB0cnVlKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgc3VmZml4RG9uZSBwYXJhbWV0ZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3VmZml4RG9uZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1ZmZpeERvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVzdGluYXRpb25Sb3coKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0VGJsUm93O1xyXG4gIH1cclxuXHJcbiAgc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3N1YkZvcm1DdHJsID09PSBudWxsICYmIHN1YkZvcm1DdHJsICE9PSBudWxsKTtcclxuICAgIHRoaXMuX3N1YkZvcm1DdHJsID0gc3ViRm9ybUN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHN1YmZvcm0gY29udHJvbCB0aGF0IHBvaW50cyB0byBhIHRhc2sgd2hvc2UgaWQgaXMgZ2l2ZW4gaW4gdGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPnRoZSBpZCBvZiByZXF1ZXN0ZWQgc3ViZm9ybSBvd25lclRhc2s8L3BhcmFtPlxyXG4gIGdldFN1YkZvcm1DdHJsRm9yVGFzayh0YXNrSWQ6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VycjogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCBwYXJlbnRDdHJsVGFiOiBDb250cm9sVGFibGU7XHJcbiAgICBsZXQgZ3VpUGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRGb3JtID0gdGhpczsgZ3VpUGFyZW50Rm9ybSAhPSBudWxsOyBndWlQYXJlbnRGb3JtID0gZ3VpUGFyZW50Rm9ybS5QYXJlbnRGb3JtKSB7XHJcbiAgICAgIHBhcmVudEN0cmxUYWIgPSBndWlQYXJlbnRGb3JtLkN0cmxUYWI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXJlbnRDdHJsVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgY3VyciA9ICgocGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+cGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKGN1cnIgIT0gbnVsbCAmJiBjdXJyLmlzU3ViZm9ybSgpICYmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSAhPSBudWxsKSlcclxuICAgICAgICAgIGlmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSA9PT0gdGFza0lkKSB7XHJcbiAgICAgICAgICAgIGRlc3RTdWJGb3JtID0gY3VycjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSAhPSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3JlYXRlIHJlY29yZHMgYmV0d2VlbiBpZHggYW5kIGVuZCBvZiBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHJlbW92ZVJlY29yZHNBZnRlcklkeChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlbW92ZUFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGluIHNvbWUgY2FzZXMgaW52aXNpYmxlIC0xIHJvdyAodGhhdCBleGlzdCBvbmx5IGZvciBzY3JvbGxiYXIgZWZmZWN0cykgYmVjb21lcyB2aXNpYmxlLlxyXG4gICAgLy8gVG8gcHJldmVudCB0aGlzIHdlJ2xsIHJlbW92ZSBhbGwgcmVjb3Jkcy4gVGhpcyB3aWxsIG5vdCBjYXVzZSBwZXJmcm9tYW5jZSBwcm9ibGVtcyBzaW5jZVxyXG4gICAgLy8gd2Ugd2lsbCBhZGQgbWF4aW11bSByb3dJblBhZ2UgcmVjb3JkcyBtb3JlIHRoZW4gd2UgaW50ZW5kZWQgaW4gdGhlIGJlZ2luaW5nXHJcblxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaWR4IDw9IHRoaXMuX3Jvd3NJblBhZ2UgKyAxICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIGlkeCA9IDA7XHJcbiAgICAgIGlmIChpZHggPT09IDApXHJcbiAgICAgICAgcmVtb3ZlQWxsID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KGlkeCwgcmVtb3ZlQWxsKTtcclxuICAgICAgLy8gdXBkYXRlcyB0YWJsZSBpdGVtJ3MgY291bnRcclxuXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcm93IGlzIHZhbGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1Jvd1ZhbGlkYXRlZChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuUm93cy5sZW5ndGggPD0gaWR4IHx8IGlkeCA8IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCByb3cgPSA8Um93PnRoaXMuUm93cy5nZXRfSXRlbShpZHgpO1xyXG4gICAgaWYgKHJvdyA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gcm93LkNyZWF0ZWQgJiYgcm93LlZhbGlkYXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBydW5zIGluIFdvcmtlciB0aHJlYWQgd2hlbiB0aGUgdGhyZWFkIGlzIGZyZWUgYW5kIHNlbmQgdG8gR1VJIHRocmVhZCBjb250cm9scyBkYXRhIG9mIGFsbCByb3dzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyB0cmFuc2ZlckRhdGFUb0d1aSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IG1heFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgKyBNZ0Zvcm0uVElNRV9MSU1JVDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG4gICAgICAvLyB0aGlzIGxpbWl0YXRpb24gaXMgbmVlZGVkIHNvIHRoaXMgcmVxdWVzdCB3aWxsIG5ldmVyIHRha2UgdG9vIG11Y2ggdGltZVxyXG4gICAgICB3aGlsZSAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSA8IG1heFRpbWUgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICAvLyBhbGwgcm93cyBhbHJlYWR5IHNlbnRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmIHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQrKztcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQodGhpcy5fbGFzdFJvd1NlbnQpKSB7XHJcbiAgICAgICAgICAvLyByb3cgbmVlZHMgdG8gYmUgc2VudFxyXG4gICAgICAgICAgLy8gc2VuZCByb3cgZGF0YVxyXG4gICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5fbGFzdFJvd1NlbnQpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICE9PSBzYXZlUm93SWR4KSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsOyAvLyByZXNldCB0aGUgZmxhZ1xyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5fbGFzdFJvd1NlbnQsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4LCBia3BSZWNvcmQpO1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gY3VycmVudEVkaXRpbmdDb250cm9sOyAvLyBzZXQgdGhlIGZsYWcgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYW55IHJvd3MgbmVlZCB0byBiZSBzZW50IHRvIEdVSSB0aHJlYWRcclxuICAvLy8gICBpZiB0aGVyZSBhcmUsIHB1dHMgZXZlbnQgaW4gZXZlbnQgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5PcGVuZWQgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcbiAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCA+PSB0aGlzLlJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gd2hlbiB3ZSBkZWNyZWFzZSBzaXplIG9mIHJvd3MgYXJyYXkgYWRqdXN0IGxhc3RSb3dTZW50XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQgPSB0aGlzLlJvd3MubGVuZ3RoIC0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdGhlcmUgYXJlIHJvd3MgdG8gc2VuZCBhbmQgdGhlcmUgaXMgbm93IHJlcXVlc3QgZm9yIHJvd3MgeWV0XHJcbiAgICAgIC8vIGFkZCByZXF1ZXN0IGZvciByb3dzXHJcbiAgICAgIGxldCB0cmFuc2ZlckRhdGFUb0d1aTogYm9vbGVhbiA9IHRoaXMuX2xhc3RSb3dTZW50IDwgKHNpemUgLSAxKTtcclxuXHJcbiAgICAgIC8vIEZvciBwYWdpbmF0ZWQgdGFibGUgY2hlY2sgdGhlIG1heCByb3dzIG9mIEdVSSB0YWJsZSBjb250cm9sLlxyXG4gICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxKSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpXHJcbiAgICAgICAgdHJhbnNmZXJEYXRhVG9HdWkgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0cmFuc2ZlckRhdGFUb0d1aSAmJiAhdGhpcy5fdHJhbnNmZXJpbmdEYXRhKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zaG91bGRGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIgJiYgIXRyYW5zZmVyRGF0YVRvR3VpICYmICghdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpIHx8ICF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVIsIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIHJvdyBkYXRhIGZvciB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj5kZXNpcmVkIHRvcCBpbmRleCBpZiBkZXNpcmVkVG9wSW5kZXggaXMgSW50ZWdlci5NSU5fVkFMVUUsIHRvcCBpbmRleCBpcyBjZWNpZXZlZCBmb3JtIGR2PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj5pZiB0cnVlLCBzZW5kIGFsbCByZWNvcmRzLCBldmVuIGlmIHRoZXkgYXJlIGNyZWF0ZWQgYW5kIHZhbGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Rm9jdXNlZFZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Um93RGF0YShkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IGRpZmY6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZ2V0UHJldkNodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZ2V0TmV4dENodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChkZXNpcmVkVG9wSW5kZXggIT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmIChkZXNpcmVkVG9wSW5kZXggPCAwKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyByZXF1ZXN0IGZvciBsaW5lIG9yIHBhZ2UgYmVmb3JlIGN1cnJlbnQgY2h1bmtcclxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHRvcCBpbmRleCBpcyBhbHdheXMgMFxyXG4gICAgICAgIGdldFByZXZDaHVuayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkZXNpcmVkVG9wSW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKVxyXG4gICAgICAvLyBwYWdlZG93biBvciBhcnJvd2Rvd24gYXQgZW5kIG9mIHRoZSBkYXRhdmlld1xyXG4gICAgICAgIGdldE5leHRDaHVuayA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGRlc2lyZWRUb3BJbmRleCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuXHJcbiAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG5cclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICBsZXQgZGlmZlJlZjogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbShkaWZmKTtcclxuICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCwgc2F2ZVJvd0lkeCwgZGlmZlJlZik7XHJcbiAgICBkaWZmID0gZGlmZlJlZi52YWx1ZTtcclxuXHJcbiAgICBpZiAoKGdldFByZXZDaHVuayAmJiBkaWZmICE9PSAwKSB8fCBnZXROZXh0Q2h1bmspIHtcclxuICAgICAgLy8gaWYgZGlmZiAhPSAwIGEgbmV3IGNodW5rIHdhcyBicm91Z2h0IHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgZHZcclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBmaXJzdCByZXF1ZXN0ZWQgaW5kZXhcclxuICAgICAgLy8gaWYgbmV4dCBjaHVuayB3YXMgYnJvdWdodCwgdG9wIGluZGV4IG1heSBhbHNvIGJlIHVwZGF0ZWRcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChkZXNpcmVkVG9wSW5kZXggKyBkaWZmKTtcclxuICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgIGlmICh0aGlzLl90b3BJbmRleFVwZGF0ZWQpIHtcclxuICAgICAgICAvLyBpZiB0b3AgaW5kZXggd2FzIHVwZGF0ZWQgaW4gdGhlIHNldFRhYmxlVG9wSW5kZXggLSB3ZSBtaWdodCBoYXZlIHJvd3MgdGhhdCB3ZXJlIG5vdCByZWZyZXNoZWRcclxuICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgLy8gYW55IHJvdyB3YXMgdXBkYXRlZFxyXG4gICAgICAvLyByZXN0b3JlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4ICsgZGlmZiwgYmtwUmVjb3JkKTtcclxuICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gYXNrIHRhYmxlIHRvIHJlZnJlc2ggdGhlIHBhZ2VcclxuXHJcbiAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIGlmIChnZXRQcmV2Q2h1bmspIHtcclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGZvY3VzZWRcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0UGFyZW50VGFibGUoKSA9PT0gdGhpcy5fdGFibGVNZ0NvbnRyb2wpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2hlcyByb3dzIGluIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNhdmVSb3dJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlmZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBzYXZlUm93SWR4OiBudW1iZXIsIGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkaWZmUmVmLnZhbHVlID0gMDtcclxuICAgIGxldCBvcmdJbmNsdWRlc0ZpcnN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKTtcclxuICAgIGxldCBvcmdJbmNsdWRlc0xhc3Q6IGJvb2xlYW4gPSB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGRlc2lyZWRUb3BJbmRleCArIGk7XHJcbiAgICAgIGxldCBwcmV2VG9wSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgd2UgZmFpbCB0byBnZXQgb25lIHJlY29yZCwgd2UgbWF5IHN1Y2NlZWQgdG8gZ2V0IHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gaWR4ICsgZGlmZlJlZi52YWx1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQoaWR4KSB8fCBzZW5kQWxsIHx8IHRoaXMuUmVmcmVzaEFsbFJvd3MpIHtcclxuICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxyXG4gICAgICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpbmRleCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNhdmVSb3dJZHggKyBkaWZmUmVmLnZhbHVlICE9PSBpbmRleCkgeyAvLyBub3QgY3VycmVudCBsaW5lXHJcbiAgICAgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRyZWVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpbmRleCwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgYSBuZXcgY2h1bmsgaXMgYnJvdWdodCB0b3AgaW5kZXggd2lsbCBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgLy8gY3JlYXRpb24gb2Ygcm93IGZhaWxlZCwgbWFyayB0aGUgcm93IGFzIG5vdCBjcmVhdGVkXHJcbiAgICAgICAgICBpZiAoc3VwZXIuaXNSb3dDcmVhdGVkKGluZGV4KSlcclxuICAgICAgICAgICAgc3VwZXIubWFya1Jvd05PVENyZWF0ZWQoaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICAvLyBRQ1IgIzI2MTA1NSwgZXZlbiBzbyByZXF1aXJlZCByZWNvcmQgbWF5IG5vdCBiZSBmb3VuZCwgaXQgaXMgcG9zc2libGUgdGhhdCBhIG5ldyBjaHVuayBoYXMgYmVlbiBzZW50XHJcbiAgICAgICAgLy8gYW5kIGRpZmYgbXVzdCBiZSB1cGRhdGVkXHJcbiAgICAgICAgZGlmZlJlZi52YWx1ZSA9IGRpZmZSZWYudmFsdWUgKyAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIC0gcHJldlRvcElkeCk7XHJcbiAgICAgICAgcHJldlRvcElkeCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICBpZiAoIXVwZGF0ZWQgJiYgdGhpcy5HZXREYXRhdmlldygpLkRhdGF2aWV3Qm91bmRyaWVzQXJlQ2hhbmdlZChvcmdJbmNsdWRlc0ZpcnN0LCBvcmdJbmNsdWRlc0xhc3QpKVxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdXBkYXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gcm93IGluIHRoZSBwYWdlPC9yZXR1cm5zPlxyXG4gIGdldFZpc2libGVMaW5lKCk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICE9PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgY3VyclJlY0lkeCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJSZWNJZHggLSBNYXRoLm1heCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFzc2VydHMgdGhhdCBjdXJyZW50IHJlY29yZCBpcyBpbiB0aGUgdmlldywgaWYgaXQgaXMgbm90IG9uIHRoZSBwYWdlLCBhZGp1c3RzIHRvcCBpbmRleCwgc28gdGhhdCBjdXJyZW50XHJcbiAgLy8vICAgcmVjb3JkIHdpbGwgYmUgb24gdGhlIHZpc2libGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYnJpbmdSZWNvcmRUb1BhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgbGV0IHRvcEluZGV4OiBudW1iZXIgPSBDb21tYW5kcy5nZXRUb3BJbmRleCh0aGlzLl90YWJsZU1nQ29udHJvbCk7XHJcbiAgICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICBsZXQgbmV3VG9wSW5kZXg6IG51bWJlciA9IHRvcEluZGV4O1xyXG5cclxuICAgICAgLy8gVGFibGUgdG9wIGluZGV4IGZvciBub24tcGFnaW5hdGVkIHRhYmxlXHJcbiAgICAgIGlmICghdGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICAgIGlmICh0b3BJbmRleCA+IGN1cnJJZHgpIHtcclxuICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSAtIDEgPCBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Jvd3NJblBhZ2UgPiAwKVxyXG4gICAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHggLSB0aGlzLl9yb3dzSW5QYWdlICsgMTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhYmxlIHRvcCBpbmRleCBmb3IgcGFnaW5hdGVkIHRhYmxlLlxyXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgaW5kZXggb2YgZmlyc3QgcmVjb3JkIG9uIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgcmVjb3JkIHRvIGJlIHNlbGVjdGVkLlxyXG4gICAgICAgIGxldCBjdXJyR3VpSWR4ID0gdGhpcy5nZXRHdWlSb3dpZHgoY3VycklkeCk7XHJcbiAgICAgICAgbGV0IG5ld1RvcEd1aUluZGV4ID0gKGN1cnJHdWlJZHgpIC0gKChjdXJyR3VpSWR4KSAlIHRoaXMuX3Jvd3NJblBhZ2UpOyAvL2d1aSBpZHggb2YgZmlyc3QgcmVjb3JkIG9mIHJlc3BlY3RpdmUgcGFnZVxyXG5cclxuICAgICAgICBuZXdUb3BJbmRleCA9IHRoaXMuZ2V0RHZSb3dJZHgobmV3VG9wR3VpSW5kZXgpO1xyXG5cclxuICAgICAgICBpZihuZXdUb3BJbmRleCAhPT0gdGhpcy5fcHJldkd1aVRvcEluZGV4IHx8IHRoaXMuSXNNb3ZpbmdJblZpZXcgKVxyXG4gICAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZXQgdG9wIGluZGV4IHRvIGJlIGN1cnJlbnQgbGluZVxyXG4gICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICE9PSBuZXdUb3BJbmRleCB8fCB0aGlzLl90b3BJbmRleFVwZGF0ZWQpIHtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KG5ld1RvcEluZGV4KTtcclxuICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFJvd0RhdGEoSW50MzIuTWluVmFsdWUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGludmFsaWRhdGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGludmFsaWRhdGVUYWJsZSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHJvdzogUm93ID0gPFJvdz50aGlzLlJvd3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChyb3cgIT09IG51bGwpXHJcbiAgICAgICAgcm93LlZhbGlkYXRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gLTE7XHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHByZXZpb3VzIHZpc2libGUgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFByZXZMaW5lKGxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbGluZSAtIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHNvcnQgbWFyayhkZWx0YSkgZnJvbSB0aGUgY29sdW1uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhclNvcnRNYXJrXCI+PC9wYXJhbT5cclxuICBjbGVhclRhYmxlQ29sdW1uU29ydE1hcmsoY2xlYXJTb3J0TWFyazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGNsZWFyU29ydE1hcmspIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2Qgc3RvcCB0aGUgcm93IGZyb20gZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHN0b3BSb3dFZGl0aW5nKGlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgIGlmICh0aGlzLmdldElzUm93RWRpdGluZ0Zyb21HdWkoaWR4KSkge1xyXG4gICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfTk9UX0lTX1JPV19FRElUSU5HLCB0aGlzLCAgdGhpcy5pc0xpbmVNb2RlKCkgID8gaWR4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2Qgc3RhcnQgdGhlIHJvdyBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc3RhcnRSb3dFZGl0aW5nKGlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICghdGhpcy5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGlkeCkpIHtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX0lTX1JPV19FRElUSU5HLCB0aGlzLCB0aGlzLmlzTGluZU1vZGUoKSA/IGlkeCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHJldHVybiBpZiB0aGUgcm93IGlzIGluIGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBwdWJsaWMgZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShkaXNwbGF5SW5kZXg6bnVtYmVyICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzUm93RWRpdGluZzogYm9vbGVhbiA9IENvbW1hbmRzLmdldElzUm93RWRpdGluZyh0aGlzLCB0aGlzLmlzTGluZU1vZGUoKSA/IGRpc3BsYXlJbmRleCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgIHJldHVybiBpc1Jvd0VkaXRpbmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRoZSBkaXNwbGF5LCB0aGUgY29udHJvbHMgYW5kIHRoZWlyIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KHJlZnJlc2hUeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBUYWtlIGFub3RoZXIgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIG9mIFFDUnMgIzk4NDk5OSwgIzkzMzYzOSAmICM2OTk4MjE6XHJcbiAgICAvLyBOb3csIHRoZSBkaXNwbGF5IHdvdWxkIGJlIHJlZnJlc2hlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBOT1QgYW4gb2xkXHJcbiAgICAvLyByZWNvcmQgd2hpY2ggaXMgYmVpbmcgY29tcHV0ZWQuIFRoZSByZXN1bHQgb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCBkdXJpbmcgdGhlXHJcbiAgICAvLyBjb21wdXRlIHByb2Nlc3Mgb2YgYSByZWNvcmQgdGhlIGRpc3BsYXkgaXMgbm90IHJlZnJlc2hlZCAod2hpY2ggaXMgZ29vZCBmb3IgdXMpLlxyXG4gICAgLy8gVGhlIGRpc3BsYXkgd291bGQgYmUgcmVmcmVzaGVkIGFueXdheSBBRlRFUiB0aGUgY29tcHV0ZSBwcm9jZXNzIGlzIGRvbmUuXHJcbiAgICAvLyAoRWh1ZCAyMS1NQVktMjAwMilcclxuICAgIGlmIChjdXJyUmVjICE9PSBudWxsICYmIGN1cnJSZWMuSW5Db21wdXRlICYmICFjdXJyUmVjLmlzTmV3UmVjKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5faW5SZWZyZXNoRGlzcClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5faW5SZWZyZXNoRGlzcCA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0gfHwgcmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtIGFuZCByZWZyZXNoIGl0XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkgJiYgdGhpcy5PcGVuZWQpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSB8fCByZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQykge1xyXG4gICAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyAmJiBzdXBlci5oYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICAgIHN1cGVyLlNlbGVjdFJvdygpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZWZyZXNoIHRoZSBmb3JtIHByb3BlcnRpZXNcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoUHJvcHMoKTtcclxuICAgICAgICAvLyByZWZyZXNoIHRoZSBjdXJyZW50IHJlY29yZC9Sb3dcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHMoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9IGluIHRhc2sgezJ9XCIsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZSwgKDxUYXNrQmFzZT5zdXBlci5nZXRUYXNrKCkpLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZWZyZXNoRGlzcCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNpZ25hbCB3ZSBjb21wbGV0ZWQgdGhlIGZpcnN0IGN5Y2xlIG9mIHJlZnJlc2hpbmcgdGhlIGZvcm1cclxuICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyAmJiAoIXN1cGVyLmlzTGluZU1vZGUoKSB8fCB0aGlzLl90YWJsZVJlZnJlc2hlZCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuRm9ybVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5pc0ZpcnN0UmVjb3JkQ3ljbGUoKSB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRJc0luVmlld1JlZnJlc2goKSkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5TRVRfV0NfSURMRSwgdGhpcyk7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0SXNJblZpZXdSZWZyZXNoKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hVSSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRUYXNrKCkuaXNNYWluUHJvZygpIC8qJiYgSW5pdGlhbGl6YXRpb25GaW5pc2hlZCovKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGZvcm1zIHdpdGggdGFibGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiU3RhcnQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuICAgIC8vIHRvZG8gZm9yIG5vdyAtIGFsd2F5cyBzaG93IGFsbCByZWNvcmRzXHJcbiAgICAvLyBzYXZlIHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBsZXQgb2xkQ3VyclJvdzogbnVtYmVyID0gdGhpcy5EaXNwbGF5TGluZTtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSB3ZSByZWZyZXNoIHRoZSB0YWJsZSAtIHNldCBjdXJyLXJvdyBhbmQgdG9wLXJlYy1pZHggdG8gYmUgdGhlXHJcbiAgICAvLyBvbmVzIHJlcXVlc3RlZCBieSB0aGUgZGF0YXZpZXcuXHJcbiAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHJlZnJlc2hlcyAtIHdlIGNoYW5nZSBjdXJyLXJvdyBhbmQgdG9wLXJlYyBvbmx5IGlmIHRoZSB0YWJsZVxyXG4gICAgLy8gYmVjb21lcyBlbXB0eS5cclxuICAgIGlmICghdGhpcy5fdGFibGVSZWZyZXNoZWQgJiYgY3VyclJlY0lkeCA+PSAwKSB7XHJcbiAgICAgIG9sZEN1cnJSb3cgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuXHJcbiAgICAgIGlmIChvbGRDdXJyUm93ICsgMSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChvbGRDdXJyUm93IC0gTWF0aC5mbG9vcih0aGlzLl9yb3dzSW5QYWdlIC8gMikgKyAxKTtcclxuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChvbGRDdXJyUm93ID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBvbGRDdXJyUm93ID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiBUb3BSZWNJZHggPCAwIGl0IG1lYW5zIHdlIHNob2xkIG5vdCBjb250aW51ZSB0aGUgcmVmcmVzaCBzaW5jZSB3ZSBhcmUgaW4gdGVtcG9yYXJ5IHNpdHVhdGlvbi5cclxuICAgIC8vIEFub3RoZXIgcmVmcmVzaCB3aWxsIGJlIGRvbmUgc29vbiB3aXRoIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgLy8gVGhpcyBpcyBjYW4gaGFwcGVuIHdoZW4gOlxyXG4gICAgLy8gSW4gZmV0Y2hDaHVua0Zyb21TZXJ2ZXIgd2UgZ28gdG8gdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBleHBlY3RzIG5ldyByZWNvcmRzLlxyXG4gICAgLy8gV2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZmV0Y2hpbmdDaHVuaywgd2UgbWlnaHQgZ28gYWdhaW4gdG8gdGhlIHNlcnZlciwgYmVmb3JlIHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGNodW5rLlxyXG4gICAgLy8gR29pbmcgdG8gdGhlIHNlcnZlciBpbiB0aGUgZ2V0IGNodW5rIHByb2Nlc3MgLCBjYW4gYmUgZm9yIGV4YW1wbGU6IHJlY29yZCBzdWZmaXgsIG9yIGFueSBzZXJ2ZXIgc2lkZSBvcCBpbiByZWMgc3VmZiBvciBWQy5cclxuICAgIC8vIFVzdWFsbHksIGR1cmluZyB0aGlzIHBhcnQsIHdlIGRvIG5vdCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIC8vIEJ1dCwgZm9yIGV4YW1wbGUgaW4gUUNSICM2OTgyMTcsIGEgY2FsbCB3YXMgbWFkZSB0byByZWZyZXNoVGFibGUgd2l0aCBUb3BSZWNJZHggPT0gLTEuXHJcbiAgICAvLyBUaGUgcmVhc29uIHdhcywgdGhhdCBpbiB0aGUgVkMgdGhlcmUgd2FzIGEgc2VydmVyIG9wIHRoYXQgdXBkYXRlZCBhIHZhciBpbiB0aGUgdGFzay4gQXMgYSByZXN1bHQsIHRoZSAnbW9kaScgZmxhZ1xyXG4gICAgLy8gZnJvbSB0aGUgc2VydmVyIHdhcyBvbiwgd2hpY2ggY2F1c2VkIHRoZSBcInRlbXBcIiByZWZyZXNoVGFibGUgYmVmb3JlIHRoZSByZWFsIGNodW5rIGFycml2ZWQuXHJcbiAgICAvLyBUaGlzIGluIHR1cm4gY2F1c2VkIGEgY2hhbmdlIGluIHRoZSBjdXJyIHJlYyBpZCwgd2hpY2ggd2FzIHdyb25nLlxyXG4gICAgLy8gQWZ0ZXIgdGhlIGNodW5rIGFycml2ZXMsIHRoZSByZWZyZXNoIHNldHMgdGhlIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBvbGRDdXJyUm93ID0gb2xkQ3VyclJvdyAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTsgLy8gc2F2ZSBvbGRDdXJyUm93IHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBpbmRleFxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgIHRoaXMuX3RhYmxlUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb3JpVHJhbnNmZXJEYXRhVG9HdWkgPSB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcblxyXG4gICAgaWYgKCFvcmlUcmFuc2ZlckRhdGFUb0d1aSlcclxuICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjOTk4MDY3LCB3ZSBtdXN0IG5vdCByZWZyZXNoIHN1YmZvcm1zIGZvciBhbnkgcm93cyB0aGF0IGFyZSBub3Qgb3VyIHJlYWwgY3VycmVudCByb3dcclxuXHJcbiAgICAvLyByZWZyZXNoIGFsbCB0aGUgcm93cyBCVVQgbm90IHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyByZWNvcmQgZm9yIGEgcm93IGp1c3QgZGlzYWJsZSBpdCBhbmQgdmljZSB2ZXJzYVxyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgaWYgKHRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgdG9wSW5kZXggPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IHRvcEluZGV4ICsgaTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpZHgpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBvbGQgY3VycmVudCByb3cuIHRoZSByZWZyZXNoIGZvciB0aGlzIHJvdyBpcyBkb25lIGJ5IHRoZSBjYWxsZXJcclxuICAgICAgICAvLyBhbmQgcmVmcmVzaCBvbmx5IHZhbGlkIGxpbmVzIHRoYXQgd2VyZSBub3QgZGlzYWJsZWRcclxuICAgICAgICBpZiAoaSAhPT0gb2xkQ3VyclJvdykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpZHgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4Lm5hbWUgPT0gXCJSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uXCIpIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKG9sZEN1cnJSb3cgKyB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIGJrcFJlY29yZCk7XHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlR3VpVG9Mb2coXCJFbmQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGRpc3BsYXkgbGluZSBieSByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdXBkYXRlRGlzcGxheUxpbmVCeURWKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNwbGF5TGluZSA9IHRoaXMucmVjb3JkSWR4MkRpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj5pcyB0aGUgbmV3IGN1cnJlbnQgZGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZTogbnVtYmVyLCBkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmUpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlSZWNJZHgocmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZGlzcGxheUxpbmUpO1xyXG4gICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRGlzcGxheUxpbmUgPSBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd051bVwiPmlzIHRoZSBuZXcgY3VycmVudCByb3cgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNldEN1cnJSb3dCeVJlY0lkeChyb3dOdW06IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkgPT09IG51bGwgfHwgKCFzdXBlci5oYXNUYWJsZSgpICYmIHJvd051bSAhPT0gMCkpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEZvcm0uc2V0Q3VyclJvdygpIG5vIHRhYmxlIFwiKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtO1xyXG4gICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHJvd051bSwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIHRydWUsIGRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGxhc3QgdmFsaWQgcm93IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFZhbGlkUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fcm93c0luUGFnZSAtIDEsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgcmVjb3JkIGxpbmUgdG8gZGlzcGxheSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICByZWNvcmRJZHgyRGlzcGxheUxpbmUocmVjSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgZGlzcGxheSBsaW5lIHRvIHJlY29yZCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGRpc3BsYXlMaW5lMlJlY29yZElkeChkaXNwbGF5TGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgY3VycmVudCByb3cgdXNpbmcgdGhlIHBhcmFtZXRlciBhbmQgaWdub3JpbmcgYW55IGV4Y2VwdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPnRoZSBvbGQgY3VycmVudCByb3cgbnVtYmVyIHRvIGJlIHJlc3RvcmVkPC9wYXJhbT5cclxuICBhc3luYyByZXN0b3JlT2xkRGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByZWNvcmQgZnJvbSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLmRpc3BsYXlMaW5lMlJlY29yZElkeCh0b3BEaXNwbGF5TGluZSkpO1xyXG5cclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCByZWNvcmQgcG9zaXRpb24gaW4gdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNQb3NJbkZvcm0oKTogbnVtYmVyIHtcclxuICAgIC8vIHdoZW4gdGhlIHNlbGVjdGVkIHJlY29yZCBpcyBvdXRzaWRlIHRoZSB2aWV3LCB0b3BJbmRleCBhbmQgRGlzcGxheUxpbmUgd2lsbCBiZSAwXHJcbiAgICAvLyByZXN1bHRpbmcgaW4gY3VyclJlY1Bvc0luRm9ybSA9PSAxXHJcbiAgICBsZXQgdG9wRGlzcGxheUxpbmU6IG51bWJlciA9IHN1cGVyLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuRGlzcGxheUxpbmUgLSB0b3BEaXNwbGF5TGluZSArIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkRGlzcGxheUxpbmVcIj5vbGQgY3VycmVudCByZWNvcmQgaWR4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJrcFJlY29yZFwiPnNhdmVkIHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZUJhY2t1cChvbGREaXNwbGF5TGluZTogbnVtYmVyLCBia3BSZWNvcmQ6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUUNSICM5NDI4NzgsIGlmIHJlY29yZCBpcyBpbiBwcm9jZXNzIG9mIGluc2VydCwgZGVsZXRlIG9yIG1vZGlmeSB3ZSBtdXN0IHBlcmZvcm0gcmVzdG9yZU9sZEN1cnJSb3dcclxuICAgIC8vIHRoYXQgd2lsbCBwZXJmb3JtIGFsbCBuZWNlc3NhcnkgYWN0aW9ucyBmb3IgdGhlIHJlY29yZCwgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IHJlc3RvcmUgaXQgZnJvbSBiYWNrdXBcclxuICAgIGlmIChia3BSZWNvcmQuZ2V0SWQoKSA+PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRSZWNJZHgoYmtwUmVjb3JkLmdldElkKCkpID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPj0gMCAmJiBvbGREaXNwbGF5TGluZSA8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA+PSAwICYmIGJrcFJlY29yZC5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lKSB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5yZXN0b3JlQ3VycmVudChia3BSZWNvcmQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZT86IE1nQ29udHJvbFR5cGUsIHRhc2tPclBhcmVudE1nRm9ybT86IGFueSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeD86IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzAoKTtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICh0eXBlID09PSBudWxsIHx8IHR5cGUuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHRhc2tPclBhcmVudE1nRm9ybSA9PT0gbnVsbCB8fCB0YXNrT3JQYXJlbnRNZ0Zvcm0gaW5zdGFuY2VvZiBUYXNrQmFzZSkgJiYgKHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHggPT09IG51bGwgfHwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5Db25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzAoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCB0YXNrOiBUYXNrQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCB0YXNrLCBwYXJlbnRDb250cm9sKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzIodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiBuZXcgTWdDb250cm9sKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFscmVhZHkgbW92ZWQgdG8gdGhlIGZpcnN0IGNvbnRyb2wgb24gb25lIG9mIHRoZSBNZ0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0TUdEYXRhKCkuQWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRhYmxlIGZpcnN0IHRpbWUgd2UgZW50ZXIgdGhlIG93bmVyVGFza1xyXG4gIC8vLyAgIGdldCByb3dzIG51bWJlciBmb3JtIGd1aSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgY3JlYXRlRm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKC1yZWNQb3NPblBhZ2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3VpUm93aWR4KGR2Um93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGR2Um93SWR4ICsgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcblxyXG4gIGdldER2Um93SWR4KGd1aVJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBndWlSb3dJZHggLSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxufVxyXG4iXX0=
|