matrix-react-sdk
Version:
SDK for matrix.org using React
618 lines (608 loc) • 111 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _classnames = _interopRequireDefault(require("classnames"));
var _Keyboard = require("../../Keyboard");
var _PageTypes = _interopRequireDefault(require("../../PageTypes"));
var _MediaDeviceHandler = _interopRequireDefault(require("../../MediaDeviceHandler"));
var _FontManager = require("../../utils/FontManager");
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _SettingsStore = _interopRequireDefault(require("../../settings/SettingsStore"));
var _SettingLevel = require("../../settings/SettingLevel");
var _ResizeHandle = _interopRequireDefault(require("../views/elements/ResizeHandle"));
var _resizer = require("../../resizer");
var _PlatformPeg = _interopRequireDefault(require("../../PlatformPeg"));
var _models = require("../../stores/room-list/models");
var _ServerLimitToast = require("../../toasts/ServerLimitToast");
var _actions = require("../../dispatcher/actions");
var _LeftPanel = _interopRequireDefault(require("./LeftPanel"));
var _RoomListStore = _interopRequireDefault(require("../../stores/room-list/RoomListStore"));
var _NonUrgentToastContainer = _interopRequireDefault(require("./NonUrgentToastContainer"));
var _Modal = _interopRequireDefault(require("../../Modal"));
var _KeyBindingsManager = require("../../KeyBindingsManager");
var _SpacePanel = _interopRequireDefault(require("../views/spaces/SpacePanel"));
var _LegacyCallHandler = _interopRequireWildcard(require("../../LegacyCallHandler"));
var _AudioFeedArrayForLegacyCall = _interopRequireDefault(require("../views/voip/AudioFeedArrayForLegacyCall"));
var _OwnProfileStore = require("../../stores/OwnProfileStore");
var _AsyncStore = require("../../stores/AsyncStore");
var _RoomView = _interopRequireDefault(require("./RoomView"));
var _ToastContainer = _interopRequireDefault(require("./ToastContainer"));
var _UserView = _interopRequireDefault(require("./UserView"));
var _BackdropPanel = _interopRequireDefault(require("./BackdropPanel"));
var _Media = require("../../customisations/Media");
var _UserTab = require("../views/dialogs/UserTab");
var _RightPanelStore = _interopRequireDefault(require("../../stores/right-panel/RightPanelStore"));
var _RoomContext = require("../../contexts/RoomContext");
var _KeyboardShortcuts = require("../../accessibility/KeyboardShortcuts");
var _LeftPanelLiveShareWarning = _interopRequireDefault(require("../views/beacon/LeftPanelLiveShareWarning"));
var _UserOnboardingPage = require("../views/user-onboarding/UserOnboardingPage");
var _PipContainer = require("./PipContainer");
var _monitorSyncedPushRules = require("../../utils/pushRules/monitorSyncedPushRules");
var _MatrixClientContextProvider = require("./MatrixClientContextProvider");
var _LandmarkNavigation = require("../../accessibility/LandmarkNavigation");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2015-2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
// We need to fetch each pinned message individually (if we don't already have it)
// so each pinned message may trigger a request. Limit the number per room for sanity.
// NB. this is just for server notices rather than pinned messages in general.
const MAX_PINNED_NOTICES_PER_ROOM = 2;
// Used to find the closest inputable thing. Because of how our composer works,
// your caret might be within a paragraph/font/div/whatever within the
// contenteditable rather than directly in something inputable.
function getInputableElement(el) {
return el.closest("input, textarea, select, [contenteditable=true]");
}
/**
* This is what our MatrixChat shows when we are logged in. The precise view is
* determined by the page_type property.
*
* Currently, it's very tightly coupled with MatrixChat. We should try to do
* something about that.
*
* Components mounted below us can access the matrix client via the react context.
*/
class LoggedInView extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "_matrixClient", void 0);
(0, _defineProperty2.default)(this, "_roomView", void 0);
(0, _defineProperty2.default)(this, "_resizeContainer", void 0);
(0, _defineProperty2.default)(this, "resizeHandler", void 0);
(0, _defineProperty2.default)(this, "layoutWatcherRef", void 0);
(0, _defineProperty2.default)(this, "compactLayoutWatcherRef", void 0);
(0, _defineProperty2.default)(this, "backgroundImageWatcherRef", void 0);
(0, _defineProperty2.default)(this, "timezoneProfileUpdateRef", void 0);
(0, _defineProperty2.default)(this, "resizer", void 0);
(0, _defineProperty2.default)(this, "onTimezoneUpdate", async () => {
if (!_SettingsStore.default.getValue("userTimezonePublish")) {
// Ensure it's deleted
try {
await this._matrixClient.deleteExtendedProfileProperty("us.cloke.msc4175.tz");
} catch (ex) {
console.warn("Failed to delete timezone from user profile", ex);
}
return;
}
const currentTimezone = _SettingsStore.default.getValue("userTimezone") ||
// If the timezone is empty, then use the browser timezone.
// eslint-disable-next-line new-cap
Intl.DateTimeFormat().resolvedOptions().timeZone;
if (!currentTimezone || typeof currentTimezone !== "string") {
return;
}
try {
await this._matrixClient.setExtendedProfileProperty("us.cloke.msc4175.tz", currentTimezone);
} catch (ex) {
console.warn("Failed to update user profile with current timezone", ex);
}
});
(0, _defineProperty2.default)(this, "onCallState", () => {
const activeCalls = _LegacyCallHandler.default.instance.getAllActiveCalls();
if (activeCalls === this.state.activeCalls) return;
this.setState({
activeCalls
});
});
(0, _defineProperty2.default)(this, "refreshBackgroundImage", async () => {
let backgroundImage = _SettingsStore.default.getValue("RoomList.backgroundImage");
if (backgroundImage) {
// convert to http before going much further
backgroundImage = (0, _Media.mediaFromMxc)(backgroundImage).srcHttp;
} else {
backgroundImage = _OwnProfileStore.OwnProfileStore.instance.getHttpAvatarUrl();
}
this.setState({
backgroundImage
});
});
(0, _defineProperty2.default)(this, "canResetTimelineInRoom", roomId => {
if (!this._roomView.current) {
return true;
}
return this._roomView.current.canResetTimeline();
});
(0, _defineProperty2.default)(this, "onAccountData", event => {
if (event.getType() === "m.ignored_user_list") {
_dispatcher.default.dispatch({
action: "ignore_state_changed"
});
}
(0, _monitorSyncedPushRules.monitorSyncedPushRules)(event, this._matrixClient);
});
(0, _defineProperty2.default)(this, "onCompactLayoutChanged", () => {
this.setState({
useCompactLayout: _SettingsStore.default.getValue("useCompactLayout")
});
});
(0, _defineProperty2.default)(this, "onSync", (syncState, oldSyncState, data) => {
const oldErrCode = this.state.syncErrorData?.error?.errcode;
const newErrCode = data?.error?.errcode;
if (syncState === oldSyncState && oldErrCode === newErrCode) return;
this.setState({
syncErrorData: syncState === _matrix.SyncState.Error ? data : undefined
});
if (oldSyncState === _matrix.SyncState.Prepared && syncState === _matrix.SyncState.Syncing) {
this.updateServerNoticeEvents();
} else {
this.calculateServerLimitToast(this.state.syncErrorData, this.state.usageLimitEventContent);
}
});
(0, _defineProperty2.default)(this, "onRoomStateEvents", ev => {
const serverNoticeList = _RoomListStore.default.instance.orderedLists[_models.DefaultTagID.ServerNotice];
if (serverNoticeList?.some(r => r.roomId === ev.getRoomId())) {
this.updateServerNoticeEvents();
}
});
(0, _defineProperty2.default)(this, "onUsageLimitDismissed", () => {
this.setState({
usageLimitDismissed: true
});
});
(0, _defineProperty2.default)(this, "updateServerNoticeEvents", async () => {
const serverNoticeList = _RoomListStore.default.instance.orderedLists[_models.DefaultTagID.ServerNotice];
if (!serverNoticeList) return;
const events = [];
let pinnedEventTs = 0;
for (const room of serverNoticeList) {
const pinStateEvent = room.currentState.getStateEvents("m.room.pinned_events", "");
if (!pinStateEvent || !pinStateEvent.getContent().pinned) continue;
pinnedEventTs = pinStateEvent.getTs();
const pinnedEventIds = pinStateEvent.getContent().pinned.slice(0, MAX_PINNED_NOTICES_PER_ROOM);
for (const eventId of pinnedEventIds) {
const timeline = await this._matrixClient.getEventTimeline(room.getUnfilteredTimelineSet(), eventId);
const event = timeline?.getEvents().find(ev => ev.getId() === eventId);
if (event) events.push(event);
}
}
if (pinnedEventTs && this.state.usageLimitEventTs && this.state.usageLimitEventTs > pinnedEventTs) {
// We've processed a newer event than this one, so ignore it.
return;
}
const usageLimitEvent = events.find(e => {
return e && e.getType() === "m.room.message" && e.getContent()["server_notice_type"] === "m.server_notice.usage_limit_reached";
});
const usageLimitEventContent = usageLimitEvent?.getContent();
this.calculateServerLimitToast(this.state.syncErrorData, usageLimitEventContent);
this.setState({
usageLimitEventContent,
usageLimitEventTs: pinnedEventTs,
// This is a fresh toast, we can show toasts again
usageLimitDismissed: false
});
});
(0, _defineProperty2.default)(this, "onPaste", ev => {
const element = ev.target;
const inputableElement = getInputableElement(element);
if (inputableElement === document.activeElement) return; // nothing to do
if (inputableElement?.focus) {
inputableElement.focus();
} else {
const inThread = !!document.activeElement?.closest(".mx_ThreadView");
// refocusing during a paste event will make the paste end up in the newly focused element,
// so dispatch synchronously before paste happens
_dispatcher.default.dispatch({
action: _actions.Action.FocusSendMessageComposer,
context: inThread ? _RoomContext.TimelineRenderingType.Thread : _RoomContext.TimelineRenderingType.Room
}, true);
}
});
/*
SOME HACKERY BELOW:
React optimizes event handlers, by always attaching only 1 handler to the document for a given type.
It then internally determines the order in which React event handlers should be called,
emulating the capture and bubbling phases the DOM also has.
But, as the native handler for React is always attached on the document,
it will always run last for bubbling (first for capturing) handlers,
and thus React basically has its own event phases, and will always run
after (before for capturing) any native other event handlers (as they tend to be attached last).
So ideally one wouldn't mix React and native event handlers to have bubbling working as expected,
but we do need a native event handler here on the document,
to get keydown events when there is no focused element (target=body).
We also do need bubbling here to give child components a chance to call `stopPropagation()`,
for keydown events it can handle itself, and shouldn't be redirected to the composer.
So we listen with React on this component to get any events on focused elements, and get bubbling working as expected.
We also listen with a native listener on the document to get keydown events when no element is focused.
Bubbling is irrelevant here as the target is the body element.
*/
(0, _defineProperty2.default)(this, "onReactKeyDown", ev => {
// events caught while bubbling up on the root element
// of this component, so something must be focused.
this.onKeyDown(ev);
});
(0, _defineProperty2.default)(this, "onNativeKeyDown", ev => {
// only pass this if there is no focused element.
// if there is, onKeyDown will be called by the
// react keydown handler that respects the react bubbling order.
if (ev.target === document.body) {
this.onKeyDown(ev);
}
});
(0, _defineProperty2.default)(this, "onKeyDown", ev => {
let handled = false;
const roomAction = (0, _KeyBindingsManager.getKeyBindingsManager)().getRoomAction(ev);
switch (roomAction) {
case _KeyboardShortcuts.KeyBindingAction.ScrollUp:
case _KeyboardShortcuts.KeyBindingAction.ScrollDown:
case _KeyboardShortcuts.KeyBindingAction.JumpToFirstMessage:
case _KeyboardShortcuts.KeyBindingAction.JumpToLatestMessage:
// pass the event down to the scroll panel
this.onScrollKeyPressed(ev);
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.SearchInRoom:
_dispatcher.default.fire(_actions.Action.FocusMessageSearch);
handled = true;
break;
}
if (handled) {
ev.stopPropagation();
ev.preventDefault();
return;
}
const navAction = (0, _KeyBindingsManager.getKeyBindingsManager)().getNavigationAction(ev);
switch (navAction) {
case _KeyboardShortcuts.KeyBindingAction.NextLandmark:
case _KeyboardShortcuts.KeyBindingAction.PreviousLandmark:
_LandmarkNavigation.LandmarkNavigation.findAndFocusNextLandmark(_LandmarkNavigation.Landmark.MESSAGE_COMPOSER_OR_HOME, navAction === _KeyboardShortcuts.KeyBindingAction.PreviousLandmark);
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.FilterRooms:
_dispatcher.default.dispatch({
action: "focus_room_filter"
});
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.ToggleUserMenu:
_dispatcher.default.fire(_actions.Action.ToggleUserMenu);
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.ShowKeyboardSettings:
_dispatcher.default.dispatch({
action: _actions.Action.ViewUserSettings,
initialTabId: _UserTab.UserTab.Keyboard
});
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.GoToHome:
// even if we cancel because there are modals open, we still
// handled it: nothing else should happen.
handled = true;
if (_Modal.default.hasDialogs()) {
return;
}
_dispatcher.default.dispatch({
action: _actions.Action.ViewHomePage
});
break;
case _KeyboardShortcuts.KeyBindingAction.ToggleSpacePanel:
_dispatcher.default.fire(_actions.Action.ToggleSpacePanel);
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.ToggleRoomSidePanel:
if (this.props.page_type === "room_view") {
_RightPanelStore.default.instance.togglePanel(null);
handled = true;
}
break;
case _KeyboardShortcuts.KeyBindingAction.SelectPrevRoom:
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoomDelta,
delta: -1,
unread: false
});
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.SelectNextRoom:
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoomDelta,
delta: 1,
unread: false
});
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.SelectPrevUnreadRoom:
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoomDelta,
delta: -1,
unread: true
});
break;
case _KeyboardShortcuts.KeyBindingAction.SelectNextUnreadRoom:
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoomDelta,
delta: 1,
unread: true
});
break;
case _KeyboardShortcuts.KeyBindingAction.PreviousVisitedRoomOrSpace:
_PlatformPeg.default.get()?.navigateForwardBack(true);
handled = true;
break;
case _KeyboardShortcuts.KeyBindingAction.NextVisitedRoomOrSpace:
_PlatformPeg.default.get()?.navigateForwardBack(false);
handled = true;
break;
}
// Handle labs actions here, as they apply within the same scope
if (!handled) {
const labsAction = (0, _KeyBindingsManager.getKeyBindingsManager)().getLabsAction(ev);
switch (labsAction) {
case _KeyboardShortcuts.KeyBindingAction.ToggleHiddenEventVisibility:
{
const hiddenEventVisibility = _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "showHiddenEventsInTimeline", undefined, false);
_SettingsStore.default.setValue("showHiddenEventsInTimeline", null, _SettingLevel.SettingLevel.DEVICE, !hiddenEventVisibility);
handled = true;
break;
}
}
}
if (!handled && _PlatformPeg.default.get()?.overrideBrowserShortcuts() && ev.code.startsWith("Digit") && ev.code !== "Digit0" &&
// this is the shortcut for reset zoom, don't override it
(0, _Keyboard.isOnlyCtrlOrCmdKeyEvent)(ev)) {
_dispatcher.default.dispatch({
action: _actions.Action.SwitchSpace,
num: parseInt(ev.code.slice(5), 10) // Cut off the first 5 characters - "Digit"
});
handled = true;
}
if (handled) {
ev.stopPropagation();
ev.preventDefault();
return;
}
const isModifier = ev.key === _Keyboard.Key.ALT || ev.key === _Keyboard.Key.CONTROL || ev.key === _Keyboard.Key.META || ev.key === _Keyboard.Key.SHIFT;
if (!isModifier && !ev.ctrlKey && !ev.metaKey) {
// The above condition is crafted to _allow_ characters with Shift
// already pressed (but not the Shift key down itself).
const isClickShortcut = ev.target !== document.body && (ev.key === _Keyboard.Key.SPACE || ev.key === _Keyboard.Key.ENTER);
// We explicitly allow alt to be held due to it being a common accent modifier.
// XXX: Forwarding Dead keys in this way does not work as intended but better to at least
// move focus to the composer so the user can re-type the dead key correctly.
const isPrintable = ev.key.length === 1 || ev.key === "Dead";
// If the user is entering a printable character outside of an input field
// redirect it to the composer for them.
if (!isClickShortcut && isPrintable && !getInputableElement(ev.target)) {
const inThread = !!document.activeElement?.closest(".mx_ThreadView");
// synchronous dispatch so we focus before key generates input
_dispatcher.default.dispatch({
action: _actions.Action.FocusSendMessageComposer,
context: inThread ? _RoomContext.TimelineRenderingType.Thread : _RoomContext.TimelineRenderingType.Room
}, true);
ev.stopPropagation();
// we should *not* preventDefault() here as that would prevent typing in the now-focused composer
}
}
});
/**
* dispatch a page-up/page-down/etc to the appropriate component
* @param {Object} ev The key event
*/
(0, _defineProperty2.default)(this, "onScrollKeyPressed", ev => {
this._roomView.current?.handleScrollKey(ev);
});
this.state = {
syncErrorData: undefined,
// use compact timeline view
useCompactLayout: _SettingsStore.default.getValue("useCompactLayout"),
usageLimitDismissed: false,
activeCalls: _LegacyCallHandler.default.instance.getAllActiveCalls()
};
// stash the MatrixClient in case we log out before we are unmounted
this._matrixClient = this.props.matrixClient;
_MediaDeviceHandler.default.loadDevices();
(0, _FontManager.fixupColorFonts)();
this._roomView = /*#__PURE__*/_react.default.createRef();
this._resizeContainer = /*#__PURE__*/_react.default.createRef();
this.resizeHandler = /*#__PURE__*/_react.default.createRef();
}
componentDidMount() {
document.addEventListener("keydown", this.onNativeKeyDown, false);
_LegacyCallHandler.default.instance.addListener(_LegacyCallHandler.LegacyCallHandlerEvent.CallState, this.onCallState);
this.updateServerNoticeEvents();
this._matrixClient.on(_matrix.ClientEvent.AccountData, this.onAccountData);
// check push rules on start up as well
(0, _monitorSyncedPushRules.monitorSyncedPushRules)(this._matrixClient.getAccountData("m.push_rules"), this._matrixClient);
this._matrixClient.on(_matrix.ClientEvent.Sync, this.onSync);
// Call `onSync` with the current state as well
this.onSync(this._matrixClient.getSyncState(), null, this._matrixClient.getSyncStateData() ?? undefined);
this._matrixClient.on(_matrix.RoomStateEvent.Events, this.onRoomStateEvents);
this.layoutWatcherRef = _SettingsStore.default.watchSetting("layout", null, this.onCompactLayoutChanged);
this.compactLayoutWatcherRef = _SettingsStore.default.watchSetting("useCompactLayout", null, this.onCompactLayoutChanged);
this.backgroundImageWatcherRef = _SettingsStore.default.watchSetting("RoomList.backgroundImage", null, this.refreshBackgroundImage);
this.timezoneProfileUpdateRef = [_SettingsStore.default.watchSetting("userTimezonePublish", null, this.onTimezoneUpdate), _SettingsStore.default.watchSetting("userTimezone", null, this.onTimezoneUpdate)];
this.resizer = this.createResizer();
this.resizer.attach();
_OwnProfileStore.OwnProfileStore.instance.on(_AsyncStore.UPDATE_EVENT, this.refreshBackgroundImage);
this.loadResizerPreferences();
this.refreshBackgroundImage();
}
componentWillUnmount() {
document.removeEventListener("keydown", this.onNativeKeyDown, false);
_LegacyCallHandler.default.instance.removeListener(_LegacyCallHandler.LegacyCallHandlerEvent.CallState, this.onCallState);
this._matrixClient.removeListener(_matrix.ClientEvent.AccountData, this.onAccountData);
this._matrixClient.removeListener(_matrix.ClientEvent.Sync, this.onSync);
this._matrixClient.removeListener(_matrix.RoomStateEvent.Events, this.onRoomStateEvents);
_OwnProfileStore.OwnProfileStore.instance.off(_AsyncStore.UPDATE_EVENT, this.refreshBackgroundImage);
if (this.layoutWatcherRef) _SettingsStore.default.unwatchSetting(this.layoutWatcherRef);
if (this.compactLayoutWatcherRef) _SettingsStore.default.unwatchSetting(this.compactLayoutWatcherRef);
if (this.backgroundImageWatcherRef) _SettingsStore.default.unwatchSetting(this.backgroundImageWatcherRef);
this.timezoneProfileUpdateRef?.forEach(s => _SettingsStore.default.unwatchSetting(s));
this.resizer?.detach();
}
createResizer() {
let panelSize;
let panelCollapsed;
const collapseConfig = {
// TODO decrease this once Spaces launches as it'll no longer need to include the 56px Community Panel
toggleSize: 206 - 50,
onCollapsed: collapsed => {
panelCollapsed = collapsed;
if (collapsed) {
_dispatcher.default.dispatch({
action: "hide_left_panel"
});
window.localStorage.setItem("mx_lhs_size", "0");
} else {
_dispatcher.default.dispatch({
action: "show_left_panel"
});
}
},
onResized: size => {
panelSize = size;
this.props.resizeNotifier.notifyLeftHandleResized();
},
onResizeStart: () => {
this.props.resizeNotifier.startResizing();
},
onResizeStop: () => {
if (!panelCollapsed) window.localStorage.setItem("mx_lhs_size", "" + panelSize);
this.props.resizeNotifier.stopResizing();
},
isItemCollapsed: domNode => {
return domNode.classList.contains("mx_LeftPanel_minimized");
},
handler: this.resizeHandler.current ?? undefined
};
const resizer = new _resizer.Resizer(this._resizeContainer.current, _resizer.CollapseDistributor, collapseConfig);
resizer.setClassNames({
handle: "mx_ResizeHandle",
vertical: "mx_ResizeHandle--vertical",
reverse: "mx_ResizeHandle_reverse"
});
return resizer;
}
loadResizerPreferences() {
let lhsSize = parseInt(window.localStorage.getItem("mx_lhs_size"), 10);
if (isNaN(lhsSize)) {
lhsSize = 350;
}
this.resizer?.forHandleWithId("lp-resizer")?.resize(lhsSize);
}
calculateServerLimitToast(syncError, usageLimitEventContent) {
const error = syncError?.error?.errcode === "M_RESOURCE_LIMIT_EXCEEDED";
if (error) {
usageLimitEventContent = (syncError?.error).data;
}
// usageLimitDismissed is true when the user has explicitly hidden the toast
// and it will be reset to false if a *new* usage alert comes in.
if (usageLimitEventContent && this.state.usageLimitDismissed) {
(0, _ServerLimitToast.showToast)(usageLimitEventContent.limit_type, this.onUsageLimitDismissed, usageLimitEventContent.admin_contact, error);
} else {
(0, _ServerLimitToast.hideToast)();
}
}
render() {
let pageElement;
switch (this.props.page_type) {
case _PageTypes.default.RoomView:
pageElement = /*#__PURE__*/_react.default.createElement(_RoomView.default, {
ref: this._roomView,
onRegistered: this.props.onRegistered,
threepidInvite: this.props.threepidInvite,
oobData: this.props.roomOobData,
key: this.props.currentRoomId || "roomview",
resizeNotifier: this.props.resizeNotifier,
justCreatedOpts: this.props.roomJustCreatedOpts,
forceTimeline: this.props.forceTimeline
});
break;
case _PageTypes.default.HomePage:
pageElement = /*#__PURE__*/_react.default.createElement(_UserOnboardingPage.UserOnboardingPage, {
justRegistered: this.props.justRegistered
});
break;
case _PageTypes.default.UserView:
if (!!this.props.currentUserId) {
pageElement = /*#__PURE__*/_react.default.createElement(_UserView.default, {
userId: this.props.currentUserId,
resizeNotifier: this.props.resizeNotifier
});
}
break;
}
const wrapperClasses = (0, _classnames.default)({
mx_MatrixChat_wrapper: true,
mx_MatrixChat_useCompactLayout: this.state.useCompactLayout
});
const bodyClasses = (0, _classnames.default)({
"mx_MatrixChat": true,
"mx_MatrixChat--with-avatar": this.state.backgroundImage
});
const audioFeedArraysForCalls = this.state.activeCalls.map(call => {
return /*#__PURE__*/_react.default.createElement(_AudioFeedArrayForLegacyCall.default, {
call: call,
key: call.callId
});
});
return /*#__PURE__*/_react.default.createElement(_MatrixClientContextProvider.MatrixClientContextProvider, {
client: this._matrixClient
}, /*#__PURE__*/_react.default.createElement("div", {
onPaste: this.onPaste,
onKeyDown: this.onReactKeyDown,
className: wrapperClasses,
"aria-hidden": this.props.hideToSRUsers
}, /*#__PURE__*/_react.default.createElement(_ToastContainer.default, null), /*#__PURE__*/_react.default.createElement("div", {
className: bodyClasses
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_LeftPanel_outerWrapper"
}, /*#__PURE__*/_react.default.createElement(_LeftPanelLiveShareWarning.default, {
isMinimized: this.props.collapseLhs || false
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_LeftPanel_wrapper"
}, /*#__PURE__*/_react.default.createElement(_BackdropPanel.default, {
blurMultiplier: 0.5,
backgroundImage: this.state.backgroundImage
}), /*#__PURE__*/_react.default.createElement(_SpacePanel.default, null), /*#__PURE__*/_react.default.createElement(_BackdropPanel.default, {
backgroundImage: this.state.backgroundImage
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_LeftPanel_wrapper--user",
ref: this._resizeContainer,
"data-collapsed": this.props.collapseLhs ? true : undefined
}, /*#__PURE__*/_react.default.createElement(_LeftPanel.default, {
pageType: this.props.page_type,
isMinimized: this.props.collapseLhs || false,
resizeNotifier: this.props.resizeNotifier
})))), /*#__PURE__*/_react.default.createElement(_ResizeHandle.default, {
passRef: this.resizeHandler,
id: "lp-resizer"
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomView_wrapper"
}, pageElement))), /*#__PURE__*/_react.default.createElement(_PipContainer.PipContainer, null), /*#__PURE__*/_react.default.createElement(_NonUrgentToastContainer.default, null), audioFeedArraysForCalls);
}
}
(0, _defineProperty2.default)(LoggedInView, "displayName", "LoggedInView");
var _default = exports.default = LoggedInView;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfY2xhc3NuYW1lcyIsIl9LZXlib2FyZCIsIl9QYWdlVHlwZXMiLCJfTWVkaWFEZXZpY2VIYW5kbGVyIiwiX0ZvbnRNYW5hZ2VyIiwiX2Rpc3BhdGNoZXIiLCJfU2V0dGluZ3NTdG9yZSIsIl9TZXR0aW5nTGV2ZWwiLCJfUmVzaXplSGFuZGxlIiwiX3Jlc2l6ZXIiLCJfUGxhdGZvcm1QZWciLCJfbW9kZWxzIiwiX1NlcnZlckxpbWl0VG9hc3QiLCJfYWN0aW9ucyIsIl9MZWZ0UGFuZWwiLCJfUm9vbUxpc3RTdG9yZSIsIl9Ob25VcmdlbnRUb2FzdENvbnRhaW5lciIsIl9Nb2RhbCIsIl9LZXlCaW5kaW5nc01hbmFnZXIiLCJfU3BhY2VQYW5lbCIsIl9MZWdhY3lDYWxsSGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0F1ZGlvRmVlZEFycmF5Rm9yTGVnYWN5Q2FsbCIsIl9Pd25Qcm9maWxlU3RvcmUiLCJfQXN5bmNTdG9yZSIsIl9Sb29tVmlldyIsIl9Ub2FzdENvbnRhaW5lciIsIl9Vc2VyVmlldyIsIl9CYWNrZHJvcFBhbmVsIiwiX01lZGlhIiwiX1VzZXJUYWIiLCJfUmlnaHRQYW5lbFN0b3JlIiwiX1Jvb21Db250ZXh0IiwiX0tleWJvYXJkU2hvcnRjdXRzIiwiX0xlZnRQYW5lbExpdmVTaGFyZVdhcm5pbmciLCJfVXNlck9uYm9hcmRpbmdQYWdlIiwiX1BpcENvbnRhaW5lciIsIl9tb25pdG9yU3luY2VkUHVzaFJ1bGVzIiwiX01hdHJpeENsaWVudENvbnRleHRQcm92aWRlciIsIl9MYW5kbWFya05hdmlnYXRpb24iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJNQVhfUElOTkVEX05PVElDRVNfUEVSX1JPT00iLCJnZXRJbnB1dGFibGVFbGVtZW50IiwiZWwiLCJjbG9zZXN0IiwiTG9nZ2VkSW5WaWV3IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsIl9tYXRyaXhDbGllbnQiLCJkZWxldGVFeHRlbmRlZFByb2ZpbGVQcm9wZXJ0eSIsImV4IiwiY29uc29sZSIsIndhcm4iLCJjdXJyZW50VGltZXpvbmUiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsInNldEV4dGVuZGVkUHJvZmlsZVByb3BlcnR5IiwiYWN0aXZlQ2FsbHMiLCJMZWdhY3lDYWxsSGFuZGxlciIsImluc3RhbmNlIiwiZ2V0QWxsQWN0aXZlQ2FsbHMiLCJzdGF0ZSIsInNldFN0YXRlIiwiYmFja2dyb3VuZEltYWdlIiwibWVkaWFGcm9tTXhjIiwic3JjSHR0cCIsIk93blByb2ZpbGVTdG9yZSIsImdldEh0dHBBdmF0YXJVcmwiLCJyb29tSWQiLCJfcm9vbVZpZXciLCJjdXJyZW50IiwiY2FuUmVzZXRUaW1lbGluZSIsImV2ZW50IiwiZ2V0VHlwZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwibW9uaXRvclN5bmNlZFB1c2hSdWxlcyIsInVzZUNvbXBhY3RMYXlvdXQiLCJzeW5jU3RhdGUiLCJvbGRTeW5jU3RhdGUiLCJkYXRhIiwib2xkRXJyQ29kZSIsInN5bmNFcnJvckRhdGEiLCJlcnJvciIsImVycmNvZGUiLCJuZXdFcnJDb2RlIiwiU3luY1N0YXRlIiwiRXJyb3IiLCJ1bmRlZmluZWQiLCJQcmVwYXJlZCIsIlN5bmNpbmciLCJ1cGRhdGVTZXJ2ZXJOb3RpY2VFdmVudHMiLCJjYWxjdWxhdGVTZXJ2ZXJMaW1pdFRvYXN0IiwidXNhZ2VMaW1pdEV2ZW50Q29udGVudCIsImV2Iiwic2VydmVyTm90aWNlTGlzdCIsIlJvb21MaXN0U3RvcmUiLCJvcmRlcmVkTGlzdHMiLCJEZWZhdWx0VGFnSUQiLCJTZXJ2ZXJOb3RpY2UiLCJzb21lIiwiZ2V0Um9vbUlkIiwidXNhZ2VMaW1pdERpc21pc3NlZCIsImV2ZW50cyIsInBpbm5lZEV2ZW50VHMiLCJyb29tIiwicGluU3RhdGVFdmVudCIsImN1cnJlbnRTdGF0ZSIsImdldFN0YXRlRXZlbnRzIiwiZ2V0Q29udGVudCIsInBpbm5lZCIsImdldFRzIiwicGlubmVkRXZlbnRJZHMiLCJzbGljZSIsImV2ZW50SWQiLCJ0aW1lbGluZSIsImdldEV2ZW50VGltZWxpbmUiLCJnZXRVbmZpbHRlcmVkVGltZWxpbmVTZXQiLCJnZXRFdmVudHMiLCJmaW5kIiwiZ2V0SWQiLCJwdXNoIiwidXNhZ2VMaW1pdEV2ZW50VHMiLCJ1c2FnZUxpbWl0RXZlbnQiLCJlbGVtZW50IiwidGFyZ2V0IiwiaW5wdXRhYmxlRWxlbWVudCIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsImZvY3VzIiwiaW5UaHJlYWQiLCJBY3Rpb24iLCJGb2N1c1NlbmRNZXNzYWdlQ29tcG9zZXIiLCJjb250ZXh0IiwiVGltZWxpbmVSZW5kZXJpbmdUeXBlIiwiVGhyZWFkIiwiUm9vbSIsIm9uS2V5RG93biIsImJvZHkiLCJoYW5kbGVkIiwicm9vbUFjdGlvbiIsImdldEtleUJpbmRpbmdzTWFuYWdlciIsImdldFJvb21BY3Rpb24iLCJLZXlCaW5kaW5nQWN0aW9uIiwiU2Nyb2xsVXAiLCJTY3JvbGxEb3duIiwiSnVtcFRvRmlyc3RNZXNzYWdlIiwiSnVtcFRvTGF0ZXN0TWVzc2FnZSIsIm9uU2Nyb2xsS2V5UHJlc3NlZCIsIlNlYXJjaEluUm9vbSIsImZpcmUiLCJGb2N1c01lc3NhZ2VTZWFyY2giLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsIm5hdkFjdGlvbiIsImdldE5hdmlnYXRpb25BY3Rpb24iLCJOZXh0TGFuZG1hcmsiLCJQcmV2aW91c0xhbmRtYXJrIiwiTGFuZG1hcmtOYXZpZ2F0aW9uIiwiZmluZEFuZEZvY3VzTmV4dExhbmRtYXJrIiwiTGFuZG1hcmsiLCJNRVNTQUdFX0NPTVBPU0VSX09SX0hPTUUiLCJGaWx0ZXJSb29tcyIsIlRvZ2dsZVVzZXJNZW51IiwiU2hvd0tleWJvYXJkU2V0dGluZ3MiLCJWaWV3VXNlclNldHRpbmdzIiwiaW5pdGlhbFRhYklkIiwiVXNlclRhYiIsIktleWJvYXJkIiwiR29Ub0hvbWUiLCJNb2RhbCIsImhhc0RpYWxvZ3MiLCJWaWV3SG9tZVBhZ2UiLCJUb2dnbGVTcGFjZVBhbmVsIiwiVG9nZ2xlUm9vbVNpZGVQYW5lbCIsInBhZ2VfdHlwZSIsIlJpZ2h0UGFuZWxTdG9yZSIsInRvZ2dsZVBhbmVsIiwiU2VsZWN0UHJldlJvb20iLCJWaWV3Um9vbURlbHRhIiwiZGVsdGEiLCJ1bnJlYWQiLCJTZWxlY3ROZXh0Um9vbSIsIlNlbGVjdFByZXZVbnJlYWRSb29tIiwiU2VsZWN0TmV4dFVucmVhZFJvb20iLCJQcmV2aW91c1Zpc2l0ZWRSb29tT3JTcGFjZSIsIlBsYXRmb3JtUGVnIiwibmF2aWdhdGVGb3J3YXJkQmFjayIsIk5leHRWaXNpdGVkUm9vbU9yU3BhY2UiLCJsYWJzQWN0aW9uIiwiZ2V0TGFic0FjdGlvbiIsIlRvZ2dsZUhpZGRlbkV2ZW50VmlzaWJpbGl0eSIsImhpZGRlbkV2ZW50VmlzaWJpbGl0eSIsImdldFZhbHVlQXQiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJzZXRWYWx1ZSIsIm92ZXJyaWRlQnJvd3NlclNob3J0Y3V0cyIsImNvZGUiLCJzdGFydHNXaXRoIiwiaXNPbmx5Q3RybE9yQ21kS2V5RXZlbnQiLCJTd2l0Y2hTcGFjZSIsIm51bSIsInBhcnNlSW50IiwiaXNNb2RpZmllciIsImtleSIsIktleSIsIkFMVCIsIkNPTlRST0wiLCJNRVRBIiwiU0hJRlQiLCJjdHJsS2V5IiwibWV0YUtleSIsImlzQ2xpY2tTaG9ydGN1dCIsIlNQQUNFIiwiRU5URVIiLCJpc1ByaW50YWJsZSIsImxlbmd0aCIsImhhbmRsZVNjcm9sbEtleSIsIm1hdHJpeENsaWVudCIsIk1lZGlhRGV2aWNlSGFuZGxlciIsImxvYWREZXZpY2VzIiwiZml4dXBDb2xvckZvbnRzIiwiY3JlYXRlUmVmIiwiX3Jlc2l6ZUNvbnRhaW5lciIsInJlc2l6ZUhhbmRsZXIiLCJjb21wb25lbnREaWRNb3VudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbk5hdGl2ZUtleURvd24iLCJhZGRMaXN0ZW5lciIsIkxlZ2FjeUNhbGxIYW5kbGVyRXZlbnQiLCJDYWxsU3RhdGUiLCJvbkNhbGxTdGF0ZSIsIm9uIiwiQ2xpZW50RXZlbnQiLCJBY2NvdW50RGF0YSIsIm9uQWNjb3VudERhdGEiLCJnZXRBY2NvdW50RGF0YSIsIlN5bmMiLCJvblN5bmMiLCJnZXRTeW5jU3RhdGUiLCJnZXRTeW5jU3RhdGVEYXRhIiwiUm9vbVN0YXRlRXZlbnQiLCJFdmVudHMiLCJvblJvb21TdGF0ZUV2ZW50cyIsImxheW91dFdhdGNoZXJSZWYiLCJ3YXRjaFNldHRpbmciLCJvbkNvbXBhY3RMYXlvdXRDaGFuZ2VkIiwiY29tcGFjdExheW91dFdhdGNoZXJSZWYiLCJiYWNrZ3JvdW5kSW1hZ2VXYXRjaGVyUmVmIiwicmVmcmVzaEJhY2tncm91bmRJbWFnZSIsInRpbWV6b25lUHJvZmlsZVVwZGF0ZVJlZiIsIm9uVGltZXpvbmVVcGRhdGUiLCJyZXNpemVyIiwiY3JlYXRlUmVzaXplciIsImF0dGFjaCIsIlVQREFURV9FVkVOVCIsImxvYWRSZXNpemVyUHJlZmVyZW5jZXMiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsIm9mZiIsInVud2F0Y2hTZXR0aW5nIiwiZm9yRWFjaCIsInMiLCJkZXRhY2giLCJwYW5lbFNpemUiLCJwYW5lbENvbGxhcHNlZCIsImNvbGxhcHNlQ29uZmlnIiwidG9nZ2xlU2l6ZSIsIm9uQ29sbGFwc2VkIiwiY29sbGFwc2VkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIm9uUmVzaXplZCIsInNpemUiLCJyZXNpemVOb3RpZmllciIsIm5vdGlmeUxlZnRIYW5kbGVSZXNpemVkIiwib25SZXNpemVTdGFydCIsInN0YXJ0UmVzaXppbmciLCJvblJlc2l6ZVN0b3AiLCJzdG9wUmVzaXppbmciLCJpc0l0ZW1Db2xsYXBzZWQiLCJkb21Ob2RlIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJoYW5kbGVyIiwiUmVzaXplciIsIkNvbGxhcHNlRGlzdHJpYnV0b3IiLCJzZXRDbGFzc05hbWVzIiwiaGFuZGxlIiwidmVydGljYWwiLCJyZXZlcnNlIiwibGhzU2l6ZSIsImdldEl0ZW0iLCJpc05hTiIsImZvckhhbmRsZVdpdGhJZCIsInJlc2l6ZSIsInN5bmNFcnJvciIsInNob3dTZXJ2ZXJMaW1pdFRvYXN0IiwibGltaXRfdHlwZSIsIm9uVXNhZ2VMaW1pdERpc21pc3NlZCIsImFkbWluX2NvbnRhY3QiLCJoaWRlU2VydmVyTGltaXRUb2FzdCIsInJlbmRlciIsInBhZ2VFbGVtZW50IiwiUGFnZVR5cGVzIiwiUm9vbVZpZXciLCJjcmVhdGVFbGVtZW50IiwicmVmIiwib25SZWdpc3RlcmVkIiwidGhyZWVwaWRJbnZpdGUiLCJvb2JEYXRhIiwicm9vbU9vYkRhdGEiLCJjdXJyZW50Um9vbUlkIiwianVzdENyZWF0ZWRPcHRzIiwicm9vbUp1c3RDcmVhdGVkT3B0cyIsImZvcmNlVGltZWxpbmUiLCJIb21lUGFnZSIsIlVzZXJPbmJvYXJkaW5nUGFnZSIsImp1c3RSZWdpc3RlcmVkIiwiVXNlclZpZXciLCJjdXJyZW50VXNlcklkIiwidXNlcklkIiwid3JhcHBlckNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfTWF0cml4Q2hhdF93cmFwcGVyIiwibXhfTWF0cml4Q2hhdF91c2VDb21wYWN0TGF5b3V0IiwiYm9keUNsYXNzZXMiLCJhdWRpb0ZlZWRBcnJheXNGb3JDYWxscyIsIm1hcCIsImNhbGxJZCIsIk1hdHJpeENsaWVudENvbnRleHRQcm92aWRlciIsImNsaWVudCIsIm9uUGFzdGUiLCJvblJlYWN0S2V5RG93biIsImNsYXNzTmFtZSIsImhpZGVUb1NSVXNlcnMiLCJpc01pbmltaXplZCIsImNvbGxhcHNlTGhzIiwiYmx1ck11bHRpcGxpZXIiLCJwYWdlVHlwZSIsInBhc3NSZWYiLCJpZCIsIlBpcENvbnRhaW5lciIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvTG9nZ2VkSW5WaWV3LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNS0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDbGlwYm9hcmRFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgICBDbGllbnRFdmVudCxcbiAgICBNYXRyaXhDbGllbnQsXG4gICAgTWF0cml4RXZlbnQsXG4gICAgUm9vbVN0YXRlRXZlbnQsXG4gICAgTWF0cml4RXJyb3IsXG4gICAgSVVzYWdlTGltaXQsXG4gICAgU3luY1N0YXRlRGF0YSxcbiAgICBTeW5jU3RhdGUsXG59IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IE1hdHJpeENhbGwgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvd2VicnRjL2NhbGxcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCB7IGlzT25seUN0cmxPckNtZEtleUV2ZW50LCBLZXkgfSBmcm9tIFwiLi4vLi4vS2V5Ym9hcmRcIjtcbmltcG9ydCBQYWdlVHlwZXMgZnJvbSBcIi4uLy4uL1BhZ2VUeXBlc1wiO1xuaW1wb3J0IE1lZGlhRGV2aWNlSGFuZGxlciBmcm9tIFwiLi4vLi4vTWVkaWFEZXZpY2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaXh1cENvbG9yRm9udHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvRm9udE1hbmFnZXJcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgSU1hdHJpeENsaWVudENyZWRzIH0gZnJvbSBcIi4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBSZXNpemVIYW5kbGUgZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL1Jlc2l6ZUhhbmRsZVwiO1xuaW1wb3J0IHsgQ29sbGFwc2VEaXN0cmlidXRvciwgUmVzaXplciB9IGZyb20gXCIuLi8uLi9yZXNpemVyXCI7XG5pbXBvcnQgUmVzaXplTm90aWZpZXIgZnJvbSBcIi4uLy4uL3V0aWxzL1Jlc2l6ZU5vdGlmaWVyXCI7XG5pbXBvcnQgUGxhdGZvcm1QZWcgZnJvbSBcIi4uLy4uL1BsYXRmb3JtUGVnXCI7XG5pbXBvcnQgeyBEZWZhdWx0VGFnSUQgfSBmcm9tIFwiLi4vLi4vc3RvcmVzL3Jvb20tbGlzdC9tb2RlbHNcIjtcbmltcG9ydCB7IGhpZGVUb2FzdCBhcyBoaWRlU2VydmVyTGltaXRUb2FzdCwgc2hvd1RvYXN0IGFzIHNob3dTZXJ2ZXJMaW1pdFRvYXN0IH0gZnJvbSBcIi4uLy4uL3RvYXN0cy9TZXJ2ZXJMaW1pdFRvYXN0XCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgTGVmdFBhbmVsIGZyb20gXCIuL0xlZnRQYW5lbFwiO1xuaW1wb3J0IHsgVmlld1Jvb21EZWx0YVBheWxvYWQgfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9WaWV3Um9vbURlbHRhUGF5bG9hZFwiO1xuaW1wb3J0IFJvb21MaXN0U3RvcmUgZnJvbSBcIi4uLy4uL3N0b3Jlcy9yb29tLWxpc3QvUm9vbUxpc3RTdG9yZVwiO1xuaW1wb3J0IE5vblVyZ2VudFRvYXN0Q29udGFpbmVyIGZyb20gXCIuL05vblVyZ2VudFRvYXN0Q29udGFpbmVyXCI7XG5pbXBvcnQgeyBJT09CRGF0YSwgSVRocmVlcGlkSW52aXRlIH0gZnJvbSBcIi4uLy4uL3N0b3Jlcy9UaHJlZXBpZEludml0ZVN0b3JlXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uL01vZGFsXCI7XG5pbXBvcnQgeyBDb2xsYXBzZUl0ZW0sIElDb2xsYXBzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi9yZXNpemVyL2Rpc3RyaWJ1dG9ycy9jb2xsYXBzZVwiO1xuaW1wb3J0IHsgZ2V0S2V5QmluZGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL0tleUJpbmRpbmdzTWFuYWdlclwiO1xuaW1wb3J0IHsgSU9wdHMgfSBmcm9tIFwiLi4vLi4vY3JlYXRlUm9vbVwiO1xuaW1wb3J0IFNwYWNlUGFuZWwgZnJvbSBcIi4uL3ZpZXdzL3NwYWNlcy9TcGFjZVBhbmVsXCI7XG5pbXBvcnQgTGVnYWN5Q2FsbEhhbmRsZXIsIHsgTGVnYWN5Q2FsbEhhbmRsZXJFdmVudCB9IGZyb20gXCIuLi8uLi9MZWdhY3lDYWxsSGFuZGxlclwiO1xuaW1wb3J0IEF1ZGlvRmVlZEFycmF5Rm9yTGVnYWN5Q2FsbCBmcm9tIFwiLi4vdmlld3Mvdm9pcC9BdWRpb0ZlZWRBcnJheUZvckxlZ2FjeUNhbGxcIjtcbmltcG9ydCB7IE93blByb2ZpbGVTdG9yZSB9IGZyb20gXCIuLi8uLi9zdG9yZXMvT3duUHJvZmlsZVN0b3JlXCI7XG5pbXBvcnQgeyBVUERBVEVfRVZFTlQgfSBmcm9tIFwiLi4vLi4vc3RvcmVzL0FzeW5jU3RvcmVcIjtcbmltcG9ydCBSb29tVmlldyBmcm9tIFwiLi9Sb29tVmlld1wiO1xuaW1wb3J0IHR5cGUgeyBSb29tVmlldyBhcyBSb29tVmlld1R5cGUgfSBmcm9tIFwiLi9Sb29tVmlld1wiO1xuaW1wb3J0IFRvYXN0Q29udGFpbmVyIGZyb20gXCIuL1RvYXN0Q29udGFpbmVyXCI7XG5pbXBvcnQgVXNlclZpZXcgZnJvbSBcIi4vVXNlclZpZXdcIjtcbmltcG9ydCBCYWNrZHJvcFBhbmVsIGZyb20gXCIuL0JhY2tkcm9wUGFuZWxcIjtcbmltcG9ydCB7IG1lZGlhRnJvbU14YyB9IGZyb20gXCIuLi8uLi9jdXN0b21pc2F0aW9ucy9NZWRpYVwiO1xuaW1wb3J0IHsgVXNlclRhYiB9IGZyb20gXCIuLi92aWV3cy9kaWFsb2dzL1VzZXJUYWJcIjtcbmltcG9ydCB7IE9wZW5Ub1RhYlBheWxvYWQgfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9PcGVuVG9UYWJQYXlsb2FkXCI7XG5pbXBvcnQgUmlnaHRQYW5lbFN0b3JlIGZyb20gXCIuLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlXCI7XG5pbXBvcnQgeyBUaW1lbGluZVJlbmRlcmluZ1R5cGUgfSBmcm9tIFwiLi4vLi4vY29udGV4dHMvUm9vbUNvbnRleHRcIjtcbmltcG9ydCB7IEtleUJpbmRpbmdBY3Rpb24gfSBmcm9tIFwiLi4vLi4vYWNjZXNzaWJpbGl0eS9LZXlib2FyZFNob3J0Y3V0c1wiO1xuaW1wb3J0IHsgU3dpdGNoU3BhY2VQYXlsb2FkIH0gZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvU3dpdGNoU3BhY2VQYXlsb2FkXCI7XG5pbXBvcnQgTGVmdFBhbmVsTGl2ZVNoYXJlV2FybmluZyBmcm9tIFwiLi4vdmlld3MvYmVhY29uL0xlZnRQYW5lbExpdmVTaGFyZVdhcm5pbmdcIjtcbmltcG9ydCB7IFVzZXJPbmJvYXJkaW5nUGFnZSB9IGZyb20gXCIuLi92aWV3cy91c2VyLW9uYm9hcmRpbmcvVXNlck9uYm9hcmRpbmdQYWdlXCI7XG5pbXBvcnQgeyBQaXBDb250YWluZXIgfSBmcm9tIFwiLi9QaXBDb250YWluZXJcIjtcbmltcG9ydCB7IG1vbml0b3JTeW5jZWRQdXNoUnVsZXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHVzaFJ1bGVzL21vbml0b3JTeW5jZWRQdXNoUnVsZXNcIjtcbmltcG9ydCB7IENvbmZpZ09wdGlvbnMgfSBmcm9tIFwiLi4vLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRDb250ZXh0UHJvdmlkZXIgfSBmcm9tIFwiLi9NYXRyaXhDbGllbnRDb250ZXh0UHJvdmlkZXJcIjtcbmltcG9ydCB7IExhbmRtYXJrLCBMYW5kbWFya05hdmlnYXRpb24gfSBmcm9tIFwiLi4vLi4vYWNjZXNzaWJpbGl0eS9MYW5kbWFya05hdmlnYXRpb25cIjtcblxuLy8gV2UgbmVlZCB0byBmZXRjaCBlYWNoIHBpbm5lZCBtZXNzYWdlIGluZGl2aWR1YWxseSAoaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0KVxuLy8gc28gZWFjaCBwaW5uZWQgbWVzc2FnZSBtYXkgdHJpZ2dlciBhIHJlcXVlc3QuIExpbWl0IHRoZSBudW1iZXIgcGVyIHJvb20gZm9yIHNhbml0eS5cbi8vIE5CLiB0aGlzIGlzIGp1c3QgZm9yIHNlcnZlciBub3RpY2VzIHJhdGhlciB0aGFuIHBpbm5lZCBtZXNzYWdlcyBpbiBnZW5lcmFsLlxuY29uc3QgTUFYX1BJTk5FRF9OT1RJQ0VTX1BFUl9ST09NID0gMjtcblxuLy8gVXNlZCB0byBmaW5kIHRoZSBjbG9zZXN0IGlucHV0YWJsZSB0aGluZy4gQmVjYXVzZSBvZiBob3cgb3VyIGNvbXBvc2VyIHdvcmtzLFxuLy8geW91ciBjYXJldCBtaWdodCBiZSB3aXRoaW4gYSBwYXJhZ3JhcGgvZm9udC9kaXYvd2hhdGV2ZXIgd2l0aGluIHRoZVxuLy8gY29udGVudGVkaXRhYmxlIHJhdGhlciB0aGFuIGRpcmVjdGx5IGluIHNvbWV0aGluZyBpbnB1dGFibGUuXG5mdW5jdGlvbiBnZXRJbnB1dGFibGVFbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIGVsLmNsb3Nlc3QoXCJpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgW2NvbnRlbnRlZGl0YWJsZT10cnVlXVwiKTtcbn1cblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQ7XG4gICAgLy8gQ2FsbGVkIHdpdGggdGhlIGNyZWRlbnRpYWxzIG9mIGEgcmVnaXN0ZXJlZCB1c2VyIChpZiB0aGV5IHdlcmUgYSBST1UgdGhhdFxuICAgIC8vIHRyYW5zaXRpb25lZCB0byBQV0xVKVxuICAgIG9uUmVnaXN0ZXJlZDogKGNyZWRlbnRpYWxzOiBJTWF0cml4Q2xpZW50Q3JlZHMpID0+IFByb21pc2U8TWF0cml4Q2xpZW50PjtcbiAgICBoaWRlVG9TUlVzZXJzOiBib29sZWFuO1xuICAgIHJlc2l6ZU5vdGlmaWVyOiBSZXNpemVOb3RpZmllcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgcGFnZV90eXBlPzogc3RyaW5nO1xuICAgIGF1dG9Kb2luPzogYm9vbGVhbjtcbiAgICB0aHJlZXBpZEludml0ZT86IElUaHJlZXBpZEludml0ZTtcbiAgICByb29tT29iRGF0YT86IElPT0JEYXRhO1xuICAgIGN1cnJlbnRSb29tSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgY29sbGFwc2VMaHM6IGJvb2xlYW47XG4gICAgY29uZmlnOiBDb25maWdPcHRpb25zO1xuICAgIGN1cnJlbnRVc2VySWQ6IHN0cmluZyB8IG51bGw7XG4gICAganVzdFJlZ2lzdGVyZWQ/OiBib29sZWFuO1xuICAgIHJvb21KdXN0Q3JlYXRlZE9wdHM/OiBJT3B0cztcbiAgICBmb3JjZVRpbWVsaW5lPzogYm9vbGVhbjsgLy8gc2VlIHByb3BzIG9uIE1hdHJpeENoYXRcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgc3luY0Vycm9yRGF0YT86IFN5bmNTdGF0ZURhdGE7XG4gICAgdXNhZ2VMaW1pdERpc21pc3NlZDogYm9vbGVhbjtcbiAgICB1c2FnZUxpbWl0RXZlbnRDb250ZW50PzogSVVzYWdlTGltaXQ7XG4gICAgdXNhZ2VMaW1pdEV2ZW50VHM/OiBudW1iZXI7XG4gICAgdXNlQ29tcGFjdExheW91dDogYm9vbGVhbjtcbiAgICBhY3RpdmVDYWxsczogQXJyYXk8TWF0cml4Q2FsbD47XG4gICAgYmFja2dyb3VuZEltYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgd2hhdCBvdXIgTWF0cml4Q2hhdCBzaG93cyB3aGVuIHdlIGFyZSBsb2dnZWQgaW4uIFRoZSBwcmVjaXNlIHZpZXcgaXNcbiAqIGRldGVybWluZWQgYnkgdGhlIHBhZ2VfdHlwZSBwcm9wZXJ0eS5cbiAqXG4gKiBDdXJyZW50bHksIGl0J3MgdmVyeSB0aWdodGx5IGNvdXBsZWQgd2l0aCBNYXRyaXhDaGF0LiBXZSBzaG91bGQgdHJ5IHRvIGRvXG4gKiBzb21ldGhpbmcgYWJvdXQgdGhhdC5cbiAqXG4gKiBDb21wb25lbnRzIG1vdW50ZWQgYmVsb3cgdXMgY2FuIGFjY2VzcyB0aGUgbWF0cml4IGNsaWVudCB2aWEgdGhlIHJlYWN0IGNvbnRleHQuXG4gKi9cbmNsYXNzIExvZ2dlZEluVmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBzdGF0aWMgZGlzcGxheU5hbWUgPSBcIkxvZ2dlZEluVmlld1wiO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Jvb21WaWV3OiBSZWFjdC5SZWZPYmplY3Q8Um9vbVZpZXdUeXBlPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Jlc2l6ZUNvbnRhaW5lcjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzaXplSGFuZGxlcjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PjtcbiAgICBwcm90ZWN0ZWQgbGF5b3V0V2F0Y2hlclJlZj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgY29tcGFjdExheW91dFdhdGNoZXJSZWY/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGJhY2tncm91bmRJbWFnZVdhdGNoZXJSZWY/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHRpbWV6b25lUHJvZmlsZVVwZGF0ZVJlZj86IHN0cmluZ1tdO1xuICAgIHByb3RlY3RlZCByZXNpemVyPzogUmVzaXplcjxJQ29sbGFwc2VDb25maWcsIENvbGxhcHNlSXRlbT47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHN5bmNFcnJvckRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIHVzZSBjb21wYWN0IHRpbWVsaW5lIHZpZXdcbiAgICAgICAgICAgIHVzZUNvbXBhY3RMYXlvdXQ6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJ1c2VDb21wYWN0TGF5b3V0XCIpLFxuICAgICAgICAgICAgdXNhZ2VMaW1pdERpc21pc3NlZDogZmFsc2UsXG4gICAgICAgICAgICBhY3RpdmVDYWxsczogTGVnYWN5Q2FsbEhhbmRsZXIuaW5zdGFuY2UuZ2V0QWxsQWN0aXZlQ2FsbHMoKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzdGFzaCB0aGUgTWF0cml4Q2xpZW50IGluIGNhc2Ugd2UgbG9nIG91dCBiZWZvcmUgd2UgYXJlIHVubW91bnRlZFxuICAgICAgICB0aGlzLl9tYXRyaXhDbGllbnQgPSB0aGlzLnByb3BzLm1hdHJpeENsaWVudDtcblxuICAgICAgICBNZWRpYURldmljZUhhbmRsZXIubG9hZERldmljZXMoKTtcblxuICAgICAgICBmaXh1cENvbG9yRm9udHMoKTtcblxuICAgICAgICB0aGlzLl9yb29tVmlldyA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLl9yZXNpemVDb250YWluZXIgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLm9uTmF0aXZlS2V5RG93biwgZmFsc2UpO1xuICAgICAgICBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5hZGRMaXN0ZW5lcihMZWdhY3lDYWxsSGFuZGxlckV2ZW50LkNhbGxTdGF0ZSwgdGhpcy5vbkNhbGxTdGF0ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTZXJ2ZXJOb3RpY2VFdmVudHMoKTtcblxuICAgICAgICB0aGlzLl9tYXRyaXhDbGllbnQub24oQ2xpZW50RXZlbnQuQWNjb3VudERhdGEsIHRoaXMub25BY2NvdW50RGF0YSk7XG4gICAgICAgIC8vIGNoZWNrIHB1c2ggcnVsZXMgb24gc3RhcnQgdXAgYXMgd2VsbFxuICAgICAgICBtb25pdG9yU3luY2VkUHVzaFJ1bGVzKHRoaXMuX21hdHJpeENsaWVudC5nZXRBY2NvdW50RGF0YShcIm0ucHVzaF9ydWxlc1wiKSwgdGhpcy5fbWF0cml4Q2xpZW50KTtcbiAgICAgICAgdGhpcy5fbWF0cml4Q2xpZW50Lm9uKENsaWVudEV2ZW50LlN5bmMsIHRoaXMub25TeW5jKTtcbiAgICAgICAgLy8gQ2FsbCBgb25TeW5jYCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIGFzIHdlbGxcbiAgICAgICAgdGhpcy5vblN5bmModGhpcy5fbWF0cml4Q2xpZW50LmdldFN5bmNTdGF0ZSgpLCBudWxsLCB0aGlzLl9tYXRyaXhDbGllbnQuZ2V0U3luY1N0YXRlRGF0YSgpID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuX21hdHJpeENsaWVudC5vbihSb29tU3RhdGVFdmVudC5FdmVudHMsIHRoaXMub25Sb29tU3RhdGVFdmVudHMpO1xuXG4gICAgICAgIHRoaXMubGF5b3V0V2F0Y2hlclJlZiA9IFNldHRpbmdzU3RvcmUud2F0Y2hTZXR0aW5nKFwibGF5b3V0XCIsIG51bGwsIHRoaXMub25Db21wYWN0TGF5b3V0Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuY29tcGFjdExheW91dFdhdGNoZXJSZWYgPSBTZXR0aW5nc1N0b3JlLndhdGNoU2V0dGluZyhcbiAgICAgICAgICAgIFwidXNlQ29tcGFjdExheW91dFwiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMub25Db21wYWN0TGF5b3V0Q2hhbmdlZCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kSW1hZ2VXYXRjaGVyUmVmID0gU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXG4gICAgICAgICAgICBcIlJvb21MaXN0LmJhY2tncm91bmRJbWFnZVwiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEJhY2tncm91bmRJbWFnZSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnRpbWV6b25lUHJvZmlsZVVwZGF0ZVJlZiA9IFtcbiAgICAgICAgICAgIFNldHRpbmdzU3RvcmUud2F0Y2hTZXR0aW5nKFwidXNlclRpbWV6b25lUHVibGlzaFwiLCBudWxsLCB0aGlzLm9uVGltZXpvbmVVcGRhdGUpLFxuICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXCJ1c2VyVGltZXpvbmVcIiwgbnVsbCwgdGhpcy5vblRpbWV6b25lVXBkYXRlKSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnJlc