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