UNPKG

matrix-react-sdk

Version:
102 lines (99 loc) 13.8 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 _SettingsHandler = _interopRequireDefault(require("./SettingsHandler")); var _AbstractLocalStorageSettingsHandler; /* Copyright 2024 New Vector Ltd. Copyright 2019-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. */ /** * Abstract settings handler wrapping around localStorage making getValue calls cheaper * by caching the values and listening for localStorage updates from other tabs. */ class AbstractLocalStorageSettingsHandler extends _SettingsHandler.default { static clear() { AbstractLocalStorageSettingsHandler.itemCache.clear(); AbstractLocalStorageSettingsHandler.objectCache.clear(); } constructor() { super(); if (!AbstractLocalStorageSettingsHandler.storageListenerBound) { AbstractLocalStorageSettingsHandler.storageListenerBound = true; // Listen for storage changes from other tabs to bust the cache window.addEventListener("storage", AbstractLocalStorageSettingsHandler.onStorageEvent); } } getItem(key) { if (!AbstractLocalStorageSettingsHandler.itemCache.has(key)) { const value = localStorage.getItem(key); AbstractLocalStorageSettingsHandler.itemCache.set(key, value); return value; } return AbstractLocalStorageSettingsHandler.itemCache.get(key); } getBoolean(key) { const item = this.getItem(key); if (item === "true") return true; if (item === "false") return false; // Fall back to the next config level return null; } getObject(key) { if (!AbstractLocalStorageSettingsHandler.objectCache.has(key)) { try { const value = JSON.parse(localStorage.getItem(key)); AbstractLocalStorageSettingsHandler.objectCache.set(key, value); return value; } catch (err) { console.error("Failed to parse localStorage object", err); return null; } } return AbstractLocalStorageSettingsHandler.objectCache.get(key); } setItem(key, value) { AbstractLocalStorageSettingsHandler.itemCache.set(key, value); localStorage.setItem(key, value); } setBoolean(key, value) { this.setItem(key, `${value}`); } setObject(key, value) { AbstractLocalStorageSettingsHandler.objectCache.set(key, value); localStorage.setItem(key, JSON.stringify(value)); } // handles both items and objects removeItem(key) { localStorage.removeItem(key); AbstractLocalStorageSettingsHandler.itemCache.delete(key); AbstractLocalStorageSettingsHandler.objectCache.delete(key); } isSupported() { return localStorage !== undefined && localStorage !== null; } reset() { AbstractLocalStorageSettingsHandler.clear(); } } exports.default = AbstractLocalStorageSettingsHandler; _AbstractLocalStorageSettingsHandler = AbstractLocalStorageSettingsHandler; // Shared cache between all subclass instances (0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "itemCache", new Map()); (0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "objectCache", new Map()); (0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "storageListenerBound", false); (0, _defineProperty2.default)(AbstractLocalStorageSettingsHandler, "onStorageEvent", e => { if (e.key === null) { _AbstractLocalStorageSettingsHandler.clear(); } else { _AbstractLocalStorageSettingsHandler.itemCache.delete(e.key); _AbstractLocalStorageSettingsHandler.objectCache.delete(e.key); } }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU2V0dGluZ3NIYW5kbGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIiLCJBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciIsIlNldHRpbmdzSGFuZGxlciIsImNsZWFyIiwiaXRlbUNhY2hlIiwib2JqZWN0Q2FjaGUiLCJjb25zdHJ1Y3RvciIsInN0b3JhZ2VMaXN0ZW5lckJvdW5kIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uU3RvcmFnZUV2ZW50IiwiZ2V0SXRlbSIsImtleSIsImhhcyIsInZhbHVlIiwibG9jYWxTdG9yYWdlIiwic2V0IiwiZ2V0IiwiZ2V0Qm9vbGVhbiIsIml0ZW0iLCJnZXRPYmplY3QiLCJKU09OIiwicGFyc2UiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRJdGVtIiwic2V0Qm9vbGVhbiIsInNldE9iamVjdCIsInN0cmluZ2lmeSIsInJlbW92ZUl0ZW0iLCJkZWxldGUiLCJpc1N1cHBvcnRlZCIsInVuZGVmaW5lZCIsInJlc2V0IiwiZXhwb3J0cyIsImRlZmF1bHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiTWFwIiwiZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9BYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBTZXR0aW5nc0hhbmRsZXIgZnJvbSBcIi4vU2V0dGluZ3NIYW5kbGVyXCI7XG5cbi8qKlxuICogQWJzdHJhY3Qgc2V0dGluZ3MgaGFuZGxlciB3cmFwcGluZyBhcm91bmQgbG9jYWxTdG9yYWdlIG1ha2luZyBnZXRWYWx1ZSBjYWxscyBjaGVhcGVyXG4gKiBieSBjYWNoaW5nIHRoZSB2YWx1ZXMgYW5kIGxpc3RlbmluZyBmb3IgbG9jYWxTdG9yYWdlIHVwZGF0ZXMgZnJvbSBvdGhlciB0YWJzLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlciBleHRlbmRzIFNldHRpbmdzSGFuZGxlciB7XG4gICAgLy8gU2hhcmVkIGNhY2hlIGJldHdlZW4gYWxsIHN1YmNsYXNzIGluc3RhbmNlc1xuICAgIHByaXZhdGUgc3RhdGljIGl0ZW1DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG9iamVjdD4oKTtcbiAgICBwcml2YXRlIHN0YXRpYyBzdG9yYWdlTGlzdGVuZXJCb3VuZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgb25TdG9yYWdlRXZlbnQgPSAoZTogU3RvcmFnZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuY2xlYXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLml0ZW1DYWNoZS5kZWxldGUoZS5rZXkpO1xuICAgICAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuZGVsZXRlKGUua2V5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLm9iamVjdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuc3RvcmFnZUxpc3RlbmVyQm91bmQpIHtcbiAgICAgICAgICAgIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLnN0b3JhZ2VMaXN0ZW5lckJvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3Igc3RvcmFnZSBjaGFuZ2VzIGZyb20gb3RoZXIgdGFicyB0byBidXN0IHRoZSBjYWNoZVxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLm9uU3RvcmFnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5pdGVtQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFic3RyYWN0TG9jYWxTdG9yYWdlU2V0dGluZ3NIYW5kbGVyLml0ZW1DYWNoZS5nZXQoa2V5KSE7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIG5leHQgY29uZmlnIGxldmVsXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4oa2V5OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGlmICghQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkhKTtcbiAgICAgICAgICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5vYmplY3RDYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBsb2NhbFN0b3JhZ2Ugb2JqZWN0XCIsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuZ2V0KGtleSkgYXMgVDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5pdGVtQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0Qm9vbGVhbihrZXk6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0SXRlbShrZXksIGAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRPYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiBvYmplY3QpOiB2b2lkIHtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIub2JqZWN0Q2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlcyBib3RoIGl0ZW1zIGFuZCBvYmplY3RzXG4gICAgcHJvdGVjdGVkIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgQWJzdHJhY3RMb2NhbFN0b3JhZ2VTZXR0aW5nc0hhbmRsZXIuaXRlbUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5vYmplY3RDYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBsb2NhbFN0b3JhZ2UgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICBBYnN0cmFjdExvY2FsU3RvcmFnZVNldHRpbmdzSGFuZGxlci5jbGVhcigpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxnQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQWdELElBQUFDLG9DQUFBO0FBUmhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFlQyxtQ0FBbUMsU0FBU0Msd0JBQWUsQ0FBQztFQWV0RixPQUFlQyxLQUFLQSxDQUFBLEVBQVM7SUFDekJGLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNELEtBQUssQ0FBQyxDQUFDO0lBQ3JERixtQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDRixLQUFLLENBQUMsQ0FBQztFQUMzRDtFQUVVRyxXQUFXQSxDQUFBLEVBQUc7SUFDcEIsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJLENBQUNMLG1DQUFtQyxDQUFDTSxvQkFBb0IsRUFBRTtNQUMzRE4sbUNBQW1DLENBQUNNLG9CQUFvQixHQUFHLElBQUk7TUFDL0Q7TUFDQUMsTUFBTSxDQUFDQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUVSLG1DQUFtQyxDQUFDUyxjQUFjLENBQUM7SUFDMUY7RUFDSjtFQUVVQyxPQUFPQSxDQUFDQyxHQUFXLEVBQWlCO0lBQzFDLElBQUksQ0FBQ1gsbUNBQW1DLENBQUNHLFNBQVMsQ0FBQ1MsR0FBRyxDQUFDRCxHQUFHLENBQUMsRUFBRTtNQUN6RCxNQUFNRSxLQUFLLEdBQUdDLFlBQVksQ0FBQ0osT0FBTyxDQUFDQyxHQUFHLENBQUM7TUFDdkNYLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNZLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7TUFDN0QsT0FBT0EsS0FBSztJQUNoQjtJQUVBLE9BQU9iLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNhLEdBQUcsQ0FBQ0wsR0FBRyxDQUFDO0VBQ2pFO0VBRVVNLFVBQVVBLENBQUNOLEdBQVcsRUFBa0I7SUFDOUMsTUFBTU8sSUFBSSxHQUFHLElBQUksQ0FBQ1IsT0FBTyxDQUFDQyxHQUFHLENBQUM7SUFDOUIsSUFBSU8sSUFBSSxLQUFLLE1BQU0sRUFBRSxPQUFPLElBQUk7SUFDaEMsSUFBSUEsSUFBSSxLQUFLLE9BQU8sRUFBRSxPQUFPLEtBQUs7SUFDbEM7SUFDQSxPQUFPLElBQUk7RUFDZjtFQUVVQyxTQUFTQSxDQUFtQlIsR0FBVyxFQUFZO0lBQ3pELElBQUksQ0FBQ1gsbUNBQW1DLENBQUNJLFdBQVcsQ0FBQ1EsR0FBRyxDQUFDRCxHQUFHLENBQUMsRUFBRTtNQUMzRCxJQUFJO1FBQ0EsTUFBTUUsS0FBSyxHQUFHTyxJQUFJLENBQUNDLEtBQUssQ0FBQ1AsWUFBWSxDQUFDSixPQUFPLENBQUNDLEdBQUcsQ0FBRSxDQUFDO1FBQ3BEWCxtQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDVyxHQUFHLENBQUNKLEdBQUcsRUFBRUUsS0FBSyxDQUFDO1FBQy9ELE9BQU9BLEtBQUs7TUFDaEIsQ0FBQyxDQUFDLE9BQU9TLEdBQUcsRUFBRTtRQUNWQyxPQUFPLENBQUNDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRUYsR0FBRyxDQUFDO1FBQ3pELE9BQU8sSUFBSTtNQUNmO0lBQ0o7SUFFQSxPQUFPdEIsbUNBQW1DLENBQUNJLFdBQVcsQ0FBQ1ksR0FBRyxDQUFDTCxHQUFHLENBQUM7RUFDbkU7RUFFVWMsT0FBT0EsQ0FBQ2QsR0FBVyxFQUFFRSxLQUFhLEVBQVE7SUFDaERiLG1DQUFtQyxDQUFDRyxTQUFTLENBQUNZLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7SUFDN0RDLFlBQVksQ0FBQ1csT0FBTyxDQUFDZCxHQUFHLEVBQUVFLEtBQUssQ0FBQztFQUNwQztFQUVVYSxVQUFVQSxDQUFDZixHQUFXLEVBQUVFLEtBQXFCLEVBQVE7SUFDM0QsSUFBSSxDQUFDWSxPQUFPLENBQUNkLEdBQUcsRUFBRSxHQUFHRSxLQUFLLEVBQUUsQ0FBQztFQUNqQztFQUVVYyxTQUFTQSxDQUFDaEIsR0FBVyxFQUFFRSxLQUFhLEVBQVE7SUFDbERiLG1DQUFtQyxDQUFDSSxXQUFXLENBQUNXLEdBQUcsQ0FBQ0osR0FBRyxFQUFFRSxLQUFLLENBQUM7SUFDL0RDLFlBQVksQ0FBQ1csT0FBTyxDQUFDZCxHQUFHLEVBQUVTLElBQUksQ0FBQ1EsU0FBUyxDQUFDZixLQUFLLENBQUMsQ0FBQztFQUNwRDs7RUFFQTtFQUNVZ0IsVUFBVUEsQ0FBQ2xCLEdBQVcsRUFBUTtJQUNwQ0csWUFBWSxDQUFDZSxVQUFVLENBQUNsQixHQUFHLENBQUM7SUFDNUJYLG1DQUFtQyxDQUFDRyxTQUFTLENBQUMyQixNQUFNLENBQUNuQixHQUFHLENBQUM7SUFDekRYLG1DQUFtQyxDQUFDSSxXQUFXLENBQUMwQixNQUFNLENBQUNuQixHQUFHLENBQUM7RUFDL0Q7RUFFT29CLFdBQVdBLENBQUEsRUFBWTtJQUMxQixPQUFPakIsWUFBWSxLQUFLa0IsU0FBUyxJQUFJbEIsWUFBWSxLQUFLLElBQUk7RUFDOUQ7RUFFT21CLEtBQUtBLENBQUEsRUFBUztJQUNqQmpDLG1DQUFtQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztFQUMvQztBQUNKO0FBQUNnQyxPQUFBLENBQUFDLE9BQUEsR0FBQW5DLG1DQUFBO0FBQUFELG9DQUFBLEdBM0Y2QkMsbUNBQW1DO0FBQzdEO0FBQUEsSUFBQW9DLGdCQUFBLENBQUFELE9BQUEsRUFEMEJuQyxtQ0FBbUMsZUFFbEMsSUFBSXFDLEdBQUcsQ0FBd0IsQ0FBQztBQUFBLElBQUFELGdCQUFBLENBQUFELE9BQUEsRUFGakNuQyxtQ0FBbUMsaUJBR2hDLElBQUlxQyxHQUFHLENBQWlCLENBQUM7QUFBQSxJQUFBRCxnQkFBQSxDQUFBRCxPQUFBLEVBSDVCbkMsbUNBQW1DLDBCQUl2QixLQUFLO0FBQUEsSUFBQW9DLGdCQUFBLENBQUFELE9BQUEsRUFKakJuQyxtQ0FBbUMsb0JBTTVCc0MsQ0FBZSxJQUFXO0VBQ3ZELElBQUlBLENBQUMsQ0FBQzNCLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDaEJYLG9DQUFtQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztFQUMvQyxDQUFDLE1BQU07SUFDSEYsb0NBQW1DLENBQUNHLFNBQVMsQ0FBQzJCLE1BQU0sQ0FBQ1EsQ0FBQyxDQUFDM0IsR0FBRyxDQUFDO0lBQzNEWCxvQ0FBbUMsQ0FBQ0ksV0FBVyxDQUFDMEIsTUFBTSxDQUFDUSxDQUFDLENBQUMzQixHQUFHLENBQUM7RUFDakU7QUFDSixDQUFDIiwiaWdub3JlTGlzdCI6W119