matrix-react-sdk
Version:
SDK for matrix.org using React
113 lines (108 loc) • 16.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useUserOnboardingContext = useUserOnboardingContext;
var _logger = require("matrix-js-sdk/src/logger");
var _matrix = require("matrix-js-sdk/src/matrix");
var _react = require("react");
var _Notifier = require("../Notifier");
var _DMRoomMap = _interopRequireDefault(require("../utils/DMRoomMap"));
var _MatrixClientContext = require("../contexts/MatrixClientContext");
var _useSettings = require("./useSettings");
var _useEventEmitter = require("./useEventEmitter");
/*
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.
*/
const USER_ONBOARDING_CONTEXT_INTERVAL = 5000;
/**
* Returns a persistent, non-changing reference to a function
* This function proxies all its calls to the current value of the given input callback
*
* This allows you to use the current value of e.g., a state in a callback that’s used by e.g., a useEventEmitter or
* similar hook without re-registering the hook when the state changes
* @param value changing callback
*/
function useRefOf(value) {
const ref = (0, _react.useRef)(value);
ref.current = value;
return (0, _react.useCallback)((...values) => ref.current(...values), []);
}
function useUserOnboardingContextValue(defaultValue, callback) {
const [value, setValue] = (0, _react.useState)(defaultValue);
const cli = (0, _MatrixClientContext.useMatrixClientContext)();
const handler = useRefOf(callback);
(0, _react.useEffect)(() => {
if (value) {
return;
}
let handle = null;
let enabled = true;
const repeater = async () => {
if (handle !== null) {
clearTimeout(handle);
handle = null;
}
setValue(await handler(cli));
if (enabled) {
handle = window.setTimeout(repeater, USER_ONBOARDING_CONTEXT_INTERVAL);
}
};
repeater().catch(err => _logger.logger.warn("could not update user onboarding context", err));
cli.on(_matrix.ClientEvent.AccountData, repeater);
return () => {
enabled = false;
cli.off(_matrix.ClientEvent.AccountData, repeater);
if (handle !== null) {
clearTimeout(handle);
handle = null;
}
};
}, [cli, handler, value]);
return value;
}
function useShowNotificationsPrompt() {
const client = (0, _MatrixClientContext.useMatrixClientContext)();
const [value, setValue] = (0, _react.useState)(client.pushRules ? _Notifier.Notifier.shouldShowPrompt() : true);
const updateValue = (0, _react.useCallback)(() => {
setValue(client.pushRules ? _Notifier.Notifier.shouldShowPrompt() : true);
}, [client]);
(0, _useEventEmitter.useEventEmitter)(_Notifier.Notifier, _Notifier.NotifierEvent.NotificationHiddenChange, () => {
updateValue();
});
const setting = (0, _useSettings.useSettingValue)("notificationsEnabled");
(0, _react.useEffect)(() => {
updateValue();
}, [setting, updateValue]);
// shouldShowPrompt is dependent on the client having push rules. There isn't an event for the client
// fetching its push rules, but we'll know it has them by the time it sync, so we update this on sync.
(0, _useEventEmitter.useTypedEventEmitter)(client, _matrix.ClientEvent.Sync, updateValue);
return value;
}
function useUserOnboardingContext() {
const hasAvatar = useUserOnboardingContextValue(false, async cli => {
const profile = await cli.getProfileInfo(cli.getUserId());
return Boolean(profile?.avatar_url);
});
const hasDevices = useUserOnboardingContextValue(false, async cli => {
const myDevice = cli.getDeviceId();
const devices = await cli.getDevices();
return Boolean(devices.devices.find(device => device.device_id !== myDevice));
});
const hasDmRooms = useUserOnboardingContextValue(false, async () => {
const dmRooms = _DMRoomMap.default.shared().getUniqueRoomsWithIndividuals() ?? {};
return Boolean(Object.keys(dmRooms).length);
});
const showNotificationsPrompt = useShowNotificationsPrompt();
return (0, _react.useMemo)(() => ({
hasAvatar,
hasDevices,
hasDmRooms,
showNotificationsPrompt
}), [hasAvatar, hasDevices, hasDmRooms, showNotificationsPrompt]);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfcmVhY3QiLCJfTm90aWZpZXIiLCJfRE1Sb29tTWFwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX3VzZVNldHRpbmdzIiwiX3VzZUV2ZW50RW1pdHRlciIsIlVTRVJfT05CT0FSRElOR19DT05URVhUX0lOVEVSVkFMIiwidXNlUmVmT2YiLCJ2YWx1ZSIsInJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJ1c2VDYWxsYmFjayIsInZhbHVlcyIsInVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dFZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiY2FsbGJhY2siLCJzZXRWYWx1ZSIsInVzZVN0YXRlIiwiY2xpIiwidXNlTWF0cml4Q2xpZW50Q29udGV4dCIsImhhbmRsZXIiLCJ1c2VFZmZlY3QiLCJoYW5kbGUiLCJlbmFibGVkIiwicmVwZWF0ZXIiLCJjbGVhclRpbWVvdXQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJlcnIiLCJsb2dnZXIiLCJ3YXJuIiwib24iLCJDbGllbnRFdmVudCIsIkFjY291bnREYXRhIiwib2ZmIiwidXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQiLCJjbGllbnQiLCJwdXNoUnVsZXMiLCJOb3RpZmllciIsInNob3VsZFNob3dQcm9tcHQiLCJ1cGRhdGVWYWx1ZSIsInVzZUV2ZW50RW1pdHRlciIsIk5vdGlmaWVyRXZlbnQiLCJOb3RpZmljYXRpb25IaWRkZW5DaGFuZ2UiLCJzZXR0aW5nIiwidXNlU2V0dGluZ1ZhbHVlIiwidXNlVHlwZWRFdmVudEVtaXR0ZXIiLCJTeW5jIiwidXNlVXNlck9uYm9hcmRpbmdDb250ZXh0IiwiaGFzQXZhdGFyIiwicHJvZmlsZSIsImdldFByb2ZpbGVJbmZvIiwiZ2V0VXNlcklkIiwiQm9vbGVhbiIsImF2YXRhcl91cmwiLCJoYXNEZXZpY2VzIiwibXlEZXZpY2UiLCJnZXREZXZpY2VJZCIsImRldmljZXMiLCJnZXREZXZpY2VzIiwiZmluZCIsImRldmljZSIsImRldmljZV9pZCIsImhhc0RtUm9vbXMiLCJkbVJvb21zIiwiRE1Sb29tTWFwIiwic2hhcmVkIiwiZ2V0VW5pcXVlUm9vbXNXaXRoSW5kaXZpZHVhbHMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwic2hvd05vdGlmaWNhdGlvbnNQcm9tcHQiLCJ1c2VNZW1vIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZVVzZXJPbmJvYXJkaW5nQ29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBDbGllbnRFdmVudCwgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBOb3RpZmllciwgTm90aWZpZXJFdmVudCB9IGZyb20gXCIuLi9Ob3RpZmllclwiO1xuaW1wb3J0IERNUm9vbU1hcCBmcm9tIFwiLi4vdXRpbHMvRE1Sb29tTWFwXCI7XG5pbXBvcnQgeyB1c2VNYXRyaXhDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZVNldHRpbmdWYWx1ZSB9IGZyb20gXCIuL3VzZVNldHRpbmdzXCI7XG5pbXBvcnQgeyB1c2VFdmVudEVtaXR0ZXIsIHVzZVR5cGVkRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4vdXNlRXZlbnRFbWl0dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9uYm9hcmRpbmdDb250ZXh0IHtcbiAgICBoYXNBdmF0YXI6IGJvb2xlYW47XG4gICAgaGFzRGV2aWNlczogYm9vbGVhbjtcbiAgICBoYXNEbVJvb21zOiBib29sZWFuO1xuICAgIHNob3dOb3RpZmljYXRpb25zUHJvbXB0OiBib29sZWFuO1xufVxuXG5jb25zdCBVU0VSX09OQk9BUkRJTkdfQ09OVEVYVF9JTlRFUlZBTCA9IDUwMDA7XG5cbi8qKlxuICogUmV0dXJucyBhIHBlcnNpc3RlbnQsIG5vbi1jaGFuZ2luZyByZWZlcmVuY2UgdG8gYSBmdW5jdGlvblxuICogVGhpcyBmdW5jdGlvbiBwcm94aWVzIGFsbCBpdHMgY2FsbHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGlucHV0IGNhbGxiYWNrXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHVzZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBlLmcuLCBhIHN0YXRlIGluIGEgY2FsbGJhY2sgdGhhdOKAmXMgdXNlZCBieSBlLmcuLCBhIHVzZUV2ZW50RW1pdHRlciBvclxuICogc2ltaWxhciBob29rIHdpdGhvdXQgcmUtcmVnaXN0ZXJpbmcgdGhlIGhvb2sgd2hlbiB0aGUgc3RhdGUgY2hhbmdlc1xuICogQHBhcmFtIHZhbHVlIGNoYW5naW5nIGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHVzZVJlZk9mPFQgZXh0ZW5kcyBhbnlbXSwgUj4odmFsdWU6ICguLi52YWx1ZXM6IFQpID0+IFIpOiAoLi4udmFsdWVzOiBUKSA9PiBSIHtcbiAgICBjb25zdCByZWYgPSB1c2VSZWYodmFsdWUpO1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHVzZUNhbGxiYWNrKCguLi52YWx1ZXM6IFQpID0+IHJlZi5jdXJyZW50KC4uLnZhbHVlcyksIFtdKTtcbn1cblxuZnVuY3Rpb24gdXNlVXNlck9uYm9hcmRpbmdDb250ZXh0VmFsdWU8VD4oZGVmYXVsdFZhbHVlOiBULCBjYWxsYmFjazogKGNsaTogTWF0cml4Q2xpZW50KSA9PiBQcm9taXNlPFQ+KTogVCB7XG4gICAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZTxUPihkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGNsaSA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSB1c2VSZWZPZihjYWxsYmFjayk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYW5kbGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlcGVhdGVyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRWYWx1ZShhd2FpdCBoYW5kbGVyKGNsaSkpO1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChyZXBlYXRlciwgVVNFUl9PTkJPQVJESU5HX0NPTlRFWFRfSU5URVJWQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXBlYXRlcigpLmNhdGNoKChlcnIpID0+IGxvZ2dlci53YXJuKFwiY291bGQgbm90IHVwZGF0ZSB1c2VyIG9uYm9hcmRpbmcgY29udGV4dFwiLCBlcnIpKTtcbiAgICAgICAgY2xpLm9uKENsaWVudEV2ZW50LkFjY291bnREYXRhLCByZXBlYXRlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjbGkub2ZmKENsaWVudEV2ZW50LkFjY291bnREYXRhLCByZXBlYXRlcik7XG4gICAgICAgICAgICBpZiAoaGFuZGxlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbY2xpLCBoYW5kbGVyLCB2YWx1ZV0pO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpZW50ID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuXG4gICAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZTxib29sZWFuPihjbGllbnQucHVzaFJ1bGVzID8gTm90aWZpZXIuc2hvdWxkU2hvd1Byb21wdCgpIDogdHJ1ZSk7XG5cbiAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0VmFsdWUoY2xpZW50LnB1c2hSdWxlcyA/IE5vdGlmaWVyLnNob3VsZFNob3dQcm9tcHQoKSA6IHRydWUpO1xuICAgIH0sIFtjbGllbnRdKTtcblxuICAgIHVzZUV2ZW50RW1pdHRlcihOb3RpZmllciwgTm90aWZpZXJFdmVudC5Ob3RpZmljYXRpb25IaWRkZW5DaGFuZ2UsICgpID0+IHtcbiAgICAgICAgdXBkYXRlVmFsdWUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNldHRpbmcgPSB1c2VTZXR0aW5nVmFsdWUoXCJub3RpZmljYXRpb25zRW5hYmxlZFwiKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICB1cGRhdGVWYWx1ZSgpO1xuICAgIH0sIFtzZXR0aW5nLCB1cGRhdGVWYWx1ZV0pO1xuXG4gICAgLy8gc2hvdWxkU2hvd1Byb21wdCBpcyBkZXBlbmRlbnQgb24gdGhlIGNsaWVudCBoYXZpbmcgcHVzaCBydWxlcy4gVGhlcmUgaXNuJ3QgYW4gZXZlbnQgZm9yIHRoZSBjbGllbnRcbiAgICAvLyBmZXRjaGluZyBpdHMgcHVzaCBydWxlcywgYnV0IHdlJ2xsIGtub3cgaXQgaGFzIHRoZW0gYnkgdGhlIHRpbWUgaXQgc3luYywgc28gd2UgdXBkYXRlIHRoaXMgb24gc3luYy5cbiAgICB1c2VUeXBlZEV2ZW50RW1pdHRlcihjbGllbnQsIENsaWVudEV2ZW50LlN5bmMsIHVwZGF0ZVZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dCgpOiBVc2VyT25ib2FyZGluZ0NvbnRleHQge1xuICAgIGNvbnN0IGhhc0F2YXRhciA9IHVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dFZhbHVlKGZhbHNlLCBhc3luYyAoY2xpKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBjbGkuZ2V0UHJvZmlsZUluZm8oY2xpLmdldFVzZXJJZCgpISk7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHByb2ZpbGU/LmF2YXRhcl91cmwpO1xuICAgIH0pO1xuICAgIGNvbnN0IGhhc0RldmljZXMgPSB1c2VVc2VyT25ib2FyZGluZ0NvbnRleHRWYWx1ZShmYWxzZSwgYXN5bmMgKGNsaSkgPT4ge1xuICAgICAgICBjb25zdCBteURldmljZSA9IGNsaS5nZXREZXZpY2VJZCgpO1xuICAgICAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgY2xpLmdldERldmljZXMoKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZGV2aWNlcy5kZXZpY2VzLmZpbmQoKGRldmljZSkgPT4gZGV2aWNlLmRldmljZV9pZCAhPT0gbXlEZXZpY2UpKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYXNEbVJvb21zID0gdXNlVXNlck9uYm9hcmRpbmdDb250ZXh0VmFsdWUoZmFsc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZG1Sb29tcyA9IERNUm9vbU1hcC5zaGFyZWQoKS5nZXRVbmlxdWVSb29tc1dpdGhJbmRpdmlkdWFscygpID8/IHt9O1xuICAgICAgICByZXR1cm4gQm9vbGVhbihPYmplY3Qua2V5cyhkbVJvb21zKS5sZW5ndGgpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNob3dOb3RpZmljYXRpb25zUHJvbXB0ID0gdXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQoKTtcblxuICAgIHJldHVybiB1c2VNZW1vKFxuICAgICAgICAoKSA9PiAoeyBoYXNBdmF0YXIsIGhhc0RldmljZXMsIGhhc0RtUm9vbXMsIHNob3dOb3RpZmljYXRpb25zUHJvbXB0IH0pLFxuICAgICAgICBbaGFzQXZhdGFyLCBoYXNEZXZpY2VzLCBoYXNEbVJvb21zLCBzaG93Tm90aWZpY2F0aW9uc1Byb21wdF0sXG4gICAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLG9CQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxnQkFBQSxHQUFBUixPQUFBO0FBaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQW1CQSxNQUFNUyxnQ0FBZ0MsR0FBRyxJQUFJOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsUUFBUUEsQ0FBcUJDLEtBQTBCLEVBQXVCO0VBQ25GLE1BQU1DLEdBQUcsR0FBRyxJQUFBQyxh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SixXQUFXLENBQUMsQ0FBQzs7RUFFMUI7RUFDQTtFQUNBLElBQUFNLHFDQUFvQixFQUFDVixNQUFNLEVBQUVKLG1CQUFXLENBQUNlLElBQUksRUFBRVAsV0FBVyxDQUFDO0VBRTNELE9BQU9sQyxLQUFLO0FBQ2hCO0FBRU8sU0FBUzBDLHdCQUF3QkEsQ0FBQSxFQUEwQjtFQUM5RCxNQUFNQyxTQUFTLEdBQUdyQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsTUFBT0ssR0FBRyxJQUFLO0lBQ2xFLE1BQU1pQyxPQUFPLEdBQUcsTUFBTWpDLEdBQUcsQ0FBQ2tDLGNBQWMsQ0FBQ2xDLEdBQUcsQ0FBQ21DLFNBQVMsQ0FBQyxDQUFFLENBQUM7SUFDMUQsT0FBT0MsT0FBTyxDQUFDSCxPQUFPLEVBQUVJLFVBQVUsQ0FBQztFQUN2QyxDQUFDLENBQUM7RUFDRixNQUFNQyxVQUFVLEdBQUczQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsTUFBT0ssR0FBRyxJQUFLO0lBQ25FLE1BQU11QyxRQUFRLEdBQUd2QyxHQUFHLENBQUN3QyxXQUFXLENBQUMsQ0FBQztJQUNsQyxNQUFNQyxPQUFPLEdBQUcsTUFBTXpDLEdBQUcsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE9BQU9OLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDQSxPQUFPLENBQUNFLElBQUksQ0FBRUMsTUFBTSxJQUFLQSxNQUFNLENBQUNDLFNBQVMsS0FBS04sUUFBUSxDQUFDLENBQUM7RUFDbkYsQ0FBQyxDQUFDO0VBQ0YsTUFBTU8sVUFBVSxHQUFHbkQsNkJBQTZCLENBQUMsS0FBSyxFQUFFLFlBQVk7SUFDaEUsTUFBTW9ELE9BQU8sR0FBR0Msa0JBQVMsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxPQUFPZCxPQUFPLENBQUNlLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDTCxPQUFPLENBQUMsQ0FBQ00sTUFBTSxDQUFDO0VBQy9DLENBQUMsQ0FBQztFQUNGLE1BQU1DLHVCQUF1QixHQUFHcEMsMEJBQTBCLENBQUMsQ0FBQztFQUU1RCxPQUFPLElBQUFxQyxjQUFPLEVBQ1YsT0FBTztJQUFFdkIsU0FBUztJQUFFTSxVQUFVO0lBQUVRLFVBQVU7SUFBRVE7RUFBd0IsQ0FBQyxDQUFDLEVBQ3RFLENBQUN0QixTQUFTLEVBQUVNLFVBQVUsRUFBRVEsVUFBVSxFQUFFUSx1QkFBdUIsQ0FDL0QsQ0FBQztBQUNMIiwiaWdub3JlTGlzdCI6W119