matrix-react-sdk
Version:
SDK for matrix.org using React
168 lines (163 loc) • 25.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.leaveRoomBehaviour = leaveRoomBehaviour;
exports.leaveSpace = void 0;
var _utils = require("matrix-js-sdk/src/utils");
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _Modal = _interopRequireDefault(require("../Modal"));
var _Spinner = _interopRequireDefault(require("../components/views/elements/Spinner"));
var _languageHandler = require("../languageHandler");
var _ErrorDialog = _interopRequireDefault(require("../components/views/dialogs/ErrorDialog"));
var _spaces = require("../stores/spaces");
var _SpaceStore = _interopRequireDefault(require("../stores/spaces/SpaceStore"));
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
var _actions = require("../dispatcher/actions");
var _LeaveSpaceDialog = _interopRequireDefault(require("../components/views/dialogs/LeaveSpaceDialog"));
var _space = require("./space");
var _SDKContext = require("../contexts/SDKContext");
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
/*
Copyright 2024 New Vector Ltd.
Copyright 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.
*/
async function leaveRoomBehaviour(matrixClient, roomId, retry = true, spinner = true) {
let spinnerModal;
if (spinner) {
spinnerModal = _Modal.default.createDialog(_Spinner.default, undefined, "mx_Dialog_spinner");
}
let leavingAllVersions = true;
const history = matrixClient.getRoomUpgradeHistory(roomId, false, _SettingsStore.default.getValue("feature_dynamic_room_predecessors"));
if (history && history.length > 0) {
const currentRoom = history[history.length - 1];
if (currentRoom.roomId !== roomId) {
// The user is trying to leave an older version of the room. Let them through
// without making them leave the current version of the room.
leavingAllVersions = false;
}
}
const room = matrixClient.getRoom(roomId);
// should not encounter this
if (!room) {
throw new Error(`Expected to find room for id ${roomId}`);
}
// await any queued messages being sent so that they do not fail
await Promise.all(room.getPendingEvents().filter(ev => {
return [_matrix.EventStatus.QUEUED, _matrix.EventStatus.ENCRYPTING, _matrix.EventStatus.SENDING].includes(ev.status);
}).map(ev => new Promise((resolve, reject) => {
const handler = () => {
if (ev.status === _matrix.EventStatus.NOT_SENT) {
spinnerModal?.close();
reject(ev.error);
}
if (!ev.status || ev.status === _matrix.EventStatus.SENT) {
ev.off(_matrix.MatrixEventEvent.Status, handler);
resolve();
}
};
ev.on(_matrix.MatrixEventEvent.Status, handler);
})));
let results = {};
if (!leavingAllVersions) {
try {
await matrixClient.leave(roomId);
} catch (e) {
if (e instanceof _matrix.MatrixError) {
const message = e.data.error || (0, _languageHandler._t)("room|leave_unexpected_error");
results[roomId] = Object.assign(new Error(message), {
errcode: e.data.errcode,
data: e.data
});
} else if (e instanceof Error) {
results[roomId] = e;
} else {
results[roomId] = new Error("Failed to leave room for unknown causes");
}
}
} else {
results = await matrixClient.leaveRoomChain(roomId, retry);
}
if (retry) {
const limitExceededError = Object.values(results).find(e => e?.errcode === "M_LIMIT_EXCEEDED");
if (limitExceededError) {
await (0, _utils.sleep)(limitExceededError.data.retry_after_ms ?? 100);
return leaveRoomBehaviour(matrixClient, roomId, false, false);
}
}
spinnerModal?.close();
const errors = Object.entries(results).filter(r => !!r[1]);
if (errors.length > 0) {
const messages = [];
for (const roomErr of errors) {
const err = roomErr[1]; // [0] is the roomId
let message = (0, _languageHandler._t)("room|leave_unexpected_error");
if (err?.errcode && err.message) {
if (err.errcode === "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM") {
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("room|leave_server_notices_title"),
description: (0, _languageHandler._t)("room|leave_server_notices_description")
});
return;
}
message = results[roomId].message;
}
messages.push(message, /*#__PURE__*/_react.default.createElement("BR")); // createElement to avoid using a tsx file in utils
}
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("room|leave_error_title"),
description: messages
});
return;
}
if (_SDKContext.SdkContextClass.instance.roomViewStore.getRoomId() === roomId) {
// We were viewing the room that was just left. In order to avoid
// accidentally viewing the next room in the list and clearing its
// notifications, switch to a neutral ground such as the home page or
// space landing page.
if ((0, _spaces.isMetaSpace)(_SpaceStore.default.instance.activeSpace)) {
_dispatcher.default.dispatch({
action: _actions.Action.ViewHomePage
});
} else if (_SpaceStore.default.instance.activeSpace === roomId) {
// View the parent space, if there is one
const parent = _SpaceStore.default.instance.getCanonicalParent(roomId);
if (parent !== null) {
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: parent.roomId,
metricsTrigger: undefined // other
});
} else {
_dispatcher.default.dispatch({
action: _actions.Action.ViewHomePage
});
}
} else {
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: _SpaceStore.default.instance.activeSpace,
metricsTrigger: undefined // other
});
}
}
}
const leaveSpace = space => {
_Modal.default.createDialog(_LeaveSpaceDialog.default, {
space,
onFinished: async (leave, rooms) => {
if (!leave) return;
await (0, _space.bulkSpaceBehaviour)(space, rooms, room => leaveRoomBehaviour(space.client, room.roomId));
_dispatcher.default.dispatch({
action: _actions.Action.AfterLeaveRoom,
room_id: space.roomId
});
}
}, "mx_LeaveSpaceDialog_wrapper");
};
exports.leaveSpace = leaveSpace;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXRyaXgiLCJfTW9kYWwiLCJfU3Bpbm5lciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRXJyb3JEaWFsb2ciLCJfc3BhY2VzIiwiX1NwYWNlU3RvcmUiLCJfZGlzcGF0Y2hlciIsIl9hY3Rpb25zIiwiX0xlYXZlU3BhY2VEaWFsb2ciLCJfc3BhY2UiLCJfU0RLQ29udGV4dCIsIl9TZXR0aW5nc1N0b3JlIiwibGVhdmVSb29tQmVoYXZpb3VyIiwibWF0cml4Q2xpZW50Iiwicm9vbUlkIiwicmV0cnkiLCJzcGlubmVyIiwic3Bpbm5lck1vZGFsIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJTcGlubmVyIiwidW5kZWZpbmVkIiwibGVhdmluZ0FsbFZlcnNpb25zIiwiaGlzdG9yeSIsImdldFJvb21VcGdyYWRlSGlzdG9yeSIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImxlbmd0aCIsImN1cnJlbnRSb29tIiwicm9vbSIsImdldFJvb20iLCJFcnJvciIsIlByb21pc2UiLCJhbGwiLCJnZXRQZW5kaW5nRXZlbnRzIiwiZmlsdGVyIiwiZXYiLCJFdmVudFN0YXR1cyIsIlFVRVVFRCIsIkVOQ1JZUFRJTkciLCJTRU5ESU5HIiwiaW5jbHVkZXMiLCJzdGF0dXMiLCJtYXAiLCJyZXNvbHZlIiwicmVqZWN0IiwiaGFuZGxlciIsIk5PVF9TRU5UIiwiY2xvc2UiLCJlcnJvciIsIlNFTlQiLCJvZmYiLCJNYXRyaXhFdmVudEV2ZW50IiwiU3RhdHVzIiwib24iLCJyZXN1bHRzIiwibGVhdmUiLCJlIiwiTWF0cml4RXJyb3IiLCJtZXNzYWdlIiwiZGF0YSIsIl90IiwiT2JqZWN0IiwiYXNzaWduIiwiZXJyY29kZSIsImxlYXZlUm9vbUNoYWluIiwibGltaXRFeGNlZWRlZEVycm9yIiwidmFsdWVzIiwiZmluZCIsInNsZWVwIiwicmV0cnlfYWZ0ZXJfbXMiLCJlcnJvcnMiLCJlbnRyaWVzIiwiciIsIm1lc3NhZ2VzIiwicm9vbUVyciIsImVyciIsIkVycm9yRGlhbG9nIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInB1c2giLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJTZGtDb250ZXh0Q2xhc3MiLCJpbnN0YW5jZSIsInJvb21WaWV3U3RvcmUiLCJnZXRSb29tSWQiLCJpc01ldGFTcGFjZSIsIlNwYWNlU3RvcmUiLCJhY3RpdmVTcGFjZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld0hvbWVQYWdlIiwicGFyZW50IiwiZ2V0Q2Fub25pY2FsUGFyZW50IiwiVmlld1Jvb20iLCJyb29tX2lkIiwibWV0cmljc1RyaWdnZXIiLCJsZWF2ZVNwYWNlIiwic3BhY2UiLCJMZWF2ZVNwYWNlRGlhbG9nIiwib25GaW5pc2hlZCIsInJvb21zIiwiYnVsa1NwYWNlQmVoYXZpb3VyIiwiY2xpZW50IiwiQWZ0ZXJMZWF2ZVJvb20iLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xlYXZlLWJlaGF2aW91ci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy91dGlsc1wiO1xuaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRXZlbnRTdGF0dXMsIE1hdHJpeEV2ZW50RXZlbnQsIFJvb20sIE1hdHJpeENsaWVudCwgTWF0cml4RXJyb3IgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCBNb2RhbCwgeyBJSGFuZGxlIH0gZnJvbSBcIi4uL01vZGFsXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0Vycm9yRGlhbG9nXCI7XG5pbXBvcnQgeyBpc01ldGFTcGFjZSB9IGZyb20gXCIuLi9zdG9yZXMvc3BhY2VzXCI7XG5pbXBvcnQgU3BhY2VTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL3NwYWNlcy9TcGFjZVN0b3JlXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHsgVmlld0hvbWVQYWdlUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdIb21lUGFnZVBheWxvYWRcIjtcbmltcG9ydCBMZWF2ZVNwYWNlRGlhbG9nIGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvTGVhdmVTcGFjZURpYWxvZ1wiO1xuaW1wb3J0IHsgQWZ0ZXJMZWF2ZVJvb21QYXlsb2FkIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvQWZ0ZXJMZWF2ZVJvb21QYXlsb2FkXCI7XG5pbXBvcnQgeyBidWxrU3BhY2VCZWhhdmlvdXIgfSBmcm9tIFwiLi9zcGFjZVwiO1xuaW1wb3J0IHsgU2RrQ29udGV4dENsYXNzIH0gZnJvbSBcIi4uL2NvbnRleHRzL1NES0NvbnRleHRcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsZWF2ZVJvb21CZWhhdmlvdXIoXG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsXG4gICAgcm9vbUlkOiBzdHJpbmcsXG4gICAgcmV0cnkgPSB0cnVlLFxuICAgIHNwaW5uZXIgPSB0cnVlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHNwaW5uZXJNb2RhbDogSUhhbmRsZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzcGlubmVyKSB7XG4gICAgICAgIHNwaW5uZXJNb2RhbCA9IE1vZGFsLmNyZWF0ZURpYWxvZyhTcGlubmVyLCB1bmRlZmluZWQsIFwibXhfRGlhbG9nX3NwaW5uZXJcIik7XG4gICAgfVxuXG4gICAgbGV0IGxlYXZpbmdBbGxWZXJzaW9ucyA9IHRydWU7XG4gICAgY29uc3QgaGlzdG9yeSA9IG1hdHJpeENsaWVudC5nZXRSb29tVXBncmFkZUhpc3RvcnkoXG4gICAgICAgIHJvb21JZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJmZWF0dXJlX2R5bmFtaWNfcm9vbV9wcmVkZWNlc3NvcnNcIiksXG4gICAgKTtcbiAgICBpZiAoaGlzdG9yeSAmJiBoaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJvb20gPSBoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyZW50Um9vbS5yb29tSWQgIT09IHJvb21JZCkge1xuICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGxlYXZlIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIHJvb20uIExldCB0aGVtIHRocm91Z2hcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgbWFraW5nIHRoZW0gbGVhdmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcm9vbS5cbiAgICAgICAgICAgIGxlYXZpbmdBbGxWZXJzaW9ucyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vbSA9IG1hdHJpeENsaWVudC5nZXRSb29tKHJvb21JZCk7XG5cbiAgICAvLyBzaG91bGQgbm90IGVuY291bnRlciB0aGlzXG4gICAgaWYgKCFyb29tKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gZmluZCByb29tIGZvciBpZCAke3Jvb21JZH1gKTtcbiAgICB9XG5cbiAgICAvLyBhd2FpdCBhbnkgcXVldWVkIG1lc3NhZ2VzIGJlaW5nIHNlbnQgc28gdGhhdCB0aGV5IGRvIG5vdCBmYWlsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJvb21cbiAgICAgICAgICAgIC5nZXRQZW5kaW5nRXZlbnRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtFdmVudFN0YXR1cy5RVUVVRUQsIEV2ZW50U3RhdHVzLkVOQ1JZUFRJTkcsIEV2ZW50U3RhdHVzLlNFTkRJTkddLmluY2x1ZGVzKGV2LnN0YXR1cyEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKGV2KSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5zdGF0dXMgPT09IEV2ZW50U3RhdHVzLk5PVF9TRU5UKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXJNb2RhbD8uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGV2LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2LnN0YXR1cyB8fCBldi5zdGF0dXMgPT09IEV2ZW50U3RhdHVzLlNFTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYub2ZmKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2Lm9uKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICk7XG5cbiAgICBsZXQgcmVzdWx0czogeyBbcm9vbUlkOiBzdHJpbmddOiBFcnJvciB8IE1hdHJpeEVycm9yIHwgbnVsbCB9ID0ge307XG4gICAgaWYgKCFsZWF2aW5nQWxsVmVyc2lvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1hdHJpeENsaWVudC5sZWF2ZShyb29tSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1hdHJpeEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGUuZGF0YS5lcnJvciB8fCBfdChcInJvb218bGVhdmVfdW5leHBlY3RlZF9lcnJvclwiKTtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3Jvb21JZF0gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihtZXNzYWdlKSwgeyBlcnJjb2RlOiBlLmRhdGEuZXJyY29kZSwgZGF0YTogZS5kYXRhIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3Jvb21JZF0gPSBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3Jvb21JZF0gPSBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbGVhdmUgcm9vbSBmb3IgdW5rbm93biBjYXVzZXNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzID0gYXdhaXQgbWF0cml4Q2xpZW50LmxlYXZlUm9vbUNoYWluKHJvb21JZCwgcmV0cnkpO1xuICAgIH1cblxuICAgIGlmIChyZXRyeSkge1xuICAgICAgICBjb25zdCBsaW1pdEV4Y2VlZGVkRXJyb3IgPSBPYmplY3QudmFsdWVzKHJlc3VsdHMpLmZpbmQoXG4gICAgICAgICAgICAoZSkgPT4gKGUgYXMgTWF0cml4RXJyb3IpPy5lcnJjb2RlID09PSBcIk1fTElNSVRfRVhDRUVERURcIixcbiAgICAgICAgKSBhcyBNYXRyaXhFcnJvcjtcbiAgICAgICAgaWYgKGxpbWl0RXhjZWVkZWRFcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAobGltaXRFeGNlZWRlZEVycm9yLmRhdGEucmV0cnlfYWZ0ZXJfbXMgPz8gMTAwKTtcbiAgICAgICAgICAgIHJldHVybiBsZWF2ZVJvb21CZWhhdmlvdXIobWF0cml4Q2xpZW50LCByb29tSWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzcGlubmVyTW9kYWw/LmNsb3NlKCk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5maWx0ZXIoKHIpID0+ICEhclsxXSk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBSZWFjdE5vZGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvb21FcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSByb29tRXJyWzFdIGFzIE1hdHJpeEVycm9yOyAvLyBbMF0gaXMgdGhlIHJvb21JZFxuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBfdChcInJvb218bGVhdmVfdW5leHBlY3RlZF9lcnJvclwiKTtcbiAgICAgICAgICAgIGlmIChlcnI/LmVycmNvZGUgJiYgZXJyLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycmNvZGUgPT09IFwiTV9DQU5OT1RfTEVBVkVfU0VSVkVSX05PVElDRV9ST09NXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJyb29tfGxlYXZlX3NlcnZlcl9ub3RpY2VzX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwicm9vbXxsZWF2ZV9zZXJ2ZXJfbm90aWNlc19kZXNjcmlwdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHJlc3VsdHNbcm9vbUlkXSEubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobWVzc2FnZSwgUmVhY3QuY3JlYXRlRWxlbWVudChcIkJSXCIpKTsgLy8gY3JlYXRlRWxlbWVudCB0byBhdm9pZCB1c2luZyBhIHRzeCBmaWxlIGluIHV0aWxzXG4gICAgICAgIH1cbiAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICB0aXRsZTogX3QoXCJyb29tfGxlYXZlX2Vycm9yX3RpdGxlXCIpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IG1lc3NhZ2VzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChTZGtDb250ZXh0Q2xhc3MuaW5zdGFuY2Uucm9vbVZpZXdTdG9yZS5nZXRSb29tSWQoKSA9PT0gcm9vbUlkKSB7XG4gICAgICAgIC8vIFdlIHdlcmUgdmlld2luZyB0aGUgcm9vbSB0aGF0IHdhcyBqdXN0IGxlZnQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAgIC8vIGFjY2lkZW50YWxseSB2aWV3aW5nIHRoZSBuZXh0IHJvb20gaW4gdGhlIGxpc3QgYW5kIGNsZWFyaW5nIGl0c1xuICAgICAgICAvLyBub3RpZmljYXRpb25zLCBzd2l0Y2ggdG8gYSBuZXV0cmFsIGdyb3VuZCBzdWNoIGFzIHRoZSBob21lIHBhZ2Ugb3JcbiAgICAgICAgLy8gc3BhY2UgbGFuZGluZyBwYWdlLlxuICAgICAgICBpZiAoaXNNZXRhU3BhY2UoU3BhY2VTdG9yZS5pbnN0YW5jZS5hY3RpdmVTcGFjZSkpIHtcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3SG9tZVBhZ2VQYXlsb2FkPih7IGFjdGlvbjogQWN0aW9uLlZpZXdIb21lUGFnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChTcGFjZVN0b3JlLmluc3RhbmNlLmFjdGl2ZVNwYWNlID09PSByb29tSWQpIHtcbiAgICAgICAgICAgIC8vIFZpZXcgdGhlIHBhcmVudCBzcGFjZSwgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBTcGFjZVN0b3JlLmluc3RhbmNlLmdldENhbm9uaWNhbFBhcmVudChyb29tSWQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3Um9vbVBheWxvYWQ+KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICAgICAgICAgIHJvb21faWQ6IHBhcmVudC5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiB1bmRlZmluZWQsIC8vIG90aGVyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3SG9tZVBhZ2VQYXlsb2FkPih7IGFjdGlvbjogQWN0aW9uLlZpZXdIb21lUGFnZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3Um9vbVBheWxvYWQ+KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgICAgICByb29tX2lkOiBTcGFjZVN0b3JlLmluc3RhbmNlLmFjdGl2ZVNwYWNlLFxuICAgICAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiB1bmRlZmluZWQsIC8vIG90aGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxlYXZlU3BhY2UgPSAoc3BhY2U6IFJvb20pOiB2b2lkID0+IHtcbiAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgIExlYXZlU3BhY2VEaWFsb2csXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgb25GaW5pc2hlZDogYXN5bmMgKGxlYXZlOiBib29sZWFuLCByb29tczogUm9vbVtdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsZWF2ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGF3YWl0IGJ1bGtTcGFjZUJlaGF2aW91cihzcGFjZSwgcm9vbXMsIChyb29tKSA9PiBsZWF2ZVJvb21CZWhhdmlvdXIoc3BhY2UuY2xpZW50LCByb29tLnJvb21JZCkpO1xuXG4gICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoPEFmdGVyTGVhdmVSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5BZnRlckxlYXZlUm9vbSxcbiAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogc3BhY2Uucm9vbUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJteF9MZWF2ZVNwYWNlRGlhbG9nX3dyYXBwZXJcIixcbiAgICApO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxNQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sWUFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsT0FBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsV0FBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsV0FBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQVcsUUFBQSxHQUFBWCxPQUFBO0FBRUEsSUFBQVksaUJBQUEsR0FBQVYsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFhLE1BQUEsR0FBQWIsT0FBQTtBQUNBLElBQUFjLFdBQUEsR0FBQWQsT0FBQTtBQUNBLElBQUFlLGNBQUEsR0FBQWIsc0JBQUEsQ0FBQUYsT0FBQTtBQTFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFzQk8sZUFBZWdCLGtCQUFrQkEsQ0FDcENDLFlBQTBCLEVBQzFCQyxNQUFjLEVBQ2RDLEtBQUssR0FBRyxJQUFJLEVBQ1pDLE9BQU8sR0FBRyxJQUFJLEVBQ0Q7RUFDYixJQUFJQyxZQUFzQztFQUMxQyxJQUFJRCxPQUFPLEVBQUU7SUFDVEMsWUFBWSxHQUFHQyxjQUFLLENBQUNDLFlBQVksQ0FBQ0MsZ0JBQU8sRUFBRUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO0VBQzlFO0VBRUEsSUFBSUMsa0JBQWtCLEdBQUcsSUFBSTtFQUM3QixN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