matrix-react-sdk
Version:
SDK for matrix.org using React
190 lines (187 loc) • 28.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _NamespacedValue = require("matrix-js-sdk/src/NamespacedValue");
var _compoundWeb = require("@vector-im/compound-web");
var _RoomAvatar = _interopRequireDefault(require("./RoomAvatar"));
var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge"));
var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore");
var _presence = require("../../../utils/presence");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _languageHandler = require("../../../languageHandler");
var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap"));
var _getJoinedNonFunctionalMembers = require("../../../utils/room/getJoinedNonFunctionalMembers");
const _excluded = ["room", "size", "displayBadge", "hideIfDot", "oobData", "viewAvatarOnClick", "tooltipProps"];
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 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.
*/
const BUSY_PRESENCE_NAME = new _NamespacedValue.UnstableValue("busy", "org.matrix.msc3026.busy");
var Icon = /*#__PURE__*/function (Icon) {
Icon["None"] = "NONE";
Icon["Globe"] = "GLOBE";
Icon["PresenceOnline"] = "ONLINE";
Icon["PresenceAway"] = "AWAY";
Icon["PresenceOffline"] = "OFFLINE";
Icon["PresenceBusy"] = "BUSY";
return Icon;
}(Icon || {});
function tooltipText(variant) {
switch (variant) {
case Icon.Globe:
return (0, _languageHandler._t)("room|header|room_is_public");
case Icon.PresenceOnline:
return (0, _languageHandler._t)("presence|online");
case Icon.PresenceAway:
return (0, _languageHandler._t)("presence|away");
case Icon.PresenceOffline:
return (0, _languageHandler._t)("presence|offline");
case Icon.PresenceBusy:
return (0, _languageHandler._t)("presence|busy");
}
}
class DecoratedRoomAvatar extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "_dmUser", null);
(0, _defineProperty2.default)(this, "isUnmounted", false);
(0, _defineProperty2.default)(this, "isWatchingTimeline", false);
(0, _defineProperty2.default)(this, "onRoomTimeline", (ev, room) => {
if (this.isUnmounted) return;
if (this.props.room.roomId !== room?.roomId) return;
if (ev.getType() === _matrix.EventType.RoomJoinRules || ev.getType() === _matrix.EventType.RoomMember) {
const newIcon = this.calculateIcon();
if (newIcon !== this.state.icon) {
this.setState({
icon: newIcon
});
}
}
});
(0, _defineProperty2.default)(this, "onPresenceUpdate", () => {
if (this.isUnmounted) return;
const newIcon = this.getPresenceIcon();
if (newIcon !== this.state.icon) this.setState({
icon: newIcon
});
});
this.state = {
notificationState: _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(this.props.room),
icon: this.calculateIcon()
};
}
componentWillUnmount() {
this.isUnmounted = true;
if (this.isWatchingTimeline) this.props.room.off(_matrix.RoomEvent.Timeline, this.onRoomTimeline);
this.dmUser = null; // clear listeners, if any
}
get isPublicRoom() {
return this.props.room.getJoinRule() === _matrix.JoinRule.Public;
}
get dmUser() {
return this._dmUser;
}
set dmUser(val) {
const oldUser = this._dmUser;
this._dmUser = val;
if (oldUser && oldUser !== this._dmUser) {
oldUser.off(_matrix.UserEvent.CurrentlyActive, this.onPresenceUpdate);
oldUser.off(_matrix.UserEvent.Presence, this.onPresenceUpdate);
}
if (this._dmUser && oldUser !== this._dmUser) {
this._dmUser.on(_matrix.UserEvent.CurrentlyActive, this.onPresenceUpdate);
this._dmUser.on(_matrix.UserEvent.Presence, this.onPresenceUpdate);
}
}
getPresenceIcon() {
if (!this.dmUser) return Icon.None;
let icon = Icon.None;
const isOnline = this.dmUser.currentlyActive || this.dmUser.presence === "online";
if (BUSY_PRESENCE_NAME.matches(this.dmUser.presence)) {
icon = Icon.PresenceBusy;
} else if (isOnline) {
icon = Icon.PresenceOnline;
} else if (this.dmUser.presence === "offline") {
icon = Icon.PresenceOffline;
} else if (this.dmUser.presence === "unavailable") {
icon = Icon.PresenceAway;
}
return icon;
}
calculateIcon() {
let icon = Icon.None;
// We look at the DMRoomMap and not the tag here so that we don't exclude DMs in Favourites
const otherUserId = _DMRoomMap.default.shared().getUserIdForRoomId(this.props.room.roomId);
if (otherUserId && (0, _getJoinedNonFunctionalMembers.getJoinedNonFunctionalMembers)(this.props.room).length === 2) {
// Track presence, if available
if ((0, _presence.isPresenceEnabled)(this.props.room.client)) {
this.dmUser = _MatrixClientPeg.MatrixClientPeg.safeGet().getUser(otherUserId);
icon = this.getPresenceIcon();
}
} else {
// Track publicity
icon = this.isPublicRoom ? Icon.Globe : Icon.None;
if (!this.isWatchingTimeline) {
this.props.room.on(_matrix.RoomEvent.Timeline, this.onRoomTimeline);
this.isWatchingTimeline = true;
}
}
return icon;
}
render() {
// Spread the remaining props to make it work with compound component
const _this$props = this.props,
{
room,
size,
displayBadge,
hideIfDot,
oobData,
viewAvatarOnClick,
tooltipProps
} = _this$props,
props = (0, _objectWithoutProperties2.default)(_this$props, _excluded);
let badge;
if (this.props.displayBadge && this.state.notificationState) {
badge = /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, {
notification: this.state.notificationState,
hideIfDot: this.props.hideIfDot,
roomId: this.props.room.roomId
});
}
let icon;
if (this.state.icon !== Icon.None) {
icon = /*#__PURE__*/_react.default.createElement("div", {
tabIndex: this.props.tooltipProps?.tabIndex ?? 0,
className: `mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_${this.state.icon.toLowerCase()}`
});
}
const classes = (0, _classnames.default)("mx_DecoratedRoomAvatar", {
mx_DecoratedRoomAvatar_cutout: icon
});
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
className: classes
}, props), /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: this.props.room,
size: this.props.size,
oobData: this.props.oobData,
viewAvatarOnClick: this.props.viewAvatarOnClick
}), icon && /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, {
label: tooltipText(this.state.icon),
placement: "bottom"
}, icon), badge);
}
}
exports.default = DecoratedRoomAvatar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX21hdHJpeCIsIl9OYW1lc3BhY2VkVmFsdWUiLCJfY29tcG91bmRXZWIiLCJfUm9vbUF2YXRhciIsIl9Ob3RpZmljYXRpb25CYWRnZSIsIl9Sb29tTm90aWZpY2F0aW9uU3RhdGVTdG9yZSIsIl9wcmVzZW5jZSIsIl9NYXRyaXhDbGllbnRQZWciLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0RNUm9vbU1hcCIsIl9nZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyIsIl9leGNsdWRlZCIsIkJVU1lfUFJFU0VOQ0VfTkFNRSIsIlVuc3RhYmxlVmFsdWUiLCJJY29uIiwidG9vbHRpcFRleHQiLCJ2YXJpYW50IiwiR2xvYmUiLCJfdCIsIlByZXNlbmNlT25saW5lIiwiUHJlc2VuY2VBd2F5IiwiUHJlc2VuY2VPZmZsaW5lIiwiUHJlc2VuY2VCdXN5IiwiRGVjb3JhdGVkUm9vbUF2YXRhciIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImV2Iiwicm9vbSIsImlzVW5tb3VudGVkIiwicm9vbUlkIiwiZ2V0VHlwZSIsIkV2ZW50VHlwZSIsIlJvb21Kb2luUnVsZXMiLCJSb29tTWVtYmVyIiwibmV3SWNvbiIsImNhbGN1bGF0ZUljb24iLCJzdGF0ZSIsImljb24iLCJzZXRTdGF0ZSIsImdldFByZXNlbmNlSWNvbiIsIm5vdGlmaWNhdGlvblN0YXRlIiwiUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUiLCJpbnN0YW5jZSIsImdldFJvb21TdGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiaXNXYXRjaGluZ1RpbWVsaW5lIiwib2ZmIiwiUm9vbUV2ZW50IiwiVGltZWxpbmUiLCJvblJvb21UaW1lbGluZSIsImRtVXNlciIsImlzUHVibGljUm9vbSIsImdldEpvaW5SdWxlIiwiSm9pblJ1bGUiLCJQdWJsaWMiLCJfZG1Vc2VyIiwidmFsIiwib2xkVXNlciIsIlVzZXJFdmVudCIsIkN1cnJlbnRseUFjdGl2ZSIsIm9uUHJlc2VuY2VVcGRhdGUiLCJQcmVzZW5jZSIsIm9uIiwiTm9uZSIsImlzT25saW5lIiwiY3VycmVudGx5QWN0aXZlIiwicHJlc2VuY2UiLCJtYXRjaGVzIiwib3RoZXJVc2VySWQiLCJETVJvb21NYXAiLCJzaGFyZWQiLCJnZXRVc2VySWRGb3JSb29tSWQiLCJnZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyIsImxlbmd0aCIsImlzUHJlc2VuY2VFbmFibGVkIiwiY2xpZW50IiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsImdldFVzZXIiLCJyZW5kZXIiLCJfdGhpcyRwcm9wcyIsInNpemUiLCJkaXNwbGF5QmFkZ2UiLCJoaWRlSWZEb3QiLCJvb2JEYXRhIiwidmlld0F2YXRhck9uQ2xpY2siLCJ0b29sdGlwUHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiYmFkZ2UiLCJjcmVhdGVFbGVtZW50Iiwibm90aWZpY2F0aW9uIiwidGFiSW5kZXgiLCJjbGFzc05hbWUiLCJ0b0xvd2VyQ2FzZSIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRGVjb3JhdGVkUm9vbUF2YXRhcl9jdXRvdXQiLCJfZXh0ZW5kczIiLCJUb29sdGlwIiwibGFiZWwiLCJwbGFjZW1lbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvYXZhdGFycy9EZWNvcmF0ZWRSb29tQXZhdGFyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBKb2luUnVsZSwgTWF0cml4RXZlbnQsIFJvb20sIFJvb21FdmVudCwgVXNlciwgVXNlckV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgVW5zdGFibGVWYWx1ZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9OYW1lc3BhY2VkVmFsdWVcIjtcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC13ZWJcIjtcblxuaW1wb3J0IFJvb21BdmF0YXIgZnJvbSBcIi4vUm9vbUF2YXRhclwiO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkJhZGdlIGZyb20gXCIuLi9yb29tcy9Ob3RpZmljYXRpb25CYWRnZVwiO1xuaW1wb3J0IHsgUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmVcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvblN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvblN0YXRlXCI7XG5pbXBvcnQgeyBpc1ByZXNlbmNlRW5hYmxlZCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wcmVzZW5jZVwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgRE1Sb29tTWFwIGZyb20gXCIuLi8uLi8uLi91dGlscy9ETVJvb21NYXBcIjtcbmltcG9ydCB7IElPT0JEYXRhIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9UaHJlZXBpZEludml0ZVN0b3JlXCI7XG5pbXBvcnQgeyBnZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yb29tL2dldEpvaW5lZE5vbkZ1bmN0aW9uYWxNZW1iZXJzXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgc2l6ZTogc3RyaW5nO1xuICAgIGRpc3BsYXlCYWRnZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgc2hvdyBub3RoaW5nIGlmIHRoZSBub3RpZmljYXRpb24gd291bGQgb25seSBjYXVzZSBhIGRvdCB0byBiZSBzaG93biByYXRoZXIgdGhhblxuICAgICAqIGEgYmFkZ2UuIFRoYXQgaXM6IG9ubHkgZGlzcGxheSBiYWRnZXMgYW5kIG5vdCBkb3RzLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgKi9cbiAgICBoaWRlSWZEb3Q/OiBib29sZWFuO1xuICAgIG9vYkRhdGE/OiBJT09CRGF0YTtcbiAgICB2aWV3QXZhdGFyT25DbGljaz86IGJvb2xlYW47XG4gICAgdG9vbHRpcFByb3BzPzoge1xuICAgICAgICB0YWJJbmRleD86IG51bWJlcjtcbiAgICB9O1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBub3RpZmljYXRpb25TdGF0ZT86IE5vdGlmaWNhdGlvblN0YXRlO1xuICAgIGljb246IEljb247XG59XG5cbmNvbnN0IEJVU1lfUFJFU0VOQ0VfTkFNRSA9IG5ldyBVbnN0YWJsZVZhbHVlKFwiYnVzeVwiLCBcIm9yZy5tYXRyaXgubXNjMzAyNi5idXN5XCIpO1xuXG5lbnVtIEljb24ge1xuICAgIC8vIE5vdGU6IHRoZSBuYW1lcyBoZXJlIGFyZSB1c2VkIGluIENTUyBjbGFzcyBuYW1lc1xuICAgIE5vbmUgPSBcIk5PTkVcIiwgLy8gLi4uIGV4Y2VwdCB0aGlzIG9uZVxuICAgIEdsb2JlID0gXCJHTE9CRVwiLFxuICAgIFByZXNlbmNlT25saW5lID0gXCJPTkxJTkVcIixcbiAgICBQcmVzZW5jZUF3YXkgPSBcIkFXQVlcIixcbiAgICBQcmVzZW5jZU9mZmxpbmUgPSBcIk9GRkxJTkVcIixcbiAgICBQcmVzZW5jZUJ1c3kgPSBcIkJVU1lcIixcbn1cblxuZnVuY3Rpb24gdG9vbHRpcFRleHQodmFyaWFudDogSWNvbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICAgIGNhc2UgSWNvbi5HbG9iZTpcbiAgICAgICAgICAgIHJldHVybiBfdChcInJvb218aGVhZGVyfHJvb21faXNfcHVibGljXCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPbmxpbmU6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJwcmVzZW5jZXxvbmxpbmVcIik7XG4gICAgICAgIGNhc2UgSWNvbi5QcmVzZW5jZUF3YXk6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJwcmVzZW5jZXxhd2F5XCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPZmZsaW5lOlxuICAgICAgICAgICAgcmV0dXJuIF90KFwicHJlc2VuY2V8b2ZmbGluZVwiKTtcbiAgICAgICAgY2FzZSBJY29uLlByZXNlbmNlQnVzeTpcbiAgICAgICAgICAgIHJldHVybiBfdChcInByZXNlbmNlfGJ1c3lcIik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWNvcmF0ZWRSb29tQXZhdGFyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgX2RtVXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzV2F0Y2hpbmdUaW1lbGluZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZTogUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUuaW5zdGFuY2UuZ2V0Um9vbVN0YXRlKHRoaXMucHJvcHMucm9vbSksXG4gICAgICAgICAgICBpY29uOiB0aGlzLmNhbGN1bGF0ZUljb24oKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pc1dhdGNoaW5nVGltZWxpbmUpIHRoaXMucHJvcHMucm9vbS5vZmYoUm9vbUV2ZW50LlRpbWVsaW5lLCB0aGlzLm9uUm9vbVRpbWVsaW5lKTtcbiAgICAgICAgdGhpcy5kbVVzZXIgPSBudWxsOyAvLyBjbGVhciBsaXN0ZW5lcnMsIGlmIGFueVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzUHVibGljUm9vbSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMucm9vbS5nZXRKb2luUnVsZSgpID09PSBKb2luUnVsZS5QdWJsaWM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZG1Vc2VyKCk6IFVzZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RtVXNlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBkbVVzZXIodmFsOiBVc2VyIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBvbGRVc2VyID0gdGhpcy5fZG1Vc2VyO1xuICAgICAgICB0aGlzLl9kbVVzZXIgPSB2YWw7XG4gICAgICAgIGlmIChvbGRVc2VyICYmIG9sZFVzZXIgIT09IHRoaXMuX2RtVXNlcikge1xuICAgICAgICAgICAgb2xkVXNlci5vZmYoVXNlckV2ZW50LkN1cnJlbnRseUFjdGl2ZSwgdGhpcy5vblByZXNlbmNlVXBkYXRlKTtcbiAgICAgICAgICAgIG9sZFVzZXIub2ZmKFVzZXJFdmVudC5QcmVzZW5jZSwgdGhpcy5vblByZXNlbmNlVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG1Vc2VyICYmIG9sZFVzZXIgIT09IHRoaXMuX2RtVXNlcikge1xuICAgICAgICAgICAgdGhpcy5fZG1Vc2VyLm9uKFVzZXJFdmVudC5DdXJyZW50bHlBY3RpdmUsIHRoaXMub25QcmVzZW5jZVVwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9kbVVzZXIub24oVXNlckV2ZW50LlByZXNlbmNlLCB0aGlzLm9uUHJlc2VuY2VVcGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJvb21UaW1lbGluZSA9IChldjogTWF0cml4RXZlbnQsIHJvb20/OiBSb29tKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnJvb20ucm9vbUlkICE9PSByb29tPy5yb29tSWQpIHJldHVybjtcblxuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuUm9vbUpvaW5SdWxlcyB8fCBldi5nZXRUeXBlKCkgPT09IEV2ZW50VHlwZS5Sb29tTWVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJY29uID0gdGhpcy5jYWxjdWxhdGVJY29uKCk7XG4gICAgICAgICAgICBpZiAobmV3SWNvbiAhPT0gdGhpcy5zdGF0ZS5pY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGljb246IG5ld0ljb24gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblByZXNlbmNlVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1VubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld0ljb24gPSB0aGlzLmdldFByZXNlbmNlSWNvbigpO1xuICAgICAgICBpZiAobmV3SWNvbiAhPT0gdGhpcy5zdGF0ZS5pY29uKSB0aGlzLnNldFN0YXRlKHsgaWNvbjogbmV3SWNvbiB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRQcmVzZW5jZUljb24oKTogSWNvbiB7XG4gICAgICAgIGlmICghdGhpcy5kbVVzZXIpIHJldHVybiBJY29uLk5vbmU7XG5cbiAgICAgICAgbGV0IGljb24gPSBJY29uLk5vbmU7XG5cbiAgICAgICAgY29uc3QgaXNPbmxpbmUgPSB0aGlzLmRtVXNlci5jdXJyZW50bHlBY3RpdmUgfHwgdGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwib25saW5lXCI7XG4gICAgICAgIGlmIChCVVNZX1BSRVNFTkNFX05BTUUubWF0Y2hlcyh0aGlzLmRtVXNlci5wcmVzZW5jZSkpIHtcbiAgICAgICAgICAgIGljb24gPSBJY29uLlByZXNlbmNlQnVzeTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09ubGluZSkge1xuICAgICAgICAgICAgaWNvbiA9IEljb24uUHJlc2VuY2VPbmxpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwib2ZmbGluZVwiKSB7XG4gICAgICAgICAgICBpY29uID0gSWNvbi5QcmVzZW5jZU9mZmxpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwidW5hdmFpbGFibGVcIikge1xuICAgICAgICAgICAgaWNvbiA9IEljb24uUHJlc2VuY2VBd2F5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGljb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJY29uKCk6IEljb24ge1xuICAgICAgICBsZXQgaWNvbiA9IEljb24uTm9uZTtcblxuICAgICAgICAvLyBXZSBsb29rIGF0IHRoZSBETVJvb21NYXAgYW5kIG5vdCB0aGUgdGFnIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBleGNsdWRlIERNcyBpbiBGYXZvdXJpdGVzXG4gICAgICAgIGNvbnN0IG90aGVyVXNlcklkID0gRE1Sb29tTWFwLnNoYXJlZCgpLmdldFVzZXJJZEZvclJvb21JZCh0aGlzLnByb3BzLnJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKG90aGVyVXNlcklkICYmIGdldEpvaW5lZE5vbkZ1bmN0aW9uYWxNZW1iZXJzKHRoaXMucHJvcHMucm9vbSkubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBwcmVzZW5jZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAoaXNQcmVzZW5jZUVuYWJsZWQodGhpcy5wcm9wcy5yb29tLmNsaWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRtVXNlciA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0VXNlcihvdGhlclVzZXJJZCk7XG4gICAgICAgICAgICAgICAgaWNvbiA9IHRoaXMuZ2V0UHJlc2VuY2VJY29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcmFjayBwdWJsaWNpdHlcbiAgICAgICAgICAgIGljb24gPSB0aGlzLmlzUHVibGljUm9vbSA/IEljb24uR2xvYmUgOiBJY29uLk5vbmU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZ1RpbWVsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yb29tLm9uKFJvb21FdmVudC5UaW1lbGluZSwgdGhpcy5vblJvb21UaW1lbGluZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1dhdGNoaW5nVGltZWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpY29uO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgLy8gU3ByZWFkIHRoZSByZW1haW5pbmcgcHJvcHMgdG8gbWFrZSBpdCB3b3JrIHdpdGggY29tcG91bmQgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IHsgcm9vbSwgc2l6ZSwgZGlzcGxheUJhZGdlLCBoaWRlSWZEb3QsIG9vYkRhdGEsIHZpZXdBdmF0YXJPbkNsaWNrLCB0b29sdGlwUHJvcHMsIC4uLnByb3BzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGxldCBiYWRnZTogUmVhY3QuUmVhY3ROb2RlO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNwbGF5QmFkZ2UgJiYgdGhpcy5zdGF0ZS5ub3RpZmljYXRpb25TdGF0ZSkge1xuICAgICAgICAgICAgYmFkZ2UgPSAoXG4gICAgICAgICAgICAgICAgPE5vdGlmaWNhdGlvbkJhZGdlXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbj17dGhpcy5zdGF0ZS5ub3RpZmljYXRpb25TdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZUlmRG90PXt0aGlzLnByb3BzLmhpZGVJZkRvdH1cbiAgICAgICAgICAgICAgICAgICAgcm9vbUlkPXt0aGlzLnByb3BzLnJvb20ucm9vbUlkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGljb246IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pY29uICE9PSBJY29uLk5vbmUpIHtcbiAgICAgICAgICAgIGljb24gPSAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleD17dGhpcy5wcm9wcy50b29sdGlwUHJvcHM/LnRhYkluZGV4ID8/IDB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YG14X0RlY29yYXRlZFJvb21BdmF0YXJfaWNvbiBteF9EZWNvcmF0ZWRSb29tQXZhdGFyX2ljb25fJHt0aGlzLnN0YXRlLmljb24udG9Mb3dlckNhc2UoKX1gfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9EZWNvcmF0ZWRSb29tQXZhdGFyXCIsIHtcbiAgICAgICAgICAgIG14X0RlY29yYXRlZFJvb21BdmF0YXJfY3V0b3V0OiBpY29uLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXN9IHsuLi5wcm9wc30+XG4gICAgICAgICAgICAgICAgPFJvb21BdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5wcm9wcy5yb29tfVxuICAgICAgICAgICAgICAgICAgICBzaXplPXt0aGlzLnByb3BzLnNpemV9XG4gICAgICAgICAgICAgICAgICAgIG9vYkRhdGE9e3RoaXMucHJvcHMub29iRGF0YX1cbiAgICAgICAgICAgICAgICAgICAgdmlld0F2YXRhck9uQ2xpY2s9e3RoaXMucHJvcHMudmlld0F2YXRhck9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7aWNvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGxhYmVsPXt0b29sdGlwVGV4dCh0aGlzLnN0YXRlLmljb24pIX0gcGxhY2VtZW50PVwiYm90dG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aWNvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2JhZGdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLFdBQUEsR0FBQU4sc0JBQUEsQ0FBQUMs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