UNPKG

matrix-react-sdk

Version:
128 lines (120 loc) 19.5 kB
"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 _matrix = require("matrix-js-sdk/src/matrix"); var _utils = require("matrix-js-sdk/src/utils"); var _MatrixClientBackedSettingsHandler = _interopRequireDefault(require("./MatrixClientBackedSettingsHandler")); var _objects = require("../../utils/objects"); var _SettingLevel = require("../SettingLevel"); /* Copyright 2024 New Vector Ltd. Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Copyright 2017 Travis Ralston SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const ALLOWED_WIDGETS_EVENT_TYPE = "im.vector.setting.allowed_widgets"; const DEFAULT_SETTINGS_EVENT_TYPE = "im.vector.web.settings"; /** * Gets and sets settings at the "room-account" level for the current user. */ class RoomAccountSettingsHandler extends _MatrixClientBackedSettingsHandler.default { constructor(watchers) { super(); (0, _defineProperty2.default)(this, "onAccountData", (event, room, prevEvent) => { const roomId = room.roomId; if (event.getType() === "org.matrix.room.preview_urls") { let val = event.getContent()["disable"]; if (typeof val !== "boolean") { val = null; } else { val = !val; } this.watchers.notifyUpdate("urlPreviewsEnabled", roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, val); } else if (event.getType() === DEFAULT_SETTINGS_EVENT_TYPE) { // Figure out what changed and fire those updates const prevContent = prevEvent?.getContent() ?? {}; const changedSettings = (0, _objects.objectKeyChanges)(prevContent, event.getContent()); for (const settingName of changedSettings) { const val = event.getContent()[settingName]; this.watchers.notifyUpdate(settingName, roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, val); } } else if (event.getType() === ALLOWED_WIDGETS_EVENT_TYPE) { this.watchers.notifyUpdate("allowedWidgets", roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, event.getContent()); } }); this.watchers = watchers; } initMatrixClient(oldClient, newClient) { if (oldClient) { oldClient.removeListener(_matrix.RoomEvent.AccountData, this.onAccountData); } newClient.on(_matrix.RoomEvent.AccountData, this.onAccountData); } getValue(settingName, roomId) { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings(roomId, "org.matrix.room.preview_urls") || {}; // Check to make sure that we actually got a boolean if (typeof content["disable"] !== "boolean") return null; return !content["disable"]; } // Special case allowed widgets if (settingName === "allowedWidgets") { return this.getSettings(roomId, ALLOWED_WIDGETS_EVENT_TYPE); } const settings = this.getSettings(roomId) || {}; return settings[settingName]; } // helper function to send room account data then await it being echoed back async setRoomAccountData(roomId, eventType, field, value) { let content; if (field === null) { content = value; } else { content = this.getSettings(roomId, eventType) || {}; content[field] = value; } await this.client.setRoomAccountData(roomId, eventType, content); const deferred = (0, _utils.defer)(); const handler = (event, room) => { if (room.roomId !== roomId || event.getType() !== eventType) return; if (field !== null && event.getContent()[field] !== value) return; this.client.off(_matrix.RoomEvent.AccountData, handler); deferred.resolve(); }; this.client.on(_matrix.RoomEvent.AccountData, handler); await deferred.promise; } setValue(settingName, roomId, newValue) { switch (settingName) { // Special case URL previews case "urlPreviewsEnabled": return this.setRoomAccountData(roomId, "org.matrix.room.preview_urls", "disable", !newValue); // Special case allowed widgets case "allowedWidgets": return this.setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, null, newValue); default: return this.setRoomAccountData(roomId, DEFAULT_SETTINGS_EVENT_TYPE, settingName, newValue); } } canSetValue(settingName, roomId) { // If they have the room, they can set their own account data return !!this.client.getRoom(roomId); } isSupported() { return this.client && !this.client.isGuest(); } getSettings(roomId, eventType = DEFAULT_SETTINGS_EVENT_TYPE) { // TODO: [TS] Type return const event = this.client.getRoom(roomId)?.getAccountData(eventType); if (!event || !event.getContent()) return null; return (0, _objects.objectClone)(event.getContent()); // clone to prevent mutation } } exports.default = RoomAccountSettingsHandler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl91dGlscyIsIl9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX29iamVjdHMiLCJfU2V0dGluZ0xldmVsIiwiQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUiLCJERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUiLCJSb29tQWNjb3VudFNldHRpbmdzSGFuZGxlciIsIk1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciIsImNvbnN0cnVjdG9yIiwid2F0Y2hlcnMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImV2ZW50Iiwicm9vbSIsInByZXZFdmVudCIsInJvb21JZCIsImdldFR5cGUiLCJ2YWwiLCJnZXRDb250ZW50Iiwibm90aWZ5VXBkYXRlIiwiU2V0dGluZ0xldmVsIiwiUk9PTV9BQ0NPVU5UIiwicHJldkNvbnRlbnQiLCJjaGFuZ2VkU2V0dGluZ3MiLCJvYmplY3RLZXlDaGFuZ2VzIiwic2V0dGluZ05hbWUiLCJpbml0TWF0cml4Q2xpZW50Iiwib2xkQ2xpZW50IiwibmV3Q2xpZW50IiwicmVtb3ZlTGlzdGVuZXIiLCJSb29tRXZlbnQiLCJBY2NvdW50RGF0YSIsIm9uQWNjb3VudERhdGEiLCJvbiIsImdldFZhbHVlIiwiY29udGVudCIsImdldFNldHRpbmdzIiwic2V0dGluZ3MiLCJzZXRSb29tQWNjb3VudERhdGEiLCJldmVudFR5cGUiLCJmaWVsZCIsInZhbHVlIiwiY2xpZW50IiwiZGVmZXJyZWQiLCJkZWZlciIsImhhbmRsZXIiLCJvZmYiLCJyZXNvbHZlIiwicHJvbWlzZSIsInNldFZhbHVlIiwibmV3VmFsdWUiLCJjYW5TZXRWYWx1ZSIsImdldFJvb20iLCJpc1N1cHBvcnRlZCIsImlzR3Vlc3QiLCJnZXRBY2NvdW50RGF0YSIsIm9iamVjdENsb25lIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9Sb29tQWNjb3VudFNldHRpbmdzSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTcgVHJhdmlzIFJhbHN0b25cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50LCBNYXRyaXhFdmVudCwgUm9vbSwgUm9vbUV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgZGVmZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcblxuaW1wb3J0IE1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciBmcm9tIFwiLi9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXJcIjtcbmltcG9ydCB7IG9iamVjdENsb25lLCBvYmplY3RLZXlDaGFuZ2VzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdHNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IFdhdGNoTWFuYWdlciB9IGZyb20gXCIuLi9XYXRjaE1hbmFnZXJcIjtcblxuY29uc3QgQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUgPSBcImltLnZlY3Rvci5zZXR0aW5nLmFsbG93ZWRfd2lkZ2V0c1wiO1xuY29uc3QgREVGQVVMVF9TRVRUSU5HU19FVkVOVF9UWVBFID0gXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCI7XG5cbi8qKlxuICogR2V0cyBhbmQgc2V0cyBzZXR0aW5ncyBhdCB0aGUgXCJyb29tLWFjY291bnRcIiBsZXZlbCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUFjY291bnRTZXR0aW5nc0hhbmRsZXIgZXh0ZW5kcyBNYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgd2F0Y2hlcnM6IFdhdGNoTWFuYWdlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0TWF0cml4Q2xpZW50KG9sZENsaWVudDogTWF0cml4Q2xpZW50LCBuZXdDbGllbnQ6IE1hdHJpeENsaWVudCk6IHZvaWQge1xuICAgICAgICBpZiAob2xkQ2xpZW50KSB7XG4gICAgICAgICAgICBvbGRDbGllbnQucmVtb3ZlTGlzdGVuZXIoUm9vbUV2ZW50LkFjY291bnREYXRhLCB0aGlzLm9uQWNjb3VudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2xpZW50Lm9uKFJvb21FdmVudC5BY2NvdW50RGF0YSwgdGhpcy5vbkFjY291bnREYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWNjb3VudERhdGEgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50LCByb29tOiBSb29tLCBwcmV2RXZlbnQ/OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByb29tSWQgPSByb29tLnJvb21JZDtcblxuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBcIm9yZy5tYXRyaXgucm9vbS5wcmV2aWV3X3VybHNcIikge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVtcImRpc2FibGVcIl07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAhdmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShcInVybFByZXZpZXdzRW5hYmxlZFwiLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkIGFuZCBmaXJlIHRob3NlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250ZW50ID0gcHJldkV2ZW50Py5nZXRDb250ZW50KCkgPz8ge307XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkU2V0dGluZ3MgPSBvYmplY3RLZXlDaGFuZ2VzPFJlY29yZDxzdHJpbmcsIGFueT4+KHByZXZDb250ZW50LCBldmVudC5nZXRDb250ZW50KCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nTmFtZSBvZiBjaGFuZ2VkU2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBldmVudC5nZXRDb250ZW50KClbc2V0dGluZ05hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKHNldHRpbmdOYW1lLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSkge1xuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoXCJhbGxvd2VkV2lkZ2V0c1wiLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIGV2ZW50LmdldENvbnRlbnQoKSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIGdldFZhbHVlKHNldHRpbmdOYW1lOiBzdHJpbmcsIHJvb21JZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIFVSTCBwcmV2aWV3c1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwidXJsUHJldmlld3NFbmFibGVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKHJvb21JZCwgXCJvcmcubWF0cml4LnJvb20ucHJldmlld191cmxzXCIpIHx8IHt9O1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhY3R1YWxseSBnb3QgYSBib29sZWFuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRbXCJkaXNhYmxlXCJdICE9PSBcImJvb2xlYW5cIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gIWNvbnRlbnRbXCJkaXNhYmxlXCJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGFsbG93ZWQgd2lkZ2V0c1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwiYWxsb3dlZFdpZGdldHNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkKSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzW3NldHRpbmdOYW1lXTtcbiAgICB9XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gc2VuZCByb29tIGFjY291bnQgZGF0YSB0aGVuIGF3YWl0IGl0IGJlaW5nIGVjaG9lZCBiYWNrXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRSb29tQWNjb3VudERhdGEoXG4gICAgICAgIHJvb21JZDogc3RyaW5nLFxuICAgICAgICBldmVudFR5cGU6IHN0cmluZyxcbiAgICAgICAgZmllbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIHZhbHVlOiBhbnksXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjb250ZW50OiBSZXR1cm5UeXBlPFJvb21BY2NvdW50U2V0dGluZ3NIYW5kbGVyW1wiZ2V0U2V0dGluZ3NcIl0+O1xuXG4gICAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGVudCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBldmVudFR5cGUpIHx8IHt9O1xuICAgICAgICAgICAgY29udGVudFtmaWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNldFJvb21BY2NvdW50RGF0YShyb29tSWQsIGV2ZW50VHlwZSwgY29udGVudCk7XG5cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcjx2b2lkPigpO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiBNYXRyaXhFdmVudCwgcm9vbTogUm9vbSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKHJvb20ucm9vbUlkICE9PSByb29tSWQgfHwgZXZlbnQuZ2V0VHlwZSgpICE9PSBldmVudFR5cGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBldmVudC5nZXRDb250ZW50KClbZmllbGRdICE9PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jbGllbnQub2ZmKFJvb21FdmVudC5BY2NvdW50RGF0YSwgaGFuZGxlcik7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKFJvb21FdmVudC5BY2NvdW50RGF0YSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc3dpdGNoIChzZXR0aW5nTmFtZSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIFVSTCBwcmV2aWV3c1xuICAgICAgICAgICAgY2FzZSBcInVybFByZXZpZXdzRW5hYmxlZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFJvb21BY2NvdW50RGF0YShyb29tSWQsIFwib3JnLm1hdHJpeC5yb29tLnByZXZpZXdfdXJsc1wiLCBcImRpc2FibGVcIiwgIW5ld1ZhbHVlKTtcblxuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGFsbG93ZWQgd2lkZ2V0c1xuICAgICAgICAgICAgY2FzZSBcImFsbG93ZWRXaWRnZXRzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Um9vbUFjY291bnREYXRhKHJvb21JZCwgQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUsIG51bGwsIG5ld1ZhbHVlKTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRSb29tQWNjb3VudERhdGEocm9vbUlkLCBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUsIHNldHRpbmdOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuU2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgdGhleSBoYXZlIHRoZSByb29tLCB0aGV5IGNhbiBzZXQgdGhlaXIgb3duIGFjY291bnQgZGF0YVxuICAgICAgICByZXR1cm4gISF0aGlzLmNsaWVudC5nZXRSb29tKHJvb21JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQgJiYgIXRoaXMuY2xpZW50LmlzR3Vlc3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNldHRpbmdzKHJvb21JZDogc3RyaW5nLCBldmVudFR5cGUgPSBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUpOiBhbnkge1xuICAgICAgICAvLyBUT0RPOiBbVFNdIFR5cGUgcmV0dXJuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jbGllbnQuZ2V0Um9vbShyb29tSWQpPy5nZXRBY2NvdW50RGF0YShldmVudFR5cGUpO1xuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5nZXRDb250ZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gb2JqZWN0Q2xvbmUoZXZlbnQuZ2V0Q29udGVudCgpKTsgLy8gY2xvbmUgdG8gcHJldmVudCBtdXRhdGlvblxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxrQ0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFVQSxNQUFNTSwwQkFBMEIsR0FBRyxtQ0FBbUM7QUFDdEUsTUFBTUMsMkJBQTJCLEdBQUcsd0JBQXdCOztBQUU1RDtBQUNBO0FBQ0E7QUFDZSxNQUFNQywwQkFBMEIsU0FBU0MsMENBQWlDLENBQUM7RUFDL0VDLFdBQVdBLENBQWlCQyxRQUFzQixFQUFFO0lBQ3ZELEtBQUssQ0FBQyxDQUFDO0lBQUMsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSx5QkFXWSxDQUFDQyxLQUFrQixFQUFFQyxJQUFVLEVBQUVDLFNBQXVCLEtBQVc7TUFDdkYsTUFBTUMsTUFBTSxHQUFHRixJQUFJLENBQUNF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