diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..7d9035e7a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "react-hooks", + "@typescript-eslint" + ], + "rules": { + "react-hooks/exhaustive-deps": "off", + "@typescript-eslint/no-explicit-any": "off", + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-namespace": "off", + "import/no-extraneous-dependencies": "off", + "@typescript-eslint/ban-types": "off", + "react/no-unescaped-entities": "off", + "no-async-promise-executor": "off", + "react/no-children-prop": "off", + "no-extra-boolean-cast": "off", + "react/display-name": "off", + "prefer-const": "off", + "no-console": "off", + "no-debugger": "off" + }, + "settings": { + "react": { + "version": "detect" + } + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index ac20847e7..b7a67043e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.2.0-beta.12](https://github.com/WatchItDev/watchit-app/compare/v2.2.0-beta.11...v2.2.0-beta.12) (2025-01-10) + + +### Bug Fixes + +* correct carousel index update on profile selection ([012dfe4](https://github.com/WatchItDev/watchit-app/commit/012dfe4618a588d9a364c6a6b6461216349dfdca)) + # [2.2.0-beta.11](https://github.com/WatchItDev/watchit-app/compare/v2.2.0-beta.10...v2.2.0-beta.11) (2025-01-10) diff --git a/index.html b/index.html index a28f23d68..35c240419 100644 --- a/index.html +++ b/index.html @@ -42,23 +42,6 @@ rel="stylesheet" /> - Watchit App - - - - - - - - - - - - - - - - diff --git a/package-lock.json b/package-lock.json index 5d01a3d9d..ecdbbc188 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,14 @@ { "name": "watchit", - "version": "2.2.0-beta.7", + "version": "2.2.0-beta.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "watchit", - "version": "2.2.0-beta.7", + "version": "2.2.0-beta.12", "dependencies": { + "@emailjs/browser": "^4.4.1", "@helia/unixfs": "^4.0.1", "@hookform/resolvers": "^3.1.1", "@iconify/react": "^4.1.1", @@ -2372,6 +2373,15 @@ "@noble/ciphers": "^1.0.0" } }, + "node_modules/@emailjs/browser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-4.4.1.tgz", + "integrity": "sha512-DGSlP9sPvyFba3to2A50kDtZ+pXVp/0rhmqs2LmbMS3I5J8FSOgLwzY2Xb4qfKlOVHh29EAutLYwe5yuEZmEFg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", diff --git a/package.json b/package.json index 4df88f4b1..02479319f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "watchit", "author": "Watchit", "type": "module", - "version": "2.2.0-beta.11", + "version": "2.2.0-beta.12", "description": "Open videos everywhere", "email": "info@watchit.movie", "private": true, @@ -43,6 +43,7 @@ ] }, "dependencies": { + "@emailjs/browser": "^4.4.1", "@helia/unixfs": "^4.0.1", "@hookform/resolvers": "^3.1.1", "@iconify/react": "^4.1.1", diff --git a/src/App.tsx b/src/App.tsx index 11e710f58..844e0cd6d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -98,20 +98,20 @@ export default function App() { themeStretch: false, }} > - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/auth/context/web3Auth/config/web3AuthSettings.ts b/src/auth/context/web3Auth/config/web3AuthSettings.ts index e90a222e9..4491d963a 100644 --- a/src/auth/context/web3Auth/config/web3AuthSettings.ts +++ b/src/auth/context/web3Auth/config/web3AuthSettings.ts @@ -122,6 +122,7 @@ export function web3AuthFactory(): Web3Auth { }); const web3AuthOptions: Web3AuthOptions = { + sessionTime: 60 * 60 * 24 * 30, // 30 days privateKeyProvider, accountAbstractionProvider, chainConfig: chain.polygonAmoy, diff --git a/src/components/animate/motion-lazy.tsx b/src/components/animate/motion-lazy.tsx index 5f2f9a367..60e8d8054 100644 --- a/src/components/animate/motion-lazy.tsx +++ b/src/components/animate/motion-lazy.tsx @@ -2,7 +2,7 @@ import { LazyMotion, m } from 'framer-motion'; // ---------------------------------------------------------------------- -// eslint-disable-next-line import/extensions +// @ts-ignore const loadFeatures = () => import('./features.js').then((res) => res.default); type Props = { diff --git a/src/components/avatar/avatar.tsx b/src/components/avatar/avatar.tsx new file mode 100644 index 000000000..e00be6143 --- /dev/null +++ b/src/components/avatar/avatar.tsx @@ -0,0 +1,23 @@ +// @mui +import Avatar from '@mui/material/Avatar'; +import {FC} from "react"; +import {dicebear} from "@src/utils/dicebear.ts"; + +interface AvatarProfileProps { + src: string; + alt?: string; + sx?: any; + [x: string]: any; +} + +const AvatarProfile: FC = ({ src, alt, sx, ...other }) => { + + //Check if src is a valid URL starting with http or https; if not, use the dicebear API to generate a random avatar + if (!src.startsWith('http') && !src.startsWith('https')) { src = dicebear(src) } + + return ( + + ) +} + +export default AvatarProfile; diff --git a/src/components/avatar/index.ts b/src/components/avatar/index.ts new file mode 100644 index 000000000..6295197ce --- /dev/null +++ b/src/components/avatar/index.ts @@ -0,0 +1 @@ +export * from '@src/components/avatar'; diff --git a/src/components/carousel/variants/carousel-main.tsx b/src/components/carousel/variants/carousel-main.tsx index de4d73d45..8a13e60fd 100644 --- a/src/components/carousel/variants/carousel-main.tsx +++ b/src/components/carousel/variants/carousel-main.tsx @@ -15,9 +15,7 @@ import { varFade } from '@src/components/animate'; import Carousel, { CarouselDots, useCarousel } from '@src/components/carousel/index'; import { IconFlagFilled, IconPlayerPlay } from '@tabler/icons-react'; import Stack from '@mui/material/Stack'; - // @ts-ignore -// eslint-disable-next-line import/no-extraneous-dependencies import { type Post } from '@lens-protocol/api-bindings/dist/declarations/src/lens/graphql/generated'; import { paths } from '@src/routes/paths.ts'; import { useRouter } from '@src/routes/hooks'; diff --git a/src/components/login-modal/modal.tsx b/src/components/login-modal/modal.tsx index 16bd6eea6..12fb355ad 100644 --- a/src/components/login-modal/modal.tsx +++ b/src/components/login-modal/modal.tsx @@ -1,5 +1,5 @@ // REACT IMPORTS -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; // MUI IMPORTS import { Backdrop, Box, Fade, Modal } from '@mui/material'; @@ -13,9 +13,12 @@ import { ProfileSelectView } from '@src/components/login-modal/profile-select-vi import { ProfileFormView } from '@src/components/login-modal/profile-form-view.tsx'; import { WatchitLoader } from '../watchit-loader'; import { useDispatch, useSelector } from 'react-redux'; -import { closeLoginModal } from '@redux/auth'; +import {closeLoginModal, setEmail} from '@redux/auth'; import { notifySuccess } from '@notifications/internal-notifications.ts'; import { SUCCESS } from '@notifications/success.ts'; +// @ts-ignore +import {type AuthUserInfo} from "@web3auth/auth/dist/types/utils/interfaces"; +import useReferrals from '@src/hooks/use-referrals.ts'; // ---------------------------------------------------------------------- @@ -35,6 +38,7 @@ export const LoginModal: React.FC = ({ open, onClose }) => { const sessionData = useSelector((state: any) => state.auth.session); const { execute: logoutExecute } = useLogout(); const { execute: loginExecute, error } = useLogin(); + const { acceptOrCreateInvitationForUser } = useReferrals(); const dispatch = useDispatch(); useEffect(() => { @@ -45,6 +49,9 @@ export const LoginModal: React.FC = ({ open, onClose }) => { method: 'eth_accounts', }); + // Obtain user info from the provider to get the email + await w3.getUserInfo().then((r:Partial) => dispatch(setEmail(r?.email))); + if (accounts && accounts.length > 0) { setAddress(accounts[0]); } @@ -66,6 +73,12 @@ export const LoginModal: React.FC = ({ open, onClose }) => { await w3?.connect(); setView('profile'); setLoading(false); + + // Once the user is authenticated, store the session expiration + const sessionTimeMs = 60 * 60 * 24 * 30 * 1000; // 30 days + const expirationTimestamp = Date.now() + sessionTimeMs; + localStorage.setItem("sessionExpiration", expirationTimestamp.toString()); + } catch (err) { onClose(); w3?.loginModal.closeModal(); @@ -76,10 +89,11 @@ export const LoginModal: React.FC = ({ open, onClose }) => { } }, [open, view, w3.connected]); - const handleProfileCreateSuccess = () => { + const handleProfileCreateSuccess = useCallback(() => { + acceptOrCreateInvitationForUser(); notifySuccess(SUCCESS.PROFILE_CREATED_SUCCESSFULLY); dispatch(closeLoginModal()); - }; + }, []); const handleLogin = async (profile?: Profile) => { if (!profile || !address) return; @@ -100,6 +114,12 @@ export const LoginModal: React.FC = ({ open, onClose }) => { setAddress(''); }; + const handleBackdropClick = () => { + if (view === 'profile') { + onClose(); + } + }; + return ( <> = ({ open, onClose }) => { onClose={onClose} closeAfterTransition BackdropComponent={Backdrop} - BackdropProps={{ timeout: 500, onClick: () => {} }} + BackdropProps={{ timeout: 500, onClick: handleBackdropClick }} > = ({ username: Yup.string() .min(5, 'Username must be at least 5 characters') .required('Username is required'), - name: Yup.string().required('Name is required'), - bio: Yup.string().required('Bio is required'), + name: Yup.string().min(3, 'Name must be at least 3 characters').required('Name is required'), + bio: Yup.string().min(10, 'Bio must be at least 10 characters').required('Bio is required'), socialLinks: Yup.object({ twitter: Yup.string().url('Enter a valid URL'), instagram: Yup.string().url('Enter a valid URL'), @@ -378,12 +378,12 @@ export const ProfileFormView: React.FC = ({ }} /> {/* Avatar */} - profileImageInputRef.current?.click()} diff --git a/src/components/og-meta-tags.tsx b/src/components/og-meta-tags.tsx new file mode 100644 index 000000000..8a4b8fdef --- /dev/null +++ b/src/components/og-meta-tags.tsx @@ -0,0 +1,48 @@ +import { Helmet } from 'react-helmet-async'; +import { PropsWithChildren } from 'react'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; + +interface OgMetaTagsProps { + title: string; + description: string; + image?: string; + url: string; + type?: string; // e.g. "website", "article", "profile", ... + twitterCard?: string; // default usually "summary_large_image" + siteName?: string; // optional: e.g. "Watchit App" +} + +export function OgMetaTags({ + title, + description, + image = GLOBAL_CONSTANTS.LOGO_URL, + url, + type = 'website', + twitterCard = 'summary_large_image', + siteName, + children + }: PropsWithChildren) { + return ( + <> + + {/* HTML Title (Also used in browser tab) */} + {title} + + {/* Open Graph / Facebook */} + + {siteName && } + + + + + + {/* Twitter */} + + + + + + {children} + + ); +} diff --git a/src/components/openable-text/openable-text.tsx b/src/components/openable-text/openable-text.tsx index 913219969..8e91a7d85 100644 --- a/src/components/openable-text/openable-text.tsx +++ b/src/components/openable-text/openable-text.tsx @@ -1,23 +1,27 @@ import { FC } from 'react'; import { Tooltip, IconButton, Typography, Stack } from '@mui/material'; import { Icon } from '@iconify/react'; +import { SxProps } from '@mui/system'; +import { Theme } from '@mui/material/styles/createTheme'; const openIcon = 'mdi:open-in-new'; interface OpenableTextProps { label: string; url: string; + sx?: SxProps; + labelSx?: SxProps; } -const OpenableText: FC = ({ label, url }) => { +const OpenableText: FC = ({ label, url, sx, labelSx }) => { const handleOpen = () => { window.open(url, '_blank'); }; return ( - - {label} - + + {label} + diff --git a/src/components/poster/variants/poster-creators.tsx b/src/components/poster/variants/poster-creators.tsx index f9eb885a9..c08b326da 100644 --- a/src/components/poster/variants/poster-creators.tsx +++ b/src/components/poster/variants/poster-creators.tsx @@ -8,8 +8,9 @@ import { paths } from '@src/routes/paths.ts'; import { TrendingTopicsType } from '@src/sections/explore/view.tsx'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; -import Avatar from '@mui/material/Avatar'; import ListItemText from '@mui/material/ListItemText'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import {dicebear} from "@src/utils/dicebear.ts"; const randomImages = [ 'https://storage.needpix.com/rsynced_images/banner-header-1449745071UBW.jpg', @@ -77,9 +78,9 @@ const PosterCreators = ({ id }: TrendingTopicsType) => { p: (theme) => theme.spacing(0, 2, 1, 2), }} > - diff --git a/src/components/poster/variants/poster-top-titles.tsx b/src/components/poster/variants/poster-top-titles.tsx index 6702cf93d..86d44168e 100644 --- a/src/components/poster/variants/poster-top-titles.tsx +++ b/src/components/poster/variants/poster-top-titles.tsx @@ -17,6 +17,7 @@ import { openLoginModal } from '@redux/auth'; import { ReadResult } from '@lens-protocol/react/dist/declarations/src/helpers/reads'; import { useDispatch, useSelector } from 'react-redux'; import { addBookmark, removeBookmark } from '@redux/bookmark'; +import {dicebear} from "@src/utils/dicebear.ts"; // ---------------------------------------------------------------------- @@ -171,8 +172,7 @@ const PosterTopTitles = ({ post }: { post: any }) => { ratio={'1/1'} style={{ width: '20px', height: '20px', borderRadius: '50%' }} src={ - (post?.by?.metadata?.picture as any)?.optimized?.uri ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${post?.by?.id}` + post?.by?.metadata?.picture?.optimized?.uri ?? dicebear(post?.by?.id) } /> {post?.by?.metadata?.displayName ?? post?.by?.handle?.localName} diff --git a/src/components/publication-detail-main.tsx b/src/components/publication-detail-main.tsx index c31e05ae4..6466a10ad 100644 --- a/src/components/publication-detail-main.tsx +++ b/src/components/publication-detail-main.tsx @@ -6,7 +6,6 @@ import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; -import Avatar from '@mui/material/Avatar'; import Dialog from '@mui/material/Dialog'; import Divider from '@mui/material/Divider'; import MenuItem from '@mui/material/MenuItem'; @@ -59,6 +58,8 @@ import { openLoginModal } from '@redux/auth'; import { useDispatch, useSelector } from 'react-redux'; import { addBookmark, removeBookmark } from '@redux/bookmark'; import { useNotificationPayload } from '@src/hooks/use-notification-payload.ts'; +import {dicebear} from "@src/utils/dicebear.ts"; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; // ---------------------------------------------------------------------- @@ -114,8 +115,7 @@ export default function PublicationDetailMain({ id: post.by.id, displayName: post?.by?.metadata?.displayName, avatar: - (post?.by?.metadata?.picture as any)?.optimized?.uri ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${post?.by?.id}`, + post?.by?.metadata?.picture?.optimized?.uri ?? dicebear(post?.by?.id), }, { rawDescription: `${sessionData?.profile?.metadata?.displayName} liked ${post?.metadata?.title}`, @@ -217,10 +217,9 @@ export default function PublicationDetailMain({ sx={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }} onClick={goToProfile} > - ) : ( diff --git a/src/components/should-login/withAuth.tsx b/src/components/should-login/withAuth.tsx index 93916f63f..4d8cf61bd 100644 --- a/src/components/should-login/withAuth.tsx +++ b/src/components/should-login/withAuth.tsx @@ -1,10 +1,16 @@ import React from 'react'; import { useSelector } from 'react-redux'; import ShouldLogin from '@src/components/should-login/should-login'; +import { LoadingScreen } from '@src/components/loading-screen'; const withAuth = (WrappedComponent: React.ComponentType, icon: string, subtitle: string) => { return (props: any) => { const sessionData = useSelector((state: any) => state.auth.session); + const loading = useSelector((state: any) => state.auth.isSessionLoading); + + if (loading) { + return ; + } if (!sessionData?.authenticated) { return ; diff --git a/src/components/subscribe-profile-modal.tsx b/src/components/subscribe-profile-modal.tsx index 7b6bc525e..c5d8d0b67 100644 --- a/src/components/subscribe-profile-modal.tsx +++ b/src/components/subscribe-profile-modal.tsx @@ -40,6 +40,7 @@ import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; import { notifyError, notifySuccess } from '@notifications/internal-notifications.ts'; import { SUCCESS } from '@notifications/success.ts'; import { ERRORS } from '@notifications/errors.ts'; +import {dicebear} from "@src/utils/dicebear.ts"; // ---------------------------------------------------------------------- @@ -176,8 +177,7 @@ export const SubscribeProfileModal = ({ id: profile.id, displayName: profile?.metadata?.displayName ?? 'no name', avatar: - (profile?.metadata?.picture as any)?.optimized?.uri ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${profile?.id}`, + (profile?.metadata?.picture as any)?.optimized?.uri ??dicebear(profile?.id) }, { durationDays, diff --git a/src/components/table/table-pagination-custom.tsx b/src/components/table/table-pagination-custom.tsx index 4a8f0c1b4..24dcbed59 100644 --- a/src/components/table/table-pagination-custom.tsx +++ b/src/components/table/table-pagination-custom.tsx @@ -21,7 +21,7 @@ export default function TablePaginationCustom({ ...other }: Props & TablePaginationProps) { return ( - + = ({ address }) => { + // Use the useIsVerified hook to check if the user is verified + const { isVerified, loading } = useIsVerified(address); + + // While loading, do not render anything + if (loading) return null; + + // If the user is not verified, do not render the badge + if (!isVerified) return null; + + return ; +}; + +export default BadgeVerified; diff --git a/src/components/user-item/index.tsx b/src/components/user-item/index.tsx index 48ccaad91..feefbf50e 100644 --- a/src/components/user-item/index.tsx +++ b/src/components/user-item/index.tsx @@ -1,7 +1,6 @@ // MUI IMPORTS import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; -import Avatar from '@mui/material/Avatar'; import { Theme } from '@mui/material/styles'; import { SxProps } from '@mui/system/styleFunctionSx'; import ListItemText from '@mui/material/ListItemText'; @@ -17,6 +16,11 @@ import { paths } from '../../routes/paths'; import { useRouter } from '@src/routes/hooks'; import FollowUnfollowButton from '@src/components/follow-unfollow-button.tsx'; import { useSelector } from 'react-redux'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import {FC} from "react"; +import Typography from "@mui/material/Typography"; +import BadgeVerified from "@src/components/user-item/BadgeVerified.tsx"; +import { Address } from 'viem'; // ---------------------------------------------------------------------- @@ -92,11 +96,8 @@ export const UserItem = ({ p: (theme) => theme.spacing(0, 2, 1, 2), }} > - } secondary={ <>{profile?.id !== sessionData?.profile?.id ? profile?.id : 'This is you!'} } @@ -144,3 +145,30 @@ export const UserItem = ({ ); }; + +interface UserNameAndBadgeProps { + name: string; + address: Address; +} + +export const UserNameAndBadge : FC = ({ name, address}) => { + return ( + + + {name} + + + + + + ); +} diff --git a/src/components/video-player/video-player.tsx b/src/components/video-player/video-player.tsx index 3b4ea2a46..2bdca4791 100644 --- a/src/components/video-player/video-player.tsx +++ b/src/components/video-player/video-player.tsx @@ -45,7 +45,6 @@ export const VideoPlayer: FC = ({ src, titleMovie, onBack, sho useEffect(() => { if (player.current) { if (isHLSProvider(player.current.provider)) { - console.log('tune provider config'); player.current.provider.config = { debug: false, autoStartLoad: true, diff --git a/src/components/watchit-loader/index.tsx b/src/components/watchit-loader/index.tsx index 989c62022..0eb9004a8 100644 --- a/src/components/watchit-loader/index.tsx +++ b/src/components/watchit-loader/index.tsx @@ -1,6 +1,5 @@ import { FC, useEffect, useRef } from 'react'; import Box from '@mui/material/Box'; -// eslint-disable-next-line import/no-extraneous-dependencies import Lottie, { LottieRefCurrentProps } from 'lottie-react'; import watchitLogo from '@src/assets/animations/watchit-spinner.json'; diff --git a/src/config-global.ts b/src/config-global.ts index 12d284ce6..90e469987 100644 --- a/src/config-global.ts +++ b/src/config-global.ts @@ -27,6 +27,8 @@ export const GLOBAL_CONSTANTS = { OKLINK_API_KEY: process.env.VITE_OKLINK_API_KEY || import.meta.env.VITE_OKLINK_API_KEY || '', RIGHT_POLICY_AUTHORIZER: process.env.VITE_RIGHT_POLICY_AUTHORIZER || import.meta.env.VITE_RIGHT_POLICY_AUTHORIZER || '', + ACCESS_MANAGER_ADDRESS: + process.env.VITE_ACCESS_MANAGER_ADDRESS || import.meta.env.VITE_ACCESS_MANAGER_ADDRESS || '', SENTRY_AUTH_TOKEN: process.env.VITE_SENTRY_AUTH_TOKEN || import.meta.env.VITE_SENTRY_AUTH_TOKEN || '', SENTRY_DNS: process.env.VITE_SENTRY_DNS || import.meta.env.VITE_SENTRY_DNS || '', @@ -41,6 +43,12 @@ export const GLOBAL_CONSTANTS = { process.env.VITE_SUPABASE_API_KEY || import.meta.env.VITE_SUPABASE_API_KEY || '', ENVIRONMENT: process.env.NODE_ENV || import.meta.env.VITE_ENVIRONMENT || 'development', INFURA_API_KEY: process.env.VITE_INFURA_API_KEY || import.meta.env.VITE_INFURA_API_KEY || '', + EMAIL_API_KEY: process.env.VITE_EMAILJS_PUBLIC_KEY || import.meta.env.VITE_EMAILJS_PUBLIC_KEY || '', + EMAIL_SERVICE_ID: process.env.VITE_EMAILJS_SERVICE_ID || import.meta.env.VITE_EMAILJS_SERVICE_ID || '', + EMAIL_TEMPLATE_ID: process.env.VITE_EMAILJS_TEMPLATE_ID || import.meta.env.VITE_EMAILJS_TEMPLATE_ID || '', + SENDER_EMAIL: process.env.VITE_SENDER_EMAIL || import.meta.env.VITE_SENDER_EMAIL || '', + BASE_URL: process.env.VITE_BASE_URL || import.meta.env.VITE_BASE_URL || '', + LOGO_URL: process.env.VITE_LOGO_URL || import.meta.env.VITE_LOGO_URL || '', }; export const MAPBOX_API = import.meta.env.VITE_MAPBOX_API || ''; diff --git a/src/config/abi/AccessManager.json b/src/config/abi/AccessManager.json new file mode 100644 index 000000000..8254e3308 --- /dev/null +++ b/src/config/abi/AccessManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"PUBLIC_ROLE","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"canCall","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"immediate","type":"bool","internalType":"bool"},{"name":"delay","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"cancel","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"nonpayable"},{"type":"function","name":"consumeScheduledOp","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"execute","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"payable"},{"type":"function","name":"expiration","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getAccess","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"since","type":"uint48","internalType":"uint48"},{"name":"currentDelay","type":"uint32","internalType":"uint32"},{"name":"pendingDelay","type":"uint32","internalType":"uint32"},{"name":"effect","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleGrantDelay","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getRoleGuardian","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getSchedule","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"type":"function","name":"getTargetAdminDelay","inputs":[{"name":"target","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getTargetFunctionRole","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"account","type":"address","internalType":"address"},{"name":"executionDelay","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"isMember","type":"bool","internalType":"bool"},{"name":"executionDelay","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"hashOperation","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"initialAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isTargetClosed","inputs":[{"name":"target","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"labelRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"label","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"minSetback","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"schedule","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"when","type":"uint48","internalType":"uint48"}],"outputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"stateMutability":"nonpayable"},{"type":"function","name":"setGrantDelay","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"newDelay","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setRoleAdmin","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"admin","type":"uint64","internalType":"uint64"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setRoleGuardian","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"},{"name":"guardian","type":"uint64","internalType":"uint64"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTargetAdminDelay","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"newDelay","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTargetClosed","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"closed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTargetFunctionRole","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"},{"name":"roleId","type":"uint64","internalType":"uint64"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateAuthority","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"newAuthority","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OperationCanceled","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"nonce","type":"uint32","indexed":true,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"OperationExecuted","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"nonce","type":"uint32","indexed":true,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"OperationScheduled","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"nonce","type":"uint32","indexed":true,"internalType":"uint32"},{"name":"schedule","type":"uint48","indexed":false,"internalType":"uint48"},{"name":"caller","type":"address","indexed":false,"internalType":"address"},{"name":"target","type":"address","indexed":false,"internalType":"address"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"admin","type":"uint64","indexed":true,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleGrantDelayChanged","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"delay","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"since","type":"uint48","indexed":false,"internalType":"uint48"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"delay","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"since","type":"uint48","indexed":false,"internalType":"uint48"},{"name":"newMember","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"RoleGuardianChanged","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"guardian","type":"uint64","indexed":true,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleLabel","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"label","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TargetAdminDelayUpdated","inputs":[{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"delay","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"since","type":"uint48","indexed":false,"internalType":"uint48"}],"anonymous":false},{"type":"event","name":"TargetClosed","inputs":[{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"closed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"TargetFunctionRoleUpdated","inputs":[{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"selector","type":"bytes4","indexed":false,"internalType":"bytes4"},{"name":"roleId","type":"uint64","indexed":true,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessManagerAlreadyScheduled","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccessManagerBadConfirmation","inputs":[]},{"type":"error","name":"AccessManagerExpired","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccessManagerInvalidInitialAdmin","inputs":[{"name":"initialAdmin","type":"address","internalType":"address"}]},{"type":"error","name":"AccessManagerLockedRole","inputs":[{"name":"roleId","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"AccessManagerNotReady","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccessManagerNotScheduled","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccessManagerUnauthorizedAccount","inputs":[{"name":"msgsender","type":"address","internalType":"address"},{"name":"roleId","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"AccessManagerUnauthorizedCall","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"AccessManagerUnauthorizedCancel","inputs":[{"name":"msgsender","type":"address","internalType":"address"},{"name":"caller","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"AccessManagerUnauthorizedConsume","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"InsufficientBalance","inputs":[{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a0806040523460295730608052613fa9908161002e823960805181818161166a01526118430152f35b5f80fdfe60806040526004361015610011575f80fd5b5f803560e01c806308d6122d146121c25780630b0a93ba1461218d57806312be87271461216a578063167bd3951461208d57806318ff183c14611fcc5780631cff79cd14611e1e57806325c471a014611dcf5780633078f11414611d7457806330cae18714611c855780633adc277a14611c565780633ca7c02a14611c335780634136a33c14611be15780634665096d14611bc35780634c1da1e214611b915780634f1ef286146117e557806352962952146116e257806352d1902d14611642578063530dd456146115cc5780636d5115bd1461152457806375b238fc14611508578063853551b81461145f57806394c7d7ee146112fd578063a166aa8914611287578063a64d95ce146110e2578063abd9bd2a146110bd578063ac9650d814610e7e578063ad3cb1cc14610e1d578063b700961314610dc0578063b7d2b16214610d8d578063c4d66de814610952578063cc1b6c8114610934578063d1f856ee146108eb578063d22b5989146107a8578063d6bb62c61461054f578063f801a6981461021e5763fe0776f5146101a6575f80fd5b3461021b57604060031936011261021b576101bf612379565b6101c7612325565b903373ffffffffffffffffffffffffffffffffffffffff8316036101f357906101ef916134c8565b5080f35b6004837f5f159e63000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461021b57606060031936011261021b57610238612302565b9060243567ffffffffffffffff811161054b576102599036906004016123a7565b919060443565ffffffffffff81168091036105475761027a84838733612c2f565b905061029663ffffffff61028d42613f2b565b92168092612aef565b9015801561052c575b6104b6579065ffffffffffff80921690818082119118021816906102c584828733612800565b938484527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff60408520541680151590816104a5575b5061047957604095849361046a87947f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b494868b99527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad02602052600163ffffffff8a8a205460301c160163ffffffff81169989898c9b527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205281812065ffffffffffff88167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000008254161790558981527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205220907fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff69ffffffff00000000000083549260301b16911617905573ffffffffffffffffffffffffffffffffffffffff8b519586958652336020870152168b8501526080606085015260808401916127c2565b0390a382519182526020820152f35b602484867f813e9459000000000000000000000000000000000000000000000000000000008252600452fd5b6104af9150613494565b155f610304565b6064847fffffffff000000000000000000000000000000000000000000000000000000008873ffffffffffffffffffffffffffffffffffffffff6104fa8a89612c83565b917f81c6f24b000000000000000000000000000000000000000000000000000000008552336004521660245216604452fd5b50811515801561029f575065ffffffffffff8116821061029f565b8280fd5b5080fd5b503461021b576105779061056236612533565b61056f8183949793612c83565b928685612800565b918284527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff604085205416155f146105df57602484847f60a299b0000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16903382036106b5575b5050602092508082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad028352604082207fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000081541690558082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad02835263ffffffff604083205460301c1680917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f76040519480a38152f35b73ffffffffffffffffffffffffffffffffffffffff6106d333612a1c565b509516948585527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020527fffffffff000000000000000000000000000000000000000000000000000000006040862092169182865260205261074c3361074767ffffffffffffffff6040892054166125e3565b612ab1565b509015908161079f575b50156105fe576084925084604051927f3fe2751c000000000000000000000000000000000000000000000000000000008452336004850152602484015260448301526064820152fd5b9050155f610756565b503461021b57604060031936011261021b576107c2612302565b7fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c73ffffffffffffffffffffffffffffffffffffffff610800612426565b92610809612b3a565b16918284527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00602052610853816dffffffffffffffffffffffffffff600160408820015416613dd4565b91908486527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020526dffffffffffffffffffffffffffff6001604088200191167fffffffffffffffffffffffffffffffffffff00000000000000000000000000008254161790556108e56040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b0390a280f35b503461021b57604060031936011261021b57610916610908612379565b610910612325565b90612ab1565b60408051921515835263ffffffff91909116602083015290f35b0390f35b503461021b578060031936011261021b576020604051620697808152f35b503461021b57602060031936011261021b5761096c612302565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff811680159081610d85575b6001149081610d7b575b159081610d72575b50610d4a578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610cf5575b50610a1b613ed4565b610a23613ed4565b610a2b613ed4565b73ffffffffffffffffffffffffffffffffffffffff811615610cc957610a5090612ea7565b5080610c9c575060025f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad016020527fe6aabd1bffdac7ba79de73a083ff79c0386fd48083f0d75b92292f7b67eddc2f80547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408280a360045f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad016020527f0f09c9d7c70962ea814c91d9e26c48598a93bd106bce4571a625a947ad8b815b80547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408280a360035f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad01602052600160405f200160017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600160037f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63405f80a3610c0957005b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b807f1871a90c00000000000000000000000000000000000000000000000000000000602492526002600452fd5b6024827f0813ada200000000000000000000000000000000000000000000000000000000815280600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f610a12565b6004837ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f6109bf565b303b1591506109b7565b8591506109ad565b503461021b57604060031936011261021b576101ef610daa612379565b610db2612325565b90610dbb612b3a565b6134c8565b503461021b57606060031936011261021b57610dda612302565b610de2612325565b604435917fffffffff0000000000000000000000000000000000000000000000000000000083168303610e195761091693506128cf565b8380fd5b503461021b578060031936011261021b5750610930604051610e40604082612482565b600581527f352e302e3000000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906125a0565b503461021b57602060031936011261021b5760043567ffffffffffffffff811161054b57610eb0903690600401612348565b906020604051610ec08282612482565b848152818101917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101368437610ef685612876565b93610f046040519586612482565b8585527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610f3187612876565b01875b8181106110ae57505086907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b87811015611031578060051b8201358381121561102d5782019081359167ffffffffffffffff83116110295785018a833603821361021b578061100d9289610ff96001978b8e6040519483869484860198893784019083820190898252519283915e0101858152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b5190305af4611006612e78565b9030613d3b565b611017828a61288e565b52611022818961288e565b5001610f66565b8a80fd5b8980fd5b83898860405191838301848452825180915260408401948060408360051b870101940192955b8287106110645785850386f35b90919293828061109e837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516125a0565b9601920196019592919092611057565b60608782018501528301610f34565b503461021b5760206110da6110d136612533565b92919091612800565b604051908152f35b503461021b57604060031936011261021b576110fc612379565b611104612426565b61110c612b3a565b67ffffffffffffffff82169167ffffffffffffffff831461125b57818160016111a97ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b48956dffffffffffffffffffffffffffff8361119e6111e39867ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460801c16613dd4565b94909267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01907fffff0000000000000000000000000000ffffffffffffffffffffffffffffffff7dffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b1691161790556108e56040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b602484847f1871a90c000000000000000000000000000000000000000000000000000000008252600452fd5b503461021b57602060031936011261021b5760206112f36112a6612302565b73ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260ff600160405f20015460701c1690565b6040519015158152f35b503461021b5761130c366123d5565b916040517f8fb36037000000000000000000000000000000000000000000000000000000008152602081600481335afa9081156114545785916113d5575b507fffffffff000000000000000000000000000000000000000000000000000000007f8fb36037000000000000000000000000000000000000000000000000000000009116036113a957916113a4916101ef933390612800565b612cb1565b6024847f320ff74800000000000000000000000000000000000000000000000000000000815233600452fd5b90506020813d60201161144c575b816113f060209383612482565b8101031261144857517fffffffff0000000000000000000000000000000000000000000000000000000081168103611448577fffffffff0000000000000000000000000000000000000000000000000000000061134a565b8480fd5b3d91506113e3565b6040513d87823e3d90fd5b503461021b57604060031936011261021b57611479612379565b6024359067ffffffffffffffff8211610547576114a367ffffffffffffffff9236906004016123a7565b9290916114ae612b3a565b1691821580156114f7575b61125b57907f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a450916108e56040519283926020845260208401916127c2565b5067ffffffffffffffff83146114b9565b503461021b578060031936011261021b57602090604051908152f35b503461021b57604060031936011261021b5761153e612302565b602435907fffffffff000000000000000000000000000000000000000000000000000000008216809203610547578267ffffffffffffffff9273ffffffffffffffffffffffffffffffffffffffff604093602096501682527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0085528282209082528452205416604051908152f35b503461021b57602060031936011261021b57602067ffffffffffffffff600161162d6115f6612379565b67ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01541667ffffffffffffffff60405191168152f35b503461021b578060031936011261021b5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036116ba5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b807fe07c8dba0000000000000000000000000000000000000000000000000000000060049252fd5b503461021b57604060031936011261021b576116fc612379565b611704612390565b61170c612b3a565b67ffffffffffffffff821691821580156117d4575b61125b5790600161176c67ffffffffffffffff9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b0180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000008460401b16911617905516907f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae28380a380f35b5067ffffffffffffffff8314611721565b50604060031936011261021b576117fa612302565b9060243567ffffffffffffffff811161054b573660238201121561054b5761182c9036906024816004013591016124fd565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803014908115611b4f575b50611b275761187c33612a1c565b5015611aa45773ffffffffffffffffffffffffffffffffffffffff831690604051937f52d1902d000000000000000000000000000000000000000000000000000000008552602085600481865afa80958596611a70575b5061190457602484847f4c9c8ce3000000000000000000000000000000000000000000000000000000008252600452fd5b9091847f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8103611a455750813b15611a1a57807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a281518390156119e757808360206101ef95519101845af46119e1612e78565b91613d3b565b505050346119f25780f35b807fb398979f0000000000000000000000000000000000000000000000000000000060049252fd5b7f4c9c8ce3000000000000000000000000000000000000000000000000000000008452600452602483fd5b7faa1d49a4000000000000000000000000000000000000000000000000000000008552600452602484fd5b9095506020813d602011611a9c575b81611a8c60209383612482565b810103126114485751945f6118d3565b3d9150611a7f565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f6e6c792061646d696e2063616e20617574686f72697a65207468652075706760448201527f72616465000000000000000000000000000000000000000000000000000000006064820152fd5b6004827fe07c8dba000000000000000000000000000000000000000000000000000000008152fd5b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f61186e565b503461021b57602060031936011261021b576020611bb5611bb0612302565b612766565b63ffffffff60405191168152f35b503461021b578060031936011261021b57602060405162093a808152f35b503461021b57602060031936011261021b5763ffffffff604060209260043581527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad028452205460301c16604051908152f35b503461021b578060031936011261021b57602060405167ffffffffffffffff8152f35b503461021b57602060031936011261021b576020611c7560043561271d565b65ffffffffffff60405191168152f35b503461021b57604060031936011261021b57611c9f612379565b611ca7612390565b611caf612b3a565b67ffffffffffffffff82169182158015611d63575b61125b57906001611d0f67ffffffffffffffff9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b018282167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905516907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408380a380f35b5067ffffffffffffffff8314611cc4565b503461021b57604060031936011261021b57608063ffffffff65ffffffffffff81611dae611da0612379565b611da8612325565b90612691565b93929590918560405197168752166020860152166040840152166060820152f35b503461021b57606060031936011261021b57611de9612379565b611df1612325565b906044359063ffffffff82168203610e19576101ef92611e0f612b3a565b611e1882612632565b91613158565b50611e28366123d5565b9091611e3682848333612c2f565b93901580611fbe575b611f7a57611e4f83828433612800565b63ffffffff86951615801590611f61575b611f4b575b50611ec9907f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035493611ea0611e9a8284612c83565b85612e20565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035536916124fd565b344710611f1b5790846020958387611eea9551910134855af16119e1612e78565b507f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035563ffffffff60405191168152f35b604485477fcf47918100000000000000000000000000000000000000000000000000000000825260045234602452fd5b611ec9919450611f5a90612cb1565b9390611e65565b5065ffffffffffff611f728261271d565b161515611e60565b849173ffffffffffffffffffffffffffffffffffffffff6104fa6064957fffffffff0000000000000000000000000000000000000000000000000000000094612c83565b5063ffffffff841615611e3f565b503461208957604060031936011261208957611fe6612302565b73ffffffffffffffffffffffffffffffffffffffff612003612325565b9161200c612b3a565b1690813b156120895773ffffffffffffffffffffffffffffffffffffffff60245f928360405195869485937f7a9e5e4b0000000000000000000000000000000000000000000000000000000085521660048401525af1801561207e57612070575080f35b61207c91505f90612482565b005b6040513d5f823e3d90fd5b5f80fd5b34612089576040600319360112612089576120a6612302565b6024359081151580920361208957602073ffffffffffffffffffffffffffffffffffffffff7f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138926120f5612b3a565b1692835f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad008252600160405f200180547fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff6eff00000000000000000000000000008460701b169116179055604051908152a2005b34612089576020600319360112612089576020611bb5612188612379565b612632565b346120895760206003193601126120895760206121b06121ab612379565b6125e3565b67ffffffffffffffff60405191168152f35b34612089576060600319360112612089576121db612302565b60243567ffffffffffffffff8111612089576121fb903690600401612348565b91906044359067ffffffffffffffff82168092036120895761221e939293612b3a565b73ffffffffffffffffffffffffffffffffffffffff5f9416935b8381101561207c578060051b820135907fffffffff0000000000000000000000000000000000000000000000000000000082168092036120895783867f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde9491516020600195835f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00825260405f20815f52825260405f20857fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055604051908152a301612238565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361208957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361208957565b9181601f840112156120895782359167ffffffffffffffff8311612089576020808501948460051b01011161208957565b6004359067ffffffffffffffff8216820361208957565b6024359067ffffffffffffffff8216820361208957565b9181601f840112156120895782359167ffffffffffffffff8311612089576020838186019501011161208957565b9060406003198301126120895760043573ffffffffffffffffffffffffffffffffffffffff8116810361208957916024359067ffffffffffffffff821161208957612422916004016123a7565b9091565b6024359063ffffffff8216820361208957565b6040810190811067ffffffffffffffff82111761245557604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761245557604052565b67ffffffffffffffff811161245557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612509826124c3565b916125176040519384612482565b829481845281830111612089578281602093845f960137010152565b60606003198201126120895760043573ffffffffffffffffffffffffffffffffffffffff81168103612089579160243573ffffffffffffffffffffffffffffffffffffffff8116810361208957916044359067ffffffffffffffff821161208957612422916004016123a7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b600161262967ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460401c1690565b6dffffffffffffffffffffffffffff600161268161268c9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460801c16613457565b505090565b9073ffffffffffffffffffffffffffffffffffffffff6126ea65ffffffffffff949367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b91165f5260205260405f2054906127136dffffffffffffffffffffffffffff8360301c16613457565b9490931693909291565b5f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff60405f20541661275981613494565b1561276357505f90565b90565b73ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205261268c6dffffffffffffffffffffffffffff600160405f20015416613457565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b929061284473ffffffffffffffffffffffffffffffffffffffff936128709360405195869481602087019916895216604085015260608085015260808401916127c2565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b51902090565b67ffffffffffffffff81116124555760051b60200190565b80518210156128a25760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9190916129238373ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260ff600160405f20015460701c1690565b15612931575050505f905f90565b73ffffffffffffffffffffffffffffffffffffffff81163003612981575061297b907f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035492612e20565b14905f90565b9073ffffffffffffffffffffffffffffffffffffffff612a0293165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020527fffffffff0000000000000000000000000000000000000000000000000000000060405f2091165f5260205267ffffffffffffffff60405f205416612ab1565b919015612a155763ffffffff8216159190565b5f91508190565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc6709097602052604090205465ffffffffffff81169190612a869060301c6dffffffffffffffffffffffffffff16613457565b509092801515915081612a9857509190565b905065ffffffffffff612aaa42613f2b565b1610159190565b67ffffffffffffffff81811603612acb5750506001905f90565b65ffffffffffff9291612add91612691565b505092168015159081612a9857509190565b9065ffffffffffff8091169116019065ffffffffffff8211612b0d57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b612b4436336135dc565b9015612b4d5750565b63ffffffff16612b9c5767ffffffffffffffff612b6936613752565b5090507ff07e038f000000000000000000000000000000000000000000000000000000005f52336004521660245260445ffd5b612c2c6040516020810190338252306040820152606080820152612c2481602060808201368152365f838301375f8236830101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3601160101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b519020612cb1565b50565b9092919073ffffffffffffffffffffffffffffffffffffffff84163003612c5a5761242293506136eb565b9192906004841015612c7057505050505f905f90565b61242293612c7d91612c83565b916128cf565b9060041161208957357fffffffff000000000000000000000000000000000000000000000000000000001690565b5f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad026020526040902054909190603081901c63ffffffff169065ffffffffffff1680612d2657837f60a299b0000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b65ffffffffffff612d3642613f2b565b16811115612d6a57837f18cb6b7a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b612d779093919293613494565b612df5578190805f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000081541690557f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d5f80a390565b7f78a5d6e4000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b907fffffffff000000000000000000000000000000000000000000000000000000006040519173ffffffffffffffffffffffffffffffffffffffff602084019416845216604082015260408152612870606082612482565b3d15612ea2573d90612e89826124c3565b91612e976040519384612482565b82523d5f602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc6709097602052604090205465ffffffffffff1615908115613047575f7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf606073ffffffffffffffffffffffffffffffffffffffff612f4684612f4142613f2b565b612aef565b94613027604051612f5681612439565b65ffffffffffff881681526dffffffffffffffffffffffffffff602082018881528880527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad01602052604089208686168a5260205265ffffffffffff8060408b20945116167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000084541617835551167fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b65ffffffffffff604051968688521660208701528660408701521693a390565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc670909760205260408120546131539391927ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf926060926130d590869060301c6dffffffffffffffffffffffffffff16613e6c565b96908680527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260408720848416885260205260408720907fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b613027565b9092919267ffffffffffffffff82169167ffffffffffffffff831461342b5773ffffffffffffffffffffffffffffffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9265ffffffffffff836131f360609567ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8484165f526020528160405f2054161598895f1461332f576132286133119163ffffffff61322042613f2b565b911690612aef565b916dffffffffffffffffffffffffffff8a6132926040519361324985612439565b878716855263ffffffff602086019316835267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8888165f52602052858060405f20945116167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000084541617835551167fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b63ffffffff604051981688521660208701528660408701521693a390565b50613426816133726133d59367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8686165f5260205261339b8a6dffffffffffffffffffffffffffff60405f205460301c16613e6c565b93909167ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8686165f5260205260405f20907fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b613311565b827f1871a90c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b61346042613f2b565b63ffffffff82169165ffffffffffff604082901c811692168211613488575090915f91508190565b60201c63ffffffff1692565b65ffffffffffff62093a8091160165ffffffffffff8111612b0d5765ffffffffffff806134c042613f2b565b169116111590565b67ffffffffffffffff81169167ffffffffffffffff831461342b5761351e8267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b73ffffffffffffffffffffffffffffffffffffffff82165f5260205265ffffffffffff60405f205416156135d55761359c73ffffffffffffffffffffffffffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8282165f526020525f604081205516907ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c1665f80a3600190565b5050505f90565b9060048110613645573073ffffffffffffffffffffffffffffffffffffffff8316146136935761360c905f613a5d565b9290911580613656575b61364d5761362391612ab1565b90156136455763ffffffff808093169116908180821191180218169081159190565b50505f905f90565b5050505f905f90565b50305f9081527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00602052604090206001015460701c60ff16613616565b9050600411612089577f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035461297b5f357fffffffff000000000000000000000000000000000000000000000000000000001630612e20565b91906004821061364d573073ffffffffffffffffffffffffffffffffffffffff84161461371c579061360c91613a5d565b6137269250612c83565b61297b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad03549130612e20565b5f9060048110613a535780600411612089577fffffffff000000000000000000000000000000000000000000000000000000005f3516907f853551b80000000000000000000000000000000000000000000000000000000082148015613a2a575b8015613a01575b80156139d8575b80156139af575b6139a3577f18ff183c000000000000000000000000000000000000000000000000000000008214801561397a575b8015613951575b613915577f25c471a000000000000000000000000000000000000000000000000000000000821480156138ec575b61387757503082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020526040822090825260205267ffffffffffffffff6040822054169181929190565b905060241161021b578061021b575060043567ffffffffffffffff811681036120895760016138e067ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01541690600191905f90565b507fb7d2b16200000000000000000000000000000000000000000000000000000000821461382b565b9150506024116120895760043573ffffffffffffffffffffffffffffffffffffffff81168091036120895761394990612766565b6001915f9190565b507f08d6122d0000000000000000000000000000000000000000000000000000000082146137fd565b507f167bd3950000000000000000000000000000000000000000000000000000000082146137f6565b5050506001905f905f90565b507fd22b59890000000000000000000000000000000000000000000000000000000082146137c8565b507fa64d95ce0000000000000000000000000000000000000000000000000000000082146137c1565b507f529629520000000000000000000000000000000000000000000000000000000082146137ba565b507f30cae1870000000000000000000000000000000000000000000000000000000082146137b3565b50505f905f905f90565b60048210613a53577fffffffff00000000000000000000000000000000000000000000000000000000613a908383612c83565b16917f853551b80000000000000000000000000000000000000000000000000000000083148015613d12575b8015613ce9575b8015613cc0575b8015613c97575b6139a3577f18ff183c0000000000000000000000000000000000000000000000000000000083148015613c6e575b8015613c45575b613c10577f25c471a00000000000000000000000000000000000000000000000000000000083148015613be7575b613b82575050305f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260405f20905f5260205267ffffffffffffffff60405f205416905f91905f90565b909150602411612089576004013567ffffffffffffffff811681036120895760016138e067ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b507fb7d2b162000000000000000000000000000000000000000000000000000000008314613b34565b909150602411612089576004013573ffffffffffffffffffffffffffffffffffffffff81168091036120895761394990612766565b507f08d6122d000000000000000000000000000000000000000000000000000000008314613b06565b507f167bd395000000000000000000000000000000000000000000000000000000008314613aff565b507fd22b5989000000000000000000000000000000000000000000000000000000008314613ad1565b507fa64d95ce000000000000000000000000000000000000000000000000000000008314613aca565b507f52962952000000000000000000000000000000000000000000000000000000008314613ac3565b507f30cae187000000000000000000000000000000000000000000000000000000008314613abc565b90613d785750805115613d5057805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580613dcb575b613d89575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15613d81565b613de563ffffffff91939293613457565b505092168063ffffffff84168181115f14613e52570363ffffffff8111612b0d57613e3363ffffffff8067ffffffff00000000935b16806206978011816206978018021816612f4142613f2b565b9360201b166dffffffffffff00000000000000008460401b1617179190565b505067ffffffff00000000613e3363ffffffff805f613e1a565b613e7d63ffffffff91939293613457565b505092168063ffffffff84168181115f14613ebb570363ffffffff8111612b0d57613e3363ffffffff67ffffffff00000000925b16612f4142613f2b565b505067ffffffff00000000613e3363ffffffff5f613eb1565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615613f0357565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b65ffffffffffff8111613f435765ffffffffffff1690565b7f6dfcc650000000000000000000000000000000000000000000000000000000005f52603060045260245260445ffdfea2646970667358221220c0abd5032d446d7babecb00bbe69337c4e4b8a98c6b67fdd87abe147f6ba4a8864736f6c634300081a0033","sourceMap":"574:1559:0:-:0;;;;;;;1171:4:96;1163:13;;574:1559:0;;;;;;1163:13:96;574:1559:0;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f803560e01c806308d6122d146121c25780630b0a93ba1461218d57806312be87271461216a578063167bd3951461208d57806318ff183c14611fcc5780631cff79cd14611e1e57806325c471a014611dcf5780633078f11414611d7457806330cae18714611c855780633adc277a14611c565780633ca7c02a14611c335780634136a33c14611be15780634665096d14611bc35780634c1da1e214611b915780634f1ef286146117e557806352962952146116e257806352d1902d14611642578063530dd456146115cc5780636d5115bd1461152457806375b238fc14611508578063853551b81461145f57806394c7d7ee146112fd578063a166aa8914611287578063a64d95ce146110e2578063abd9bd2a146110bd578063ac9650d814610e7e578063ad3cb1cc14610e1d578063b700961314610dc0578063b7d2b16214610d8d578063c4d66de814610952578063cc1b6c8114610934578063d1f856ee146108eb578063d22b5989146107a8578063d6bb62c61461054f578063f801a6981461021e5763fe0776f5146101a6575f80fd5b3461021b57604060031936011261021b576101bf612379565b6101c7612325565b903373ffffffffffffffffffffffffffffffffffffffff8316036101f357906101ef916134c8565b5080f35b6004837f5f159e63000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461021b57606060031936011261021b57610238612302565b9060243567ffffffffffffffff811161054b576102599036906004016123a7565b919060443565ffffffffffff81168091036105475761027a84838733612c2f565b905061029663ffffffff61028d42613f2b565b92168092612aef565b9015801561052c575b6104b6579065ffffffffffff80921690818082119118021816906102c584828733612800565b938484527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff60408520541680151590816104a5575b5061047957604095849361046a87947f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b494868b99527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad02602052600163ffffffff8a8a205460301c160163ffffffff81169989898c9b527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205281812065ffffffffffff88167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000008254161790558981527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205220907fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff69ffffffff00000000000083549260301b16911617905573ffffffffffffffffffffffffffffffffffffffff8b519586958652336020870152168b8501526080606085015260808401916127c2565b0390a382519182526020820152f35b602484867f813e9459000000000000000000000000000000000000000000000000000000008252600452fd5b6104af9150613494565b155f610304565b6064847fffffffff000000000000000000000000000000000000000000000000000000008873ffffffffffffffffffffffffffffffffffffffff6104fa8a89612c83565b917f81c6f24b000000000000000000000000000000000000000000000000000000008552336004521660245216604452fd5b50811515801561029f575065ffffffffffff8116821061029f565b8280fd5b5080fd5b503461021b576105779061056236612533565b61056f8183949793612c83565b928685612800565b918284527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff604085205416155f146105df57602484847f60a299b0000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16903382036106b5575b5050602092508082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad028352604082207fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000081541690558082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad02835263ffffffff604083205460301c1680917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f76040519480a38152f35b73ffffffffffffffffffffffffffffffffffffffff6106d333612a1c565b509516948585527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020527fffffffff000000000000000000000000000000000000000000000000000000006040862092169182865260205261074c3361074767ffffffffffffffff6040892054166125e3565b612ab1565b509015908161079f575b50156105fe576084925084604051927f3fe2751c000000000000000000000000000000000000000000000000000000008452336004850152602484015260448301526064820152fd5b9050155f610756565b503461021b57604060031936011261021b576107c2612302565b7fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c73ffffffffffffffffffffffffffffffffffffffff610800612426565b92610809612b3a565b16918284527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00602052610853816dffffffffffffffffffffffffffff600160408820015416613dd4565b91908486527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020526dffffffffffffffffffffffffffff6001604088200191167fffffffffffffffffffffffffffffffffffff00000000000000000000000000008254161790556108e56040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b0390a280f35b503461021b57604060031936011261021b57610916610908612379565b610910612325565b90612ab1565b60408051921515835263ffffffff91909116602083015290f35b0390f35b503461021b578060031936011261021b576020604051620697808152f35b503461021b57602060031936011261021b5761096c612302565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff811680159081610d85575b6001149081610d7b575b159081610d72575b50610d4a578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610cf5575b50610a1b613ed4565b610a23613ed4565b610a2b613ed4565b73ffffffffffffffffffffffffffffffffffffffff811615610cc957610a5090612ea7565b5080610c9c575060025f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad016020527fe6aabd1bffdac7ba79de73a083ff79c0386fd48083f0d75b92292f7b67eddc2f80547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408280a360045f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad016020527f0f09c9d7c70962ea814c91d9e26c48598a93bd106bce4571a625a947ad8b815b80547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408280a360035f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad01602052600160405f200160017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600160037f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63405f80a3610c0957005b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b807f1871a90c00000000000000000000000000000000000000000000000000000000602492526002600452fd5b6024827f0813ada200000000000000000000000000000000000000000000000000000000815280600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f610a12565b6004837ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f6109bf565b303b1591506109b7565b8591506109ad565b503461021b57604060031936011261021b576101ef610daa612379565b610db2612325565b90610dbb612b3a565b6134c8565b503461021b57606060031936011261021b57610dda612302565b610de2612325565b604435917fffffffff0000000000000000000000000000000000000000000000000000000083168303610e195761091693506128cf565b8380fd5b503461021b578060031936011261021b5750610930604051610e40604082612482565b600581527f352e302e3000000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906125a0565b503461021b57602060031936011261021b5760043567ffffffffffffffff811161054b57610eb0903690600401612348565b906020604051610ec08282612482565b848152818101917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101368437610ef685612876565b93610f046040519586612482565b8585527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610f3187612876565b01875b8181106110ae57505086907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b87811015611031578060051b8201358381121561102d5782019081359167ffffffffffffffff83116110295785018a833603821361021b578061100d9289610ff96001978b8e6040519483869484860198893784019083820190898252519283915e0101858152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b5190305af4611006612e78565b9030613d3b565b611017828a61288e565b52611022818961288e565b5001610f66565b8a80fd5b8980fd5b83898860405191838301848452825180915260408401948060408360051b870101940192955b8287106110645785850386f35b90919293828061109e837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516125a0565b9601920196019592919092611057565b60608782018501528301610f34565b503461021b5760206110da6110d136612533565b92919091612800565b604051908152f35b503461021b57604060031936011261021b576110fc612379565b611104612426565b61110c612b3a565b67ffffffffffffffff82169167ffffffffffffffff831461125b57818160016111a97ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b48956dffffffffffffffffffffffffffff8361119e6111e39867ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460801c16613dd4565b94909267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01907fffff0000000000000000000000000000ffffffffffffffffffffffffffffffff7dffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b1691161790556108e56040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b602484847f1871a90c000000000000000000000000000000000000000000000000000000008252600452fd5b503461021b57602060031936011261021b5760206112f36112a6612302565b73ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260ff600160405f20015460701c1690565b6040519015158152f35b503461021b5761130c366123d5565b916040517f8fb36037000000000000000000000000000000000000000000000000000000008152602081600481335afa9081156114545785916113d5575b507fffffffff000000000000000000000000000000000000000000000000000000007f8fb36037000000000000000000000000000000000000000000000000000000009116036113a957916113a4916101ef933390612800565b612cb1565b6024847f320ff74800000000000000000000000000000000000000000000000000000000815233600452fd5b90506020813d60201161144c575b816113f060209383612482565b8101031261144857517fffffffff0000000000000000000000000000000000000000000000000000000081168103611448577fffffffff0000000000000000000000000000000000000000000000000000000061134a565b8480fd5b3d91506113e3565b6040513d87823e3d90fd5b503461021b57604060031936011261021b57611479612379565b6024359067ffffffffffffffff8211610547576114a367ffffffffffffffff9236906004016123a7565b9290916114ae612b3a565b1691821580156114f7575b61125b57907f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a450916108e56040519283926020845260208401916127c2565b5067ffffffffffffffff83146114b9565b503461021b578060031936011261021b57602090604051908152f35b503461021b57604060031936011261021b5761153e612302565b602435907fffffffff000000000000000000000000000000000000000000000000000000008216809203610547578267ffffffffffffffff9273ffffffffffffffffffffffffffffffffffffffff604093602096501682527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0085528282209082528452205416604051908152f35b503461021b57602060031936011261021b57602067ffffffffffffffff600161162d6115f6612379565b67ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01541667ffffffffffffffff60405191168152f35b503461021b578060031936011261021b5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036116ba5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b807fe07c8dba0000000000000000000000000000000000000000000000000000000060049252fd5b503461021b57604060031936011261021b576116fc612379565b611704612390565b61170c612b3a565b67ffffffffffffffff821691821580156117d4575b61125b5790600161176c67ffffffffffffffff9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b0180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000008460401b16911617905516907f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae28380a380f35b5067ffffffffffffffff8314611721565b50604060031936011261021b576117fa612302565b9060243567ffffffffffffffff811161054b573660238201121561054b5761182c9036906024816004013591016124fd565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803014908115611b4f575b50611b275761187c33612a1c565b5015611aa45773ffffffffffffffffffffffffffffffffffffffff831690604051937f52d1902d000000000000000000000000000000000000000000000000000000008552602085600481865afa80958596611a70575b5061190457602484847f4c9c8ce3000000000000000000000000000000000000000000000000000000008252600452fd5b9091847f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8103611a455750813b15611a1a57807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a281518390156119e757808360206101ef95519101845af46119e1612e78565b91613d3b565b505050346119f25780f35b807fb398979f0000000000000000000000000000000000000000000000000000000060049252fd5b7f4c9c8ce3000000000000000000000000000000000000000000000000000000008452600452602483fd5b7faa1d49a4000000000000000000000000000000000000000000000000000000008552600452602484fd5b9095506020813d602011611a9c575b81611a8c60209383612482565b810103126114485751945f6118d3565b3d9150611a7f565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f6e6c792061646d696e2063616e20617574686f72697a65207468652075706760448201527f72616465000000000000000000000000000000000000000000000000000000006064820152fd5b6004827fe07c8dba000000000000000000000000000000000000000000000000000000008152fd5b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f61186e565b503461021b57602060031936011261021b576020611bb5611bb0612302565b612766565b63ffffffff60405191168152f35b503461021b578060031936011261021b57602060405162093a808152f35b503461021b57602060031936011261021b5763ffffffff604060209260043581527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad028452205460301c16604051908152f35b503461021b578060031936011261021b57602060405167ffffffffffffffff8152f35b503461021b57602060031936011261021b576020611c7560043561271d565b65ffffffffffff60405191168152f35b503461021b57604060031936011261021b57611c9f612379565b611ca7612390565b611caf612b3a565b67ffffffffffffffff82169182158015611d63575b61125b57906001611d0f67ffffffffffffffff9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b018282167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905516907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408380a380f35b5067ffffffffffffffff8314611cc4565b503461021b57604060031936011261021b57608063ffffffff65ffffffffffff81611dae611da0612379565b611da8612325565b90612691565b93929590918560405197168752166020860152166040840152166060820152f35b503461021b57606060031936011261021b57611de9612379565b611df1612325565b906044359063ffffffff82168203610e19576101ef92611e0f612b3a565b611e1882612632565b91613158565b50611e28366123d5565b9091611e3682848333612c2f565b93901580611fbe575b611f7a57611e4f83828433612800565b63ffffffff86951615801590611f61575b611f4b575b50611ec9907f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035493611ea0611e9a8284612c83565b85612e20565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035536916124fd565b344710611f1b5790846020958387611eea9551910134855af16119e1612e78565b507f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035563ffffffff60405191168152f35b604485477fcf47918100000000000000000000000000000000000000000000000000000000825260045234602452fd5b611ec9919450611f5a90612cb1565b9390611e65565b5065ffffffffffff611f728261271d565b161515611e60565b849173ffffffffffffffffffffffffffffffffffffffff6104fa6064957fffffffff0000000000000000000000000000000000000000000000000000000094612c83565b5063ffffffff841615611e3f565b503461208957604060031936011261208957611fe6612302565b73ffffffffffffffffffffffffffffffffffffffff612003612325565b9161200c612b3a565b1690813b156120895773ffffffffffffffffffffffffffffffffffffffff60245f928360405195869485937f7a9e5e4b0000000000000000000000000000000000000000000000000000000085521660048401525af1801561207e57612070575080f35b61207c91505f90612482565b005b6040513d5f823e3d90fd5b5f80fd5b34612089576040600319360112612089576120a6612302565b6024359081151580920361208957602073ffffffffffffffffffffffffffffffffffffffff7f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138926120f5612b3a565b1692835f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad008252600160405f200180547fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff6eff00000000000000000000000000008460701b169116179055604051908152a2005b34612089576020600319360112612089576020611bb5612188612379565b612632565b346120895760206003193601126120895760206121b06121ab612379565b6125e3565b67ffffffffffffffff60405191168152f35b34612089576060600319360112612089576121db612302565b60243567ffffffffffffffff8111612089576121fb903690600401612348565b91906044359067ffffffffffffffff82168092036120895761221e939293612b3a565b73ffffffffffffffffffffffffffffffffffffffff5f9416935b8381101561207c578060051b820135907fffffffff0000000000000000000000000000000000000000000000000000000082168092036120895783867f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde9491516020600195835f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00825260405f20815f52825260405f20857fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055604051908152a301612238565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361208957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361208957565b9181601f840112156120895782359167ffffffffffffffff8311612089576020808501948460051b01011161208957565b6004359067ffffffffffffffff8216820361208957565b6024359067ffffffffffffffff8216820361208957565b9181601f840112156120895782359167ffffffffffffffff8311612089576020838186019501011161208957565b9060406003198301126120895760043573ffffffffffffffffffffffffffffffffffffffff8116810361208957916024359067ffffffffffffffff821161208957612422916004016123a7565b9091565b6024359063ffffffff8216820361208957565b6040810190811067ffffffffffffffff82111761245557604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761245557604052565b67ffffffffffffffff811161245557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612509826124c3565b916125176040519384612482565b829481845281830111612089578281602093845f960137010152565b60606003198201126120895760043573ffffffffffffffffffffffffffffffffffffffff81168103612089579160243573ffffffffffffffffffffffffffffffffffffffff8116810361208957916044359067ffffffffffffffff821161208957612422916004016123a7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b600161262967ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460401c1690565b6dffffffffffffffffffffffffffff600161268161268c9367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b015460801c16613457565b505090565b9073ffffffffffffffffffffffffffffffffffffffff6126ea65ffffffffffff949367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b91165f5260205260405f2054906127136dffffffffffffffffffffffffffff8360301c16613457565b9490931693909291565b5f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205265ffffffffffff60405f20541661275981613494565b1561276357505f90565b90565b73ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205261268c6dffffffffffffffffffffffffffff600160405f20015416613457565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b929061284473ffffffffffffffffffffffffffffffffffffffff936128709360405195869481602087019916895216604085015260608085015260808401916127c2565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b51902090565b67ffffffffffffffff81116124555760051b60200190565b80518210156128a25760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9190916129238373ffffffffffffffffffffffffffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260ff600160405f20015460701c1690565b15612931575050505f905f90565b73ffffffffffffffffffffffffffffffffffffffff81163003612981575061297b907f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035492612e20565b14905f90565b9073ffffffffffffffffffffffffffffffffffffffff612a0293165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020527fffffffff0000000000000000000000000000000000000000000000000000000060405f2091165f5260205267ffffffffffffffff60405f205416612ab1565b919015612a155763ffffffff8216159190565b5f91508190565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc6709097602052604090205465ffffffffffff81169190612a869060301c6dffffffffffffffffffffffffffff16613457565b509092801515915081612a9857509190565b905065ffffffffffff612aaa42613f2b565b1610159190565b67ffffffffffffffff81811603612acb5750506001905f90565b65ffffffffffff9291612add91612691565b505092168015159081612a9857509190565b9065ffffffffffff8091169116019065ffffffffffff8211612b0d57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b612b4436336135dc565b9015612b4d5750565b63ffffffff16612b9c5767ffffffffffffffff612b6936613752565b5090507ff07e038f000000000000000000000000000000000000000000000000000000005f52336004521660245260445ffd5b612c2c6040516020810190338252306040820152606080820152612c2481602060808201368152365f838301375f8236830101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3601160101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612482565b519020612cb1565b50565b9092919073ffffffffffffffffffffffffffffffffffffffff84163003612c5a5761242293506136eb565b9192906004841015612c7057505050505f905f90565b61242293612c7d91612c83565b916128cf565b9060041161208957357fffffffff000000000000000000000000000000000000000000000000000000001690565b5f8181527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad026020526040902054909190603081901c63ffffffff169065ffffffffffff1680612d2657837f60a299b0000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b65ffffffffffff612d3642613f2b565b16811115612d6a57837f18cb6b7a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b612d779093919293613494565b612df5578190805f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000081541690557f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d5f80a390565b7f78a5d6e4000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b907fffffffff000000000000000000000000000000000000000000000000000000006040519173ffffffffffffffffffffffffffffffffffffffff602084019416845216604082015260408152612870606082612482565b3d15612ea2573d90612e89826124c3565b91612e976040519384612482565b82523d5f602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc6709097602052604090205465ffffffffffff1615908115613047575f7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf606073ffffffffffffffffffffffffffffffffffffffff612f4684612f4142613f2b565b612aef565b94613027604051612f5681612439565b65ffffffffffff881681526dffffffffffffffffffffffffffff602082018881528880527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad01602052604089208686168a5260205265ffffffffffff8060408b20945116167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000084541617835551167fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b65ffffffffffff604051968688521660208701528660408701521693a390565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f7b4501b7c347294b6ab7642a0f3ba6ad26efef1601fdfb1d54a7ff5bc670909760205260408120546131539391927ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf926060926130d590869060301c6dffffffffffffffffffffffffffff16613e6c565b96908680527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260408720848416885260205260408720907fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b613027565b9092919267ffffffffffffffff82169167ffffffffffffffff831461342b5773ffffffffffffffffffffffffffffffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9265ffffffffffff836131f360609567ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8484165f526020528160405f2054161598895f1461332f576132286133119163ffffffff61322042613f2b565b911690612aef565b916dffffffffffffffffffffffffffff8a6132926040519361324985612439565b878716855263ffffffff602086019316835267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8888165f52602052858060405f20945116167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000084541617835551167fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b63ffffffff604051981688521660208701528660408701521693a390565b50613426816133726133d59367ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8686165f5260205261339b8a6dffffffffffffffffffffffffffff60405f205460301c16613e6c565b93909167ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8686165f5260205260405f20907fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff73ffffffffffffffffffffffffffff00000000000083549260301b169116179055565b613311565b827f1871a90c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b61346042613f2b565b63ffffffff82169165ffffffffffff604082901c811692168211613488575090915f91508190565b60201c63ffffffff1692565b65ffffffffffff62093a8091160165ffffffffffff8111612b0d5765ffffffffffff806134c042613f2b565b169116111590565b67ffffffffffffffff81169167ffffffffffffffff831461342b5761351e8267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b73ffffffffffffffffffffffffffffffffffffffff82165f5260205265ffffffffffff60405f205416156135d55761359c73ffffffffffffffffffffffffffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b8282165f526020525f604081205516907ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c1665f80a3600190565b5050505f90565b9060048110613645573073ffffffffffffffffffffffffffffffffffffffff8316146136935761360c905f613a5d565b9290911580613656575b61364d5761362391612ab1565b90156136455763ffffffff808093169116908180821191180218169081159190565b50505f905f90565b5050505f905f90565b50305f9081527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00602052604090206001015460701c60ff16613616565b9050600411612089577f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad035461297b5f357fffffffff000000000000000000000000000000000000000000000000000000001630612e20565b91906004821061364d573073ffffffffffffffffffffffffffffffffffffffff84161461371c579061360c91613a5d565b6137269250612c83565b61297b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad03549130612e20565b5f9060048110613a535780600411612089577fffffffff000000000000000000000000000000000000000000000000000000005f3516907f853551b80000000000000000000000000000000000000000000000000000000082148015613a2a575b8015613a01575b80156139d8575b80156139af575b6139a3577f18ff183c000000000000000000000000000000000000000000000000000000008214801561397a575b8015613951575b613915577f25c471a000000000000000000000000000000000000000000000000000000000821480156138ec575b61387757503082527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad006020526040822090825260205267ffffffffffffffff6040822054169181929190565b905060241161021b578061021b575060043567ffffffffffffffff811681036120895760016138e067ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b01541690600191905f90565b507fb7d2b16200000000000000000000000000000000000000000000000000000000821461382b565b9150506024116120895760043573ffffffffffffffffffffffffffffffffffffffff81168091036120895761394990612766565b6001915f9190565b507f08d6122d0000000000000000000000000000000000000000000000000000000082146137fd565b507f167bd3950000000000000000000000000000000000000000000000000000000082146137f6565b5050506001905f905f90565b507fd22b59890000000000000000000000000000000000000000000000000000000082146137c8565b507fa64d95ce0000000000000000000000000000000000000000000000000000000082146137c1565b507f529629520000000000000000000000000000000000000000000000000000000082146137ba565b507f30cae1870000000000000000000000000000000000000000000000000000000082146137b3565b50505f905f905f90565b60048210613a53577fffffffff00000000000000000000000000000000000000000000000000000000613a908383612c83565b16917f853551b80000000000000000000000000000000000000000000000000000000083148015613d12575b8015613ce9575b8015613cc0575b8015613c97575b6139a3577f18ff183c0000000000000000000000000000000000000000000000000000000083148015613c6e575b8015613c45575b613c10577f25c471a00000000000000000000000000000000000000000000000000000000083148015613be7575b613b82575050305f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0060205260405f20905f5260205267ffffffffffffffff60405f205416905f91905f90565b909150602411612089576004013567ffffffffffffffff811681036120895760016138e067ffffffffffffffff9267ffffffffffffffff165f527f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0160205260405f2090565b507fb7d2b162000000000000000000000000000000000000000000000000000000008314613b34565b909150602411612089576004013573ffffffffffffffffffffffffffffffffffffffff81168091036120895761394990612766565b507f08d6122d000000000000000000000000000000000000000000000000000000008314613b06565b507f167bd395000000000000000000000000000000000000000000000000000000008314613aff565b507fd22b5989000000000000000000000000000000000000000000000000000000008314613ad1565b507fa64d95ce000000000000000000000000000000000000000000000000000000008314613aca565b507f52962952000000000000000000000000000000000000000000000000000000008314613ac3565b507f30cae187000000000000000000000000000000000000000000000000000000008314613abc565b90613d785750805115613d5057805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580613dcb575b613d89575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15613d81565b613de563ffffffff91939293613457565b505092168063ffffffff84168181115f14613e52570363ffffffff8111612b0d57613e3363ffffffff8067ffffffff00000000935b16806206978011816206978018021816612f4142613f2b565b9360201b166dffffffffffff00000000000000008460401b1617179190565b505067ffffffff00000000613e3363ffffffff805f613e1a565b613e7d63ffffffff91939293613457565b505092168063ffffffff84168181115f14613ebb570363ffffffff8111612b0d57613e3363ffffffff67ffffffff00000000925b16612f4142613f2b565b505067ffffffff00000000613e3363ffffffff5f613eb1565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615613f0357565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b65ffffffffffff8111613f435765ffffffffffff1690565b7f6dfcc650000000000000000000000000000000000000000000000000000000005f52603060045260245260445ffdfea2646970667358221220c0abd5032d446d7babecb00bbe69337c4e4b8a98c6b67fdd87abe147f6ba4a8864736f6c634300081a0033","sourceMap":"574:1559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3256:31:154;574:1559:0;3256:31:154;;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;574:1559:0;-1:-1:-1;;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;966:10:99;;574:1559:0;;;12337:34:94;12333:102;;12444:39;;;;:::i;:::-;;574:1559:0;;12333:102:94;574:1559:0;12394:30:94;;;;;574:1559:0;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20367:38:94;966:10:99;;;;20367:38:94;:::i;:::-;837:15:177;;20433:26:94;574:1559:0;819:34:177;837:15;819:34;:::i;:::-;574:1559:0;;20433:26:94;;;:::i;:::-;20566:12;;:44;;;;574:1559:0;20562:149:94;;574:1559:0;;;;;3281:5:171;;;;;3066;;574:1559:0;3060:42:171;574:1559:0;966:10:99;20927:35:94;966:10:99;;;;20927:35:94;:::i;:::-;574:1559:0;;;;21796:12:94;574:1559:0;;;;;;;;21845:18:94;;;:48;;;;574:1559:0;21841:128:94;;;574:1559:0;;;;;;;21287:66:94;574:1559:0;;;;;21796:12:94;574:1559:0;;21160:1:94;574:1559:0;;;;;;;;;;;;;;;;;;21796:12:94;574:1559:0;;;;;;;;;;;;;;;;;;21796:12:94;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;966:10:99;574:1559:0;;;;;;;;;;;;;;;;;;;:::i;:::-;21287:66:94;;;574:1559:0;;;;;;;;;;21841:128:94;574:1559:0;21916:42:94;;;;;574:1559:0;;21916:42:94;21845:48;21868:25;;;;:::i;:::-;21867:26;21845:48;;;20562:149;574:1559:0;20679:20:94;574:1559:0;20679:20:94;574:1559:0;20679:20:94;;;;:::i;:::-;20633:67;;;;966:10:99;574:1559:0;;;;;;;;20633:67:94;20566:44;20583:8;;;;:26;;20566:44;20583:26;574:1559:0;;;;20595:14:94;;20566:44;;574:1559:0;;;;;;;;;;;;;23892:35:94;574:1559:0;;;;:::i;:::-;23839:20:94;;;;;;;:::i;:::-;23892:35;;;;:::i;:::-;574:1559:0;;;;23941:12:94;574:1559:0;;;;;;;;23941:40:94;23937:616;574:1559:0;;;;24004:38:94;;;;;574:1559:0;;24004:38:94;23937:616;574:1559:0;;966:10:99;;24063:19:94;;24059:494;;23937:616;;;574:1559:0;23937:616:94;;574:1559:0;;;23941:12:94;574:1559:0;;;;;;;;;;;;;;23941:12:94;574:1559:0;;;;;;;;;;;;24715:37:94;574:1559:0;;24715:37:94;;;574:1559:0;;;24059:494:94;574:1559:0;24250:30:94;966:10:99;24250:30:94;:::i;:::-;574:1559:0;;;;;;;6760:71:94;574:1559:0;;;;;;;;;;;;;;24316:76:94;966:10:99;24324:56:94;574:1559:0;;;;;;24324:56:94;:::i;:::-;24316:76;:::i;:::-;24410:8;;;:23;;;;24059:494;24406:137;;24059:494;24406:137;24460:68;574:1559:0;;;;;24460:68:94;;;;966:10:99;574:1559:0;24460:68:94;;574:1559:0;;;;;;;;;;;;;24460:68:94;24410:23;24422:11;;;24410:23;;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;18555:49:94;574:1559:0;;;:::i;:::-;7025:72:94;;;:::i;:::-;574:1559:0;;;;;6760:71:94;574:1559:0;;18475:64:94;574:1559:0;;18475:29:94;574:1559:0;;;18475:29:94;574:1559:0;;18475:64:94;:::i;:::-;574:1559:0;;;;;6760:71:94;574:1559:0;;;18475:29:94;574:1559:0;;;18434:29:94;574:1559:0;;;;;;;;;18555:49:94;574:1559:0;;18555:49:94;;;;574:1559:0;;;;;;;;;;;;;;;;;;;18555:49:94;;;;574:1559:0;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;8921:6:94;574:1559:0;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;8837:64:95;574:1559:0;;;;;;;4301:16:95;574:1559:0;;;;4726:16:95;;:34;;;;574:1559:0;4805:1:95;4790:16;:50;;;;574:1559:0;4855:13:95;:30;;;;574:1559:0;4851:91:95;;;574:1559:0;4805:1:95;574:1559:0;;;;8837:64:95;574:1559:0;4979:67:95;;574:1559:0;6893:76:95;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;574:1559:0;;;7475:26:94;7471:108;;7661:42;;;:::i;:::-;;15507:45;15503:114;;-1:-1:-1;574:1559:0;-1:-1:-1;574:1559:0;;;16308:8:94;574:1559:0;;15627:22:94;574:1559:0;;;;;;-1:-1:-1;15673:31:94;-1:-1:-1;;15673:31:94;574:1559:0;-1:-1:-1;574:1559:0;;;16308:8:94;574:1559:0;;15627:22:94;574:1559:0;;;;;;-1:-1:-1;15673:31:94;-1:-1:-1;;15673:31:94;574:1559:0;-1:-1:-1;574:1559:0;16308:8:94;574:1559:0;;4805:1:95;574:1559:0;-1:-1:-1;574:1559:0;15627:22:94;4805:1:95;574:1559:0;;;;;;;4805:1:95;574:1559:0;15673:31:94;-1:-1:-1;15673:31:94;;5066:101:95;;574:1559:0;5066:101:95;574:1559:0;8837:64:95;574:1559:0;;8837:64:95;574:1559:0;5142:14:95;574:1559:0;;;4805:1:95;574:1559:0;;5142:14:95;574:1559:0;15503:114:94;15575:31;;574:1559:0;15575:31:94;;574:1559:0;;;15575:31:94;7471:108;574:1559:0;7524:44:94;;;;574:1559:0;;;7524:44:94;4979:67:95;574:1559:0;;;;8837:64:95;574:1559:0;4979:67:95;;;4851:91;574:1559:0;4908:23:95;;;;;4855:30;4872:13;;;4855:30;;;4790:50;4818:4;4810:25;:30;;-1:-1:-1;4790:50:95;;4726:34;;;-1:-1:-1;4726:34:95;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;12167:28:94;574:1559:0;;:::i;:::-;;;:::i;:::-;7025:72:94;;;:::i;:::-;12167:28;:::i;574:1559:0:-;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;1806:13:100;;;574:1559:0;;;;;;1801:155:100;1838:3;1821:15;;;;;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4091:55:154;574:1559:0;;;1627:26:100;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4049:25:154;1907:4:100;;4049:25:154;;;;:::i;:::-;1907:4:100;;4091:55:154;:::i;:::-;1857:88:100;;;;:::i;:::-;;;;;;:::i;:::-;;574:1559:0;1806:13:100;;574:1559:0;;;;;;;;1821:15:100;;;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1627:26:100;574:1559:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;7025:72:94;;:::i;:::-;574:1559:0;;;16707:21:94;574:1559:0;16707:21:94;;16703:90;;16866:16;;:8;:62;16944:47;16866:16;574:1559:0;16866:16:94;;16827;16866;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;16866:16:94;:27;574:1559:0;;;;16866:62:94;:::i;:::-;16827:16;;;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;16827:16:94;:27;574:1559:0;;;;;;;;;;;;;;16944:47:94;574:1559:0;;16944:47:94;;;;574:1559:0;;;;;;;;;;;;;;;;;;;16703:90:94;574:1559:0;16751:31:94;;;;;574:1559:0;;16751:31:94;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;:::i;:::-;;;-1:-1:-1;574:1559:0;6760:71:94;574:1559:0;;;9136:25:94;574:1559:0;-1:-1:-1;574:1559:0;9136:25:94;574:1559:0;;;;8975:193:94;;574:1559:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;24956:47:94;;;966:10:99;574:1559:0;966:10:99;;24956:47:94;;;;;;;;;;;574:1559:0;;;;;;24956:97:94;24952:175;;966:10:99;25156:35:94;966:10:99;25136:56:94;966:10:99;;25156:35:94;;:::i;:::-;25136:56;:::i;24952:175::-;574:1559:0;25076:40:94;;;;966:10:99;574:1559:0;;25076:40:94;24956:47;;;;;;;;;;;;;;;;;:::i;:::-;;;574:1559:0;;;;;;;;;;;;;24956:47:94;;574:1559:0;;;;24956:47:94;;;-1:-1:-1;24956:47:94;;;574:1559:0;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;7025:72:94;;;;;:::i;:::-;574:1559:0;11647:20:94;;;:45;;;;574:1559:0;11643:114:94;;574:1559:0;11771:24:94;574:1559:0;;;;;;;;;;;;;;;:::i;11647:45:94:-;11671:21;574:1559:0;11671:21:94;;11647:45;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;9396:18:94;574:1559:0;9396:18:94;574:1559:0;;9396:18:94;574:1559:0;9396:18:94;574:1559:0;;;;6760:71:94;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;9896:8:94;:16;574:1559:0;;:::i;:::-;;;;;16308:8:94;574:1559:0;;;;;;;9896:16:94;:22;574:1559:0;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;5115:6:96;574:1559:0;5106:4:96;5098:23;5094:145;;574:1559:0;;;811:66:133;574:1559:0;;;5094:145:96;5199:29;;574:1559:0;5199:29:96;;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;7025:72:94;;:::i;:::-;574:1559:0;;;16188:20:94;;;:45;;;;574:1559:0;16184:114:94;;16308:16;:8;:16;574:1559:0;16308:16:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;16308:16:94;:25;574:1559:0;;;;;;;;;;;;;;16360:37:94;;;;;574:1559:0;;16188:45:94;16212:21;574:1559:0;16212:21:94;;16188:45;;574:1559:0;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4692:6:96;574:1559:0;4683:4:96;;4675:23;:120;;;;;574:1559:0;4658:251:96;;;1969:33:0;1991:10;1969:33;:::i;:::-;574:1559;;;;;;;;;;6156:52:96;574:1559:0;6156:52:96;;574:1559:0;6156:52:96;574:1559:0;6156:52:96;;;;;;;;;;574:1559:0;-1:-1:-1;6152:437:96;;574:1559:0;6518:60:96;;;;;574:1559:0;;6518:60:96;6152:437;6250:40;;;811:66:133;6250:40:96;;6246:120;;1748:29:133;;;:34;1744:119;;574:1559:0;;811:66:133;574:1559:0;;;811:66:133;574:1559:0;2407:36:133;;;;574:1559:0;;;;2458:15:133;:11;;4049:25:154;;574:1559:0;4091:55:154;4049:25;;;;;;;;;:::i;:::-;4091:55;;:::i;2454:148:133:-;6163:9;;;;6159:70;;574:1559:0;;6159:70:133;6199:19;;574:1559:0;6199:19:133;;;1744:119;1805:47;;;574:1559:0;;;1805:47:133;;6246:120:96;6317:34;;;574:1559:0;;;6317:34:96;;6156:52;;;;574:1559:0;6156:52:96;;574:1559:0;6156:52:96;;;;;;574:1559:0;6156:52:96;;;:::i;:::-;;;574:1559:0;;;;;6156:52:96;;;;;;;-1:-1:-1;6156:52:96;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4658:251:96;574:1559:0;4869:29:96;;;;;4675:120;574:1559:0;;;811:66:133;574:1559:0;;4753:42:96;;4675:120;;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;8790:7:94;574:1559:0;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;19920:12:94;574:1559:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;5902:16:94;574:1559:0;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;7025:72:94;;:::i;:::-;574:1559:0;;;15507:20:94;;;:45;;;;574:1559:0;15503:114:94;;15627:16;:8;:16;574:1559:0;15627:16:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;15627:16:94;:22;574:1559:0;;;;;;;;;;;15673:31:94;;;;;574:1559:0;;15507:45:94;15531:21;574:1559:0;15531:21:94;;15507:45;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;11957:70:94;7025:72;;;:::i;:::-;11985:25;;;:::i;:::-;11957:70;;:::i;574:1559:0:-;;;;;:::i;:::-;966:10:99;;22573:38:94;966:10:99;;;;22573:38:94;:::i;:::-;22671:10;;;:26;;;574:1559:0;22667:131:94;;22830:35;966:10:99;;;;22830:35:94;:::i;:::-;574:1559:0;22875:12:94;574:1559:0;;23067:12:94;;;:45;;;574:1559:0;23063:116:94;;574:1559:0;;;;23271:14:94;574:1559:0;23337:20:94;23312:46;23337:20;;;;:::i;:::-;23312:46;;:::i;:::-;23271:14;574:1559:0;;;;:::i;:::-;23437:9:94;3086:21:154;:29;3082:123;;3256:31;;;;;;3304:55;3256:31;;;;23437:9:94;3256:31:154;;;;;:::i;3304:55::-;;23271:14:94;574:1559:0;;;;;;;;;3082:123:154;574:1559:0;3165:21:154;;3138:56;;;574:1559:0;;23437:9:94;574:1559:0;;3138:56:154;23063:116:94;574:1559:0;23136:32:94;;;;;;:::i;:::-;23063:116;;;;23067:45;23083:24;574:1559:0;23083:24:94;;;:::i;:::-;574:1559:0;23083:29:94;;23067:45;;22667:131;22766:20;;574:1559:0;22766:20:94;574:1559:0;22766:20:94;574:1559:0;22766:20:94;;:::i;22671:26::-;574:1559:0;;;;22685:12:94;22671:26;;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;:::i;:::-;7025:72:94;;;:::i;:::-;574:1559:0;26626:49:94;;;;;;574:1559:0;;;;;;;26626:49:94;;;;;574:1559:0;26626:49:94;;574:1559:0;;26626:49:94;;574:1559:0;26626:49:94;;;;;;;;574:1559:0;;;26626:49:94;;;;574:1559:0;26626:49:94;;:::i;:::-;574:1559:0;26626:49:94;574:1559:0;;;;;;;;;26626:49:94;574:1559:0;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;19275:28:94;7025:72;;;:::i;:::-;574:1559:0;;;;;6760:71:94;574:1559:0;;19226:25:94;574:1559:0;;;19226:25:94;574:1559:0;;;;;;;;;;;;;;;;;;19275:28:94;574:1559:0;;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;574:1559:0;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;574:1559:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;7025:72:94;;;;;:::i;:::-;574:1559:0;;;;17320:124:94;17362:3;17340:20;;;;;;574:1559:0;;;;;;;;;;;;;;;;;17850:51:94;574:1559:0;;;;;;6760:71:94;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;17850:51:94;574:1559:0;17325:13:94;;574:1559:0;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;574:1559:0;;;;;-1:-1:-1;574:1559:0;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;574:1559:0;;;;;;:::o;:::-;;-1:-1:-1;;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;574:1559:0;;;;;;;;;;;:::o;9966:195:94:-;10129:8;:16;574:1559:0;9966:195:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;10129:16:94;:25;574:1559:0;;;;9966:195:94;:::o;10202:205::-;574:1559:0;10367:8:94;:16;3696:14:177;10202:205:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;10367:16:94;:27;574:1559:0;;;;3696:14:177;:::i;:::-;10360:40:94;;10202:205;:::o;10448:479::-;;574:1559:0;10724:16:94;574:1559:0;10448:479:94;;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;10724:16:94;:33;574:1559:0;-1:-1:-1;574:1559:0;;;;-1:-1:-1;574:1559:0;;;10837:22:94;574:1559:0;;;;;10837:22:94;:::i;:::-;574:1559:0;;;;;;;;10448:479:94:o;19471:255::-;-1:-1:-1;574:1559:0;19639:12:94;574:1559:0;;;;-1:-1:-1;574:1559:0;;;19682:21:94;;;:::i;:::-;:37;;;;-1:-1:-1;19471:255:94;:::o;19682:37::-;19471:255;:::o;9485:210::-;574:1559:0;;-1:-1:-1;574:1559:0;6760:71:94;574:1559:0;;3696:14:177;574:1559:0;9653:29:94;574:1559:0;-1:-1:-1;574:1559:0;9653:29:94;574:1559:0;;3696:14:177;:::i;574:1559:0:-;;;;;;;;;;;;;;;-1:-1:-1;574:1559:0;;;;;;;;;;;:::o;26181:181:94:-;;;574:1559:0;;26181:181:94;26322:32;26181:181;574:1559:0;;26322:32:94;;;;;;;574:1559:0;;;;;;;;;;;;;;;;;;;:::i;:::-;26322:32:94;;;;;;;;:::i;:::-;574:1559:0;26312:43:94;;26181:181;:::o;574:1559:0:-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7871:802:94;;;;8040:22;;574:1559:0;;-1:-1:-1;574:1559:0;6760:71:94;574:1559:0;;;9136:25:94;574:1559:0;-1:-1:-1;574:1559:0;9136:25:94;574:1559:0;;;;8975:193:94;;8040:22;;;;8078:17;;;8086:5;8078:17;8086:5;8078:17;:::o;8036:631::-;574:1559:0;;;8134:4:94;8116:23;8134:4;;574:1559:0;31950:34:94;574:1559:0;31932:14:94;574:1559:0;31950:34:94;;:::i;:::-;31932:52;8374:42;-1:-1:-1;8374:42:94;:::o;8112:555::-;574:1559:0;;8555:23:94;574:1559:0;;-1:-1:-1;574:1559:0;6760:71:94;574:1559:0;;;;-1:-1:-1;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;-1:-1:-1;574:1559:0;;;8555:23:94;:::i;:::-;8599:57;;;;;574:1559:0;;;8611:17:94;8592:64;;:::o;8599:57::-;-1:-1:-1;;;;;8592:64:94:o;10968:418::-;574:1559:0;;11116:264:94;574:1559:0;;;;;;;;;;;;;;;10837:22:94;;574:1559:0;;;;10837:22:94;:::i;:::-;-1:-1:-1;10870:50:94;;11301:17;;;;-1:-1:-1;11301:17:94;:53;;11293:76;;10968:418;:::o;11301:53::-;837:15:177;;574:1559:0;819:34:177;837:15;819:34;:::i;:::-;574:1559:0;-1:-1:-1;11322:32:94;11293:76;10968:418;:::o;:::-;574:1559:0;;;;11120:21:94;574:1559:0;;11157:16:94;;11165:4;11157:16;11171:1;11157:16;:::o;11116:264::-;574:1559:0;11253:26:94;;;;;:::i;:::-;574:1559:0;;;;11301:17:94;;;:53;;;;11293:76;;;:::o;574:1559:0:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27036:503:94;27154:32;1073:8:99;966:10;27154:32:94;:::i;:::-;27200:10;;27196:337;;27036:503;:::o;27196:337::-;574:1559:0;;;;;27288:33:94;1073:8:99;27288:33:94;:::i;:::-;27346:54;;;;-1:-1:-1;27346:54:94;966:10:99;27346:54:94;574:1559:0;;;;;-1:-1:-1;27346:54:94;27226:297;27439:69;574:1559:0;;26322:32:94;;;966:10:99;;574:1559:0;;27489:4:94;574:1559:0;;;;;;;;;26322:32:94;574:1559:0;;;;;1073:8:99;574:1559:0;;1073:8:99;-1:-1:-1;574:1559:0;;;;-1:-1:-1;1073:8:99;;574:1559:0;;;;;;1073:8:99;574:1559:0;;;;26322:32:94;;;;;;;;:::i;:::-;574:1559:0;26312:43:94;;27439:69;:::i;:::-;;27036:503::o;30054:378::-;;;;;574:1559:0;;;30247:4:94;30229:23;30247:4;;30275:26;;;;:::i;30225:201::-;30339:76;;;30353:1;30339:15;;30353:1;;;30339:76;;;;-1:-1:-1;30339:76:94;-1:-1:-1;30332:83:94;:::o;30339:76::-;30370:45;30394:20;;;;:::i;:::-;30370:45;;:::i;32339:116::-;;32445:1;574:1559:0;;;;;;;32339:116:94:o;25389:751::-;-1:-1:-1;574:1559:0;;;25571:12:94;574:1559:0;;;;;;25389:751:94;;;574:1559:0;;;;;;;;;25677:14:94;;;25714:38;;-1:-1:-1;25714:38:94;;574:1559:0;;-1:-1:-1;25714:38:94;25673:294;574:1559:0;819:34:177;837:15;819:34;:::i;:::-;574:1559:0;25773:28:94;;574:1559:0;;;25824:34:94;;-1:-1:-1;25824:34:94;;574:1559:0;;-1:-1:-1;25824:34:94;25769:198;25879:21;;;;;;;:::i;:::-;25875:92;;25769:198;;574:1559:0;-1:-1:-1;574:1559:0;25571:12:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;;;26073:37:94;-1:-1:-1;26073:37:94;;25389:751;:::o;25875:92::-;25923:33;-1:-1:-1;25923:33:94;;574:1559:0;;-1:-1:-1;25923:33:94;32529:153;;574:1559:0;;;32646:28:94;574:1559:0;32646:28:94;;;574:1559:0;;;;;;;;;;32646:28:94;;;;;;:::i;574:1559:0:-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;574:1559:0;;;;:::o;:::-;;;:::o;13188:1138:94:-;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;;;;;;;;13548:44:94;;13625:591;;;;-1:-1:-1;14231:62:94;574:1559:0;;13662:29:94;837:15:177;819:34;837:15;819:34;:::i;:::-;13662:29:94;:::i;:::-;574:1559:0;;;;;;;:::i;:::-;;;;;;;;13741:55:94;;574:1559:0;;;;;;16308:8:94;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14231:62:94;;13188:1138;:::o;13625:591::-;574:1559:0;;;;-1:-1:-1;574:1559:0;;;;;;;;;;14039:166:94;;-1:-1:-1;;14231:62:94;;574:1559:0;;14090:115:94;;-1:-1:-1;;574:1559:0;;;;14090:115:94;:::i;:::-;14040:16;;574:1559:0;;;16308:8:94;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14039:166:94;13625:591;;13188:1138;;;;;574:1559:0;;;13435:21:94;574:1559:0;13435:21:94;;13431:90;;574:1559:0;14231:62:94;13548:16;574:1559:0;13548:16:94;;574:1559:0;13548:16:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;13548:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;-1:-1:-1;574:1559:0;;;13548:44:94;13602:12;13625:591;;;;;13662:29;574:1559:0;837:15:177;574:1559:0;819:34:177;837:15;819:34;:::i;:::-;574:1559:0;;13662:29:94;;:::i;:::-;574:1559:0;;;13705:16:94;574:1559:0;;;;;;:::i;:::-;;;;;;;13741:55:94;;;574:1559:0;;;;;;;;16308:8:94;574:1559:0;;;;;;;13705:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;;-1:-1:-1;574:1559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14231:62:94;;13188:1138;:::o;13625:591::-;14090:16;14039:166;14090:16;;14040;14090;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;14090:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;14090:115:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;14090:115:94;:::i;:::-;14040:16;;;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;14040:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;-1:-1:-1;574:1559:0;;;;;;;;;;;;;;;;14039:166:94;13625:591;;13431:90;13479:31;;;;;574:1559:0;;13479:31:94;;3393:159:177;819:34;837:15;819:34;:::i;:::-;574:1559:0;;;;;4807:2:177;574:1559:0;;;;;;;3092:19:177;;574:1559:0;;-1:-1:-1;3092:76:177;;-1:-1:-1;;;;;3393:159:177:o;3092:76::-;4771:2;574:1559:0;;;;3393:159:177:o;32095:134:94:-;574:1559:0;;32095:134:94;574:1559:0;;;;;;;;837:15:177;819:34;837:15;819:34;:::i;:::-;574:1559:0;;;32178:44:94;;32095:134;:::o;14587:473::-;574:1559:0;;;14755:21:94;574:1559:0;14755:21:94;;14751:90;;14855:16;;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;14855:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;-1:-1:-1;574:1559:0;;;14855:44:94;14851:87;;14955:16;574:1559:0;14955:16:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;14955:16:94;574:1559:0;;;-1:-1:-1;574:1559:0;;;;;;;;;15004:28:94;;574:1559:0;15004:28:94;;14855:8;14587:473;:::o;14851:87::-;14915:12;;;574:1559:0;14915:12:94;:::o;30536:1107::-;;30675:1;30661:15;;30657:63;;30752:4;574:1559:0;;;30734:23:94;30730:334;;31137:27;;1073:8:99;31137:27:94;:::i;:::-;31244:16;;;;:49;;;30536:1107;31240:97;;31386:23;;;:::i;:::-;31423:7;;31419:55;;574:1559:0;;;;;;;3281:5:171;;;;;3066;;574:1559:0;3060:42:171;574:1559:0;31618:10:94;;;31610:26;30536:1107;:::o;31419:55::-;31446:17;;1073:8:99;31446:17:94;1073:8:99;31446:17:94;:::o;31240:97::-;31309:17;;;1073:8:99;31309:17:94;1073:8:99;31309:17:94;:::o;31244:49::-;-1:-1:-1;30752:4:94;-1:-1:-1;574:1559:0;;;6760:71:94;574:1559:0;;;;;9136:25:94;;574:1559:0;;;;;31244:49:94;;30730:334;31028:20;;30675:1;574:1559:0;;;31932:14:94;574:1559:0;31950:34:94;1073:8:99;574:1559:0;;;30752:4:94;31950:34;:::i;30536:1107::-;;;30675:1;30661:15;;30657:63;;30752:4;574:1559:0;;;30734:23:94;30730:334;;31137:27;;;;:::i;30730:334::-;31028:20;;;;:::i;:::-;31950:34;31932:14;574:1559:0;30752:4:94;;31950:34;:::i;27945:1678::-;1073:8:99;28112:15:94;28126:1;28112:15;;28108:66;;574:1559:0;28126:1:94;574:1559:0;;;;1073:8:99;574:1559:0;;28342:35:94;574:1559:0;28342:35:94;;:89;;;;27945:1678;28342:146;;;;27945:1678;28342:201;;;;27945:1678;28342:262;;;;27945:1678;28325:343;;574:1559:0;28775:41:94;;:98;;;;27945:1678;28775:161;;;;27945:1678;28758:414;;574:1559:0;29291:35:94;;:75;;;;27945:1678;29287:254;;29596:4;;574:1559:0;;6760:71:94;574:1559:0;;;;;;;;;;;;;;;;29551:65:94;;;;27945:1678;:::o;29287:254::-;574:1559:0;;29462:4:94;574:1559:0;;;;;;;28126:1:94;574:1559:0;;;;;;;;9896:8:94;:16;574:1559:0;29506:20:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;9896:16:94;:22;574:1559:0;;29492:38:94;29500:4;29492:38;;-1:-1:-1;29492:38:94;:::o;29291:75::-;29330:36;574:1559:0;29330:36:94;;29291:75;;28758:414;574:1559:0;;;29042:4:94;574:1559:0;;;28126:1:94;574:1559:0;;;;;;;;;29088:27:94;;;:::i;:::-;29137:4;29129:32;-1:-1:-1;29129:32:94;;:::o;28775:161::-;28889:47;574:1559:0;28889:47:94;;28775:161;;:98;28832:41;574:1559:0;28832:41:94;;28775:98;;28325:343;28629:28;;;28637:4;28629:28;1073:8:99;28629:28:94;1073:8:99;28629:28:94;:::o;28342:262::-;28559:45;574:1559:0;28559:45:94;;28342:262;;:201;28504:39;574:1559:0;28504:39:94;;28342:201;;:146;28447:41;574:1559:0;28447:41:94;;28342:146;;:89;28393:38;574:1559:0;28393:38:94;;28342:89;;28108:66;28143:20;;1073:8:99;28143:20:94;1073:8:99;28143:20:94;1073:8:99;28143:20:94;:::o;27945:1678::-;28126:1;28112:15;;28108:66;;574:1559:0;28202:20:94;;;;:::i;:::-;574:1559:0;28342:35:94;574:1559:0;28342:35:94;;:89;;;;27945:1678;28342:146;;;;27945:1678;28342:201;;;;27945:1678;28342:262;;;;27945:1678;28325:343;;574:1559:0;28775:41:94;;:98;;;;27945:1678;28775:161;;;;27945:1678;28758:414;;574:1559:0;29291:35:94;;:75;;;;27945:1678;29287:254;;29596:4;;;-1:-1:-1;574:1559:0;6760:71:94;574:1559:0;;;-1:-1:-1;574:1559:0;;-1:-1:-1;574:1559:0;;;;;-1:-1:-1;574:1559:0;;;29551:65:94;-1:-1:-1;29551:65:94;;-1:-1:-1;27945:1678:94;:::o;29287:254::-;29452:15;;;29462:4;574:1559:0;;;28126:1:94;574:1559:0;;;;;;;;;9896:8:94;:16;574:1559:0;29506:20:94;574:1559:0;;;;16308:8:94;574:1559:0;;;;;;;29291:75:94;29330:36;574:1559:0;29330:36:94;;29291:75;;28758:414;29032:15;;;29042:4;574:1559:0;;;28126:1:94;574:1559:0;;;;;;;;;;29088:27:94;;;:::i;28775:161::-;28889:47;574:1559:0;28889:47:94;;28775:161;;:98;28832:41;574:1559:0;28832:41:94;;28775:98;;28342:262;28559:45;574:1559:0;28559:45:94;;28342:262;;:201;28504:39;574:1559:0;28504:39:94;;28342:201;;:146;28447:41;574:1559:0;28447:41:94;;28342:146;;:89;28393:38;574:1559:0;28393:38:94;;28342:89;;4421:582:154;;4593:8;;-1:-1:-1;574:1559:0;;5674:21:154;:17;;5799:158;;;;;;5670:354;5994:19;5694:1;5994:19;;5694:1;5994:19;4589:408;574:1559:0;;4841:22:154;:49;;;4589:408;4837:119;;4969:17;;:::o;4837:119::-;574:1559:0;4917:24:154;;4862:1;4917:24;574:1559:0;4917:24:154;574:1559:0;;4862:1:154;4917:24;4841:49;4867:18;;;:23;4841:49;;4033:390:177;3696:14;574:1559:0;4033:390:177;;;;3696:14;:::i;:::-;574:1559:0;;;;;;;;4279:16:177;;;:39;574:1559:0;;;;;;;;;4339:21:177;574:1559:0;4279:39:177;574:1559:0;4279:39:177;;574:1559:0;3281:5:171;574:1559:0;3281:5:171;3066;574:1559:0;3066:5:171;574:1559:0;3060:42:171;574:1559:0;819:34:177;837:15;819:34;:::i;4339:21::-;574:1559:0;5120:2:177;574:1559:0;;;;5089:2:177;574:1559:0;;5069:54:177;574:1559:0;4370:46:177;4033:390;:::o;4279:39::-;;;574:1559:0;4339:21:177;574:1559:0;4279:39:177;-1:-1:-1;4279:39:177;;4033:390;3696:14;574:1559:0;4033:390:177;;;;3696:14;:::i;:::-;574:1559:0;;;;;;;;4279:16:177;;;:39;574:1559:0;;;;;;;;;4339:21:177;574:1559:0;;4279:39:177;;574:1559:0;819:34:177;837:15;819:34;:::i;4279:39::-;;;574:1559:0;4339:21:177;574:1559:0;;4279:39:177;;7084:141:95;574:1559:0;8837:64:95;574:1559:0;;;;7150:18:95;7146:73;;7084:141::o;7146:73::-;7191:17;-1:-1:-1;7191:17:95;;-1:-1:-1;7191:17:95;14296:213:172;574:1559:0;14374:24:172;;14370:103;;574:1559:0;;14296:213:172;:::o;14370:103::-;14421:41;;;14452:2;14421:41;574:1559:0;;;;14421:41:172;","linkReferences":{},"immutableReferences":{"50749":[{"start":5738,"length":32},{"start":6211,"length":32}]}},"methodIdentifiers":{"ADMIN_ROLE()":"75b238fc","PUBLIC_ROLE()":"3ca7c02a","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","canCall(address,address,bytes4)":"b7009613","cancel(address,address,bytes)":"d6bb62c6","consumeScheduledOp(address,bytes)":"94c7d7ee","execute(address,bytes)":"1cff79cd","expiration()":"4665096d","getAccess(uint64,address)":"3078f114","getNonce(bytes32)":"4136a33c","getRoleAdmin(uint64)":"530dd456","getRoleGrantDelay(uint64)":"12be8727","getRoleGuardian(uint64)":"0b0a93ba","getSchedule(bytes32)":"3adc277a","getTargetAdminDelay(address)":"4c1da1e2","getTargetFunctionRole(address,bytes4)":"6d5115bd","grantRole(uint64,address,uint32)":"25c471a0","hasRole(uint64,address)":"d1f856ee","hashOperation(address,address,bytes)":"abd9bd2a","initialize(address)":"c4d66de8","isTargetClosed(address)":"a166aa89","labelRole(uint64,string)":"853551b8","minSetback()":"cc1b6c81","multicall(bytes[])":"ac9650d8","proxiableUUID()":"52d1902d","renounceRole(uint64,address)":"fe0776f5","revokeRole(uint64,address)":"b7d2b162","schedule(address,bytes,uint48)":"f801a698","setGrantDelay(uint64,uint32)":"a64d95ce","setRoleAdmin(uint64,uint64)":"30cae187","setRoleGuardian(uint64,uint64)":"52962952","setTargetAdminDelay(address,uint32)":"d22b5989","setTargetClosed(address,bool)":"167bd395","setTargetFunctionRole(address,bytes4[],uint64)":"08d6122d","updateAuthority(address,address)":"18ff183c","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"AccessManagerAlreadyScheduled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessManagerBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"AccessManagerExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialAdmin\",\"type\":\"address\"}],\"name\":\"AccessManagerInvalidInitialAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"AccessManagerLockedRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"AccessManagerNotReady\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"AccessManagerNotScheduled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgsender\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"AccessManagerUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"AccessManagerUnauthorizedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgsender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"AccessManagerUnauthorizedCancel\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AccessManagerUnauthorizedConsume\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"OperationCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"OperationExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"schedule\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"OperationScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"admin\",\"type\":\"uint64\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"since\",\"type\":\"uint48\"}],\"name\":\"RoleGrantDelayChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"since\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newMember\",\"type\":\"bool\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"guardian\",\"type\":\"uint64\"}],\"name\":\"RoleGuardianChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"label\",\"type\":\"string\"}],\"name\":\"RoleLabel\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"since\",\"type\":\"uint48\"}],\"name\":\"TargetAdminDelayUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"closed\",\"type\":\"bool\"}],\"name\":\"TargetClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"TargetFunctionRoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PUBLIC_ROLE\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"canCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"immediate\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"cancel\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"consumeScheduledOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expiration\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getAccess\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"since\",\"type\":\"uint48\"},{\"internalType\":\"uint32\",\"name\":\"currentDelay\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"pendingDelay\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"effect\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"getRoleGrantDelay\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"getRoleGuardian\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getSchedule\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"getTargetAdminDelay\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"getTargetFunctionRole\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"executionDelay\",\"type\":\"uint32\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isMember\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"executionDelay\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialAdmin\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"isTargetClosed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"label\",\"type\":\"string\"}],\"name\":\"labelRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minSetback\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"when\",\"type\":\"uint48\"}],\"name\":\"schedule\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"newDelay\",\"type\":\"uint32\"}],\"name\":\"setGrantDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"admin\",\"type\":\"uint64\"}],\"name\":\"setRoleAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"guardian\",\"type\":\"uint64\"}],\"name\":\"setRoleGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"newDelay\",\"type\":\"uint32\"}],\"name\":\"setTargetAdminDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"closed\",\"type\":\"bool\"}],\"name\":\"setTargetClosed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"},{\"internalType\":\"uint64\",\"name\":\"roleId\",\"type\":\"uint64\"}],\"name\":\"setTargetFunctionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newAuthority\",\"type\":\"address\"}],\"name\":\"updateAuthority\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Manages roles and permissions across the protocol.\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"OperationCanceled(bytes32,uint32)\":{\"details\":\"A scheduled operation was canceled.\"},\"OperationExecuted(bytes32,uint32)\":{\"details\":\"A scheduled operation was executed.\"},\"OperationScheduled(bytes32,uint32,uint48,address,address,bytes)\":{\"details\":\"A delayed operation was scheduled.\"},\"RoleAdminChanged(uint64,uint64)\":{\"details\":\"Role acting as admin over a given `roleId` is updated.\"},\"RoleGrantDelayChanged(uint64,uint32,uint48)\":{\"details\":\"Grant delay for a given `roleId` will be updated to `delay` when `since` is reached.\"},\"RoleGranted(uint64,address,uint32,uint48,bool)\":{\"details\":\"Emitted when `account` is granted `roleId`. NOTE: The meaning of the `since` argument depends on the `newMember` argument. If the role is granted to a new member, the `since` argument indicates when the account becomes a member of the role, otherwise it indicates the execution delay for this account and roleId is updated.\"},\"RoleGuardianChanged(uint64,uint64)\":{\"details\":\"Role acting as guardian over a given `roleId` is updated.\"},\"RoleLabel(uint64,string)\":{\"details\":\"Informational labelling for a roleId.\"},\"RoleRevoked(uint64,address)\":{\"details\":\"Emitted when `account` membership or `roleId` is revoked. Unlike granting, revoking is instantaneous.\"},\"TargetAdminDelayUpdated(address,uint32,uint48)\":{\"details\":\"Admin delay for a given `target` will be updated to `delay` when `since` is reached.\"},\"TargetClosed(address,bool)\":{\"details\":\"Target mode is updated (true = closed, false = open).\"},\"TargetFunctionRoleUpdated(address,bytes4,uint64)\":{\"details\":\"Role required to invoke `selector` on `target` is updated to `roleId`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"canCall(address,address,bytes4)\":{\"details\":\"Check if an address (`caller`) is authorised to call a given function on a given contract directly (with no restriction). Additionally, it returns the delay needed to perform the call indirectly through the {schedule} & {execute} workflow. This function is usually called by the targeted contract to control immediate execution of restricted functions. Therefore we only return true if the call can be performed without any delay. If the call is subject to a previously set delay (not zero), then the function should return false and the caller should schedule the operation for future execution. If `immediate` is true, the delay can be disregarded and the operation can be immediately executed, otherwise the operation can be executed if and only if delay is greater than 0. NOTE: The IAuthority interface does not include the `uint32` delay. This is an extension of that interface that is backward compatible. Some contracts may thus ignore the second return argument. In that case they will fail to identify the indirect workflow, and will consider calls that require a delay to be forbidden. NOTE: This function does not report the permissions of the admin functions in the manager itself. These are defined by the {AccessManager} documentation.\"},\"cancel(address,address,bytes)\":{\"details\":\"Cancel a scheduled (delayed) operation. Returns the nonce that identifies the previously scheduled operation that is cancelled. Requirements: - the caller must be the proposer, a guardian of the targeted function, or a global admin Emits a {OperationCanceled} event.\"},\"consumeScheduledOp(address,bytes)\":{\"details\":\"Consume a scheduled operation targeting the caller. If such an operation exists, mark it as consumed (emit an {OperationExecuted} event and clean the state). Otherwise, throw an error. This is useful for contract that want to enforce that calls targeting them were scheduled on the manager, with all the verifications that it implies. Emit a {OperationExecuted} event.\"},\"execute(address,bytes)\":{\"details\":\"Execute a function that is delay restricted, provided it was properly scheduled beforehand, or the execution delay is 0. Returns the nonce that identifies the previously scheduled operation that is executed, or 0 if the operation wasn't previously scheduled (if the caller doesn't have an execution delay). Emits an {OperationExecuted} event only if the call was scheduled and delayed.\"},\"expiration()\":{\"details\":\"Expiration delay for scheduled proposals. Defaults to 1 week. IMPORTANT: Avoid overriding the expiration with 0. Otherwise every contract proposal will be expired immediately, disabling any scheduling usage.\"},\"getAccess(uint64,address)\":{\"details\":\"Get the access details for a given account for a given role. These details include the timepoint at which membership becomes active, and the delay applied to all operation by this user that requires this permission level. Returns: [0] Timestamp at which the account membership becomes valid. 0 means role is not granted. [1] Current execution delay for the account. [2] Pending execution delay for the account. [3] Timestamp at which the pending execution delay will become active. 0 means no delay update is scheduled.\"},\"getNonce(bytes32)\":{\"details\":\"Return the nonce for the latest scheduled operation with a given id. Returns 0 if the operation has never been scheduled.\"},\"getRoleAdmin(uint64)\":{\"details\":\"Get the id of the role that acts as an admin for the given role. The admin permission is required to grant the role, revoke the role and update the execution delay to execute an operation that is restricted to this role.\"},\"getRoleGrantDelay(uint64)\":{\"details\":\"Get the role current grant delay. Its value may change at any point without an event emitted following a call to {setGrantDelay}. Changes to this value, including effect timepoint are notified in advance by the {RoleGrantDelayChanged} event.\"},\"getRoleGuardian(uint64)\":{\"details\":\"Get the role that acts as a guardian for a given role. The guardian permission allows canceling operations that have been scheduled under the role.\"},\"getSchedule(bytes32)\":{\"details\":\"Return the timepoint at which a scheduled operation will be ready for execution. This returns 0 if the operation is not yet scheduled, has expired, was executed, or was canceled.\"},\"getTargetAdminDelay(address)\":{\"details\":\"Get the admin delay for a target contract. Changes to contract configuration are subject to this delay.\"},\"getTargetFunctionRole(address,bytes4)\":{\"details\":\"Get the role required to call a function.\"},\"grantRole(uint64,address,uint32)\":{\"details\":\"Add `account` to `roleId`, or change its execution delay. This gives the account the authorization to call any function that is restricted to this role. An optional execution delay (in seconds) can be set. If that delay is non 0, the user is required to schedule any operation that is restricted to members of this role. The user will only be able to execute the operation after the delay has passed, before it has expired. During this period, admin and guardians can cancel the operation (see {cancel}). If the account has already been granted this role, the execution delay will be updated. This update is not immediate and follows the delay rules. For example, if a user currently has a delay of 3 hours, and this is called to reduce that delay to 1 hour, the new delay will take some time to take effect, enforcing that any operation executed in the 3 hours that follows this update was indeed scheduled before this update. Requirements: - the caller must be an admin for the role (see {getRoleAdmin}) - granted role must not be the `PUBLIC_ROLE` Emits a {RoleGranted} event.\"},\"hasRole(uint64,address)\":{\"details\":\"Check if a given account currently has the permission level corresponding to a given role. Note that this permission might be associated with an execution delay. {getAccess} can provide more details.\"},\"hashOperation(address,address,bytes)\":{\"details\":\"Hashing function for delayed operations.\"},\"isTargetClosed(address)\":{\"details\":\"Get whether the contract is closed disabling any access. Otherwise role permissions are applied. NOTE: When the manager itself is closed, admin functions are still accessible to avoid locking the contract.\"},\"labelRole(uint64,string)\":{\"details\":\"Give a label to a role, for improved role discoverability by UIs. Requirements: - the caller must be a global admin Emits a {RoleLabel} event.\"},\"minSetback()\":{\"details\":\"Minimum setback for all delay updates, with the exception of execution delays. It can be increased without setback (and reset via {revokeRole} in the case event of an accidental increase). Defaults to 5 days.\"},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceRole(uint64,address)\":{\"details\":\"Renounce role permissions for the calling account with immediate effect. If the sender is not in the role this call has no effect. Requirements: - the caller must be `callerConfirmation`. Emits a {RoleRevoked} event if the account had the role.\"},\"revokeRole(uint64,address)\":{\"details\":\"Remove an account from a role, with immediate effect. If the account does not have the role, this call has no effect. Requirements: - the caller must be an admin for the role (see {getRoleAdmin}) - revoked role must not be the `PUBLIC_ROLE` Emits a {RoleRevoked} event if the account had the role.\"},\"schedule(address,bytes,uint48)\":{\"details\":\"Schedule a delayed operation for future execution, and return the operation identifier. It is possible to choose the timestamp at which the operation becomes executable as long as it satisfies the execution delays required for the caller. The special value zero will automatically set the earliest possible time. Returns the `operationId` that was scheduled. Since this value is a hash of the parameters, it can reoccur when the same parameters are used; if this is relevant, the returned `nonce` can be used to uniquely identify this scheduled operation from other occurrences of the same `operationId` in invocations of {execute} and {cancel}. Emits a {OperationScheduled} event. NOTE: It is not possible to concurrently schedule more than one operation with the same `target` and `data`. If this is necessary, a random byte can be appended to `data` to act as a salt that will be ignored by the target contract if it is using standard Solidity ABI encoding.\"},\"setGrantDelay(uint64,uint32)\":{\"details\":\"Update the delay for granting a `roleId`. Requirements: - the caller must be a global admin Emits a {RoleGrantDelayChanged} event.\"},\"setRoleAdmin(uint64,uint64)\":{\"details\":\"Change admin role for a given role. Requirements: - the caller must be a global admin Emits a {RoleAdminChanged} event\"},\"setRoleGuardian(uint64,uint64)\":{\"details\":\"Change guardian role for a given role. Requirements: - the caller must be a global admin Emits a {RoleGuardianChanged} event\"},\"setTargetAdminDelay(address,uint32)\":{\"details\":\"Set the delay for changing the configuration of a given target contract. Requirements: - the caller must be a global admin Emits a {TargetAdminDelayUpdated} event.\"},\"setTargetClosed(address,bool)\":{\"details\":\"Set the closed flag for a contract. Closing the manager itself won't disable access to admin methods to avoid locking the contract. Requirements: - the caller must be a global admin Emits a {TargetClosed} event.\"},\"setTargetFunctionRole(address,bytes4[],uint64)\":{\"details\":\"Set the role required to call functions identified by the `selectors` in the `target` contract. Requirements: - the caller must be a global admin Emits a {TargetFunctionRoleUpdated} event per selector.\"},\"updateAuthority(address,address)\":{\"details\":\"Changes the authority of a target managed by this manager instance. Requirements: - the caller must be a global admin\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"AccessManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"initialize(address)\":{\"notice\":\"Initializes the proxy state.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/AccessManager.sol\":\"AccessManager\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@ethereum-attestation-service/=node_modules/@ethereum-attestation-service/\",\":@ethsign/=node_modules/@ethsign/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@synaps3/=contracts/\",\":ds-test/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=node_modules/hardhat/\",\":openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/\",\":solady/=lib/solady/src/\",\":solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/\"],\"viaIR\":true},\"sources\":{\"contracts/access/AccessManager.sol\":{\"keccak256\":\"0x88327ca2680d386f41a1e05046fc5ddd4a5570d1ca5464db223f85275a44d8ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fda1a516c41db99a0abdcc57f48b0f6edc4814d7677d0273c03823d57f3cde26\",\"dweb:/ipfs/QmRimeUiTcKrQAqwTdquZCKd1aYN5FS5B1y24P24uLQsHd\"]},\"contracts/core/primitives/Constants.sol\":{\"keccak256\":\"0xd3dac9b10f88534046b904f281588f0293fa603ec5c68ffeeaf64eec88ebe65e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d9dddce59781d9a41c012aeff533cca898b1553924f09edf192d0f534f4cc4a1\",\"dweb:/ipfs/QmdKPss1KNAneMGaTXqQSWraN1s6MDCHkMgetn5BVxzXn3\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol\":{\"keccak256\":\"0xc36716750a9095416ede9775ee8ae19f13794406a297c0dccd6146268bd36d74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://595c9227d490558d1666e32609ac6677ba4fff7187cb539c3bb2c9a3e8b63b27\",\"dweb:/ipfs/QmZgoM4Rj7NuY8pfQ9pCvpKTrk5ZJ6Sdbf8XMsSVsvwMk5\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xf72d3b11f41fccbbdcacd121f994daab8267ccfceb1fb4f247e4ba274c169d27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1e46ee40ddc9e2009176ce5d76aa2c046fd68f2ed52d02d77db191365b7c5b2e\",\"dweb:/ipfs/QmZnxgPmCCHosdvbh4J65uTaFYeGtZGzQ1sXRdeh1y68Zr\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\":{\"keccak256\":\"0x1545b1796f0b94f811d95b8b208c0668dacfc7768247d22b63161a47c4c5ef4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1dccf7856b960b2ed7565906b457812ad8d29a15d403f17702ac7e090680300\",\"dweb:/ipfs/QmUqqibiekFv84mdq7zeyRF56mLJbFyFUxWKTrz8Twzkpn\"]},\"node_modules/@openzeppelin/contracts/access/manager/IAccessManaged.sol\":{\"keccak256\":\"0xaba93d42cd70e1418782951132d97b31ddce5f50ad81090884b6d0e41caac9d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b110886f83e3e98a11255a3b56790322e8d83e513304dde71299406685fc6694\",\"dweb:/ipfs/QmPwroS7MUUk1EmsvaJqU6aarhQ8ewJtJMg7xxmTsaxZEv\"]},\"node_modules/@openzeppelin/contracts/access/manager/IAccessManager.sol\":{\"keccak256\":\"0x9be2d08a326515805bc9cf6315b7953f8d1ebe88abf48c2d645fb1fa8211a0e2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e750d656e37efaefbb2300051ec2c4c725db266c5ff89bc985f7ecb8d214c4f4\",\"dweb:/ipfs/QmT51FsZes2n2nrLLh3d8YkBYKY43CtwScZxixcLGzL9r6\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d\",\"dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196\",\"dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x911c3346ee26afe188f3b9dc267ef62a7ccf940aba1afa963e3922f0ca3d8a06\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04539f4419e44a831807d7203375d2bc6a733da256efd02e51290f5d5015218c\",\"dweb:/ipfs/QmPZ97gsAAgaMRPiE2WJfkzRsudQnW5tPAvMgGj1jcTJtR\"]},\"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23\",\"dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d\",\"dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"node_modules/@openzeppelin/contracts/utils/types/Time.sol\":{\"keccak256\":\"0x36776530f012618bc7526ceb28e77b85e582cb12d9b9466a71d4bd6bf952e4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f867d046908497287d8a67643dd5d7e38c4027af4ab0a74ffbe1d6790c383c6\",\"dweb:/ipfs/QmQ7s9gMP1nkwThFmoDifnGgpUMsMe5q5ZrAxGDsNnRGza\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"}],"type":"error","name":"AccessManagerAlreadyScheduled"},{"inputs":[],"type":"error","name":"AccessManagerBadConfirmation"},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"}],"type":"error","name":"AccessManagerExpired"},{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"type":"error","name":"AccessManagerInvalidInitialAdmin"},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"}],"type":"error","name":"AccessManagerLockedRole"},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"}],"type":"error","name":"AccessManagerNotReady"},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"}],"type":"error","name":"AccessManagerNotScheduled"},{"inputs":[{"internalType":"address","name":"msgsender","type":"address"},{"internalType":"uint64","name":"roleId","type":"uint64"}],"type":"error","name":"AccessManagerUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"AccessManagerUnauthorizedCall"},{"inputs":[{"internalType":"address","name":"msgsender","type":"address"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"AccessManagerUnauthorizedCancel"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AccessManagerUnauthorizedConsume"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"InsufficientBalance"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"type":"error","name":"SafeCastOverflowedUintDowncast"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32","indexed":true},{"internalType":"uint32","name":"nonce","type":"uint32","indexed":true}],"type":"event","name":"OperationCanceled","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32","indexed":true},{"internalType":"uint32","name":"nonce","type":"uint32","indexed":true}],"type":"event","name":"OperationExecuted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32","indexed":true},{"internalType":"uint32","name":"nonce","type":"uint32","indexed":true},{"internalType":"uint48","name":"schedule","type":"uint48","indexed":false},{"internalType":"address","name":"caller","type":"address","indexed":false},{"internalType":"address","name":"target","type":"address","indexed":false},{"internalType":"bytes","name":"data","type":"bytes","indexed":false}],"type":"event","name":"OperationScheduled","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"uint64","name":"admin","type":"uint64","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"uint32","name":"delay","type":"uint32","indexed":false},{"internalType":"uint48","name":"since","type":"uint48","indexed":false}],"type":"event","name":"RoleGrantDelayChanged","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint32","name":"delay","type":"uint32","indexed":false},{"internalType":"uint48","name":"since","type":"uint48","indexed":false},{"internalType":"bool","name":"newMember","type":"bool","indexed":false}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"uint64","name":"guardian","type":"uint64","indexed":true}],"type":"event","name":"RoleGuardianChanged","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"string","name":"label","type":"string","indexed":false}],"type":"event","name":"RoleLabel","anonymous":false},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"uint32","name":"delay","type":"uint32","indexed":false},{"internalType":"uint48","name":"since","type":"uint48","indexed":false}],"type":"event","name":"TargetAdminDelayUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"bool","name":"closed","type":"bool","indexed":false}],"type":"event","name":"TargetClosed","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"bytes4","name":"selector","type":"bytes4","indexed":false},{"internalType":"uint64","name":"roleId","type":"uint64","indexed":true}],"type":"event","name":"TargetFunctionRoleUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ADMIN_ROLE","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PUBLIC_ROLE","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function","name":"canCall","outputs":[{"internalType":"bool","name":"immediate","type":"bool"},{"internalType":"uint32","name":"delay","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"cancel","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"consumeScheduledOp"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"execute","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expiration","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getAccess","outputs":[{"internalType":"uint48","name":"since","type":"uint48"},{"internalType":"uint32","name":"currentDelay","type":"uint32"},{"internalType":"uint32","name":"pendingDelay","type":"uint32"},{"internalType":"uint48","name":"effect","type":"uint48"}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getNonce","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"}],"stateMutability":"view","type":"function","name":"getRoleGrantDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"}],"stateMutability":"view","type":"function","name":"getRoleGuardian","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getSchedule","outputs":[{"internalType":"uint48","name":"","type":"uint48"}]},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function","name":"getTargetAdminDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function","name":"getTargetFunctionRole","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"executionDelay","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"isMember","type":"bool"},{"internalType":"uint32","name":"executionDelay","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"hashOperation","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function","name":"isTargetClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"string","name":"label","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"labelRole"},{"inputs":[],"stateMutability":"view","type":"function","name":"minSetback","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint48","name":"when","type":"uint48"}],"stateMutability":"nonpayable","type":"function","name":"schedule","outputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}]},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"uint32","name":"newDelay","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setGrantDelay"},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"uint64","name":"admin","type":"uint64"}],"stateMutability":"nonpayable","type":"function","name":"setRoleAdmin"},{"inputs":[{"internalType":"uint64","name":"roleId","type":"uint64"},{"internalType":"uint64","name":"guardian","type":"uint64"}],"stateMutability":"nonpayable","type":"function","name":"setRoleGuardian"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"newDelay","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setTargetAdminDelay"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setTargetClosed"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"},{"internalType":"uint64","name":"roleId","type":"uint64"}],"stateMutability":"nonpayable","type":"function","name":"setTargetFunctionRole"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"newAuthority","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"updateAuthority"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"canCall(address,address,bytes4)":{"details":"Check if an address (`caller`) is authorised to call a given function on a given contract directly (with no restriction). Additionally, it returns the delay needed to perform the call indirectly through the {schedule} & {execute} workflow. This function is usually called by the targeted contract to control immediate execution of restricted functions. Therefore we only return true if the call can be performed without any delay. If the call is subject to a previously set delay (not zero), then the function should return false and the caller should schedule the operation for future execution. If `immediate` is true, the delay can be disregarded and the operation can be immediately executed, otherwise the operation can be executed if and only if delay is greater than 0. NOTE: The IAuthority interface does not include the `uint32` delay. This is an extension of that interface that is backward compatible. Some contracts may thus ignore the second return argument. In that case they will fail to identify the indirect workflow, and will consider calls that require a delay to be forbidden. NOTE: This function does not report the permissions of the admin functions in the manager itself. These are defined by the {AccessManager} documentation."},"cancel(address,address,bytes)":{"details":"Cancel a scheduled (delayed) operation. Returns the nonce that identifies the previously scheduled operation that is cancelled. Requirements: - the caller must be the proposer, a guardian of the targeted function, or a global admin Emits a {OperationCanceled} event."},"consumeScheduledOp(address,bytes)":{"details":"Consume a scheduled operation targeting the caller. If such an operation exists, mark it as consumed (emit an {OperationExecuted} event and clean the state). Otherwise, throw an error. This is useful for contract that want to enforce that calls targeting them were scheduled on the manager, with all the verifications that it implies. Emit a {OperationExecuted} event."},"execute(address,bytes)":{"details":"Execute a function that is delay restricted, provided it was properly scheduled beforehand, or the execution delay is 0. Returns the nonce that identifies the previously scheduled operation that is executed, or 0 if the operation wasn't previously scheduled (if the caller doesn't have an execution delay). Emits an {OperationExecuted} event only if the call was scheduled and delayed."},"expiration()":{"details":"Expiration delay for scheduled proposals. Defaults to 1 week. IMPORTANT: Avoid overriding the expiration with 0. Otherwise every contract proposal will be expired immediately, disabling any scheduling usage."},"getAccess(uint64,address)":{"details":"Get the access details for a given account for a given role. These details include the timepoint at which membership becomes active, and the delay applied to all operation by this user that requires this permission level. Returns: [0] Timestamp at which the account membership becomes valid. 0 means role is not granted. [1] Current execution delay for the account. [2] Pending execution delay for the account. [3] Timestamp at which the pending execution delay will become active. 0 means no delay update is scheduled."},"getNonce(bytes32)":{"details":"Return the nonce for the latest scheduled operation with a given id. Returns 0 if the operation has never been scheduled."},"getRoleAdmin(uint64)":{"details":"Get the id of the role that acts as an admin for the given role. The admin permission is required to grant the role, revoke the role and update the execution delay to execute an operation that is restricted to this role."},"getRoleGrantDelay(uint64)":{"details":"Get the role current grant delay. Its value may change at any point without an event emitted following a call to {setGrantDelay}. Changes to this value, including effect timepoint are notified in advance by the {RoleGrantDelayChanged} event."},"getRoleGuardian(uint64)":{"details":"Get the role that acts as a guardian for a given role. The guardian permission allows canceling operations that have been scheduled under the role."},"getSchedule(bytes32)":{"details":"Return the timepoint at which a scheduled operation will be ready for execution. This returns 0 if the operation is not yet scheduled, has expired, was executed, or was canceled."},"getTargetAdminDelay(address)":{"details":"Get the admin delay for a target contract. Changes to contract configuration are subject to this delay."},"getTargetFunctionRole(address,bytes4)":{"details":"Get the role required to call a function."},"grantRole(uint64,address,uint32)":{"details":"Add `account` to `roleId`, or change its execution delay. This gives the account the authorization to call any function that is restricted to this role. An optional execution delay (in seconds) can be set. If that delay is non 0, the user is required to schedule any operation that is restricted to members of this role. The user will only be able to execute the operation after the delay has passed, before it has expired. During this period, admin and guardians can cancel the operation (see {cancel}). If the account has already been granted this role, the execution delay will be updated. This update is not immediate and follows the delay rules. For example, if a user currently has a delay of 3 hours, and this is called to reduce that delay to 1 hour, the new delay will take some time to take effect, enforcing that any operation executed in the 3 hours that follows this update was indeed scheduled before this update. Requirements: - the caller must be an admin for the role (see {getRoleAdmin}) - granted role must not be the `PUBLIC_ROLE` Emits a {RoleGranted} event."},"hasRole(uint64,address)":{"details":"Check if a given account currently has the permission level corresponding to a given role. Note that this permission might be associated with an execution delay. {getAccess} can provide more details."},"hashOperation(address,address,bytes)":{"details":"Hashing function for delayed operations."},"isTargetClosed(address)":{"details":"Get whether the contract is closed disabling any access. Otherwise role permissions are applied. NOTE: When the manager itself is closed, admin functions are still accessible to avoid locking the contract."},"labelRole(uint64,string)":{"details":"Give a label to a role, for improved role discoverability by UIs. Requirements: - the caller must be a global admin Emits a {RoleLabel} event."},"minSetback()":{"details":"Minimum setback for all delay updates, with the exception of execution delays. It can be increased without setback (and reset via {revokeRole} in the case event of an accidental increase). Defaults to 5 days."},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"proxiableUUID()":{"details":"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceRole(uint64,address)":{"details":"Renounce role permissions for the calling account with immediate effect. If the sender is not in the role this call has no effect. Requirements: - the caller must be `callerConfirmation`. Emits a {RoleRevoked} event if the account had the role."},"revokeRole(uint64,address)":{"details":"Remove an account from a role, with immediate effect. If the account does not have the role, this call has no effect. Requirements: - the caller must be an admin for the role (see {getRoleAdmin}) - revoked role must not be the `PUBLIC_ROLE` Emits a {RoleRevoked} event if the account had the role."},"schedule(address,bytes,uint48)":{"details":"Schedule a delayed operation for future execution, and return the operation identifier. It is possible to choose the timestamp at which the operation becomes executable as long as it satisfies the execution delays required for the caller. The special value zero will automatically set the earliest possible time. Returns the `operationId` that was scheduled. Since this value is a hash of the parameters, it can reoccur when the same parameters are used; if this is relevant, the returned `nonce` can be used to uniquely identify this scheduled operation from other occurrences of the same `operationId` in invocations of {execute} and {cancel}. Emits a {OperationScheduled} event. NOTE: It is not possible to concurrently schedule more than one operation with the same `target` and `data`. If this is necessary, a random byte can be appended to `data` to act as a salt that will be ignored by the target contract if it is using standard Solidity ABI encoding."},"setGrantDelay(uint64,uint32)":{"details":"Update the delay for granting a `roleId`. Requirements: - the caller must be a global admin Emits a {RoleGrantDelayChanged} event."},"setRoleAdmin(uint64,uint64)":{"details":"Change admin role for a given role. Requirements: - the caller must be a global admin Emits a {RoleAdminChanged} event"},"setRoleGuardian(uint64,uint64)":{"details":"Change guardian role for a given role. Requirements: - the caller must be a global admin Emits a {RoleGuardianChanged} event"},"setTargetAdminDelay(address,uint32)":{"details":"Set the delay for changing the configuration of a given target contract. Requirements: - the caller must be a global admin Emits a {TargetAdminDelayUpdated} event."},"setTargetClosed(address,bool)":{"details":"Set the closed flag for a contract. Closing the manager itself won't disable access to admin methods to avoid locking the contract. Requirements: - the caller must be a global admin Emits a {TargetClosed} event."},"setTargetFunctionRole(address,bytes4[],uint64)":{"details":"Set the role required to call functions identified by the `selectors` in the `target` contract. Requirements: - the caller must be a global admin Emits a {TargetFunctionRoleUpdated} event per selector."},"updateAuthority(address,address)":{"details":"Changes the authority of a target managed by this manager instance. Requirements: - the caller must be a global admin"},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"initialize(address)":{"notice":"Initializes the proxy state."}},"version":1}},"settings":{"remappings":["@ethereum-attestation-service/=node_modules/@ethereum-attestation-service/","@ethsign/=node_modules/@ethsign/","@openzeppelin/=node_modules/@openzeppelin/","@synaps3/=contracts/","ds-test/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/","openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/","solady/=lib/solady/src/","solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/"],"optimizer":{"enabled":true,"runs":20000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/access/AccessManager.sol":"AccessManager"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/access/AccessManager.sol":{"keccak256":"0x88327ca2680d386f41a1e05046fc5ddd4a5570d1ca5464db223f85275a44d8ca","urls":["bzz-raw://fda1a516c41db99a0abdcc57f48b0f6edc4814d7677d0273c03823d57f3cde26","dweb:/ipfs/QmRimeUiTcKrQAqwTdquZCKd1aYN5FS5B1y24P24uLQsHd"],"license":"MIT"},"contracts/core/primitives/Constants.sol":{"keccak256":"0xd3dac9b10f88534046b904f281588f0293fa603ec5c68ffeeaf64eec88ebe65e","urls":["bzz-raw://d9dddce59781d9a41c012aeff533cca898b1553924f09edf192d0f534f4cc4a1","dweb:/ipfs/QmdKPss1KNAneMGaTXqQSWraN1s6MDCHkMgetn5BVxzXn3"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol":{"keccak256":"0xc36716750a9095416ede9775ee8ae19f13794406a297c0dccd6146268bd36d74","urls":["bzz-raw://595c9227d490558d1666e32609ac6677ba4fff7187cb539c3bb2c9a3e8b63b27","dweb:/ipfs/QmZgoM4Rj7NuY8pfQ9pCvpKTrk5ZJ6Sdbf8XMsSVsvwMk5"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0xf72d3b11f41fccbbdcacd121f994daab8267ccfceb1fb4f247e4ba274c169d27","urls":["bzz-raw://1e46ee40ddc9e2009176ce5d76aa2c046fd68f2ed52d02d77db191365b7c5b2e","dweb:/ipfs/QmZnxgPmCCHosdvbh4J65uTaFYeGtZGzQ1sXRdeh1y68Zr"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol":{"keccak256":"0x1545b1796f0b94f811d95b8b208c0668dacfc7768247d22b63161a47c4c5ef4e","urls":["bzz-raw://a1dccf7856b960b2ed7565906b457812ad8d29a15d403f17702ac7e090680300","dweb:/ipfs/QmUqqibiekFv84mdq7zeyRF56mLJbFyFUxWKTrz8Twzkpn"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/manager/IAccessManaged.sol":{"keccak256":"0xaba93d42cd70e1418782951132d97b31ddce5f50ad81090884b6d0e41caac9d6","urls":["bzz-raw://b110886f83e3e98a11255a3b56790322e8d83e513304dde71299406685fc6694","dweb:/ipfs/QmPwroS7MUUk1EmsvaJqU6aarhQ8ewJtJMg7xxmTsaxZEv"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/manager/IAccessManager.sol":{"keccak256":"0x9be2d08a326515805bc9cf6315b7953f8d1ebe88abf48c2d645fb1fa8211a0e2","urls":["bzz-raw://e750d656e37efaefbb2300051ec2c4c725db266c5ff89bc985f7ecb8d214c4f4","dweb:/ipfs/QmT51FsZes2n2nrLLh3d8YkBYKY43CtwScZxixcLGzL9r6"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol":{"keccak256":"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486","urls":["bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d","dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d","urls":["bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196","dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x911c3346ee26afe188f3b9dc267ef62a7ccf940aba1afa963e3922f0ca3d8a06","urls":["bzz-raw://04539f4419e44a831807d7203375d2bc6a733da256efd02e51290f5d5015218c","dweb:/ipfs/QmPZ97gsAAgaMRPiE2WJfkzRsudQnW5tPAvMgGj1jcTJtR"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5","urls":["bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23","dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea","urls":["bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d","dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/types/Time.sol":{"keccak256":"0x36776530f012618bc7526ceb28e77b85e582cb12d9b9466a71d4bd6bf952e4cc","urls":["bzz-raw://9f867d046908497287d8a67643dd5d7e38c4027af4ab0a74ffbe1d6790c383c6","dweb:/ipfs/QmQ7s9gMP1nkwThFmoDifnGgpUMsMe5q5ZrAxGDsNnRGza"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"ast":{"absolutePath":"contracts/access/AccessManager.sol","id":78,"exportedSymbols":{"AccessManager":[77],"AccessManagerUpgradeable":[50475],"C":[2476],"Initializable":[50729],"UUPSUpgradeable":[50911]},"nodeType":"SourceUnit","src":"32:2102:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".26"]},{"id":3,"nodeType":"ImportDirective","src":"57:98:0","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":78,"sourceUnit":50730,"symbolAliases":[{"foreign":{"id":2,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50729,"src":"66:13:0","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":5,"nodeType":"ImportDirective","src":"156:102:0","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","nameLocation":"-1:-1:-1","scope":78,"sourceUnit":50912,"symbolAliases":[{"foreign":{"id":4,"name":"UUPSUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50911,"src":"165:15:0","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":7,"nodeType":"ImportDirective","src":"304:123:0","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol","nameLocation":"-1:-1:-1","scope":78,"sourceUnit":50476,"symbolAliases":[{"foreign":{"id":6,"name":"AccessManagerUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50475,"src":"313:24:0","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":9,"nodeType":"ImportDirective","src":"428:59:0","nodes":[],"absolutePath":"contracts/core/primitives/Constants.sol","file":"@synaps3/core/primitives/Constants.sol","nameLocation":"-1:-1:-1","scope":78,"sourceUnit":2477,"symbolAliases":[{"foreign":{"id":8,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"437:1:0","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":77,"nodeType":"ContractDefinition","src":"574:1559:0","nodes":[{"id":54,"nodeType":"FunctionDefinition","src":"708:1055:0","nodes":[],"body":{"id":53,"nodeType":"Block","src":"778:985:0","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":25,"name":"__UUPSUpgradeable_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50783,"src":"788:22:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"788:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27,"nodeType":"ExpressionStatement","src":"788:24:0"},{"expression":{"arguments":[{"id":29,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19,"src":"843:12:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":28,"name":"__AccessManager_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48497,"src":"822:20:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":30,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"822:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31,"nodeType":"ExpressionStatement","src":"822:34:0"},{"expression":{"arguments":[{"expression":{"id":33,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1630:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":34,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1632:8:0","memberName":"MOD_ROLE","nodeType":"MemberAccess","referencedDeclaration":2464,"src":"1630:10:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"expression":{"id":35,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1642:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":36,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1644:10:0","memberName":"ADMIN_ROLE","nodeType":"MemberAccess","referencedDeclaration":2458,"src":"1642:12:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":32,"name":"_setRoleAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49190,"src":"1616:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint64_$_t_uint64_$returns$__$","typeString":"function (uint64,uint64)"}},"id":37,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1616:39:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":38,"nodeType":"ExpressionStatement","src":"1616:39:0"},{"expression":{"arguments":[{"expression":{"id":40,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1679:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":41,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1681:8:0","memberName":"OPS_ROLE","nodeType":"MemberAccess","referencedDeclaration":2470,"src":"1679:10:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"expression":{"id":42,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1691:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":43,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1693:10:0","memberName":"ADMIN_ROLE","nodeType":"MemberAccess","referencedDeclaration":2458,"src":"1691:12:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":39,"name":"_setRoleAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49190,"src":"1665:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint64_$_t_uint64_$returns$__$","typeString":"function (uint64,uint64)"}},"id":44,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1665:39:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":45,"nodeType":"ExpressionStatement","src":"1665:39:0"},{"expression":{"arguments":[{"expression":{"id":47,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1728:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":48,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1730:13:0","memberName":"VERIFIED_ROLE","nodeType":"MemberAccess","referencedDeclaration":2467,"src":"1728:15:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"expression":{"id":49,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1745:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":50,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1747:8:0","memberName":"GOV_ROLE","nodeType":"MemberAccess","referencedDeclaration":2461,"src":"1745:10:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":46,"name":"_setRoleAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49190,"src":"1714:13:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint64_$_t_uint64_$returns$__$","typeString":"function (uint64,uint64)"}},"id":51,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1714:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52,"nodeType":"ExpressionStatement","src":"1714:42:0"}]},"baseFunctions":[48485],"documentation":{"id":17,"nodeType":"StructuredDocumentation","src":"663:40:0","text":"@notice Initializes the proxy state."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":23,"kind":"modifierInvocation","modifierName":{"id":22,"name":"initializer","nameLocations":["766:11:0"],"nodeType":"IdentifierPath","referencedDeclaration":50583,"src":"766:11:0"},"nodeType":"ModifierInvocation","src":"766:11:0"}],"name":"initialize","nameLocation":"717:10:0","overrides":{"id":21,"nodeType":"OverrideSpecifier","overrides":[],"src":"757:8:0"},"parameters":{"id":20,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"initialAdmin","nameLocation":"736:12:0","nodeType":"VariableDeclaration","scope":54,"src":"728:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18,"name":"address","nodeType":"ElementaryTypeName","src":"728:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"727:22:0"},"returnParameters":{"id":24,"nodeType":"ParameterList","parameters":[],"src":"778:0:0"},"scope":77,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":76,"nodeType":"FunctionDefinition","src":"1880:251:0","nodes":[],"body":{"id":75,"nodeType":"Block","src":"1939:192:0","nodes":[],"statements":[{"assignments":[62,null],"declarations":[{"constant":false,"id":62,"mutability":"mutable","name":"isMember","nameLocation":"1955:8:0","nodeType":"VariableDeclaration","scope":75,"src":"1950:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":61,"name":"bool","nodeType":"ElementaryTypeName","src":"1950:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":69,"initialValue":{"arguments":[{"expression":{"id":64,"name":"C","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2476,"src":"1977:1:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_C_$2476_$","typeString":"type(library C)"}},"id":65,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1979:10:0","memberName":"ADMIN_ROLE","nodeType":"MemberAccess","referencedDeclaration":2458,"src":"1977:12:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"expression":{"id":66,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1991:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":67,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1995:6:0","memberName":"sender","nodeType":"MemberAccess","src":"1991:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_address","typeString":"address"}],"id":63,"name":"hasRole","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48845,"src":"1969:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint64_$_t_address_$returns$_t_bool_$_t_uint32_$","typeString":"function (uint64,address) view returns (bool,uint32)"}},"id":68,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1969:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint32_$","typeString":"tuple(bool,uint32)"}},"nodeType":"VariableDeclarationStatement","src":"1949:53:0"},{"expression":{"arguments":[{"id":71,"name":"isMember","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62,"src":"2075:8:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f6e6c792061646d696e2063616e20617574686f72697a65207468652075706772616465","id":72,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2085:38:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a03459b817a6960fe46dd5d58c663d82e1532269691d6a584c4648ecc718487","typeString":"literal_string \"Only admin can authorize the upgrade\""},"value":"Only admin can authorize the upgrade"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3a03459b817a6960fe46dd5d58c663d82e1532269691d6a584c4648ecc718487","typeString":"literal_string \"Only admin can authorize the upgrade\""}],"id":70,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"2067:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":73,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2067:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":74,"nodeType":"ExpressionStatement","src":"2067:57:0"}]},"baseFunctions":[50865],"documentation":{"id":55,"nodeType":"StructuredDocumentation","src":"1769:106:0","text":"@dev Authorizes the upgrade of the contract.\n @notice Only the admin can authorize the upgrade."},"implemented":true,"kind":"function","modifiers":[],"name":"_authorizeUpgrade","nameLocation":"1889:17:0","overrides":{"id":59,"nodeType":"OverrideSpecifier","overrides":[],"src":"1930:8:0"},"parameters":{"id":58,"nodeType":"ParameterList","parameters":[{"constant":false,"id":57,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":76,"src":"1907:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":56,"name":"address","nodeType":"ElementaryTypeName","src":"1907:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1906:9:0"},"returnParameters":{"id":60,"nodeType":"ParameterList","parameters":[],"src":"1939:0:0"},"scope":77,"stateMutability":"view","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":11,"name":"Initializable","nameLocations":["600:13:0"],"nodeType":"IdentifierPath","referencedDeclaration":50729,"src":"600:13:0"},"id":12,"nodeType":"InheritanceSpecifier","src":"600:13:0"},{"baseName":{"id":13,"name":"UUPSUpgradeable","nameLocations":["615:15:0"],"nodeType":"IdentifierPath","referencedDeclaration":50911,"src":"615:15:0"},"id":14,"nodeType":"InheritanceSpecifier","src":"615:15:0"},{"baseName":{"id":15,"name":"AccessManagerUpgradeable","nameLocations":["632:24:0"],"nodeType":"IdentifierPath","referencedDeclaration":50475,"src":"632:24:0"},"id":16,"nodeType":"InheritanceSpecifier","src":"632:24:0"}],"canonicalName":"AccessManager","contractDependencies":[],"contractKind":"contract","documentation":{"id":10,"nodeType":"StructuredDocumentation","src":"489:85:0","text":"@title AccessManager\n @dev Manages roles and permissions across the protocol."},"fullyImplemented":true,"linearizedBaseContracts":[77,50475,54285,52624,52521,50911,59481,50729],"name":"AccessManager","nameLocation":"583:13:0","scope":78,"usedErrors":[50492,50495,50756,50761,53965,53969,53973,53977,53981,53983,53989,53997,54001,54011,54015,59676,59689,61972,62261,62264,65974],"usedEvents":[50500,53872,53879,53886,53893,53906,53913,53920,53927,53936,53943,53952,53961,59403]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/src/hooks/use-get-active-licenses.ts b/src/hooks/use-get-active-licenses.ts index f8170ed99..5bb243c2d 100644 --- a/src/hooks/use-get-active-licenses.ts +++ b/src/hooks/use-get-active-licenses.ts @@ -38,18 +38,16 @@ export const useGetActiveLicenses = ( const fetchHolderPolicies = useCallback(async () => { // Validate that holder exists - if (!holder) { + if (!holder || !recipient) { setActiveLicenses([]); setLoading(false); - setError({ message: 'Holder address is missing.' }); + setError({ message: 'Holder or recipient address is missing.' }); return; } setLoading(true); try { - console.log('getActiveLicenses') - console.log(GLOBAL_CONSTANTS.ACCESS_AGG_ADDRESS) // Call the contract method const licenses: any = (await publicClient.readContract({ address: GLOBAL_CONSTANTS.ACCESS_AGG_ADDRESS, @@ -58,10 +56,6 @@ export const useGetActiveLicenses = ( args: [recipient, holder], })) as Policy[]; - console.log('getActiveLicenses') - console.log(licenses) - console.log(GLOBAL_CONSTANTS.ACCESS_AGG_ADDRESS) - // Store the response in state setActiveLicenses(licenses); setError(null); diff --git a/src/hooks/use-get-policies-terms.ts b/src/hooks/use-get-policies-terms.ts index fda3e3a95..0ce10a72d 100644 --- a/src/hooks/use-get-policies-terms.ts +++ b/src/hooks/use-get-policies-terms.ts @@ -60,9 +60,6 @@ export const useGetPoliciesTerms = ( args: [holder], })) as Policy[]; - console.log('getPoliciesTerms') - console.log(policies) - // Store the response in state setAuthorizedHolderPolicies(policies); setError(null); diff --git a/src/hooks/use-has-role.ts b/src/hooks/use-has-role.ts new file mode 100644 index 000000000..e7a7597a5 --- /dev/null +++ b/src/hooks/use-has-role.ts @@ -0,0 +1,62 @@ +// REACT IMPORTS +import { useCallback, useState } from 'react'; + +// VIEM IMPORTS +import { Address } from 'viem'; + +// LOCAL IMPORTS +import { publicClient } from '@src/clients/viem/publicClient'; +import AccessManagerAbi from '@src/config/abi/AccessManager.json'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; + +// ---------------------------------------------------------------------- + +interface HasRoleError { + message: string; + code?: number; + [key: string]: any; +} + +interface UseHasRoleHook { + hasRole?: boolean; + loading: boolean; + error?: HasRoleError | null; + fetchHasRole: (roleId: number, account: Address) => void; +} + +// ---------------------------------------------------------------------- + +export const useHasRole = (): UseHasRoleHook => { + const [hasRole, setHasRole] = useState(undefined); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const fetchHasRole = useCallback(async (roleId: number, account: Address) => { + setLoading(true); + try { + const roleData: any = await publicClient.readContract({ + address: GLOBAL_CONSTANTS.ACCESS_MANAGER_ADDRESS, + abi: AccessManagerAbi.abi, + functionName: 'hasRole', + args: [roleId, account], + }); + + const role = Boolean(roleData?.[0]); + setHasRole(role); + setError(null); + } catch (err: any) { + console.error('Error checking access:', err); + setHasRole(undefined); + setError({ message: err?.message || 'An error occurred' }); + } finally { + setLoading(false); + } + }, []); + + return { + hasRole, + loading, + error, + fetchHasRole, + }; +}; diff --git a/src/hooks/use-is-verified.ts b/src/hooks/use-is-verified.ts new file mode 100644 index 000000000..63e5644b3 --- /dev/null +++ b/src/hooks/use-is-verified.ts @@ -0,0 +1,39 @@ +// REACT IMPORTS +import { useEffect, useState } from 'react'; +import { Address } from 'viem'; + +// LOCAL IMPORTS +import { useHasRole } from './use-has-role.ts'; + +// ---------------------------------------------------------------------- + +interface UseIsVerifiedHook { + isVerified: boolean | undefined; + loading: boolean; + error?: string | null; +} + +// ---------------------------------------------------------------------- + +export const useIsVerified = (account: Address): UseIsVerifiedHook => { + const { hasRole, loading, error, fetchHasRole } = useHasRole(); + const [isVerified, setIsVerified] = useState(undefined); + + useEffect(() => { + if (account) { + fetchHasRole(3, account); // Role ID 3 for verified + } + }, [account, fetchHasRole]); + + useEffect(() => { + if (!loading && hasRole !== undefined) { + setIsVerified(hasRole); + } + }, [loading, hasRole]); + + return { + isVerified, + loading, + error: error?.message ?? null, + }; +}; diff --git a/src/hooks/use-metamask.ts b/src/hooks/use-metamask.ts index 838e7fb76..1e317c171 100644 --- a/src/hooks/use-metamask.ts +++ b/src/hooks/use-metamask.ts @@ -8,7 +8,6 @@ import { polygonAmoy } from 'viem/chains'; // METAMASK IMPORTS import { useSDK } from '@metamask/sdk-react'; -// import { enqueueSnackbar } from 'notistack'; /** * Represents the shape of the object returned by the useMetaMask hook. @@ -70,13 +69,6 @@ export function useMetaMask(): UseMetaMaskReturn { provider, } = useSDK(); - // useEffect(() => { - // if (error) { - // const errorMessage = typeof error === 'object' ? JSON.stringify(error) : String(error); - // enqueueSnackbar(`METAMASK ERROR: ${errorMessage}`); - // } - // }, [error]); - /** * We define 'connect' as a guaranteed function (non-optional). * If the sdk is not ready, this method will throw an error. diff --git a/src/hooks/use-notification-payload.ts b/src/hooks/use-notification-payload.ts index 52b721dbb..3803acb8b 100644 --- a/src/hooks/use-notification-payload.ts +++ b/src/hooks/use-notification-payload.ts @@ -1,4 +1,5 @@ import { ProfileSession } from '@lens-protocol/react-web'; +import {dicebear} from "@src/utils/dicebear.ts"; type NotificationPayload = { type: string; @@ -35,15 +36,12 @@ export const useNotificationPayload = (sessionData: ProfileSession | undefined) displayName: sessionData?.profile?.metadata?.displayName ?? '', avatar: (sessionData?.profile?.metadata?.picture as any)?.optimized?.uri ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${sessionData?.profile?.id}`, + dicebear(sessionData?.profile?.id as string), }, to: { id: toProfile.id, displayName: toProfile.displayName, - avatar: - toProfile.avatar ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${toProfile.id}`, - }, + avatar: toProfile.avatar ?? dicebear(toProfile.id)}, content, }, }; diff --git a/src/hooks/use-referrals.ts b/src/hooks/use-referrals.ts new file mode 100644 index 000000000..ff1dd70a4 --- /dev/null +++ b/src/hooks/use-referrals.ts @@ -0,0 +1,250 @@ +import { useState } from 'react'; +import emailjs from '@emailjs/browser'; +import { GLOBAL_CONSTANTS } from '@src/config-global'; +import { useSelector } from 'react-redux'; +import { + fetchInvitations as fetchInvitationsAction, + checkIfMyEmailHasPendingInvite as checkIfMyEmailHasPendingInviteAction, + acceptInvitation as acceptInvitationAction, + checkIfInvitationSent as checkIfInvitationSentAction, + checkIfEmailAlreadyAccepted as checkIfEmailAlreadyAcceptedAction, + sendInvitation as sendInvitationAction, + acceptOrCreateInvitationForUser as acceptOrCreateInvitationForUserAction +} from '@src/utils/supabase-actions'; + +export interface Invitation { + id: string; + status: 'pending' | 'accepted' | 'rejected'; + sender_email: string; + destination: string; + sender_id: string; + receiver_id: string | null; + payload: any; + created_at: string; +} + +export type EmailParams = { + to_email: string; + from_name: string; +}; + +const useReferrals = () => { + /** + * State variables to manage invitations, loading state, and error messages. + */ + const [invitations, setInvitations] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + /** + * Retrieve the current user's email and session data from Redux (or your global state). + * Adjust according to how you store user data in your application. + */ + const userEmail = useSelector((state: any) => state.auth.email); + const sessionData = useSelector((state: any) => state.auth.session); + + /** + * Fetches all invitations from the Supabase 'invitations' table filtered by senderId. + * This could be used, for example, to list all invitations sent by the current user. + * + * @param {string} senderId - The ID of the user who sent the invitations. + */ + const fetchInvitations = async (senderId: string) => { + setLoading(true); + setError(null); + + const { data, error } = await fetchInvitationsAction(senderId); + + if (error) { + setError(error); + } else { + setInvitations(data || []); + } + + setLoading(false); + }; + + /** + * Checks whether the current user's email has a pending invitation in the 'invitations' table. + * + * @returns {Promise} - Returns true if there is at least one pending invitation for the current user's email, otherwise false. + */ + const checkIfMyEmailHasPendingInvite = async (): Promise => { + setLoading(true); + setError(null); + + const { hasPending, error } = await checkIfMyEmailHasPendingInviteAction(userEmail); + + if (error) { + setError(error); + } + + setLoading(false); + return hasPending; + }; + + /** + * Accepts an existing invitation by updating its status from 'pending' to 'accepted'. + * and set the `receiver_id` to the current user's profile ID. + * + * @param {string} invitationId - The ID of the invitation to accept. + * @returns {Promise} - Returns the updated invitation if successful, otherwise null. + */ + const acceptInvitation = async (invitationId: string): Promise => { + setLoading(true); + setError(null); + + const { data, error } = await acceptInvitationAction(invitationId, sessionData?.profile?.id); + + if (error) { + setError(error); + setLoading(false); + return null; + } + + setInvitations((prev) => + prev.map((inv) => + inv.id === invitationId + ? { + ...inv, + status: 'accepted', + receiver_id: sessionData?.profile?.id, + } + : inv + ) + ); + + setLoading(false); + return data; + }; + + /** + * Checks if there is already an invitation from the current user (userEmail) to the given destinationEmail. + * + * @param {string} destinationEmail - The email to check against the 'destination' field in the database. + * @returns {Promise} - Returns true if there is an existing invitation, false otherwise. + */ + const checkIfInvitationSent = async (destinationEmail: string): Promise => { + setLoading(true); + setError(null); + + const { exists, error } = await checkIfInvitationSentAction(userEmail, destinationEmail); + + if (error) { + setError(error); + } + + setLoading(false); + return exists; + }; + + /** + * Checks if the specified email already has an accepted invitation. + * This is useful to see if the user is already enrolled/registered via invitation. + * + * @param {string} destinationEmail - The email to check. + * @returns {Promise} - Returns true if there's an invitation with status 'accepted' for this email, otherwise false. + */ + const checkIfEmailAlreadyAccepted = async (destinationEmail: string): Promise => { + setLoading(true); + setError(null); + + const { accepted, error } = await checkIfEmailAlreadyAcceptedAction(destinationEmail); + + if (error) { + setError(error); + } + + setLoading(false); + return accepted; + }; + + /** + * Sends a new invitation. Inserts a record into the 'invitations' table in Supabase, + * and then triggers an email using EmailJS. + * + * @param {string} destination - The email address of the invitee. + * @param {any} payload - Additional data you want to attach to the invitation (e.g., sender's profile info). + * @returns {Promise} - Throws an error if something goes wrong. + */ + const sendInvitation = async (destination: string, payload: any): Promise => { + const { error } = await sendInvitationAction(destination, payload, userEmail, sessionData); + + if (error) { + console.error('Error storing invitation in Supabase:', error); + throw new Error(error); + } else { + console.log('Invitation stored successfully in Supabase.'); + + // Send the email using EmailJS + await sendEmail({ + to_email: destination, + from_name: payload?.data?.from?.displayName ?? 'Watchit Web3xAI', + }); + } + }; + + /** + * ------------------------------------------------------------------ + * Accept or Create an 'accepted' invitation for a given userEmail. + * + * 1) If there's any 'pending' invitation with destination = userEmail, + * accept the first one found. + * 2) Otherwise, create a new invitation record with status = 'accepted'. + * ------------------------------------------------------------------ + */ + const acceptOrCreateInvitationForUser = async () => { + const { error } = await acceptOrCreateInvitationForUserAction(userEmail, sessionData); + + if (error) { + console.error('Error in acceptOrCreateInvitationForUser:', error); + } + }; + + const sendEmail = async (data: EmailParams) => { + const { from_name, to_email } = data; + + const templateParams = { + to_email, + from_name, + from_email: GLOBAL_CONSTANTS.SENDER_EMAIL, + }; + + try { + const result = await emailjs.send( + GLOBAL_CONSTANTS.EMAIL_SERVICE_ID, + GLOBAL_CONSTANTS.EMAIL_TEMPLATE_ID, + templateParams, + GLOBAL_CONSTANTS.EMAIL_API_KEY + ); + console.log('Email sent successfully:', result.text); + } catch (err) { + console.error('Error sending email:', err); + throw err; + } + }; + + /** + * Return all state variables and methods so they can be used in any component that imports this hook. + */ + return { + // State + invitations, + loading, + error, + + // Fetch/CRUD Methods + fetchInvitations, + sendInvitation, + sendEmail, + + // Additional Validation/Check Methods + checkIfMyEmailHasPendingInvite, + acceptInvitation, + checkIfInvitationSent, + checkIfEmailAlreadyAccepted, + acceptOrCreateInvitationForUser + }; +}; + +export default useReferrals; diff --git a/src/layouts/_common/account-popover.tsx b/src/layouts/_common/account-popover.tsx index 3ae680e66..1568b7211 100644 --- a/src/layouts/_common/account-popover.tsx +++ b/src/layouts/_common/account-popover.tsx @@ -9,13 +9,13 @@ import { ProfileSession, useLogout, useSession } from '@lens-protocol/react-web' // MUI IMPORTS import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; -import Avatar from '@mui/material/Avatar'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import { alpha } from '@mui/material/styles'; import MenuItem from '@mui/material/MenuItem'; import IconButton from '@mui/material/IconButton'; import Typography from '@mui/material/Typography'; +import { CircularProgress } from '@mui/material'; // ANIMATIONS IMPORTS import { m } from 'framer-motion'; @@ -34,9 +34,11 @@ import { setBalance, setSession, } from '@redux/auth'; -import { CircularProgress } from '@mui/material'; import { useWeb3Auth } from '@src/hooks/use-web3-auth.ts'; import NeonPaper from '@src/sections/publication/NeonPaperContainer.tsx'; +import AvatarProfile from '@src/components/avatar/avatar.tsx'; +import { notifyError } from '@notifications/internal-notifications.ts'; +import { ERRORS } from '@notifications/errors.ts'; // ---------------------------------------------------------------------- @@ -54,50 +56,99 @@ export default function AccountPopover() { const router = useRouter(); const popover = usePopover(); const { web3Auth } = useWeb3Auth(); + + // Redux states: session loading and login modal open status const { isLoginModalOpen, isUpdatingMetadata, isSessionLoading } = useSelector( (state: any) => state.auth ); + // Lens session data const { data, loading }: ReadResult = useSession(); const sessionData = useSelector((state: any) => state.auth.session); + + // Lens logout hook const { execute: logoutExecute } = useLogout(); + // Update Redux with the current session loading status from Lens useEffect(() => { dispatch(setAuthLoading({ isSessionLoading: loading })); }, [loading]); + // Convert session data to string so that changes in the object trigger this effect const parsedSessionData = JSON.stringify(data); + // Update Redux session whenever Lens session data changes (unless updating metadata) useEffect(() => { if (!isUpdatingMetadata) { dispatch(setSession({ session: data })); } }, [parsedSessionData, isUpdatingMetadata]); + // Close popover when session status or login modal changes useEffect(() => { popover.onClose(); }, [sessionData?.authenticated, isLoginModalOpen, isSessionLoading]); /** - * Log out from the current session. + * Log out from the current session (Lens + Web3Auth). */ const logout = useCallback(async () => { try { + // Logout from Lens await logoutExecute(); + + // Logout from Web3Auth await web3Auth?.logout(); - // Clear the balance for logged-out users + // Clear the balance (Redux state) dispatch(setBalance({ balance: 0 })); + localStorage.removeItem('sessionExpiration'); } catch (err) { console.error('Error during logout:', err); } }, [logoutExecute]); + /** + * This function reads the saved expiration time and logs out if we've passed it. + */ + const checkSessionExpiration = useCallback(() => { + const expirationStr = localStorage.getItem('sessionExpiration'); + if (!expirationStr) return; // If there's no stored timestamp, do nothing + const expirationTime = parseInt(expirationStr, 10); + + if (Date.now() >= expirationTime) { + logout(); // Call the logout callback + notifyError(ERRORS.BUNDLER_UNAVAILABLE); + } + }, []); + + /** + * Periodically check if the session timestamp in localStorage has expired. + */ + useEffect(() => { + // Check once immediately on mount + checkSessionExpiration(); + + // Then check every 60 seconds + const intervalId = setInterval(() => { + checkSessionExpiration(); + }, 60 * 1000); + + // Cleanup: clear the interval on unmount + return () => clearInterval(intervalId); + }, [checkSessionExpiration]); + + /** + * Handle a click on a popover item (e.g., "Profile"). + */ const handleClickItem = (path: string) => { popover.onClose(); router.push(path); }; + /** + * Handlers for opening/closing the login modal. + */ const handleOpenModal = () => { dispatch(openLoginModal()); }; @@ -106,15 +157,18 @@ export default function AccountPopover() { dispatch(closeLoginModal()); }; + // If the session is still loading, show a spinner if (isSessionLoading) { return ; } + // Conditionally use a "NeonPaper" wrapper if metadata is updating const EffectPaper = isUpdatingMetadata ? NeonPaper : Box; return ( <> + {/* If user is authenticated, show their avatar icon */} {sessionData?.authenticated ? ( - `solid 2px ${theme.palette.background.default}`, + border: (theme: any) => `solid 2px ${theme.palette.background.default}`, }} /> - ) : ( - <> - )} + ) : null} + {/* If not authenticated, show a "Social Login" button */} @@ -162,8 +215,9 @@ export default function AccountPopover() { - ) : undefined} + ) : null} + {/* If authenticated, show handle/ID */} {sessionData?.authenticated && !loading ? ( <> - {`${sessionData?.profile?.id}`} + {sessionData?.profile?.id} - ) : ( - <> - )} + ) : null} + {/* The popover shown on avatar or name click */} + {/* Logout menu option */} - ) : ( - <> - )} + ) : null} + + {/* The modal for logging in */} ); diff --git a/src/layouts/_common/notifications-popover/notification-item.tsx b/src/layouts/_common/notifications-popover/notification-item.tsx index f5b4bf51f..8a5870bee 100644 --- a/src/layouts/_common/notifications-popover/notification-item.tsx +++ b/src/layouts/_common/notifications-popover/notification-item.tsx @@ -1,5 +1,4 @@ import Stack from '@mui/material/Stack'; -import Avatar from '@mui/material/Avatar'; import ListItemText from '@mui/material/ListItemText'; import ListItemAvatar from '@mui/material/ListItemAvatar'; import ListItemButton from '@mui/material/ListItemButton'; @@ -22,6 +21,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { useNotificationPayload } from '@src/hooks/use-notification-payload.ts'; import { usePublication } from '@lens-protocol/react'; import { CircularProgress } from '@mui/material'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; export type NotificationItemProps = { id: any; @@ -114,7 +114,7 @@ export default function NotificationItem({ notification, onMarkAsRead }: Notific const renderAvatar = ( - + ); const description: string | null = notification.payload.data.content.rawDescription; diff --git a/src/layouts/dashboard/header.tsx b/src/layouts/dashboard/header.tsx index 9c3153324..4e520bc7c 100644 --- a/src/layouts/dashboard/header.tsx +++ b/src/layouts/dashboard/header.tsx @@ -22,6 +22,7 @@ import { ReadResult } from '@lens-protocol/react/dist/declarations/src/helpers/r import { useDispatch, useSelector } from 'react-redux'; import { toggleDrawer } from '@redux/drawer'; + // ---------------------------------------------------------------------- export default function Header({ children }: PropsWithChildren) { diff --git a/src/pages/dashboard/achievements.tsx b/src/pages/dashboard/achievements.tsx index 8872cbfa3..bc1ccb934 100644 --- a/src/pages/dashboard/achievements.tsx +++ b/src/pages/dashboard/achievements.tsx @@ -1,20 +1,21 @@ -import { Helmet } from 'react-helmet-async'; // sections import BlankView from '@src/sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function BlankPage() { return ( - <> - - WatchIt | Achievements - - + - + ); } diff --git a/src/pages/dashboard/analytics.tsx b/src/pages/dashboard/analytics.tsx index fda282f6c..a6e09dce6 100644 --- a/src/pages/dashboard/analytics.tsx +++ b/src/pages/dashboard/analytics.tsx @@ -1,19 +1,20 @@ -import { Helmet } from 'react-helmet-async'; import BlankView from '../../sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function OverviewAnalyticsPage() { return ( - <> - - WatchIt | Analytics - - + - + ); } diff --git a/src/pages/dashboard/community.tsx b/src/pages/dashboard/community.tsx index 8cc15c690..6e4764d95 100644 --- a/src/pages/dashboard/community.tsx +++ b/src/pages/dashboard/community.tsx @@ -1,19 +1,20 @@ -import { Helmet } from 'react-helmet-async'; import BlankView from '../../sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function OverviewBookingPage() { return ( - <> - - WatchIt | Community - - + - + ); } diff --git a/src/pages/dashboard/events.tsx b/src/pages/dashboard/events.tsx index b32c831cc..6aae5a7d0 100644 --- a/src/pages/dashboard/events.tsx +++ b/src/pages/dashboard/events.tsx @@ -1,21 +1,21 @@ -import { Helmet } from 'react-helmet-async'; // sections -// import { CalendarView } from '@src/sections/calendar/view'; import ComingSoonView from '@src/sections/coming-soon/view.tsx'; import BlankView from '@src/sections/blank/view.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function CalendarPage() { return ( - <> - - WatchIt | Events - - + - + ); } diff --git a/src/pages/dashboard/explore.tsx b/src/pages/dashboard/explore.tsx index f2814c312..2db04eabb 100644 --- a/src/pages/dashboard/explore.tsx +++ b/src/pages/dashboard/explore.tsx @@ -1,21 +1,22 @@ -import { Helmet } from 'react-helmet-async'; import { ExploreView } from '@src/sections/explore'; import HeaderContent from '@src/layouts/dashboard/header-content.tsx'; import Header from '@src/layouts/dashboard/header.tsx'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; // ---------------------------------------------------------------------- export default function OverviewAppPage() { return ( - <> - - Dashboard: App - - +
- + ); } diff --git a/src/pages/dashboard/finance.tsx b/src/pages/dashboard/finance.tsx index dd9a2044a..828c45223 100644 --- a/src/pages/dashboard/finance.tsx +++ b/src/pages/dashboard/finance.tsx @@ -1,8 +1,9 @@ -import { Helmet } from 'react-helmet-async'; import OverviewBankingView from '@src/sections/finance'; import Header from '@src/layouts/dashboard/header.tsx'; import HeaderContent from '@src/layouts/dashboard/header-content.tsx'; import withAuth from '@src/components/should-login/withAuth'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; const OverviewBankingViewWithAuth = withAuth( OverviewBankingView, @@ -12,15 +13,15 @@ const OverviewBankingViewWithAuth = withAuth( export default function OverviewBankingPage() { return ( - <> - - WatchIt | Finance - - +
- +
); } diff --git a/src/pages/dashboard/governance/details.tsx b/src/pages/dashboard/governance/details.tsx index 789e0fc8e..09899db93 100644 --- a/src/pages/dashboard/governance/details.tsx +++ b/src/pages/dashboard/governance/details.tsx @@ -1,5 +1,7 @@ // sections import { GovernanceDetailsView } from '../../../sections/governance/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- @@ -8,5 +10,13 @@ export default function ProductDetailsPage() { // // const { id } = params; - return ; + return ( + + + + ) } diff --git a/src/pages/dashboard/governance/list.tsx b/src/pages/dashboard/governance/list.tsx index c39d2bd13..d5c3dc6da 100644 --- a/src/pages/dashboard/governance/list.tsx +++ b/src/pages/dashboard/governance/list.tsx @@ -1,21 +1,22 @@ -import { Helmet } from 'react-helmet-async'; // sections // import { GovernanceListView } from '../../../sections/governance/view'; import ComingSoonView from '@src/sections/coming-soon/view.tsx'; import BlankView from '@src/sections/blank/view.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function GovernanceList() { return ( - <> - - WatchIt | Governance - - + - + ); } diff --git a/src/pages/dashboard/governance/new.tsx b/src/pages/dashboard/governance/new.tsx index fec91910f..e4f778c6c 100644 --- a/src/pages/dashboard/governance/new.tsx +++ b/src/pages/dashboard/governance/new.tsx @@ -1,17 +1,18 @@ -import { Helmet } from 'react-helmet-async'; // sections import { GovernanceCreateView } from '@src/sections/governance/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function UserCreatePage() { return ( - <> - - WatchIt | Governance - - + - + ); } diff --git a/src/pages/dashboard/marketing.tsx b/src/pages/dashboard/marketing.tsx index c39074312..a0d8b3f22 100644 --- a/src/pages/dashboard/marketing.tsx +++ b/src/pages/dashboard/marketing.tsx @@ -1,19 +1,20 @@ -import { Helmet } from 'react-helmet-async'; import BlankView from '../../sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function ChatPage() { return ( - <> - - WatchIt | Marketing - - + - + ); } diff --git a/src/pages/dashboard/marketplace.tsx b/src/pages/dashboard/marketplace.tsx index 721c96b35..92a5c4836 100644 --- a/src/pages/dashboard/marketplace.tsx +++ b/src/pages/dashboard/marketplace.tsx @@ -1,19 +1,20 @@ -import { Helmet } from 'react-helmet-async'; import BlankView from '../../sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function OverviewEcommercePage() { return ( - <> - - WatchIt | Marketplace - - + - + ); } diff --git a/src/pages/dashboard/ownership.tsx b/src/pages/dashboard/ownership.tsx index 4ea026beb..4a8160770 100644 --- a/src/pages/dashboard/ownership.tsx +++ b/src/pages/dashboard/ownership.tsx @@ -1,20 +1,21 @@ -import { Helmet } from 'react-helmet-async'; // sections import BlankView from '../../sections/blank/view'; import ComingSoonView from '../../sections/coming-soon/view'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // ---------------------------------------------------------------------- export default function FileManagerPage() { return ( - <> - - WatchIt | Ownership - - + - + ); } diff --git a/src/pages/dashboard/studio.tsx b/src/pages/dashboard/studio.tsx index 1c4a41c6c..dfa6ece8f 100644 --- a/src/pages/dashboard/studio.tsx +++ b/src/pages/dashboard/studio.tsx @@ -1,4 +1,3 @@ -import { Helmet } from 'react-helmet-async'; // import { useState } from 'react'; // import { // ProfileSession, @@ -20,6 +19,8 @@ import { Helmet } from 'react-helmet-async'; // import { verifyIpfsData } from '@src/utils/ipfs.ts'; import ComingSoonView from '@src/sections/coming-soon/view.tsx'; import BlankView from '@src/sections/blank/view.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; // const hashes = [ // "f0155122018174e2a7079e266bab70f870249dfa50de77bfcd1263a29a7290c9bedad1ba8", @@ -213,11 +214,11 @@ export default function OverviewFilePage() { // }; return ( - <> - - WatchIt | Studio - - + */} {/*
*/} {/*
*/} - + ); } diff --git a/src/pages/dashboard/user/profile.tsx b/src/pages/dashboard/user/profile.tsx index 56aaf5cd6..71034090c 100644 --- a/src/pages/dashboard/user/profile.tsx +++ b/src/pages/dashboard/user/profile.tsx @@ -1,5 +1,4 @@ -import { Helmet } from 'react-helmet-async'; -// sections +// LOCAL IMPORTS import { UserProfileView } from '@src/sections/user/view'; import { useParams } from '@src/routes/hooks'; import Header from '@src/layouts/dashboard/header.tsx'; @@ -13,30 +12,6 @@ export default function UserProfilePage() { return ( <> - - Dashboard: User Profile | {id} - {/*OG*/} - - - - - {/*Twitter*/} - - - - - - -
diff --git a/src/redux/auth/index.ts b/src/redux/auth/index.ts index 7af8e7fb3..3a1bdf122 100644 --- a/src/redux/auth/index.ts +++ b/src/redux/auth/index.ts @@ -7,6 +7,7 @@ export type AuthReducerState = { balance: number; currentStep: number; isUpdatingMetadata: boolean; + email: string; }; const initialState: AuthReducerState = { @@ -16,6 +17,7 @@ const initialState: AuthReducerState = { balance: 0, currentStep: 0, isUpdatingMetadata: false, + email: '', }; const authSlice = createSlice({ @@ -43,6 +45,9 @@ const authSlice = createSlice({ setSession: (state, action: PayloadAction<{ session: any }>) => { state.session = action.payload.session; }, + setEmail: (state, action: PayloadAction) => { + state.email = action.payload; + }, updateProfileData: ( state, action: PayloadAction<{ @@ -86,6 +91,7 @@ export const { setSession, updateProfileData, setIsUpdatingMetadata, + setEmail } = authSlice.actions; export default authSlice.reducer; diff --git a/src/sections/finance/components/box-row.tsx b/src/sections/finance/components/finance-box-row.tsx similarity index 72% rename from src/sections/finance/components/box-row.tsx rename to src/sections/finance/components/finance-box-row.tsx index 785ac2f1d..3f303ef8f 100644 --- a/src/sections/finance/components/box-row.tsx +++ b/src/sections/finance/components/finance-box-row.tsx @@ -2,7 +2,7 @@ import { FC, PropsWithChildren } from 'react'; import Box from '@mui/material/Box'; -export const BoxRow: FC = ({ children }) => ( +export const FinanceBoxRow: FC = ({ children }) => ( = ({ children }) => ( ); -export default BoxRow; +export default FinanceBoxRow; diff --git a/src/sections/finance/components/finance-contacts.tsx b/src/sections/finance/components/finance-contacts.tsx index 2b33bcff4..7342a8999 100644 --- a/src/sections/finance/components/finance-contacts.tsx +++ b/src/sections/finance/components/finance-contacts.tsx @@ -7,7 +7,6 @@ import Stack from '@mui/material/Stack'; import CardHeader from '@mui/material/CardHeader'; import Card, { CardProps } from '@mui/material/Card'; import Tooltip from '@mui/material/Tooltip'; -import Avatar from '@mui/material/Avatar'; import IconButton from '@mui/material/IconButton'; import ListItemText from '@mui/material/ListItemText'; import Box from '@mui/material/Box'; @@ -16,6 +15,7 @@ import Box from '@mui/material/Box'; import Iconify from '@src/components/iconify'; import Carousel, { useCarousel } from '@src/components/carousel/index'; import NavigationArrows from '@src/components/carousel/NavigationArrows'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; // routes import { paths } from '@src/routes/paths'; @@ -50,7 +50,7 @@ export default function FinanceContactsCarousel({ if (time == null) time = 500; // eslint-disable-next-line @typescript-eslint/no-unused-expressions (pos = +pos), (time = +time); - + window.requestAnimationFrame(function step(currentTime) { start = !start ? currentTime : start; let progress = currentTime - start; @@ -149,11 +149,9 @@ function SlideContacts({ chunk, goToProfile, onClickArrow }: SlideContactsProps) sx={{ cursor: 'pointer', flexGrow: 1 }} onClick={() => goToProfile(profile.id)} > - = ({ address, recipient, depositHo alignItems="center" justifyContent="space-between" > - + Connected Wallet = ({ address, recipient, depositHo > {address ? truncateAddress(address) : 'No wallet connected'} - + - + Available = ({ address, recipient, depositHo > {formatBalanceNumber(balance ?? 0)} MMC - + = ({ sx, lgUp, ...other }) = variant="body1" sx={{ opacity: 0.8, - maxWidth: 220, + maxWidth: lgUp ? 220 : 'auto', mb: { xs: 1, xl: 2 }, }} > Invite your friends and complete tasks to grow your balance. + } sx={{ pl: 1.5, diff --git a/src/sections/finance/components/finance-metamask-helper.tsx b/src/sections/finance/components/finance-metamask-helper.tsx index 8ba1ce683..c253f5877 100644 --- a/src/sections/finance/components/finance-metamask-helper.tsx +++ b/src/sections/finance/components/finance-metamask-helper.tsx @@ -1,39 +1,30 @@ import Stack from "@mui/material/Stack"; -import {Box} from "@mui/system"; import Typography from "@mui/material/Typography"; -import Button from "@mui/material/Button"; +import Link from "@mui/material/Link"; const FinanceMetamaskHelper = () => { - const handleDownloadMetaMask = () => { window.location.href = 'https://metamask.app.link'; - } + }; return ( - - - MetaMask Wallet Required - - To use this feature, you need to have the MetaMask wallet installed. - If you don't have it, you can download it from the official website. - - - - + + + MetaMask required.{" "} + + Click here + {" "} + if you don't have it installed. + - ) -} + ); +}; export default FinanceMetamaskHelper; diff --git a/src/sections/finance/components/finance-modal.tsx b/src/sections/finance/components/finance-modal.tsx index c9d6e1a00..6073d0d55 100644 --- a/src/sections/finance/components/finance-modal.tsx +++ b/src/sections/finance/components/finance-modal.tsx @@ -4,7 +4,7 @@ import { FC, useState, ReactNode } from 'react'; import Tab from '@mui/material/Tab'; import DialogTitle from '@mui/material/DialogTitle'; import Tabs, { tabsClasses } from '@mui/material/Tabs'; -import Dialog, { DialogProps } from '@mui/material/Dialog'; +import Dialog, { dialogClasses, DialogProps } from '@mui/material/Dialog'; interface TabConfig { value: string; @@ -28,7 +28,18 @@ const FinanceModal: FC = ({ open, onClose, title, tabs, rende }; return ( - + {title} - + index === currentIndex); @@ -343,10 +350,11 @@ export default function FinanceQuickTransfer({ arrow placement="top" > - void; @@ -75,8 +76,7 @@ export default function FinanceSearchProfileModal({ {profiles && profiles.map((profile: Profile) => { const avatarSrc = - (profile?.metadata?.picture as any)?.optimized?.uri ?? - `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${profile.id}`; + (profile?.metadata?.picture as any)?.optimized?.uri ?? dicebear(profile.id); return ( handleSelectProfile(profile)}> diff --git a/src/sections/finance/components/finance-transactions-history.tsx b/src/sections/finance/components/finance-transactions-history.tsx index 4834a188f..fc9847d96 100644 --- a/src/sections/finance/components/finance-transactions-history.tsx +++ b/src/sections/finance/components/finance-transactions-history.tsx @@ -33,9 +33,10 @@ import FinanceOverlayLoader from '@src/sections/finance/components/finance-overl const STATUS_OPTIONS = [{ value: 'all', label: 'All' }, ...TRANSACTIONS_TYPES.slice(0, -2)]; const TABLE_HEAD = [ - { id: 'name', label: 'Profile Info', width: 20 }, + { id: 'name', label: 'Transaction Info', width: 20 }, { id: 'createdAt', label: 'Date', width: 40 }, { id: 'amount', label: 'Amount', width: 40 }, + { id: 'tx', label: 'TX', width: 40 }, ]; const defaultFilters: IOrderTableFilters = { diff --git a/src/sections/finance/components/finance-transactions-table-row.tsx b/src/sections/finance/components/finance-transactions-table-row.tsx index af05f2f37..349b0eb5e 100644 --- a/src/sections/finance/components/finance-transactions-table-row.tsx +++ b/src/sections/finance/components/finance-transactions-table-row.tsx @@ -1,14 +1,16 @@ import { format } from 'date-fns'; -// @mui -import Avatar from '@mui/material/Avatar'; -import TableRow from '@mui/material/TableRow'; +// @MUI +import Typography from '@mui/material/Typography'; +import TableRow from '@mui/material/TableRow'; import TableCell from '@mui/material/TableCell'; import ListItemText from '@mui/material/ListItemText'; -// components + +// Project components import { TableRowTransactionType } from '@src/hooks/use-transaction-data.ts'; import { truncateAddress } from '@src/utils/wallet.ts'; -import Typography from '@mui/material/Typography'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import { OpenableText } from '@src/components/openable-text'; // ---------------------------------------------------------------------- @@ -17,8 +19,14 @@ type Props = { selected: boolean; }; +// ---------------------------------------------------------------------- + +const urlTxBase = 'https://www.oklink.com/es-la/amoy/tx/'; + +// ---------------------------------------------------------------------- + export default function FinanceTransactionTableRow({ row, selected }: Props) { - const { date, name, amount, avatarUrl, message, category } = row; + const { date, name, amount, avatarUrl, message, category, id } = row; const dateObject = new Date(Number(date) * 1000); const dateLbl = format(dateObject, 'dd/MM/yyyy'); @@ -27,7 +35,7 @@ export default function FinanceTransactionTableRow({ row, selected }: Props) { const renderPrimary = ( - + + + + + ); diff --git a/src/sections/finance/components/finance-withdraw.tsx b/src/sections/finance/components/finance-withdraw.tsx index ecc07c5ec..dc7d1094a 100644 --- a/src/sections/finance/components/finance-withdraw.tsx +++ b/src/sections/finance/components/finance-withdraw.tsx @@ -14,7 +14,7 @@ import NeonPaper from '@src/sections/publication/NeonPaperContainer'; import FinanceDialogsActions from '@src/sections/finance/components/finance-dialogs-actions'; import TextMaxLine from '@src/components/text-max-line'; import { formatBalanceNumber } from '@src/utils/format-number'; -import BoxRow from '@src/sections/finance/components/box-row'; +import FinanceBoxRow from '@src/sections/finance/components/finance-box-row.tsx'; import { UseWithdrawHook } from '@src/hooks/use-withdraw.ts'; import { truncateAddress } from '@src/utils/wallet.ts'; @@ -95,7 +95,7 @@ const FinanceWithdraw: FC = ({ address, withdrawHook, onCl alignItems="center" justifyContent="space-between" > - + Wallet = ({ address, withdrawHook, onCl > {address ? truncateAddress(address) : 'No wallet connected'} - + - + Available = ({ address, withdrawHook, onCl > {formatBalanceNumber(balance ?? 0)} MMC - + - + - - - - {post.favoritePerson.map((person) => ( - + ))} @@ -320,7 +317,7 @@ export default function GovernanceDetailsView({ title }: Props) { alignItems="center" sx={{ width: '40%', minWidth: '40%', maxWidth: '40%', mr: 3 }} > - import('@mui/material/Popover')); @@ -148,10 +148,9 @@ export default function PublicationCommentItem({ comment, hasReply, canReply }: > - ) : ( diff --git a/src/sections/publication/publication-details-comment-form.tsx b/src/sections/publication/publication-details-comment-form.tsx index fc2cfffde..3abf4b612 100644 --- a/src/sections/publication/publication-details-comment-form.tsx +++ b/src/sections/publication/publication-details-comment-form.tsx @@ -12,7 +12,6 @@ import { MarketplaceMetadataAttributeDisplayType, } from '@lens-protocol/metadata'; import FormProvider from '@src/components/hook-form'; -import Avatar from '@mui/material/Avatar'; import InputBase from '@mui/material/InputBase'; import InputAdornment from '@mui/material/InputAdornment'; import { alpha } from '@mui/material/styles'; @@ -25,6 +24,8 @@ import { useDispatch, useSelector } from 'react-redux'; import { useNotifications } from '@src/hooks/use-notifications.ts'; import { useNotificationPayload } from '@src/hooks/use-notification-payload.ts'; import { AnyPublication } from '@lens-protocol/api-bindings'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import {dicebear} from "@src/utils/dicebear.ts"; // Define the props types type MovieCommentFormProps = { @@ -162,10 +163,9 @@ const MovieCommentForm = ({ commentOn, owner, root }: MovieCommentFormProps) => const renderInput = ( - diff --git a/src/sections/publication/view/publication-details-view.tsx b/src/sections/publication/view/publication-details-view.tsx index b0f68cd91..fbd767c6a 100644 --- a/src/sections/publication/view/publication-details-view.tsx +++ b/src/sections/publication/view/publication-details-view.tsx @@ -1,5 +1,5 @@ // REACT IMPORTS -import { useEffect, useRef, useState } from 'react'; +import { FC, PropsWithChildren, useEffect, useRef, useState } from 'react'; // MUI IMPORTS import Box from '@mui/material/Box'; @@ -35,6 +35,8 @@ import { openLoginModal } from '@redux/auth'; // @ts-ignore import { ReadResult } from '@lens-protocol/react/dist/declarations/src/helpers/reads'; import { appId, PublicationType, usePublications } from '@lens-protocol/react-web'; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; const MAX_LINES = 5; @@ -117,31 +119,37 @@ export default function PublicationDetailsView({ id }: Props) { // Remove from publications the current publication const filteredPublications = publications?.filter((publication) => publication.id !== id) ?? []; - if (loading || accessLoading) return ; + if (loading || accessLoading) return ( + + + + ); if (data.isHidden) return ( - - - Publication is hidden - - + + + + Publication is hidden + + + ); return ( - <> + - + ); } + +interface PublicationDetailsTagsProps { + title: string + image: string + publicationId: string +} + +const PublicationDetailsTags: FC> = ({ title, publicationId, image: customImage, children }) => { + // OG META TAGS DATA + const metaTitle = `Watchit: ${title}` + const description = 'Check out this amazing publication on Watchit, where content meets Web3 & AI.' + const image = customImage ?? GLOBAL_CONSTANTS.LOGO_URL + const url = `${GLOBAL_CONSTANTS.BASE_URL}/publication/${publicationId}` + + return + {children} + +} diff --git a/src/sections/publication/view/publication-play-view.tsx b/src/sections/publication/view/publication-play-view.tsx index 6e67e7845..8b65bf5e3 100644 --- a/src/sections/publication/view/publication-play-view.tsx +++ b/src/sections/publication/view/publication-play-view.tsx @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import { LoadingScreen } from '../../../components/loading-screen'; import VideoPlayer from '../../../components/video-player'; import Box from '@mui/material/Box'; diff --git a/src/sections/user/profile-header.tsx b/src/sections/user/profile-header.tsx index c0656b970..b5815ef4e 100644 --- a/src/sections/user/profile-header.tsx +++ b/src/sections/user/profile-header.tsx @@ -8,7 +8,6 @@ import { useDispatch, useSelector } from 'react-redux'; // MUI IMPORTS import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; -import Avatar from '@mui/material/Avatar'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import Popover from '@mui/material/Popover'; @@ -49,6 +48,8 @@ import { useGetPolicyAttestation } from '@src/hooks/use-get-policy-attestation.t import { notifyError, notifySuccess } from '@notifications/internal-notifications.ts'; import { SUCCESS } from '@notifications/success.ts'; import { ERRORS } from '@notifications/errors.ts'; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import BadgeVerified from "@src/components/user-item/BadgeVerified.tsx"; // ---------------------------------------------------------------------- @@ -322,11 +323,11 @@ const ProfileHeader = ({ }, }} > - - - {profile?.metadata?.displayName ?? ''} + + {profile?.metadata?.displayName ?? ''} = ({ referrals, loading }) => { + const table = useTable({ + defaultOrder: 'desc', + defaultOrderBy: 'createdAt', + }); + + const notFound = !referrals.length; + const denseHeight = table.dense ? 52 : 72; + + return ( + + {referrals?.length ? ( + <> + + + + + + {referrals + .slice( + table.page * table.rowsPerPage, + table.page * table.rowsPerPage + table.rowsPerPage + ) + .map((row) => ( + + ))} + + + + +
+
+
+ + + ) : ( + + This profile has no referrals + + )} +
+ ) +} + +export default ProfileReferrals diff --git a/src/sections/user/view/profile-referrals-table-row.tsx b/src/sections/user/view/profile-referrals-table-row.tsx new file mode 100644 index 000000000..2ef72e777 --- /dev/null +++ b/src/sections/user/view/profile-referrals-table-row.tsx @@ -0,0 +1,77 @@ +// DATE IMPORTS +import { formatDistance } from 'date-fns'; + +// MUI IMPORTS +import Typography from '@mui/material/Typography'; +import TableRow from '@mui/material/TableRow'; +import TableCell from '@mui/material/TableCell'; +import ListItemText from '@mui/material/ListItemText'; +import Button from "@mui/material/Button"; + +// LOCAL IMPORTS +import {Invitation} from "@src/hooks/use-referrals.ts"; +import AvatarProfile from "@src/components/avatar/avatar.tsx"; +import {useRouter} from "@src/routes/hooks"; +import {paths} from "@src/routes/paths.ts"; + +// ---------------------------------------------------------------------- + +type Props = { + row: Invitation; + selected: boolean; +}; + + +const capitalizeFirstLetter = (string: string) => { + return string.charAt(0).toUpperCase() + string.slice(1); +}; + +// ---------------------------------------------------------------------- + +export default function ProfileReferralsTableRow({ row, selected }: Readonly) { + const { destination, status, created_at: date, id, receiver_id } = row; + const router = useRouter(); + + // If receiver_id is null, send again; otherwise, view profile as link + const handleClick = () => { + receiver_id && router.push(paths.dashboard.user.root(receiver_id)); + } + + const dateObject = new Date(date); + const daysAgo = formatDistance(dateObject,new Date(), { addSuffix: true }); + + const renderPrimary = ( + + + + + + + + + {capitalizeFirstLetter(status)} + + + + + { + receiver_id ? ( + + ) : <> + } + + + ); + + return <>{renderPrimary}; +} diff --git a/src/sections/user/view/user-profile-view.tsx b/src/sections/user/view/user-profile-view.tsx index dafe3ec1d..3fc27815e 100644 --- a/src/sections/user/view/user-profile-view.tsx +++ b/src/sections/user/view/user-profile-view.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { FC, PropsWithChildren, useEffect, useState } from 'react'; // @mui import Tab from '@mui/material/Tab'; import Container from '@mui/material/Container'; @@ -20,6 +20,10 @@ import { useSelector, useDispatch } from 'react-redux'; // @ts-ignore import { RootState } from '@src/redux/store'; import { setFollowers, setFollowings } from '@redux/followers'; +import ProfileReferrals from "@src/sections/user/profile-referrals.tsx"; +import useReferrals from "@src/hooks/use-referrals.ts"; +import { OgMetaTags } from '@src/components/og-meta-tags.tsx'; +import { GLOBAL_CONSTANTS } from '@src/config-global.ts'; // ---------------------------------------------------------------------- @@ -27,6 +31,7 @@ const TABS = [ { value: 'publications', label: 'Publications' }, { value: 'followers', label: 'Followers' }, { value: 'following', label: 'Following' }, + { value: 'referrals', label: 'Referrals' }, ]; // ---------------------------------------------------------------------- @@ -35,6 +40,7 @@ const UserProfileView = ({ id }: any) => { const dispatch = useDispatch(); const settings = useSettingsContext(); const [currentTab, setCurrentTab] = useState('publications'); + const sessionData = useSelector((state: any) => state.auth.session); const { called, data: profile, loading: loadingProfile, execute } = useLazyProfile(); const { data: publications, loading: loadingPublications } = usePublications({ where: { @@ -44,6 +50,8 @@ const UserProfileView = ({ id }: any) => { }, }); + const { invitations: referrals, fetchInvitations, loading: loadingReferrals } = useReferrals(); + const { data: followers } = useProfileFollowers({ // @ts-ignore of: profile?.id, @@ -72,6 +80,13 @@ const UserProfileView = ({ id }: any) => { } }, [profile, following, dispatch]); + // Call the fetchInvitations function + useEffect(() => { + if (profile) { + fetchInvitations(profile.id); + } + }, [profile]); + const followersStore = useSelector((state: RootState) => state.followers.followers); const followingsStore = useSelector((state: RootState) => state.followers.followings); @@ -79,6 +94,7 @@ const UserProfileView = ({ id }: any) => { publications: publications?.length ?? 0, followers: followersStore.length ?? 0, following: followingsStore.length ?? 0, + referrals: referrals?.length ?? 0, }; const handleChangeTab = (_event: any, newValue: any) => { @@ -89,52 +105,59 @@ const UserProfileView = ({ id }: any) => { execute({ forProfileId: id as ProfileId }); }; - const tabsWithCounts = TABS.map((tab: any) => ({ + const tabsWithCounts = TABS.filter((tab) => { + return !(tab.value === 'referrals' && sessionData?.profile?.id !== id); + }).map((tab: any) => ({ ...tab, key: tab.value, count: counts[tab.value], })); - if (loadingProfile || loadingPublications) return ; + if (loadingProfile || loadingPublications) return ( + + + + ); return ( - - - - {tabsWithCounts.map((tab) => ( - } - /> - ))} - - - - {currentTab === 'publications' && profile && ( - - )} - {currentTab === 'followers' && profile && ( - - )} - {currentTab === 'following' && profile && } - + + + + + {tabsWithCounts.map((tab) => ( + } + /> + ))} + + + + {currentTab === 'publications' && profile && ( + + )} + {currentTab === 'followers' && profile && ()} + {currentTab === 'following' && profile && } + {currentTab === 'referrals' && sessionData?.profile?.id === id && } + + ); }; @@ -147,4 +170,24 @@ const TabLabel = ({ label, count }: any) => ( ); +interface ProfileTagsProps { + profile: any +} + +const ProfileTags: FC> = ({ profile, children }) => { + // OG META TAGS DATA + const title = `Watchit: Profile of "${profile?.metadata?.displayName}"` + const description = 'Discover this user’s profile on Watchit, a decentralized platform powered by Web3 & AI.' + const url = `${GLOBAL_CONSTANTS.BASE_URL}/profile/${profile?.id}` + + return + {children} + +} + + export default UserProfileView; diff --git a/src/utils/dicebear.ts b/src/utils/dicebear.ts new file mode 100644 index 000000000..49446052e --- /dev/null +++ b/src/utils/dicebear.ts @@ -0,0 +1,3 @@ +export const dicebear = (seed: string) => { + return `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${seed}` +} diff --git a/src/utils/finance-graphs/groupedTransactions.ts b/src/utils/finance-graphs/groupedTransactions.ts index 5abf460c9..15149a767 100644 --- a/src/utils/finance-graphs/groupedTransactions.ts +++ b/src/utils/finance-graphs/groupedTransactions.ts @@ -1,5 +1,6 @@ import { TransactionData } from '@src/hooks/use-transaction-data'; import { TransactionLog } from '@src/hooks/use-get-smart-wallet-transactions.ts'; +import {dicebear} from "@src/utils/dicebear.ts"; type GroupedData = { type: string; data: { @@ -119,7 +120,7 @@ export const processTransactionData = (data: TransactionLog[]): ProcessedTransac id: transaction.transactionHash, name: transaction.event === 'transferFrom' ? transaction.args.origin : transaction.args.recipient, - avatarUrl: `https://api.dicebear.com/9.x/bottts-neutral/svg?seed=${transaction.event === 'transferFrom' ? transaction.args.origin : transaction.args.recipient}`, + avatarUrl: dicebear(transaction.event === 'transferFrom' ? transaction.args.origin : transaction.args.recipient), type: transaction.event, message: parseTransactionTypeLabel(transaction.event), category: parseTransactionType(transaction.event), @@ -132,9 +133,9 @@ export const processTransactionData = (data: TransactionLog[]): ProcessedTransac const parseTransactionTypeLabel = (type: string): string => { switch (type) { case 'transferTo': - return 'Sent money to'; + return 'Transfer to'; case 'transferFrom': - return 'Received money from'; + return 'Transfer from'; case 'deposit': return 'Deposited'; case 'withdraw': diff --git a/src/utils/notifications/errors.ts b/src/utils/notifications/errors.ts index fe4ce3f40..b436f510b 100644 --- a/src/utils/notifications/errors.ts +++ b/src/utils/notifications/errors.ts @@ -46,6 +46,11 @@ export enum ERRORS { // METAMASK METAMASK_CONNECTING_FAILED_ERROR = 'METAMASK_CONNECTING_FAILED_ERROR', METAMASK_CHANGE_WALLET_ERROR = 'METAMASK_CHANGE_WALLET_ERROR', + + // REFERALS + ALREADY_SENT_INVITATION = 'ALREADY_SENT_INVITATION', + ALREADY_ENROLLED = 'ALREADY_ENROLLED', + INVITATION_SEND_ERROR = 'INVITATION_SEND_ERROR', } /** @@ -103,4 +108,9 @@ export const ERROR_MESSAGES: Record = { // METAMASK [ERRORS.METAMASK_CONNECTING_FAILED_ERROR]: 'Failed to connect wallet', [ERRORS.METAMASK_CHANGE_WALLET_ERROR]: 'Failed to change wallet', + + // REFERALS + [ERRORS.ALREADY_SENT_INVITATION]: 'You have already sent an invitation to this email address!', + [ERRORS.ALREADY_ENROLLED]: 'This user is already enrolled!', + [ERRORS.INVITATION_SEND_ERROR]: 'An error occurred while sending the invitation.', }; diff --git a/src/utils/supabase-actions.ts b/src/utils/supabase-actions.ts new file mode 100644 index 000000000..9ee396925 --- /dev/null +++ b/src/utils/supabase-actions.ts @@ -0,0 +1,136 @@ +import { supabase } from '@src/utils/supabase'; +import { Invitation } from '@src/hooks/use-referrals'; + +export const fetchInvitations = async (senderId: string): Promise<{ data: Invitation[] | null, error: string | null }> => { + try { + const { data, error } = await supabase + .from('invitations') + .select('*') + .eq('sender_id', senderId); + + return { data, error: error ? error.message : null }; + } catch (err: any) { + return { data: null, error: err.message }; + } +}; + +export const checkIfMyEmailHasPendingInvite = async (userEmail: string): Promise<{ hasPending: boolean, error: string | null }> => { + try { + const { data, error } = await supabase + .from('invitations') + .select('*') + .eq('destination', userEmail) + .eq('status', 'pending'); + + return { hasPending: data && data.length > 0, error: error ? error.message : null }; + } catch (err: any) { + return { hasPending: false, error: err.message }; + } +}; + +export const acceptInvitation = async (invitationId: string, receiverId: string | null): Promise<{ data: Invitation | null, error: string | null }> => { + try { + const { data, error } = await supabase + .from('invitations') + .update({ + status: 'accepted', + receiver_id: receiverId, + }) + .eq('id', invitationId) + .single(); + + return { data, error: error ? error.message : null }; + } catch (err: any) { + return { data: null, error: err.message }; + } +}; + +export const checkIfInvitationSent = async (userEmail: string, destinationEmail: string): Promise<{ exists: boolean, error: string | null }> => { + try { + const { data, error } = await supabase + .from('invitations') + .select('id') + .eq('sender_email', userEmail) + .eq('destination', destinationEmail); + + return { exists: data && data.length > 0, error: error ? error.message : null }; + } catch (err: any) { + return { exists: false, error: err.message }; + } +}; + +export const checkIfEmailAlreadyAccepted = async (destinationEmail: string): Promise<{ accepted: boolean, error: string | null }> => { + try { + const { data, error } = await supabase + .from('invitations') + .select('id') + .eq('destination', destinationEmail) + .eq('status', 'accepted'); + + return { accepted: data && data.length > 0, error: error ? error.message : null }; + } catch (err: any) { + return { accepted: false, error: err.message }; + } +}; + +export const sendInvitation = async (destination: string, payload: any, userEmail: string, sessionData: any): Promise<{ error: string | null }> => { + const { error } = await supabase + .from('invitations') + .insert([ + { + destination, + sender_id: payload?.data?.from?.id, + payload, + sender_email: userEmail, + sender_address: sessionData?.address, + } + ]); + + return { error: error ? error.message : null }; +}; + +export const acceptOrCreateInvitationForUser = async (userEmail: string, sessionData: any): Promise<{ error: string | null }> => { + try { + const { data: invites, error: pendingError } = await supabase + .from('invitations') + .select('*') + .eq('destination', userEmail) + .limit(1); + + if (pendingError) { + throw new Error(`Error fetching pending invites: ${pendingError.message}`); + } + + if (invites && invites.length > 0) { + const invitationId = invites[0].id; + const { error } = await acceptInvitation(invitationId, sessionData?.profile?.id); + if (error) { + throw new Error(error); + } + } else { + const { error: createError } = await supabase + .from('invitations') + .insert([ + { + destination: userEmail, + sender_id: sessionData?.profile?.id ?? null, + sender_address: sessionData?.address ?? null, + receiver_id: sessionData?.profile?.id ?? null, + sender_email: userEmail, + payload: { + self_register: true + }, + status: 'accepted', + }, + ]); + + if (createError) { + throw new Error(`Error creating 'accepted' invitation: ${createError.message}`); + } + } + + return { error: null }; + } catch (err: any) { + return { error: err.message }; + } +}; diff --git a/src/workers/backgroundTaskWorker.ts b/src/workers/backgroundTaskWorker.ts index bd2ea58c3..255011225 100644 --- a/src/workers/backgroundTaskWorker.ts +++ b/src/workers/backgroundTaskWorker.ts @@ -5,6 +5,7 @@ export type CommentPayload = { pendingCommentId: string; }; +// eslint-disable-next-line no-restricted-globals self.onmessage = async (event: MessageEvent<{ type: string; payload: CommentPayload }>) => { const { type, payload } = event.data; @@ -16,9 +17,11 @@ self.onmessage = async (event: MessageEvent<{ type: string; payload: CommentPayl await verifyIpfsData(uri); // Send a success message to main thread + // eslint-disable-next-line no-restricted-globals self.postMessage({ success: true, pendingCommentId }); } catch (error) { // Send a error message to main thread + // eslint-disable-next-line no-restricted-globals self.postMessage({ success: false, error: (error as Error).message, pendingCommentId }); } }