matrix-react-sdk
Version:
SDK for matrix.org using React
160 lines (152 loc) • 26.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RoomPredecessorTile = void 0;
exports.guessServerNameFromRoomId = guessServerNameFromRoomId;
var _react = _interopRequireWildcard(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _Permalinks = require("../../../utils/permalinks/Permalinks");
var _languageHandler = require("../../../languageHandler");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _EventTileBubble = _interopRequireDefault(require("./EventTileBubble"));
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _useRoomState = require("../../../hooks/useRoomState");
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _MatrixToPermalinkConstructor = _interopRequireDefault(require("../../../utils/permalinks/MatrixToPermalinkConstructor"));
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 2019-2023 The Matrix.org Foundation C.I.C.
Copyright 2018 New Vector Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* A message tile showing that this room was created as an upgrade of a previous
* room.
*/
const RoomPredecessorTile = ({
mxEvent,
timestamp
}) => {
const msc3946ProcessDynamicPredecessor = _SettingsStore.default.getValue("feature_dynamic_room_predecessors");
// Note: we ask the room for its predecessor here, instead of directly using
// the information inside mxEvent. This allows us the flexibility later to
// use a different predecessor (e.g. through MSC3946) and still display it
// in the timeline location of the create event.
const roomContext = (0, _react.useContext)(_RoomContext.default);
const predecessor = (0, _useRoomState.useRoomState)(roomContext.room, (0, _react.useCallback)(state => state.findPredecessor(msc3946ProcessDynamicPredecessor), [msc3946ProcessDynamicPredecessor]));
const onLinkClicked = (0, _react.useCallback)(e => {
e.preventDefault();
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
event_id: predecessor?.eventId,
highlighted: true,
room_id: predecessor?.roomId,
metricsTrigger: "Predecessor",
metricsViaKeyboard: e.type !== "click"
});
}, [predecessor?.eventId, predecessor?.roomId]);
if (!roomContext.room || roomContext.room.roomId !== mxEvent.getRoomId()) {
_logger.logger.warn("RoomPredecessorTile unexpectedly used outside of the context of the" + "room containing this m.room.create event.");
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
}
if (!predecessor) {
_logger.logger.warn("RoomPredecessorTile unexpectedly used in a room with no predecessor.");
return /*#__PURE__*/_react.default.createElement("div", null);
}
const prevRoom = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(predecessor.roomId);
// We need either the previous room, or some servers to find it with.
// Otherwise, we must bail out here
if (!prevRoom && !predecessor.viaServers) {
_logger.logger.warn(`Failed to find predecessor room with id ${predecessor.roomId}`);
const guessedLink = guessLinkForRoomId(predecessor.roomId);
return /*#__PURE__*/_react.default.createElement(_EventTileBubble.default, {
className: "mx_CreateEvent",
title: (0, _languageHandler._t)("timeline|m.room.create|continuation"),
timestamp: timestamp
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_EventTile_body"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_EventTile_tileError"
}, !!guessedLink ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("timeline|m.room.create|unknown_predecessor_guess_server", {
roomId: predecessor.roomId
}), /*#__PURE__*/_react.default.createElement("a", {
href: guessedLink
}, guessedLink)) : (0, _languageHandler._t)("timeline|m.room.create|unknown_predecessor", {
roomId: predecessor.roomId
}))));
}
// Otherwise, we expect to be able to find this room either because it is
// already loaded, or because we have via_servers that we can use.
// So we go ahead with rendering the tile.
const predecessorPermalink = prevRoom ? createLinkWithRoom(prevRoom, predecessor.roomId, predecessor.eventId) : createLinkWithoutRoom(predecessor.roomId, predecessor?.viaServers ?? [], predecessor.eventId);
const link = /*#__PURE__*/_react.default.createElement("a", {
href: predecessorPermalink,
onClick: onLinkClicked
}, (0, _languageHandler._t)("timeline|m.room.create|see_older_messages"));
return /*#__PURE__*/_react.default.createElement(_EventTileBubble.default, {
className: "mx_CreateEvent",
title: (0, _languageHandler._t)("timeline|m.room.create|continuation"),
subtitle: link,
timestamp: timestamp
});
function createLinkWithRoom(room, roomId, eventId) {
const permalinkCreator = new _Permalinks.RoomPermalinkCreator(room, roomId);
permalinkCreator.load();
if (eventId) {
return permalinkCreator.forEvent(eventId);
} else {
return permalinkCreator.forRoom();
}
}
function createLinkWithoutRoom(roomId, viaServers, eventId) {
const matrixToPermalinkConstructor = new _MatrixToPermalinkConstructor.default();
if (eventId) {
return matrixToPermalinkConstructor.forEvent(roomId, eventId, viaServers);
} else {
return matrixToPermalinkConstructor.forRoom(roomId, viaServers);
}
}
/**
* Guess the permalink for a room based on its room ID.
*
* The spec says that Room IDs are opaque [1] so this can only ever be a
* guess. There is no guarantee that this room exists on this server.
*
* [1] https://spec.matrix.org/v1.5/appendices/#room-ids-and-event-ids
*/
function guessLinkForRoomId(roomId) {
const serverName = guessServerNameFromRoomId(roomId);
if (serverName) {
return new _MatrixToPermalinkConstructor.default().forRoom(roomId, [serverName]);
} else {
return null;
}
}
};
/**
* @internal Public for test only
*
* Guess the server name for a room based on its room ID.
*
* The spec says that Room IDs are opaque [1] so this can only ever be a
* guess. There is no guarantee that this room exists on this server.
*
* [1] https://spec.matrix.org/v1.5/appendices/#room-ids-and-event-ids
*/
exports.RoomPredecessorTile = RoomPredecessorTile;
function guessServerNameFromRoomId(roomId) {
const m = roomId.match(/^[^:]*:(.*)/);
if (m) {
return m[1];
} else {
return null;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2Rpc3BhdGNoZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2FjdGlvbnMiLCJfUGVybWFsaW5rcyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTWF0cml4Q2xpZW50UGVnIiwiX0V2ZW50VGlsZUJ1YmJsZSIsIl9Sb29tQ29udGV4dCIsIl91c2VSb29tU3RhdGUiLCJfU2V0dGluZ3NTdG9yZSIsIl9NYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUm9vbVByZWRlY2Vzc29yVGlsZSIsIm14RXZlbnQiLCJ0aW1lc3RhbXAiLCJtc2MzOTQ2UHJvY2Vzc0R5bmFtaWNQcmVkZWNlc3NvciIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsInJvb21Db250ZXh0IiwidXNlQ29udGV4dCIsIlJvb21Db250ZXh0IiwicHJlZGVjZXNzb3IiLCJ1c2VSb29tU3RhdGUiLCJyb29tIiwidXNlQ2FsbGJhY2siLCJzdGF0ZSIsImZpbmRQcmVkZWNlc3NvciIsIm9uTGlua0NsaWNrZWQiLCJwcmV2ZW50RGVmYXVsdCIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1Jvb20iLCJldmVudF9pZCIsImV2ZW50SWQiLCJoaWdobGlnaHRlZCIsInJvb21faWQiLCJyb29tSWQiLCJtZXRyaWNzVHJpZ2dlciIsIm1ldHJpY3NWaWFLZXlib2FyZCIsInR5cGUiLCJnZXRSb29tSWQiLCJsb2dnZXIiLCJ3YXJuIiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwicHJldlJvb20iLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0IiwiZ2V0Um9vbSIsInZpYVNlcnZlcnMiLCJndWVzc2VkTGluayIsImd1ZXNzTGlua0ZvclJvb21JZCIsImNsYXNzTmFtZSIsInRpdGxlIiwiX3QiLCJocmVmIiwicHJlZGVjZXNzb3JQZXJtYWxpbmsiLCJjcmVhdGVMaW5rV2l0aFJvb20iLCJjcmVhdGVMaW5rV2l0aG91dFJvb20iLCJsaW5rIiwib25DbGljayIsInN1YnRpdGxlIiwicGVybWFsaW5rQ3JlYXRvciIsIlJvb21QZXJtYWxpbmtDcmVhdG9yIiwibG9hZCIsImZvckV2ZW50IiwiZm9yUm9vbSIsIm1hdHJpeFRvUGVybWFsaW5rQ29uc3RydWN0b3IiLCJNYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yIiwic2VydmVyTmFtZSIsImd1ZXNzU2VydmVyTmFtZUZyb21Sb29tSWQiLCJleHBvcnRzIiwibSIsIm1hdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvbWVzc2FnZXMvUm9vbVByZWRlY2Vzc29yVGlsZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTggTmV3IFZlY3RvciBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgUm9vbSwgUm9vbVN0YXRlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgZGlzIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IFJvb21QZXJtYWxpbmtDcmVhdG9yIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rc1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgRXZlbnRUaWxlQnViYmxlIGZyb20gXCIuL0V2ZW50VGlsZUJ1YmJsZVwiO1xuaW1wb3J0IHsgVmlld1Jvb21QYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvVmlld1Jvb21QYXlsb2FkXCI7XG5pbXBvcnQgUm9vbUNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL1Jvb21Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VSb29tU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vaG9va3MvdXNlUm9vbVN0YXRlXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IE1hdHJpeFRvUGVybWFsaW5rQ29uc3RydWN0b3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Blcm1hbGlua3MvTWF0cml4VG9QZXJtYWxpbmtDb25zdHJ1Y3RvclwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICAvKiogVGhlIG0ucm9vbS5jcmVhdGUgTWF0cml4RXZlbnQgdGhhdCB0aGlzIHRpbGUgcmVwcmVzZW50cyAqL1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIHRpbWVzdGFtcD86IEpTWC5FbGVtZW50O1xufVxuXG4vKipcbiAqIEEgbWVzc2FnZSB0aWxlIHNob3dpbmcgdGhhdCB0aGlzIHJvb20gd2FzIGNyZWF0ZWQgYXMgYW4gdXBncmFkZSBvZiBhIHByZXZpb3VzXG4gKiByb29tLlxuICovXG5leHBvcnQgY29uc3QgUm9vbVByZWRlY2Vzc29yVGlsZTogUmVhY3QuRkM8SVByb3BzPiA9ICh7IG14RXZlbnQsIHRpbWVzdGFtcCB9KSA9PiB7XG4gICAgY29uc3QgbXNjMzk0NlByb2Nlc3NEeW5hbWljUHJlZGVjZXNzb3IgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9keW5hbWljX3Jvb21fcHJlZGVjZXNzb3JzXCIpO1xuXG4gICAgLy8gTm90ZTogd2UgYXNrIHRoZSByb29tIGZvciBpdHMgcHJlZGVjZXNzb3IgaGVyZSwgaW5zdGVhZCBvZiBkaXJlY3RseSB1c2luZ1xuICAgIC8vIHRoZSBpbmZvcm1hdGlvbiBpbnNpZGUgbXhFdmVudC4gVGhpcyBhbGxvd3MgdXMgdGhlIGZsZXhpYmlsaXR5IGxhdGVyIHRvXG4gICAgLy8gdXNlIGEgZGlmZmVyZW50IHByZWRlY2Vzc29yIChlLmcuIHRocm91Z2ggTVNDMzk0NikgYW5kIHN0aWxsIGRpc3BsYXkgaXRcbiAgICAvLyBpbiB0aGUgdGltZWxpbmUgbG9jYXRpb24gb2YgdGhlIGNyZWF0ZSBldmVudC5cbiAgICBjb25zdCByb29tQ29udGV4dCA9IHVzZUNvbnRleHQoUm9vbUNvbnRleHQpO1xuICAgIGNvbnN0IHByZWRlY2Vzc29yID0gdXNlUm9vbVN0YXRlKFxuICAgICAgICByb29tQ29udGV4dC5yb29tLFxuICAgICAgICB1c2VDYWxsYmFjayhcbiAgICAgICAgICAgIChzdGF0ZTogUm9vbVN0YXRlKSA9PiBzdGF0ZS5maW5kUHJlZGVjZXNzb3IobXNjMzk0NlByb2Nlc3NEeW5hbWljUHJlZGVjZXNzb3IpLFxuICAgICAgICAgICAgW21zYzM5NDZQcm9jZXNzRHluYW1pY1ByZWRlY2Vzc29yXSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25MaW5rQ2xpY2tlZCA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoZTogUmVhY3QuTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBkaXMuZGlzcGF0Y2g8Vmlld1Jvb21QYXlsb2FkPih7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IHByZWRlY2Vzc29yPy5ldmVudElkLFxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJvb21faWQ6IHByZWRlY2Vzc29yPy5yb29tSWQsXG4gICAgICAgICAgICAgICAgbWV0cmljc1RyaWdnZXI6IFwiUHJlZGVjZXNzb3JcIixcbiAgICAgICAgICAgICAgICBtZXRyaWNzVmlhS2V5Ym9hcmQ6IGUudHlwZSAhPT0gXCJjbGlja1wiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtwcmVkZWNlc3Nvcj8uZXZlbnRJZCwgcHJlZGVjZXNzb3I/LnJvb21JZF0sXG4gICAgKTtcblxuICAgIGlmICghcm9vbUNvbnRleHQucm9vbSB8fCByb29tQ29udGV4dC5yb29tLnJvb21JZCAhPT0gbXhFdmVudC5nZXRSb29tSWQoKSkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIFwiUm9vbVByZWRlY2Vzc29yVGlsZSB1bmV4cGVjdGVkbHkgdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoZVwiICtcbiAgICAgICAgICAgICAgICBcInJvb20gY29udGFpbmluZyB0aGlzIG0ucm9vbS5jcmVhdGUgZXZlbnQuXCIsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiA8PjwvPjtcbiAgICB9XG5cbiAgICBpZiAoIXByZWRlY2Vzc29yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiUm9vbVByZWRlY2Vzc29yVGlsZSB1bmV4cGVjdGVkbHkgdXNlZCBpbiBhIHJvb20gd2l0aCBubyBwcmVkZWNlc3Nvci5cIik7XG4gICAgICAgIHJldHVybiA8ZGl2IC8+O1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZSb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKHByZWRlY2Vzc29yLnJvb21JZCk7XG5cbiAgICAvLyBXZSBuZWVkIGVpdGhlciB0aGUgcHJldmlvdXMgcm9vbSwgb3Igc29tZSBzZXJ2ZXJzIHRvIGZpbmQgaXQgd2l0aC5cbiAgICAvLyBPdGhlcndpc2UsIHdlIG11c3QgYmFpbCBvdXQgaGVyZVxuICAgIGlmICghcHJldlJvb20gJiYgIXByZWRlY2Vzc29yLnZpYVNlcnZlcnMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBmaW5kIHByZWRlY2Vzc29yIHJvb20gd2l0aCBpZCAke3ByZWRlY2Vzc29yLnJvb21JZH1gKTtcblxuICAgICAgICBjb25zdCBndWVzc2VkTGluayA9IGd1ZXNzTGlua0ZvclJvb21JZChwcmVkZWNlc3Nvci5yb29tSWQpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8RXZlbnRUaWxlQnViYmxlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQ3JlYXRlRXZlbnRcIlxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInRpbWVsaW5lfG0ucm9vbS5jcmVhdGV8Y29udGludWF0aW9uXCIpfVxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcD17dGltZXN0YW1wfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRXZlbnRUaWxlX2JvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfRXZlbnRUaWxlX3RpbGVFcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgeyEhZ3Vlc3NlZExpbmsgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwidGltZWxpbmV8bS5yb29tLmNyZWF0ZXx1bmtub3duX3ByZWRlY2Vzc29yX2d1ZXNzX3NlcnZlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tSWQ6IHByZWRlY2Vzc29yLnJvb21JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9e2d1ZXNzZWRMaW5rfT57Z3Vlc3NlZExpbmt9PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdChcInRpbWVsaW5lfG0ucm9vbS5jcmVhdGV8dW5rbm93bl9wcmVkZWNlc3NvclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb21JZDogcHJlZGVjZXNzb3Iucm9vbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0V2ZW50VGlsZUJ1YmJsZT5cbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byBmaW5kIHRoaXMgcm9vbSBlaXRoZXIgYmVjYXVzZSBpdCBpc1xuICAgIC8vIGFscmVhZHkgbG9hZGVkLCBvciBiZWNhdXNlIHdlIGhhdmUgdmlhX3NlcnZlcnMgdGhhdCB3ZSBjYW4gdXNlLlxuICAgIC8vIFNvIHdlIGdvIGFoZWFkIHdpdGggcmVuZGVyaW5nIHRoZSB0aWxlLlxuXG4gICAgY29uc3QgcHJlZGVjZXNzb3JQZXJtYWxpbmsgPSBwcmV2Um9vbVxuICAgICAgICA/IGNyZWF0ZUxpbmtXaXRoUm9vbShwcmV2Um9vbSwgcHJlZGVjZXNzb3Iucm9vbUlkLCBwcmVkZWNlc3Nvci5ldmVudElkKVxuICAgICAgICA6IGNyZWF0ZUxpbmtXaXRob3V0Um9vbShwcmVkZWNlc3Nvci5yb29tSWQsIHByZWRlY2Vzc29yPy52aWFTZXJ2ZXJzID8/IFtdLCBwcmVkZWNlc3Nvci5ldmVudElkKTtcblxuICAgIGNvbnN0IGxpbmsgPSAoXG4gICAgICAgIDxhIGhyZWY9e3ByZWRlY2Vzc29yUGVybWFsaW5rfSBvbkNsaWNrPXtvbkxpbmtDbGlja2VkfT5cbiAgICAgICAgICAgIHtfdChcInRpbWVsaW5lfG0ucm9vbS5jcmVhdGV8c2VlX29sZGVyX21lc3NhZ2VzXCIpfVxuICAgICAgICA8L2E+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxFdmVudFRpbGVCdWJibGVcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0NyZWF0ZUV2ZW50XCJcbiAgICAgICAgICAgIHRpdGxlPXtfdChcInRpbWVsaW5lfG0ucm9vbS5jcmVhdGV8Y29udGludWF0aW9uXCIpfVxuICAgICAgICAgICAgc3VidGl0bGU9e2xpbmt9XG4gICAgICAgICAgICB0aW1lc3RhbXA9e3RpbWVzdGFtcH1cbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlTGlua1dpdGhSb29tKHJvb206IFJvb20sIHJvb21JZDogc3RyaW5nLCBldmVudElkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGVybWFsaW5rQ3JlYXRvciA9IG5ldyBSb29tUGVybWFsaW5rQ3JlYXRvcihyb29tLCByb29tSWQpO1xuICAgICAgICBwZXJtYWxpbmtDcmVhdG9yLmxvYWQoKTtcbiAgICAgICAgaWYgKGV2ZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwZXJtYWxpbmtDcmVhdG9yLmZvckV2ZW50KGV2ZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBlcm1hbGlua0NyZWF0b3IuZm9yUm9vbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTGlua1dpdGhvdXRSb29tKHJvb21JZDogc3RyaW5nLCB2aWFTZXJ2ZXJzOiBzdHJpbmdbXSwgZXZlbnRJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1hdHJpeFRvUGVybWFsaW5rQ29uc3RydWN0b3IgPSBuZXcgTWF0cml4VG9QZXJtYWxpbmtDb25zdHJ1Y3RvcigpO1xuICAgICAgICBpZiAoZXZlbnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdHJpeFRvUGVybWFsaW5rQ29uc3RydWN0b3IuZm9yRXZlbnQocm9vbUlkLCBldmVudElkLCB2aWFTZXJ2ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yLmZvclJvb20ocm9vbUlkLCB2aWFTZXJ2ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEd1ZXNzIHRoZSBwZXJtYWxpbmsgZm9yIGEgcm9vbSBiYXNlZCBvbiBpdHMgcm9vbSBJRC5cbiAgICAgKlxuICAgICAqIFRoZSBzcGVjIHNheXMgdGhhdCBSb29tIElEcyBhcmUgb3BhcXVlIFsxXSBzbyB0aGlzIGNhbiBvbmx5IGV2ZXIgYmUgYVxuICAgICAqIGd1ZXNzLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIHJvb20gZXhpc3RzIG9uIHRoaXMgc2VydmVyLlxuICAgICAqXG4gICAgICogWzFdIGh0dHBzOi8vc3BlYy5tYXRyaXgub3JnL3YxLjUvYXBwZW5kaWNlcy8jcm9vbS1pZHMtYW5kLWV2ZW50LWlkc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGd1ZXNzTGlua0ZvclJvb21JZChyb29tSWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBzZXJ2ZXJOYW1lID0gZ3Vlc3NTZXJ2ZXJOYW1lRnJvbVJvb21JZChyb29tSWQpO1xuICAgICAgICBpZiAoc2VydmVyTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhUb1Blcm1hbGlua0NvbnN0cnVjdG9yKCkuZm9yUm9vbShyb29tSWQsIFtzZXJ2ZXJOYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogQGludGVybmFsIFB1YmxpYyBmb3IgdGVzdCBvbmx5XG4gKlxuICogR3Vlc3MgdGhlIHNlcnZlciBuYW1lIGZvciBhIHJvb20gYmFzZWQgb24gaXRzIHJvb20gSUQuXG4gKlxuICogVGhlIHNwZWMgc2F5cyB0aGF0IFJvb20gSURzIGFyZSBvcGFxdWUgWzFdIHNvIHRoaXMgY2FuIG9ubHkgZXZlciBiZSBhXG4gKiBndWVzcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyByb29tIGV4aXN0cyBvbiB0aGlzIHNlcnZlci5cbiAqXG4gKiBbMV0gaHR0cHM6Ly9zcGVjLm1hdHJpeC5vcmcvdjEuNS9hcHBlbmRpY2VzLyNyb29tLWlkcy1hbmQtZXZlbnQtaWRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndWVzc1NlcnZlck5hbWVGcm9tUm9vbUlkKHJvb21JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbSA9IHJvb21JZC5tYXRjaCgvXlteOl0qOiguKikvKTtcbiAgICBpZiAobSkge1xuICAgICAgICByZXR1cm4gbVsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBU0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBR0EsSUFB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