diff --git a/.gitignore b/.gitignore index 6ab3555..3f6eccb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,13 @@ node_modules /build/ /public/build /public/aragon-ui +<<<<<<< HEAD +/api/* +api +======= /api/index.js /api/index.js.map +>>>>>>> 0935c05b6359beae36fac89a91c19c19be48eb18 # Editor directories and files .vscode/* diff --git a/api/index.js.map b/api/index.js.map index bedcfb6..5321315 100644 --- a/api/index.js.map +++ b/api/index.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../node_modules/@remix-run/dev/compiler/shims/react.ts", "empty-module:~/utils/client/icons.client", "", "server-entry-module:@remix-run/dev/server-build", "../app/entry.server.tsx", "/Users/gabi/code/blossom/rosette-app/app/root.tsx", "../app/App.tsx", "../app/providers/AppReady.tsx", "../app/components/BlossomLabsLogo.tsx", "../app/providers/Wagmi.tsx", "../app/components/AppLayout/index.tsx", "../app/components/AppLayout/BottomBar/index.tsx", "../app/components/AppLayout/TopBar/index.tsx", "../app/components/AccountModule/index.tsx", "../app/components/AccountModule/helpers.ts", "../app/components/AccountModule/use-account-module-store.ts", "../app/components/AccountModule/AccountButton.tsx", "../app/components/AccountModule/HeaderPopover.tsx", "../app/components/AccountModule/screens/index.ts", "../app/components/AccountModule/screens/ScreenPromptedAction.tsx", "../app/components/AccountModule/LoadingRing.tsx", "../app/components/AccountModule/screens/ScreenConnected.tsx", "../app/hooks/useCopyToClipboard.ts", "../app/components/AccountModule/screens/ScreenConnecting.tsx", "../app/components/AccountModule/screens/ScreenError.tsx", "../app/components/AccountModule/screens/ScreenWallets.tsx", "../app/components/AppLayout/TopBar/NavSection/index.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/index.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/MenuItem.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/Sidebar.tsx", "/Users/gabi/code/blossom/rosette-app/app/routes/contract-descriptions-search.ts", "../app/utils/server/subgraph.server.ts", "/Users/gabi/code/blossom/rosette-app/app/routes/fn-descriptions-upload.ts", "../app/utils/server/ipfs.server.ts", "/Users/gabi/code/blossom/rosette-app/app/routes/describe.tsx", "../app/components/AppLayout/AppScreen.tsx", "../app/components/ContractDescriptorScreen/index.tsx", "../app/hooks/useDebounce.ts", "../app/components/ContractDescriptorScreen/Carousel/index.tsx", "../app/components/ContractDescriptorScreen/Carousel/PrevNext.tsx", "../app/components/ContractDescriptorScreen/FunctionDescriptor/index.tsx", "../app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx", "../app/components/ContractDescriptorScreen/Pagination/index.tsx", "../app/components/ContractDescriptorScreen/Pagination/PaginationItem.tsx", "../app/components/ContractDescriptorScreen/Pagination/PaginationSeparator.tsx", "../app/components/ContractDescriptorScreen/use-contract-descriptor-store.ts", "../app/utils/web3.ts", "../app/components/ContractSelectorScreen/index.tsx", "../app/components/ContractSelectorScreen/ContractItem.tsx", "../app/components/SmoothDisplayContainer.tsx", "../app/utils/server/contract-data.server.ts", "../app/utils/server/web3.server.ts", "../app/utils/server/blockchain-explorers.server.ts", "../app/utils/server/proxy-patterns.server.ts", "/Users/gabi/code/blossom/rosette-app/app/routes/entries.tsx", "/Users/gabi/code/blossom/rosette-app/app/routes/entries/$entryId.tsx", "../app/components/ContractForm/index.tsx", "/Users/gabi/code/blossom/rosette-app/app/routes/entries/index.tsx", "/Users/gabi/code/blossom/rosette-app/app/routes/index.tsx", "/Users/gabi/code/blossom/rosette-app/app/routes/home.tsx", "server-assets-manifest:@remix-run/dev/assets-manifest"], - "sourcesContent": ["// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as React from \"react\";\nexport { React };\n", "module.exports = {};", "export * from \"@remix-run/dev/server-build\";", "\nimport * as entryServer from \"/Users/gabi/code/blossom/rosette-app/app/entry.server.tsx\";\nimport * as route0 from \"/Users/gabi/code/blossom/rosette-app/app/root.tsx\";\nimport * as route1 from \"/Users/gabi/code/blossom/rosette-app/app/routes/contract-descriptions-search.ts\";\nimport * as route2 from \"/Users/gabi/code/blossom/rosette-app/app/routes/fn-descriptions-upload.ts\";\nimport * as route3 from \"/Users/gabi/code/blossom/rosette-app/app/routes/describe.tsx\";\nimport * as route4 from \"/Users/gabi/code/blossom/rosette-app/app/routes/entries.tsx\";\nimport * as route5 from \"/Users/gabi/code/blossom/rosette-app/app/routes/entries/$entryId.tsx\";\nimport * as route6 from \"/Users/gabi/code/blossom/rosette-app/app/routes/entries/index.tsx\";\nimport * as route7 from \"/Users/gabi/code/blossom/rosette-app/app/routes/index.tsx\";\nimport * as route8 from \"/Users/gabi/code/blossom/rosette-app/app/routes/home.tsx\";\n export { default as assets } from \"@remix-run/dev/assets-manifest\";\n export const entry = { module: entryServer };\n export const routes = {\n \"root\": {\n id: \"root\",\n parentId: undefined,\n path: \"\",\n index: undefined,\n caseSensitive: undefined,\n module: route0\n },\n \"routes/contract-descriptions-search\": {\n id: \"routes/contract-descriptions-search\",\n parentId: \"root\",\n path: \"contract-descriptions-search\",\n index: undefined,\n caseSensitive: undefined,\n module: route1\n },\n \"routes/fn-descriptions-upload\": {\n id: \"routes/fn-descriptions-upload\",\n parentId: \"root\",\n path: \"fn-descriptions-upload\",\n index: undefined,\n caseSensitive: undefined,\n module: route2\n },\n \"routes/describe\": {\n id: \"routes/describe\",\n parentId: \"root\",\n path: \"describe\",\n index: undefined,\n caseSensitive: undefined,\n module: route3\n },\n \"routes/entries\": {\n id: \"routes/entries\",\n parentId: \"root\",\n path: \"entries\",\n index: undefined,\n caseSensitive: undefined,\n module: route4\n },\n \"routes/entries/$entryId\": {\n id: \"routes/entries/$entryId\",\n parentId: \"routes/entries\",\n path: \":entryId\",\n index: undefined,\n caseSensitive: undefined,\n module: route5\n },\n \"routes/entries/index\": {\n id: \"routes/entries/index\",\n parentId: \"routes/entries\",\n path: undefined,\n index: true,\n caseSensitive: undefined,\n module: route6\n },\n \"routes/index\": {\n id: \"routes/index\",\n parentId: \"root\",\n path: undefined,\n index: true,\n caseSensitive: undefined,\n module: route7\n },\n \"routes/home\": {\n id: \"routes/home\",\n parentId: \"root\",\n path: \"home\",\n index: undefined,\n caseSensitive: undefined,\n module: route8\n }\n };", "import ReactDOMServer from \"react-dom/server\";\nimport type { EntryContext } from \"@remix-run/node\";\nimport { RemixServer } from \"@remix-run/react\";\nimport { ServerStyleSheet } from \"styled-components\";\n\nexport default function handleRequest(\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n remixContext: EntryContext\n) {\n const sheet = new ServerStyleSheet();\n\n let markup = ReactDOMServer.renderToString(\n sheet.collectStyles(\n \n )\n );\n const styles = sheet.getStyleTags();\n\n markup = markup.replace(\"__STYLES__\", styles);\n\n responseHeaders.set(\"Content-Type\", \"text/html\");\n\n return new Response(\"\" + markup, {\n status: responseStatusCode,\n headers: responseHeaders,\n });\n}\n", "import { Main } from \"@1hive/1hive-ui\";\nimport {\n Links,\n LiveReload,\n Meta,\n Scripts,\n ScrollRestoration,\n useCatch,\n useLoaderData,\n} from \"@remix-run/react\";\nimport type { MetaFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport { App } from \"~/App\";\n\nexport const meta: MetaFunction = () => {\n return {\n title: \"Rosette\",\n charset: \"utf-8\",\n viewport: \"width=device-width,initial-scale=1\",\n };\n};\n\nexport async function loader() {\n return json({\n ENV: {\n CHAIN_ID: process.env.CHAIN_ID,\n RPC_URL: process.env.RPC_URL,\n INFURA_ID: process.env.INFURA_ID,\n },\n });\n}\n\ninterface DocumentProps {\n children: React.ReactNode;\n}\n\nconst Document = ({ children }: DocumentProps) => {\n const data = useLoaderData();\n\n return (\n \n \n \n \n {typeof document === \"undefined\" ? \"__STYLES__\" : null}\n \n \n {children}\n \n \n \n \n \n \n );\n};\n\nexport default function WrapperApp() {\n return (\n \n \n \n \n \n );\n}\n\n// https://remix.run/docs/en/v1/api/conventions#catchboundary\nexport function CatchBoundary() {\n const caught = useCatch();\n\n let message;\n switch (caught.status) {\n case 401:\n message = (\n

\n Oops! Looks like you tried to visit a page that you do not have access\n to.\n

\n );\n break;\n case 404:\n message = (\n

Oops! Looks like you tried to visit a page that does not exist.

\n );\n break;\n\n default:\n throw new Error(caught.data || caught.statusText);\n }\n\n return (\n
\n

\n {caught.status}: {caught.statusText}\n

\n {message}\n
\n );\n}\n\nexport function ErrorBoundary({ error }: { error: Error }) {\n return (\n
\n

[ErrorBoundary]: There was an error: {error.message}

\n
\n );\n}\n", "import { useTheme } from \"@1hive/1hive-ui\";\nimport { ThemeProvider } from \"styled-components\";\nimport { useState } from \"react\";\n\nimport { AppReady } from \"~/providers/AppReady\";\nimport Wagmi from \"~/providers/Wagmi\";\nimport { AppLayout } from \"~/components/AppLayout\";\nimport { Outlet } from \"@remix-run/react\";\n\nexport type AppContext = {\n displayTopBar(display: boolean): void;\n displayBottomBar(display: boolean): void;\n};\n\nexport const App = () => {\n const theme = useTheme();\n\n const [displayTopBar, setDisplayTopBar] = useState(true);\n const [displayBottomBar, setDisplayBottomBar] = useState(true);\n\n return (\n \n \n \n \n \n \n \n \n \n );\n};\n", "import { springs } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TransitionFn } from \"react-spring\";\nimport { a, useTransition } from \"react-spring\";\n\nimport { BlossomLabsLogo } from \"~/components/BlossomLabsLogo\";\n\nexport type AppReadyTransition = TransitionFn<\n boolean,\n {\n progress: number;\n topBarTransform: string;\n bottomBarTransform: string;\n screenTransform: string;\n }\n>;\n\ntype AppReadyContextProps = {\n appReady: boolean;\n appReadyTransition: AppReadyTransition;\n};\n\nconst AppReadyContext = createContext(\n {} as AppReadyContextProps\n);\n\ntype AppReadyProps = { children: ReactNode };\n\nexport function AppReady({ children }: AppReadyProps) {\n const [ready, setReady] = useState(false);\n\n const appReadyTransition = useTransition(ready, {\n config: springs.lazy,\n from: {\n progress: 0,\n topBarTransform: \"translate3d(0, -100%, 0)\",\n bottomBarTransform: \"translate3d(0, 100%, 0)\",\n screenTransform: \"scale3d(0.9, 0.9, 1)\",\n },\n enter: {\n progress: 1,\n topBarTransform: \"translate3d(0, 0, 0)\",\n bottomBarTransform: \"translate3d(0, 0, 0)\",\n screenTransform: \"scale3d(1, 1, 1)\",\n },\n leave: {\n progress: 0,\n topBarTransform: \"translate3d(0, -100%, 0)\",\n bottomBarTransform: \"translate3d(0, 100%, 0)\",\n screenTransform: \"scale3d(0.9, 0.9, 1)\",\n },\n });\n\n const splashTransition = useTransition(!ready, {\n config: springs.swift,\n from: {\n opacity: 1,\n logoTransform: \" rotate3d(0, 0, 1, 0deg)\",\n },\n enter: {\n opacity: 1,\n logoTransform: \"rotate3d(0, 0, 1, 360deg)\",\n },\n leave: {\n opacity: 0,\n // logoTransform: \"rotate3d(0, 0, 1, 360deg)\",\n },\n });\n\n useEffect(() => {\n const id = setTimeout(() => setReady(true), 400);\n return () => clearTimeout(id);\n }, []);\n\n return (\n \n {splashTransition(\n ({ opacity, logoTransform }, loading) =>\n loading && (\n \n \n \n \n \n )\n )}\n {children}\n \n );\n}\n\nexport function useAppReady() {\n return useContext(AppReadyContext);\n}\n\nconst AnimatedSplashContainer = styled(a.div)`\n position: fixed;\n transition-duration: 500ms;\n z-index: 9;\n inset: 0;\n display: grid;\n place-items: center;\n`;\n", "import { GU } from \"@1hive/1hive-ui/\";\nimport styled from \"styled-components\";\n\nimport blossomLabsIcon from \"~/assets/blossom-labs.svg\";\n\ntype BlossomLabsLogoProps = {\n iconSize?: string;\n opacity?: number | string;\n showIconOnly?: boolean;\n};\n\nexport const BlossomLabsLogo = ({\n iconSize = \"20px\",\n opacity,\n showIconOnly = false,\n}: BlossomLabsLogoProps) => (\n \n \n \n {\" \"}\n {!showIconOnly && \"Blossom\"}\n \n \n \n);\n\nconst OutterWrapper = styled.span<{ opacity?: number | string }>`\n display: inline-block;\n color: #f8b9b6;\n opacity: ${(p) => p.opacity};\n font-weight: bold;\n vertical-align: middle;\n`;\n", "import { providers } from \"ethers\";\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { allChains, WagmiProvider } from \"wagmi\";\nimport type { Connector } from \"wagmi\";\nimport { InjectedConnector } from \"wagmi/connectors/injected\";\nimport { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\nconst getConnectors = (chainId: string): Connector[] => {\n const chain = allChains.find((chain) => chain.id === Number(chainId));\n\n if (!chain) {\n throw new Error(\"CHAIN_ID not found: \" + chainId);\n }\n\n return [\n new InjectedConnector({\n chains: [chain],\n options: { shimDisconnect: true },\n }),\n new WalletConnectConnector({\n chains: [chain],\n options: {\n infuraId: window.ENV.INFURA_ID,\n qrcode: true,\n },\n }),\n ];\n};\n\nconst Wagmi = ({ children }: { children: ReactNode }) => {\n const connectors = useMemo(() => getConnectors(window.ENV.CHAIN_ID), []);\n const ethersProvider = useMemo(\n () => new providers.JsonRpcProvider(window.ENV.RPC_URL),\n []\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default Wagmi;\n", "import styled from \"styled-components\";\nimport type { ReactNode } from \"react\";\n\nimport { BottomBar } from \"./BottomBar\";\nimport { TopBar } from \"./TopBar\";\n\ntype AppLayoutProps = {\n children: ReactNode;\n displayTopBar?: boolean;\n displayBottomBar?: boolean;\n};\nexport const AppLayout = ({\n children,\n displayTopBar = true,\n displayBottomBar = true,\n}: AppLayoutProps) => (\n \n {displayTopBar && (\n
\n \n
\n )}\n {children}\n {displayBottomBar && (\n
\n \n
\n )}\n
\n);\n\nconst Container = styled.div`\n position: relative;\n height: 100vh;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n`;\n\nconst ChildrenWrapper = styled.div`\n display: flex;\n flex: auto;\n flex-direction: column;\n scroll-behavior: smooth;\n`;\n", "import { GU, useTheme, useViewport } from \"@1hive/1hive-ui\";\nimport { a } from \"react-spring\";\nimport styled from \"styled-components\";\nimport { useAppReady } from \"~/providers/AppReady\";\nimport { BlossomLabsLogo } from \"~/components/BlossomLabsLogo\";\n\nconst OPACITY = 0.8;\nexport const BottomBar = () => {\n const { below } = useViewport();\n const theme = useTheme();\n const { appReadyTransition } = useAppReady();\n const compactMode = below(\"large\");\n\n return (\n \n {appReadyTransition(\n ({ progress, bottomBarTransform }, ready) =>\n ready && (\n \n
\n powered by   \n
\n \n )\n )}\n
\n );\n};\n\nconst Container = styled.div`\n position: relative;\n height: ${7 * GU}px;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $compactMode: boolean }>`\n position: absolute;\n inset: 0;\n display: flex;\n padding: 0 ${7 * GU}px;\n\n justify-content: ${({ $compactMode }) =>\n $compactMode ? \"center\" : \"flex-start\"};\n`;\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { a } from \"react-spring\";\nimport styled from \"styled-components\";\n\nimport { useAppReady } from \"~/providers/AppReady\";\nimport { AccountModule } from \"~/components/AccountModule\";\nimport { NavSection } from \"./NavSection\";\n\nexport const TopBar = () => {\n const { appReadyTransition } = useAppReady();\n const { below } = useViewport();\n const compactMode = below(\"large\");\n const mobileMode = below(\"medium\");\n\n return (\n \n {appReadyTransition(\n ({ progress, topBarTransform }, ready) =>\n ready && (\n \n \n \n \n )\n )}\n \n );\n};\n\nconst NavContainer = styled.nav`\n position: relative;\n margin: 0 auto;\n height: ${8 * GU}px;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $compactMode: boolean }>`\n position: absolute;\n inset: 0;\n border-bottom: 1px solid ${({ theme }) => theme.border};\n ${({ $compactMode }) =>\n $compactMode\n ? `\n padding-right: ${1 * GU}px;\n `\n : `\n padding-right: ${5 * GU}px;\n padding-left: ${5 * GU}px;\n `};\n display: flex;\n justify-content: space-between;\n`;\n", "import { Button, GU, IconConnect } from \"@1hive/1hive-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { Chain, Connector, useAccount, useConnect, useNetwork } from \"wagmi\";\nimport { getNetworkError } from \"./helpers\";\nimport {\n PromptedAction,\n ScreenType,\n actions,\n useAccounModuleStore,\n} from \"./use-account-module-store\";\nimport { AccountButton } from \"./AccountButton\";\nimport { HeaderPopover } from \"./HeaderPopover\";\nimport {\n ScreenConnected,\n ScreenConnecting,\n ScreenError,\n ScreenPromptedAction,\n ScreenWallets,\n} from \"./screens\";\n\nconst SCREENS = [\n ScreenWallets,\n ScreenConnecting,\n ScreenError,\n ScreenPromptedAction,\n ScreenConnected,\n];\n\nconst { Connecting, Error, Action, Connected } = ScreenType;\n\nexport const AccountModule = ({ compact }: { compact?: boolean }) => {\n const buttonRef = useRef();\n const timer = useRef();\n const [{ data: accountData, error: accountError }, disconnect] = useAccount();\n const [{ error: connectError }, connect] = useConnect();\n const [{ data: networkData, error: networkError }, switchNetwork] =\n useNetwork();\n const [promptedActionSucceeded, setPromptedActionSucceeded] = useState(false);\n const error =\n getNetworkError(networkError, networkData) || accountError || connectError;\n\n const { currentScreen, opened, screenDirection } = useAccounModuleStore();\n\n const displayAccountButton =\n currentScreen === Connected && !error && accountData?.address;\n\n const Screen = SCREENS[currentScreen];\n\n const handlePopoverClose = () => {\n if (\n currentScreen === Connecting ||\n currentScreen === Error ||\n currentScreen === Action\n ) {\n // Reject closing the popover\n return false;\n }\n actions.opened(false);\n };\n\n const handleSwitchNetwork = (switchAction: PromptedAction, chain: Chain) => {\n if (switchNetwork) {\n actions.promptedAction(switchAction);\n actions.goToScreen(Action);\n switchNetwork(chain.id)\n .then(({ data, error }) => {\n if (data) {\n setPromptedActionSucceeded(true);\n } else {\n console.error(error);\n actions.goToInitialScreen();\n actions.promptedAction(null);\n }\n })\n .catch((err) => console.error(err));\n }\n };\n\n const handleConnect = (connector: Connector) => {\n actions.selectedConnector(connector);\n actions.goToScreen(Connecting);\n /**\n * Set a timer to always display connecting screen for\n * a period of time\n */\n timer.current = setTimeout(() => {\n connect(connector).then(({ data, error }) => {\n if (data?.chain?.unsupported || error) {\n actions.goToScreen(Error);\n } else {\n actions.goToScreen(Connected);\n }\n });\n }, 500);\n };\n\n const handleBack = () => {\n actions.goToInitialScreen();\n disconnect();\n };\n\n useEffect(() => {\n return () => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n };\n }, []);\n\n /**\n * Wait until network switching process is completed before going to\n * the connected screen.\n */\n useEffect(() => {\n if (promptedActionSucceeded && !networkData.chain?.unsupported) {\n actions.goToScreen(Connected);\n actions.promptedAction(null);\n setPromptedActionSucceeded(false);\n }\n }, [promptedActionSucceeded, networkData.chain]);\n\n return (\n \n {displayAccountButton ? (\n \n ) : (\n }\n label=\"Connect account\"\n onClick={actions.toggleOpened}\n display={compact ? \"icon\" : \"all\"}\n />\n )}\n \n \n \n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-around;\n outline: 0;\n`;\n", "import {\n Chain,\n ChainNotConfiguredError,\n UserRejectedRequestError,\n} from \"wagmi\";\n\nimport metamask from \"./assets/metamask.svg\";\nimport walletconnect from \"./assets/walletconnect.svg\";\n\nconst chainNotConfiguredError = new ChainNotConfiguredError();\n\nexport const getWalletIconPath = (\n id: string | undefined\n): string | undefined => {\n switch (id) {\n case \"injected\":\n return metamask;\n case \"walletConnect\":\n return walletconnect;\n default:\n return;\n }\n};\n\nexport const getNetworkError = (\n networkError: Error | undefined,\n networkData: { chain?: { unsupported: boolean | undefined }; chains: Chain[] }\n): Error | undefined => {\n if (networkError) {\n return networkError;\n }\n\n if (networkData.chain?.unsupported) {\n return chainNotConfiguredError;\n }\n};\n\nexport const isUserRejectedRequestError = (error: Error) =>\n error instanceof UserRejectedRequestError;\n", "import { createStore } from \"@udecode/zustood\";\nimport { Connector } from \"wagmi\";\n\nexport enum ScreenType {\n Wallets,\n Connecting,\n Error,\n Action,\n Connected,\n}\n\nexport type PromptedAction = {\n title: string;\n subtitle?: string;\n image?: string;\n};\n\ntype AccountModuleState = {\n opened: boolean;\n promptedAction: PromptedAction | null;\n selectedConnector: Connector | null;\n currentScreen: ScreenType;\n screenDirection: -1 | 1;\n};\n\nconst initialState: AccountModuleState = {\n opened: false,\n promptedAction: null,\n selectedConnector: null,\n currentScreen: ScreenType.Wallets,\n screenDirection: -1,\n};\n\nconst accountModuleStore = createStore(\"account-module\")(initialState, {\n devtools: { enabled: process.env.NODE_ENV === \"development\" },\n})\n .extendActions((set, get) => ({\n toggleOpened: () => set.opened(!get.opened()),\n reset: () => {\n const {\n opened,\n promptedAction,\n selectedConnector,\n currentScreen,\n screenDirection,\n } = initialState;\n\n set.opened(opened);\n set.promptedAction(promptedAction);\n set.selectedConnector(selectedConnector);\n set.currentScreen(currentScreen);\n set.screenDirection(screenDirection);\n },\n goToScreen: (screen: ScreenType) => {\n const previousScreen = get.currentScreen();\n const screenDirection = previousScreen > screen ? -1 : 1;\n\n set.currentScreen(screen);\n set.screenDirection(screenDirection);\n },\n }))\n .extendActions((set) => ({\n goToInitialScreen: () => {\n set.reset();\n set.opened(true);\n },\n }));\n\nexport const useAccounModuleStore = accountModuleStore.useStore;\nexport const actions = accountModuleStore.set;\n", "import {\n ButtonBase,\n EthIdenticon,\n GU,\n IconDown,\n RADIUS,\n shortenAddress,\n textStyle,\n useTheme,\n useViewport,\n} from \"@1hive/1hive-ui\";\nimport { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport styled from \"styled-components\";\nimport { useAccount, useNetwork } from \"wagmi\";\n\ntype AccountButtonWrapperProps = {\n content: ReactNode;\n hasPopover: boolean;\n icon?: string | ReactNode;\n onClick?: () => void;\n};\n\nconst AccountButtonWrapper = ({\n content,\n hasPopover = false,\n icon,\n onClick,\n}: AccountButtonWrapperProps) => {\n const { above } = useViewport();\n const theme = useTheme();\n\n return (\n \n \n <>\n {icon}\n {above(\"medium\") && (\n \n \n {content}\n \n {hasPopover && (\n \n )}\n \n )}\n \n \n \n );\n};\n\ntype AccountButtonProps = {\n onClick: () => void;\n};\n\nexport const AccountButton = ({ onClick }: AccountButtonProps) => {\n const theme = useTheme();\n const [{ data: accountData }] = useAccount({ fetchEns: true });\n const [{ data: networkData }] = useNetwork();\n const { address, ens } = accountData || {};\n\n return (\n \n \n \n \n }\n content={\n <>\n {!!address && (\n \n \n {ens?.name || shortenAddress(address ?? \"\")}\n \n \n )}\n \n Connected to {networkData.chain?.name}\n \n \n }\n />\n );\n};\n\nconst AccountButtonBase = styled(ButtonBase)`\n height: 100%;\n padding: ${0.2 * GU}px;\n ${(props) =>\n props.onClick !== undefined\n ? `&:active { background: ${props.theme.surfacePressed}; }`\n : `cursor: auto;`};\n`;\n\nconst InnerContainer = styled.div`\n display: flex;\n align-items: center;\n text-align: left;\n padding: 0 ${1 * GU}px;\n`;\n\nconst ConnectedCircle = styled.div`\n position: absolute;\n bottom: -3px;\n right: -3px;\n width: 10px;\n height: 10px;\n background: ${(props) => props.theme.positive};\n border: 2px solid ${(props) => props.theme.surface};\n border-radius: 50%;\n`;\n\nconst LabelWrapper = styled.div`\n margin-bottom: -5px;\n\n ${textStyle(\"body2\")};\n`;\n\nconst LabelInnerWrapper = styled.div`\n overflow: hidden;\n max-width: ${16 * GU}px;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n", "import { GU, Popover, springs } from \"@1hive/1hive-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { a, Spring, useTransition } from \"react-spring\";\nimport styled from \"styled-components\";\n\ntype PopoverProps = {\n children: ReactNode;\n direction: -1 | 1;\n heading?: string;\n onClose: () => void;\n opener: ReactNode;\n screenId: number | string;\n visible: boolean;\n width: number | string;\n};\n\nexport const HeaderPopover = ({\n children,\n direction,\n onClose,\n opener,\n screenId,\n visible,\n width,\n}: PopoverProps) => {\n const [height, setHeight] = useState(30 * GU);\n\n // Prevents to lose the focus on the popover when a screen leaves while an\n // element inside is focused (e.g. when clicking on the \u201Cdisconnect\u201D button).\n const popoverFocusElement = useRef();\n\n const popupTransition = useTransition(screenId, {\n config: springs.smooth,\n keys: screenId,\n from: {\n opacity: 0,\n transform: `translate3d(${10 * GU * direction}px, 0, 0)`,\n },\n enter: {\n opacity: 1,\n transform: `translate3d(0, 0, 0)`,\n },\n });\n\n useEffect(() => {\n if (popoverFocusElement.current) {\n popoverFocusElement.current.focus();\n }\n }, [screenId]);\n\n return (\n \n \n \n {({ height }) => (\n \n {popupTransition(({ opacity, transform }) => (\n {\n if (elt) {\n setHeight(elt.clientHeight);\n }\n }}\n style={{\n opacity,\n transform,\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n }}\n >\n {children}\n \n ))}\n \n )}\n \n \n \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst StyledPopover = styled(Popover)`\n margin-top: 3px;\n width: ${(props) => `${props.width}px`};\n`;\n", "export { ScreenPromptedAction } from \"./ScreenPromptedAction\";\nexport { ScreenConnected } from \"./ScreenConnected\";\nexport { ScreenConnecting } from \"./ScreenConnecting\";\nexport { ScreenError } from \"./ScreenError\";\nexport { ScreenWallets } from \"./ScreenWallets\";\n", "import { GU, textStyle } from \"@1hive/1hive-ui/\";\nimport styled from \"styled-components\";\n\nimport { LoadingRing } from \"../LoadingRing\";\nimport { useAccounModuleStore } from \"../use-account-module-store\";\n\nexport const ScreenPromptedAction = () => {\n const { promptedAction } = useAccounModuleStore();\n\n if (!promptedAction) {\n return null;\n }\n\n const { title, subtitle, image } = promptedAction;\n\n return (\n \n \n \n \n {image && }\n \n {title}\n {subtitle}\n \n \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n height: 100%;\n`;\n\nconst ActionContainer = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n`;\n\nconst SpinnerContainer = styled.div`\n position: relative;\n width: ${10.5 * GU}px;\n height: ${10.5 * GU}px;\n`;\n\nconst ActionImage = styled.div<{ src: string }>`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: 50% 50% / auto ${5 * GU}px no-repeat url(${(props) => props.src});\n`;\n\nconst Title = styled.h1`\n padding-top: ${2 * GU}px;\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n\nconst Subtitle = styled.p`\n width: ${36 * GU}px;\n margin-top: ${1 * GU}px;\n color: ${(props) => props.theme.surfaceContentSecondary};\n`;\n", "import styled, { keyframes } from \"styled-components\";\n\nimport loadingRing from \"./assets/loading-ring.svg\";\n\nconst spin = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport const LoadingRing = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: url(${loadingRing}) no-repeat 0 0;\n animation-duration: 1s;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n animation-name: ${spin};\n // prevents flickering on Firefox\n backface-visibility: hidden;\n`;\n", "import {\n Button,\n ButtonBase,\n GU,\n IconCheck,\n IconCopy,\n IdentityBadge,\n RADIUS,\n textStyle,\n useTheme,\n} from \"@1hive/1hive-ui\";\nimport { useCallback, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { useAccount, useNetwork } from \"wagmi\";\n\nimport { useCopyToClipboard } from \"~/hooks/useCopyToClipboard\";\nimport { getWalletIconPath } from \"../helpers\";\nimport { ScreenType, actions } from \"../use-account-module-store\";\n\ntype ScreenConnectedProps = {\n onBack(): void;\n};\n\nexport const ScreenConnected = ({ onBack }: ScreenConnectedProps) => {\n const theme = useTheme();\n const copy = useCopyToClipboard();\n const [{ data: networkData }] = useNetwork();\n const [{ data: accountData }] = useAccount();\n\n const chain = networkData.chain;\n const wallet = accountData?.connector;\n const accountAddress = accountData?.address;\n\n useEffect(() => {\n if (networkData.chain?.unsupported || !accountAddress) {\n actions.goToScreen(ScreenType.Error);\n }\n }, [networkData.chain, accountAddress]);\n\n const handleCopyAddress = useCallback(\n () => copy(accountAddress),\n [accountAddress, copy]\n );\n\n return (\n \n Active Wallet\n
\n \n \n {wallet?.id === \"unknown\" ? \"Wallet\" : wallet?.name}\n
\n
\n \n \n \n \n
\n \n
\n \n \n \n {`Connected to ${chain ? chain.name : \"Unknown\"} Network`}\n \n \n
\n \n \n );\n};\n\nconst Title = styled.h4`\n color: ${(props) => props.theme.contentSecondary};\n margin-bottom: ${2 * GU}px, ${textStyle(\"label2\")};\n ${textStyle(\"label2\")};\n`;\n\nconst WalletIcon = styled.img<{ size: string | number }>`\n ${({ size }) => size && `width: ${size}px; height: ${size}px;`};\n margin-right: ${0.5 * GU}px;\n transform: translateY(-2px);\n`;\n\nconst CopyButton = styled(ButtonBase)`\n display: flex;\n align-items: center;\n justify-self: flex-end;\n padding: ${0.5 * GU}px;\n &:active {\n background: ${(props) => props.theme.surfacePressed};\n }\n`;\n\nconst NetworkInfo = styled.div`\n display: flex;\n align-items: center;\n color: ${(props) => props.theme.positive};\n ${textStyle(\"label2\")};\n`;\n", "import { useCallback } from \"react\"\nimport { useToast } from \"@1hive/1hive-ui\"\nimport { writeText as copy } from \"clipboard-polyfill\"\n\nexport function useCopyToClipboard() {\n const toast = useToast()\n\n return useCallback(\n (text, confirmationMessage = \"Copied\") => {\n copy(text)\n if (confirmationMessage) {\n toast(confirmationMessage)\n }\n },\n [toast]\n )\n}\n", "import { GU, textStyle, useTheme } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\n\nimport { getWalletIconPath } from \"../helpers\";\nimport { LoadingRing } from \"../LoadingRing\";\nimport { useAccounModuleStore } from \"../use-account-module-store\";\n\nexport const ScreenConnecting = () => {\n const theme = useTheme();\n const { selectedConnector: wallet } = useAccounModuleStore();\n\n if (!wallet) {\n return null;\n }\n\n const walletIcon = getWalletIconPath(wallet.id);\n\n return (\n \n \n \n {walletIcon && }\n \n Connecting to {wallet.name}\n \n Log into {wallet.name || \"Unknown\"}. You may be temporarily redirected\n to a new screen.\n

\n
\n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n height: 100%;\n text-align: center;\n`;\n\nconst SpinnerContainer = styled.div`\n position: relative;\n width: ${10.5 * GU}px;\n height: ${10.5 * GU}px;\n`;\n\nconst SpinnerImage = styled.div<{ src: string }>`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: 50% 50% / auto ${5 * GU}px no-repeat url(${(props) => props.src});\n`;\n\nconst Title = styled.h1`\n padding-top: ${2 * GU}px;\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n", "import {\n Button,\n GU,\n IconError,\n Link,\n textStyle,\n useTheme,\n} from \"@1hive/1hive-ui\";\nimport { useMemo } from \"react\";\nimport styled from \"styled-components\";\nimport {\n Chain,\n ChainNotConfiguredError,\n useAccount,\n useConnect,\n useNetwork,\n} from \"wagmi\";\n\nimport { getNetworkLogo } from \"~/utils/client/icons.client\";\nimport { getNetworkError } from \"../helpers\";\nimport type { PromptedAction } from \"../use-account-module-store\";\n\nconst buildSwitchAction = (chain: Chain): PromptedAction => ({\n title: `Connecting to ${chain.name} network`,\n subtitle: `Creating and/or switching to the ${chain.name} network (id: ${chain.id}) in your wallet. You may be temporarily redirected to a new screen.`,\n image: getNetworkLogo(chain.id),\n});\n\ntype ScreenErrorProps = {\n onSwitchNetwork(switchAction: PromptedAction, chain: Chain): void;\n onBack(): void;\n};\n\nexport const ScreenError = ({ onSwitchNetwork, onBack }: ScreenErrorProps) => {\n const theme = useTheme();\n const [{ data: networkData, error: networkError }, switchNetwork] =\n useNetwork();\n const [{ error: connectError }] = useConnect();\n const [{ error: accountError }] = useAccount();\n\n const error =\n getNetworkError(networkError, networkData) || connectError || accountError;\n\n const [title, secondary] = useMemo(() => {\n if (\n error instanceof ChainNotConfiguredError ||\n networkData.chain?.unsupported\n ) {\n return [\n \"Wrong network\",\n \n Please select one of these networks:{\" \"}\n {networkData.chains.map((chain, index, chains) =>\n switchNetwork ? (\n {\n onSwitchNetwork(buildSwitchAction(chain), chain);\n }}\n >\n {`${chain.name}${index < chains.length - 1 ? \", \" : \"\"}`}\n \n ) : (\n <>{chain.name}\n )\n )}\n ,\n ];\n }\n\n return [\n \"Failed to enable your account\",\n \"You can try another Ethereum wallet.\",\n ];\n }, [error, networkData, onSwitchNetwork, switchNetwork]);\n\n return (\n \n \n
\n \n
\n {title}\n \n {secondary}\n

\n
\n \n \n \n
\n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n padding-top: ${1 * GU}px;\n height: 100%;\n`;\n\nconst ErrorContainer = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n`;\n\nconst Title = styled.h1`\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n\nconst ButtonContainer = styled.div`\n flex-grow: 0;\n margin-top: ${1 * GU}px;\n width: 100%;\n`;\n", "import { ButtonBase, GU, Link, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { Connector, useConnect } from \"wagmi\";\n\nimport { getWalletIconPath } from \"../helpers\";\n\nexport const ScreenWallets = ({\n onConnect,\n}: {\n onConnect(connector: Connector): void;\n}) => {\n const [{ data: connectData }] = useConnect();\n\n return (\n
\n Ethereum Wallets\n \n \n {connectData.connectors.map((connector) => {\n return (\n onConnect(connector)}\n />\n );\n })}\n \n \n \n What is a wallet?\n \n \n \n
\n );\n};\n\ntype WalletButtonProps = {\n icon?: string;\n name?: string;\n ready?: boolean;\n onClick: (connector: Connector) => void;\n};\n\nfunction WalletButton({\n icon,\n name,\n ready = true,\n onClick,\n}: WalletButtonProps): JSX.Element {\n return (\n \n {name && (\n <>\n {icon && (\n \"\"\n )}\n {name}\n {!ready && (Unsupported)}\n \n )}\n \n );\n}\n\nconst MainHeader = styled.h4`\n padding-top: ${2 * GU}px;\n padding-left: ${2 * GU}px;\n color: ${(props) => props.theme.contentSecondary};\n margin-bottom: ${2 * GU}px;\n ${textStyle(\"label2\")};\n`;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n padding: ${2 * GU}px ${2 * GU}px 0;\n`;\n\nconst WalletButtonsContainer = styled.div`\n display: grid;\n grid-gap: ${1.5 * GU}px;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, 1fr);\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n justify-content: center;\n margin-top: ${2 * GU}px;\n margin-bottom: ${1 * GU}px;\n`;\n\nconst WalletButtonBase = styled(ButtonBase)`\n position: relative;\n opacity: ${(props) => (props.ready ? 1 : 0.6)};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: ${12 * GU}px;\n background: ${(props) => props.surface};\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);\n border-radius: ${RADIUS}px;\n &:active {\n top: 1px;\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n }\n`;\n\nconst WalletName = styled.div`\n margin-top: ${1 * GU}px;\n ${textStyle(\"body1\")};\n`;\n\nconst Subtitle = styled.div`\n margin-top: ${-0.5 * GU}px;\n ${textStyle(\"body4\")};\n`;\n", "import { GU, textStyle } from \"@1hive/1hive-ui\";\nimport { NavLink } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { CompactMenu } from \"./CompactMenu\";\n\nexport type NavigationItem = {\n icon: string;\n label: string;\n to: string;\n};\n\nconst navigationItem: NavigationItem[] = [\n { icon: \"\", label: \"Home\", to: \"/home\" },\n { icon: \"\", label: \"All Entries\", to: \"/entries\" },\n { icon: \"\", label: \"Guidelines\", to: \"/guidelines\" },\n];\n\nexport const NavSection = ({ compact }: { compact: boolean }) => {\n return compact ? (\n \n ) : (\n \n {navigationItem.map(({ label, to }) => (\n
  • \n {label === \"Home\" ? \"Rosette\" : label}\n
  • \n ))}\n
    \n );\n};\n\nconst NavLinksList = styled.ul`\n display: flex;\n align-items: center;\n gap: ${6 * GU}px;\n list-style: none;\n\n li:first-child {\n ${textStyle(\"title2\")};\n }\n\n > li {\n transition: all 200ms ease-out;\n &:hover {\n color: ${(props) => props.theme.surfaceHighlight};\n }\n }\n\n li > * {\n text-decoration: none;\n }\n`;\n", "import { ButtonBase, GU, IconMenu, useViewport } from \"@1hive/1hive-ui\";\nimport { useState } from \"react\";\nimport { useLocation } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport type { NavigationItem } from \"..\";\nimport { MenuItem } from \"./MenuItem\";\nimport { Sidebar } from \"./Sidebar\";\n\nconst MenuButton = ({ onClick }: { onClick(): void }) => (\n \n \n \n \n \n);\n\nconst MIN_SIDEBAR_WIDTH = 240;\n\nexport const CompactMenu = ({ items }: { items: NavigationItem[] }) => {\n const { pathname } = useLocation();\n const { width } = useViewport();\n const [displaySidebar, setDisplaySidebar] = useState(false);\n\n const sidebarWidth = Math.min(MIN_SIDEBAR_WIDTH, width * 0.6);\n\n const toggleSidebar = () => setDisplaySidebar((prev) => !prev);\n\n return (\n
    \n \n \n \n {items.map((i) => (\n
  • \n \n
  • \n ))}\n
    \n \n
    \n );\n};\n\nconst ButtonContainer = styled.div`\n width: ${8 * GU}px;\n height: 100%;\n border-right: 1px solid ${({ theme }) => theme.border};\n display: flex;\n align-self: stretch;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledMenuIcon = styled(IconMenu)`\n width: ${4 * GU}px;\n height: ${4 * GU}px;\n`;\n\nconst NavContainer = styled.ul`\n list-style: none;\n`;\n", "import { GU, useTheme } from \"@1hive/1hive-ui\";\nimport { Link } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport type { NavigationItem } from \"..\";\n\ntype MenuItemProps = {\n item: NavigationItem;\n active?: boolean;\n onClick(): void;\n};\n\nexport const MenuItem = ({\n item: { icon, label, to },\n active = false,\n onClick,\n}: MenuItemProps) => {\n const theme = useTheme();\n\n return (\n
    \n {active && }\n \n \n {icon && \"\"}\n {label}\n \n \n
    \n );\n};\n\nconst ActiveBar = styled.div`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 4px;\n background: #7c5fe0;\n`;\n\nconst InnerNavLink = styled.div`\n display: flex;\n align-items: center;\n gap: ${1 * GU}px;\n padding: ${1.5 * GU}px;\n\n & img {\n width: 20px;\n height: 20px;\n }\n\n & > span {\n color: ${({ theme }) => theme.content};\n }\n`;\n", "import { RootPortal } from \"@1hive/1hive-ui\";\nimport type { ReactNode } from \"react\";\nimport { a, useTransition } from \"react-spring\";\nimport styled from \"styled-components\";\n\ntype SidebarProps = {\n children: ReactNode;\n show: boolean;\n width: number;\n onToggle(): void;\n};\n\nexport const Sidebar = ({ children, show, width, onToggle }: SidebarProps) => {\n const sidebarTransition = useTransition(show, {\n from: {\n marginLeft: `-${width}px`,\n opacity: 0,\n },\n enter: {\n marginLeft: \"0\",\n opacity: 1,\n },\n leave: {\n marginLeft: `-${width}px`,\n opacity: 0,\n },\n unique: true,\n config: { mass: 5, tension: 1500, friction: 200 },\n delay: 100,\n });\n\n return sidebarTransition((styles, show) => {\n return (\n show && (\n \n \n {children}\n \n \n \n )\n );\n });\n};\n\nconst AnimatedSidebar = styled(a.div)<{ width: number; $zIndex: number }>`\n height: 100vh;\n position: absolute;\n border-right: 1px solid ${({ theme }) => theme.border};\n background-color: ${({ theme }) => theme.background};\n ${({ width, $zIndex }) => `\n z-index: ${$zIndex};\n width: ${width}px;\n top: 0;\n bottom: 0;\n left: 0;\n `};\n`;\n\nconst OpaqueBackground = styled(a.div)<{ $offset: number; $show: boolean }>`\n position: absolute;\n top: 0;\n right: 0;\n left: ${({ $offset }) => $offset}px;\n z-index: 1;\n height: 100%;\n background: ${({ theme }) => theme.overlay.alpha(0.7)};\n pointer-events: ${({ $show }) => ($show ? \"auto\" : \"none\")};\n`;\n", "import type { LoaderFunction } from \"@remix-run/node\";\nimport { fetchContractFnEntries } from \"~/utils/server/subgraph.server\";\n\nexport const loader: LoaderFunction = ({ request }) => {\n const { searchParams } = new URL(request.url);\n const bytecodeHash = searchParams.get(\"bytecodeHash\");\n\n if (!bytecodeHash) {\n throw new Response(\"Expected contract param\", {\n status: 400,\n statusText: \"Expected search params\",\n });\n }\n\n return fetchContractFnEntries(bytecodeHash);\n};\n", "import type { FnEntry } from \"~/types\";\nimport { FnDescriptionStatus } from \"~/types\";\n\ntype FunctionResult = {\n notice: string;\n sigHash: string;\n submitter: string;\n disputed: boolean;\n guideline: {\n cooldownPeriod: number;\n };\n upsertAt: number;\n};\n\ntype QueryResult = {\n data: {\n contract: {\n functions: FunctionResult[];\n };\n };\n errors?: { message: string }[];\n};\n\nconst gql = String.raw;\n\nconst fetchFromGraphQL = async (query: string) => {\n if (!process.env.SUBGRAPH_URI) {\n throw new Error(\"SUBGRAPH_URI is required\");\n }\n\n const body: any = { query };\n\n return fetch(process.env.SUBGRAPH_URI, {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n};\n\nconst getEntryStatus = (fnResult: FunctionResult): FnDescriptionStatus => {\n const date = Date.now() / 1000;\n\n if (fnResult.disputed) {\n return FnDescriptionStatus.Challenged;\n }\n\n const timeSince = fnResult.upsertAt + fnResult.guideline.cooldownPeriod;\n\n if (timeSince > date) {\n return FnDescriptionStatus.Added;\n } else {\n return FnDescriptionStatus.Pending;\n }\n};\n\nconst parseFnResult = (fnResult: FunctionResult): FnEntry => {\n const { notice, sigHash, submitter, upsertAt } = fnResult;\n\n return {\n notice,\n sigHash,\n status: getEntryStatus(fnResult),\n submitter,\n upsertAt,\n };\n};\n\nexport const fetchContractFnEntries = async (\n bytecodeHash: string\n): Promise => {\n const contractId = `${process.env.ROSETTE_STONE_ADDRESS}-${bytecodeHash}`;\n\n try {\n const rawResponse = await fetchFromGraphQL(\n gql`\n {\n contract(id: \"${contractId}\") {\n functions {\n notice\n sigHash\n submitter\n guideline {\n cooldownPeriod\n }\n upsertAt\n }\n }\n }\n `\n );\n\n const result = (await rawResponse.json()) as QueryResult;\n\n if (result.errors?.length) {\n const err = result.errors[0];\n console.error(err);\n throw new Error(err.message);\n }\n\n if (!result.data.contract) {\n return [];\n }\n\n return result.data.contract.functions.map(parseFnResult);\n } catch (err) {\n throw new Response(\n \"There was an error fetching the contract's function descriptions\",\n { status: 500, statusText: \"Subgraph Error\" }\n );\n }\n};\n", "import type { ActionFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport type { UserFnDescription } from \"~/types\";\nimport { ipfs } from \"~/utils/server/ipfs.server\";\n\ntype IPFSResponseData = Record;\n\nconst FN_DESCRIPTIONS_KEY = \"fnDescriptions\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const data = await request.formData();\n\n if (!data.has(FN_DESCRIPTIONS_KEY)) {\n return new Response(\"Function descriptions not provided\", { status: 400 });\n }\n\n const fnDescriptions = JSON.parse(\n data.get(FN_DESCRIPTIONS_KEY)!.toString()\n ) as UserFnDescription[];\n const uploadRequests = fnDescriptions.map(({ description, minimalName }) => {\n const descriptionJson = JSON.stringify({\n abi: minimalName,\n notice: description,\n });\n\n return ipfs.add(descriptionJson);\n });\n\n try {\n const addResults = await Promise.all(uploadRequests);\n\n const responseData = addResults.reduce((data, addResult, index) => {\n const fnDescription = fnDescriptions[index];\n data[fnDescription.sigHash] = addResult.cid.toString();\n return data;\n }, {} as IPFSResponseData);\n\n return json(responseData);\n } catch (err) {\n console.error(err);\n throw new Response(\n \"An error occured when uploading function descriptions\",\n { status: 500 }\n );\n }\n};\n", "import type { IPFSHTTPClient, Options } from \"ipfs-http-client\";\nimport { create } from \"ipfs-http-client\";\n\ndeclare global {\n var __ipfs: IPFSHTTPClient | undefined;\n}\n\nlet ipfs: IPFSHTTPClient;\n\nconst INFURA_IPFS_API_KEY = process.env.INFURA_IPFS_API_KEY;\n\nif (!INFURA_IPFS_API_KEY) {\n throw new Error(\"INFURA_IPFS_API_KEY not found\");\n}\n\nconst codifiedBasicAuth = Buffer.from(INFURA_IPFS_API_KEY).toString(\"base64\");\n\nconst config: Options = {\n url: \"https://ipfs.infura.io:5001\",\n headers: { Authorization: `Basic ${codifiedBasicAuth}` },\n};\n\nif (process.env.NODE_ENV === \"production\") {\n ipfs = create(config);\n} else {\n if (!global.__ipfs) {\n global.__ipfs = create(config);\n }\n ipfs = global.__ipfs;\n}\n\nexport { ipfs };\n", "import { utils } from \"ethers\";\nimport { useEffect, useState } from \"react\";\nimport { json } from \"@remix-run/node\";\nimport type { LoaderFunction } from \"@remix-run/node\";\nimport { useCatch, useFetcher, useLoaderData } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractDescriptorScreen } from \"~/components/ContractDescriptorScreen\";\nimport { ContractSelectorScreen } from \"~/components/ContractSelectorScreen\";\nimport { SmoothDisplayContainer } from \"~/components/SmoothDisplayContainer\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { fetchContracts } from \"~/utils/server/contract-data.server\";\n\ntype LoaderData = {\n contractAddress: string;\n contracts: AggregateContract[];\n};\n\nexport const loader: LoaderFunction = async ({ request }) => {\n const { searchParams } = new URL(request.url);\n const contractAddress = searchParams.get(\"contract\");\n\n if (!contractAddress) {\n throw new Response(\"Expected contract param\", {\n status: 400,\n statusText: \"Expected search params\",\n });\n }\n\n const contracts = await fetchContracts(contractAddress);\n\n return json({ contracts });\n};\n\nexport default function Describe() {\n const { contracts } = useLoaderData();\n const contractDescriptionsFetcher = useFetcher();\n const [selectedContractData, setSelectedContractData] =\n useState();\n\n useEffect(() => {\n if (\n !selectedContractData?.bytecode ||\n contractDescriptionsFetcher.type !== \"init\"\n ) {\n return;\n }\n\n contractDescriptionsFetcher.load(\n `/contract-descriptions-search?bytecodeHash=${utils.id(\n selectedContractData.bytecode\n )}`\n );\n }, [selectedContractData?.bytecode, contractDescriptionsFetcher]);\n\n return (\n \n \n {selectedContractData && contractDescriptionsFetcher.type === \"done\" ? (\n \n \n \n ) : (\n \n )}\n \n \n );\n}\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: start;\n height: 100%;\n width: 100%;\n`;\n\n// https://remix.run/docs/en/v1/api/conventions#catchboundary\nexport function CatchBoundary() {\n const caught = useCatch();\n\n let message;\n\n switch (caught.status) {\n case 400:\n message = caught.data;\n case 500:\n message = caught.data;\n break;\n default:\n throw new Error(caught.data || caught.statusText);\n }\n\n return (\n
    \n
    \n

    \n {caught.status}: {caught.statusText}\n

    \n {message}\n
    \n
    \n );\n}\n", "import type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { a } from \"react-spring\";\nimport { useOutletContext } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { useAppReady } from \"~/providers/AppReady\";\nimport type { AppContext } from \"~/App\";\n\ntype AppScreenProps = {\n children: ReactNode;\n hideBottomBar?: boolean;\n hideTopBar?: boolean;\n};\n\nexport const AppScreen = ({\n children,\n hideBottomBar = false,\n hideTopBar = false,\n}: AppScreenProps) => {\n const { appReadyTransition } = useAppReady();\n const { displayBottomBar, displayTopBar } = useOutletContext();\n\n useEffect(() => {\n displayBottomBar(!hideBottomBar);\n\n displayTopBar(!hideTopBar);\n }, [hideBottomBar, hideTopBar, displayBottomBar, displayTopBar]);\n\n return appReadyTransition(\n ({ progress, screenTransform }, ready) =>\n ready && (\n \n {children}\n \n )\n );\n};\n\nconst AnimatedContainer = styled(a.div)`\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n width: 100%;\n margin: 0 auto;\n`;\n\nconst InnerContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n`;\n", "import { Button, GU, useViewport } from \"@1hive/1hive-ui\";\nimport { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport scrollIcon from \"./assets/scroll-icon.svg\";\nimport handIcon from \"./assets/hand-icon.svg\";\nimport { useDebounce } from \"~/hooks/useDebounce\";\nimport { Carousel } from \"./Carousel\";\nimport { FunctionDescriptor } from \"./FunctionDescriptor\";\nimport { Pagination } from \"./Pagination\";\nimport {\n actions,\n selectors,\n useContractDescriptorStore,\n} from \"./use-contract-descriptor-store\";\nimport type { ContractData, FnEntry } from \"~/types\";\n\nconst FN_DESCRIPTOR_HEIGHT = \"527px\";\n\ntype ContractDescriptorScreenProps = {\n contractData: ContractData;\n currentFnEntries: FnEntry[];\n};\n\nexport const ContractDescriptorScreen = ({\n contractData: { abi },\n currentFnEntries,\n}: ContractDescriptorScreenProps) => {\n const { below } = useViewport();\n const { fnSelected, fnDescriptorEntries } = useContractDescriptorStore();\n const compactMode = below(\"large\");\n const fnDescriptionsCounter = selectors.fnDescriptionsCounter();\n /**\n * Debounce wheel event to avoid fast changing pages on scroll.\n */\n const [wheelEvent, setWheelEvent] = useState(null);\n const debouncedWheelEvent = useDebounce(wheelEvent, 50);\n\n useEffect(() => {\n if (abi && currentFnEntries) {\n actions.setUpFnDescriptorEntries(abi, currentFnEntries);\n }\n }, [abi, currentFnEntries]);\n\n useEffect(() => {\n if (debouncedWheelEvent) {\n if (debouncedWheelEvent.deltaY < 0) {\n actions.goToPrevFn();\n } else {\n actions.goToNextFn();\n }\n }\n }, [debouncedWheelEvent]);\n\n useEffect(() => {\n const onWheel = (e: WheelEvent) => {\n setWheelEvent(e);\n };\n\n window.addEventListener(\"wheel\", onWheel);\n\n return () => {\n window.removeEventListener(\"wheel\", onWheel);\n };\n }, []);\n\n return (\n \n FILTERS\n {fnDescriptorEntries.length > 1 && (\n \n \n \n \n )}\n \n (\n \n ))}\n direction={compactMode ? \"horizontal\" : \"vertical\"}\n itemSpacing={450}\n />\n \n \n \n \n \n );\n};\n\nconst Layout = styled.div<{ compactMode: boolean }>`\n display: grid;\n height: 100%;\n width: 100%;\n padding: ${4 * GU}px;\n grid-gap: ${1 * GU}px;\n\n ${({ compactMode }) => `\n ${FiltersContainer} {\n grid-area: filters;\n }\n\n ${PaginationContainer} {\n grid-area: pagination;\n ${\n compactMode\n ? `\n flex-direction: column-reverse;\n `\n : `\n justify-self: start;\n `\n }\n }\n\n ${CarouselContainer} {\n grid-area: carousel;\n }\n\n ${SubmitContainer} {\n grid-area: submit;\n ${\n compactMode\n ? `\n width: 100%;\n `\n : `\n width: 230px;\n `\n };\n place-self: end;\n\n }\n ${\n compactMode\n ? `grid: \n [row1-start] \"filters\" 1fr [row1-end]\n [row2-start] \"carousel\" 5fr [row2-end]\n [row3-start] \"pagination\" 1fr [row3-end]\n [row4-start] \"submit\" 1fr [row4-end]\n / minmax(200px,${FN_DESCRIPTOR_HEIGHT});\n\n justify-content: center;\n `\n : `grid: \n [row1-start] \". filters .\" 1fr [row1-end]\n [row2-start] \"pagination carousel .\" 8fr [row2-end]\n [row3-start] \". . submit\" 1fr [row3-end]\n / 1fr minmax(200px,527px) 1fr;\n `\n }\n `};\n`;\n\nconst FiltersContainer = styled.div`\n justify-self: center;\n`;\n\nconst PaginationContainer = styled.div`\n display: flex;\n align-items: center;\n gap: ${1 * GU}px;\n`;\n\nconst PaginationIcon = styled.img<{ size: number }>`\n ${({ size }) => `width: ${size}px; height: ${size}px;`};\n`;\n\nconst CarouselContainer = styled.div`\n min-width: 100%;\n height: 100%;\n`;\n\nconst SubmitContainer = styled.div``;\n\nconst SubmitButton = styled(Button)`\n box-sizing: border-box;\n padding: ${3 * GU}px;\n ${({ wide }) => wide && \"width: 100%;\"};\n`;\n", "import { useEffect, useState } from \"react\";\n\n/**\n * Source: https://usehooks.com/useDebounce/\n */\nexport function useDebounce(value: T, delay: number): T {\n // State and setters for debounced value\n const [debouncedValue, setDebouncedValue] = useState(value);\n useEffect(\n () => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler);\n };\n },\n [value, delay] // Only re-call effect if value or delay changes\n );\n return debouncedValue;\n}\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useState, useRef } from \"react\";\nimport { a, useSpring } from \"react-spring\";\nimport styled from \"styled-components\";\nimport { PrevNext } from \"./PrevNext\";\n\ntype CarouselProps = {\n items: ReactNode[];\n selected: number;\n compactMode?: boolean;\n direction?: \"horizontal\" | \"vertical\";\n itemSpacing?: number;\n customSideSpace?: number;\n showPrevNext?: boolean;\n onItemSelected?(selected: number): void;\n};\n\nconst DEFAULT_SIZE = { width: 0, height: 0 };\n\nexport const Carousel = ({\n items,\n selected = 0,\n compactMode = false,\n direction = \"vertical\",\n itemSpacing = 3 * GU,\n customSideSpace,\n showPrevNext = false,\n onItemSelected = () => {},\n}: CarouselProps) => {\n const [containerSize, setContainerSize] = useState({ ...DEFAULT_SIZE });\n const container = useRef(null);\n const { width: vw } = useViewport();\n const isHorizontal = direction === \"horizontal\";\n const itemSize = containerSize[isHorizontal ? \"width\" : \"height\"];\n // The space on one side of the visible items\n const sideSpace =\n customSideSpace && customSideSpace >= 0 ? customSideSpace : 0;\n\n // const allowDrag = compactMode || (items && items.length > visibleItems);\n\n useEffect(() => {\n onItemSelected(selected);\n }, [onItemSelected, selected]);\n\n const updateContainerSize = useCallback((element) => {\n setContainerSize(\n element\n ? { width: element.clientWidth, height: element.clientHeight }\n : { ...DEFAULT_SIZE }\n );\n }, []);\n\n useEffect(() => {\n if (container.current) {\n updateContainerSize(container.current);\n }\n }, [vw, updateContainerSize]);\n\n const handleContainerRef = useCallback(\n (element) => {\n container.current = element;\n updateContainerSize(element);\n },\n [updateContainerSize]\n );\n\n // Get the container x position from an item index\n const xFromItem = useCallback(\n (index) => {\n return sideSpace - (itemSize + itemSpacing) * index;\n },\n [sideSpace, itemSize, itemSpacing]\n );\n\n // The current x position, before the drag\n const selectedX = xFromItem(selected);\n\n // The x position of the last item, before the drag\n // const lastX = xFromItem(items.length - 1);\n\n // Handles the actual x position, with the drag\n const [{ x, drag }, setX] = useSpring(() => ({\n x: selectedX,\n drag: Number(false),\n immediate: true,\n }));\n\n // TODO: Implement dragging feature for mobile screens\n // Update the transition during drag\n // const bindDrag = useDrag(({ down, delta }) => {\n // const updatedX = Math.max(lastX, Math.min(sideSpace, selectedX + delta[0]));\n\n // if (!allowDrag) {\n // return;\n // }\n\n // if (down) {\n // setX({\n // x: updatedX,\n // immediate: true,\n // });\n // } else {\n // let target = selected;\n // if (Math.abs(delta[0]) > itemWidth / 2) {\n // const sP = delta[0] > 0 ? -sideSpace : sideSpace;\n // const deltaSelected = Math.abs(\n // Math.round((delta[0] + sP) / (itemWidth + itemSpacing))\n // );\n // // Moving to the left\n // if (delta[0] > 0) {\n // target = Math.max(0, selected - deltaSelected);\n // // Move to the right\n // } else {\n // target = Math.min(\n // items.length - visibleItems,\n // selected + deltaSelected\n // );\n // }\n // }\n\n // setX({\n // x: xFromItem(target),\n // immediate: false,\n // });\n // setSelected(target);\n // }\n // });\n\n // Update the transition when the base x position updates\n useEffect(() => {\n setX({\n x: selectedX,\n immediate: false,\n });\n }, [selectedX, setX]);\n\n return (\n \n {showPrevNext && (\n <>\n {selected > 0 && (\n onItemSelected(Math.max(0, selected - 1))}\n isHorizontal={isHorizontal}\n />\n )}\n {selected < items.length - 1 && (\n \n onItemSelected(Math.min(items.length - 1, selected + 1))\n }\n isHorizontal={isHorizontal}\n />\n )}\n \n )}\n\n \n `translate3d(${\n isHorizontal ? `${x || 0}px, 0, 0` : `0, ${x || 0}px, 0`\n })`\n ),\n }}\n >\n {items.map((item, i) => (\n {\n return drag || (i >= selected && i < selected + 1) ? 1 : 0.15;\n }),\n }}\n $isFirst={i === 0}\n $isHorizontal={isHorizontal}\n $itemHeight={containerSize.height}\n $itemWidth={containerSize.width}\n $itemSpacing={itemSpacing}\n >\n {item}\n \n ))}\n \n \n );\n};\n\nconst Container = styled.div<{\n isHorizontal: boolean;\n}>`\n position: relative;\n overflow: hidden;\n touch-action: none;\n height: 100%;\n width: 100%;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $isHorizontal: boolean }>`\n position: absolute;\n display: flex;\n width: 100%;\n box-sizing: border-box;\n\n align-items: center;\n touch-action: none;\n ${(props) =>\n props.$isHorizontal\n ? `\n flex-direction: row;\n justify-content: flex-start;\n height: 100%;\n `\n : `\n flex-direction: column;\n justify-content: center;\n `};\n`;\n\nconst AnimatedItemContainer = styled(a.div)<{\n $isHorizontal: boolean;\n $isFirst: boolean;\n $itemWidth: number;\n $itemHeight: number;\n $itemSpacing: number;\n}>`\n width: ${(props) => props.$itemWidth}px;\n height: ${(props) => props.$itemHeight}px;\n transition: opacity 150ms ease-in-out;\n flex-grow: 0;\n flex-shrink: 0;\n ${(props) => (props.$isHorizontal ? \"margin-left\" : \"margin-top\")}: ${({\n $isFirst,\n $itemSpacing: itemSpacing,\n}) => (!$isFirst ? `${itemSpacing}px` : 0)}};\n`;\n", "import {\n GU,\n ButtonIcon,\n IconDown,\n IconUp,\n IconRight,\n IconLeft,\n} from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\n\ntype PrevNextProps = {\n isHorizontal?: boolean;\n type: \"next\" | \"previous\";\n onClick: () => void;\n};\nexport const PrevNext = ({\n isHorizontal = true,\n type,\n onClick,\n}: PrevNextProps) => {\n const NextIcon = isHorizontal ? IconRight : IconDown;\n const PrevIcon = isHorizontal ? IconLeft : IconUp;\n const next = type === \"next\";\n const Icon = next ? NextIcon : PrevIcon;\n\n return (\n \n \n \n \n \n );\n};\n\nconst Container = styled.div<{ isHorizontal: boolean; next: boolean }>`\n position: absolute;\n z-index: 1;\n ${({ isHorizontal, next }) =>\n isHorizontal\n ? `\n top: calc(50% - ${5 * GU}px);\n ${next ? \"right\" : \"left\"}: ${0.5 * GU}px;\n `\n : `\n top: calc(${next ? `100% - ${5 * GU}px` : \"0\"});\n left: 50%;\n `};\n color: ${({ theme }) => theme.surfaceContentSecondary};\n height: ${6 * GU}px;\n`;\n", "import { Button, textStyle, GU } from \"@1hive/1hive-ui\";\nimport { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useDebounce } from \"~/hooks/useDebounce\";\nimport type { UserFnDescription } from \"~/types\";\nimport { FnDescriptionStatus } from \"~/types\";\nimport { getFnEntryStatusIconData } from \"~/utils/client/icons.client\";\nimport type { Function } from \"../use-contract-descriptor-store\";\nimport { DescriptionField } from \"./DescriptionField\";\n\ntype FunctionDescriptorProps = {\n fnDescriptorEntry: Function;\n onEntryChange(userFnDescription: UserFnDescription): void;\n isCompleted?: boolean;\n};\n\nexport const FunctionDescriptor = ({\n fnDescriptorEntry,\n onEntryChange,\n}: FunctionDescriptorProps) => {\n const entry = fnDescriptorEntry.entry;\n const { notice, status } = entry || {};\n const [description, setDescription] = useState();\n const debouncedDescription = useDebounce(\n description,\n 350\n );\n const descriptorStatus =\n status ||\n (debouncedDescription\n ? FnDescriptionStatus.Added\n : FnDescriptionStatus.Available);\n\n useEffect(() => {\n if (debouncedDescription !== undefined) {\n onEntryChange({\n sigHash: fnDescriptorEntry.sigHash,\n minimalName: fnDescriptorEntry.minimalName,\n description: debouncedDescription,\n });\n }\n }, [\n fnDescriptorEntry.sigHash,\n fnDescriptorEntry.minimalName,\n debouncedDescription,\n onEntryChange,\n ]);\n\n return (\n \n \n Description\n \n \n setDescription(e.target.value)}\n disabled={!!notice}\n />\n
    \n {fnDescriptorEntry.fullName}\n
    \n {}}\n disabled={!(notice || description)}\n />\n
    \n );\n};\n\nconst StatusLabel = ({ status }: { status: FnDescriptionStatus }) => {\n const iconData = getFnEntryStatusIconData(status);\n\n if (!iconData) {\n return null;\n }\n\n const { Icon, color } = iconData;\n\n return (\n \n
    \n \n
    \n {status}\n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst DescriptorHeader = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: ${1 * GU}px;\n`;\n\nconst LabelContainer = styled.div<{\n status: FnDescriptionStatus;\n visible: boolean;\n}>`\n display: flex;\n visibility: ${({ visible }) => (visible ? \"visible\" : \"hidden\")};\n align-items: center;\n height: 24px;\n border: 1px solid ${({ color }) => color};\n width: fit-content;\n text-transform: lowercase;\n border-radius: 4px;\n padding-right: ${1 * GU}px;\n ${textStyle(\"body4\")};\n\n div:first-child {\n display: flex;\n height: 100%;\n align-items: center;\n color: ${({ theme }) => theme.content};\n background-color: ${({ color }) => color};\n margin-right: ${1 * GU}px;\n }\n`;\n", "import { GU, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport type { ChangeEventHandler, FocusEventHandler } from \"react\";\nimport styled from \"styled-components\";\n\ntype DescriptionFieldProps = {\n value?: string;\n disabled?: boolean;\n height?: string;\n placeholder?: string;\n textSize?: string;\n onBlur?: FocusEventHandler;\n onChange?: ChangeEventHandler;\n};\n\nexport const DescriptionField = ({\n value,\n disabled = false,\n height = `${10 * GU}px`,\n textSize = \"body2\",\n placeholder = \"Add description\u2026\",\n onBlur,\n onChange,\n}: DescriptionFieldProps) => (\n \n);\n\nconst DescriptionTextArea = styled.textarea<{\n height: string;\n textSize: string;\n}>`\n height: ${(props) => props.height};\n padding: ${1 * GU}px ${1.5 * GU}px;\n background: ${(props) => props.theme.surfaceUnder};\n color: ${(props) => props.theme.surfaceContent};\n appearance: none;\n border-radius: ${RADIUS}px;\n width: 100%;\n outline: none;\n resize: none;\n ${(props) => textStyle(props.textSize)};\n\n &:focus {\n outline: none;\n border-color: ${(props) => props.theme.selected};\n }\n &:read-only {\n color: ${(props) => props.theme.hint};\n border-color: ${(props) => props.theme.border};\n }\n &::placeholder {\n color: ${(props) => props.theme.hint};\n opacity: 0.5;\n }\n &:invalid {\n box-shadow: none;\n }\n\n &::-webkit-scrollbar {\n width: 12px;\n background-color: ${(props) => props.theme.surfaceSelected};\n }\n\n &::-webkit-scrollbar-thumb {\n border-radius: 10px;\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);\n background-color: ${(props) => props.theme.surfaceIcon};\n }\n`;\n", "import { GU } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { PaginationItem } from \"./PaginationItem\";\nimport { PaginationSeparator } from \"./PaginationSeparator\";\n\nfunction paginationItems(\n pages: number,\n selected: number,\n inbetweenRange: number\n): number[] {\n // visibleItems + first and final item + ellipses\n const totalVisibleItems = inbetweenRange + 2 + 2;\n const all = [...Array(pages)].map((_, i) => i);\n /**\n * When having odd lengths use the previous number to get\n * an even distribution amount of visible items on both sides of the\n * selected number.\n */\n const normalizedLength =\n inbetweenRange % 2 === 0 ? inbetweenRange : inbetweenRange - 1;\n\n if (all.length <= totalVisibleItems) {\n return all;\n }\n\n const first = 0;\n const last = all.length - 1;\n const amountBySide = Math.floor(inbetweenRange / 2);\n const itemsToLast = last - selected;\n const prevSize =\n Math.min(amountBySide, Math.max(0, selected - first)) +\n /**\n * Add the missing items on one side or the other to keep\n * the visible items length at all times.\n */\n (itemsToLast < amountBySide ? amountBySide - itemsToLast : 0);\n const nextSize = normalizedLength - prevSize;\n\n let lowerPrevBound = Math.min(all.length, selected - prevSize);\n let upperNextBound = Math.min(all.length, selected + nextSize);\n\n const items = [];\n\n items.push(...all.slice(lowerPrevBound, upperNextBound + 1));\n\n // Add ellipses\n let leftEllipsisAdded = false,\n rightEllipsisAdded = false;\n\n if (lowerPrevBound > first + 1) {\n items.unshift(-1);\n leftEllipsisAdded = true;\n }\n if (upperNextBound < last - 1) {\n items.push(-1);\n rightEllipsisAdded = true;\n }\n\n // Always display the first & last items\n if (lowerPrevBound >= first + 1) {\n items.unshift(all[0]);\n }\n if (upperNextBound <= last - 1) {\n items.push(all[all.length - 1]);\n }\n\n const missingItems = totalVisibleItems - items.length;\n\n /**\n * To keep a constant pagination size we always add enough items\n * to reach the total total amount of visible items.\n * We add them on the left or right side of the selected item based on\n * where we put the ellipsis.\n */\n if (missingItems > 0 && !(leftEllipsisAdded && rightEllipsisAdded)) {\n if (leftEllipsisAdded) {\n items.splice(\n 2,\n 0,\n ...all.slice(lowerPrevBound - missingItems, lowerPrevBound)\n );\n } else {\n items.splice(\n items.length - 2,\n 0,\n ...all.slice(upperNextBound + 1, upperNextBound + missingItems + 1)\n );\n }\n }\n\n return items;\n}\n\ntype PaginationProps = {\n direction?: \"horizontal\" | \"vertical\";\n pages: number;\n // Length of elements between ellipses.\n inbetweenRange?: number;\n selected: number;\n size: number;\n touchMode?: boolean;\n onChange(index: number): void;\n};\n\nexport const Pagination = ({\n direction = \"horizontal\",\n pages,\n inbetweenRange = 9,\n selected,\n size,\n touchMode = false,\n onChange,\n}: PaginationProps) => {\n const items = paginationItems(pages, selected, inbetweenRange);\n const isHorizontal = direction === \"horizontal\";\n\n return (\n \n {items.map((pageIndex, i) =>\n pageIndex === -1 ? (\n \n ) : (\n \n )\n )}\n \n );\n};\n\nconst Container = styled.div<{ isHorizontal: boolean; touchMode: boolean }>`\n display: flex;\n flex-direction: ${({ isHorizontal }) => (isHorizontal ? \"row\" : \"column\")};\n gap: ${({ touchMode }) => (touchMode ? 0 : `${2 * GU}px`)};\n`;\n", "import { ButtonBase, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport { useCallback } from \"react\";\nimport styled from \"styled-components\";\n\ntype Direction = \"horizontal\" | \"vertical\";\n\ntype PaginationItemProps = {\n direction?: Direction;\n index: number;\n selected: boolean;\n size: number;\n touchMode: boolean;\n onChange(index: number): void;\n};\n\nexport const PaginationItem = ({\n direction = \"horizontal\",\n touchMode,\n selected,\n size,\n index,\n onChange,\n}: PaginationItemProps) => {\n const handleClick = useCallback(() => {\n onChange(index);\n }, [index, onChange]);\n\n return (\n
    \n {selected && }\n \n {index + 1}\n \n
    \n );\n};\n\nconst Dot = styled.div<{ direction: Direction }>`\n width: 3px;\n height: 3px;\n position: absolute;\n ${({ direction }) =>\n direction === \"horizontal\"\n ? `\n bottom: calc(-20%);\n left: calc(50% - 2px);\n `\n : `\n top: calc(50% - 1px);\n left: calc(-10%);\n `};\n background: ${({ theme }) => theme.accentContent};\n`;\n\nconst StyledButtonBase = styled(ButtonBase)<{\n selected: boolean;\n touchMode: boolean;\n}>`\n border-radius: ${RADIUS}px;\n ${({ selected, theme, touchMode, size }) => `\n width: ${size}px;\n height: ${size}px;\n color: ${theme.surfaceContent};\n ${textStyle(touchMode ? \"body1\" : \"title2\")};\n\n &:active {\n background: ${theme.surfacePressed};\n }\n ${\n selected &&\n `\n && {\n color: ${theme.accentContent};\n }\n `\n };\n `}\n`;\n", "import { IconEllipsis } from \"@1hive/1hive-ui\";\nimport { memo } from \"react\";\nimport styled from \"styled-components\";\n\ntype PaginationSeparatorProps = {\n isHorizontal?: boolean;\n size: number;\n};\n\nexport const PaginationSeparator = memo(function PaginationSeparator({\n isHorizontal = false,\n size,\n}: PaginationSeparatorProps) {\n return (\n \n \n \n );\n});\n\nconst Container = styled.div<{ isHorizontal: boolean; size: number }>`\n display: flex;\n align-items: center;\n justify-content: center;\n ${({ size }) => `\n width: ${size}px;\n height: ${size}px;\n `};\n transform: rotate(${({ isHorizontal }) => (isHorizontal ? 0 : \"90deg\")});\n`;\n\nconst StyledIconEllipsis = styled(IconEllipsis)`\n color: ${({ theme }) => theme.surfaceContentSecondary.alpha(0.4)};\n`;\n", "import { createStore } from \"@udecode/zustood\";\nimport { utils } from \"ethers\";\nimport type { FunctionFragment } from \"ethers/lib/utils\";\nimport type { FnEntry, UserFnDescription } from \"~/types\";\nimport { getFnSelector } from \"~/utils\";\n\nexport type Function = {\n fullName: string;\n minimalName: string;\n sigHash: string;\n entry?: FnEntry;\n};\n\ntype ContractDescriptorState = {\n fnSelected: number;\n fnDescriptorEntries: Function[];\n /**\n * Use an object to index descriptions to ease state updates at\n * the expense of having some fn data duplication (sigHash, minimalName, etc)\n */\n userFnDescriptions: Record;\n};\n\nconst initialState: ContractDescriptorState = {\n fnSelected: 0,\n fnDescriptorEntries: [],\n userFnDescriptions: {},\n};\n\nconst contractDescriptorStore = createStore(\"contract-descriptor\")(\n initialState,\n {\n devtools: { enabled: process.env.NODE_ENV === \"development\" },\n }\n)\n .extendActions((set, get) => ({\n setUpFnDescriptorEntries: (abi: string, entries: FnEntry[]) => {\n const abiInterface = new utils.Interface(abi);\n const fnFragments = abiInterface.fragments.filter(\n (f) => f.type === \"function\"\n ) as FunctionFragment[];\n\n const fns = fnFragments\n .filter((f) => !f.constant) // Only consider functions that does not change state\n .map((f) => {\n const sigHash = getFnSelector(f);\n return {\n fullName: f.format(\"full\"),\n minimalName: f.format(\"minimal\"),\n sigHash,\n entry: entries.find((e) => e.sigHash === sigHash),\n };\n });\n\n set.fnDescriptorEntries(fns);\n },\n goToNextFn: () => {\n const prevFnSelected = get.fnSelected();\n const fns = get.fnDescriptorEntries();\n\n set.fnSelected(Math.min(fns.length - 1, prevFnSelected + 1));\n },\n goToPrevFn: () => {\n const prevFnSelected = get.fnSelected();\n set.fnSelected(Math.max(0, prevFnSelected - 1));\n },\n upsertFnDescription: (userFnDescription: UserFnDescription) => {\n const { sigHash, description } = userFnDescription;\n const prevUserFnDescriptions = get.userFnDescriptions();\n\n if (prevUserFnDescriptions[sigHash]?.description === description) {\n return;\n }\n\n if (!description && prevUserFnDescriptions.hasOwnProperty(sigHash)) {\n const newUserFnDescriptions = { ...prevUserFnDescriptions };\n delete newUserFnDescriptions[sigHash];\n\n set.userFnDescriptions(newUserFnDescriptions);\n\n return;\n }\n\n set.userFnDescriptions({\n ...prevUserFnDescriptions,\n\n [sigHash]: userFnDescription,\n });\n },\n }))\n .extendSelectors((_, get) => ({\n fnDescriptionsCounter: () => Object.keys(get.userFnDescriptions()).length,\n }));\n\nexport const useContractDescriptorStore = contractDescriptorStore.useStore;\nexport const selectors = contractDescriptorStore.use;\nexport const actions = contractDescriptorStore.set;\n", "import { utils } from \"ethers\";\nimport type { Fragment } from \"ethers/lib/utils\";\n\nexport const getFnSelector = (fragment: Fragment): string =>\n utils.id(fragment.format(\"sighash\")).substring(0, 10);\n", "import { GU, textStyle } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { a, useTransition } from \"react-spring\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { ContractItem } from \"./ContractItem\";\n\ntype ContractSelectorScreenProps = {\n contracts: AggregateContract[];\n loaderText?: string;\n onContractDataSelected(contractData: ContractData): void;\n};\n\nexport const ContractSelectorScreen = ({\n contracts,\n loaderText,\n onContractDataSelected,\n}: ContractSelectorScreenProps) => {\n const transition = useTransition(contracts, {\n trail: 100 / contracts.length,\n from: { opacity: 0, scale: 0 },\n enter: { opacity: 1, scale: 1 },\n });\n\n return (\n \n
    The following contracts have been found for the given address:
    \n {transition((styles, item) => (\n \n \n \n ))}\n
    \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: ${2 * GU}px;\n padding: ${1 * GU}px;\n margin-top: ${15 * GU}px;\n margin-bottom: ${3 * GU}px;\n\n & > div:first-child {\n ${textStyle(\"body1\")};\n margin: 0 ${2 * GU}px;\n margin-bottom: ${3 * GU}px;\n }\n`;\n", "import { GU, LoadingRing, Switch, Tag, textStyle } from \"@1hive/1hive-ui\";\nimport type { MouseEventHandler } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { a, useTransition } from \"react-spring\";\nimport styled from \"styled-components\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { getNetworkLogo } from \"~/utils/client/icons.client\";\n\ntype ContractItemProps = {\n contract: AggregateContract;\n loaderText?: string;\n onClick(contractData: ContractData): void;\n};\n\nexport const ContractItem = ({\n contract: { proxy, implementation },\n loaderText = \"Fetching data\u2026\",\n onClick,\n}: ContractItemProps) => {\n const [itemClicked, setItemClicked] = useState(false);\n const [displayProxy, setDisplayProxy] = useState(!implementation);\n const contractData = displayProxy ? proxy : implementation;\n const { address, name, network } = contractData!;\n const implementationFound = !!implementation;\n const displaySwitch = !!proxy && !!implementation;\n\n const clickTransition = useTransition(itemClicked, {\n from: {\n loaderOpacity: 0,\n },\n enter: {\n loaderOpacity: 1,\n },\n });\n\n useEffect(() => {\n if (!itemClicked || !contractData) {\n return;\n }\n\n /**\n * Wait a little bit before handling click to display loader\n * for a period of time.\n */\n let timeoutId = setTimeout(() => onClick(contractData), 500);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [contractData, itemClicked, onClick]);\n\n const handleViewClick: MouseEventHandler = (e) => {\n e.stopPropagation();\n\n setDisplayProxy((prev) => !prev);\n };\n\n return (\n {\n setItemClicked(true);\n }}\n isClicked={itemClicked}\n >\n {clickTransition(({ loaderOpacity }, clicked) => (\n <>\n \n \n \n }\n />\n {displaySwitch && (\n <>\n \n Show proxy:{\" \"}\n
    \n \n
    \n
    \n \n )}\n
    \n \n
    {name}
    \n
    {address}
    \n
    \n {!implementationFound && (\n *Implementation source code not found.\n )}\n
    \n {clicked && (\n \n {loaderText}\n \n )}\n \n ))}\n \n );\n};\n\nconst Wrapper = styled.div<{ isClicked: boolean }>`\n position: relative;\n padding: ${2 * GU}px;\n background-color: ${({ theme }) => theme.surface};\n border-radius: 10px;\n transition: background-color ease-out 200ms;\n min-width: 45vmin;\n max-width: 85vmin;\n cursor: pointer;\n\n ${({ isClicked, theme }) =>\n !isClicked\n ? `&:hover {\n background-color: ${theme.surfaceHighlight};\n }`\n : \"\"};\n`;\n\nconst ItemHeader = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: ${1.5 * GU}px;\n`;\n\nconst ItemContent = styled.div`\n & > div:nth-child(1) {\n ${textStyle(\"body1\")};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n & > div:nth-child(2) {\n ${textStyle(\"body3\")};\n color: ${({ theme }) => theme.contentSecondary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nconst InfoError = styled.span`\n color: ${({ theme }) => theme.negative};\n margin-top: ${1 * GU}px;\n ${textStyle(\"body4\")};\n`;\n\nconst ProxySwitchWrapper = styled.div`\n display: flex;\n gap: ${0.5 * GU}px;\n ${({ theme }) => theme.contentSecondary};\n ${textStyle(\"body3\")};\n\n & > div {\n display: flex;\n align-items: center;\n }\n`;\n\nconst Loader = styled(a.div)`\n width: 100%;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n flex-wrap: nowrap;\n gap: ${1 * GU}px;\n ${textStyle(\"body3\")};\n`;\n\nconst NetworkImg = styled.img<{ isTestnet: boolean }>`\n border-radius: 50%;\n width: 20px;\n height: 20px;\n margin-left: -${1.2 * GU}px;\n margin-right: ${0.5 * GU}px;\n ${(props) => (props.isTestnet ? \"filter: grayscale(80%);\" : \"\")};\n`;\n", "import type { ReactNode } from \"react\";\nimport { a, useSpring } from \"react-spring\";\n\nexport const SmoothDisplayContainer = ({\n children,\n}: {\n children: ReactNode;\n}) => {\n const smoothDisplayStyles = useSpring({\n from: { opacity: 0 },\n to: { opacity: 1 },\n });\n\n return (\n \n {children}\n \n );\n};\n", "import type { ContractData, AggregateContract } from \"~/types\";\nimport { getProvider, NETWORKS } from \"./web3.server\";\nimport {\n buildExplorerFetchRequest,\n processExplorerResponse,\n} from \"./blockchain-explorers.server\";\nimport {\n fetchImplementationAddress,\n getProxyPattern,\n} from \"./proxy-patterns.server\";\nimport { constants } from \"ethers\";\nimport type { Chain } from \"wagmi\";\n\nconst processBytecodeRequest = (response: any): string => {\n const bytecode = response as string;\n\n if (!bytecode || bytecode === \"0x\") {\n throw new Response(\n !bytecode\n ? \"Contract bytecode not found\"\n : \"Address provided is not a contract\",\n { status: 500 }\n );\n }\n\n return bytecode;\n};\n\nexport const fetchContracts = async (\n contractAddress: string\n): Promise => {\n const responses = (await Promise.allSettled(\n NETWORKS.map((n) => fetchContractData(contractAddress, n))\n )) as PromiseSettledResult[];\n\n const fulfilledResponses = responses.filter(\n (r) => r.status === \"fulfilled\"\n ) as PromiseFulfilledResult[];\n const contracts = fulfilledResponses.map((r) => r.value);\n const proxiesAndImplementations = [];\n\n // Fetch proxy's implementation contract.\n for (const c of contracts) {\n let proxy, implementation;\n const proxyPattern = getProxyPattern(c.name);\n\n if (proxyPattern !== undefined) {\n proxy = c;\n const implementationAddress = await fetchImplementationAddress(\n proxy,\n proxyPattern\n );\n if (implementationAddress !== constants.AddressZero) {\n try {\n implementation = await fetchContractData(\n implementationAddress,\n c.network\n );\n } catch (err) {}\n }\n } else {\n implementation = c;\n }\n\n proxiesAndImplementations.push({ proxy, implementation });\n }\n\n return proxiesAndImplementations;\n};\n\nexport const fetchContractData = async (\n contractAddress: string,\n network: Chain\n): Promise => {\n const networkId = network.id;\n const provider = getProvider(networkId);\n const explorerRequest = fetch(\n buildExplorerFetchRequest(contractAddress, networkId)\n );\n\n const requests = [provider.getCode(contractAddress), explorerRequest];\n const responses = await Promise.all(requests);\n\n const bytecode = processBytecodeRequest(responses[0]);\n const explorerResult = await processExplorerResponse(\n responses[1] as Response\n );\n\n return {\n abi: explorerResult.ABI,\n bytecode,\n address: contractAddress,\n name: explorerResult.ContractName,\n network,\n };\n};\n", "import { providers } from \"ethers\";\nimport type { Chain } from \"wagmi\";\nimport { allChains } from \"wagmi\";\n\nconst INFURA_PROJECT_ID = process.env.INFURA_PROJECT_ID;\n\nconst STATIC_PROVIDERS_CACHE = new Map<\n number,\n providers.StaticJsonRpcProvider\n>();\n\nconst networkExplorerRegex = /([A-Z]+)_EXPLORER_API_KEY/;\n\nconst availableExplorers = Object.keys(process.env)\n .filter((key) => networkExplorerRegex.test(key))\n .map((key) => key.split(\"_\")[0].toLowerCase());\n\nexport const NETWORKS = allChains.filter(\n (chain) =>\n // Check if chain has the same explorer\n !!chain.blockExplorers?.find(({ name }) =>\n availableExplorers.includes(name.toLowerCase())\n )\n);\n\nconst buildRpcEndpoint = (network: Chain): string => {\n const infuraRpcEndpoints = network.rpcUrls.filter((rpcUrl) =>\n rpcUrl.includes(\"infura\")\n );\n\n if (infuraRpcEndpoints.length) {\n return `${infuraRpcEndpoints[0]}/${INFURA_PROJECT_ID}`;\n }\n\n return network.rpcUrls[0];\n};\n\nexport const getProvider = (networkId: number): providers.Provider => {\n if (STATIC_PROVIDERS_CACHE.has(networkId)) {\n return STATIC_PROVIDERS_CACHE.get(networkId)!;\n }\n\n const network = NETWORKS.find((n) => n.id === networkId)!;\n\n const provider = new providers.StaticJsonRpcProvider(\n buildRpcEndpoint(network),\n networkId\n );\n\n STATIC_PROVIDERS_CACHE.set(networkId, provider);\n\n return provider;\n};\n", "export type ExplorerAPIData = {\n baseUrl: string;\n apiKey: string;\n};\n\nexport type ExplorerResult = {\n ABI: string;\n Address: string;\n ContractName: string;\n};\n\ntype ExplorerResponse = {\n message: string;\n result: ExplorerResult[];\n status: string;\n};\n\nexport const getExplorerAPIData = (networkId: number): ExplorerAPIData => {\n let apiKey, baseUrl;\n\n switch (networkId) {\n case 1:\n apiKey = process.env.ETHERSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api.etherscan.io/api\";\n break;\n case 4:\n apiKey = process.env.ETHERSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api-rinkeby.etherscan.io/api\";\n break;\n case 100:\n apiKey = \"\";\n baseUrl = \"https://blockscout.com/xdai/mainnet/api\";\n break;\n case 137:\n apiKey = process.env.POLYGONSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api.polygonscan.com/api\";\n break;\n case 80001:\n apiKey = process.env.POLYGONSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api-testnet.polygonscan.com/api\";\n break;\n }\n\n if (!apiKey || !baseUrl) {\n throw new Response(\n `Blockchain explorer not found for given chain ${networkId}`,\n {\n status: 500,\n }\n );\n }\n\n return {\n baseUrl,\n apiKey,\n };\n};\n\nexport const processExplorerResponse = async (\n response: Response\n): Promise => {\n const explorerResponse = (await response.json()) as ExplorerResponse;\n\n if (explorerResponse.status === \"0\") {\n throw new Response(explorerResponse.message, { status: 500 });\n }\n\n const result = explorerResponse.result[0];\n\n if (\n !result.ABI ||\n // Check ABI field as Blockscout sets it when contract is not verified\n result.ABI === \"Contract source code not verified\"\n ) {\n throw new Response(`Contract is not verified`, { status: 500 });\n }\n\n return result;\n};\n\nexport const buildExplorerFetchRequest = (\n contractAddress: string,\n networkId: number\n): string => {\n const { baseUrl, apiKey } = getExplorerAPIData(networkId);\n\n return `${baseUrl}?module=contract&action=getsourcecode&address=${contractAddress}${\n apiKey ? `&apikey=${apiKey}` : \"\"\n }`;\n};\n", "import type { providers } from \"ethers\";\nimport { BigNumber, constants, Contract, utils } from \"ethers\";\nimport type { ContractData } from \"~/types\";\nimport { getProvider } from \"./web3.server\";\n\nenum ProxyPattern {\n UUPSProxy,\n UpgradeabilityStorage,\n EternalStorage,\n TransparentUpgradeableProxy,\n AppProxyUpgradeable,\n UnknownProxy,\n}\n\ntype ProxyPatternHandler = (\n proxy: ContractData,\n provider: providers.Provider\n) => Promise;\n\nconst {\n UUPSProxy,\n UpgradeabilityStorage,\n EternalStorage,\n TransparentUpgradeableProxy,\n AppProxyUpgradeable,\n UnknownProxy,\n} = ProxyPattern;\n\n/**\n * Standarized storage slot determined by bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1)\n * and defined on EIP-1967 (https://eips.ethereum.org/EIPS/eip-1967#logic-contract-address)\n */\nconst EIP1967_STORAGE_SLOT = utils.hexlify(\n BigNumber.from(utils.id(\"eip1967.proxy.implementation\")).sub(1)\n);\n\nconst getAddressFromStorageSlot = async (\n contractAddress: string,\n storageSlot: string | number,\n provider: providers.Provider\n): Promise => {\n const rawImplementationAddress = await provider.getStorageAt(\n contractAddress,\n storageSlot\n );\n return utils.hexStripZeros(rawImplementationAddress);\n};\n\nconst PROXY_PATTERN_HANDLERS: Record = {\n [UUPSProxy]: async ({ address }, provider) => {\n let implementationAddress = await getAddressFromStorageSlot(\n address,\n EIP1967_STORAGE_SLOT,\n provider\n );\n\n /**\n * Try to fetch the address from the keccak256(\"PROXIABLE\") slot as defined on\n * the EIP-1822 UUPS proposal (https://eips.ethereum.org/EIPS/eip-1822#proxiable-contract).\n */\n if (implementationAddress === constants.AddressZero) {\n implementationAddress = await getAddressFromStorageSlot(\n address,\n utils.id(\"PROXIABLE\"),\n provider\n );\n return implementationAddress;\n }\n\n return implementationAddress;\n },\n [UpgradeabilityStorage]: async (proxy, provider) => {\n return \"\";\n },\n [EternalStorage]: async (proxy, provider) => {\n return \"\";\n },\n [TransparentUpgradeableProxy]: async ({ address }, provider) => {\n return getAddressFromStorageSlot(address, EIP1967_STORAGE_SLOT, provider);\n },\n [AppProxyUpgradeable]: ({ address, abi }, provider) => {\n const proxyContract = new Contract(address, abi, provider);\n\n return proxyContract.implementation();\n },\n [UnknownProxy]: async ({ address, abi }, provider) => {\n let implementationAddress: string;\n\n try {\n const proxyContract = new Contract(address, abi, provider);\n // Try fetching address from method\n implementationAddress = await proxyContract.implementation();\n } catch (err) {\n implementationAddress = await getAddressFromStorageSlot(\n address,\n EIP1967_STORAGE_SLOT,\n provider\n );\n }\n\n return implementationAddress;\n },\n};\n\nexport const getProxyPattern = (\n contractName: string\n): ProxyPattern | undefined => {\n const normalizedContractName = contractName.toLowerCase();\n const proxyPatternKeys = Object.keys(ProxyPattern).map((k) =>\n k.toLowerCase()\n );\n const proxyPatternIndex = proxyPatternKeys.indexOf(normalizedContractName);\n\n if (proxyPatternIndex === -1) {\n if (normalizedContractName.includes(\"proxy\")) {\n return UnknownProxy;\n }\n return;\n }\n\n return Object.values(ProxyPattern)[\n proxyPatternIndex\n ] as unknown as ProxyPattern;\n};\n\nexport const fetchImplementationAddress = (\n proxy: ContractData,\n proxyPattern: ProxyPattern\n): Promise =>\n PROXY_PATTERN_HANDLERS[proxyPattern](proxy, getProvider(proxy.network.id));\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { Outlet } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\n\nexport default function Home() {\n const { below } = useViewport();\n\n return (\n \n \n \n \n \n );\n}\n\nconst MainContainer = styled.div<{ compactMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding-top: ${({ compactMode }) => (compactMode ? 5 * GU : 17 * GU)}px;\n width: 100%;\n height: 100%;\n`;\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { useNavigate } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractForm } from \"~/components/ContractForm\";\n\nexport default function Home() {\n const { below } = useViewport();\n const navigate = useNavigate();\n\n return (\n \n \n \n navigate(`/describe?contract=${contractAddress}`)\n }\n />\n \n \n );\n}\n\nconst MainContainer = styled.div<{ compactMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding-top: ${({ compactMode }) => (compactMode ? 5 * GU : 17 * GU)}px;\n width: 100%;\n height: 100%;\n`;\n", "import {\n Button,\n Field,\n GU,\n Info,\n LoadingRing,\n TextInput,\n} from \"@1hive/1hive-ui\";\nimport { utils } from \"ethers\";\nimport type { ChangeEvent, FormEventHandler } from \"react\";\nimport { useState } from \"react\";\nimport { useTransition } from \"@remix-run/react\";\nimport styled from \"styled-components\";\n\ntype ContractFormProps = {\n onSubmit(contractAddress: string): void;\n};\n\nexport const ContractForm = ({ onSubmit }: ContractFormProps) => {\n const [contractAddress, setContractAddress] = useState(\"\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n const transition = useTransition();\n\n const handleSubmit: FormEventHandler = (e) => {\n e.preventDefault();\n\n if (!contractAddress) {\n setErrorMsg(\"Type in a contract address.\");\n return;\n }\n if (!utils.isAddress(contractAddress)) {\n setErrorMsg(\"Invalid contract address.\");\n return;\n }\n\n onSubmit(contractAddress);\n };\n\n return (\n \n
    \n \n \n ) => {\n setErrorMsg(\"\");\n setContractAddress(e.target.value);\n }}\n wide\n />\n \n {errorMsg && {errorMsg}}\n \n \n {transition.state === \"loading\" ? (\n <>\n \n Loading\u2026\n \n ) : (\n <>Next\n )}\n \n \n
    \n );\n};\n\nconst Container = styled.div`\n width: 100%;\n max-width: 440px;\n margin: 0 ${3 * GU}px;\n display: flex;\n flex-direction: column;\n`;\n\nconst MainTextInput = styled(TextInput)`\n height: ${8 * GU}px;\n`;\n\nconst NextButton = styled(Button)`\n height: ${8 * GU}px;\n`;\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { useNavigate } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractForm } from \"~/components/ContractForm\";\n\nexport default function Home() {\n const { below } = useViewport();\n const navigate = useNavigate();\n\n return (\n \n \n \n navigate(`/describe?contract=${contractAddress}`)\n }\n />\n \n \n );\n}\n\nconst MainContainer = styled.div<{ compactMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding-top: ${({ compactMode }) => (compactMode ? 5 * GU : 17 * GU)}px;\n width: 100%;\n height: 100%;\n`;\n", "import { useEffect } from \"react\";\nimport { useNavigate } from \"@remix-run/react\";\n\nexport default function Index() {\n const navigate = useNavigate();\n\n useEffect(() => navigate(\"/home\"), [navigate]);\n\n return null;\n}\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { useNavigate } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractForm } from \"~/components/ContractForm\";\n\nexport default function Home() {\n const { below } = useViewport();\n const navigate = useNavigate();\n\n return (\n \n \n \n navigate(`/describe?contract=${contractAddress}`)\n }\n />\n \n \n );\n}\n\nconst MainContainer = styled.div<{ compactMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding-top: ${({ compactMode }) => (compactMode ? 5 * GU : 17 * GU)}px;\n width: 100%;\n height: 100%;\n`;\n", "export default {'version':'6f73278b','entry':{'module':'/build/entry.client-KXAZZYFT.js','imports':['/build/_shared/chunk-HZUGWBV5.js','/build/_shared/chunk-3OZZSMKW.js','/build/_shared/chunk-HOQS7EGD.js','/build/_shared/chunk-7GBHLDOU.js']},'routes':{'root':{'id':'root','parentId':undefined,'path':'','index':undefined,'caseSensitive':undefined,'module':'/build/root-LXLZWZT6.js','imports':['/build/_shared/chunk-WM277Z36.js','/build/_shared/chunk-V7JDQZRO.js','/build/_shared/chunk-NSI4AK6N.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':true,'hasErrorBoundary':true},'routes/contract-descriptions-search':{'id':'routes/contract-descriptions-search','parentId':'root','path':'contract-descriptions-search','index':undefined,'caseSensitive':undefined,'module':'/build/routes/contract-descriptions-search-PEV4ET7N.js','imports':undefined,'hasAction':false,'hasLoader':true,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/describe':{'id':'routes/describe','parentId':'root','path':'describe','index':undefined,'caseSensitive':undefined,'module':'/build/routes/describe-TAELDTDN.js','imports':['/build/_shared/chunk-MMKRZLXC.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':true,'hasErrorBoundary':false},'routes/entries':{'id':'routes/entries','parentId':'root','path':'entries','index':undefined,'caseSensitive':undefined,'module':'/build/routes/entries-AI4QM4WK.js','imports':['/build/_shared/chunk-MMKRZLXC.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/entries/$entryId':{'id':'routes/entries/$entryId','parentId':'routes/entries','path':':entryId','index':undefined,'caseSensitive':undefined,'module':'/build/routes/entries/$entryId-BNHOF4AE.js','imports':['/build/_shared/chunk-UXBPLAWT.js','/build/_shared/chunk-V7JDQZRO.js','/build/_shared/chunk-NSI4AK6N.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/entries/index':{'id':'routes/entries/index','parentId':'routes/entries','path':undefined,'index':true,'caseSensitive':undefined,'module':'/build/routes/entries/index-Z3752YRD.js','imports':['/build/_shared/chunk-UXBPLAWT.js','/build/_shared/chunk-V7JDQZRO.js','/build/_shared/chunk-NSI4AK6N.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/fn-descriptions-upload':{'id':'routes/fn-descriptions-upload','parentId':'root','path':'fn-descriptions-upload','index':undefined,'caseSensitive':undefined,'module':'/build/routes/fn-descriptions-upload-T5MYKGOC.js','imports':undefined,'hasAction':true,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/home':{'id':'routes/home','parentId':'root','path':'home','index':undefined,'caseSensitive':undefined,'module':'/build/routes/home-WJFYTYAI.js','imports':['/build/_shared/chunk-UXBPLAWT.js','/build/_shared/chunk-MMKRZLXC.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/index':{'id':'routes/index','parentId':'root','path':undefined,'index':true,'caseSensitive':undefined,'module':'/build/routes/index-FOBWBYMC.js','imports':undefined,'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false}},'url':'/build/manifest-6F73278B.js'};"], - "mappings": "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", + "sources": ["../node_modules/@remix-run/dev/compiler/shims/react.ts", "empty-module:~/utils/client/icons.client", "empty-module:~/utils/client/selection.client", "", "server-entry-module:@remix-run/dev/server-build", "../app/entry.server.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/root.tsx", "../app/App.tsx", "../app/providers/AppReady.tsx", "../app/components/BlossomLabsLogo.tsx", "../app/providers/Wagmi.tsx", "../app/components/AppLayout/index.tsx", "../app/components/AppLayout/BottomBar/index.tsx", "../app/components/AppLayout/TopBar/index.tsx", "../app/components/AccountModule/index.tsx", "../app/components/AccountModule/helpers.ts", "../app/components/AccountModule/use-account-module-store.ts", "../app/components/AccountModule/AccountButton.tsx", "../app/components/AccountModule/HeaderPopover.tsx", "../app/components/AccountModule/screens/index.ts", "../app/components/AccountModule/screens/ScreenPromptedAction.tsx", "../app/components/AccountModule/LoadingRing.tsx", "../app/components/AccountModule/screens/ScreenConnected.tsx", "../app/hooks/useCopyToClipboard.ts", "../app/components/AccountModule/screens/ScreenConnecting.tsx", "../app/components/AccountModule/screens/ScreenError.tsx", "../app/components/AccountModule/screens/ScreenWallets.tsx", "../app/components/AppLayout/TopBar/NavSection/index.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/index.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/MenuItem.tsx", "../app/components/AppLayout/TopBar/NavSection/CompactMenu/Sidebar.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/contract-descriptions-search.ts", "../app/utils/server/entries-data.server.ts", "../app/utils/ipfs.ts", "../app/utils/cache-store.ts", "../app/utils/server/subgraph.server.ts", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/fn-descriptions-upload.ts", "../app/utils/server/ipfs.server.ts", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/describe.tsx", "../app/components/AppLayout/AppScreen.tsx", "../app/components/ContractDescriptorScreen/index.tsx", "../app/components/ContractDescriptorScreen/Pagination/index.tsx", "../app/components/ContractDescriptorScreen/Pagination/PaginationItem.tsx", "../app/components/ContractDescriptorScreen/Pagination/PaginationSeparator.tsx", "../app/components/ContractDescriptorScreen/use-contract-descriptor-store.ts", "../app/utils/web3.ts", "../app/components/ContractDescriptorScreen/useRosetteActions.ts", "../app/components/ContractDescriptorScreen/HelperFunctionsPicker/index.tsx", "../app/components/ContractDescriptorScreen/HelperFunctionsPicker/FunctionDetails/index.tsx", "../app/components/ContractDescriptorScreen/HelperFunctionsPicker/FunctionDetails/Entry.tsx", "../app/radspec-helper-functions.ts", "../app/components/ContractDescriptorScreen/FnDescriptorsCarousel.tsx", "../app/components/ContractDescriptorScreen/Carousel/index.tsx", "../app/components/ContractDescriptorScreen/Carousel/PrevNext.tsx", "../app/components/ContractDescriptorScreen/FunctionDescriptor/index.tsx", "../app/components/StatusLabel.tsx", "../app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx", "../app/hooks/useDebounce.ts", "../app/components/ContractSelectorScreen/index.tsx", "../app/components/ContractSelectorScreen/ContractItem.tsx", "../app/components/SmoothDisplayContainer.tsx", "../app/utils/server/contract-data.server.ts", "../app/utils/server/web3.server.ts", "../app/utils/server/blockchain-explorers.server.ts", "../app/utils/server/proxy-patterns.server.ts", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries/$entry.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries/index.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/index.tsx", "/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/home.tsx", "../app/components/ContractForm/index.tsx", "server-assets-manifest:@remix-run/dev/assets-manifest"], + "sourcesContent": ["// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as React from \"react\";\nexport { React };\n", "module.exports = {};", "module.exports = {};", "export * from \"@remix-run/dev/server-build\";", "\nimport * as entryServer from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/entry.server.tsx\";\nimport * as route0 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/root.tsx\";\nimport * as route1 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/contract-descriptions-search.ts\";\nimport * as route2 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/fn-descriptions-upload.ts\";\nimport * as route3 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/describe.tsx\";\nimport * as route4 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries.tsx\";\nimport * as route5 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries/$entry.tsx\";\nimport * as route6 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/entries/index.tsx\";\nimport * as route7 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/index.tsx\";\nimport * as route8 from \"/Users/fabriziovigevani/Documents/Work/Rosette/rosette-app/app/routes/home.tsx\";\n export { default as assets } from \"@remix-run/dev/assets-manifest\";\n export const entry = { module: entryServer };\n export const routes = {\n \"root\": {\n id: \"root\",\n parentId: undefined,\n path: \"\",\n index: undefined,\n caseSensitive: undefined,\n module: route0\n },\n \"routes/contract-descriptions-search\": {\n id: \"routes/contract-descriptions-search\",\n parentId: \"root\",\n path: \"contract-descriptions-search\",\n index: undefined,\n caseSensitive: undefined,\n module: route1\n },\n \"routes/fn-descriptions-upload\": {\n id: \"routes/fn-descriptions-upload\",\n parentId: \"root\",\n path: \"fn-descriptions-upload\",\n index: undefined,\n caseSensitive: undefined,\n module: route2\n },\n \"routes/describe\": {\n id: \"routes/describe\",\n parentId: \"root\",\n path: \"describe\",\n index: undefined,\n caseSensitive: undefined,\n module: route3\n },\n \"routes/entries\": {\n id: \"routes/entries\",\n parentId: \"root\",\n path: \"entries\",\n index: undefined,\n caseSensitive: undefined,\n module: route4\n },\n \"routes/entries/$entry\": {\n id: \"routes/entries/$entry\",\n parentId: \"routes/entries\",\n path: \":entry\",\n index: undefined,\n caseSensitive: undefined,\n module: route5\n },\n \"routes/entries/index\": {\n id: \"routes/entries/index\",\n parentId: \"routes/entries\",\n path: undefined,\n index: true,\n caseSensitive: undefined,\n module: route6\n },\n \"routes/index\": {\n id: \"routes/index\",\n parentId: \"root\",\n path: undefined,\n index: true,\n caseSensitive: undefined,\n module: route7\n },\n \"routes/home\": {\n id: \"routes/home\",\n parentId: \"root\",\n path: \"home\",\n index: undefined,\n caseSensitive: undefined,\n module: route8\n }\n };", "import ReactDOMServer from \"react-dom/server\";\nimport type { EntryContext } from \"@remix-run/node\";\nimport { RemixServer } from \"@remix-run/react\";\nimport { ServerStyleSheet } from \"styled-components\";\n\nexport default function handleRequest(\n request: Request,\n responseStatusCode: number,\n responseHeaders: Headers,\n remixContext: EntryContext\n) {\n const sheet = new ServerStyleSheet();\n\n let markup = ReactDOMServer.renderToString(\n sheet.collectStyles(\n \n )\n );\n const styles = sheet.getStyleTags();\n\n markup = markup.replace(\"__STYLES__\", styles);\n\n responseHeaders.set(\"Content-Type\", \"text/html\");\n\n return new Response(\"\" + markup, {\n status: responseStatusCode,\n headers: responseHeaders,\n });\n}\n", "import { Main } from \"@1hive/1hive-ui\";\nimport {\n Links,\n LiveReload,\n Meta,\n Scripts,\n ScrollRestoration,\n useCatch,\n useLoaderData,\n} from \"@remix-run/react\";\nimport type { MetaFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport { App } from \"~/App\";\n\nexport const meta: MetaFunction = () => {\n return {\n title: \"Rosette\",\n charset: \"utf-8\",\n viewport: \"width=device-width,initial-scale=1\",\n };\n};\n\nexport async function loader() {\n return json({\n ENV: {\n CHAIN_ID: process.env.CHAIN_ID,\n RPC_URL: process.env.RPC_URL,\n INFURA_ID: process.env.INFURA_ID,\n ROSETTE_STONE_ADDRESS: process.env.ROSETTE_STONE_ADDRESS,\n },\n });\n}\n\ninterface DocumentProps {\n children: React.ReactNode;\n}\n\nconst Document = ({ children }: DocumentProps) => {\n const data = useLoaderData();\n\n return (\n \n \n \n \n {typeof document === \"undefined\" ? \"__STYLES__\" : null}\n \n \n {children}\n \n \n \n \n \n \n );\n};\n\nexport default function WrapperApp() {\n return (\n \n \n \n \n \n );\n}\n\n// https://remix.run/docs/en/v1/api/conventions#catchboundary\nexport function CatchBoundary() {\n const caught = useCatch();\n\n let message;\n switch (caught.status) {\n case 401:\n message = (\n

    \n Oops! Looks like you tried to visit a page that you do not have access\n to.\n

    \n );\n break;\n case 404:\n message = (\n

    Oops! Looks like you tried to visit a page that does not exist.

    \n );\n break;\n\n default:\n throw new Error(caught.data || caught.statusText);\n }\n\n return (\n
    \n

    \n {caught.status}: {caught.statusText}\n

    \n {message}\n
    \n );\n}\n\nexport function ErrorBoundary({ error }: { error: Error }) {\n return (\n
    \n

    [ErrorBoundary]: There was an error: {error.message}

    \n
    \n );\n}\n", "import { useTheme } from \"@1hive/1hive-ui\";\nimport { ThemeProvider } from \"styled-components\";\nimport { useState } from \"react\";\n\nimport { AppReady } from \"~/providers/AppReady\";\nimport Wagmi from \"~/providers/Wagmi\";\nimport { AppLayout } from \"~/components/AppLayout\";\nimport { Outlet } from \"@remix-run/react\";\n\nexport type AppContext = {\n displayTopBar(display: boolean): void;\n displayBottomBar(display: boolean): void;\n};\n\nexport const App = () => {\n const theme = useTheme();\n\n const [displayTopBar, setDisplayTopBar] = useState(true);\n const [displayBottomBar, setDisplayBottomBar] = useState(true);\n\n return (\n \n \n \n \n \n \n \n \n \n );\n};\n", "import { springs } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TransitionFn } from \"@react-spring/web\";\nimport { a, useTransition } from \"@react-spring/web\";\n\nimport { BlossomLabsLogo } from \"~/components/BlossomLabsLogo\";\n\nexport type AppReadyTransition = TransitionFn<\n boolean,\n {\n progress: number;\n topBarTransform: string;\n bottomBarTransform: string;\n screenTransform: string;\n }\n>;\n\ntype AppReadyContextProps = {\n appReady: boolean;\n appReadyTransition: AppReadyTransition;\n};\n\nconst AppReadyContext = createContext(\n {} as AppReadyContextProps\n);\n\ntype AppReadyProps = { children: ReactNode };\n\nexport function AppReady({ children }: AppReadyProps) {\n const [ready, setReady] = useState(false);\n\n const appReadyTransition = useTransition(ready, {\n config: springs.lazy,\n from: {\n progress: 0,\n topBarTransform: \"translate3d(0, -100%, 0)\",\n bottomBarTransform: \"translate3d(0, 100%, 0)\",\n screenTransform: \"scale3d(0.9, 0.9, 1)\",\n },\n enter: {\n progress: 1,\n topBarTransform: \"translate3d(0, 0, 0)\",\n bottomBarTransform: \"translate3d(0, 0, 0)\",\n screenTransform: \"scale3d(1, 1, 1)\",\n },\n leave: {\n progress: 0,\n topBarTransform: \"translate3d(0, -100%, 0)\",\n bottomBarTransform: \"translate3d(0, 100%, 0)\",\n screenTransform: \"scale3d(0.9, 0.9, 1)\",\n },\n });\n\n const splashTransition = useTransition(!ready, {\n config: springs.swift,\n from: {\n opacity: 1,\n logoTransform: \" rotate3d(0, 0, 1, 0deg)\",\n },\n enter: {\n opacity: 1,\n logoTransform: \"rotate3d(0, 0, 1, 360deg)\",\n },\n leave: {\n opacity: 0,\n // logoTransform: \"rotate3d(0, 0, 1, 360deg)\",\n },\n });\n\n useEffect(() => {\n const id = setTimeout(() => setReady(true), 400);\n return () => clearTimeout(id);\n }, []);\n\n return (\n \n {splashTransition(\n ({ opacity, logoTransform }, loading) =>\n loading && (\n \n \n \n \n \n )\n )}\n {children}\n \n );\n}\n\nexport function useAppReady() {\n return useContext(AppReadyContext);\n}\n\nconst AnimatedSplashContainer = styled(a.div)`\n position: fixed;\n transition-duration: 500ms;\n z-index: 9;\n inset: 0;\n display: grid;\n place-items: center;\n`;\n", "import { GU } from \"@1hive/1hive-ui/\";\nimport styled from \"styled-components\";\n\nimport blossomLabsIcon from \"~/assets/blossom-labs.svg\";\n\ntype BlossomLabsLogoProps = {\n iconSize?: string;\n opacity?: number | string;\n showIconOnly?: boolean;\n};\n\nexport const BlossomLabsLogo = ({\n iconSize = \"20px\",\n opacity,\n showIconOnly = false,\n}: BlossomLabsLogoProps) => (\n \n \n \n {\" \"}\n {!showIconOnly && \"Blossom\"}\n \n \n \n);\n\nconst OutterWrapper = styled.span<{ opacity?: number | string }>`\n display: inline-block;\n color: #f8b9b6;\n opacity: ${(p) => p.opacity};\n font-weight: bold;\n vertical-align: middle;\n`;\n", "import { providers } from \"ethers\";\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { allChains, WagmiProvider } from \"wagmi\";\nimport type { Connector } from \"wagmi\";\nimport { InjectedConnector } from \"wagmi/connectors/injected\";\nimport { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\nconst getConnectors = (chainId: string): Connector[] => {\n const chain = allChains.find((chain) => chain.id === Number(chainId));\n\n if (!chain) {\n throw new Error(\"CHAIN_ID not found: \" + chainId);\n }\n\n return [\n new InjectedConnector({\n chains: [chain],\n options: { shimDisconnect: true },\n }),\n new WalletConnectConnector({\n chains: [chain],\n options: {\n infuraId: window.ENV.INFURA_ID,\n qrcode: true,\n },\n }),\n ];\n};\n\nconst Wagmi = ({ children }: { children: ReactNode }) => {\n const connectors = useMemo(() => getConnectors(window.ENV.CHAIN_ID), []);\n const ethersProvider = useMemo(\n () => new providers.JsonRpcProvider(window.ENV.RPC_URL),\n []\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default Wagmi;\n", "import styled from \"styled-components\";\nimport type { ReactNode } from \"react\";\n\nimport { BottomBar } from \"./BottomBar\";\nimport { TopBar } from \"./TopBar\";\n\ntype AppLayoutProps = {\n children: ReactNode;\n displayTopBar?: boolean;\n displayBottomBar?: boolean;\n};\nexport const AppLayout = ({\n children,\n displayTopBar = true,\n displayBottomBar = true,\n}: AppLayoutProps) => (\n \n {displayTopBar && (\n
    \n \n
    \n )}\n {children}\n {displayBottomBar && (\n
    \n \n
    \n )}\n
    \n);\n\nconst Container = styled.div`\n position: relative;\n height: 100vh;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n`;\n\nconst ChildrenWrapper = styled.div`\n display: flex;\n flex: auto;\n flex-direction: column;\n scroll-behavior: smooth;\n`;\n", "import { GU, useTheme, useViewport } from \"@1hive/1hive-ui\";\nimport { a } from \"@react-spring/web\";\nimport styled from \"styled-components\";\nimport { useAppReady } from \"~/providers/AppReady\";\nimport { BlossomLabsLogo } from \"~/components/BlossomLabsLogo\";\n\nconst OPACITY = 0.8;\nexport const BottomBar = () => {\n const { below } = useViewport();\n const theme = useTheme();\n const { appReadyTransition } = useAppReady();\n const compactMode = below(\"large\");\n\n return (\n \n {appReadyTransition(\n ({ progress, bottomBarTransform }, ready) =>\n ready && (\n \n
    \n powered by   \n
    \n \n )\n )}\n
    \n );\n};\n\nconst Container = styled.div`\n position: relative;\n height: ${7 * GU}px;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $compactMode: boolean }>`\n position: absolute;\n inset: 0;\n display: flex;\n padding: 0 ${7 * GU}px;\n\n justify-content: ${({ $compactMode }) =>\n $compactMode ? \"center\" : \"flex-start\"};\n`;\n", "import { GU, useViewport } from \"@1hive/1hive-ui\";\nimport { a } from \"@react-spring/web\";\nimport styled from \"styled-components\";\n\nimport { useAppReady } from \"~/providers/AppReady\";\nimport { AccountModule } from \"~/components/AccountModule\";\nimport { NavSection } from \"./NavSection\";\n\nexport const TopBar = () => {\n const { appReadyTransition } = useAppReady();\n const { below } = useViewport();\n const compactMode = below(\"large\");\n const mobileMode = below(\"medium\");\n\n return (\n \n {appReadyTransition(\n ({ progress, topBarTransform }, ready) =>\n ready && (\n \n \n \n \n )\n )}\n \n );\n};\n\nconst NavContainer = styled.nav`\n position: relative;\n margin: 0 auto;\n height: ${8 * GU}px;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $compactMode: boolean }>`\n position: absolute;\n inset: 0;\n border-bottom: 1px solid ${({ theme }) => theme.border};\n ${({ $compactMode }) =>\n $compactMode\n ? `\n padding-right: ${1 * GU}px;\n `\n : `\n padding-right: ${5 * GU}px;\n padding-left: ${5 * GU}px;\n `};\n display: flex;\n justify-content: space-between;\n`;\n", "import { Button, GU, IconConnect } from \"@1hive/1hive-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useAccount, useConnect, useNetwork } from \"wagmi\";\nimport type { Chain, Connector } from \"wagmi\";\nimport { getNetworkError } from \"./helpers\";\nimport {\n ScreenType,\n actions,\n useAccounModuleStore,\n} from \"./use-account-module-store\";\nimport type { PromptedAction } from \"./use-account-module-store\";\nimport { AccountButton } from \"./AccountButton\";\nimport { HeaderPopover } from \"./HeaderPopover\";\nimport {\n ScreenConnected,\n ScreenConnecting,\n ScreenError,\n ScreenPromptedAction,\n ScreenWallets,\n} from \"./screens\";\n\nconst SCREENS = [\n ScreenWallets,\n ScreenConnecting,\n ScreenError,\n ScreenPromptedAction,\n ScreenConnected,\n];\n\nconst { Connecting, Error, Action, Connected } = ScreenType;\n\nexport const AccountModule = ({ compact }: { compact?: boolean }) => {\n const buttonRef = useRef();\n const timer = useRef();\n const [{ data: accountData, error: accountError }, disconnect] = useAccount();\n const [{ error: connectError }, connect] = useConnect();\n const [{ data: networkData, error: networkError }, switchNetwork] =\n useNetwork();\n const [promptedActionSucceeded, setPromptedActionSucceeded] = useState(false);\n const error =\n getNetworkError(networkError, networkData) || accountError || connectError;\n\n const { currentScreen, opened, screenDirection } = useAccounModuleStore();\n\n const displayAccountButton =\n currentScreen === Connected && !error && accountData?.address;\n\n const Screen = SCREENS[currentScreen];\n\n const handlePopoverClose = () => {\n if (\n currentScreen === Connecting ||\n currentScreen === Error ||\n currentScreen === Action\n ) {\n // Reject closing the popover\n return false;\n }\n actions.opened(false);\n };\n\n const handleSwitchNetwork = (switchAction: PromptedAction, chain: Chain) => {\n if (switchNetwork) {\n actions.promptedAction(switchAction);\n actions.goToScreen(Action);\n switchNetwork(chain.id)\n .then(({ data, error }) => {\n if (data) {\n setPromptedActionSucceeded(true);\n } else {\n console.error(error);\n actions.goToInitialScreen();\n actions.promptedAction(null);\n }\n })\n .catch((err) => console.error(err));\n }\n };\n\n const handleConnect = (connector: Connector) => {\n actions.selectedConnector(connector);\n actions.goToScreen(Connecting);\n /**\n * Set a timer to always display connecting screen for\n * a period of time\n */\n timer.current = setTimeout(() => {\n connect(connector).then(({ data, error }) => {\n if (data?.chain?.unsupported || error) {\n actions.goToScreen(Error);\n } else {\n actions.goToScreen(Connected);\n }\n });\n }, 500);\n };\n\n const handleBack = () => {\n actions.goToInitialScreen();\n disconnect();\n };\n\n useEffect(() => {\n return () => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n };\n }, []);\n\n /**\n * Wait until network switching process is completed before going to\n * the connected screen.\n */\n useEffect(() => {\n if (promptedActionSucceeded && !networkData.chain?.unsupported) {\n actions.goToScreen(Connected);\n actions.promptedAction(null);\n setPromptedActionSucceeded(false);\n }\n }, [promptedActionSucceeded, networkData.chain]);\n\n return (\n \n {displayAccountButton ? (\n \n ) : (\n }\n label=\"Connect account\"\n onClick={actions.toggleOpened}\n display={compact ? \"icon\" : \"all\"}\n />\n )}\n \n \n \n \n );\n};\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-around;\n outline: 0;\n`;\n", "import { ChainNotConfiguredError, UserRejectedRequestError } from \"wagmi\";\nimport type { Chain } from \"wagmi\";\n\nimport metamask from \"./assets/metamask.svg\";\nimport walletconnect from \"./assets/walletconnect.svg\";\n\nconst chainNotConfiguredError = new ChainNotConfiguredError();\n\nexport const getWalletIconPath = (\n id: string | undefined\n): string | undefined => {\n switch (id) {\n case \"injected\":\n return metamask;\n case \"walletConnect\":\n return walletconnect;\n default:\n return;\n }\n};\n\nexport const getNetworkError = (\n networkError: Error | undefined,\n networkData: { chain?: { unsupported: boolean | undefined }; chains: Chain[] }\n): Error | undefined => {\n if (networkError) {\n return networkError;\n }\n\n if (networkData.chain?.unsupported) {\n return chainNotConfiguredError;\n }\n};\n\nexport const isUserRejectedRequestError = (error: Error) =>\n error instanceof UserRejectedRequestError;\n", "import { createStore } from \"@udecode/zustood\";\nimport type { Connector } from \"wagmi\";\n\nexport enum ScreenType {\n Wallets,\n Connecting,\n Error,\n Action,\n Connected,\n}\n\nexport type PromptedAction = {\n title: string;\n subtitle?: string;\n image?: string;\n};\n\ntype AccountModuleState = {\n opened: boolean;\n promptedAction: PromptedAction | null;\n selectedConnector: Connector | null;\n currentScreen: ScreenType;\n screenDirection: -1 | 1;\n};\n\nconst initialState: AccountModuleState = {\n opened: false,\n promptedAction: null,\n selectedConnector: null,\n currentScreen: ScreenType.Wallets,\n screenDirection: -1,\n};\n\nconst accountModuleStore = createStore(\"account-module\")(initialState, {\n devtools: { enabled: process.env.NODE_ENV === \"development\" },\n})\n .extendActions((set, get) => ({\n toggleOpened: () => set.opened(!get.opened()),\n reset: () => {\n const {\n opened,\n promptedAction,\n selectedConnector,\n currentScreen,\n screenDirection,\n } = initialState;\n\n set.opened(opened);\n set.promptedAction(promptedAction);\n set.selectedConnector(selectedConnector);\n set.currentScreen(currentScreen);\n set.screenDirection(screenDirection);\n },\n goToScreen: (screen: ScreenType) => {\n const previousScreen = get.currentScreen();\n const screenDirection = previousScreen > screen ? -1 : 1;\n\n set.currentScreen(screen);\n set.screenDirection(screenDirection);\n },\n }))\n .extendActions((set) => ({\n goToInitialScreen: () => {\n set.reset();\n set.opened(true);\n },\n }));\n\nexport const useAccounModuleStore = accountModuleStore.useStore;\nexport const actions = accountModuleStore.set;\n", "import {\n ButtonBase,\n EthIdenticon,\n GU,\n IconDown,\n RADIUS,\n shortenAddress,\n textStyle,\n useTheme,\n useViewport,\n} from \"@1hive/1hive-ui\";\nimport { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport styled from \"styled-components\";\nimport { useAccount, useNetwork } from \"wagmi\";\n\ntype AccountButtonWrapperProps = {\n content: ReactNode;\n hasPopover: boolean;\n icon?: string | ReactNode;\n onClick?: () => void;\n};\n\nconst AccountButtonWrapper = ({\n content,\n hasPopover = false,\n icon,\n onClick,\n}: AccountButtonWrapperProps) => {\n const { above } = useViewport();\n const theme = useTheme();\n\n return (\n \n \n <>\n {icon}\n {above(\"medium\") && (\n \n \n {content}\n \n {hasPopover && (\n \n )}\n \n )}\n \n \n \n );\n};\n\ntype AccountButtonProps = {\n onClick: () => void;\n};\n\nexport const AccountButton = ({ onClick }: AccountButtonProps) => {\n const theme = useTheme();\n const [{ data: accountData }] = useAccount({ fetchEns: true });\n const [{ data: networkData }] = useNetwork();\n const { address, ens } = accountData || {};\n\n return (\n \n \n \n \n }\n content={\n <>\n {!!address && (\n \n \n {ens?.name || shortenAddress(address ?? \"\")}\n \n \n )}\n \n Connected to {networkData.chain?.name}\n \n \n }\n />\n );\n};\n\nconst AccountButtonBase = styled(ButtonBase)`\n height: 100%;\n padding: ${0.2 * GU}px;\n ${(props) =>\n props.onClick !== undefined\n ? `&:active { background: ${props.theme.surfacePressed}; }`\n : `cursor: auto;`};\n`;\n\nconst InnerContainer = styled.div`\n display: flex;\n align-items: center;\n text-align: left;\n padding: 0 ${1 * GU}px;\n`;\n\nconst ConnectedCircle = styled.div`\n position: absolute;\n bottom: -3px;\n right: -3px;\n width: 10px;\n height: 10px;\n background: ${(props) => props.theme.positive};\n border: 2px solid ${(props) => props.theme.surface};\n border-radius: 50%;\n`;\n\nconst LabelWrapper = styled.div`\n margin-bottom: -5px;\n\n ${textStyle(\"body2\")};\n`;\n\nconst LabelInnerWrapper = styled.div`\n overflow: hidden;\n max-width: ${16 * GU}px;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n", "import { GU, Popover, springs } from \"@1hive/1hive-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { a, Spring, useTransition } from \"@react-spring/web\";\nimport styled from \"styled-components\";\n\ntype PopoverProps = {\n children: ReactNode;\n direction: -1 | 1;\n heading?: string;\n onClose: () => void;\n opener: ReactNode;\n screenId: number | string;\n visible: boolean;\n width: number | string;\n};\n\nexport const HeaderPopover = ({\n children,\n direction,\n onClose,\n opener,\n screenId,\n visible,\n width,\n}: PopoverProps) => {\n const [height, setHeight] = useState(30 * GU);\n\n // Prevents to lose the focus on the popover when a screen leaves while an\n // element inside is focused (e.g. when clicking on the \u201Cdisconnect\u201D button).\n const popoverFocusElement = useRef();\n\n const popupTransition = useTransition(screenId, {\n config: springs.smooth,\n keys: screenId,\n from: {\n opacity: 0,\n transform: `translate3d(${10 * GU * direction}px, 0, 0)`,\n },\n enter: {\n opacity: 1,\n transform: `translate3d(0, 0, 0)`,\n },\n });\n\n useEffect(() => {\n if (popoverFocusElement.current) {\n popoverFocusElement.current.focus();\n }\n }, [screenId]);\n\n return (\n \n \n \n {({ height }) => (\n \n {popupTransition(({ opacity, transform }) => (\n {\n if (elt) {\n setHeight(elt.clientHeight);\n }\n }}\n style={{\n opacity,\n transform,\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n }}\n >\n {children}\n \n ))}\n \n )}\n \n \n \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst StyledPopover = styled(Popover)`\n margin-top: 3px;\n width: ${(props) => `${props.width}px`};\n`;\n", "export { ScreenPromptedAction } from \"./ScreenPromptedAction\";\nexport { ScreenConnected } from \"./ScreenConnected\";\nexport { ScreenConnecting } from \"./ScreenConnecting\";\nexport { ScreenError } from \"./ScreenError\";\nexport { ScreenWallets } from \"./ScreenWallets\";\n", "import { GU, textStyle } from \"@1hive/1hive-ui/\";\nimport styled from \"styled-components\";\n\nimport { LoadingRing } from \"../LoadingRing\";\nimport { useAccounModuleStore } from \"../use-account-module-store\";\n\nexport const ScreenPromptedAction = () => {\n const { promptedAction } = useAccounModuleStore();\n\n if (!promptedAction) {\n return null;\n }\n\n const { title, subtitle, image } = promptedAction;\n\n return (\n \n \n \n \n {image && }\n \n {title}\n {subtitle}\n \n \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n height: 100%;\n`;\n\nconst ActionContainer = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n`;\n\nconst SpinnerContainer = styled.div`\n position: relative;\n width: ${10.5 * GU}px;\n height: ${10.5 * GU}px;\n`;\n\nconst ActionImage = styled.div<{ src: string }>`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: 50% 50% / auto ${5 * GU}px no-repeat url(${(props) => props.src});\n`;\n\nconst Title = styled.h1`\n padding-top: ${2 * GU}px;\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n\nconst Subtitle = styled.p`\n width: ${36 * GU}px;\n margin-top: ${1 * GU}px;\n color: ${(props) => props.theme.surfaceContentSecondary};\n`;\n", "import styled, { keyframes } from \"styled-components\";\n\nimport loadingRing from \"./assets/loading-ring.svg\";\n\nconst spin = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport const LoadingRing = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: url(${loadingRing}) no-repeat 0 0;\n animation-duration: 1s;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n animation-name: ${spin};\n // prevents flickering on Firefox\n backface-visibility: hidden;\n`;\n", "import {\n Button,\n ButtonBase,\n GU,\n IconCheck,\n IconCopy,\n IdentityBadge,\n RADIUS,\n textStyle,\n useTheme,\n} from \"@1hive/1hive-ui\";\nimport { useCallback, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { useAccount, useNetwork } from \"wagmi\";\n\nimport { useCopyToClipboard } from \"~/hooks/useCopyToClipboard\";\nimport { getWalletIconPath } from \"../helpers\";\nimport { ScreenType, actions } from \"../use-account-module-store\";\n\ntype ScreenConnectedProps = {\n onBack(): void;\n};\n\nexport const ScreenConnected = ({ onBack }: ScreenConnectedProps) => {\n const theme = useTheme();\n const copy = useCopyToClipboard();\n const [{ data: networkData }] = useNetwork();\n const [{ data: accountData }] = useAccount();\n\n const chain = networkData.chain;\n const wallet = accountData?.connector;\n const accountAddress = accountData?.address;\n\n useEffect(() => {\n if (networkData.chain?.unsupported || !accountAddress) {\n actions.goToScreen(ScreenType.Error);\n }\n }, [networkData.chain, accountAddress]);\n\n const handleCopyAddress = useCallback(\n () => copy(accountAddress),\n [accountAddress, copy]\n );\n\n return (\n \n Active Wallet\n
    \n \n \n {wallet?.id === \"unknown\" ? \"Wallet\" : wallet?.name}\n
    \n
    \n \n \n \n \n
    \n \n
    \n \n \n \n {`Connected to ${chain ? chain.name : \"Unknown\"} Network`}\n \n \n
    \n \n \n );\n};\n\nconst Title = styled.h4`\n color: ${(props) => props.theme.contentSecondary};\n margin-bottom: ${2 * GU}px, ${textStyle(\"label2\")};\n ${textStyle(\"label2\")};\n`;\n\nconst WalletIcon = styled.img<{ size: string | number }>`\n ${({ size }) => size && `width: ${size}px; height: ${size}px;`};\n margin-right: ${0.5 * GU}px;\n transform: translateY(-2px);\n`;\n\nconst CopyButton = styled(ButtonBase)`\n display: flex;\n align-items: center;\n justify-self: flex-end;\n padding: ${0.5 * GU}px;\n &:active {\n background: ${(props) => props.theme.surfacePressed};\n }\n`;\n\nconst NetworkInfo = styled.div`\n display: flex;\n align-items: center;\n color: ${(props) => props.theme.positive};\n ${textStyle(\"label2\")};\n`;\n", "import { useCallback } from \"react\"\nimport { useToast } from \"@1hive/1hive-ui\"\nimport { writeText as copy } from \"clipboard-polyfill\"\n\nexport function useCopyToClipboard() {\n const toast = useToast()\n\n return useCallback(\n (text, confirmationMessage = \"Copied\") => {\n copy(text)\n if (confirmationMessage) {\n toast(confirmationMessage)\n }\n },\n [toast]\n )\n}\n", "import { GU, textStyle, useTheme } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\n\nimport { getWalletIconPath } from \"../helpers\";\nimport { LoadingRing } from \"../LoadingRing\";\nimport { useAccounModuleStore } from \"../use-account-module-store\";\n\nexport const ScreenConnecting = () => {\n const theme = useTheme();\n const { selectedConnector: wallet } = useAccounModuleStore();\n\n if (!wallet) {\n return null;\n }\n\n const walletIcon = getWalletIconPath(wallet.id);\n\n return (\n \n \n \n {walletIcon && }\n \n Connecting to {wallet.name}\n \n Log into {wallet.name || \"Unknown\"}. You may be temporarily redirected\n to a new screen.\n

    \n
    \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n height: 100%;\n text-align: center;\n`;\n\nconst SpinnerContainer = styled.div`\n position: relative;\n width: ${10.5 * GU}px;\n height: ${10.5 * GU}px;\n`;\n\nconst SpinnerImage = styled.div<{ src: string }>`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: 50% 50% / auto ${5 * GU}px no-repeat url(${(props) => props.src});\n`;\n\nconst Title = styled.h1`\n padding-top: ${2 * GU}px;\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n", "import {\n Button,\n GU,\n IconError,\n Link,\n textStyle,\n useTheme,\n} from \"@1hive/1hive-ui\";\nimport { useMemo } from \"react\";\nimport styled from \"styled-components\";\nimport {\n ChainNotConfiguredError,\n useAccount,\n useConnect,\n useNetwork,\n} from \"wagmi\";\nimport type { Chain } from \"wagmi\";\n\nimport { getNetworkLogo } from \"~/utils/client/icons.client\";\nimport { getNetworkError } from \"../helpers\";\nimport type { PromptedAction } from \"../use-account-module-store\";\n\nconst buildSwitchAction = (chain: Chain): PromptedAction => ({\n title: `Connecting to ${chain.name} network`,\n subtitle: `Creating and/or switching to the ${chain.name} network (id: ${chain.id}) in your wallet. You may be temporarily redirected to a new screen.`,\n image: getNetworkLogo(chain.id),\n});\n\ntype ScreenErrorProps = {\n onSwitchNetwork(switchAction: PromptedAction, chain: Chain): void;\n onBack(): void;\n};\n\nexport const ScreenError = ({ onSwitchNetwork, onBack }: ScreenErrorProps) => {\n const theme = useTheme();\n const [{ data: networkData, error: networkError }, switchNetwork] =\n useNetwork();\n const [{ error: connectError }] = useConnect();\n const [{ error: accountError }] = useAccount();\n\n const error =\n getNetworkError(networkError, networkData) || connectError || accountError;\n\n const [title, secondary] = useMemo(() => {\n if (\n error instanceof ChainNotConfiguredError ||\n networkData.chain?.unsupported\n ) {\n return [\n \"Wrong network\",\n \n Please select one of these networks:{\" \"}\n {networkData.chains.map((chain, index, chains) =>\n switchNetwork ? (\n {\n onSwitchNetwork(buildSwitchAction(chain), chain);\n }}\n >\n {`${chain.name}${index < chains.length - 1 ? \", \" : \"\"}`}\n \n ) : (\n <>{chain.name}\n )\n )}\n ,\n ];\n }\n\n return [\n \"Failed to enable your account\",\n \"You can try another Ethereum wallet.\",\n ];\n }, [error, networkData, onSwitchNetwork, switchNetwork]);\n\n return (\n \n \n
    \n \n
    \n {title}\n \n {secondary}\n

    \n
    \n \n \n \n
    \n );\n};\n\nconst Container = styled.section`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: ${2 * GU}px;\n padding-top: ${1 * GU}px;\n height: 100%;\n`;\n\nconst ErrorContainer = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n`;\n\nconst Title = styled.h1`\n font-weight: 600;\n ${textStyle(\"body1\")};\n`;\n\nconst ButtonContainer = styled.div`\n flex-grow: 0;\n margin-top: ${1 * GU}px;\n width: 100%;\n`;\n", "import { ButtonBase, GU, Link, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { useConnect } from \"wagmi\";\nimport type { Connector } from \"wagmi\";\n\nimport { getWalletIconPath } from \"../helpers\";\n\nexport const ScreenWallets = ({\n onConnect,\n}: {\n onConnect(connector: Connector): void;\n}) => {\n const [{ data: connectData }] = useConnect();\n\n return (\n
    \n Ethereum Wallets\n \n \n {connectData.connectors.map((connector) => {\n return (\n onConnect(connector)}\n />\n );\n })}\n \n \n \n What is a wallet?\n \n \n \n
    \n );\n};\n\ntype WalletButtonProps = {\n icon?: string;\n name?: string;\n ready?: boolean;\n onClick: (connector: Connector) => void;\n};\n\nfunction WalletButton({\n icon,\n name,\n ready = true,\n onClick,\n}: WalletButtonProps): JSX.Element {\n return (\n \n {name && (\n <>\n {icon && (\n \"\"\n )}\n {name}\n {!ready && (Unsupported)}\n \n )}\n \n );\n}\n\nconst MainHeader = styled.h4`\n padding-top: ${2 * GU}px;\n padding-left: ${2 * GU}px;\n color: ${(props) => props.theme.contentSecondary};\n margin-bottom: ${2 * GU}px;\n ${textStyle(\"label2\")};\n`;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n padding: ${2 * GU}px ${2 * GU}px 0;\n`;\n\nconst WalletButtonsContainer = styled.div`\n display: grid;\n grid-gap: ${1.5 * GU}px;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, 1fr);\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n justify-content: center;\n margin-top: ${2 * GU}px;\n margin-bottom: ${1 * GU}px;\n`;\n\nconst WalletButtonBase = styled(ButtonBase)`\n position: relative;\n opacity: ${(props) => (props.ready ? 1 : 0.6)};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: ${12 * GU}px;\n background: ${(props) => props.surface};\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);\n border-radius: ${RADIUS}px;\n &:active {\n top: 1px;\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n }\n`;\n\nconst WalletName = styled.div`\n margin-top: ${1 * GU}px;\n ${textStyle(\"body1\")};\n`;\n\nconst Subtitle = styled.div`\n margin-top: ${-0.5 * GU}px;\n ${textStyle(\"body4\")};\n`;\n", "import { GU, textStyle } from \"@1hive/1hive-ui\";\nimport { NavLink } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { CompactMenu } from \"./CompactMenu\";\n\nexport type NavigationItem = {\n icon: string;\n label: string;\n to: string;\n};\n\nconst navigationItem: NavigationItem[] = [\n { icon: \"\", label: \"Home\", to: \"/home\" },\n { icon: \"\", label: \"All Entries\", to: \"/entries\" },\n { icon: \"\", label: \"Guidelines\", to: \"/guidelines\" },\n];\n\nexport const NavSection = ({ compact }: { compact: boolean }) => {\n return compact ? (\n \n ) : (\n \n {navigationItem.map(({ label, to }) => (\n
  • \n {label === \"Home\" ? \"Rosette\" : label}\n
  • \n ))}\n
    \n );\n};\n\nconst NavLinksList = styled.ul`\n display: flex;\n align-items: center;\n gap: ${6 * GU}px;\n list-style: none;\n\n li:first-child {\n ${textStyle(\"title2\")};\n }\n\n > li {\n transition: all 200ms ease-out;\n &:hover {\n color: ${(props) => props.theme.surfaceHighlight};\n }\n }\n\n li > * {\n text-decoration: none;\n }\n`;\n", "import { ButtonBase, GU, IconMenu, useViewport } from \"@1hive/1hive-ui\";\nimport { useState } from \"react\";\nimport { useLocation } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport type { NavigationItem } from \"..\";\nimport { MenuItem } from \"./MenuItem\";\nimport { Sidebar } from \"./Sidebar\";\n\nconst MenuButton = ({ onClick }: { onClick(): void }) => (\n \n \n \n \n \n);\n\nconst MIN_SIDEBAR_WIDTH = 240;\n\nexport const CompactMenu = ({ items }: { items: NavigationItem[] }) => {\n const { pathname } = useLocation();\n const { width } = useViewport();\n const [displaySidebar, setDisplaySidebar] = useState(false);\n\n const sidebarWidth = Math.min(MIN_SIDEBAR_WIDTH, width * 0.6);\n\n const toggleSidebar = () => setDisplaySidebar((prev) => !prev);\n\n return (\n
    \n \n \n \n {items.map((i) => (\n
  • \n \n
  • \n ))}\n
    \n \n
    \n );\n};\n\nconst ButtonContainer = styled.div`\n width: ${8 * GU}px;\n height: 100%;\n border-right: 1px solid ${({ theme }) => theme.border};\n display: flex;\n align-self: stretch;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledMenuIcon = styled(IconMenu)`\n width: ${4 * GU}px;\n height: ${4 * GU}px;\n`;\n\nconst NavContainer = styled.ul`\n list-style: none;\n`;\n", "import { GU, useTheme } from \"@1hive/1hive-ui\";\nimport { Link } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport type { NavigationItem } from \"..\";\n\ntype MenuItemProps = {\n item: NavigationItem;\n active?: boolean;\n onClick(): void;\n};\n\nexport const MenuItem = ({\n item: { icon, label, to },\n active = false,\n onClick,\n}: MenuItemProps) => {\n const theme = useTheme();\n\n return (\n
    \n {active && }\n \n \n {icon && \"\"}\n {label}\n \n \n
    \n );\n};\n\nconst ActiveBar = styled.div`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 4px;\n background: #7c5fe0;\n`;\n\nconst InnerNavLink = styled.div`\n display: flex;\n align-items: center;\n gap: ${1 * GU}px;\n padding: ${1.5 * GU}px;\n\n & img {\n width: 20px;\n height: 20px;\n }\n\n & > span {\n color: ${({ theme }) => theme.content};\n }\n`;\n", "import { RootPortal } from \"@1hive/1hive-ui\";\nimport type { ReactNode } from \"react\";\nimport { a, useTransition } from \"@react-spring/web\";\nimport styled from \"styled-components\";\n\ntype SidebarProps = {\n children: ReactNode;\n show: boolean;\n width: number;\n onToggle(): void;\n};\n\nexport const Sidebar = ({ children, show, width, onToggle }: SidebarProps) => {\n const sidebarTransition = useTransition(show, {\n from: {\n marginLeft: `-${width}px`,\n opacity: 0,\n },\n enter: {\n marginLeft: \"0\",\n opacity: 1,\n },\n leave: {\n marginLeft: `-${width}px`,\n opacity: 0,\n },\n unique: true,\n config: { mass: 5, tension: 1500, friction: 200 },\n delay: 100,\n });\n\n return sidebarTransition((styles, show) => {\n return (\n show && (\n \n \n {children}\n \n \n \n )\n );\n });\n};\n\nconst AnimatedSidebar = styled(a.div)<{ width: number; $zIndex: number }>`\n height: 100vh;\n position: absolute;\n border-right: 1px solid ${({ theme }) => theme.border};\n background-color: ${({ theme }) => theme.background};\n ${({ width, $zIndex }) => `\n z-index: ${$zIndex};\n width: ${width}px;\n top: 0;\n bottom: 0;\n left: 0;\n `};\n`;\n\nconst OpaqueBackground = styled(a.div)<{ $offset: number; $show: boolean }>`\n position: absolute;\n top: 0;\n right: 0;\n left: ${({ $offset }) => $offset}px;\n z-index: 1;\n height: 100%;\n background: ${({ theme }) => theme.overlay.alpha(0.7)};\n pointer-events: ${({ $show }) => ($show ? \"auto\" : \"none\")};\n`;\n", "import type { LoaderFunction } from \"@remix-run/node\";\nimport { getSanitizedEntriesData } from \"~/utils/server/entries-data.server\";\nimport { fetchContractFnEntries } from \"~/utils/server/subgraph.server\";\n\nexport const loader: LoaderFunction = async ({ request }) => {\n const { searchParams } = new URL(request.url);\n const bytecodeHash = searchParams.get(\"bytecodeHash\");\n\n if (!bytecodeHash) {\n throw new Response(\"Expected contract param\", {\n status: 400,\n statusText: \"Expected search params\",\n });\n }\n\n const subgraphFnEntriesData = await fetchContractFnEntries(bytecodeHash);\n\n return getSanitizedEntriesData(subgraphFnEntriesData);\n};\n", "import type { FnEntry } from \"~/types\";\nimport { ipfsResolver } from \"~/utils/ipfs\";\n\nconst ipfs = ipfsResolver();\n\nexport const getSanitizedEntriesData = async (\n fns: FnEntry[]\n): Promise => {\n const responses = (await Promise.allSettled(\n fns.filter((f) => !f.notice).map((f) => fetchFallbackData(f))\n )) as PromiseSettledResult[];\n\n const fulfilledResponses = responses.filter(\n (r) => r.status === \"fulfilled\"\n ) as PromiseFulfilledResult[];\n\n const fnsWithFallbackData = fulfilledResponses.map((r) => r.value);\n\n return fns.map((f) => {\n const fnFallback = fnsWithFallbackData.find(\n ({ sigHash }) => f.sigHash == sigHash\n );\n if (fnFallback) {\n return fnFallback;\n }\n return f;\n });\n};\n\nexport const fetchFallbackData = async (f: FnEntry): Promise => {\n // fallback to fetch data from IPFS\n const data = await ipfs.json(f.cid);\n\n return {\n ...f,\n ...data,\n };\n};\n", "import { createCacheStore } from \"./cache-store\";\n\nexport type IpfsResolver = {\n url: (cid: string, path?: string) => Promise;\n json: (cid: string, path?: string) => Promise;\n};\n\nexport const DEFAULT_IPFS_CACHED_ITEMS = 100;\nexport const DEFAULT_IPFS_URL = \"https://ipfs.io/ipfs/{cid}{path}\";\n\nexport function ipfsResolver(\n urlTemplate: string = DEFAULT_IPFS_URL,\n cache: number = DEFAULT_IPFS_CACHED_ITEMS\n): IpfsResolver {\n const cacheStore = cache === 0 ? null : createCacheStore(cache);\n\n return {\n async json(cid: string, path?): Promise {\n const url = await this.url(cid, path);\n\n const fetchJson = async () => {\n let response;\n let data;\n\n try {\n response = await fetch(url);\n } catch (_) {\n throw new Error(`Couldn\u2019t fetch ${url}.`);\n }\n\n try {\n data = await response.json();\n } catch (_) {\n throw new Error(`Couldn\u2019t parse the result of ${url} as JSON.`);\n }\n\n return data;\n };\n\n return cacheStore?.get(url, fetchJson) || fetchJson();\n },\n async url(cid: string, path?): Promise {\n const url = urlTemplate.replace(/\\{cid\\}/, cid);\n if (!path) {\n return url.replace(/\\{path\\}/, \"\");\n }\n if (!path.startsWith(\"/\")) {\n path = `/${path}`;\n }\n return url.replace(/\\{path\\}/, path);\n },\n };\n}\n", "type CacheStoreCallback = () => Promise;\n\nexport function createCacheStore(\n limit = 10\n): {\n cachedIndex: (id: string) => number;\n clear: () => void;\n get: (id: string, callback: CacheStoreCallback) => Promise;\n touch: (index: number) => void;\n} {\n const cache: [string, T][] = Array(limit);\n\n return {\n clear(): void {\n cache.length = 0;\n },\n cachedIndex(id: string): number {\n return cache.findIndex((entry) => id === entry?.[0]);\n },\n touch(index: number): void {\n cache.unshift(cache.splice(index, 1)[0]);\n },\n async get(id: string, callback: CacheStoreCallback): Promise {\n let cachedIndex = this.cachedIndex(id);\n if (cachedIndex > -1) {\n this.touch(cachedIndex);\n return cache[0][1];\n }\n\n const data = await callback();\n\n // Prevents to cache the same value multiple times, in case the same\n // value gets loaded several times in parallel.\n cachedIndex = this.cachedIndex(id);\n if (cachedIndex > -1) {\n this.touch(cachedIndex);\n return cache[0][1];\n }\n\n cache.unshift([id, data]);\n cache.length = limit;\n\n return data;\n },\n };\n}\n", "import type { FnEntry } from \"~/types\";\nimport { FnDescriptionStatus } from \"~/types\";\n\ntype FunctionResult = {\n id: string;\n abi: string;\n cid: string;\n contract: {\n scope: string;\n };\n notice: string;\n sigHash: string;\n submitter: {\n address: string;\n };\n disputed: boolean;\n guideline: {\n cooldownPeriod: number;\n };\n upsertAt: number;\n};\n\ntype QueryContractResult = {\n data: {\n contract: {\n functions: FunctionResult[];\n };\n };\n errors?: { message: string }[];\n};\n\ntype QueryFnsResult = {\n data: {\n functions: FunctionResult[];\n };\n errors?: { message: string }[];\n};\n\ntype QueryFnResult = {\n data: {\n function: FunctionResult;\n };\n errors?: { message: string }[];\n};\n\nconst gql = String.raw;\n\nconst fetchFromGraphQL = async (query: string) => {\n if (!process.env.SUBGRAPH_URI) {\n throw new Error(\"SUBGRAPH_URI is required\");\n }\n\n const body: any = { query };\n\n return fetch(process.env.SUBGRAPH_URI, {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n};\n\nconst getEntryStatus = (fnResult: FunctionResult): FnDescriptionStatus => {\n const date = Date.now() / 1000;\n\n if (fnResult.disputed) {\n return FnDescriptionStatus.Challenged;\n }\n\n const timeSince = fnResult.upsertAt + fnResult.guideline.cooldownPeriod;\n\n if (timeSince > date) {\n return FnDescriptionStatus.Added;\n } else {\n return FnDescriptionStatus.Pending;\n }\n};\n\nconst parseFnResult = (fnResult: FunctionResult): FnEntry => {\n const { id, abi, cid, contract, notice, sigHash, submitter, upsertAt } =\n fnResult;\n\n return {\n id,\n abi,\n cid,\n contract: contract.scope,\n notice,\n sigHash,\n status: getEntryStatus(fnResult),\n submitter: submitter.address,\n upsertAt,\n };\n};\n\nexport const fetchContractFnEntries = async (\n bytecodeHash: string\n): Promise => {\n const contractId = `${process.env.ROSETTE_STONE_ADDRESS}-${bytecodeHash}`;\n\n try {\n const rawResponse = await fetchFromGraphQL(\n gql`\n {\n contract(id: \"${contractId}\") {\n functions {\n id\n cid\n contract {\n scope\n }\n notice\n sigHash\n submitter {\n address\n }\n guideline {\n cooldownPeriod\n }\n upsertAt\n }\n }\n }\n `\n );\n\n const result = (await rawResponse.json()) as QueryContractResult;\n\n if (result.errors?.length) {\n const err = result.errors[0];\n console.error(err);\n throw new Error(err.message);\n }\n\n if (!result.data.contract) {\n return [];\n }\n\n return result.data.contract.functions.map(parseFnResult);\n } catch (err) {\n throw new Response(\n \"There was an error fetching the contract's function descriptions\",\n { status: 500, statusText: \"Subgraph Error\" }\n );\n }\n};\n\nexport const fetchFnEntries = async (): Promise => {\n try {\n const rawResponse = await fetchFromGraphQL(\n gql`\n {\n functions {\n id\n abi\n contract {\n scope\n }\n cid\n notice\n sigHash\n submitter {\n address\n }\n guideline {\n cooldownPeriod\n }\n upsertAt\n }\n }\n `\n );\n\n const result = (await rawResponse.json()) as QueryFnsResult;\n\n if (result.errors?.length) {\n const err = result.errors[0];\n console.error(err);\n throw new Error(err.message);\n }\n\n if (!result.data.functions) {\n return [];\n }\n\n return result.data.functions.map(parseFnResult);\n } catch (err) {\n throw new Response(\n \"There was an error fetching the contract's function descriptions\",\n { status: 500, statusText: \"Subgraph Error\" }\n );\n }\n};\n\nexport const fetchFnEntry = async (\n entryId: string\n): Promise => {\n try {\n const rawResponse = await fetchFromGraphQL(\n gql`\n {\n function(id: \"${entryId}\") {\n id\n abi\n contract {\n scope\n }\n cid\n notice\n sigHash\n submitter {\n address\n }\n guideline {\n cooldownPeriod\n }\n upsertAt\n }\n }\n `\n );\n\n const result = (await rawResponse.json()) as QueryFnResult;\n\n if (result.errors?.length) {\n const err = result.errors[0];\n console.error(err);\n throw new Error(err.message);\n }\n\n if (!result.data.function) {\n return undefined;\n }\n\n return parseFnResult(result.data.function);\n } catch (err) {\n throw new Response(\n \"There was an error fetching the contract's function descriptions\",\n { status: 500, statusText: \"Subgraph Error\" }\n );\n }\n};\n", "import type { ActionFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport { ipfs } from \"~/utils/server/ipfs.server\";\n\ntype IPFSResponseData = Record;\n\nexport type IPFSFnDescription = {\n description: string;\n minimalName: string;\n sigHash: string;\n};\n\nconst FN_DESCRIPTIONS_KEY = \"fnDescriptions\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const data = await request.formData();\n\n if (!data.has(FN_DESCRIPTIONS_KEY)) {\n return new Response(\"Function descriptions not provided\", { status: 400 });\n }\n\n const fnDescriptionsString = data.get(FN_DESCRIPTIONS_KEY)?.toString() || \"\";\n const fnDescriptions = JSON.parse(\n fnDescriptionsString\n ) as IPFSFnDescription[];\n\n const uploadRequests = fnDescriptions.map(({ description, minimalName }) => {\n const descriptionJson = JSON.stringify({\n abi: minimalName,\n notice: description,\n });\n\n return ipfs.add(descriptionJson);\n });\n\n try {\n const addResults = await Promise.all(uploadRequests);\n\n const responseData = addResults.reduce((data, addResult, index) => {\n const fnDescription = fnDescriptions[index];\n data[fnDescription.sigHash] = addResult.cid.toString();\n return data;\n }, {} as IPFSResponseData);\n\n return json(responseData);\n } catch (err) {\n console.error(err);\n throw new Response(\n \"An error occured when uploading function descriptions\",\n { status: 500 }\n );\n }\n};\n", "import type { IPFSHTTPClient, Options } from \"ipfs-http-client\";\nimport { create } from \"ipfs-http-client\";\n\ndeclare global {\n var __ipfs: IPFSHTTPClient | undefined;\n}\n\nlet ipfs: IPFSHTTPClient;\n\nconst INFURA_IPFS_API_KEY = process.env.INFURA_IPFS_API_KEY;\n\nif (!INFURA_IPFS_API_KEY) {\n throw new Error(\"INFURA_IPFS_API_KEY not found\");\n}\n\nconst codifiedBasicAuth = Buffer.from(INFURA_IPFS_API_KEY).toString(\"base64\");\n\nconst config: Options = {\n url: \"https://ipfs.infura.io:5001\",\n headers: { Authorization: `Basic ${codifiedBasicAuth}` },\n};\n\nif (process.env.NODE_ENV === \"production\") {\n ipfs = create(config);\n} else {\n if (!global.__ipfs) {\n global.__ipfs = create(config);\n }\n ipfs = global.__ipfs;\n}\n\nexport { ipfs };\n", "import { utils } from \"ethers\";\nimport { useEffect, useState } from \"react\";\nimport { json } from \"@remix-run/node\";\nimport type { LoaderFunction } from \"@remix-run/node\";\nimport { useFetcher, useLoaderData } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractDescriptorScreen } from \"~/components/ContractDescriptorScreen\";\nimport { ContractSelectorScreen } from \"~/components/ContractSelectorScreen\";\nimport { SmoothDisplayContainer } from \"~/components/SmoothDisplayContainer\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { fetchContracts } from \"~/utils/server/contract-data.server\";\n\ntype LoaderData = {\n contractAddress: string;\n contracts: AggregateContract[];\n};\n\nexport const loader: LoaderFunction = async ({ request }) => {\n const { searchParams } = new URL(request.url);\n const contractAddress = searchParams.get(\"contract\");\n\n if (!contractAddress) {\n throw new Response(\"Expected contract param\", {\n status: 400,\n statusText: \"Expected search params\",\n });\n }\n\n const contracts = await fetchContracts(contractAddress);\n\n return json({\n contracts,\n contractAddress,\n });\n};\n\nexport default function Describe() {\n const { contracts, contractAddress } = useLoaderData();\n const contractDescriptionsFetcher = useFetcher();\n const [selectedContractData, setSelectedContractData] =\n useState();\n\n useEffect(() => {\n if (\n !selectedContractData?.bytecode ||\n contractDescriptionsFetcher.type !== \"init\"\n ) {\n return;\n }\n\n contractDescriptionsFetcher.load(\n `/contract-descriptions-search?bytecodeHash=${utils.id(\n selectedContractData.bytecode\n )}`\n );\n }, [selectedContractData?.bytecode, contractDescriptionsFetcher]);\n\n return (\n \n \n {selectedContractData && contractDescriptionsFetcher.type === \"done\" ? (\n \n \n \n ) : (\n \n )}\n \n \n );\n}\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: start;\n height: 100%;\n width: 100%;\n`;\n", "import type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { a } from \"@react-spring/web\";\nimport { useOutletContext } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { useAppReady } from \"~/providers/AppReady\";\nimport type { AppContext } from \"~/App\";\n\ntype AppScreenProps = {\n children: ReactNode;\n hideBottomBar?: boolean;\n hideTopBar?: boolean;\n};\n\nexport const AppScreen = ({\n children,\n hideBottomBar = false,\n hideTopBar = false,\n}: AppScreenProps) => {\n const { appReadyTransition } = useAppReady();\n const { displayBottomBar, displayTopBar } = useOutletContext();\n\n useEffect(() => {\n displayBottomBar(!hideBottomBar);\n\n displayTopBar(!hideTopBar);\n }, [hideBottomBar, hideTopBar, displayBottomBar, displayTopBar]);\n\n return appReadyTransition(\n ({ progress, screenTransform }, ready) =>\n ready && (\n \n {children}\n \n )\n );\n};\n\nconst AnimatedContainer = styled(a.div)`\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n width: 100%;\n margin: 0 auto;\n`;\n\nconst InnerContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n`;\n", "import { useCallback, useEffect } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport { utils } from \"ethers\";\nimport { Button, GU, useViewport } from \"@1hive/1hive-ui\";\nimport { useFetcher } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport scrollIcon from \"./assets/scroll-icon.svg\";\nimport handIcon from \"./assets/hand-icon.svg\";\nimport { Pagination } from \"./Pagination\";\nimport {\n actions,\n selectors,\n useContractDescriptorStore,\n} from \"./use-contract-descriptor-store\";\nimport type {\n Function,\n UserFnDescription,\n} from \"./use-contract-descriptor-store\";\nimport type { ContractData, FnEntry } from \"~/types\";\nimport useRosetteActions from \"./useRosetteActions\";\nimport { HelperFunctionsPicker } from \"./HelperFunctionsPicker\";\nimport { FnDescriptorsCarousel } from \"./FnDescriptorsCarousel\";\nimport type { IPFSFnDescription } from \"~/routes/fn-descriptions-upload\";\nimport debounce from \"lodash.debounce\";\n\nconst FN_DESCRIPTOR_HEIGHT = \"527px\";\n\ntype ContractDescriptorScreenProps = {\n contractAddress: string;\n contractData: ContractData;\n currentFnEntries: FnEntry[];\n};\n\nconst buildUploadDataJSON = (\n fnDescriptorEntries: Function[],\n userFnDescriptions: Record\n): IPFSFnDescription[] => {\n return Object.values(userFnDescriptions).map(\n ({ description, sigHash }): IPFSFnDescription => {\n const minimalName = fnDescriptorEntries.find(\n (e) => e.sigHash === sigHash\n )?.minimalName;\n return {\n description,\n minimalName: minimalName ?? \"\",\n sigHash,\n };\n }\n );\n};\n\nexport const ContractDescriptorScreen = ({\n contractAddress,\n contractData: { abi, bytecode },\n currentFnEntries,\n}: ContractDescriptorScreenProps) => {\n const { below } = useViewport();\n const [{ data: accountData }] = useAccount();\n const { fnSelected, fnDescriptorEntries, userFnDescriptions } =\n useContractDescriptorStore();\n const fnDescriptionsCounter = selectors.fnDescriptionsCounter();\n const compactMode = below(\"large\");\n\n // Submit entries handler\n const actionFetcher = useFetcher();\n const { upsertEntries } = useRosetteActions();\n\n const handleSubmit = useCallback(\n (event) => {\n event.preventDefault();\n\n const fnDescriptionsJSON = buildUploadDataJSON(\n fnDescriptorEntries,\n userFnDescriptions\n );\n\n actionFetcher.submit(\n {\n fnDescriptions: JSON.stringify(fnDescriptionsJSON),\n },\n {\n method: \"post\",\n action: \"/fn-descriptions-upload\",\n }\n );\n },\n [actionFetcher, fnDescriptorEntries, userFnDescriptions]\n );\n\n useEffect(() => {\n const submitEntries = async () => {\n try {\n const sigs = Object.values(userFnDescriptions).map(\n ({ sigHash }) => sigHash\n );\n const scopes = new Array(sigs.length).fill(utils.id(bytecode));\n const cids: string[] = Object.values(actionFetcher.data);\n\n await upsertEntries(scopes, sigs, cids);\n window.alert(\"Entries submitted!\"); // TODO: Use tx feedback implementation\n\n // Should we redirect to the enties page?\n } catch (err) {\n console.error(`Error submitting entries: ${err}`);\n }\n };\n\n if (actionFetcher.data) {\n submitEntries();\n }\n }, [\n actionFetcher.data,\n bytecode,\n contractAddress,\n upsertEntries,\n userFnDescriptions,\n ]);\n\n useEffect(() => {\n if (abi && currentFnEntries) {\n actions.setUpFnDescriptorEntries(abi, currentFnEntries);\n }\n }, [abi, currentFnEntries]);\n\n useEffect(() => {\n const onWheel = (e: WheelEvent) => {\n if (e.deltaY < 0) {\n actions.goToPrevFn();\n } else {\n actions.goToNextFn();\n }\n };\n\n const debouncedOnWheel = debounce(onWheel, 100);\n\n window.addEventListener(\"wheel\", debouncedOnWheel);\n\n return () => {\n window.removeEventListener(\"wheel\", debouncedOnWheel);\n };\n }, []);\n\n return (\n
    \n \n FILTERS\n {fnDescriptorEntries.length > 1 && (\n \n \n \n \n )}\n \n \n \n \n \n \n \n \n \n \n
    \n );\n};\n\nconst Layout = styled.div<{ compactMode: boolean }>`\n display: grid;\n height: 100%;\n width: 100%;\n padding: ${4 * GU}px;\n grid-gap: ${1 * GU}px;\n\n ${({ compactMode }) => `\n ${FiltersContainer} {\n grid-area: filters;\n }\n\n ${PaginationContainer} {\n grid-area: pagination;\n ${\n compactMode\n ? `\n flex-direction: column-reverse;\n `\n : `\n justify-self: start;\n `\n }\n }\n\n ${CarouselContainer} {\n grid-area: carousel;\n }\n\n ${FunctionsPickerContainer} {\n grid-area: picker;\n }\n\n ${SubmitContainer} {\n grid-area: submit;\n ${\n compactMode\n ? `\n width: 100%;\n `\n : `\n width: 230px;\n `\n };\n place-self: end;\n\n }\n ${\n compactMode\n ? `grid: \n [row1-start] \"filters\" 1fr [row1-end]\n [row2-start] \"picker\" 0.5fr [row2-end]\n [row3-start] \"carousel\" 5fr [row3-end]\n [row4-start] \"pagination\" 1fr [row4-end]\n [row5-start] \"submit\" 1fr [row5-end]\n / minmax(200px,${FN_DESCRIPTOR_HEIGHT});\n\n justify-content: center;\n `\n : `grid: \n [row1-start] \"filters filters filters\" 1fr [row1-end]\n [row2-start] \"pagination carousel picker\" 8fr [row2-end]\n [row3-start] \". . submit\" 1fr [row3-end]\n / 1fr minmax(200px,${FN_DESCRIPTOR_HEIGHT}) 1fr;\n `\n }\n `};\n`;\n\nconst FiltersContainer = styled.div`\n justify-self: center;\n`;\n\nconst PaginationContainer = styled.div`\n display: flex;\n align-items: center;\n gap: ${1 * GU}px;\n`;\n\nconst PaginationIcon = styled.img<{ size: number }>`\n ${({ size }) => `width: ${size}px; height: ${size}px;`};\n`;\n\nconst CarouselContainer = styled.div`\n min-width: 100%;\n height: 100%;\n`;\n\nconst FunctionsPickerContainer = styled.div`\n justify-self: end;\n`;\n\nconst SubmitContainer = styled.div``;\n\nconst SubmitButton = styled(Button)`\n box-sizing: border-box;\n padding: ${3 * GU}px;\n ${({ wide }) => wide && \"width: 100%;\"};\n`;\n", "import { GU } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { PaginationItem } from \"./PaginationItem\";\nimport { PaginationSeparator } from \"./PaginationSeparator\";\n\nfunction paginationItems(\n pages: number,\n selected: number,\n inbetweenRange: number\n): number[] {\n // visibleItems + first and final item + ellipses\n const totalVisibleItems = inbetweenRange + 2 + 2;\n const all = [...Array(pages)].map((_, i) => i);\n /**\n * When having odd lengths use the previous number to get\n * an even distribution amount of visible items on both sides of the\n * selected number.\n */\n const normalizedLength =\n inbetweenRange % 2 === 0 ? inbetweenRange : inbetweenRange - 1;\n\n if (all.length <= totalVisibleItems) {\n return all;\n }\n\n const first = 0;\n const last = all.length - 1;\n const amountBySide = Math.floor(inbetweenRange / 2);\n const itemsToLast = last - selected;\n const prevSize =\n Math.min(amountBySide, Math.max(0, selected - first)) +\n /**\n * Add the missing items on one side or the other to keep\n * the visible items length at all times.\n */\n (itemsToLast < amountBySide ? amountBySide - itemsToLast : 0);\n const nextSize = normalizedLength - prevSize;\n\n let lowerPrevBound = Math.min(all.length, selected - prevSize);\n let upperNextBound = Math.min(all.length, selected + nextSize);\n\n const items = [];\n\n items.push(...all.slice(lowerPrevBound, upperNextBound + 1));\n\n // Add ellipses\n let leftEllipsisAdded = false,\n rightEllipsisAdded = false;\n\n if (lowerPrevBound > first + 1) {\n items.unshift(-1);\n leftEllipsisAdded = true;\n }\n if (upperNextBound < last - 1) {\n items.push(-1);\n rightEllipsisAdded = true;\n }\n\n // Always display the first & last items\n if (lowerPrevBound >= first + 1) {\n items.unshift(all[0]);\n }\n if (upperNextBound <= last - 1) {\n items.push(all[all.length - 1]);\n }\n\n const missingItems = totalVisibleItems - items.length;\n\n /**\n * To keep a constant pagination size we always add enough items\n * to reach the total total amount of visible items.\n * We add them on the left or right side of the selected item based on\n * where we put the ellipsis.\n */\n if (missingItems > 0 && !(leftEllipsisAdded && rightEllipsisAdded)) {\n if (leftEllipsisAdded) {\n items.splice(\n 2,\n 0,\n ...all.slice(lowerPrevBound - missingItems, lowerPrevBound)\n );\n } else {\n items.splice(\n items.length - 2,\n 0,\n ...all.slice(upperNextBound + 1, upperNextBound + missingItems + 1)\n );\n }\n }\n\n return items;\n}\n\ntype PaginationProps = {\n direction?: \"horizontal\" | \"vertical\";\n pages: number;\n // Length of elements between ellipses.\n inbetweenRange?: number;\n selected: number;\n size: number;\n touchMode?: boolean;\n onChange(index: number): void;\n};\n\nexport const Pagination = ({\n direction = \"horizontal\",\n pages,\n inbetweenRange = 9,\n selected,\n size,\n touchMode = false,\n onChange,\n}: PaginationProps) => {\n const items = paginationItems(pages, selected, inbetweenRange);\n const isHorizontal = direction === \"horizontal\";\n\n return (\n \n {items.map((pageIndex, i) =>\n pageIndex === -1 ? (\n \n ) : (\n \n )\n )}\n \n );\n};\n\nconst Container = styled.div<{ isHorizontal: boolean; touchMode: boolean }>`\n display: flex;\n flex-direction: ${({ isHorizontal }) => (isHorizontal ? \"row\" : \"column\")};\n gap: ${({ touchMode }) => (touchMode ? 0 : `${2 * GU}px`)};\n`;\n", "import { ButtonBase, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport { useCallback } from \"react\";\nimport styled from \"styled-components\";\n\ntype Direction = \"horizontal\" | \"vertical\";\n\ntype PaginationItemProps = {\n direction?: Direction;\n index: number;\n selected: boolean;\n size: number;\n touchMode: boolean;\n onChange(index: number): void;\n};\n\nexport const PaginationItem = ({\n direction = \"horizontal\",\n touchMode,\n selected,\n size,\n index,\n onChange,\n}: PaginationItemProps) => {\n const handleClick = useCallback(() => {\n onChange(index);\n }, [index, onChange]);\n\n return (\n
    \n {selected && }\n \n {index + 1}\n \n
    \n );\n};\n\nconst Dot = styled.div<{ direction: Direction }>`\n width: 3px;\n height: 3px;\n position: absolute;\n ${({ direction }) =>\n direction === \"horizontal\"\n ? `\n bottom: calc(-20%);\n left: calc(50% - 2px);\n `\n : `\n top: calc(50% - 1px);\n left: calc(-10%);\n `};\n background: ${({ theme }) => theme.accentContent};\n`;\n\nconst StyledButtonBase = styled(ButtonBase)<{\n selected: boolean;\n touchMode: boolean;\n}>`\n border-radius: ${RADIUS}px;\n ${({ selected, theme, touchMode, size }) => `\n width: ${size}px;\n height: ${size}px;\n color: ${theme.surfaceContent};\n ${textStyle(touchMode ? \"body1\" : \"title2\")};\n\n &:active {\n background: ${theme.surfacePressed};\n }\n ${\n selected &&\n `\n && {\n color: ${theme.accentContent};\n }\n `\n };\n `}\n`;\n", "import { IconEllipsis } from \"@1hive/1hive-ui\";\nimport { memo } from \"react\";\nimport styled from \"styled-components\";\n\ntype PaginationSeparatorProps = {\n isHorizontal?: boolean;\n size: number;\n};\n\nexport const PaginationSeparator = memo(function PaginationSeparator({\n isHorizontal = false,\n size,\n}: PaginationSeparatorProps) {\n return (\n \n \n \n );\n});\n\nconst Container = styled.div<{ isHorizontal: boolean; size: number }>`\n display: flex;\n align-items: center;\n justify-content: center;\n ${({ size }) => `\n width: ${size}px;\n height: ${size}px;\n `};\n transform: rotate(${({ isHorizontal }) => (isHorizontal ? 0 : \"90deg\")});\n`;\n\nconst StyledIconEllipsis = styled(IconEllipsis)`\n color: ${({ theme }) => theme.surfaceContentSecondary.alpha(0.4)};\n`;\n", "import { createStore } from \"@udecode/zustood\";\nimport { utils } from \"ethers\";\nimport type { FunctionFragment } from \"ethers/lib/utils\";\nimport type { FnEntry } from \"~/types\";\nimport { getFnSelector } from \"~/utils\";\n\nexport type Function = {\n fullName: string;\n minimalName: string;\n sigHash: string;\n entry?: FnEntry;\n};\n\nexport type UserFnDescription = {\n sigHash: string;\n description: string;\n};\n\ntype ContractDescriptorState = {\n fnSelected: number;\n fnDescriptorEntries: Function[];\n /**\n * Use an object to index descriptions to ease state updates at\n * the expense of having some fn data duplication (sigHash, minimalName, etc)\n */\n userFnDescriptions: Record;\n readyToFocus: boolean;\n lastCaretPos: number;\n};\n\nconst initialState: ContractDescriptorState = {\n fnSelected: 0,\n fnDescriptorEntries: [],\n userFnDescriptions: {},\n readyToFocus: false,\n lastCaretPos: 0,\n};\n\nconst contractDescriptorStore = createStore(\"contract-descriptor\")(\n initialState,\n {\n devtools: { enabled: process.env.NODE_ENV === \"development\" },\n }\n)\n .extendActions((set, get) => ({\n setUpFnDescriptorEntries: (abi: string, entries: FnEntry[]) => {\n const abiInterface = new utils.Interface(abi);\n const fnFragments = abiInterface.fragments.filter(\n (f) => f.type === \"function\"\n ) as FunctionFragment[];\n\n const fns = fnFragments\n .filter((f) => !f.constant) // Only consider functions that does not change state\n .map((f) => {\n const sigHash = getFnSelector(f);\n return {\n fullName: f.format(\"full\"),\n minimalName: f.format(\"minimal\"),\n sigHash,\n entry: entries.find((e) => e.sigHash === sigHash),\n };\n });\n\n set.fnDescriptorEntries(fns);\n },\n goToNextFn: () => {\n const prevFnSelected = get.fnSelected();\n const fns = get.fnDescriptorEntries();\n\n set.fnSelected(Math.min(fns.length - 1, prevFnSelected + 1));\n },\n goToPrevFn: () => {\n const prevFnSelected = get.fnSelected();\n set.fnSelected(Math.max(0, prevFnSelected - 1));\n },\n upsertFnDescription: (sigHash: string, description: string) => {\n const prevUserFnDescriptions = get.userFnDescriptions();\n\n if (prevUserFnDescriptions[sigHash]?.description === description) {\n return;\n }\n\n // Delete description\n if (!description && prevUserFnDescriptions.hasOwnProperty(sigHash)) {\n const newUserFnDescriptions = { ...prevUserFnDescriptions };\n delete newUserFnDescriptions[sigHash];\n set.userFnDescriptions(newUserFnDescriptions);\n\n return;\n }\n\n // Upsert description\n set.userFnDescriptions({\n ...prevUserFnDescriptions,\n [sigHash]: {\n ...prevUserFnDescriptions[sigHash],\n description,\n },\n });\n },\n }))\n .extendActions((set, get) => ({\n addHelperFunction: (fnSignature: string) => {\n const fnSelected = get.fnSelected();\n const selectedEntry = get.fnDescriptorEntries()[fnSelected];\n const selectedUserFnDescription =\n get.userFnDescriptions()[selectedEntry.sigHash];\n const fieldCaretPos = get.lastCaretPos();\n const oldDescription = selectedUserFnDescription?.description ?? \"\";\n const newDescription = `${oldDescription.slice(\n 0,\n fieldCaretPos\n )}\\`${fnSignature}\\`${oldDescription.slice(fieldCaretPos)}`;\n\n set.upsertFnDescription(selectedEntry.sigHash, newDescription);\n\n // Wait a little bit for the description to update.\n setTimeout(() => set.readyToFocus(true), 100);\n setTimeout(() => set.readyToFocus(false), 100);\n },\n }))\n .extendSelectors((_, get) => ({\n fnDescriptionsCounter: () => Object.keys(get.userFnDescriptions()).length,\n }));\n\nexport const useContractDescriptorStore = contractDescriptorStore.useStore;\nexport const selectors = contractDescriptorStore.use;\nexport const actions = contractDescriptorStore.set;\n", "import { utils } from \"ethers\";\nimport type { Fragment } from \"ethers/lib/utils\";\n\nexport const getFnSelector = (fragment: Fragment): string =>\n utils.id(fragment.format(\"sighash\")).substring(0, 10);\n", "import { useCallback } from \"react\";\nimport { utils } from \"ethers\";\nimport { useContract, useSigner } from \"wagmi\";\nimport rosetteStoneAbi from \"~/abi/RosetteStone.json\";\n\nconst GAS_LIMIT = 6000000;\n\nexport default function useRosetteActions() {\n const [{ data }] = useSigner();\n const rosetteContract = useContract({\n addressOrName: window.ENV.ROSETTE_STONE_ADDRESS,\n contractInterface: rosetteStoneAbi,\n signerOrProvider: data,\n });\n\n const upsertEntries = useCallback(\n async (scopes: string[], sigs: string[], cids: string[]) => {\n const tx = await rosetteContract.upsertEntries(\n scopes,\n sigs,\n cids.map((cid) => utils.hexlify(utils.toUtf8Bytes(cid))),\n { gasLimit: GAS_LIMIT }\n );\n await tx.wait();\n },\n [rosetteContract]\n );\n\n return { upsertEntries };\n}\n", "import { Button, GU, IconMenu, Popover, SearchInput } from \"@1hive/1hive-ui\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { WheelEventHandler } from \"react\";\nimport styled from \"styled-components\";\nimport { FunctionDetails } from \"./FunctionDetails\";\nimport { HELPER_FUNCTIONS } from \"~/radspec-helper-functions\";\nimport type { HelperFunction } from \"~/radspec-helper-functions\";\n\nimport { actions } from \"../use-contract-descriptor-store\";\nimport { SELECTION_SEPARATOR } from \"~/utils/client/selection.client\";\n\ntype Placement =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"left-end\"\n | \"left-start\";\n\nconst computeFnSignature = (fn: HelperFunction): string => {\n const params = fn.params\n // Filter out optional parameters\n ?.filter((p) => p.defaultValue === undefined)\n .map((p) => `${SELECTION_SEPARATOR}${p.name}`)\n .join(\",\");\n\n return `${fn.name}(${params})`;\n};\n\nexport const HelperFunctionsPicker = ({\n popoverPlacement,\n}: {\n popoverPlacement?: Placement;\n}) => {\n const opener = useRef();\n const [visible, setVisible] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const filteredHelperFunctions = useMemo(\n () =>\n HELPER_FUNCTIONS.filter((fn) =>\n fn.name.toLowerCase().includes(searchTerm.toLowerCase())\n ),\n [searchTerm]\n );\n\n const handleUseFunction = useCallback((fn: HelperFunction) => {\n actions.addHelperFunction(computeFnSignature(fn));\n setVisible(false);\n }, []);\n\n const handlePickerWheelEvent = useCallback((e) => {\n e.stopPropagation();\n }, []);\n\n useEffect(() => {\n if (!visible) {\n // Wait a little bit for the popover to close.\n setTimeout(() => setSearchTerm(\"\"), 100);\n }\n }, [visible]);\n\n return (\n
    \n }\n onClick={() => setVisible(true)}\n />\n setVisible(false)}\n >\n \n \n
    Functions library
    \n \n \n {filteredHelperFunctions.map((fn) => (\n \n ))}\n \n
    \n
    \n \n
    \n );\n};\n\nconst PopoverWrapper = styled.div`\n max-height: 700px;\n overflow: auto;\n &::-webkit-scrollbar {\n width: 12px;\n background-color: ${(props) => props.theme.surfaceSelected};\n }\n\n &::-webkit-scrollbar-thumb {\n border-radius: 10px;\n box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);\n background-color: ${(props) => props.theme.surfaceIcon};\n }\n`;\n\nconst PopoverLayout = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 400px;\n gap: ${2 * GU}px;\n box-sizing: border-box;\n padding: ${2 * GU}px;\n`;\n\nconst FunctionsSection = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: ${1 * GU}px;\n`;\n", "import {\n ButtonBase,\n GU,\n IconRight,\n noop,\n textStyle,\n useTheme,\n} from \"@1hive/1hive-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { a, useSpring } from \"@react-spring/web\";\nimport styled from \"styled-components\";\nimport type { HelperFunction } from \"~/radspec-helper-functions\";\nimport { Entry } from \"./Entry\";\n\ntype FunctionDetailsProps = {\n fn: HelperFunction;\n onUse?(fn: HelperFunction): void;\n};\n\nexport const FunctionDetails = ({ fn, onUse = noop }: FunctionDetailsProps) => {\n const theme = useTheme();\n const contentRef = useRef(null);\n const contentHeight = useRef(0);\n const animate = useRef(false);\n const [opened, setOpened] = useState(false);\n\n const { openProgress } = useSpring({\n from: { openProgress: 0 },\n to: { openProgress: Number(opened) },\n immediate: !animate,\n });\n\n const handleToggle = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n const updateHeight = () => {\n if (contentRef.current) {\n contentHeight.current = contentRef.current.clientHeight;\n }\n };\n\n const handleContentRef = (element: HTMLDivElement) => {\n contentRef.current = element;\n updateHeight();\n };\n\n // Update the height\n useEffect(updateHeight, [opened, updateHeight]);\n\n // Animate after the initial render\n useEffect(() => {\n animate.current = true;\n }, []);\n\n return (\n \n \n theme.surfacePressed.alpha(v)\n ),\n }}\n >\n onUse(fn)}>Use\n \n \n
    \n `rotate(${v * 90}deg)`),\n transformOrigin: \"50% calc(50% - 0.5px)\",\n marginRight: 0.5 * GU,\n }}\n >\n \n \n
    \n \n \n
    {fn.name}
    \n
    \n
    \n \n \n theme.surfacePressed.alpha(v)\n ),\n height: openProgress.to((v) => `${v * contentHeight.current}px`),\n }}\n >\n
    \n \n
    \n \n \n \n
    \n );\n};\n\nconst Container = styled.section`\n cursor: pointer;\n position: relative;\n margin: 0;\n`;\nconst EntryButton = styled.div`\n position: relative;\n width: 100%;\n`;\n\nconst FnNameWrapper = styled.h1`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n height: ${5 * GU}px;\n margin-left: ${0.5 * GU}px;\n color: ${({ theme }) => theme.surfaceContent};\n font-weight: bold;\n ${textStyle(\"body2\")};\n`;\n\nconst AnimatedContainer = styled(a.div)`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n`;\n\nconst ActionButtonWrapper = styled(ButtonBase)`\n position: absolute;\n top: 10px;\n right: 10px;\n color: ${({ theme }) => theme.link.alpha(0.6)};\n z-index: 2;\n ${textStyle(\"body3\")};\n\n &:hover {\n color: ${({ theme }) => theme.link};\n }\n`;\n", "import { GU } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport type { Param } from \"~/radspec-helper-functions\";\n\ntype DescriptionProps = {\n description: string;\n params?: Param[];\n};\n\nexport const Entry = ({ description, params = [] }: DescriptionProps) => (\n \n
    {description}
    \n {params.length && (\n \n
    Parameters
    \n
      \n {params.map(({ name, defaultValue, description, type }) => (\n \n {name}:\n \n {type.toString()} \n {defaultValue && (optional)}\n \n\n
      {description}
      \n {defaultValue && Default: {defaultValue}}\n
      \n ))}\n
    \n
    \n )}\n
    \n);\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${1 * GU}px;\n\n & > div {\n color: ${({ theme }) => theme.surfaceContentSecondary};\n }\n`;\n\nconst ParametersContainer = styled.div`\n & > div:first-child {\n color: ${({ theme }) => theme.surfaceContent};\n }\n\n & > ul {\n margin-left: ${1 * GU}px;\n }\n\n & > ul > li {\n margin-left: ${1 * GU}px;\n }\n`;\n\nconst Parameter = styled.li`\n & > span:nth-child(1) {\n color: ${({ theme }) => theme.surfaceContent};\n }\n & > span:nth-child(2) {\n font-style: italic;\n }\n`;\n", "export enum ParamType {\n Address = \"address\",\n Bool = \"bool\",\n Bytes = \"bytes\",\n Uint = \"uint\",\n String = \"string\",\n}\n\nexport type Param = {\n name: string;\n type: ParamType;\n description: string;\n defaultValue?: string | number;\n};\nexport type HelperFunction = {\n name: string;\n description: string;\n params?: Param[];\n};\n\nexport const HELPER_FUNCTIONS: HelperFunction[] = [\n {\n name: \"@formatDate\",\n description: \"Format a timestamp as a string.\",\n params: [\n {\n name: \"timestamp\",\n type: ParamType.Uint,\n description: \" Unix timestamp in seconds.\",\n },\n {\n name: \"format\",\n type: ParamType.String,\n description:\n 'Format for the date, defaults to a format like \"Jan. 1st 2000\".',\n defaultValue: \"MMM. do y\",\n },\n ],\n },\n {\n name: \"@formatPct\",\n description: \"Format a percentage amount.\",\n params: [\n {\n name: \"value\",\n type: ParamType.Uint,\n description: \"The number to be formatted as a percentage.\",\n },\n {\n name: \"format\",\n type: ParamType.Uint,\n description:\n \"The number that is considered to be 100% when calculating the percentage.\",\n defaultValue: \"10^18\",\n },\n {\n name: \"precision\",\n type: ParamType.Uint,\n description: \"The number of decimal places to format to.\",\n defaultValue: 2,\n },\n ],\n },\n {\n name: \"@fromHex\",\n description: \"Returns the string representation of a given hex value.\",\n params: [\n {\n name: \"hex\",\n type: ParamType.String,\n description: \"The hex string.\",\n },\n {\n name: \"to\",\n type: ParamType.String,\n description:\n \"The type to convert the hex from (supported types: 'utf8', 'number').\",\n },\n ],\n },\n {\n name: \"@radspec\",\n description: \"Interpret calldata using radspec recursively.\",\n params: [\n {\n name: \"addr\",\n type: ParamType.Address,\n description: \"The target address of the call.\",\n },\n {\n name: \"data\",\n type: ParamType.Bytes,\n description: \"The calldata of the call.\",\n },\n ],\n },\n {\n name: \"@tokenAmount\",\n description: \"Format token amounts taking decimals into account.\",\n params: [\n {\n name: \"tokenAddress\",\n type: ParamType.Address,\n description: \"The address of the token.\",\n },\n {\n name: \"amount\",\n type: ParamType.Uint,\n description: \"The absolute amount for the token quantity (wei).\",\n },\n {\n name: \"showSymbol\",\n type: ParamType.Bool,\n description:\n \"Whether the token symbol will be printed after the amount.\",\n defaultValue: \"true\",\n },\n {\n name: \"precision\",\n type: ParamType.Uint,\n description:\n \"The number of decimal places to format to. If set, the precision is always enforced.\",\n defaultValue: 18,\n },\n ],\n },\n {\n name: \"@transformTime\",\n description: \"Transform between time units.\",\n params: [\n {\n name: \"time\",\n type: ParamType.Uint,\n description: \"The base time amount.\",\n },\n {\n name: \"toUnit\",\n type: ParamType.String,\n description:\n \"The unit to convert the time to (supported units: 'second', 'minute', 'hour', 'day', 'week', 'month', 'year').\",\n defaultValue: \"'best'\",\n },\n {\n name: \"fromUnit\",\n type: ParamType.String,\n description:\n \"The unit to convert the time from (supported units: 'millisecond', 'second', 'minute', 'hour', 'day', 'week', 'month', 'year').\",\n defaultValue: \"'second'\",\n },\n ],\n },\n {\n name: \"@withDecimals\",\n description: \"Format an numerical amount with its decimals.\",\n params: [\n {\n name: \"amount\",\n type: ParamType.Uint,\n description: \"The absolute amount, without any decimals.\",\n },\n {\n name: \"decimals\",\n type: ParamType.Uint,\n description: \"The number of decimal places to format to.\",\n defaultValue: 18,\n },\n ],\n },\n];\n", "import { createRef, useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\nimport { Carousel } from \"./Carousel\";\nimport { FunctionDescriptor } from \"./FunctionDescriptor\";\nimport {\n actions,\n useContractDescriptorStore,\n} from \"./use-contract-descriptor-store\";\nimport { getSelectionRange } from \"~/utils/client/selection.client\";\n\ntype FnDescriptorsCarouselProps = {\n compactMode: boolean;\n};\n\nexport const FnDescriptorsCarousel = ({\n compactMode,\n}: FnDescriptorsCarouselProps) => {\n const {\n fnDescriptorEntries,\n fnSelected,\n lastCaretPos,\n userFnDescriptions,\n readyToFocus,\n } = useContractDescriptorStore();\n const descriptorRefs = useRef[]>([]);\n const prevDescriptorIndexRef = useRef(-1);\n const currentDescriptorIndexRef = useRef(0);\n const [carouselMoveAnimationEnded, setCarouselMoveEnded] = useState(false);\n\n /**\n * Generate descriptor refs\n */\n useEffect(() => {\n descriptorRefs.current = fnDescriptorEntries.map(\n (_, i) => descriptorRefs.current[i] ?? createRef()\n );\n\n // Wait a little bit for the ref to be attached before focusing first element\n setTimeout(() => descriptorRefs.current[0].current?.focus(), 200);\n }, [fnDescriptorEntries]);\n\n /**\n * Focus on current element once the transition animation ended.\n */\n useEffect(() => {\n if (\n carouselMoveAnimationEnded &&\n descriptorRefs.current[fnSelected]?.current\n ) {\n descriptorRefs.current[fnSelected]?.current?.focus();\n setCarouselMoveEnded(false);\n }\n }, [carouselMoveAnimationEnded, fnSelected]);\n\n /**\n * Lost focus on last element when a new one was selected to not mess up\n * the transition animation if user types in.\n */\n useEffect(() => {\n if (prevDescriptorIndexRef.current === -1) {\n prevDescriptorIndexRef.current = fnSelected;\n } else {\n prevDescriptorIndexRef.current = currentDescriptorIndexRef.current;\n\n descriptorRefs.current[prevDescriptorIndexRef.current]?.current?.blur();\n }\n\n currentDescriptorIndexRef.current = fnSelected;\n }, [fnSelected]);\n\n /**\n * Focus on current element when function was selected and set\n * selection on first parameter.\n */\n useEffect(() => {\n if (!readyToFocus || !descriptorRefs.current[fnSelected]?.current) {\n return;\n }\n\n const selectedDescriptor = descriptorRefs.current[fnSelected].current!;\n\n selectedDescriptor.focus();\n\n const [start, end] = getSelectionRange(\n selectedDescriptor.value,\n lastCaretPos\n );\n\n selectedDescriptor.setSelectionRange(start, end);\n }, [lastCaretPos, readyToFocus, fnSelected]);\n\n return (\n (\n \n ))}\n direction={compactMode ? \"horizontal\" : \"vertical\"}\n itemSpacing={450}\n onTransitionEnd={() => setCarouselMoveEnded(true)}\n />\n );\n};\n", "import { GU, noop, useViewport } from \"@1hive/1hive-ui\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useState, useRef } from \"react\";\nimport { a, useSpring } from \"@react-spring/web\";\nimport styled from \"styled-components\";\nimport { PrevNext } from \"./PrevNext\";\n\ntype CarouselProps = {\n items: ReactNode[];\n selected: number;\n compactMode?: boolean;\n direction?: \"horizontal\" | \"vertical\";\n itemSpacing?: number;\n customSideSpace?: number;\n showPrevNext?: boolean;\n onItemSelected?(selected: number): void;\n onTransitionEnd?(): void;\n};\n\nconst DEFAULT_SIZE = { width: 0, height: 0 };\n\nexport const Carousel = ({\n items,\n selected = 0,\n compactMode = false,\n direction = \"vertical\",\n itemSpacing = 3 * GU,\n customSideSpace,\n showPrevNext = false,\n onItemSelected = noop,\n onTransitionEnd = noop,\n}: CarouselProps) => {\n const [containerSize, setContainerSize] = useState({ ...DEFAULT_SIZE });\n const container = useRef(null);\n const { width: vw } = useViewport();\n const isHorizontal = direction === \"horizontal\";\n const itemSize = containerSize[isHorizontal ? \"width\" : \"height\"];\n // The space on one side of the visible items\n const sideSpace =\n customSideSpace && customSideSpace >= 0 ? customSideSpace : 0;\n\n // const allowDrag = compactMode || (items && items.length > visibleItems);\n\n useEffect(() => {\n onItemSelected(selected);\n }, [onItemSelected, selected]);\n\n const updateContainerSize = useCallback((element) => {\n setContainerSize(\n element\n ? { width: element.clientWidth, height: element.clientHeight }\n : { ...DEFAULT_SIZE }\n );\n }, []);\n\n useEffect(() => {\n if (container.current) {\n updateContainerSize(container.current);\n }\n }, [vw, updateContainerSize]);\n\n const handleContainerRef = useCallback(\n (element) => {\n container.current = element;\n updateContainerSize(element);\n },\n [updateContainerSize]\n );\n\n // Get the container x position from an item index\n const xFromItem = useCallback(\n (index) => {\n return sideSpace - (itemSize + itemSpacing) * index;\n },\n [sideSpace, itemSize, itemSpacing]\n );\n\n // The current x position, before the drag\n const selectedX = xFromItem(selected);\n\n // The x position of the last item, before the drag\n // const lastX = xFromItem(items.length - 1);\n\n // Handles the actual x position, with the drag\n const [{ x, drag }, setX] = useSpring(() => ({\n x: selectedX,\n drag: Number(false),\n immediate: true,\n onRest: onTransitionEnd,\n }));\n\n // TODO: Implement dragging feature for mobile screens\n // Update the transition during drag\n // const bindDrag = useDrag(({ down, delta }) => {\n // const updatedX = Math.max(lastX, Math.min(sideSpace, selectedX + delta[0]));\n\n // if (!allowDrag) {\n // return;\n // }\n\n // if (down) {\n // setX({\n // x: updatedX,\n // immediate: true,\n // });\n // } else {\n // let target = selected;\n // if (Math.abs(delta[0]) > itemWidth / 2) {\n // const sP = delta[0] > 0 ? -sideSpace : sideSpace;\n // const deltaSelected = Math.abs(\n // Math.round((delta[0] + sP) / (itemWidth + itemSpacing))\n // );\n // // Moving to the left\n // if (delta[0] > 0) {\n // target = Math.max(0, selected - deltaSelected);\n // // Move to the right\n // } else {\n // target = Math.min(\n // items.length - visibleItems,\n // selected + deltaSelected\n // );\n // }\n // }\n\n // setX({\n // x: xFromItem(target),\n // immediate: false,\n // });\n // setSelected(target);\n // }\n // });\n\n // Update the transition when the base x position updates\n useEffect(() => {\n setX({\n x: selectedX,\n immediate: false,\n });\n }, [selectedX, setX]);\n\n return (\n \n {showPrevNext && (\n <>\n {selected > 0 && (\n onItemSelected(Math.max(0, selected - 1))}\n isHorizontal={isHorizontal}\n />\n )}\n {selected < items.length - 1 && (\n \n onItemSelected(Math.min(items.length - 1, selected + 1))\n }\n isHorizontal={isHorizontal}\n />\n )}\n \n )}\n\n \n `translate3d(${\n isHorizontal ? `${x || 0}px, 0, 0` : `0, ${x || 0}px, 0`\n })`\n ),\n }}\n >\n {items.map((item, i) => (\n {\n return drag || (i >= selected && i < selected + 1) ? 1 : 0.15;\n }),\n }}\n $isFirst={i === 0}\n $isHorizontal={isHorizontal}\n $itemHeight={containerSize.height}\n $itemWidth={containerSize.width}\n $itemSpacing={itemSpacing}\n >\n {item}\n \n ))}\n \n \n );\n};\n\nconst Container = styled.div<{\n isHorizontal: boolean;\n}>`\n position: relative;\n overflow: hidden;\n touch-action: none;\n height: 100%;\n width: 100%;\n`;\n\nconst AnimatedContainer = styled(a.div)<{ $isHorizontal: boolean }>`\n position: absolute;\n display: flex;\n width: 100%;\n box-sizing: border-box;\n\n align-items: center;\n touch-action: none;\n ${(props) =>\n props.$isHorizontal\n ? `\n flex-direction: row;\n justify-content: flex-start;\n height: 100%;\n `\n : `\n flex-direction: column;\n justify-content: center;\n `};\n`;\n\nconst AnimatedItemContainer = styled(a.div)<{\n $isHorizontal: boolean;\n $isFirst: boolean;\n $itemWidth: number;\n $itemHeight: number;\n $itemSpacing: number;\n}>`\n width: ${(props) => props.$itemWidth}px;\n height: ${(props) => props.$itemHeight}px;\n transition: opacity 150ms ease-in-out;\n flex-grow: 0;\n flex-shrink: 0;\n ${(props) => (props.$isHorizontal ? \"margin-left\" : \"margin-top\")}: ${({\n $isFirst,\n $itemSpacing: itemSpacing,\n}) => (!$isFirst ? `${itemSpacing}px` : 0)}};\n`;\n", "import {\n GU,\n ButtonIcon,\n IconDown,\n IconUp,\n IconRight,\n IconLeft,\n} from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\n\ntype PrevNextProps = {\n isHorizontal?: boolean;\n type: \"next\" | \"previous\";\n onClick: () => void;\n};\nexport const PrevNext = ({\n isHorizontal = true,\n type,\n onClick,\n}: PrevNextProps) => {\n const NextIcon = isHorizontal ? IconRight : IconDown;\n const PrevIcon = isHorizontal ? IconLeft : IconUp;\n const next = type === \"next\";\n const Icon = next ? NextIcon : PrevIcon;\n\n return (\n \n \n \n \n \n );\n};\n\nconst Container = styled.div<{ isHorizontal: boolean; next: boolean }>`\n position: absolute;\n z-index: 1;\n ${({ isHorizontal, next }) =>\n isHorizontal\n ? `\n top: calc(50% - ${5 * GU}px);\n ${next ? \"right\" : \"left\"}: ${0.5 * GU}px;\n `\n : `\n top: calc(${next ? `100% - ${5 * GU}px` : \"0\"});\n left: 50%;\n `};\n color: ${({ theme }) => theme.surfaceContentSecondary};\n height: ${6 * GU}px;\n`;\n", "import { Button, GU } from \"@1hive/1hive-ui\";\nimport { forwardRef, memo, useCallback } from \"react\";\nimport type { FocusEventHandler, KeyboardEventHandler } from \"react\";\nimport styled from \"styled-components\";\nimport { StatusLabel } from \"~/components/StatusLabel\";\nimport { FnDescriptionStatus } from \"~/types\";\nimport { actions } from \"../use-contract-descriptor-store\";\nimport type { Function } from \"../use-contract-descriptor-store\";\nimport { DescriptionField } from \"./DescriptionField\";\nimport { canTab, getSelectionRange } from \"~/utils/client/selection.client\";\n\ntype FunctionDescriptorProps = {\n fnDescriptorEntry: Function;\n description?: string;\n onEntryChange(sigHash: string, description: string): void;\n};\n\nexport const FunctionDescriptor = memo(\n forwardRef(\n ({ fnDescriptorEntry, description, onEntryChange, ...props }, ref) => {\n const entry = fnDescriptorEntry.entry;\n const { notice, status } = entry || {};\n const descriptorStatus = status || FnDescriptionStatus.Available;\n\n const handleKeyDown: KeyboardEventHandler = (e) => {\n const textArea = e.target as HTMLTextAreaElement;\n const text = textArea.value;\n const offset = textArea.selectionStart;\n\n if (e.code === \"Tab\" && text && canTab(text, offset)) {\n e.preventDefault();\n const [start, end] = getSelectionRange(text, offset);\n\n textArea.setSelectionRange(start, end);\n }\n };\n\n const handleBlur: FocusEventHandler = (e) => {\n actions.lastCaretPos(e.target.selectionStart);\n };\n\n /**\n * Need to wrap handler on callback to make helper function use logic\n * work.\n */\n const handleOnChange = useCallback(\n (value) => {\n onEntryChange(fnDescriptorEntry.sigHash, value);\n },\n [onEntryChange, fnDescriptorEntry.sigHash]\n );\n\n return (\n \n \n Description\n \n \n \n
    \n {fnDescriptorEntry.fullName}\n
    \n {}}\n disabled={!(notice || description)}\n />\n
    \n );\n }\n )\n);\n\nFunctionDescriptor.displayName = \"FunctionDescriptor\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst DescriptorHeader = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: ${1 * GU}px;\n`;\n", "import { textStyle, GU } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { FnDescriptionStatus } from \"~/types\";\nimport { getFnEntryStatusIconData } from \"~/utils/client/icons.client\";\n\nexport const StatusLabel = ({ status }: { status: FnDescriptionStatus }) => {\n const iconData = getFnEntryStatusIconData(status);\n\n if (!iconData) {\n return null;\n }\n\n const { Icon, color } = iconData;\n\n return (\n \n
    \n \n
    \n {status}\n \n );\n};\n\nconst LabelContainer = styled.div<{\n status: FnDescriptionStatus;\n visible: boolean;\n}>`\n display: flex;\n visibility: ${({ visible }) => (visible ? \"visible\" : \"hidden\")};\n align-items: center;\n height: 24px;\n border: 1px solid ${({ color }) => color};\n width: fit-content;\n text-transform: lowercase;\n border-radius: 4px;\n padding-right: ${1 * GU}px;\n ${textStyle(\"body4\")};\n\n div:first-child {\n display: flex;\n height: 100%;\n align-items: center;\n color: ${({ theme }) => theme.content};\n background-color: ${({ color }) => color};\n margin-right: ${1 * GU}px;\n }\n`;\n", "import { GU, RADIUS, textStyle } from \"@1hive/1hive-ui\";\nimport { forwardRef, useEffect, useState } from \"react\";\nimport type { FocusEventHandler, KeyboardEventHandler } from \"react\";\nimport styled from \"styled-components\";\nimport { useDebounce } from \"~/hooks/useDebounce\";\n\ntype DescriptionFieldProps = {\n description?: string;\n disabled?: boolean;\n height?: string;\n placeholder?: string;\n textSize?: string;\n onChange(value: string): void;\n onBlur?: FocusEventHandler;\n onKeyDown?: KeyboardEventHandler;\n};\n\nexport const DescriptionField = forwardRef<\n HTMLTextAreaElement,\n DescriptionFieldProps\n>(\n (\n {\n description,\n disabled = false,\n height = `${10 * GU}px`,\n textSize = \"body2\",\n placeholder = \"Add description\u2026\",\n onChange,\n ...props\n },\n ref\n ) => {\n const [value, setValue] = useState(description);\n const debouncedValue = useDebounce(value, 400);\n\n useEffect(() => {\n if (debouncedValue !== undefined) {\n onChange(debouncedValue);\n }\n }, [debouncedValue, onChange]);\n\n /**\n * Keep inner description value in sync as it can be updated from other places\n * of the component tree (e.g. adding a function from the picker)\n */\n useEffect(() => {\n setValue(description);\n }, [description]);\n\n return (\n setValue(e.target.value)}\n {...props}\n />\n );\n }\n);\n\nDescriptionField.displayName = \"DescriptionField\";\n\nconst DescriptionTextArea = styled.textarea<{\n height: string;\n textSize: string;\n}>`\n height: ${(props) => props.height};\n padding: ${1 * GU}px ${1.5 * GU}px;\n background: ${(props) => props.theme.surfaceUnder};\n color: ${(props) => props.theme.surfaceContent};\n appearance: none;\n border-radius: ${RADIUS}px;\n width: 100%;\n outline: none;\n resize: none;\n ${(props) => textStyle(props.textSize)};\n\n &:focus {\n outline: none;\n border-color: ${(props) => props.theme.selected};\n }\n &:read-only {\n color: ${(props) => props.theme.hint};\n border-color: ${(props) => props.theme.border};\n }\n &::placeholder {\n color: ${(props) => props.theme.hint};\n opacity: 0.5;\n }\n &:invalid {\n box-shadow: none;\n }\n\n &::-webkit-scrollbar {\n width: 12px;\n background-color: ${(props) => props.theme.surfaceSelected};\n }\n\n &::-webkit-scrollbar-thumb {\n border-radius: 10px;\n box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);\n background-color: ${(props) => props.theme.surfaceIcon};\n }\n`;\n", "import { useEffect, useState } from \"react\";\n\n/**\n * Source: https://usehooks.com/useDebounce/\n */\nexport function useDebounce(value: T, delay: number): T {\n // State and setters for debounced value\n const [debouncedValue, setDebouncedValue] = useState(value);\n useEffect(\n () => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler);\n };\n },\n [value, delay] // Only re-call effect if value or delay changes\n );\n return debouncedValue;\n}\n", "import { GU, textStyle } from \"@1hive/1hive-ui\";\nimport styled from \"styled-components\";\nimport { a, useTransition } from \"@react-spring/web\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { ContractItem } from \"./ContractItem\";\n\ntype ContractSelectorScreenProps = {\n contracts: AggregateContract[];\n loaderText?: string;\n onContractDataSelected(contractData: ContractData): void;\n};\n\nexport const ContractSelectorScreen = ({\n contracts,\n loaderText,\n onContractDataSelected,\n}: ContractSelectorScreenProps) => {\n const transition = useTransition(contracts, {\n trail: 100 / contracts.length,\n from: { opacity: 0, scale: 0 },\n enter: { opacity: 1, scale: 1 },\n });\n\n return (\n \n
    The following contracts have been found for the given address:
    \n {transition((styles, item) => (\n \n \n \n ))}\n
    \n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: ${2 * GU}px;\n padding: ${1 * GU}px;\n margin-top: ${15 * GU}px;\n margin-bottom: ${3 * GU}px;\n\n & > div:first-child {\n ${textStyle(\"body1\")};\n margin: 0 ${2 * GU}px;\n margin-bottom: ${3 * GU}px;\n }\n`;\n", "import { GU, LoadingRing, Switch, Tag, textStyle } from \"@1hive/1hive-ui\";\nimport type { MouseEventHandler } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { a, useTransition } from \"@react-spring/web\";\nimport styled from \"styled-components\";\nimport type { ContractData, AggregateContract } from \"~/types\";\nimport { getNetworkLogo } from \"~/utils/client/icons.client\";\n\ntype ContractItemProps = {\n contract: AggregateContract;\n loaderText?: string;\n onClick(contractData: ContractData): void;\n};\n\nexport const ContractItem = ({\n contract: { proxy, implementation },\n loaderText = \"Fetching data\u2026\",\n onClick,\n}: ContractItemProps) => {\n const [itemClicked, setItemClicked] = useState(false);\n const [displayProxy, setDisplayProxy] = useState(!implementation);\n const contractData = displayProxy ? proxy : implementation;\n const { address, name, network } = contractData!;\n const implementationFound = !!implementation;\n const displaySwitch = !!proxy && !!implementation;\n\n const clickTransition = useTransition(itemClicked, {\n from: {\n loaderOpacity: 0,\n },\n enter: {\n loaderOpacity: 1,\n },\n });\n\n useEffect(() => {\n if (!itemClicked || !contractData) {\n return;\n }\n\n /**\n * Wait a little bit before handling click to display loader\n * for a period of time.\n */\n let timeoutId = setTimeout(() => onClick(contractData), 500);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [contractData, itemClicked, onClick]);\n\n const handleViewClick: MouseEventHandler = (e) => {\n e.stopPropagation();\n\n setDisplayProxy((prev) => !prev);\n };\n\n return (\n {\n setItemClicked(true);\n }}\n isClicked={itemClicked}\n >\n {clickTransition(({ loaderOpacity }, clicked) => (\n <>\n \n \n \n }\n />\n {displaySwitch && (\n <>\n \n Show proxy:{\" \"}\n
    \n \n
    \n
    \n \n )}\n
    \n \n
    {name}
    \n
    {address}
    \n
    \n {!implementationFound && (\n *Implementation source code not found.\n )}\n
    \n {clicked && (\n \n {loaderText}\n \n )}\n \n ))}\n \n );\n};\n\nconst Wrapper = styled.div<{ isClicked: boolean }>`\n position: relative;\n padding: ${2 * GU}px;\n background-color: ${({ theme }) => theme.surface};\n border-radius: 10px;\n transition: background-color ease-out 200ms;\n min-width: 45vmin;\n max-width: 85vmin;\n cursor: pointer;\n\n ${({ isClicked, theme }) =>\n !isClicked\n ? `&:hover {\n background-color: ${theme.surfaceHighlight};\n }`\n : \"\"};\n`;\n\nconst ItemHeader = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: ${1.5 * GU}px;\n`;\n\nconst ItemContent = styled.div`\n & > div:nth-child(1) {\n ${textStyle(\"body1\")};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n & > div:nth-child(2) {\n ${textStyle(\"body3\")};\n color: ${({ theme }) => theme.contentSecondary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nconst InfoError = styled.span`\n color: ${({ theme }) => theme.negative};\n margin-top: ${1 * GU}px;\n ${textStyle(\"body4\")};\n`;\n\nconst ProxySwitchWrapper = styled.div`\n display: flex;\n gap: ${0.5 * GU}px;\n ${({ theme }) => theme.contentSecondary};\n ${textStyle(\"body3\")};\n\n & > div {\n display: flex;\n align-items: center;\n }\n`;\n\nconst Loader = styled(a.div)`\n width: 100%;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n flex-wrap: nowrap;\n gap: ${1 * GU}px;\n ${textStyle(\"body3\")};\n`;\n\nconst NetworkImg = styled.img<{ isTestnet: boolean }>`\n border-radius: 50%;\n width: 20px;\n height: 20px;\n margin-left: -${1.2 * GU}px;\n margin-right: ${0.5 * GU}px;\n ${(props) => (props.isTestnet ? \"filter: grayscale(80%);\" : \"\")};\n`;\n", "import type { ReactNode } from \"react\";\nimport { a, useSpring } from \"@react-spring/web\";\n\nexport const SmoothDisplayContainer = ({\n children,\n}: {\n children: ReactNode;\n}) => {\n const smoothDisplayStyles = useSpring({\n from: { opacity: 0 },\n to: { opacity: 1 },\n });\n\n return (\n \n {children}\n \n );\n};\n", "import type { ContractData, AggregateContract } from \"~/types\";\nimport { getProvider, NETWORKS } from \"./web3.server\";\nimport {\n buildExplorerFetchRequest,\n processExplorerResponse,\n} from \"./blockchain-explorers.server\";\nimport {\n fetchImplementationAddress,\n getProxyPattern,\n} from \"./proxy-patterns.server\";\nimport { constants } from \"ethers\";\nimport type { Chain } from \"wagmi\";\n\nconst processBytecodeRequest = (response: any): string => {\n const bytecode = response as string;\n\n if (!bytecode || bytecode === \"0x\") {\n throw new Response(\n !bytecode\n ? \"Contract bytecode not found\"\n : \"Address provided is not a contract\",\n { status: 500 }\n );\n }\n\n return bytecode;\n};\n\nexport const fetchContracts = async (\n contractAddress: string\n): Promise => {\n const responses = (await Promise.allSettled(\n NETWORKS.map((n) => fetchContractData(contractAddress, n))\n )) as PromiseSettledResult[];\n\n const fulfilledResponses = responses.filter(\n (r) => r.status === \"fulfilled\"\n ) as PromiseFulfilledResult[];\n const contracts = fulfilledResponses.map((r) => r.value);\n const proxiesAndImplementations = [];\n\n // Fetch proxy's implementation contract.\n for (const c of contracts) {\n let proxy, implementation;\n const proxyPattern = getProxyPattern(c.name);\n\n if (proxyPattern !== undefined) {\n proxy = c;\n const implementationAddress = await fetchImplementationAddress(\n proxy,\n proxyPattern\n );\n if (implementationAddress !== constants.AddressZero) {\n try {\n implementation = await fetchContractData(\n implementationAddress,\n c.network\n );\n } catch (err) {}\n }\n } else {\n implementation = c;\n }\n\n proxiesAndImplementations.push({ proxy, implementation });\n }\n\n return proxiesAndImplementations;\n};\n\nexport const fetchContractData = async (\n contractAddress: string,\n network: Chain\n): Promise => {\n const networkId = network.id;\n const provider = getProvider(networkId);\n const explorerRequest = fetch(\n buildExplorerFetchRequest(contractAddress, networkId)\n );\n\n const requests = [provider.getCode(contractAddress), explorerRequest];\n const responses = await Promise.all(requests);\n\n const bytecode = processBytecodeRequest(responses[0]);\n const explorerResult = await processExplorerResponse(\n responses[1] as Response\n );\n\n return {\n abi: explorerResult.ABI,\n bytecode,\n address: contractAddress,\n name: explorerResult.ContractName,\n network,\n };\n};\n", "import { providers } from \"ethers\";\nimport type { Chain } from \"wagmi\";\nimport { allChains } from \"wagmi\";\n\nconst INFURA_PROJECT_ID = process.env.INFURA_PROJECT_ID;\n\nconst STATIC_PROVIDERS_CACHE = new Map<\n number,\n providers.StaticJsonRpcProvider\n>();\n\nconst networkExplorerRegex = /([A-Z]+)_EXPLORER_API_KEY/;\n\nconst availableExplorers = Object.keys(process.env)\n .filter((key) => networkExplorerRegex.test(key))\n .map((key) => key.split(\"_\")[0].toLowerCase());\n\nexport const NETWORKS = allChains.filter(\n (chain) =>\n // Check if chain has the same explorer\n !!chain.blockExplorers?.find(({ name }) =>\n availableExplorers.includes(name.toLowerCase())\n )\n);\n\nconst buildRpcEndpoint = (network: Chain): string => {\n const infuraRpcEndpoints = network.rpcUrls.filter((rpcUrl) =>\n rpcUrl.includes(\"infura\")\n );\n\n if (infuraRpcEndpoints.length) {\n return `${infuraRpcEndpoints[0]}/${INFURA_PROJECT_ID}`;\n }\n\n return network.rpcUrls[0];\n};\n\nexport const getProvider = (networkId: number): providers.Provider => {\n if (STATIC_PROVIDERS_CACHE.has(networkId)) {\n return STATIC_PROVIDERS_CACHE.get(networkId)!;\n }\n\n const network = NETWORKS.find((n) => n.id === networkId)!;\n\n const provider = new providers.StaticJsonRpcProvider(\n buildRpcEndpoint(network),\n networkId\n );\n\n STATIC_PROVIDERS_CACHE.set(networkId, provider);\n\n return provider;\n};\n", "export type ExplorerAPIData = {\n baseUrl: string;\n apiKey: string;\n};\n\nexport type ExplorerResult = {\n ABI: string;\n Address: string;\n ContractName: string;\n};\n\ntype ExplorerResponse = {\n message: string;\n result: ExplorerResult[];\n status: string;\n};\n\nexport const getExplorerAPIData = (networkId: number): ExplorerAPIData => {\n let apiKey, baseUrl;\n\n switch (networkId) {\n case 1:\n apiKey = process.env.ETHERSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api.etherscan.io/api\";\n break;\n case 4:\n apiKey = process.env.ETHERSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api-rinkeby.etherscan.io/api\";\n break;\n case 100:\n apiKey = \"\";\n baseUrl = \"https://blockscout.com/xdai/mainnet/api\";\n break;\n case 137:\n apiKey = process.env.POLYGONSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api.polygonscan.com/api\";\n break;\n case 80001:\n apiKey = process.env.POLYGONSCAN_EXPLORER_API_KEY;\n baseUrl = \"https://api-testnet.polygonscan.com/api\";\n break;\n }\n\n if (!apiKey || !baseUrl) {\n throw new Response(\n `Blockchain explorer not found for given chain ${networkId}`,\n {\n status: 500,\n }\n );\n }\n\n return {\n baseUrl,\n apiKey,\n };\n};\n\nexport const processExplorerResponse = async (\n response: Response\n): Promise => {\n const explorerResponse = (await response.json()) as ExplorerResponse;\n\n if (explorerResponse.status === \"0\") {\n throw new Response(explorerResponse.message, { status: 500 });\n }\n\n const result = explorerResponse.result[0];\n\n if (\n !result.ABI ||\n // Check ABI field as Blockscout sets it when contract is not verified\n result.ABI === \"Contract source code not verified\"\n ) {\n throw new Response(`Contract is not verified`, { status: 500 });\n }\n\n return result;\n};\n\nexport const buildExplorerFetchRequest = (\n contractAddress: string,\n networkId: number\n): string => {\n const { baseUrl, apiKey } = getExplorerAPIData(networkId);\n\n return `${baseUrl}?module=contract&action=getsourcecode&address=${contractAddress}${\n apiKey ? `&apikey=${apiKey}` : \"\"\n }`;\n};\n", "import type { providers } from \"ethers\";\nimport { BigNumber, constants, Contract, utils } from \"ethers\";\nimport type { ContractData } from \"~/types\";\nimport { getProvider } from \"./web3.server\";\n\nenum ProxyPattern {\n UUPSProxy,\n UpgradeabilityStorage,\n EternalStorage,\n TransparentUpgradeableProxy,\n AppProxyUpgradeable,\n UnknownProxy,\n}\n\ntype ProxyPatternHandler = (\n proxy: ContractData,\n provider: providers.Provider\n) => Promise;\n\nconst {\n UUPSProxy,\n UpgradeabilityStorage,\n EternalStorage,\n TransparentUpgradeableProxy,\n AppProxyUpgradeable,\n UnknownProxy,\n} = ProxyPattern;\n\n/**\n * Standarized storage slot determined by bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1)\n * and defined on EIP-1967 (https://eips.ethereum.org/EIPS/eip-1967#logic-contract-address)\n */\nconst EIP1967_STORAGE_SLOT = utils.hexlify(\n BigNumber.from(utils.id(\"eip1967.proxy.implementation\")).sub(1)\n);\n\nconst getAddressFromStorageSlot = async (\n contractAddress: string,\n storageSlot: string | number,\n provider: providers.Provider\n): Promise => {\n const rawImplementationAddress = await provider.getStorageAt(\n contractAddress,\n storageSlot\n );\n return utils.hexStripZeros(rawImplementationAddress);\n};\n\nconst PROXY_PATTERN_HANDLERS: Record = {\n [UUPSProxy]: async ({ address }, provider) => {\n let implementationAddress = await getAddressFromStorageSlot(\n address,\n EIP1967_STORAGE_SLOT,\n provider\n );\n\n /**\n * Try to fetch the address from the keccak256(\"PROXIABLE\") slot as defined on\n * the EIP-1822 UUPS proposal (https://eips.ethereum.org/EIPS/eip-1822#proxiable-contract).\n */\n if (implementationAddress === constants.AddressZero) {\n implementationAddress = await getAddressFromStorageSlot(\n address,\n utils.id(\"PROXIABLE\"),\n provider\n );\n return implementationAddress;\n }\n\n return implementationAddress;\n },\n [UpgradeabilityStorage]: async (proxy, provider) => {\n return \"\";\n },\n [EternalStorage]: async (proxy, provider) => {\n return \"\";\n },\n [TransparentUpgradeableProxy]: async ({ address }, provider) => {\n return getAddressFromStorageSlot(address, EIP1967_STORAGE_SLOT, provider);\n },\n [AppProxyUpgradeable]: ({ address, abi }, provider) => {\n const proxyContract = new Contract(address, abi, provider);\n\n return proxyContract.implementation();\n },\n [UnknownProxy]: async ({ address, abi }, provider) => {\n let implementationAddress: string;\n\n try {\n const proxyContract = new Contract(address, abi, provider);\n // Try fetching address from method\n implementationAddress = await proxyContract.implementation();\n } catch (err) {\n implementationAddress = await getAddressFromStorageSlot(\n address,\n EIP1967_STORAGE_SLOT,\n provider\n );\n }\n\n return implementationAddress;\n },\n};\n\nexport const getProxyPattern = (\n contractName: string\n): ProxyPattern | undefined => {\n const normalizedContractName = contractName.toLowerCase();\n const proxyPatternKeys = Object.keys(ProxyPattern).map((k) =>\n k.toLowerCase()\n );\n const proxyPatternIndex = proxyPatternKeys.indexOf(normalizedContractName);\n\n if (proxyPatternIndex === -1) {\n if (normalizedContractName.includes(\"proxy\")) {\n return UnknownProxy;\n }\n return;\n }\n\n return Object.values(ProxyPattern)[\n proxyPatternIndex\n ] as unknown as ProxyPattern;\n};\n\nexport const fetchImplementationAddress = (\n proxy: ContractData,\n proxyPattern: ProxyPattern\n): Promise =>\n PROXY_PATTERN_HANDLERS[proxyPattern](proxy, getProvider(proxy.network.id));\n", "import { Outlet, useOutletContext } from \"@remix-run/react\";\nimport type { AppContext } from \"~/App\";\n\nexport default function EntriesRoute() {\n const context = useOutletContext();\n\n return (\n <>\n
    \n \n
    \n \n );\n}\n", "import type { LoaderFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport { useLoaderData } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport type { FnEntry } from \"~/types\";\nimport { fetchFnEntry } from \"~/utils/server/subgraph.server\";\n\nexport const loader: LoaderFunction = async ({ params }) => {\n const entryId = params.entry;\n\n if (!entryId) {\n throw new Response(\"Expected entryId param\", {\n status: 400,\n statusText: \"Expected search params\",\n });\n }\n\n const entry = await fetchFnEntry(entryId);\n\n return json({ entry });\n};\n\ntype LoaderData = {\n entry?: FnEntry;\n};\n\nexport default function EntryRoute() {\n const { entry } = useLoaderData();\n\n return (\n \n {entry?.sigHash}\n \n );\n}\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: start;\n height: 100%;\n width: 100%;\n`;\n", "import { GU, textStyle, useViewport } from \"@1hive/1hive-ui\";\nimport type { LoaderFunction } from \"@remix-run/node\";\nimport { json } from \"@remix-run/node\";\nimport { useLoaderData, useNavigate } from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { SmoothDisplayContainer } from \"~/components/SmoothDisplayContainer\";\nimport { StatusLabel } from \"~/components/StatusLabel\";\nimport type { FnEntry } from \"~/types\";\nimport { fetchFnEntries } from \"~/utils/server/subgraph.server\";\n\nexport const loader: LoaderFunction = async () => {\n const fns = await fetchFnEntries();\n\n return json({ fns });\n};\n\ntype LoaderData = {\n fns: FnEntry[];\n};\n\nexport default function Entries() {\n const { fns } = useLoaderData();\n const { below, within } = useViewport();\n\n const compactMode = below(\"medium\");\n const tabletMode = within(\"medium\", \"large\");\n\n return (\n \n \n \n {fns.length ? (\n \n {fns.map((f) => (\n \n ))}\n \n ) : (\n
    No entries found
    \n )}\n
    \n
    \n
    \n );\n}\n\nfunction EntryCard({ fn }: { fn: FnEntry }) {\n const navigate = useNavigate();\n\n return (\n navigate(`/entries/${fn.id}`)}>\n \n swapExactETHForTokens(uint256,address[],address,uint256)\n \n \n {fn.sigHash}\n \n \n \n );\n}\n\nconst Container = styled.div<{ compactMode: boolean; tabletMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: start;\n padding-top: ${({ compactMode, tabletMode }) =>\n compactMode ? 3 * GU : tabletMode ? 5 * GU : 9 * GU}px;\n height: 100%;\n width: 100%;\n`;\n\nconst ListContainer = styled.div<{ compactMode: boolean; tabletMode: boolean }>`\n display: grid;\n grid-gap: ${({ compactMode, tabletMode }) =>\n compactMode ? 3 * GU : tabletMode ? 3 * GU : 5 * GU}px;\n grid-template-columns: ${({ compactMode, tabletMode }) =>\n `repeat(${compactMode ? \"1\" : tabletMode ? \"2\" : \"3\"}, ${\n compactMode ? \"327\" : tabletMode ? \"336\" : \"350\"\n }px)`};\n margin-bottom: ${5 * GU}px;\n`;\n\nconst EntryContainer = styled.div`\n padding: ${3 * GU}px;\n background: ${(props) => props.theme.surface};\n border: 1px solid ${(props) => props.theme.border};\n border-radius: ${2.5 * GU}px;\n box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);\n cursor: pointer;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 223px;\n`;\n\nconst NoticeContainer = styled.div`\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n ${textStyle(\"title3\")};\n`;\n\nconst InfoContainer = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid ${(props) => props.theme.border};\n padding-top: ${4 * GU}px;\n`;\n\nconst Hash = styled.div`\n ${textStyle(\"title4\")};\n`;\n", "import { useEffect } from \"react\";\nimport { useNavigate } from \"@remix-run/react\";\n\nexport default function Index() {\n const navigate = useNavigate();\n\n useEffect(() => navigate(\"/home\"), [navigate]);\n\n return null;\n}\n", "import { GU, LoadingRing, useViewport } from \"@1hive/1hive-ui\";\nimport {\n useCatch,\n useNavigate,\n useResolvedPath,\n useTransition,\n} from \"@remix-run/react\";\nimport styled from \"styled-components\";\nimport { AppScreen } from \"~/components/AppLayout/AppScreen\";\nimport { ContractForm } from \"~/components/ContractForm\";\n\nexport default function Home() {\n const { below } = useViewport();\n const navigate = useNavigate();\n\n const transition = useTransition();\n const pathDescribe = useResolvedPath(\"/describe\");\n\n const describeIsPending =\n transition.state === \"loading\" &&\n transition.location.pathname === pathDescribe.pathname;\n\n return (\n \n \n {describeIsPending || transition.state !== \"loading\" ? (\n \n navigate(`/describe?contract=${contractAddress}`)\n }\n />\n ) : (\n <>\n \n Loading\u2026\n \n )}\n \n \n );\n}\n\nconst MainContainer = styled.div<{ compactMode: boolean }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding-top: ${({ compactMode }) => (compactMode ? 5 * GU : 17 * GU)}px;\n width: 100%;\n height: 100%;\n`;\n\n// https://remix.run/docs/en/v1/api/conventions#catchboundary\nexport function CatchBoundary() {\n const caught = useCatch();\n\n let message;\n\n switch (caught.status) {\n case 400:\n message = caught.data;\n case 500:\n message = caught.data;\n break;\n default:\n throw new Error(caught.data || caught.statusText);\n }\n\n return (\n
    \n
    \n

    \n {caught.status}: {caught.statusText}\n

    \n {message}\n
    \n
    \n );\n}\n", "import {\n Button,\n Field,\n GU,\n Info,\n LoadingRing,\n TextInput,\n} from \"@1hive/1hive-ui\";\nimport { utils } from \"ethers\";\nimport type { ChangeEvent, FormEventHandler } from \"react\";\nimport { useState } from \"react\";\nimport styled from \"styled-components\";\n\ntype ContractFormProps = {\n loading: boolean;\n onSubmit(contractAddress: string): void;\n};\n\nexport const ContractForm = ({ loading, onSubmit }: ContractFormProps) => {\n const [contractAddress, setContractAddress] = useState(\"\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n const handleSubmit: FormEventHandler = (e) => {\n e.preventDefault();\n\n if (!contractAddress) {\n setErrorMsg(\"Type in a contract address.\");\n return;\n }\n if (!utils.isAddress(contractAddress)) {\n setErrorMsg(\"Invalid contract address.\");\n return;\n }\n\n onSubmit(contractAddress);\n };\n\n return (\n \n
    \n \n \n ) => {\n setErrorMsg(\"\");\n setContractAddress(e.target.value);\n }}\n wide\n />\n \n {errorMsg && {errorMsg}}\n \n \n {loading ? (\n <>\n \n Loading\u2026\n \n ) : (\n <>Next\n )}\n \n \n
    \n );\n};\n\nconst Container = styled.div`\n width: 100%;\n max-width: 440px;\n margin: 0 ${3 * GU}px;\n display: flex;\n flex-direction: column;\n`;\n\nconst MainTextInput = styled(TextInput)`\n height: ${8 * GU}px;\n`;\n\nconst NextButton = styled(Button)`\n height: ${8 * GU}px;\n`;\n", "export default {'version':'cb622c1a','entry':{'module':'/build/entry.client-A2EVHVXD.js','imports':['/build/_shared/chunk-HZUGWBV5.js','/build/_shared/chunk-3OZZSMKW.js','/build/_shared/chunk-TX3NBJQ6.js','/build/_shared/chunk-7GBHLDOU.js']},'routes':{'root':{'id':'root','parentId':undefined,'path':'','index':undefined,'caseSensitive':undefined,'module':'/build/root-KJDERTAY.js','imports':['/build/_shared/chunk-O7W56GE6.js','/build/_shared/chunk-LZ4SDSZA.js','/build/_shared/chunk-JJDW4ADQ.js','/build/_shared/chunk-4QALF4QG.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':true,'hasErrorBoundary':true},'routes/contract-descriptions-search':{'id':'routes/contract-descriptions-search','parentId':'root','path':'contract-descriptions-search','index':undefined,'caseSensitive':undefined,'module':'/build/routes/contract-descriptions-search-2OIVEZAG.js','imports':undefined,'hasAction':false,'hasLoader':true,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/describe':{'id':'routes/describe','parentId':'root','path':'describe','index':undefined,'caseSensitive':undefined,'module':'/build/routes/describe-5JNKTXPD.js','imports':['/build/_shared/chunk-NGT22XXN.js','/build/_shared/chunk-3ZWBRF63.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/entries':{'id':'routes/entries','parentId':'root','path':'entries','index':undefined,'caseSensitive':undefined,'module':'/build/routes/entries-26NFBUIE.js','imports':undefined,'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/entries/$entry':{'id':'routes/entries/$entry','parentId':'routes/entries','path':':entry','index':undefined,'caseSensitive':undefined,'module':'/build/routes/entries/$entry-M65F2B43.js','imports':['/build/_shared/chunk-LGFWYGJC.js','/build/_shared/chunk-3ZWBRF63.js','/build/_shared/chunk-4QALF4QG.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/entries/index':{'id':'routes/entries/index','parentId':'routes/entries','path':undefined,'index':true,'caseSensitive':undefined,'module':'/build/routes/entries/index-WPZF3YJI.js','imports':['/build/_shared/chunk-NGT22XXN.js','/build/_shared/chunk-JJDW4ADQ.js','/build/_shared/chunk-LGFWYGJC.js','/build/_shared/chunk-3ZWBRF63.js','/build/_shared/chunk-4QALF4QG.js'],'hasAction':false,'hasLoader':true,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/fn-descriptions-upload':{'id':'routes/fn-descriptions-upload','parentId':'root','path':'fn-descriptions-upload','index':undefined,'caseSensitive':undefined,'module':'/build/routes/fn-descriptions-upload-EL2FSQYJ.js','imports':undefined,'hasAction':true,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false},'routes/home':{'id':'routes/home','parentId':'root','path':'home','index':undefined,'caseSensitive':undefined,'module':'/build/routes/home-AWSBT27U.js','imports':['/build/_shared/chunk-3ZWBRF63.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':true,'hasErrorBoundary':false},'routes/index':{'id':'routes/index','parentId':'root','path':undefined,'index':true,'caseSensitive':undefined,'module':'/build/routes/index-D7W25RXG.js','imports':undefined,'hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false}},'url':'/build/manifest-CB622C1A.js'};"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IACA;AADA;AAAA;AACA,YAAuB;AAAA;AAAA;;;ACDvB;AAAA;AAAA;AAAA,YAAO,UAAU;AAAA;AAAA;;;ACAjB;AAAA;AAAA;AAAA,YAAO,UAAU;AAAA;AAAA;;;ACAjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2B;AAE3B,mBAA4B;AAC5B,+BAAiC;AAElB,uBACb,SACA,oBACA,iBACA,cACA;AACA,QAAM,QAAQ,IAAI;AAElB,MAAI,SAAS,sBAAe,eAC1B,MAAM,cACJ,oCAAC,0BAAD;AAAA,IAAa,SAAS;AAAA,IAAc,KAAK,QAAQ;AAAA;AAGrD,QAAM,SAAS,MAAM;AAErB,WAAS,OAAO,QAAQ,cAAc;AAEtC,kBAAgB,IAAI,gBAAgB;AAEpC,SAAO,IAAI,SAAS,oBAAoB,QAAQ;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA;;;AC1Bb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAqB;AACrB,qBAQO;AAEP,kBAAqB;;;ACXrB;AAAA,uBAAyB;AACzB,iCAA8B;AAC9B,qBAAyB;;;ACFzB;AAAA,sBAAwB;AACxB,gCAAmB;AACnB,oBAA+D;AAG/D,iBAAiC;;;ACLjC;AAAA,qBAAmB;AACnB,gCAAmB;;;;;;AAUZ,IAAM,kBAAkB,CAAC;AAAA,EAC9B,WAAW;AAAA,EACX;AAAA,EACA,eAAe;AAAA,MAEf,oCAAC,eAAD;AAAA,EAAe;AAAA,GACb,oCAAC,KAAD;AAAA,EACE,OAAO;AAAA,IACL,gBAAgB;AAAA;AAAA,EAElB,QAAO;AAAA,EACP,MAAK;AAAA,EACL,KAAI;AAAA,GAEJ,oCAAC,OAAD;AAAA,EACE,OAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,IAAI;AAAA;AAAA,GAGX,oCAAC,OAAD;AAAA,EACE,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA;AAAA,EAEV,KAAK;AAAA,EACL,KAAI;AAAA,IACH,KACF,CAAC,gBAAgB;AAM1B,IAAM,gBAAgB,kCAAO;AAAA;AAAA;AAAA,aAGhB,CAAC,MAAM,EAAE;AAAA;AAAA;AAAA;;;ADxBtB,IAAM,kBAAkB,iCACtB;AAKK,kBAAkB,EAAE,YAA2B;AACpD,QAAM,CAAC,OAAO,YAAY,4BAAS;AAEnC,QAAM,qBAAqB,8BAAc,OAAO;AAAA,IAC9C,QAAQ,wBAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA;AAAA,IAEnB,OAAO;AAAA,MACL,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA;AAAA,IAEnB,OAAO;AAAA,MACL,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA;AAAA;AAIrB,QAAM,mBAAmB,8BAAc,CAAC,OAAO;AAAA,IAC7C,QAAQ,wBAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,eAAe;AAAA;AAAA,IAEjB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA;AAAA,IAEjB,OAAO;AAAA,MACL,SAAS;AAAA;AAAA;AAKb,+BAAU,MAAM;AACd,UAAM,KAAK,WAAW,MAAM,SAAS,OAAO;AAC5C,WAAO,MAAM,aAAa;AAAA,KACzB;AAEH,SACE,oCAAC,gBAAgB,UAAjB;AAAA,IAA0B,OAAO,EAAE,UAAU,OAAO;AAAA,KACjD,iBACC,CAAC,EAAE,SAAS,iBAAiB,YAC3B,WACE,oCAAC,yBAAD;AAAA,IACE,OAAO,EAAE,SAAS,WAAW;AAAA,KAE7B,oCAAC,aAAE,KAAH;AAAA,IACE,OAAO;AAAA,MACL,QAAQ;AAAA;AAAA,KAGV,oCAAC,iBAAD;AAAA,IAAiB,UAAS;AAAA,IAAO,cAAY;AAAA,SAKtD;AAAA;AAKA,uBAAuB;AAC5B,SAAO,8BAAW;AAAA;AAGpB,IAAM,0BAA0B,uCAAO,aAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AEvGzC;AAAA,oBAA0B;AAC1B,oBAAwB;AAExB,mBAAyC;AAEzC,sBAAkC;AAClC,2BAAuC;AAEvC,IAAM,gBAAgB,CAAC,YAAiC;AACtD,QAAM,QAAQ,uBAAU,KAAK,CAAC,WAAU,OAAM,OAAO,OAAO;AAE5D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB;AAAA;AAG3C,SAAO;AAAA,IACL,IAAI,kCAAkB;AAAA,MACpB,QAAQ,CAAC;AAAA,MACT,SAAS,EAAE,gBAAgB;AAAA;AAAA,IAE7B,IAAI,4CAAuB;AAAA,MACzB,QAAQ,CAAC;AAAA,MACT,SAAS;AAAA,QACP,UAAU,OAAO,IAAI;AAAA,QACrB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAMhB,IAAM,QAAQ,CAAC,EAAE,eAAwC;AACvD,QAAM,aAAa,2BAAQ,MAAM,cAAc,OAAO,IAAI,WAAW;AACrE,QAAM,iBAAiB,2BACrB,MAAM,IAAI,wBAAU,gBAAgB,OAAO,IAAI,UAC/C;AAGF,SACE,oCAAC,4BAAD;AAAA,IAAe;AAAA,IAAwB,UAAU;AAAA,KAC9C;AAAA;AAKP,IAAO,gBAAQ;;;AC5Cf;AAAA,iCAAmB;;;ACAnB;AAAA,sBAA0C;AAC1C,kBAAkB;AAClB,gCAAmB;AAInB,IAAM,UAAU;AACT,IAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,UAAU;AAClB,QAAM,QAAQ;AACd,QAAM,EAAE,uBAAuB;AAC/B,QAAM,cAAc,MAAM;AAE1B,SACE,oCAAC,WAAD,MACG,mBACC,CAAC,EAAE,UAAU,sBAAsB,UACjC,SACE,oCAAC,mBAAD;AAAA,IACE,OAAO,EAAE,SAAS,UAAU,WAAW;AAAA,IACvC,cAAc;AAAA,KAEd,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,OAAO,MAAM,gBAAgB,SAAS;AAAA,KAAW,oBAC3C,oCAAC,iBAAD;AAAA;AASlC,IAAM,YAAY,kCAAO;AAAA;AAAA,YAEb,IAAI;AAAA;AAGhB,IAAM,oBAAoB,uCAAO,cAAE;AAAA;AAAA;AAAA;AAAA,eAIpB,IAAI;AAAA;AAAA,qBAEE,CAAC,EAAE,mBACpB,eAAe,WAAW;AAAA;;;AC5C9B;AAAA,uBAAgC;AAChC,kBAAkB;AAClB,iCAAmB;;;ACFnB;AAAA,uBAAwC;AACxC,oBAA4C;AAC5C,iCAAmB;AACnB,oBAAmD;;;ACHnD;AAAA,oBAAkE;;;;;;;;;AAMlE,IAAM,0BAA0B,IAAI;AAE7B,IAAM,oBAAoB,CAC/B,OACuB;AACvB,UAAQ;AAAA,SACD;AACH,aAAO;AAAA,SACJ;AACH,aAAO;AAAA;AAEP;AAAA;AAAA;AAIC,IAAM,kBAAkB,CAC7B,cACA,gBACsB;AAxBxB;AAyBE,MAAI,cAAc;AAChB,WAAO;AAAA;AAGT,MAAI,kBAAY,UAAZ,mBAAmB,aAAa;AAClC,WAAO;AAAA;AAAA;;;AC9BX;AAAA,qBAA4B;AAGrB,IAAK,aAAL,kBAAK,gBAAL;AACL;AACA;AACA;AACA;AACA;AALU;AAAA;AAsBZ,IAAM,eAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAGnB,IAAM,qBAAqB,gCAAY,kBAAkB,cAAc;AAAA,EACrE,UAAU,EAAE,SAAS;AAAA,GAEpB,cAAc,CAAC,KAAK,QAAS;AAAA,EAC5B,cAAc,MAAM,IAAI,OAAO,CAAC,IAAI;AAAA,EACpC,OAAO,MAAM;AACX,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAEJ,QAAI,OAAO;AACX,QAAI,eAAe;AACnB,QAAI,kBAAkB;AACtB,QAAI,cAAc;AAClB,QAAI,gBAAgB;AAAA;AAAA,EAEtB,YAAY,CAAC,WAAuB;AAClC,UAAM,iBAAiB,IAAI;AAC3B,UAAM,kBAAkB,iBAAiB,SAAS,KAAK;AAEvD,QAAI,cAAc;AAClB,QAAI,gBAAgB;AAAA;AAAA,IAGvB,cAAc,CAAC,QAAS;AAAA,EACvB,mBAAmB,MAAM;AACvB,QAAI;AACJ,QAAI,OAAO;AAAA;AAAA;AAIV,IAAM,uBAAuB,mBAAmB;AAChD,IAAM,UAAU,mBAAmB;;;ACrE1C;AAAA,sBAUO;AACP,oBAAyB;AAEzB,gCAAmB;AACnB,oBAAuC;AASvC,IAAM,uBAAuB,CAAC;AAAA,EAC5B;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,MAC+B;AAC/B,QAAM,EAAE,UAAU;AAClB,QAAM,QAAQ;AAEd,SACE,oCAAC,mBAAD;AAAA,IAAmB;AAAA,KACjB,oCAAC,gBAAD,MACE,0DACG,MACA,MAAM,aACL,oCAAC,wBAAD,MACE,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,aAAa,GAAG,IAAI;AAAA,MACpB,cAAc,GAAG,MAAM;AAAA;AAAA,KAGxB,UAEF,cACC,oCAAC,0BAAD;AAAA,IAAU,MAAK;AAAA,IAAQ,OAAO,MAAM;AAAA;AAAA;AAc7C,IAAM,gBAAgB,CAAC,EAAE,cAAkC;AA9DlE;AA+DE,QAAM,QAAQ;AACd,QAAM,CAAC,EAAE,MAAM,iBAAiB,8BAAW,EAAE,UAAU;AACvD,QAAM,CAAC,EAAE,MAAM,iBAAiB;AAChC,QAAM,EAAE,SAAS,QAAQ,eAAe;AAExC,SACE,oCAAC,sBAAD;AAAA,IACE,YAAU;AAAA,IACV;AAAA,IACA,MACE,oCAAC,OAAD;AAAA,MAAK,OAAO,EAAE,UAAU;AAAA,OACtB,oCAAC,8BAAD;AAAA,MAAc;AAAA,MAAkB,QAAQ;AAAA,QACxC,oCAAC,iBAAD;AAAA,IAGJ,SACE,0DACG,CAAC,CAAC,WACD,oCAAC,cAAD,MACE,oCAAC,mBAAD,MACG,4BAAK,SAAQ,oCAAe,WAAW,OAI9C,oCAAC,OAAD;AAAA,MACE,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,MAAM;AAAA;AAAA,OAEhB,iBACe,kBAAY,UAAZ,mBAAmB;AAAA;AAAA;AAQ7C,IAAM,oBAAoB,uCAAO;AAAA;AAAA,aAEpB,MAAM;AAAA,IACf,CAAC,UACD,MAAM,YAAY,SACd,0BAA0B,MAAM,MAAM,sBACtC;AAAA;AAGR,IAAM,iBAAiB,kCAAO;AAAA;AAAA;AAAA;AAAA,eAIf,IAAI;AAAA;AAGnB,IAAM,kBAAkB,kCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAMf,CAAC,UAAU,MAAM,MAAM;AAAA,sBACjB,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAI7C,IAAM,eAAe,kCAAO;AAAA;AAAA;AAAA,IAGxB,+BAAU;AAAA;AAGd,IAAM,oBAAoB,kCAAO;AAAA;AAAA,eAElB,KAAK;AAAA;AAAA;AAAA;;;ACxIpB;AAAA,sBAAqC;AACrC,oBAA4C;AAE5C,kBAAyC;AACzC,gCAAmB;AAaZ,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MACkB;AAClB,QAAM,CAAC,QAAQ,aAAa,4BAAS,KAAK;AAI1C,QAAM,sBAAsB;AAE5B,QAAM,kBAAkB,+BAAc,UAAU;AAAA,IAC9C,QAAQ,wBAAQ;AAAA,IAChB,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW,eAAe,KAAK,qBAAK;AAAA;AAAA,IAEtC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA;AAAA;AAIf,+BAAU,MAAM;AACd,QAAI,oBAAoB,SAAS;AAC/B,0BAAoB,QAAQ;AAAA;AAAA,KAE7B,CAAC;AAEJ,SACE,oCAAC,eAAD;AAAA,IACE,oBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAU;AAAA,IACV;AAAA,IACA;AAAA,KAEA,oCAAC,YAAD,MACE,oCAAC,oBAAD;AAAA,IACE,QAAQ,wBAAQ;AAAA,IAChB,MAAM,EAAE,QAAQ,KAAK;AAAA,IACrB,IAAI,EAAE;AAAA,KAEL,CAAC,EAAE,sBACF,oCAAC,cAAE,KAAH;AAAA,IACE,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,KAGV,gBAAgB,CAAC,EAAE,SAAS,gBAC3B,oCAAC,cAAE,KAAH;AAAA,IACE,KAAK,CAAC,QAAQ;AACZ,UAAI,KAAK;AACP,kBAAU,IAAI;AAAA;AAAA;AAAA,IAGlB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,KAGR;AAAA;AAWnB,IAAM,aAAY,kCAAO;AAAA;AAAA;AAAA;AAAA;AAMzB,IAAM,gBAAgB,uCAAO;AAAA;AAAA,WAElB,CAAC,UAAU,GAAG,MAAM;AAAA;;;AClH/B;;;ACAA;AAAA,sBAA8B;AAC9B,gCAAmB;;;ACDnB;AAAA,gCAAkC;;;;;;AAIlC,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASN,IAAM,cAAc,kCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMd;AAAA;AAAA;AAAA;AAAA,oBAIA;AAAA;AAAA;AAAA;;;ADjBb,IAAM,uBAAuB,MAAM;AACxC,QAAM,EAAE,mBAAmB;AAE3B,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA;AAGT,QAAM,EAAE,OAAO,UAAU,UAAU;AAEnC,SACE,oCAAC,YAAD,MACE,oCAAC,iBAAD,MACE,oCAAC,kBAAD,MACE,oCAAC,aAAD,OACC,SAAS,oCAAC,aAAD;AAAA,IAAa,KAAK;AAAA,OAE9B,oCAAC,OAAD,MAAQ,QACR,oCAAC,UAAD,MAAW;AAAA;AAMnB,IAAM,aAAY,kCAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKZ,IAAI;AAAA;AAAA;AAIjB,IAAM,kBAAkB,kCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS/B,IAAM,mBAAmB,kCAAO;AAAA;AAAA,WAErB,OAAO;AAAA,YACN,OAAO;AAAA;AAGnB,IAAM,cAAc,kCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAMI,IAAI,sCAAsB,CAAC,UAAU,MAAM;AAAA;AAG1E,IAAM,QAAQ,kCAAO;AAAA,iBACJ,IAAI;AAAA;AAAA,IAEjB,+BAAU;AAAA;AAGd,IAAM,WAAW,kCAAO;AAAA,WACb,KAAK;AAAA,gBACA,IAAI;AAAA,WACT,CAAC,UAAU,MAAM,MAAM;AAAA;;;AEvElC;AAAA,sBAUO;AACP,oBAAuC;AACvC,gCAAmB;AACnB,oBAAuC;;;ACbvC;AAAA,oBAA4B;AAC5B,sBAAyB;AACzB,gCAAkC;AAE3B,8BAA8B;AACnC,QAAM,QAAQ;AAEd,SAAO,+BACL,CAAC,MAAM,sBAAsB,aAAa;AACxC,6CAAK;AACL,QAAI,qBAAqB;AACvB,YAAM;AAAA;AAAA,KAGV,CAAC;AAAA;;;ADSE,IAAM,kBAAkB,CAAC,EAAE,aAAmC;AACnE,QAAM,QAAQ;AACd,QAAM,QAAO;AACb,QAAM,CAAC,EAAE,MAAM,iBAAiB;AAChC,QAAM,CAAC,EAAE,MAAM,iBAAiB;AAEhC,QAAM,QAAQ,YAAY;AAC1B,QAAM,SAAS,2CAAa;AAC5B,QAAM,iBAAiB,2CAAa;AAEpC,+BAAU,MAAM;AAjClB;AAkCI,QAAI,mBAAY,UAAZ,mBAAmB,gBAAe,CAAC,gBAAgB;AACrD,cAAQ,WAAW;AAAA;AAAA,KAEpB,CAAC,YAAY,OAAO;AAEvB,QAAM,oBAAoB,+BACxB,MAAM,MAAK,iBACX,CAAC,gBAAgB;AAGnB,SACE,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS,IAAI;AAAA;AAAA,KAGf,oCAAC,QAAD,MAAO,kBACP,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,OAAO;AAAA,KAC1D,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,aAAa,IAAI;AAAA;AAAA,KAGnB,oCAAC,YAAD;AAAA,IACE,KAAK,kBAAkB,iCAAQ;AAAA,IAC/B,KAAI;AAAA,IACJ,MAAM,IAAI;AAAA,MAEZ,oCAAC,QAAD,MAAO,kCAAQ,QAAO,YAAY,WAAW,iCAAQ,QAEvD,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,OAAO;AAAA,KACnB,oCAAC,YAAD;AAAA,IAAY,SAAS;AAAA,IAAmB,iBAAiB;AAAA,KACvD,oCAAC,+BAAD;AAAA,IACE,QAAQ;AAAA,IACR,SAAO;AAAA,IACP,WAAS;AAAA,IACT,OAAO,EAAE,QAAQ;AAAA,MAEnB,oCAAC,0BAAD;AAAA,IAAU,OAAO,EAAE,eAAe;AAAA,IAAY,OAAO,MAAM;AAAA,SAIjE,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,SAAS,GAAG,IAAI;AAAA,KAC5B,oCAAC,aAAD,MACE,oCAAC,2BAAD;AAAA,IAAW,MAAK;AAAA,MAChB,oCAAC,QAAD;AAAA,IAAM,OAAO,EAAE,YAAY,MAAM;AAAA,KAC9B,gBAAgB,QAAQ,MAAM,OAAO,wBAI5C,oCAAC,wBAAD;AAAA,IAAQ,SAAS;AAAA,IAAQ,MAAI;AAAA,IAAC,OAAO,EAAE,WAAW,IAAI;AAAA,KAAM;AAAA;AAOlE,IAAM,SAAQ,kCAAO;AAAA,WACV,CAAC,UAAU,MAAM,MAAM;AAAA,mBACf,IAAI,yBAAS,+BAAU;AAAA,IACtC,+BAAU;AAAA;AAGd,IAAM,aAAa,kCAAO;AAAA,IACtB,CAAC,EAAE,WAAW,QAAQ,UAAU,mBAAmB;AAAA,kBACrC,MAAM;AAAA;AAAA;AAIxB,IAAM,aAAa,uCAAO;AAAA;AAAA;AAAA;AAAA,aAIb,MAAM;AAAA;AAAA,kBAED,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAIzC,IAAM,cAAc,kCAAO;AAAA;AAAA;AAAA,WAGhB,CAAC,UAAU,MAAM,MAAM;AAAA,IAC9B,+BAAU;AAAA;;;AEvHd;AAAA,sBAAwC;AACxC,iCAAmB;AAMZ,IAAM,mBAAmB,MAAM;AACpC,QAAM,QAAQ;AACd,QAAM,EAAE,mBAAmB,WAAW;AAEtC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA;AAGT,QAAM,aAAa,kBAAkB,OAAO;AAE5C,SACE,oCAAC,YAAD,MACE,oCAAC,mBAAD,MACE,oCAAC,aAAD,OACC,cAAc,oCAAC,cAAD;AAAA,IAAc,KAAK;AAAA,OAEpC,oCAAC,QAAD,MAAO,kBAAe,OAAO,OAC7B,oCAAC,KAAD;AAAA,IACE,OAAO,EAAE,OAAO,GAAG,KAAK,wBAAQ,OAAO,MAAM;AAAA,KAC9C,aACW,OAAO,QAAQ,WAAU;AAAA;AAO3C,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMZ,IAAI;AAAA;AAAA;AAAA;AAKjB,IAAM,oBAAmB,mCAAO;AAAA;AAAA,WAErB,OAAO;AAAA,YACN,OAAO;AAAA;AAGnB,IAAM,eAAe,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAMG,IAAI,sCAAsB,CAAC,UAAU,MAAM;AAAA;AAG1E,IAAM,SAAQ,mCAAO;AAAA,iBACJ,IAAI;AAAA;AAAA,IAEjB,+BAAU;AAAA;;;AC/Dd;AAAA,uBAOO;AACP,oBAAwB;AACxB,iCAAmB;AACnB,oBAKO;AAGP,mBAA+B;AAI/B,IAAM,oBAAoB,CAAC,UAAkC;AAAA,EAC3D,OAAO,iBAAiB,MAAM;AAAA,EAC9B,UAAU,oCAAoC,MAAM,qBAAqB,MAAM;AAAA,EAC/E,OAAO,iCAAe,MAAM;AAAA;AAQvB,IAAM,cAAc,CAAC,EAAE,iBAAiB,aAA+B;AAC5E,QAAM,QAAQ;AACd,QAAM,CAAC,EAAE,MAAM,aAAa,OAAO,gBAAgB,iBACjD;AACF,QAAM,CAAC,EAAE,OAAO,kBAAkB;AAClC,QAAM,CAAC,EAAE,OAAO,kBAAkB;AAElC,QAAM,QACJ,gBAAgB,cAAc,gBAAgB,gBAAgB;AAEhE,QAAM,CAAC,OAAO,aAAa,2BAAQ,MAAM;AA3C3C;AA4CI,QACE,iBAAiB,yCACjB,mBAAY,UAAZ,mBAAmB,cACnB;AACA,aAAO;AAAA,QACL;AAAA,QACA,oCAAC,QAAD;AAAA,UAAM,KAAI;AAAA,WAAG,wCAC0B,KACpC,YAAY,OAAO,IAAI,CAAC,OAAO,OAAO,WACrC,gBACE,oCAAC,uBAAD;AAAA,UACE,KAAK,MAAM;AAAA,UACX,SAAS,MAAM;AACb,4BAAgB,kBAAkB,QAAQ;AAAA;AAAA,WAG3C,GAAG,MAAM,OAAO,QAAQ,OAAO,SAAS,IAAI,OAAO,QAGtD,0DAAG,MAAM;AAAA;AAAA;AAOnB,WAAO;AAAA,MACL;AAAA,MACA;AAAA;AAAA,KAED,CAAC,OAAO,aAAa,iBAAiB;AAEzC,SACE,oCAAC,YAAD,MACE,oCAAC,gBAAD,MACE,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,cAAc,KAAK;AAAA,KAC/B,oCAAC,4BAAD;AAAA,IACE,OAAO,EAAE,OAAO,SAAS,QAAQ;AAAA,IACjC,OAAO,MAAM;AAAA,OAGjB,oCAAC,QAAD,MAAQ,QACR,oCAAC,KAAD;AAAA,IACE,OAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,OAAO,MAAM;AAAA;AAAA,KAGd,aAGL,oCAAC,iBAAD,MACE,oCAAC,yBAAD;AAAA,IAAQ,SAAS;AAAA,IAAQ,MAAI;AAAA,KAAC;AAAA;AAQtC,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKZ,IAAI;AAAA,iBACA,IAAI;AAAA;AAAA;AAIrB,IAAM,iBAAiB,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS9B,IAAM,SAAQ,mCAAO;AAAA;AAAA,IAEjB,gCAAU;AAAA;AAGd,IAAM,kBAAkB,mCAAO;AAAA;AAAA,gBAEf,IAAI;AAAA;AAAA;;;AClIpB;AAAA,uBAAwD;AACxD,iCAAmB;AACnB,oBAA2B;AAKpB,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,MAGI;AACJ,QAAM,CAAC,EAAE,MAAM,iBAAiB;AAEhC,SACE,oCAAC,OAAD,MACE,oCAAC,YAAD,MAAY,qBACZ,oCAAC,YAAD,MACE,oCAAC,wBAAD,MACG,YAAY,WAAW,IAAI,CAAC,cAAc;AACzC,WACE,oCAAC,cAAD;AAAA,MACE,KAAK,UAAU;AAAA,MACf,MAAM,kBAAkB,UAAU;AAAA,MAClC,MAAM,UAAU;AAAA,MAChB,OAAO,UAAU;AAAA,MACjB,SAAS,MAAM,UAAU;AAAA;AAAA,OAKjC,oCAAC,eAAD,MACE,oCAAC,uBAAD;AAAA,IAAM,MAAK;AAAA,IAAgC,UAAQ;AAAA,KAAC;AAAA;AAgB9D,sBAAsB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,GACiC;AACjC,SACE,oCAAC,kBAAD;AAAA,IAAkB;AAAA,IAAkB,UAAU,CAAC;AAAA,IAAO;AAAA,KACnD,QACC,0DACG,QACC,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,QAAQ,GAAG,OAAO;AAAA,IAAU,KAAK;AAAA,IAAM,KAAI;AAAA,MAE3D,oCAAC,YAAD,MAAa,OACZ,CAAC,SAAS,oCAAC,WAAD,MAAU;AAAA;AAO/B,IAAM,aAAa,mCAAO;AAAA,iBACT,IAAI;AAAA,kBACH,IAAI;AAAA,WACX,CAAC,UAAU,MAAM,MAAM;AAAA,mBACf,IAAI;AAAA,IACnB,gCAAU;AAAA;AAGd,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKZ,IAAI,yBAAQ,IAAI;AAAA;AAG7B,IAAM,yBAAyB,mCAAO;AAAA;AAAA,cAExB,MAAM;AAAA;AAAA;AAAA;AAKpB,IAAM,gBAAgB,mCAAO;AAAA;AAAA;AAAA,gBAGb,IAAI;AAAA,mBACD,IAAI;AAAA;AAGvB,IAAM,mBAAmB,wCAAO;AAAA;AAAA,aAEnB,CAAC,UAAW,MAAM,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM/B,KAAK;AAAA,gBACD,CAAC,UAAU,MAAM;AAAA;AAAA,mBAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnB,IAAM,aAAa,mCAAO;AAAA,gBACV,IAAI;AAAA,IAChB,gCAAU;AAAA;AAGd,IAAM,YAAW,mCAAO;AAAA,gBACR,OAAO;AAAA,IACnB,gCAAU;AAAA;;;AZtGd,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAGF,IAAM,EAAE,YAAY,eAAO,QAAQ,cAAc;AAE1C,IAAM,gBAAgB,CAAC,EAAE,cAAqC;AACnE,QAAM,YAAY;AAClB,QAAM,QAAQ;AACd,QAAM,CAAC,EAAE,MAAM,aAAa,OAAO,gBAAgB,cAAc;AACjE,QAAM,CAAC,EAAE,OAAO,gBAAgB,WAAW;AAC3C,QAAM,CAAC,EAAE,MAAM,aAAa,OAAO,gBAAgB,iBACjD;AACF,QAAM,CAAC,yBAAyB,8BAA8B,4BAAS;AACvE,QAAM,QACJ,gBAAgB,cAAc,gBAAgB,gBAAgB;AAEhE,QAAM,EAAE,eAAe,QAAQ,oBAAoB;AAEnD,QAAM,uBACJ,kBAAkB,aAAa,CAAC,SAAS,4CAAa;AAExD,QAAM,SAAS,QAAQ;AAEvB,QAAM,qBAAqB,MAAM;AAC/B,QACE,kBAAkB,cAClB,kBAAkB,UAClB,kBAAkB,QAClB;AAEA,aAAO;AAAA;AAET,YAAQ,OAAO;AAAA;AAGjB,QAAM,sBAAsB,CAAC,cAA8B,UAAiB;AAC1E,QAAI,eAAe;AACjB,cAAQ,eAAe;AACvB,cAAQ,WAAW;AACnB,oBAAc,MAAM,IACjB,KAAK,CAAC,EAAE,MAAM,oBAAY;AACzB,YAAI,MAAM;AACR,qCAA2B;AAAA,eACtB;AACL,kBAAQ,MAAM;AACd,kBAAQ;AACR,kBAAQ,eAAe;AAAA;AAAA,SAG1B,MAAM,CAAC,QAAQ,QAAQ,MAAM;AAAA;AAAA;AAIpC,QAAM,gBAAgB,CAAC,cAAyB;AAC9C,YAAQ,kBAAkB;AAC1B,YAAQ,WAAW;AAKnB,UAAM,UAAU,WAAW,MAAM;AAC/B,cAAQ,WAAW,KAAK,CAAC,EAAE,MAAM,oBAAY;AAxFnD;AAyFQ,YAAI,oCAAM,UAAN,mBAAa,gBAAe,QAAO;AACrC,kBAAQ,WAAW;AAAA,eACd;AACL,kBAAQ,WAAW;AAAA;AAAA;AAAA,OAGtB;AAAA;AAGL,QAAM,aAAa,MAAM;AACvB,YAAQ;AACR;AAAA;AAGF,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,MAAM,SAAS;AACjB,qBAAa,MAAM;AAAA;AAAA;AAAA,KAGtB;AAMH,+BAAU,MAAM;AAnHlB;AAoHI,QAAI,2BAA2B,CAAC,mBAAY,UAAZ,mBAAmB,cAAa;AAC9D,cAAQ,WAAW;AACnB,cAAQ,eAAe;AACvB,iCAA2B;AAAA;AAAA,KAE5B,CAAC,yBAAyB,YAAY;AAEzC,SACE,oCAAC,YAAD;AAAA,IAAW,KAAK;AAAA,KACb,uBACC,oCAAC,eAAD;AAAA,IAAe,SAAS,QAAQ;AAAA,OAEhC,oCAAC,yBAAD;AAAA,IACE,MAAM,oCAAC,8BAAD;AAAA,IACN,OAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,SAAS,UAAU,SAAS;AAAA,MAGhC,oCAAC,eAAD;AAAA,IACE,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ,UAAU;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAQ,mBAAkB,YAAY,KAAK,MAAM;AAAA,KAEjD,oCAAC,QAAD;AAAA,IACE,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA;AAAA;AAOlB,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;;;AazJzB;AAAA,uBAA8B;AAC9B,qBAAwB;AACxB,iCAAmB;;;ACFnB;AAAA,uBAAsD;AACtD,qBAAyB;AACzB,qBAA4B;AAC5B,iCAAmB;;;ACHnB;AAAA,uBAA6B;AAC7B,qBAAqB;AACrB,iCAAmB;AASZ,IAAM,WAAW,CAAC;AAAA,EACvB,MAAM,EAAE,MAAM,OAAO;AAAA,EACrB,SAAS;AAAA,EACT;AAAA,MACmB;AACnB,QAAM,QAAQ;AAEd,SACE,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,UAAU;AAAA,IAAc;AAAA,KACnC,UAAU,oCAAC,WAAD,OACX,oCAAC,qBAAD;AAAA,IACE;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,iBAAiB,SAAS,MAAM,mBAAmB,MAAM;AAAA,MACzD,gBAAgB;AAAA;AAAA,KAGlB,oCAAC,cAAD,MACG,QAAQ,oCAAC,OAAD;AAAA,IAAK,KAAK;AAAA,IAAM,KAAI;AAAA,MAC7B,oCAAC,QAAD,MAAO;AAAA;AAOjB,IAAM,YAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,eAAe,mCAAO;AAAA;AAAA;AAAA,SAGnB,IAAI;AAAA,aACA,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQN,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;;;AC5DlC;AAAA,uBAA2B;AAE3B,kBAAiC;AACjC,iCAAmB;AASZ,IAAM,UAAU,CAAC,EAAE,UAAU,MAAM,OAAO,eAA6B;AAC5E,QAAM,oBAAoB,+BAAc,MAAM;AAAA,IAC5C,MAAM;AAAA,MACJ,YAAY,IAAI;AAAA,MAChB,SAAS;AAAA;AAAA,IAEX,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA;AAAA,IAEX,OAAO;AAAA,MACL,YAAY,IAAI;AAAA,MAChB,SAAS;AAAA;AAAA,IAEX,QAAQ;AAAA,IACR,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,UAAU;AAAA,IAC5C,OAAO;AAAA;AAGT,SAAO,kBAAkB,CAAC,QAAQ,UAAS;AACzC,WACE,SACE,oCAAC,6BAAD,MACE,oCAAC,iBAAD;AAAA,MACE,OAAO,EAAE,YAAY,OAAO;AAAA,MAC5B;AAAA,MACA,SAAS;AAAA,OAER,WAEH,oCAAC,kBAAD;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA;AAAA;AAAA;AAQrB,IAAM,kBAAkB,wCAAO,cAAE;AAAA;AAAA;AAAA,4BAGL,CAAC,EAAE,YAAY,MAAM;AAAA,sBAC3B,CAAC,EAAE,YAAY,MAAM;AAAA,IACvC,CAAC,EAAE,OAAO,cAAc;AAAA,eACb;AAAA,aACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,IAAM,mBAAmB,wCAAO,cAAE;AAAA;AAAA;AAAA;AAAA,UAIxB,CAAC,EAAE,cAAc;AAAA;AAAA;AAAA,gBAGX,CAAC,EAAE,YAAY,MAAM,QAAQ,MAAM;AAAA,oBAC/B,CAAC,EAAE,YAAa,QAAQ,SAAS;AAAA;;;AFpErD,IAAM,aAAa,CAAC,EAAE,cACpB,oCAAC,kBAAD,MACE,oCAAC,6BAAD;AAAA,EACE;AAAA,EACA,KAAK;AAAA;AAAA;AAAA;AAAA,GAKL,oCAAC,gBAAD;AAAA,EAAgB,OAAM;AAAA;AAK5B,IAAM,oBAAoB;AAEnB,IAAM,cAAc,CAAC,EAAE,YAAyC;AACrE,QAAM,EAAE,aAAa;AACrB,QAAM,EAAE,UAAU;AAClB,QAAM,CAAC,gBAAgB,qBAAqB,6BAAS;AAErD,QAAM,eAAe,KAAK,IAAI,mBAAmB,QAAQ;AAEzD,QAAM,gBAAgB,MAAM,kBAAkB,CAAC,SAAS,CAAC;AAEzD,SACE,oCAAC,OAAD,MACE,oCAAC,YAAD;AAAA,IAAY,SAAS;AAAA,MACrB,oCAAC,SAAD;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,KAEV,oCAAC,cAAD,MACG,MAAM,IAAI,CAAC,MACV,oCAAC,MAAD;AAAA,IAAI,KAAK,EAAE;AAAA,KACT,oCAAC,UAAD;AAAA,IACE,MAAM;AAAA,IACN,QAAQ,aAAa,EAAE;AAAA,IACvB,SAAS;AAAA;AAAA;AAUzB,IAAM,mBAAkB,mCAAO;AAAA,WACpB,IAAI;AAAA;AAAA,4BAEa,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAOjD,IAAM,iBAAiB,wCAAO;AAAA,WACnB,IAAI;AAAA,YACH,IAAI;AAAA;AAGhB,IAAM,eAAe,mCAAO;AAAA;AAAA;;;AD7D5B,IAAM,iBAAmC;AAAA,EACvC,EAAE,MAAM,IAAI,OAAO,QAAQ,IAAI;AAAA,EAC/B,EAAE,MAAM,IAAI,OAAO,eAAe,IAAI;AAAA,EACtC,EAAE,MAAM,IAAI,OAAO,cAAc,IAAI;AAAA;AAGhC,IAAM,aAAa,CAAC,EAAE,cAAoC;AAC/D,SAAO,UACL,oCAAC,aAAD;AAAA,IAAa,OAAO;AAAA,OAEpB,oCAAC,cAAD,MACG,eAAe,IAAI,CAAC,EAAE,OAAO,SAC5B,oCAAC,MAAD;AAAA,IAAI,KAAK;AAAA,KACP,oCAAC,wBAAD;AAAA,IAAS;AAAA,KAAS,UAAU,SAAS,YAAY;AAAA;AAO3D,IAAM,eAAe,mCAAO;AAAA;AAAA;AAAA,SAGnB,IAAI;AAAA;AAAA;AAAA;AAAA,MAIP,gCAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMD,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AdpC/B,IAAM,SAAS,MAAM;AAC1B,QAAM,EAAE,uBAAuB;AAC/B,QAAM,EAAE,UAAU;AAClB,QAAM,cAAc,MAAM;AAC1B,QAAM,aAAa,MAAM;AAEzB,SACE,oCAAC,eAAD,MACG,mBACC,CAAC,EAAE,UAAU,mBAAmB,UAC9B,SACE,oCAAC,oBAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA;AAAA,IAEb,cAAc;AAAA,KAEd,oCAAC,YAAD;AAAA,IAAY,SAAS;AAAA,MACrB,oCAAC,eAAD;AAAA,IAAe,SAAS;AAAA;AAAA;AAQtC,IAAM,gBAAe,mCAAO;AAAA;AAAA;AAAA,YAGhB,IAAI;AAAA;AAGhB,IAAM,qBAAoB,wCAAO,cAAE;AAAA;AAAA;AAAA,6BAGN,CAAC,EAAE,YAAY,MAAM;AAAA,IAC9C,CAAC,EAAE,mBACH,eACI;AAAA,qBACa,IAAI;AAAA,MAEjB;AAAA,qBACa,IAAI;AAAA,oBACL,IAAI;AAAA;AAAA;AAAA;AAAA;;;AFzCjB,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,MAEnB,oCAAC,YAAD,MACG,iBACC,oCAAC,OAAD;AAAA,EAAK,OAAO,EAAE,MAAM;AAAA,GAClB,oCAAC,QAAD,QAGJ,oCAAC,iBAAD,MAAkB,WACjB,oBACC,oCAAC,OAAD;AAAA,EAAK,OAAO,EAAE,MAAM;AAAA,GAClB,oCAAC,WAAD;AAMR,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQzB,IAAM,kBAAkB,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;;;AJhC/B,qBAAuB;AAOhB,IAAM,MAAM,MAAM;AACvB,QAAM,QAAQ;AAEd,QAAM,CAAC,eAAe,oBAAoB,6BAAS;AACnD,QAAM,CAAC,kBAAkB,uBAAuB,6BAAS;AAEzD,SACE,oCAAC,0CAAD;AAAA,IAAe;AAAA,KACb,oCAAC,eAAD,MACE,oCAAC,UAAD,MACE,oCAAC,WAAD;AAAA,IACE;AAAA,IACA;AAAA,KAEA,oCAAC,uBAAD;AAAA,IACE,SAAS;AAAA,MACP,eAAe;AAAA,MACf,kBAAkB;AAAA;AAAA;AAAA;;;ADjB3B,IAAM,OAAqB,MAAM;AACtC,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA;AAAA;AAId,wBAA+B;AAC7B,SAAO,sBAAK;AAAA,IACV,KAAK;AAAA,MACH,UAAU,QAAQ,IAAI;AAAA,MACtB,SAAS,QAAQ,IAAI;AAAA,MACrB,WAAW,QAAQ,IAAI;AAAA,MACvB,uBAAuB,QAAQ,IAAI;AAAA;AAAA;AAAA;AASzC,IAAM,WAAW,CAAC,EAAE,eAA8B;AAChD,QAAM,OAAO;AAEb,SACE,oCAAC,QAAD;AAAA,IAAM,MAAK;AAAA,KACT,oCAAC,QAAD,MACE,oCAAC,qBAAD,OACA,oCAAC,sBAAD,OACC,OAAO,aAAa,cAAc,eAAe,OAEpD,oCAAC,QAAD,MACG,UACD,oCAAC,UAAD;AAAA,IACE,yBAAyB;AAAA,MACvB,QAAQ,gBAAgB,KAAK,UAAU,KAAK;AAAA;AAAA,MAGhD,oCAAC,kCAAD,OACA,oCAAC,wBAAD,OACA,oCAAC,2BAAD;AAAA;AAMO,sBAAsB;AACnC,SACE,oCAAC,UAAD,MACE,oCAAC,uBAAD;AAAA,IACE,WAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAM;AAAA,KAEN,oCAAC,KAAD;AAAA;AAOD,yBAAyB;AAC9B,QAAM,SAAS;AAEf,MAAI;AACJ,UAAQ,OAAO;AAAA,SACR;AACH,gBACE,oCAAC,KAAD,MAAG;AAKL;AAAA,SACG;AACH,gBACE,oCAAC,KAAD,MAAG;AAEL;AAAA;AAGA,YAAM,IAAI,MAAM,OAAO,QAAQ,OAAO;AAAA;AAG1C,SACE,oCAAC,OAAD,MACE,oCAAC,MAAD,MACG,OAAO,QAAO,MAAG,OAAO,aAE1B;AAAA;AAKA,uBAAuB,EAAE,SAA2B;AACzD,SACE,oCAAC,OAAD,MACE,oCAAC,KAAD,MAAG,yCAAsC,MAAM;AAAA;;;AyBlHrD;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;;;ACAA;AAEO,0BACL,QAAQ,IAMR;AACA,QAAM,QAAuB,MAAM;AAEnC,SAAO;AAAA,IACL,QAAc;AACZ,YAAM,SAAS;AAAA;AAAA,IAEjB,YAAY,IAAoB;AAC9B,aAAO,MAAM,UAAU,CAAC,WAAU,OAAO,kCAAQ;AAAA;AAAA,IAEnD,MAAM,OAAqB;AACzB,YAAM,QAAQ,MAAM,OAAO,OAAO,GAAG;AAAA;AAAA,UAEjC,IAAI,IAAY,UAA6C;AACjE,UAAI,cAAc,KAAK,YAAY;AACnC,UAAI,cAAc,IAAI;AACpB,aAAK,MAAM;AACX,eAAO,MAAM,GAAG;AAAA;AAGlB,YAAM,OAAO,MAAM;AAInB,oBAAc,KAAK,YAAY;AAC/B,UAAI,cAAc,IAAI;AACpB,aAAK,MAAM;AACX,eAAO,MAAM,GAAG;AAAA;AAGlB,YAAM,QAAQ,CAAC,IAAI;AACnB,YAAM,SAAS;AAEf,aAAO;AAAA;AAAA;AAAA;;;ADnCN,IAAM,4BAA4B;AAClC,IAAM,mBAAmB;AAEzB,sBACL,cAAsB,kBACtB,QAAgB,2BACF;AACd,QAAM,aAAa,UAAU,IAAI,OAAO,iBAAyB;AAEjE,SAAO;AAAA,UACC,KAAK,KAAa,MAAwB;AAC9C,YAAM,MAAM,MAAM,KAAK,IAAI,KAAK;AAEhC,YAAM,YAAY,YAAY;AAC5B,YAAI;AACJ,YAAI;AAEJ,YAAI;AACF,qBAAW,MAAM,MAAM;AAAA,iBAChB,GAAP;AACA,gBAAM,IAAI,MAAM,uBAAkB;AAAA;AAGpC,YAAI;AACF,iBAAO,MAAM,SAAS;AAAA,iBACf,GAAP;AACA,gBAAM,IAAI,MAAM,qCAAgC;AAAA;AAGlD,eAAO;AAAA;AAGT,aAAO,0CAAY,IAAI,KAAK,eAAc;AAAA;AAAA,UAEtC,IAAI,KAAa,MAAwB;AAC7C,YAAM,MAAM,YAAY,QAAQ,WAAW;AAC3C,UAAI,CAAC,MAAM;AACT,eAAO,IAAI,QAAQ,YAAY;AAAA;AAEjC,UAAI,CAAC,KAAK,WAAW,MAAM;AACzB,eAAO,IAAI;AAAA;AAEb,aAAO,IAAI,QAAQ,YAAY;AAAA;AAAA;AAAA;;;AD9CrC,IAAM,OAAO;AAEN,IAAM,0BAA0B,OACrC,QACuB;AACvB,QAAM,YAAa,MAAM,QAAQ,WAC/B,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,CAAC,MAAM,kBAAkB;AAG5D,QAAM,qBAAqB,UAAU,OACnC,CAAC,MAAM,EAAE,WAAW;AAGtB,QAAM,sBAAsB,mBAAmB,IAAI,CAAC,MAAM,EAAE;AAE5D,SAAO,IAAI,IAAI,CAAC,MAAM;AACpB,UAAM,aAAa,oBAAoB,KACrC,CAAC,EAAE,cAAc,EAAE,WAAW;AAEhC,QAAI,YAAY;AACd,aAAO;AAAA;AAET,WAAO;AAAA;AAAA;AAIJ,IAAM,oBAAoB,OAAO,MAAiC;AAEvE,QAAM,OAAO,MAAM,KAAK,KAAK,EAAE;AAE/B,SAAO,kCACF,IACA;AAAA;;;AGnCP;AA6CA,IAAM,MAAM,OAAO;AAEnB,IAAM,mBAAmB,OAAO,UAAkB;AAChD,MAAI,CAAC,QAAQ,IAAI,cAAc;AAC7B,UAAM,IAAI,MAAM;AAAA;AAGlB,QAAM,OAAY,EAAE;AAEpB,SAAO,MAAM,QAAQ,IAAI,cAAc;AAAA,IACrC,MAAM,KAAK,UAAU;AAAA,IACrB,SAAS,EAAE,gBAAgB;AAAA,IAC3B,QAAQ;AAAA;AAAA;AAIZ,IAAM,iBAAiB,CAAC,aAAkD;AACxE,QAAM,OAAO,KAAK,QAAQ;AAE1B,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA;AAGT,QAAM,YAAY,SAAS,WAAW,SAAS,UAAU;AAEzD,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,SACF;AACL,WAAO;AAAA;AAAA;AAIX,IAAM,gBAAgB,CAAC,aAAsC;AAC3D,QAAM,EAAE,IAAI,KAAK,KAAK,UAAU,QAAQ,SAAS,WAAW,aAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,SAAS;AAAA,IACnB;AAAA,IACA;AAAA,IACA,QAAQ,eAAe;AAAA,IACvB,WAAW,UAAU;AAAA,IACrB;AAAA;AAAA;AAIG,IAAM,yBAAyB,OACpC,iBACuB;AAhGzB;AAiGE,QAAM,aAAa,GAAG,QAAQ,IAAI,yBAAyB;AAE3D,MAAI;AACF,UAAM,cAAc,MAAM,iBACxB;AAAA;AAAA,0BAEoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBtB,UAAM,SAAU,MAAM,YAAY;AAElC,QAAI,aAAO,WAAP,mBAAe,QAAQ;AACzB,YAAM,MAAM,OAAO,OAAO;AAC1B,cAAQ,MAAM;AACd,YAAM,IAAI,MAAM,IAAI;AAAA;AAGtB,QAAI,CAAC,OAAO,KAAK,UAAU;AACzB,aAAO;AAAA;AAGT,WAAO,OAAO,KAAK,SAAS,UAAU,IAAI;AAAA,WACnC,KAAP;AACA,UAAM,IAAI,SACR,oEACA,EAAE,QAAQ,KAAK,YAAY;AAAA;AAAA;AAK1B,IAAM,iBAAiB,YAAgC;AAlJ9D;AAmJE,MAAI;AACF,UAAM,cAAc,MAAM,iBACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBF,UAAM,SAAU,MAAM,YAAY;AAElC,QAAI,aAAO,WAAP,mBAAe,QAAQ;AACzB,YAAM,MAAM,OAAO,OAAO;AAC1B,cAAQ,MAAM;AACd,YAAM,IAAI,MAAM,IAAI;AAAA;AAGtB,QAAI,CAAC,OAAO,KAAK,WAAW;AAC1B,aAAO;AAAA;AAGT,WAAO,OAAO,KAAK,UAAU,IAAI;AAAA,WAC1B,KAAP;AACA,UAAM,IAAI,SACR,oEACA,EAAE,QAAQ,KAAK,YAAY;AAAA;AAAA;AAK1B,IAAM,eAAe,OAC1B,YACiC;AAnMnC;AAoME,MAAI;AACF,UAAM,cAAc,MAAM,iBACxB;AAAA;AAAA,0BAEoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBtB,UAAM,SAAU,MAAM,YAAY;AAElC,QAAI,aAAO,WAAP,mBAAe,QAAQ;AACzB,YAAM,MAAM,OAAO,OAAO;AAC1B,cAAQ,MAAM;AACd,YAAM,IAAI,MAAM,IAAI;AAAA;AAGtB,QAAI,CAAC,OAAO,KAAK,UAAU;AACzB,aAAO;AAAA;AAGT,WAAO,cAAc,OAAO,KAAK;AAAA,WAC1B,KAAP;AACA,UAAM,IAAI,SACR,oEACA,EAAE,QAAQ,KAAK,YAAY;AAAA;AAAA;;;AJzO1B,IAAM,UAAyB,OAAO,EAAE,cAAc;AAC3D,QAAM,EAAE,iBAAiB,IAAI,IAAI,QAAQ;AACzC,QAAM,eAAe,aAAa,IAAI;AAEtC,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,SAAS,2BAA2B;AAAA,MAC5C,QAAQ;AAAA,MACR,YAAY;AAAA;AAAA;AAIhB,QAAM,wBAAwB,MAAM,uBAAuB;AAE3D,SAAO,wBAAwB;AAAA;;;AKjBjC;AAAA;AAAA;AAAA;AAAA;AACA,mBAAqB;;;ACDrB;AACA,8BAAuB;AAMvB,IAAI;AAEJ,IAAM,sBAAsB,QAAQ,IAAI;AAExC,IAAI,CAAC,qBAAqB;AACxB,QAAM,IAAI,MAAM;AAAA;AAGlB,IAAM,oBAAoB,OAAO,KAAK,qBAAqB,SAAS;AAEpE,IAAM,SAAkB;AAAA,EACtB,KAAK;AAAA,EACL,SAAS,EAAE,eAAe,SAAS;AAAA;AAGrC,IAAI,OAAuC;AACzC,UAAO,oCAAO;AAAA,OACT;AACL,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,SAAS,oCAAO;AAAA;AAEzB,UAAO,OAAO;AAAA;;;ADhBhB,IAAM,sBAAsB;AAErB,IAAM,SAAyB,OAAO,EAAE,cAAc;AAd7D;AAeE,QAAM,OAAO,MAAM,QAAQ;AAE3B,MAAI,CAAC,KAAK,IAAI,sBAAsB;AAClC,WAAO,IAAI,SAAS,sCAAsC,EAAE,QAAQ;AAAA;AAGtE,QAAM,uBAAuB,YAAK,IAAI,yBAAT,mBAA+B,eAAc;AAC1E,QAAM,iBAAiB,KAAK,MAC1B;AAGF,QAAM,iBAAiB,eAAe,IAAI,CAAC,EAAE,aAAa,kBAAkB;AAC1E,UAAM,kBAAkB,KAAK,UAAU;AAAA,MACrC,KAAK;AAAA,MACL,QAAQ;AAAA;AAGV,WAAO,MAAK,IAAI;AAAA;AAGlB,MAAI;AACF,UAAM,aAAa,MAAM,QAAQ,IAAI;AAErC,UAAM,eAAe,WAAW,OAAO,CAAC,OAAM,WAAW,UAAU;AACjE,YAAM,gBAAgB,eAAe;AACrC,YAAK,cAAc,WAAW,UAAU,IAAI;AAC5C,aAAO;AAAA,OACN;AAEH,WAAO,uBAAK;AAAA,WACL,KAAP;AACA,YAAQ,MAAM;AACd,UAAM,IAAI,SACR,yDACA,EAAE,QAAQ;AAAA;AAAA;;;AEjDhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsB;AACtB,qBAAoC;AACpC,mBAAqB;AAErB,qBAA0C;AAC1C,iCAAmB;;;ACLnB;AACA,qBAA0B;AAC1B,kBAAkB;AAClB,qBAAiC;AACjC,iCAAmB;AAUZ,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,EAChB,aAAa;AAAA,MACO;AACpB,QAAM,EAAE,uBAAuB;AAC/B,QAAM,EAAE,kBAAkB,kBAAkB;AAE5C,gCAAU,MAAM;AACd,qBAAiB,CAAC;AAElB,kBAAc,CAAC;AAAA,KACd,CAAC,eAAe,YAAY,kBAAkB;AAEjD,SAAO,mBACL,CAAC,EAAE,UAAU,mBAAmB,UAC9B,SACE,oCAAC,oBAAD;AAAA,IACE,OAAO,EAAE,SAAS,UAAU,WAAW;AAAA,KAEvC,oCAAC,iBAAD,MAAiB;AAAA;AAM3B,IAAM,qBAAoB,wCAAO,cAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,IAAM,kBAAiB,mCAAO;AAAA;AAAA;AAAA;AAAA;;;AChD9B;AAAA,qBAAuC;AACvC,oBAA2B;AAC3B,qBAAsB;AACtB,uBAAwC;AACxC,qBAA2B;AAC3B,iCAAmB;;;;;;;;;ACLnB;AAAA,uBAAmB;AACnB,iCAAmB;;;ACDnB;AAAA,uBAA8C;AAC9C,qBAA4B;AAC5B,iCAAmB;AAaZ,IAAM,iBAAiB,CAAC;AAAA,EAC7B,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,MACyB;AACzB,QAAM,cAAc,gCAAY,MAAM;AACpC,aAAS;AAAA,KACR,CAAC,OAAO;AAEX,SACE,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,UAAU;AAAA,KACrB,YAAY,oCAAC,KAAD;AAAA,IAAK;AAAA,MAClB,oCAAC,kBAAD;AAAA,IACE,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,KAEA,oCAAC,QAAD,MAAO,QAAQ;AAAA;AAMvB,IAAM,MAAM,mCAAO;AAAA;AAAA;AAAA;AAAA,IAIf,CAAC,EAAE,gBACH,cAAc,eACV;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,gBAIQ,CAAC,EAAE,YAAY,MAAM;AAAA;AAGrC,IAAM,mBAAmB,wCAAO;AAAA,mBAIb;AAAA,IACf,CAAC,EAAE,UAAU,OAAO,WAAW,WAAW;AAAA,aACjC;AAAA,cACC;AAAA,aACD,MAAM;AAAA,MACb,gCAAU,YAAY,UAAU;AAAA;AAAA;AAAA,oBAGlB,MAAM;AAAA;AAAA,MAGpB,YACA;AAAA;AAAA,mBAEa,MAAM;AAAA;AAAA;AAAA;AAAA;;;AC/EzB;AAAA,uBAA6B;AAC7B,qBAAqB;AACrB,iCAAmB;AAOZ,IAAM,sBAAsB,yBAAK,8BAA6B;AAAA,EACnE,eAAe;AAAA,EACf;AAAA,GAC2B;AAC3B,SACE,oCAAC,YAAD;AAAA,IAAW;AAAA,IAA4B;AAAA,KACrC,oCAAC,oBAAD;AAAA;AAKN,IAAM,aAAY,mCAAO;AAAA;AAAA;AAAA;AAAA,IAIrB,CAAC,EAAE,WAAW;AAAA,aACL;AAAA,cACC;AAAA;AAAA,sBAEQ,CAAC,EAAE,mBAAoB,eAAe,IAAI;AAAA;AAGhE,IAAM,qBAAqB,wCAAO;AAAA,WACvB,CAAC,EAAE,YAAY,MAAM,wBAAwB,MAAM;AAAA;;;AF3B9D,yBACE,OACA,UACA,gBACU;AAEV,QAAM,oBAAoB,iBAAiB,IAAI;AAC/C,QAAM,MAAM,CAAC,GAAG,MAAM,QAAQ,IAAI,CAAC,GAAG,MAAM;AAM5C,QAAM,mBACJ,iBAAiB,MAAM,IAAI,iBAAiB,iBAAiB;AAE/D,MAAI,IAAI,UAAU,mBAAmB;AACnC,WAAO;AAAA;AAGT,QAAM,QAAQ;AACd,QAAM,OAAO,IAAI,SAAS;AAC1B,QAAM,eAAe,KAAK,MAAM,iBAAiB;AACjD,QAAM,cAAc,OAAO;AAC3B,QAAM,WACJ,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,WAAW,UAK7C,eAAc,eAAe,eAAe,cAAc;AAC7D,QAAM,WAAW,mBAAmB;AAEpC,MAAI,iBAAiB,KAAK,IAAI,IAAI,QAAQ,WAAW;AACrD,MAAI,iBAAiB,KAAK,IAAI,IAAI,QAAQ,WAAW;AAErD,QAAM,QAAQ;AAEd,QAAM,KAAK,GAAG,IAAI,MAAM,gBAAgB,iBAAiB;AAGzD,MAAI,oBAAoB,OACtB,qBAAqB;AAEvB,MAAI,iBAAiB,QAAQ,GAAG;AAC9B,UAAM,QAAQ;AACd,wBAAoB;AAAA;AAEtB,MAAI,iBAAiB,OAAO,GAAG;AAC7B,UAAM,KAAK;AACX,yBAAqB;AAAA;AAIvB,MAAI,kBAAkB,QAAQ,GAAG;AAC/B,UAAM,QAAQ,IAAI;AAAA;AAEpB,MAAI,kBAAkB,OAAO,GAAG;AAC9B,UAAM,KAAK,IAAI,IAAI,SAAS;AAAA;AAG9B,QAAM,eAAe,oBAAoB,MAAM;AAQ/C,MAAI,eAAe,KAAK,CAAE,sBAAqB,qBAAqB;AAClE,QAAI,mBAAmB;AACrB,YAAM,OACJ,GACA,GACA,GAAG,IAAI,MAAM,iBAAiB,cAAc;AAAA,WAEzC;AACL,YAAM,OACJ,MAAM,SAAS,GACf,GACA,GAAG,IAAI,MAAM,iBAAiB,GAAG,iBAAiB,eAAe;AAAA;AAAA;AAKvE,SAAO;AAAA;AAcF,IAAM,aAAa,CAAC;AAAA,EACzB,YAAY;AAAA,EACZ;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,MACqB;AACrB,QAAM,QAAQ,gBAAgB,OAAO,UAAU;AAC/C,QAAM,eAAe,cAAc;AAEnC,SACE,oCAAC,aAAD;AAAA,IAAW;AAAA,IAA4B;AAAA,KACpC,MAAM,IAAI,CAAC,WAAW,MACrB,cAAc,KACZ,oCAAC,qBAAD;AAAA,IACE;AAAA,IACA,KAAK,aAAa;AAAA,IAClB;AAAA,OAGF,oCAAC,gBAAD;AAAA,IACE,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,UAAU,aAAa;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAQZ,IAAM,cAAY,mCAAO;AAAA;AAAA,oBAEL,CAAC,EAAE,mBAAoB,eAAe,QAAQ;AAAA,SACzD,CAAC,EAAE,gBAAiB,YAAY,IAAI,GAAG,IAAI;AAAA;;;AGhJpD;AAAA,sBAA4B;AAC5B,qBAAsB;;;ACDtB;AAAA,qBAAsB;AAGf,IAAM,gBAAgB,CAAC,aAC5B,qBAAM,GAAG,SAAS,OAAO,YAAY,UAAU,GAAG;;;AD0BpD,IAAM,gBAAwC;AAAA,EAC5C,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,cAAc;AAAA;AAGhB,IAAM,0BAA0B,iCAAY,uBAC1C,eACA;AAAA,EACE,UAAU,EAAE,SAAS;AAAA,GAGtB,cAAc,CAAC,KAAK,QAAS;AAAA,EAC5B,0BAA0B,CAAC,KAAa,YAAuB;AAC7D,UAAM,eAAe,IAAI,qBAAM,UAAU;AACzC,UAAM,cAAc,aAAa,UAAU,OACzC,CAAC,MAAM,EAAE,SAAS;AAGpB,UAAM,MAAM,YACT,OAAO,CAAC,MAAM,CAAC,EAAE,UACjB,IAAI,CAAC,MAAM;AACV,YAAM,UAAU,cAAc;AAC9B,aAAO;AAAA,QACL,UAAU,EAAE,OAAO;AAAA,QACnB,aAAa,EAAE,OAAO;AAAA,QACtB;AAAA,QACA,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY;AAAA;AAAA;AAI/C,QAAI,oBAAoB;AAAA;AAAA,EAE1B,YAAY,MAAM;AAChB,UAAM,iBAAiB,IAAI;AAC3B,UAAM,MAAM,IAAI;AAEhB,QAAI,WAAW,KAAK,IAAI,IAAI,SAAS,GAAG,iBAAiB;AAAA;AAAA,EAE3D,YAAY,MAAM;AAChB,UAAM,iBAAiB,IAAI;AAC3B,QAAI,WAAW,KAAK,IAAI,GAAG,iBAAiB;AAAA;AAAA,EAE9C,qBAAqB,CAAC,SAAiB,gBAAwB;AA3EnE;AA4EM,UAAM,yBAAyB,IAAI;AAEnC,QAAI,8BAAuB,aAAvB,mBAAiC,iBAAgB,aAAa;AAChE;AAAA;AAIF,QAAI,CAAC,eAAe,uBAAuB,eAAe,UAAU;AAClE,YAAM,wBAAwB,mBAAK;AACnC,aAAO,sBAAsB;AAC7B,UAAI,mBAAmB;AAEvB;AAAA;AAIF,QAAI,mBAAmB,iCAClB,yBADkB;AAAA,OAEpB,UAAU,iCACN,uBAAuB,WADjB;AAAA,QAET;AAAA;AAAA;AAAA;AAAA,IAKP,cAAc,CAAC,KAAK,QAAS;AAAA,EAC5B,mBAAmB,CAAC,gBAAwB;AAC1C,UAAM,aAAa,IAAI;AACvB,UAAM,gBAAgB,IAAI,sBAAsB;AAChD,UAAM,4BACJ,IAAI,qBAAqB,cAAc;AACzC,UAAM,gBAAgB,IAAI;AAC1B,UAAM,iBAAiB,wEAA2B,gBAAe;AACjE,UAAM,iBAAiB,GAAG,eAAe,MACvC,GACA,mBACI,gBAAgB,eAAe,MAAM;AAE3C,QAAI,oBAAoB,cAAc,SAAS;AAG/C,eAAW,MAAM,IAAI,aAAa,OAAO;AACzC,eAAW,MAAM,IAAI,aAAa,QAAQ;AAAA;AAAA,IAG7C,gBAAgB,CAAC,GAAG,QAAS;AAAA,EAC5B,uBAAuB,MAAM,OAAO,KAAK,IAAI,sBAAsB;AAAA;AAGhE,IAAM,6BAA6B,wBAAwB;AAC3D,IAAM,YAAY,wBAAwB;AAC1C,IAAM,WAAU,wBAAwB;;;AE/H/C;AAAA,qBAA4B;AAC5B,qBAAsB;AACtB,oBAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvC,IAAM,YAAY;AAEH,6BAA6B;AAC1C,QAAM,CAAC,EAAE,UAAU;AACnB,QAAM,kBAAkB,+BAAY;AAAA,IAClC,eAAe,OAAO,IAAI;AAAA,IAC1B,mBAAmB;AAAA,IACnB,kBAAkB;AAAA;AAGpB,QAAM,gBAAgB,gCACpB,OAAO,QAAkB,MAAgB,SAAmB;AAC1D,UAAM,KAAK,MAAM,gBAAgB,cAC/B,QACA,MACA,KAAK,IAAI,CAAC,QAAQ,qBAAM,QAAQ,qBAAM,YAAY,QAClD,EAAE,UAAU;AAEd,UAAM,GAAG;AAAA,KAEX,CAAC;AAGH,SAAO,EAAE;AAAA;;;AC5BX;AAAA,uBAA2D;AAC3D,qBAAkE;AAElE,iCAAmB;;;ACHnB;AAAA,uBAOO;AACP,qBAA4C;AAC5C,kBAA6B;AAC7B,iCAAmB;;;ACVnB;AAAA,uBAAmB;AACnB,iCAAmB;AAQZ,IAAM,QAAQ,CAAC,EAAE,aAAa,SAAS,SAC5C,oCAAC,aAAD,MACE,oCAAC,OAAD,MAAM,cACL,OAAO,UACN,oCAAC,qBAAD,MACE,oCAAC,OAAD,MAAK,eACL,oCAAC,MAAD,MACG,OAAO,IAAI,CAAC,EAAE,MAAM,cAAc,2BAAa,WAC9C,oCAAC,WAAD;AAAA,EAAW,KAAK;AAAA,GACd,oCAAC,QAAD,MAAO,MAAK,MACZ,oCAAC,QAAD,MACG,KAAK,YAAW,QAChB,gBAAgB,oCAAC,QAAD,MAAM,gBAGzB,oCAAC,OAAD,MAAM,eACL,gBAAgB,oCAAC,QAAD,MAAM,aAAU;AAS/C,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA,SAGhB,IAAI;AAAA;AAAA;AAAA,aAGA,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAIlC,IAAM,sBAAsB,mCAAO;AAAA;AAAA,aAEtB,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA,mBAIf,IAAI;AAAA;AAAA;AAAA;AAAA,mBAIJ,IAAI;AAAA;AAAA;AAIvB,IAAM,YAAY,mCAAO;AAAA;AAAA,aAEZ,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADzC3B,IAAM,kBAAkB,CAAC,EAAE,IAAI,QAAQ,4BAAiC;AAC7E,QAAM,QAAQ;AACd,QAAM,aAAa,2BAA8B;AACjD,QAAM,gBAAgB,2BAAO;AAC7B,QAAM,UAAU,2BAAO;AACvB,QAAM,CAAC,QAAQ,aAAa,6BAAS;AAErC,QAAM,EAAE,iBAAiB,2BAAU;AAAA,IACjC,MAAM,EAAE,cAAc;AAAA,IACtB,IAAI,EAAE,cAAc,OAAO;AAAA,IAC3B,WAAW,CAAC;AAAA;AAGd,QAAM,eAAe,MAAM;AACzB,cAAU,CAAC,eAAe,CAAC;AAAA;AAG7B,QAAM,eAAe,MAAM;AACzB,QAAI,WAAW,SAAS;AACtB,oBAAc,UAAU,WAAW,QAAQ;AAAA;AAAA;AAI/C,QAAM,mBAAmB,CAAC,YAA4B;AACpD,eAAW,UAAU;AACrB;AAAA;AAIF,gCAAU,cAAc,CAAC,QAAQ;AAGjC,gCAAU,MAAM;AACd,YAAQ,UAAU;AAAA,KACjB;AAEH,SACE,oCAAC,aAAD,MACE,oCAAC,cAAE,KAAH;AAAA,IACE,OAAO;AAAA,MACL,cAAc;AAAA,MACd,iBAAiB,aAAa,GAAG,CAAC,MAChC,MAAM,eAAe,MAAM;AAAA;AAAA,KAI/B,oCAAC,qBAAD;AAAA,IAAqB,SAAS,MAAM,MAAM;AAAA,KAAK,QAC/C,oCAAC,aAAD;AAAA,IAAa,SAAS;AAAA,KACpB,oCAAC,eAAD,MACE,oCAAC,OAAD,MACE,oCAAC,cAAE,KAAH;AAAA,IACE,OAAO;AAAA,MACL,WAAW,aAAa,GAAG,CAAC,MAAM,UAAU,IAAI;AAAA,MAChD,iBAAiB;AAAA,MACjB,aAAa,MAAM;AAAA;AAAA,KAGrB,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA;AAAA,KAGlB,oCAAC,4BAAD;AAAA,IAAW,MAAK;AAAA,SAItB,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,WAAW;AAAA,KAAM,GAAG,SAGtC,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,UAAU;AAAA;AAAA,KAGZ,oCAAC,oBAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,wBAAwB;AAAA,MACxB,yBAAyB;AAAA,MACzB,iBAAiB,aAAa,GAAG,CAAC,MAChC,MAAM,eAAe,MAAM;AAAA,MAE7B,QAAQ,aAAa,GAAG,CAAC,MAAM,GAAG,IAAI,cAAc;AAAA;AAAA,KAGtD,oCAAC,OAAD;AAAA,IAAK,KAAK;AAAA,IAAkB,OAAO,EAAE,SAAS,GAAG,YAAY;AAAA,KAC3D,oCAAC,OAAD;AAAA,IAAO,aAAa,GAAG;AAAA,IAAa,QAAQ,GAAG;AAAA;AAAA;AAS7D,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAKzB,IAAM,cAAc,mCAAO;AAAA;AAAA;AAAA;AAK3B,IAAM,gBAAgB,mCAAO;AAAA;AAAA;AAAA;AAAA,YAIjB,IAAI;AAAA,iBACC,MAAM;AAAA,WACZ,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA,IAE5B,gCAAU;AAAA;AAGd,IAAM,qBAAoB,wCAAO,cAAE;AAAA;AAAA;AAAA;AAAA;AAMnC,IAAM,sBAAsB,wCAAO;AAAA;AAAA;AAAA;AAAA,WAIxB,CAAC,EAAE,YAAY,MAAM,KAAK,MAAM;AAAA;AAAA,IAEvC,gCAAU;AAAA;AAAA;AAAA,aAGD,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;;;AExJlC;AAoBO,IAAM,mBAAqC;AAAA,EAChD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA,MAEhB;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,cAAc;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA;AAAA;AAAA;AAAA,EAIR;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAInB;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA,MAEhB;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA,MAEhB;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,cAAc;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,MAEf;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,cAAc;AAAA;AAAA;AAAA;AAAA;;;AH3JtB,uBAAoC;AAUpC,IAAM,qBAAqB,CAAC,OAA+B;AAnB3D;AAoBE,QAAM,SAAS,SAAG,WAAH,mBAEX,OAAO,CAAC,MAAM,EAAE,iBAAiB,QAClC,IAAI,CAAC,MAAM,GAAG,uCAAsB,EAAE,QACtC,KAAK;AAER,SAAO,GAAG,GAAG,QAAQ;AAAA;AAGhB,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,MAGI;AACJ,QAAM,SAAS;AACf,QAAM,CAAC,SAAS,cAAc,6BAAS;AACvC,QAAM,CAAC,YAAY,iBAAiB,6BAAS;AAC7C,QAAM,0BAA0B,4BAC9B,MACE,iBAAiB,OAAO,CAAC,OACvB,GAAG,KAAK,cAAc,SAAS,WAAW,iBAE9C,CAAC;AAGH,QAAM,oBAAoB,gCAAY,CAAC,OAAuB;AAC5D,aAAQ,kBAAkB,mBAAmB;AAC7C,eAAW;AAAA,KACV;AAEH,QAAM,yBAAyB,gCAA+B,CAAC,MAAM;AACnE,MAAE;AAAA,KACD;AAEH,gCAAU,MAAM;AACd,QAAI,CAAC,SAAS;AAEZ,iBAAW,MAAM,cAAc,KAAK;AAAA;AAAA,KAErC,CAAC;AAEJ,SACE,oCAAC,OAAD;AAAA,IAAK,SAAS;AAAA,KACZ,oCAAC,yBAAD;AAAA,IACE,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM,oCAAC,2BAAD;AAAA,IACN,SAAS,MAAM,WAAW;AAAA,MAE5B,oCAAC,0BAAD;AAAA,IACE,WAAW;AAAA,IACX;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,SAAS,MAAM,WAAW;AAAA,KAE1B,oCAAC,gBAAD,MACE,oCAAC,eAAD,MACE,oCAAC,OAAD,MAAK,sBACL,oCAAC,8BAAD;AAAA,IACE,aAAY;AAAA,IACZ,MAAI;AAAA,IACJ,UAAU;AAAA,MAEZ,oCAAC,kBAAD,MACG,wBAAwB,IAAI,CAAC,OAC5B,oCAAC,iBAAD;AAAA,IACE,KAAK,GAAG;AAAA,IACR;AAAA,IACA,OAAO;AAAA;AAAA;AAWzB,IAAM,iBAAiB,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKN,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOvB,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAI/C,IAAM,gBAAgB,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMpB,IAAI;AAAA;AAAA,aAEA,IAAI;AAAA;AAGjB,IAAM,mBAAmB,mCAAO;AAAA;AAAA;AAAA;AAAA,SAIvB,IAAI;AAAA;;;AInIb;AAAA,qBAAuD;;;ACAvD;AAAA,uBAAsC;AAEtC,qBAAyD;AACzD,kBAA6B;AAC7B,iCAAmB;;;ACJnB;AAAA,uBAOO;AACP,iCAAmB;AAOZ,IAAM,WAAW,CAAC;AAAA,EACvB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,MACmB;AACnB,QAAM,WAAW,eAAe,6BAAY;AAC5C,QAAM,WAAW,eAAe,4BAAW;AAC3C,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,OAAO,WAAW;AAE/B,SACE,oCAAC,aAAD;AAAA,IAAW;AAAA,IAAY;AAAA,KACrB,oCAAC,6BAAD;AAAA,IAAY;AAAA,IAAkB,OAAO,OAAO,SAAS;AAAA,KACnD,oCAAC,MAAD;AAAA,IAAM,MAAK;AAAA;AAAA;AAMnB,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA,IAGrB,CAAC,EAAE,cAAc,WACjB,eACI;AAAA,sBACc,IAAI;AAAA,MACpB,OAAO,UAAU,WAAW,MAAM;AAAA,MAEhC;AAAA,gBACQ,OAAO,UAAU,IAAI,0BAAS;AAAA;AAAA;AAAA,WAGnC,CAAC,EAAE,YAAY,MAAM;AAAA,YACpB,IAAI;AAAA;;;AD7BhB,IAAM,eAAe,EAAE,OAAO,GAAG,QAAQ;AAElC,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc,IAAI;AAAA,EAClB;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,MACC;AACnB,QAAM,CAAC,eAAe,oBAAoB,6BAAS,mBAAK;AACxD,QAAM,YAAY,2BAAO;AACzB,QAAM,EAAE,OAAO,OAAO;AACtB,QAAM,eAAe,cAAc;AACnC,QAAM,WAAW,cAAc,eAAe,UAAU;AAExD,QAAM,YACJ,mBAAmB,mBAAmB,IAAI,kBAAkB;AAI9D,gCAAU,MAAM;AACd,mBAAe;AAAA,KACd,CAAC,gBAAgB;AAEpB,QAAM,sBAAsB,gCAAY,CAAC,YAAY;AACnD,qBACE,UACI,EAAE,OAAO,QAAQ,aAAa,QAAQ,QAAQ,iBAC9C,mBAAK;AAAA,KAEV;AAEH,gCAAU,MAAM;AACd,QAAI,UAAU,SAAS;AACrB,0BAAoB,UAAU;AAAA;AAAA,KAE/B,CAAC,IAAI;AAER,QAAM,qBAAqB,gCACzB,CAAC,YAAY;AACX,cAAU,UAAU;AACpB,wBAAoB;AAAA,KAEtB,CAAC;AAIH,QAAM,YAAY,gCAChB,CAAC,UAAU;AACT,WAAO,YAAa,YAAW,eAAe;AAAA,KAEhD,CAAC,WAAW,UAAU;AAIxB,QAAM,YAAY,UAAU;AAM5B,QAAM,CAAC,EAAE,GAAG,QAAQ,QAAQ,2BAAU,MAAO;AAAA,IAC3C,GAAG;AAAA,IACH,MAAM,OAAO;AAAA,IACb,WAAW;AAAA,IACX,QAAQ;AAAA;AA6CV,gCAAU,MAAM;AACd,SAAK;AAAA,MACH,GAAG;AAAA,MACH,WAAW;AAAA;AAAA,KAEZ,CAAC,WAAW;AAEf,SACE,oCAAC,aAAD;AAAA,IAAW,KAAK;AAAA,IAAoB;AAAA,KACjC,gBACC,0DACG,WAAW,KACV,oCAAC,UAAD;AAAA,IACE,MAAK;AAAA,IACL,SAAS,MAAM,eAAe,KAAK,IAAI,GAAG,WAAW;AAAA,IACrD;AAAA,MAGH,WAAW,MAAM,SAAS,KACzB,oCAAC,UAAD;AAAA,IACE,MAAK;AAAA,IACL,SAAS,MACP,eAAe,KAAK,IAAI,MAAM,SAAS,GAAG,WAAW;AAAA,IAEvD;AAAA,OAMR,oCAAC,oBAAD;AAAA,IAME,eAAe;AAAA,IACf,OAAO;AAAA,MACL,WAAW,EAAE,GACX,CAAC,OACC,eACE,eAAe,GAAG,MAAK,cAAc,MAAM,MAAK;AAAA;AAAA,KAKvD,MAAM,IAAI,CAAC,MAAM,MAChB,oCAAC,uBAAD;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,MACL,SAAS,KAAK,GAAG,CAAC,UAAS;AACzB,eAAO,SAAS,KAAK,YAAY,IAAI,WAAW,IAAK,IAAI;AAAA;AAAA;AAAA,IAG7D,UAAU,MAAM;AAAA,IAChB,eAAe;AAAA,IACf,aAAa,cAAc;AAAA,IAC3B,YAAY,cAAc;AAAA,IAC1B,cAAc;AAAA,KAEb;AAAA;AAQb,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzB,IAAM,qBAAoB,wCAAO,cAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ/B,CAAC,UACD,MAAM,gBACF;AAAA;AAAA;AAAA;AAAA,UAKA;AAAA;AAAA;AAAA;AAAA;AAMR,IAAM,wBAAwB,wCAAO,cAAE;AAAA,WAO5B,CAAC,UAAU,MAAM;AAAA,YAChB,CAAC,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA,IAIzB,CAAC,UAAW,MAAM,gBAAgB,gBAAgB,iBAAkB,CAAC;AAAA,EACvE;AAAA,EACA,cAAc;AAAA,MACT,CAAC,WAAW,GAAG,kBAAkB;AAAA;;;AEvPxC;AAAA,uBAA2B;AAC3B,qBAA8C;AAE9C,iCAAmB;;;ACHnB;AAAA,uBAA8B;AAC9B,iCAAmB;AAEnB,oBAAyC;AAElC,IAAM,cAAc,CAAC,EAAE,aAA8C;AAC1E,QAAM,WAAW,4CAAyB;AAE1C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA;AAGT,QAAM,EAAE,MAAM,UAAU;AAExB,SACE,oCAAC,gBAAD;AAAA,IACE;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,KAEpB,oCAAC,OAAD,MACE,oCAAC,MAAD,QAED;AAAA;AAKP,IAAM,iBAAiB,mCAAO;AAAA;AAAA,gBAKd,CAAC,EAAE,cAAe,UAAU,YAAY;AAAA;AAAA;AAAA,sBAGlC,CAAC,EAAE,YAAY;AAAA;AAAA;AAAA;AAAA,mBAIlB,IAAI;AAAA,IACnB,gCAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMD,CAAC,EAAE,YAAY,MAAM;AAAA,wBACV,CAAC,EAAE,YAAY;AAAA,oBACnB,IAAI;AAAA;AAAA;;;ACjDxB;AAAA,uBAAsC;AACtC,qBAAgD;AAEhD,iCAAmB;;;ACHnB;AAAA,qBAAoC;AAK7B,qBAAwB,OAAU,OAAkB;AAEzD,QAAM,CAAC,gBAAgB,qBAAqB,6BAAY;AACxD,gCACE,MAAM;AAEJ,UAAM,UAAU,WAAW,MAAM;AAC/B,wBAAkB;AAAA,OACjB;AAIH,WAAO,MAAM;AACX,mBAAa;AAAA;AAAA,KAGjB,CAAC,OAAO;AAEV,SAAO;AAAA;;;ADNF,IAAM,mBAAmB,+BAI9B,CACE,IASA,QACG;AAVH,eACE;AAAA;AAAA,IACA,WAAW;AAAA,IACX,SAAS,GAAG,KAAK;AAAA,IACjB,WAAW;AAAA,IACX,cAAc;AAAA,IACd;AAAA,MANF,IAOK,kBAPL,IAOK;AAAA,IANH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAKF,QAAM,CAAC,OAAO,YAAY,6BAA6B;AACvD,QAAM,iBAAiB,YAAY,OAAO;AAE1C,gCAAU,MAAM;AACd,QAAI,mBAAmB,QAAW;AAChC,eAAS;AAAA;AAAA,KAEV,CAAC,gBAAgB;AAMpB,gCAAU,MAAM;AACd,aAAS;AAAA,KACR,CAAC;AAEJ,SACE,oCAAC,qBAAD;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO;AAAA,KAC/B;AAAA;AAMZ,iBAAiB,cAAc;AAE/B,IAAM,sBAAsB,mCAAO;AAAA,YAIvB,CAAC,UAAU,MAAM;AAAA,aAChB,IAAI,yBAAQ,MAAM;AAAA,gBACf,CAAC,UAAU,MAAM,MAAM;AAAA,WAC5B,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA,mBAEf;AAAA;AAAA;AAAA;AAAA,IAIf,CAAC,UAAU,gCAAU,MAAM;AAAA;AAAA;AAAA;AAAA,oBAIX,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA,aAG9B,CAAC,UAAU,MAAM,MAAM;AAAA,oBAChB,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA,aAG9B,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASZ,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOvB,CAAC,UAAU,MAAM,MAAM;AAAA;AAAA;;;AFnG/C,wBAA0C;AAQnC,IAAM,qBAAqB,yBAChC,+BACE,CAAC,IAA6D,QAAQ;AAArE,eAAE,qBAAmB,aAAa,kBAAlC,IAAoD,kBAApD,IAAoD,CAAlD,qBAAmB,eAAa;AACjC,QAAM,SAAQ,kBAAkB;AAChC,QAAM,EAAE,QAAQ,WAAW,UAAS;AACpC,QAAM,mBAAmB,UAAU;AAEnC,QAAM,gBAA2D,CAAC,MAAM;AACtE,UAAM,WAAW,EAAE;AACnB,UAAM,OAAO,SAAS;AACtB,UAAM,SAAS,SAAS;AAExB,QAAI,EAAE,SAAS,SAAS,QAAQ,8BAAO,MAAM,SAAS;AACpD,QAAE;AACF,YAAM,CAAC,OAAO,OAAO,yCAAkB,MAAM;AAE7C,eAAS,kBAAkB,OAAO;AAAA;AAAA;AAItC,QAAM,aAAqD,CAAC,MAAM;AAChE,aAAQ,aAAa,EAAE,OAAO;AAAA;AAOhC,QAAM,iBAAiB,gCACrB,CAAC,UAAU;AACT,kBAAc,kBAAkB,SAAS;AAAA,KAE3C,CAAC,eAAe,kBAAkB;AAGpC,SACE,oCAAC,aAAD,MACE,oCAAC,kBAAD,MAAkB,eAEhB,oCAAC,aAAD;AAAA,IAAa,QAAQ;AAAA,OAEvB,oCAAC,kBAAD;AAAA,IACE;AAAA,IACA,QAAQ,GAAG,OAAO;AAAA,IAClB,aAAa,UAAU;AAAA,IACvB,UAAU;AAAA,IACV,UAAU,CAAC,CAAC;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,KACP,SAEN,oCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,QAAQ,GAAG,IAAI;AAAA,KAC1B,kBAAkB,WAErB,oCAAC,yBAAD;AAAA,IACE,OAAM;AAAA,IACN,MAAI;AAAA,IAEJ,SAAS,MAAM;AAAA;AAAA,IACf,UAAU,CAAE,WAAU;AAAA;AAAA;AAQlC,mBAAmB,cAAc;AAEjC,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAKzB,IAAM,mBAAmB,mCAAO;AAAA;AAAA;AAAA,mBAGb,IAAI;AAAA;;;AHtFvB,wBAAkC;AAM3B,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,MACgC;AAChC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AACJ,QAAM,iBAAiB,2BAAyC;AAChE,QAAM,yBAAyB,2BAAO;AACtC,QAAM,4BAA4B,2BAAO;AACzC,QAAM,CAAC,4BAA4B,wBAAwB,6BAAS;AAKpE,gCAAU,MAAM;AACd,mBAAe,UAAU,oBAAoB,IAC3C,CAAC,GAAG,MAAM,eAAe,QAAQ,MAAM;AAIzC,eAAW,MAAG;AAtClB;AAsCqB,kCAAe,QAAQ,GAAG,YAA1B,mBAAmC;AAAA,OAAS;AAAA,KAC5D,CAAC;AAKJ,gCAAU,MAAM;AA5ClB;AA6CI,QACE,8BACA,sBAAe,QAAQ,gBAAvB,mBAAoC,UACpC;AACA,iCAAe,QAAQ,gBAAvB,mBAAoC,YAApC,mBAA6C;AAC7C,2BAAqB;AAAA;AAAA,KAEtB,CAAC,4BAA4B;AAMhC,gCAAU,MAAM;AA1DlB;AA2DI,QAAI,uBAAuB,YAAY,IAAI;AACzC,6BAAuB,UAAU;AAAA,WAC5B;AACL,6BAAuB,UAAU,0BAA0B;AAE3D,iCAAe,QAAQ,uBAAuB,aAA9C,mBAAwD,YAAxD,mBAAiE;AAAA;AAGnE,8BAA0B,UAAU;AAAA,KACnC,CAAC;AAMJ,gCAAU,MAAM;AA1ElB;AA2EI,QAAI,CAAC,gBAAgB,CAAC,sBAAe,QAAQ,gBAAvB,mBAAoC,UAAS;AACjE;AAAA;AAGF,UAAM,qBAAqB,eAAe,QAAQ,YAAY;AAE9D,uBAAmB;AAEnB,UAAM,CAAC,OAAO,OAAO,yCACnB,mBAAmB,OACnB;AAGF,uBAAmB,kBAAkB,OAAO;AAAA,KAC3C,CAAC,cAAc,cAAc;AAEhC,SACE,oCAAC,UAAD;AAAA,IACE,UAAU;AAAA,IACV,OAAO,oBAAoB,IAAI,CAAC,GAAG,MAAG;AA9F5C;AA+FQ,iDAAC,oBAAD;AAAA,QACE,KAAK,eAAe,QAAQ;AAAA,QAC5B,KAAK,EAAE;AAAA,QACP,aAAa,yBAAmB,EAAE,aAArB,mBAA+B;AAAA,QAC5C,mBAAmB;AAAA,QACnB,eAAe,SAAQ;AAAA;AAAA;AAAA,IAG3B,WAAW,cAAc,eAAe;AAAA,IACxC,aAAa;AAAA,IACb,iBAAiB,MAAM,qBAAqB;AAAA;AAAA;;;AXlFlD,oBAAqB;AAErB,IAAM,uBAAuB;AAQ7B,IAAM,sBAAsB,CAC1B,qBACA,uBACwB;AACxB,SAAO,OAAO,OAAO,oBAAoB,IACvC,CAAC,EAAE,aAAa,cAAiC;AAtCrD;AAuCM,UAAM,cAAc,0BAAoB,KACtC,CAAC,MAAM,EAAE,YAAY,aADH,mBAEjB;AACH,WAAO;AAAA,MACL;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B;AAAA;AAAA;AAAA;AAMD,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA,cAAc,EAAE,KAAK;AAAA,EACrB;AAAA,MACmC;AACnC,QAAM,EAAE,UAAU;AAClB,QAAM,CAAC,EAAE,MAAM,iBAAiB;AAChC,QAAM,EAAE,YAAY,qBAAqB,uBACvC;AACF,QAAM,wBAAwB,UAAU;AACxC,QAAM,cAAc,MAAM;AAG1B,QAAM,gBAAgB;AACtB,QAAM,EAAE,kBAAkB;AAE1B,QAAM,eAAe,gCACnB,CAAC,UAAU;AACT,UAAM;AAEN,UAAM,qBAAqB,oBACzB,qBACA;AAGF,kBAAc,OACZ;AAAA,MACE,gBAAgB,KAAK,UAAU;AAAA,OAEjC;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA;AAAA,KAId,CAAC,eAAe,qBAAqB;AAGvC,gCAAU,MAAM;AACd,UAAM,gBAAgB,YAAY;AAChC,UAAI;AACF,cAAM,OAAO,OAAO,OAAO,oBAAoB,IAC7C,CAAC,EAAE,cAAc;AAEnB,cAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,KAAK,qBAAM,GAAG;AACpD,cAAM,OAAiB,OAAO,OAAO,cAAc;AAEnD,cAAM,cAAc,QAAQ,MAAM;AAClC,eAAO,MAAM;AAAA,eAGN,KAAP;AACA,gBAAQ,MAAM,6BAA6B;AAAA;AAAA;AAI/C,QAAI,cAAc,MAAM;AACtB;AAAA;AAAA,KAED;AAAA,IACD,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGF,gCAAU,MAAM;AACd,QAAI,OAAO,kBAAkB;AAC3B,eAAQ,yBAAyB,KAAK;AAAA;AAAA,KAEvC,CAAC,KAAK;AAET,gCAAU,MAAM;AACd,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,EAAE,SAAS,GAAG;AAChB,iBAAQ;AAAA,aACH;AACL,iBAAQ;AAAA;AAAA;AAIZ,UAAM,mBAAmB,2BAAS,SAAS;AAE3C,WAAO,iBAAiB,SAAS;AAEjC,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS;AAAA;AAAA,KAErC;AAEH,SACE,oCAAC,QAAD;AAAA,IAAM,OAAO,EAAE,QAAQ;AAAA,IAAU,UAAU;AAAA,KACzC,oCAAC,QAAD;AAAA,IAAQ;AAAA,KACN,oCAAC,kBAAD,MAAkB,YACjB,oBAAoB,SAAS,KAC5B,oCAAC,qBAAD,MACE,oCAAC,YAAD;AAAA,IACE,WAAW,cAAc,eAAe;AAAA,IACxC,OAAO,oBAAoB;AAAA,IAC3B,UAAU;AAAA,IACV,MAAO,eAAc,IAAI,KAAK;AAAA,IAC9B,UAAU,SAAQ;AAAA,IAClB,WAAW;AAAA,MAEb,oCAAC,gBAAD;AAAA,IACE,MAAM,cAAc,KAAK;AAAA,IACzB,KAAK,cAAc,oBAAW;AAAA,IAC9B,KAAI;AAAA,OAIV,oCAAC,mBAAD,MACE,oCAAC,uBAAD;AAAA,IAAuB;AAAA,OAEzB,oCAAC,0BAAD,MACE,oCAAC,uBAAD;AAAA,IAAuB,kBAAiB;AAAA,OAE1C,oCAAC,iBAAD,MACE,oCAAC,cAAD;AAAA,IACE,OAAO,YAAY;AAAA,IACnB,MAAK;AAAA,IACL,MAAI;AAAA,IACJ,UAAU,CAAC,4CAAa;AAAA;AAAA;AAQpC,IAAM,SAAS,mCAAO;AAAA;AAAA;AAAA;AAAA,aAIT,IAAI;AAAA,cACH,IAAI;AAAA;AAAA,IAEd,CAAC,EAAE,kBAAkB;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA,QAGE,cACI;AAAA;AAAA,cAGA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMN;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA,QAGE,cACI;AAAA;AAAA,UAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQP,cACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMc;AAAA;AAAA;AAAA,QAId;AAAA;AAAA;AAAA;AAAA,2BAIkB;AAAA;AAAA;AAAA;AAM3B,IAAM,mBAAmB,mCAAO;AAAA;AAAA;AAIhC,IAAM,sBAAsB,mCAAO;AAAA;AAAA;AAAA,SAG1B,IAAI;AAAA;AAGb,IAAM,iBAAiB,mCAAO;AAAA,IAC1B,CAAC,EAAE,WAAW,UAAU,mBAAmB;AAAA;AAG/C,IAAM,oBAAoB,mCAAO;AAAA;AAAA;AAAA;AAKjC,IAAM,2BAA2B,mCAAO;AAAA;AAAA;AAIxC,IAAM,kBAAkB,mCAAO;AAE/B,IAAM,eAAe,wCAAO;AAAA;AAAA,aAEf,IAAI;AAAA,IACb,CAAC,EAAE,WAAW,QAAQ;AAAA;;;AkBvR1B;AAAA,uBAA8B;AAC9B,iCAAmB;AACnB,mBAAiC;;;ACFjC;AAAA,uBAAwD;AAExD,qBAAoC;AACpC,kBAAiC;AACjC,iCAAmB;AAEnB,oBAA+B;AAQxB,IAAM,eAAe,CAAC;AAAA,EAC3B,UAAU,EAAE,OAAO;AAAA,EACnB,aAAa;AAAA,EACb;AAAA,MACuB;AACvB,QAAM,CAAC,aAAa,kBAAkB,6BAAS;AAC/C,QAAM,CAAC,cAAc,mBAAmB,6BAAS,CAAC;AAClD,QAAM,eAAe,eAAe,QAAQ;AAC5C,QAAM,EAAE,SAAS,MAAM,YAAY;AACnC,QAAM,sBAAsB,CAAC,CAAC;AAC9B,QAAM,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;AAEnC,QAAM,kBAAkB,+BAAc,aAAa;AAAA,IACjD,MAAM;AAAA,MACJ,eAAe;AAAA;AAAA,IAEjB,OAAO;AAAA,MACL,eAAe;AAAA;AAAA;AAInB,gCAAU,MAAM;AACd,QAAI,CAAC,eAAe,CAAC,cAAc;AACjC;AAAA;AAOF,QAAI,YAAY,WAAW,MAAM,QAAQ,eAAe;AAExD,WAAO,MAAM;AACX,mBAAa;AAAA;AAAA,KAEd,CAAC,cAAc,aAAa;AAE/B,QAAM,kBAAqD,CAAC,MAAM;AAChE,MAAE;AAEF,oBAAgB,CAAC,SAAS,CAAC;AAAA;AAG7B,SACE,oCAAC,SAAD;AAAA,IACE,SAAS,MAAM;AACb,qBAAe;AAAA;AAAA,IAEjB,WAAW;AAAA,KAEV,gBAAgB,CAAC,EAAE,iBAAiB,YACnC,0DACE,oCAAC,cAAE,KAAH;AAAA,IAAO,OAAO,EAAE,SAAS,UAAU,MAAM;AAAA,KACvC,oCAAC,YAAD,MACE,oCAAC,sBAAD;AAAA,IACE,MAAK;AAAA,IACL,MAAK;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,MACE,oCAAC,YAAD;AAAA,MACE,KAAK,kCAAe,QAAQ;AAAA,MAC5B,WAAW,CAAC,CAAC,QAAQ;AAAA;AAAA,MAI1B,iBACC,0DACE,oCAAC,oBAAD,MAAoB,eACN,KACZ,oCAAC,OAAD;AAAA,IAAK,SAAS;AAAA,KACZ,oCAAC,yBAAD;AAAA,IAAQ,SAAS;AAAA,UAM3B,oCAAC,aAAD,MACE,oCAAC,OAAD,MAAM,OACN,oCAAC,OAAD,MAAM,WAEP,CAAC,uBACA,oCAAC,WAAD,MAAW,4CAGd,WACC,oCAAC,QAAD;AAAA,IAAQ,OAAO,EAAE,SAAS;AAAA,KACxB,oCAAC,8BAAD;AAAA,IAAa,MAAK;AAAA,MAAgB,KAAC,oCAAC,QAAD,MAAO;AAAA;AASxD,IAAM,UAAU,mCAAO;AAAA;AAAA,aAEV,IAAI;AAAA,sBACK,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvC,CAAC,EAAE,WAAW,YACd,CAAC,YACG;AAAA,wBACgB,MAAM;AAAA,OAEtB;AAAA;AAGR,IAAM,aAAa,mCAAO;AAAA;AAAA;AAAA,mBAGP,MAAM;AAAA;AAGzB,IAAM,cAAc,mCAAO;AAAA;AAAA,MAErB,gCAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOV,gCAAU;AAAA,aACH,CAAC,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAOlC,IAAM,YAAY,mCAAO;AAAA,WACd,CAAC,EAAE,YAAY,MAAM;AAAA,gBAChB,IAAI;AAAA,IAChB,gCAAU;AAAA;AAGd,IAAM,qBAAqB,mCAAO;AAAA;AAAA,SAEzB,MAAM;AAAA,IACX,CAAC,EAAE,YAAY,MAAM;AAAA,IACrB,gCAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQd,IAAM,SAAS,wCAAO,cAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUf,IAAI;AAAA,IACT,gCAAU;AAAA;AAGd,IAAM,aAAa,mCAAO;AAAA;AAAA;AAAA;AAAA,kBAIR,MAAM;AAAA,kBACN,MAAM;AAAA,IACpB,CAAC,UAAW,MAAM,YAAY,4BAA4B;AAAA;;;ADhLvD,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,MACiC;AACjC,QAAM,aAAa,gCAAc,WAAW;AAAA,IAC1C,OAAO,MAAM,UAAU;AAAA,IACvB,MAAM,EAAE,SAAS,GAAG,OAAO;AAAA,IAC3B,OAAO,EAAE,SAAS,GAAG,OAAO;AAAA;AAG9B,SACE,oCAAC,aAAD,MACE,oCAAC,OAAD,MAAK,mEACJ,WAAW,CAAC,QAAQ,SACnB,oCAAC,eAAE,KAAH;AAAA,IAAO,OAAO;AAAA,KACZ,oCAAC,cAAD;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA;AAAA;AAQrB,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA,SAIhB,IAAI;AAAA,aACA,IAAI;AAAA,gBACD,KAAK;AAAA,mBACF,IAAI;AAAA;AAAA;AAAA,MAGjB,gCAAU;AAAA,gBACA,IAAI;AAAA,qBACC,IAAI;AAAA;AAAA;;;AEnDzB;AACA,mBAA6B;AAEtB,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,MAGI;AACJ,QAAM,sBAAsB,4BAAU;AAAA,IACpC,MAAM,EAAE,SAAS;AAAA,IACjB,IAAI,EAAE,SAAS;AAAA;AAGjB,SACE,oCAAC,eAAE,KAAH;AAAA,IAAO,OAAO,iCAAK,sBAAL,EAA0B,OAAO,QAAQ,QAAQ;AAAA,KAC5D;AAAA;;;ACfP;;;ACAA;AAAA,qBAA0B;AAE1B,qBAA0B;AAE1B,IAAM,oBAAoB,QAAQ,IAAI;AAEtC,IAAM,yBAAyB,oBAAI;AAKnC,IAAM,uBAAuB;AAE7B,IAAM,qBAAqB,OAAO,KAAK,QAAQ,KAC5C,OAAO,CAAC,QAAQ,qBAAqB,KAAK,MAC1C,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG;AAE3B,IAAM,WAAW,yBAAU,OAChC,CAAC,UAAO;AAlBV;AAoBI,UAAC,CAAC,aAAM,mBAAN,mBAAsB,KAAK,CAAC,EAAE,WAC9B,mBAAmB,SAAS,KAAK;AAAA;AAIvC,IAAM,mBAAmB,CAAC,YAA2B;AACnD,QAAM,qBAAqB,QAAQ,QAAQ,OAAO,CAAC,WACjD,OAAO,SAAS;AAGlB,MAAI,mBAAmB,QAAQ;AAC7B,WAAO,GAAG,mBAAmB,MAAM;AAAA;AAGrC,SAAO,QAAQ,QAAQ;AAAA;AAGlB,IAAM,cAAc,CAAC,cAA0C;AACpE,MAAI,uBAAuB,IAAI,YAAY;AACzC,WAAO,uBAAuB,IAAI;AAAA;AAGpC,QAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO;AAE9C,QAAM,WAAW,IAAI,yBAAU,sBAC7B,iBAAiB,UACjB;AAGF,yBAAuB,IAAI,WAAW;AAEtC,SAAO;AAAA;;;ACnDT;AAiBO,IAAM,qBAAqB,CAAC,cAAuC;AACxE,MAAI,QAAQ;AAEZ,UAAQ;AAAA,SACD;AACH,eAAS,QAAQ,IAAI;AACrB,gBAAU;AACV;AAAA,SACG;AACH,eAAS,QAAQ,IAAI;AACrB,gBAAU;AACV;AAAA,SACG;AACH,eAAS;AACT,gBAAU;AACV;AAAA,SACG;AACH,eAAS,QAAQ,IAAI;AACrB,gBAAU;AACV;AAAA,SACG;AACH,eAAS,QAAQ,IAAI;AACrB,gBAAU;AACV;AAAA;AAGJ,MAAI,CAAC,UAAU,CAAC,SAAS;AACvB,UAAM,IAAI,SACR,iDAAiD,aACjD;AAAA,MACE,QAAQ;AAAA;AAAA;AAKd,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA;AAIG,IAAM,0BAA0B,OACrC,aAC4B;AAC5B,QAAM,mBAAoB,MAAM,SAAS;AAEzC,MAAI,iBAAiB,WAAW,KAAK;AACnC,UAAM,IAAI,SAAS,iBAAiB,SAAS,EAAE,QAAQ;AAAA;AAGzD,QAAM,SAAS,iBAAiB,OAAO;AAEvC,MACE,CAAC,OAAO,OAER,OAAO,QAAQ,qCACf;AACA,UAAM,IAAI,SAAS,4BAA4B,EAAE,QAAQ;AAAA;AAG3D,SAAO;AAAA;AAGF,IAAM,4BAA4B,CACvC,iBACA,cACW;AACX,QAAM,EAAE,SAAS,WAAW,mBAAmB;AAE/C,SAAO,GAAG,wDAAwD,kBAChE,SAAS,WAAW,WAAW;AAAA;;;ACvFnC;AACA,qBAAsD;AAItD,IAAK,eAAL,kBAAK,kBAAL;AACE;AACA;AACA;AACA;AACA;AACA;AANG;AAAA;AAcL,IAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,IACE;AAMJ,IAAM,uBAAuB,qBAAM,QACjC,yBAAU,KAAK,qBAAM,GAAG,iCAAiC,IAAI;AAG/D,IAAM,4BAA4B,OAChC,iBACA,aACA,aACoB;AACpB,QAAM,2BAA2B,MAAM,SAAS,aAC9C,iBACA;AAEF,SAAO,qBAAM,cAAc;AAAA;AAG7B,IAAM,yBAAoE;AAAA,GACvE,YAAY,OAAO,EAAE,WAAW,aAAa;AAC5C,QAAI,wBAAwB,MAAM,0BAChC,SACA,sBACA;AAOF,QAAI,0BAA0B,yBAAU,aAAa;AACnD,8BAAwB,MAAM,0BAC5B,SACA,qBAAM,GAAG,cACT;AAEF,aAAO;AAAA;AAGT,WAAO;AAAA;AAAA,GAER,wBAAwB,OAAO,OAAO,aAAa;AAClD,WAAO;AAAA;AAAA,GAER,iBAAiB,OAAO,OAAO,aAAa;AAC3C,WAAO;AAAA;AAAA,GAER,8BAA8B,OAAO,EAAE,WAAW,aAAa;AAC9D,WAAO,0BAA0B,SAAS,sBAAsB;AAAA;AAAA,GAEjE,sBAAsB,CAAC,EAAE,SAAS,OAAO,aAAa;AACrD,UAAM,gBAAgB,IAAI,wBAAS,SAAS,KAAK;AAEjD,WAAO,cAAc;AAAA;AAAA,GAEtB,eAAe,OAAO,EAAE,SAAS,OAAO,aAAa;AACpD,QAAI;AAEJ,QAAI;AACF,YAAM,gBAAgB,IAAI,wBAAS,SAAS,KAAK;AAEjD,8BAAwB,MAAM,cAAc;AAAA,aACrC,KAAP;AACA,8BAAwB,MAAM,0BAC5B,SACA,sBACA;AAAA;AAIJ,WAAO;AAAA;AAAA;AAIJ,IAAM,kBAAkB,CAC7B,iBAC6B;AAC7B,QAAM,yBAAyB,aAAa;AAC5C,QAAM,mBAAmB,OAAO,KAAK,cAAc,IAAI,CAAC,MACtD,EAAE;AAEJ,QAAM,oBAAoB,iBAAiB,QAAQ;AAEnD,MAAI,sBAAsB,IAAI;AAC5B,QAAI,uBAAuB,SAAS,UAAU;AAC5C,aAAO;AAAA;AAET;AAAA;AAGF,SAAO,OAAO,OAAO,cACnB;AAAA;AAIG,IAAM,6BAA6B,CACxC,OACA,iBAEA,uBAAuB,cAAc,OAAO,YAAY,MAAM,QAAQ;;;AHvHxE,qBAA0B;AAG1B,IAAM,yBAAyB,CAAC,aAA0B;AACxD,QAAM,WAAW;AAEjB,MAAI,CAAC,YAAY,aAAa,MAAM;AAClC,UAAM,IAAI,SACR,CAAC,WACG,gCACA,sCACJ,EAAE,QAAQ;AAAA;AAId,SAAO;AAAA;AAGF,IAAM,iBAAiB,OAC5B,oBACiC;AACjC,QAAM,YAAa,MAAM,QAAQ,WAC/B,SAAS,IAAI,CAAC,MAAM,kBAAkB,iBAAiB;AAGzD,QAAM,qBAAqB,UAAU,OACnC,CAAC,MAAM,EAAE,WAAW;AAEtB,QAAM,YAAY,mBAAmB,IAAI,CAAC,MAAM,EAAE;AAClD,QAAM,4BAA4B;AAGlC,aAAW,KAAK,WAAW;AACzB,QAAI,OAAO;AACX,UAAM,eAAe,gBAAgB,EAAE;AAEvC,QAAI,iBAAiB,QAAW;AAC9B,cAAQ;AACR,YAAM,wBAAwB,MAAM,2BAClC,OACA;AAEF,UAAI,0BAA0B,yBAAU,aAAa;AACnD,YAAI;AACF,2BAAiB,MAAM,kBACrB,uBACA,EAAE;AAAA,iBAEG,KAAP;AAAA;AAAA;AAAA,WAEC;AACL,uBAAiB;AAAA;AAGnB,8BAA0B,KAAK,EAAE,OAAO;AAAA;AAG1C,SAAO;AAAA;AAGF,IAAM,oBAAoB,OAC/B,iBACA,YAC0B;AAC1B,QAAM,YAAY,QAAQ;AAC1B,QAAM,WAAW,YAAY;AAC7B,QAAM,kBAAkB,MACtB,0BAA0B,iBAAiB;AAG7C,QAAM,WAAW,CAAC,SAAS,QAAQ,kBAAkB;AACrD,QAAM,YAAY,MAAM,QAAQ,IAAI;AAEpC,QAAM,WAAW,uBAAuB,UAAU;AAClD,QAAM,iBAAiB,MAAM,wBAC3B,UAAU;AAGZ,SAAO;AAAA,IACL,KAAK,eAAe;AAAA,IACpB;AAAA,IACA,SAAS;AAAA,IACT,MAAM,eAAe;AAAA,IACrB;AAAA;AAAA;;;AvB3EG,IAAM,UAAyB,OAAO,EAAE,cAAc;AAC3D,QAAM,EAAE,iBAAiB,IAAI,IAAI,QAAQ;AACzC,QAAM,kBAAkB,aAAa,IAAI;AAEzC,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,SAAS,2BAA2B;AAAA,MAC5C,QAAQ;AAAA,MACR,YAAY;AAAA;AAAA;AAIhB,QAAM,YAAY,MAAM,eAAe;AAEvC,SAAO,uBAAK;AAAA,IACV;AAAA,IACA;AAAA;AAAA;AAIW,oBAAoB;AACjC,QAAM,EAAE,WAAW,oBAAoB;AACvC,QAAM,8BAA8B;AACpC,QAAM,CAAC,sBAAsB,2BAC3B;AAEF,gCAAU,MAAM;AACd,QACE,CAAC,8DAAsB,aACvB,4BAA4B,SAAS,QACrC;AACA;AAAA;AAGF,gCAA4B,KAC1B,8CAA8C,qBAAM,GAClD,qBAAqB;AAAA,KAGxB,CAAC,6DAAsB,UAAU;AAEpC,SACE,oCAAC,WAAD;AAAA,IAAW,eAAa;AAAA,KACtB,oCAAC,aAAD,MACG,wBAAwB,4BAA4B,SAAS,SAC5D,oCAAC,wBAAD,MACE,oCAAC,0BAAD;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd,kBAAkB,4BAA4B;AAAA,QAIlD,oCAAC,wBAAD;AAAA,IACE;AAAA,IACA,YAAW;AAAA,IACX,wBAAwB;AAAA;AAAA;AAQpC,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;A2BjFzB;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAyC;AAG1B,wBAAwB;AACrC,QAAM,UAAU;AAEhB,SACE,0DACE,oCAAC,QAAD,MACE,oCAAC,uBAAD;AAAA,IAAQ;AAAA;AAAA;;;ACThB;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAqB;AACrB,qBAA8B;AAC9B,iCAAmB;AAKZ,IAAM,UAAyB,OAAO,EAAE,aAAa;AAC1D,QAAM,UAAU,OAAO;AAEvB,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,SAAS,0BAA0B;AAAA,MAC3C,QAAQ;AAAA,MACR,YAAY;AAAA;AAAA;AAIhB,QAAM,SAAQ,MAAM,aAAa;AAEjC,SAAO,uBAAK,EAAE;AAAA;AAOD,sBAAsB;AACnC,QAAM,EAAE,kBAAU;AAElB,SACE,oCAAC,WAAD;AAAA,IAAW,eAAa;AAAA,KACtB,oCAAC,aAAD,MAAY,iCAAO;AAAA;AAKzB,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACrCzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2C;AAE3C,mBAAqB;AACrB,qBAA2C;AAC3C,iCAAmB;AAOZ,IAAM,UAAyB,YAAY;AAChD,QAAM,MAAM,MAAM;AAElB,SAAO,uBAAK,EAAE;AAAA;AAOD,mBAAmB;AAChC,QAAM,EAAE,QAAQ;AAChB,QAAM,EAAE,OAAO,WAAW;AAE1B,QAAM,cAAc,MAAM;AAC1B,QAAM,aAAa,OAAO,UAAU;AAEpC,SACE,oCAAC,WAAD;AAAA,IAAW,eAAa;AAAA,KACtB,oCAAC,wBAAD,MACE,oCAAC,aAAD;AAAA,IAAW;AAAA,IAA0B;AAAA,KAClC,IAAI,SACH,oCAAC,eAAD;AAAA,IAAe;AAAA,IAA0B;AAAA,KACtC,IAAI,IAAI,CAAC,MACR,oCAAC,WAAD;AAAA,IAAW,KAAK,EAAE;AAAA,IAAI,IAAI;AAAA,SAI9B,oCAAC,OAAD,MAAK;AAAA;AAQjB,mBAAmB,EAAE,MAAuB;AAC1C,QAAM,WAAW;AAEjB,SACE,oCAAC,gBAAD;AAAA,IAAgB,SAAS,MAAM,SAAS,YAAY,GAAG;AAAA,KACrD,oCAAC,iBAAD,MAAiB,6DAGjB,oCAAC,eAAD,MACE,oCAAC,MAAD,MAAO,GAAG,UACV,oCAAC,aAAD;AAAA,IAAa,QAAQ,GAAG;AAAA;AAAA;AAMhC,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA;AAAA,iBAIR,CAAC,EAAE,aAAa,iBAC7B,cAAc,IAAI,sBAAK,aAAa,IAAI,sBAAK,IAAI;AAAA;AAAA;AAAA;AAKrD,IAAM,gBAAgB,mCAAO;AAAA;AAAA,cAEf,CAAC,EAAE,aAAa,iBAC1B,cAAc,IAAI,sBAAK,aAAa,IAAI,sBAAK,IAAI;AAAA,2BAC1B,CAAC,EAAE,aAAa,iBACvC,UAAU,cAAc,MAAM,aAAa,MAAM,QAC/C,cAAc,QAAQ,aAAa,QAAQ;AAAA,mBAE9B,IAAI;AAAA;AAGvB,IAAM,iBAAiB,mCAAO;AAAA,aACjB,IAAI;AAAA,gBACD,CAAC,UAAU,MAAM,MAAM;AAAA,sBACjB,CAAC,UAAU,MAAM,MAAM;AAAA,mBAC1B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,kBAAkB,mCAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAK3B,gCAAU;AAAA;AAGd,IAAM,gBAAgB,mCAAO;AAAA;AAAA;AAAA;AAAA,0BAIH,CAAC,UAAU,MAAM,MAAM;AAAA,iBAChC,IAAI;AAAA;AAGrB,IAAM,OAAO,mCAAO;AAAA,IAChB,gCAAU;AAAA;;;AClHd;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA0B;AAC1B,qBAA4B;AAEb,iBAAiB;AAC9B,QAAM,WAAW;AAEjB,gCAAU,MAAM,SAAS,UAAU,CAAC;AAEpC,SAAO;AAAA;;;ACRT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA6C;AAC7C,qBAKO;AACP,iCAAmB;;;ACPnB;AAAA,uBAOO;AACP,sBAAsB;AAEtB,qBAAyB;AACzB,iCAAmB;AAOZ,IAAM,eAAe,CAAC,EAAE,SAAS,eAAkC;AACxE,QAAM,CAAC,iBAAiB,sBAAsB,6BAAS;AACvD,QAAM,CAAC,UAAU,eAAe,6BAAS;AAEzC,QAAM,eAAiC,CAAC,MAAM;AAC5C,MAAE;AAEF,QAAI,CAAC,iBAAiB;AACpB,kBAAY;AACZ;AAAA;AAEF,QAAI,CAAC,sBAAM,UAAU,kBAAkB;AACrC,kBAAY;AACZ;AAAA;AAGF,aAAS;AAAA;AAGX,SACE,oCAAC,aAAD,MACE,oCAAC,QAAD;AAAA,IAAM,UAAU;AAAA,KACd,oCAAC,OAAD;AAAA,IACE,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,MACf,cAAc,IAAI;AAAA;AAAA,KAGpB,oCAAC,wBAAD;AAAA,IAAO,OAAM;AAAA,KACX,oCAAC,eAAD;AAAA,IACE,OAAO;AAAA,IACP,aAAY;AAAA,IACZ,UAAU,CAAC,MAAqC;AAC9C,kBAAY;AACZ,yBAAmB,EAAE,OAAO;AAAA;AAAA,IAE9B,MAAI;AAAA,OAGP,YAAY,oCAAC,uBAAD;AAAA,IAAM,MAAK;AAAA,KAAS,YAEnC,oCAAC,YAAD;AAAA,IAAY,MAAK;AAAA,IAAS,MAAK;AAAA,IAAS,UAAU;AAAA,IAAS,MAAI;AAAA,KAC5D,UACC,0DACE,oCAAC,8BAAD;AAAA,IAAa,OAAO,EAAE,aAAa,IAAI;AAAA,IAAM,MAAK;AAAA,MAAgB,mBAIpE,0DAAE;AAAA;AAQd,IAAM,cAAY,mCAAO;AAAA;AAAA;AAAA,cAGX,IAAI;AAAA;AAAA;AAAA;AAKlB,IAAM,gBAAgB,wCAAO;AAAA,YACjB,IAAI;AAAA;AAGhB,IAAM,aAAa,wCAAO;AAAA,YACd,IAAI;AAAA;;;AD7ED,gBAAgB;AAC7B,QAAM,EAAE,UAAU;AAClB,QAAM,WAAW;AAEjB,QAAM,aAAa;AACnB,QAAM,eAAe,oCAAgB;AAErC,QAAM,oBACJ,WAAW,UAAU,aACrB,WAAW,SAAS,aAAa,aAAa;AAEhD,SACE,oCAAC,WAAD,MACE,oCAAC,eAAD;AAAA,IAAe,aAAa,MAAM;AAAA,KAC/B,qBAAqB,WAAW,UAAU,YACzC,oCAAC,cAAD;AAAA,IACE,SAAS;AAAA,IACT,UAAU,CAAC,oBACT,SAAS,sBAAsB;AAAA,OAInC,0DACE,oCAAC,8BAAD;AAAA,IAAa,OAAO,EAAE,aAAa,IAAI;AAAA,IAAM,MAAK;AAAA,MAAgB;AAAA;AAS9E,IAAM,gBAAgB,mCAAO;AAAA;AAAA;AAAA;AAAA,iBAIZ,CAAC,EAAE,kBAAmB,cAAc,IAAI,sBAAK,KAAK;AAAA;AAAA;AAAA;AAM5D,0BAAyB;AAC9B,QAAM,SAAS;AAEf,MAAI;AAEJ,UAAQ,OAAO;AAAA,SACR;AACH,gBAAU,OAAO;AAAA,SACd;AACH,gBAAU,OAAO;AACjB;AAAA;AAEA,YAAM,IAAI,MAAM,OAAO,QAAQ,OAAO;AAAA;AAG1C,SACE,oCAAC,OAAD,MACE,oCAAC,OAAD,MACE,oCAAC,MAAD,MACG,OAAO,QAAO,MAAG,OAAO,aAE1B;AAAA;;;AE1ET;AAAA,IAAO,0BAAQ,EAAC,WAAU,YAAW,SAAQ,EAAC,UAAS,mCAAkC,WAAU,CAAC,oCAAmC,oCAAmC,oCAAmC,uCAAqC,UAAS,EAAC,QAAO,EAAC,MAAK,QAAO,YAAW,QAAU,QAAO,IAAG,SAAQ,QAAU,iBAAgB,QAAU,UAAS,2BAA0B,WAAU,CAAC,oCAAmC,oCAAmC,oCAAmC,qCAAoC,aAAY,OAAM,aAAY,MAAK,oBAAmB,MAAK,oBAAmB,QAAM,uCAAsC,EAAC,MAAK,uCAAsC,YAAW,QAAO,QAAO,gCAA+B,SAAQ,QAAU,iBAAgB,QAAU,UAAS,0DAAyD,WAAU,QAAU,aAAY,OAAM,aAAY,MAAK,oBAAmB,OAAM,oBAAmB,SAAO,mBAAkB,EAAC,MAAK,mBAAkB,YAAW,QAAO,QAAO,YAAW,SAAQ,QAAU,iBAAgB,QAAU,UAAS,sCAAqC,WAAU,CAAC,oCAAmC,qCAAoC,aAAY,OAAM,aAAY,MAAK,oBAAmB,OAAM,oBAAmB,SAAO,kBAAiB,EAAC,MAAK,kBAAiB,YAAW,QAAO,QAAO,WAAU,SAAQ,QAAU,iBAAgB,QAAU,UAAS,qCAAoC,WAAU,QAAU,aAAY,OAAM,aAAY,OAAM,oBAAmB,OAAM,oBAAmB,SAAO,yBAAwB,EAAC,MAAK,yBAAwB,YAAW,kBAAiB,QAAO,UAAS,SAAQ,QAAU,iBAAgB,QAAU,UAAS,4CAA2C,WAAU,CAAC,oCAAmC,oCAAmC,qCAAoC,aAAY,OAAM,aAAY,MAAK,oBAAmB,OAAM,oBAAmB,SAAO,wBAAuB,EAAC,MAAK,wBAAuB,YAAW,kBAAiB,QAAO,QAAU,SAAQ,MAAK,iBAAgB,QAAU,UAAS,2CAA0C,WAAU,CAAC,oCAAmC,oCAAmC,oCAAmC,oCAAmC,qCAAoC,aAAY,OAAM,aAAY,MAAK,oBAAmB,OAAM,oBAAmB,SAAO,iCAAgC,EAAC,MAAK,iCAAgC,YAAW,QAAO,QAAO,0BAAyB,SAAQ,QAAU,iBAAgB,QAAU,UAAS,oDAAmD,WAAU,QAAU,aAAY,MAAK,aAAY,OAAM,oBAAmB,OAAM,oBAAmB,SAAO,eAAc,EAAC,MAAK,eAAc,YAAW,QAAO,QAAO,QAAO,SAAQ,QAAU,iBAAgB,QAAU,UAAS,kCAAiC,WAAU,CAAC,qCAAoC,aAAY,OAAM,aAAY,OAAM,oBAAmB,MAAK,oBAAmB,SAAO,gBAAe,EAAC,MAAK,gBAAe,YAAW,QAAO,QAAO,QAAU,SAAQ,MAAK,iBAAgB,QAAU,UAAS,mCAAkC,WAAU,QAAU,aAAY,OAAM,aAAY,OAAM,oBAAmB,OAAM,oBAAmB,WAAQ,OAAM;;;AnEY7uG,IAAM,QAAQ,EAAE,QAAQ;AACxB,IAAM,SAAS;AAAA,EACpB,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,uCAAuC;AAAA,IACnC,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,iCAAiC;AAAA,IAC7B,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,mBAAmB;AAAA,IACf,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,kBAAkB;AAAA,IACd,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,yBAAyB;AAAA,IACrB,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,wBAAwB;AAAA,IACpB,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,gBAAgB;AAAA,IACZ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA,EAEZ,eAAe;AAAA,IACX,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA;AAAA;", "names": [] } diff --git a/app/components/ContractDescriptorScreen/FunctionDescriptor/Description.tsx b/app/components/ContractDescriptorScreen/FunctionDescriptor/Description.tsx new file mode 100644 index 0000000..dd50379 --- /dev/null +++ b/app/components/ContractDescriptorScreen/FunctionDescriptor/Description.tsx @@ -0,0 +1,66 @@ +import { ReactNode } from "react"; + +const codeRegex = /(`.*?`)/g; +const functionRegex = /`@.*?\((.*?)\)`/g; + +type DescriptionProps = { text: string }; + +function formatText(text: string) { + return text.split(codeRegex).map((w, i) => { + // Texts with code format at the begining usually return an empty string at the start + const codeMatch = codeRegex.exec(w); + + return codeMatch ? ( + formatCode(w) + ) : ( + + {w} + + ); + }); +} + +function formatCode(text: string) { + const functionMatch = new RegExp(functionRegex).exec(text); + + if (functionMatch) { + return formatFunction(text); + } + + return text.split(/(`)(.*?)(`)/g).map((w) => { + return ( + {w} + ); + }); +} + +function getPartialFnColor(part: string, elementIndex: number) { + if (elementIndex === 2) { + return "#A2BEFC"; + } + + if (["`", "(", ")"].includes(part)) { + return "#D0BF9B"; + } + + return "#ffffff"; +} + +function formatFunction(text: string): ReactNode { + // Split and get [`,functionName, (, params, ), `] + return text.split(/(`)(@.*?)(\()(.*)(\))/g).map((w, i) => { + console.log("es la palabra", w); + + return ( + + {w} + + ); + }); +} + +function Description({ text }: DescriptionProps) { + return
    {formatText(text)}
    ; +} + +export default Description; diff --git a/app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx b/app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx index 9092ba4..81d1050 100644 --- a/app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx +++ b/app/components/ContractDescriptorScreen/FunctionDescriptor/DescriptionField.tsx @@ -1,7 +1,8 @@ -import { GU, RADIUS, textStyle } from "@1hive/1hive-ui"; import { forwardRef, useEffect, useState } from "react"; import type { FocusEventHandler, KeyboardEventHandler } from "react"; +import { GU, RADIUS, textStyle } from "@1hive/1hive-ui"; import styled from "styled-components"; +import Description from "./Description"; import { useDebounce } from "~/hooks/useDebounce"; type DescriptionFieldProps = { @@ -32,7 +33,7 @@ export const DescriptionField = forwardRef< ref ) => { const [value, setValue] = useState(description); - const debouncedValue = useDebounce(value, 400); + const debouncedValue = useDebounce(value, 0); useEffect(() => { if (debouncedValue !== undefined) { @@ -49,17 +50,33 @@ export const DescriptionField = forwardRef< }, [description]); return ( - setValue(e.target.value)} - {...props} - /> +
    + setValue(e.target.value)} + {...props} + /> +
    + +
    +
    ); } ); @@ -70,10 +87,17 @@ const DescriptionTextArea = styled.textarea<{ height: string; textSize: string; }>` + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + + word-break: break-all; height: ${(props) => props.height}; padding: ${1 * GU}px ${1.5 * GU}px; - background: ${(props) => props.theme.surfaceUnder}; - color: ${(props) => props.theme.surfaceContent}; + background: transparent; + color: transparent; + caret-color: white; appearance: none; border-radius: ${RADIUS}px; width: 100%;