UNPKG

matrix-react-sdk

Version:
114 lines (111 loc) 20.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.awaitRoomDownSync = awaitRoomDownSync; exports.upgradeRoom = upgradeRoom; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _types = require("matrix-js-sdk/src/types"); var _logger = require("matrix-js-sdk/src/logger"); var _RoomInvite = require("../RoomInvite"); var _Modal = _interopRequireDefault(require("../Modal")); var _languageHandler = require("../languageHandler"); var _ErrorDialog = _interopRequireDefault(require("../components/views/dialogs/ErrorDialog")); var _SpaceStore = _interopRequireDefault(require("../stores/spaces/SpaceStore")); var _Spinner = _interopRequireDefault(require("../components/views/elements/Spinner")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2021 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 awaitRoomDownSync(cli, roomId) { const room = cli.getRoom(roomId); if (room) return room; // already have the room return new Promise(resolve => { // We have to wait for the js-sdk to give us the room back so // we can more effectively abuse the MultiInviter behaviour // which heavily relies on the Room object being available. const checkForRoomFn = room => { if (room.roomId !== roomId) return; resolve(room); cli.off(_matrix.ClientEvent.Room, checkForRoomFn); }; cli.on(_matrix.ClientEvent.Room, checkForRoomFn); }); } async function upgradeRoom(room, targetVersion, inviteUsers = false, handleError = true, updateSpaces = true, awaitRoom = false, progressCallback) { const cli = room.client; let spinnerModal; if (!progressCallback) { spinnerModal = _Modal.default.createDialog(_Spinner.default, undefined, "mx_Dialog_spinner"); } let toInvite = []; if (inviteUsers) { toInvite = [...room.getMembersWithMembership(_types.KnownMembership.Join), ...room.getMembersWithMembership(_types.KnownMembership.Invite)].map(m => m.userId).filter(m => m !== cli.getUserId()); } let parentsToRelink = []; if (updateSpaces) { parentsToRelink = Array.from(_SpaceStore.default.instance.getKnownParents(room.roomId)).map(roomId => cli.getRoom(roomId)).filter(parent => parent?.currentState.maySendStateEvent(_matrix.EventType.SpaceChild, cli.getUserId())); } const progress = { roomUpgraded: false, roomSynced: awaitRoom || inviteUsers ? false : undefined, inviteUsersProgress: inviteUsers ? 0 : undefined, inviteUsersTotal: toInvite.length, updateSpacesProgress: updateSpaces ? 0 : undefined, updateSpacesTotal: parentsToRelink.length }; progressCallback?.(progress); let newRoomId; try { ({ replacement_room: newRoomId } = await cli.upgradeRoom(room.roomId, targetVersion)); } catch (e) { if (!handleError) throw e; _logger.logger.error(e); _Modal.default.createDialog(_ErrorDialog.default, { title: (0, _languageHandler._t)("room|upgrade_error_title"), description: (0, _languageHandler._t)("room|upgrade_error_description") }); throw e; } progress.roomUpgraded = true; progressCallback?.(progress); if (awaitRoom || inviteUsers) { await awaitRoomDownSync(room.client, newRoomId); progress.roomSynced = true; progressCallback?.(progress); } if (toInvite.length > 0) { // Errors are handled internally to this function await (0, _RoomInvite.inviteUsersToRoom)(cli, newRoomId, toInvite, () => { progress.inviteUsersProgress++; progressCallback?.(progress); }); } if (parentsToRelink.length > 0) { try { for (const parent of parentsToRelink) { const currentEv = parent.currentState.getStateEvents(_matrix.EventType.SpaceChild, room.roomId); await cli.sendStateEvent(parent.roomId, _matrix.EventType.SpaceChild, _objectSpread(_objectSpread({}, currentEv?.getContent() || {}), {}, { // copy existing attributes like suggested via: [cli.getDomain()] }), newRoomId); await cli.sendStateEvent(parent.roomId, _matrix.EventType.SpaceChild, {}, room.roomId); progress.updateSpacesProgress++; progressCallback?.(progress); } } catch (e) { // These errors are not critical to the room upgrade itself _logger.logger.warn("Failed to update parent spaces during room upgrade", e); } } spinnerModal?.close(); return newRoomId; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl90eXBlcyIsIl9sb2dnZXIiLCJfUm9vbUludml0ZSIsIl9Nb2RhbCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0Vycm9yRGlhbG9nIiwiX1NwYWNlU3RvcmUiLCJfU3Bpbm5lciIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImF3YWl0Um9vbURvd25TeW5jIiwiY2xpIiwicm9vbUlkIiwicm9vbSIsImdldFJvb20iLCJQcm9taXNlIiwicmVzb2x2ZSIsImNoZWNrRm9yUm9vbUZuIiwib2ZmIiwiQ2xpZW50RXZlbnQiLCJSb29tIiwib24iLCJ1cGdyYWRlUm9vbSIsInRhcmdldFZlcnNpb24iLCJpbnZpdGVVc2VycyIsImhhbmRsZUVycm9yIiwidXBkYXRlU3BhY2VzIiwiYXdhaXRSb29tIiwicHJvZ3Jlc3NDYWxsYmFjayIsImNsaWVudCIsInNwaW5uZXJNb2RhbCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiU3Bpbm5lciIsInVuZGVmaW5lZCIsInRvSW52aXRlIiwiZ2V0TWVtYmVyc1dpdGhNZW1iZXJzaGlwIiwiS25vd25NZW1iZXJzaGlwIiwiSm9pbiIsIkludml0ZSIsIm1hcCIsIm0iLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJwYXJlbnRzVG9SZWxpbmsiLCJBcnJheSIsImZyb20iLCJTcGFjZVN0b3JlIiwiaW5zdGFuY2UiLCJnZXRLbm93blBhcmVudHMiLCJwYXJlbnQiLCJjdXJyZW50U3RhdGUiLCJtYXlTZW5kU3RhdGVFdmVudCIsIkV2ZW50VHlwZSIsIlNwYWNlQ2hpbGQiLCJwcm9ncmVzcyIsInJvb21VcGdyYWRlZCIsInJvb21TeW5jZWQiLCJpbnZpdGVVc2Vyc1Byb2dyZXNzIiwiaW52aXRlVXNlcnNUb3RhbCIsInVwZGF0ZVNwYWNlc1Byb2dyZXNzIiwidXBkYXRlU3BhY2VzVG90YWwiLCJuZXdSb29tSWQiLCJyZXBsYWNlbWVudF9yb29tIiwibG9nZ2VyIiwiZXJyb3IiLCJFcnJvckRpYWxvZyIsInRpdGxlIiwiX3QiLCJkZXNjcmlwdGlvbiIsImludml0ZVVzZXJzVG9Sb29tIiwiY3VycmVudEV2IiwiZ2V0U3RhdGVFdmVudHMiLCJzZW5kU3RhdGVFdmVudCIsImdldENvbnRlbnQiLCJ2aWEiLCJnZXREb21haW4iLCJ3YXJuIiwiY2xvc2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvUm9vbVVwZ3JhZGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgUm9vbSwgRXZlbnRUeXBlLCBDbGllbnRFdmVudCwgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgS25vd25NZW1iZXJzaGlwIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IGludml0ZVVzZXJzVG9Sb29tIH0gZnJvbSBcIi4uL1Jvb21JbnZpdGVcIjtcbmltcG9ydCBNb2RhbCwgeyBJSGFuZGxlIH0gZnJvbSBcIi4uL01vZGFsXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0Vycm9yRGlhbG9nXCI7XG5pbXBvcnQgU3BhY2VTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL3NwYWNlcy9TcGFjZVN0b3JlXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9TcGlubmVyXCI7XG5cbmludGVyZmFjZSBJUHJvZ3Jlc3Mge1xuICAgIHJvb21VcGdyYWRlZDogYm9vbGVhbjtcbiAgICByb29tU3luY2VkPzogYm9vbGVhbjtcbiAgICBpbnZpdGVVc2Vyc1Byb2dyZXNzPzogbnVtYmVyO1xuICAgIGludml0ZVVzZXJzVG90YWw6IG51bWJlcjtcbiAgICB1cGRhdGVTcGFjZXNQcm9ncmVzcz86IG51bWJlcjtcbiAgICB1cGRhdGVTcGFjZXNUb3RhbDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRSb29tRG93blN5bmMoY2xpOiBNYXRyaXhDbGllbnQsIHJvb21JZDogc3RyaW5nKTogUHJvbWlzZTxSb29tPiB7XG4gICAgY29uc3Qgcm9vbSA9IGNsaS5nZXRSb29tKHJvb21JZCk7XG4gICAgaWYgKHJvb20pIHJldHVybiByb29tOyAvLyBhbHJlYWR5IGhhdmUgdGhlIHJvb21cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxSb29tPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBqcy1zZGsgdG8gZ2l2ZSB1cyB0aGUgcm9vbSBiYWNrIHNvXG4gICAgICAgIC8vIHdlIGNhbiBtb3JlIGVmZmVjdGl2ZWx5IGFidXNlIHRoZSBNdWx0aUludml0ZXIgYmVoYXZpb3VyXG4gICAgICAgIC8vIHdoaWNoIGhlYXZpbHkgcmVsaWVzIG9uIHRoZSBSb29tIG9iamVjdCBiZWluZyBhdmFpbGFibGUuXG4gICAgICAgIGNvbnN0IGNoZWNrRm9yUm9vbUZuID0gKHJvb206IFJvb20pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChyb29tLnJvb21JZCAhPT0gcm9vbUlkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlKHJvb20pO1xuICAgICAgICAgICAgY2xpLm9mZihDbGllbnRFdmVudC5Sb29tLCBjaGVja0ZvclJvb21Gbik7XG4gICAgICAgIH07XG4gICAgICAgIGNsaS5vbihDbGllbnRFdmVudC5Sb29tLCBjaGVja0ZvclJvb21Gbik7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGdyYWRlUm9vbShcbiAgICByb29tOiBSb29tLFxuICAgIHRhcmdldFZlcnNpb246IHN0cmluZyxcbiAgICBpbnZpdGVVc2VycyA9IGZhbHNlLFxuICAgIGhhbmRsZUVycm9yID0gdHJ1ZSxcbiAgICB1cGRhdGVTcGFjZXMgPSB0cnVlLFxuICAgIGF3YWl0Um9vbSA9IGZhbHNlLFxuICAgIHByb2dyZXNzQ2FsbGJhY2s/OiAocHJvZ3Jlc3M6IElQcm9ncmVzcykgPT4gdm9pZCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY2xpID0gcm9vbS5jbGllbnQ7XG4gICAgbGV0IHNwaW5uZXJNb2RhbDogSUhhbmRsZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGlmICghcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICBzcGlubmVyTW9kYWwgPSBNb2RhbC5jcmVhdGVEaWFsb2coU3Bpbm5lciwgdW5kZWZpbmVkLCBcIm14X0RpYWxvZ19zcGlubmVyXCIpO1xuICAgIH1cblxuICAgIGxldCB0b0ludml0ZTogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoaW52aXRlVXNlcnMpIHtcbiAgICAgICAgdG9JbnZpdGUgPSBbXG4gICAgICAgICAgICAuLi5yb29tLmdldE1lbWJlcnNXaXRoTWVtYmVyc2hpcChLbm93bk1lbWJlcnNoaXAuSm9pbiksXG4gICAgICAgICAgICAuLi5yb29tLmdldE1lbWJlcnNXaXRoTWVtYmVyc2hpcChLbm93bk1lbWJlcnNoaXAuSW52aXRlKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gbS51c2VySWQpXG4gICAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtICE9PSBjbGkuZ2V0VXNlcklkKCkpO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnRzVG9SZWxpbms6IFJvb21bXSA9IFtdO1xuICAgIGlmICh1cGRhdGVTcGFjZXMpIHtcbiAgICAgICAgcGFyZW50c1RvUmVsaW5rID0gQXJyYXkuZnJvbShTcGFjZVN0b3JlLmluc3RhbmNlLmdldEtub3duUGFyZW50cyhyb29tLnJvb21JZCkpXG4gICAgICAgICAgICAubWFwKChyb29tSWQpID0+IGNsaS5nZXRSb29tKHJvb21JZCkpXG4gICAgICAgICAgICAuZmlsdGVyKChwYXJlbnQpID0+XG4gICAgICAgICAgICAgICAgcGFyZW50Py5jdXJyZW50U3RhdGUubWF5U2VuZFN0YXRlRXZlbnQoRXZlbnRUeXBlLlNwYWNlQ2hpbGQsIGNsaS5nZXRVc2VySWQoKSEpLFxuICAgICAgICAgICAgKSBhcyBSb29tW107XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3M6IElQcm9ncmVzcyA9IHtcbiAgICAgICAgcm9vbVVwZ3JhZGVkOiBmYWxzZSxcbiAgICAgICAgcm9vbVN5bmNlZDogYXdhaXRSb29tIHx8IGludml0ZVVzZXJzID8gZmFsc2UgOiB1bmRlZmluZWQsXG4gICAgICAgIGludml0ZVVzZXJzUHJvZ3Jlc3M6IGludml0ZVVzZXJzID8gMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW52aXRlVXNlcnNUb3RhbDogdG9JbnZpdGUubGVuZ3RoLFxuICAgICAgICB1cGRhdGVTcGFjZXNQcm9ncmVzczogdXBkYXRlU3BhY2VzID8gMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXBkYXRlU3BhY2VzVG90YWw6IHBhcmVudHNUb1JlbGluay5sZW5ndGgsXG4gICAgfTtcbiAgICBwcm9ncmVzc0NhbGxiYWNrPy4ocHJvZ3Jlc3MpO1xuXG4gICAgbGV0IG5ld1Jvb21JZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgICh7IHJlcGxhY2VtZW50X3Jvb206IG5ld1Jvb21JZCB9ID0gYXdhaXQgY2xpLnVwZ3JhZGVSb29tKHJvb20ucm9vbUlkLCB0YXJnZXRWZXJzaW9uKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIWhhbmRsZUVycm9yKSB0aHJvdyBlO1xuICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG5cbiAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICB0aXRsZTogX3QoXCJyb29tfHVwZ3JhZGVfZXJyb3JfdGl0bGVcIiksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJyb29tfHVwZ3JhZGVfZXJyb3JfZGVzY3JpcHRpb25cIiksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHByb2dyZXNzLnJvb21VcGdyYWRlZCA9IHRydWU7XG4gICAgcHJvZ3Jlc3NDYWxsYmFjaz8uKHByb2dyZXNzKTtcblxuICAgIGlmIChhd2FpdFJvb20gfHwgaW52aXRlVXNlcnMpIHtcbiAgICAgICAgYXdhaXQgYXdhaXRSb29tRG93blN5bmMocm9vbS5jbGllbnQsIG5ld1Jvb21JZCk7XG4gICAgICAgIHByb2dyZXNzLnJvb21TeW5jZWQgPSB0cnVlO1xuICAgICAgICBwcm9ncmVzc0NhbGxiYWNrPy4ocHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmICh0b0ludml0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCBpbnRlcm5hbGx5IHRvIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgYXdhaXQgaW52aXRlVXNlcnNUb1Jvb20oY2xpLCBuZXdSb29tSWQsIHRvSW52aXRlLCAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzcy5pbnZpdGVVc2Vyc1Byb2dyZXNzISsrO1xuICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjaz8uKHByb2dyZXNzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudHNUb1JlbGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzVG9SZWxpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RXYgPSBwYXJlbnQuY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKEV2ZW50VHlwZS5TcGFjZUNoaWxkLCByb29tLnJvb21JZCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpLnNlbmRTdGF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucm9vbUlkLFxuICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGUuU3BhY2VDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGN1cnJlbnRFdj8uZ2V0Q29udGVudCgpIHx8IHt9KSwgLy8gY29weSBleGlzdGluZyBhdHRyaWJ1dGVzIGxpa2Ugc3VnZ2VzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWE6IFtjbGkuZ2V0RG9tYWluKCkhXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3Um9vbUlkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpLnNlbmRTdGF0ZUV2ZW50KHBhcmVudC5yb29tSWQsIEV2ZW50VHlwZS5TcGFjZUNoaWxkLCB7fSwgcm9vbS5yb29tSWQpO1xuXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MudXBkYXRlU3BhY2VzUHJvZ3Jlc3MhKys7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjaz8uKHByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVGhlc2UgZXJyb3JzIGFyZSBub3QgY3JpdGljYWwgdG8gdGhlIHJvb20gdXBncmFkZSBpdHNlbGZcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIHVwZGF0ZSBwYXJlbnQgc3BhY2VzIGR1cmluZyByb29tIHVwZ3JhZGVcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzcGlubmVyTW9kYWw/LmNsb3NlKCk7XG4gICAgcmV0dXJuIG5ld1Jvb21JZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsV0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sZ0JBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFTLFFBQUEsR0FBQUosc0JBQUEsQ0FBQUwsT0FBQTtBQUEyRCxTQUFBVSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFB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