UNPKG

@nlabs/gothamjs

Version:
157 lines (156 loc) 17.8 kB
import { jsx as _jsx } from "react/jsx-runtime"; /** * Copyright (c) 2024-Present, Nitrogen Labs, Inc. * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms. */ import { Logger, LoggerDebugLevel } from '@nlabs/arkhamjs-middleware-logger'; import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser'; import { useFlux } from '@nlabs/arkhamjs-utils-react'; import { merge } from '@nlabs/utils'; import i18n from 'i18next'; import { useEffect, useMemo, useState } from 'react'; import { I18nextProvider, initReactI18next } from 'react-i18next'; import { createBrowserRouter, RouterProvider } from 'react-router'; import { GothamActions } from '../../actions/GothamActions.js'; import { Config } from '../../config/appConfig.js'; import { GothamConstants } from '../../constants/GothamConstants.js'; import { gothamApp } from '../../stores/GothamAppStore.js'; import { GothamContext } from '../../utils/GothamContext.js'; import { parseRoutes } from '../../utils/routeUtils.js'; import { GothamRoot } from './GothamRoot.js'; export const defaultGothamConfig = { app: { name: 'gotham', title: 'GothamJS' }, baseUrl: '', isAuth: ()=>false, middleware: [], routes: [], storageType: 'session', stores: [], theme: {}, translations: { translation: {} } }; export const init = (config)=>()=>{ const { onInit } = config; GothamActions.init(); if (onInit) { onInit(); } }; export const signOut = (flux)=>async ()=>{ await flux.clearAppData(); await GothamActions.loading(false); GothamActions.navGoto('/signIn'); }; export const GothamProvider = ({ children, config: appConfig })=>{ const flux = useFlux(); const config = merge(defaultGothamConfig, appConfig); const { isAuth, middleware, routes = [], storageType, stores, i18n: providedI18n, translations } = config; const name = config?.app?.name; const [session, setSession] = useState({}); const router = useMemo(()=>{ return createBrowserRouter([ { Component: GothamRoot, children: parseRoutes(routes), index: false, path: '/' } ]); }, [ routes ]); // Initialize i18next if translations are provided but no i18n instance is given const i18nInstance = useMemo(()=>{ if (providedI18n) { return providedI18n; } if (translations && Object.keys(translations).length > 0) { // Create a new i18next instance and initialize it const newI18n = i18n.createInstance(); newI18n.use(initReactI18next).init({ resources: translations, lng: 'en', fallbackLng: 'en', interpolation: { escapeValue: false } }); return newI18n; } return null; }, [ providedI18n, translations ]); useEffect(()=>{ Config.set(config); if (flux) { const env = Config.get('environment'); const logger = new Logger({ debugLevel: env === 'development' ? LoggerDebugLevel.DISPATCH : LoggerDebugLevel.DISABLED }); const storage = new BrowserStorage({ type: storageType }); flux.init({ middleware: [ logger, ...middleware || [] ], name, // state: {app: {title}}, storage, stores: [ gothamApp, ...stores || [] ] }); flux.on(GothamConstants.SIGN_OUT, signOut(flux)); flux.on(GothamConstants.UPDATE_SESSION, ({ session })=>{ setSession(session); }); } init(config); }, [ flux, config, middleware, name, storageType, stores ]); if (i18nInstance) { return /*#__PURE__*/ _jsx(I18nextProvider, { i18n: i18nInstance, children: /*#__PURE__*/ _jsx(GothamContext.Provider, { value: { Flux: flux, isAuth, session }, children: /*#__PURE__*/ _jsx("div", { children: /*#__PURE__*/ _jsx(RouterProvider, { router: router }) }) }) }); } return /*#__PURE__*/ _jsx(GothamContext.Provider, { value: { Flux: flux, isAuth, session }, children: /*#__PURE__*/ _jsx("div", { children: /*#__PURE__*/ _jsx(RouterProvider, { router: router }) }) }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy92aWV3cy9Hb3RoYW0vR290aGFtUHJvdmlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI0LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0xvZ2dlciwgTG9nZ2VyRGVidWdMZXZlbH0gZnJvbSAnQG5sYWJzL2Fya2hhbWpzLW1pZGRsZXdhcmUtbG9nZ2VyJztcbmltcG9ydCB7QnJvd3NlclN0b3JhZ2V9IGZyb20gJ0BubGFicy9hcmtoYW1qcy1zdG9yYWdlLWJyb3dzZXInO1xuaW1wb3J0IHt1c2VGbHV4fSBmcm9tICdAbmxhYnMvYXJraGFtanMtdXRpbHMtcmVhY3QnO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCBpMThuIGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0kxOG5leHRQcm92aWRlciwgaW5pdFJlYWN0STE4bmV4dH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQge2NyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQge0dvdGhhbUFjdGlvbnN9IGZyb20gJy4uLy4uL2FjdGlvbnMvR290aGFtQWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnL2FwcENvbmZpZy5qcyc7XG5pbXBvcnQge0dvdGhhbUNvbnN0YW50c30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL0dvdGhhbUNvbnN0YW50cy5qcyc7XG5pbXBvcnQge2dvdGhhbUFwcH0gZnJvbSAnLi4vLi4vc3RvcmVzL0dvdGhhbUFwcFN0b3JlLmpzJztcbmltcG9ydCB7R290aGFtQ29udGV4dH0gZnJvbSAnLi4vLi4vdXRpbHMvR290aGFtQ29udGV4dC5qcyc7XG5pbXBvcnQge3BhcnNlUm91dGVzfSBmcm9tICcuLi8uLi91dGlscy9yb3V0ZVV0aWxzLmpzJztcbmltcG9ydCB7R290aGFtUm9vdH0gZnJvbSAnLi9Hb3RoYW1Sb290LmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmssIEZsdXhNaWRkbGV3YXJlVHlwZSwgRmx1eE9wdGlvbnN9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7RkMsIFJlYWN0Tm9kZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge0dvdGhhbVJvdXRlRGF0YX0gZnJvbSAnLi4vLi4vdHlwZXMvZ290aGFtLmpzJztcbmltcG9ydCB0eXBlIHtDdXN0b21Sb3V0ZVByb3BzfSBmcm9tICcuLi8uLi91dGlscy9yb3V0ZVV0aWxzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Qcm92aWRlclByb3BzIHtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbjtcbiAgcmVhZG9ubHkgc2Vzc2lvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBHb3RoYW1Qb3NpdGlvbiA9ICd0JyB8ICd0YycgfCAndGwnIHwgJ3RyJyB8ICdiJyB8ICdiYycgfCAnYnInIHwgJ2JsJztcbmV4cG9ydCB0eXBlIEdvdGhhbVN0YXR1cyA9ICdkZWZhdWx0JyB8ICdlcnJvcicgfCAnaW5mbycgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBUaGVtZURpc3BsYXlNb2RlID0gJ2F1dG8nIHwgJ2RhcmsnIHwgJ2xpZ2h0JztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Db25maWd1cmF0aW9uIHtcbiAgcmVhZG9ubHkgYXBwPzoge1xuICAgIHJlYWRvbmx5IGxvZ28/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZUJhclNlcGFyYXRvcj86IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgYmFzZVVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnPzogRmx1eE9wdGlvbnM7XG4gIHJlYWRvbmx5IGRpc3BsYXlNb2RlPzogVGhlbWVEaXNwbGF5TW9kZTtcbiAgcmVhZG9ubHkgZmx1eD86IEZsdXhGcmFtZXdvcms7XG4gIHJlYWRvbmx5IGlzQXV0aD86ICgpID0+IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1pZGRsZXdhcmU/OiBGbHV4TWlkZGxld2FyZVR5cGVbXTtcbiAgcmVhZG9ubHkgb25Jbml0PzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgcm91dGVzPzogR290aGFtUm91dGVEYXRhW107XG4gIHJlYWRvbmx5IHN0b3JhZ2VUeXBlPzogJ2xvY2FsJyB8ICdzZXNzaW9uJztcbiAgcmVhZG9ubHkgc3RvcmVzPzogdW5rbm93bltdO1xuICByZWFkb25seSB0aGVtZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgaTE4bj86IHR5cGVvZiBpMThuO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdvdGhhbUNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IHtcbiAgYXBwOiB7XG4gICAgbmFtZTogJ2dvdGhhbScsXG4gICAgdGl0bGU6ICdHb3RoYW1KUydcbiAgfSxcbiAgYmFzZVVybDogJycsXG4gIGlzQXV0aDogKCkgPT4gZmFsc2UsXG4gIG1pZGRsZXdhcmU6IFtdLFxuICByb3V0ZXM6IFtdLFxuICBzdG9yYWdlVHlwZTogJ3Nlc3Npb24nLFxuICBzdG9yZXM6IFtdLFxuICB0aGVtZToge30sXG4gIHRyYW5zbGF0aW9uczoge3RyYW5zbGF0aW9uOiB7fX1cbn07XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gKGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbikgPT4gKCk6IHZvaWQgPT4ge1xuICBjb25zdCB7b25Jbml0fSA9IGNvbmZpZztcbiAgR290aGFtQWN0aW9ucy5pbml0KCk7XG5cbiAgaWYob25Jbml0KSB7XG4gICAgb25Jbml0KCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gKGZsdXg6IEZsdXhGcmFtZXdvcmspID0+IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZmx1eC5jbGVhckFwcERhdGEoKTtcbiAgYXdhaXQgR290aGFtQWN0aW9ucy5sb2FkaW5nKGZhbHNlKTtcbiAgR290aGFtQWN0aW9ucy5uYXZHb3RvKCcvc2lnbkluJyk7XG59O1xuXG5leHBvcnQgY29uc3QgR290aGFtUHJvdmlkZXI6IEZDPEdvdGhhbVByb3ZpZGVyUHJvcHM+ID0gKHtjaGlsZHJlbiwgY29uZmlnOiBhcHBDb25maWd9KSA9PiB7XG4gIGNvbnN0IGZsdXggPSB1c2VGbHV4KCk7XG4gIGNvbnN0IGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IG1lcmdlKGRlZmF1bHRHb3RoYW1Db25maWcsIGFwcENvbmZpZyk7XG4gIGNvbnN0IHtcbiAgICBpc0F1dGgsXG4gICAgbWlkZGxld2FyZSxcbiAgICByb3V0ZXMgPSBbXSxcbiAgICBzdG9yYWdlVHlwZSxcbiAgICBzdG9yZXMsXG4gICAgaTE4bjogcHJvdmlkZWRJMThuLFxuICAgIHRyYW5zbGF0aW9uc1xuICB9ID0gY29uZmlnO1xuICBjb25zdCBuYW1lID0gY29uZmlnPy5hcHA/Lm5hbWU7XG4gIGNvbnN0IFtzZXNzaW9uLCBzZXRTZXNzaW9uXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3Qgcm91dGVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJSb3V0ZXIoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBDb21wb25lbnQ6IEdvdGhhbVJvb3QsXG4gICAgICAgICAgY2hpbGRyZW46IHBhcnNlUm91dGVzKHJvdXRlcyBhcyB1bmtub3duIGFzIEN1c3RvbVJvdXRlUHJvcHNbXSksXG4gICAgICAgICAgaW5kZXg6IGZhbHNlLFxuICAgICAgICAgIHBhdGg6ICcvJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgKTtcbiAgfSwgW3JvdXRlc10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBpMThuZXh0IGlmIHRyYW5zbGF0aW9ucyBhcmUgcHJvdmlkZWQgYnV0IG5vIGkxOG4gaW5zdGFuY2UgaXMgZ2l2ZW5cbiAgY29uc3QgaTE4bkluc3RhbmNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHByb3ZpZGVkSTE4bikge1xuICAgICAgcmV0dXJuIHByb3ZpZGVkSTE4bjtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNsYXRpb25zICYmIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGkxOG5leHQgaW5zdGFuY2UgYW5kIGluaXRpYWxpemUgaXRcbiAgICAgIGNvbnN0IG5ld0kxOG4gPSBpMThuLmNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIG5ld0kxOG5cbiAgICAgICAgLnVzZShpbml0UmVhY3RJMThuZXh0KVxuICAgICAgICAuaW5pdCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiB0cmFuc2xhdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4+LFxuICAgICAgICAgIGxuZzogJ2VuJywgLy8gZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgICAgIGZhbGxiYWNrTG5nOiAnZW4nLFxuICAgICAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgICAgIGVzY2FwZVZhbHVlOiBmYWxzZSwgLy8gUmVhY3QgYWxyZWFkeSBlc2NhcGVzIHZhbHVlc1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3STE4bjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW3Byb3ZpZGVkSTE4biwgdHJhbnNsYXRpb25zXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBDb25maWcuc2V0KGNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZihmbHV4KSB7XG4gICAgICBjb25zdCBlbnY6IHN0cmluZyA9IENvbmZpZy5nZXQoJ2Vudmlyb25tZW50JykgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBuZXcgTG9nZ2VyKHtcbiAgICAgICAgZGVidWdMZXZlbDogZW52ID09PSAnZGV2ZWxvcG1lbnQnID8gTG9nZ2VyRGVidWdMZXZlbC5ESVNQQVRDSCA6IExvZ2dlckRlYnVnTGV2ZWwuRElTQUJMRURcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RvcmFnZTogQnJvd3NlclN0b3JhZ2UgPSBuZXcgQnJvd3NlclN0b3JhZ2Uoe3R5cGU6IHN0b3JhZ2VUeXBlfSk7XG5cbiAgICAgIGZsdXguaW5pdCh7XG4gICAgICAgIG1pZGRsZXdhcmU6IFtsb2dnZXIsIC4uLihtaWRkbGV3YXJlIHx8IFtdKV0sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIC8vIHN0YXRlOiB7YXBwOiB7dGl0bGV9fSxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgc3RvcmVzOiBbZ290aGFtQXBwLCAuLi4oc3RvcmVzIHx8IFtdKV1cbiAgICAgIH0pO1xuXG4gICAgICBmbHV4Lm9uKEdvdGhhbUNvbnN0YW50cy5TSUdOX09VVCwgc2lnbk91dChmbHV4KSk7XG4gICAgICBmbHV4Lm9uKEdvdGhhbUNvbnN0YW50cy5VUERBVEVfU0VTU0lPTiwgKHtzZXNzaW9ufSkgPT4ge1xuICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdChjb25maWcpO1xuICB9LCBbZmx1eCwgY29uZmlnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yYWdlVHlwZSwgc3RvcmVzXSk7XG5cbiAgaWYoaTE4bkluc3RhbmNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxJMThuZXh0UHJvdmlkZXIgaTE4bj17aTE4bkluc3RhbmNlfT5cbiAgICAgICAgPEdvdGhhbUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3tGbHV4OiBmbHV4LCBpc0F1dGgsIHNlc3Npb259fT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPFJvdXRlclByb3ZpZGVyIHJvdXRlcj17cm91dGVyfS8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvR290aGFtQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSTE4bmV4dFByb3ZpZGVyPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxHb3RoYW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7Rmx1eDogZmx1eCwgaXNBdXRoLCBzZXNzaW9ufX0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8Um91dGVyUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9Lz5cbiAgICAgIDwvZGl2PlxuICAgIDwvR290aGFtQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07Il0sIm5hbWVzIjpbIkxvZ2dlciIsIkxvZ2dlckRlYnVnTGV2ZWwiLCJCcm93c2VyU3RvcmFnZSIsInVzZUZsdXgiLCJtZXJnZSIsImkxOG4iLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJJMThuZXh0UHJvdmlkZXIiLCJpbml0UmVhY3RJMThuZXh0IiwiY3JlYXRlQnJvd3NlclJvdXRlciIsIlJvdXRlclByb3ZpZGVyIiwiR290aGFtQWN0aW9ucyIsIkNvbmZpZyIsIkdvdGhhbUNvbnN0YW50cyIsImdvdGhhbUFwcCIsIkdvdGhhbUNvbnRleHQiLCJwYXJzZVJvdXRlcyIsIkdvdGhhbVJvb3QiLCJkZWZhdWx0R290aGFtQ29uZmlnIiwiYXBwIiwibmFtZSIsInRpdGxlIiwiYmFzZVVybCIsImlzQXV0aCIsIm1pZGRsZXdhcmUiLCJyb3V0ZXMiLCJzdG9yYWdlVHlwZSIsInN0b3JlcyIsInRoZW1lIiwidHJhbnNsYXRpb25zIiwidHJhbnNsYXRpb24iLCJpbml0IiwiY29uZmlnIiwib25Jbml0Iiwic2lnbk91dCIsImZsdXgiLCJjbGVhckFwcERhdGEiLCJsb2FkaW5nIiwibmF2R290byIsIkdvdGhhbVByb3ZpZGVyIiwiY2hpbGRyZW4iLCJhcHBDb25maWciLCJwcm92aWRlZEkxOG4iLCJzZXNzaW9uIiwic2V0U2Vzc2lvbiIsInJvdXRlciIsIkNvbXBvbmVudCIsImluZGV4IiwicGF0aCIsImkxOG5JbnN0YW5jZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJuZXdJMThuIiwiY3JlYXRlSW5zdGFuY2UiLCJ1c2UiLCJyZXNvdXJjZXMiLCJsbmciLCJmYWxsYmFja0xuZyIsImludGVycG9sYXRpb24iLCJlc2NhcGVWYWx1ZSIsInNldCIsImVudiIsImdldCIsImxvZ2dlciIsImRlYnVnTGV2ZWwiLCJESVNQQVRDSCIsIkRJU0FCTEVEIiwic3RvcmFnZSIsInR5cGUiLCJvbiIsIlNJR05fT1VUIiwiVVBEQVRFX1NFU1NJT04iLCJQcm92aWRlciIsInZhbHVlIiwiRmx1eCIsImRpdiJdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLE1BQU0sRUFBRUMsZ0JBQWdCLFFBQU8sb0NBQW9DO0FBQzNFLFNBQVFDLGNBQWMsUUFBTyxrQ0FBa0M7QUFDL0QsU0FBUUMsT0FBTyxRQUFPLDhCQUE4QjtBQUNwRCxTQUFRQyxLQUFLLFFBQU8sZUFBZTtBQUNuQyxPQUFPQyxVQUFVLFVBQVU7QUFDM0IsU0FBUUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsUUFBTyxRQUFRO0FBQ25ELFNBQVFDLGVBQWUsRUFBRUMsZ0JBQWdCLFFBQU8sZ0JBQWdCO0FBQ2hFLFNBQVFDLG1CQUFtQixFQUFFQyxjQUFjLFFBQU8sZUFBZTtBQUVq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