From 8b88cf288140b7660b5301e2354ca704cf9de07d Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Tue, 20 Dec 2022 14:24:41 -0300 Subject: [PATCH] feat: UI metamask integration (#41) * feat: add redux and metamask slice * refactor: move from metamask to generic wallet using ethers * feat: add wallet button base * feat: add getContract function and mint functionality * refactor: move functions to ethereum file * feat: wallet menus and disconnect function * refactor: Ethereum object typings * feat: add FleekERC721 contract interaction abstraction * refactor: remove token detail fetch mock using * refactor: add ethereum mint function to mint site component * feat: add wallet initialize * wip: add signature for lastTokenId function * feat: integrate list of tokens * refactor: mint params construct * fix: global window.ethereum type definition * fix: remove console log * fix: remove todo comment * fix: list view items displaying --- test/foundry/apps.t.sol | 97 +- ui/package.json | 95 +- ui/src/app.tsx | 24 +- ui/src/components/card/card-site.tsx | 23 +- ui/src/components/index.ts | 18 +- ui/src/components/wallet-button/index.ts | 1 + .../wallet-button/wallet-button.tsx | 65 + ui/src/global.d.ts | 7 + ui/src/index.tsx | 14 +- .../ethereum/contracts/FleekERC721.json | 1343 +++++++++++++++++ .../integrations/ethereum/contracts/index.ts | 1 + ui/src/integrations/ethereum/ethereum.ts | 40 + ui/src/integrations/ethereum/index.ts | 2 + .../integrations/ethereum/lib/fleek-erc721.ts | 63 + ui/src/integrations/ethereum/lib/index.ts | 1 + ui/src/integrations/index.ts | 1 + ui/src/store/features/index.ts | 1 + .../features/wallet/async-thunk/connect.ts | 34 + .../features/wallet/async-thunk/index.ts | 1 + ui/src/store/features/wallet/index.ts | 2 + ui/src/store/features/wallet/utils.ts | 18 + ui/src/store/features/wallet/wallet-slice.ts | 64 + ui/src/store/hooks.ts | 5 + ui/src/store/index.ts | 3 + ui/src/store/store.ts | 16 + ui/src/utils/format.ts | 21 +- ui/src/views/detail/detail.tsx | 10 +- ui/src/views/home/list.tsx | 31 +- ui/src/views/mint-site/mint-site.tsx | 81 +- ui/yarn.lock | 748 ++++----- 30 files changed, 2249 insertions(+), 581 deletions(-) create mode 100644 ui/src/components/wallet-button/index.ts create mode 100644 ui/src/components/wallet-button/wallet-button.tsx create mode 100644 ui/src/global.d.ts create mode 100644 ui/src/integrations/ethereum/contracts/FleekERC721.json create mode 100644 ui/src/integrations/ethereum/contracts/index.ts create mode 100644 ui/src/integrations/ethereum/ethereum.ts create mode 100644 ui/src/integrations/ethereum/index.ts create mode 100644 ui/src/integrations/ethereum/lib/fleek-erc721.ts create mode 100644 ui/src/integrations/ethereum/lib/index.ts create mode 100644 ui/src/integrations/index.ts create mode 100644 ui/src/store/features/index.ts create mode 100644 ui/src/store/features/wallet/async-thunk/connect.ts create mode 100644 ui/src/store/features/wallet/async-thunk/index.ts create mode 100644 ui/src/store/features/wallet/index.ts create mode 100644 ui/src/store/features/wallet/utils.ts create mode 100644 ui/src/store/features/wallet/wallet-slice.ts create mode 100644 ui/src/store/hooks.ts create mode 100644 ui/src/store/index.ts create mode 100644 ui/src/store/store.ts diff --git a/test/foundry/apps.t.sol b/test/foundry/apps.t.sol index 8575949..d7d250c 100644 --- a/test/foundry/apps.t.sol +++ b/test/foundry/apps.t.sol @@ -152,15 +152,7 @@ contract FleekTest is Test { "}" ); - assertEq( - tokenURI, - string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode((dataURI)) - ) - ) - ); + assertEq(tokenURI, string(abi.encodePacked("data:application/json;base64,", Base64.encode((dataURI))))); } function testCallingTokenURIAfterChangingAllPossibleFields() public { @@ -178,18 +170,11 @@ contract FleekTest is Test { assertEq(mint, 0); fleekContract.setTokenName(mint, "Foundry Test App 2"); - fleekContract.setTokenDescription( - mint, - "This is a test application submitted by foundry tests. 2" - ); + fleekContract.setTokenDescription(mint, "This is a test application submitted by foundry tests. 2"); fleekContract.setTokenImage(mint, "https://fleek2.xyz"); fleekContract.setTokenExternalURL(mint, "https://fleek2.xyz"); fleekContract.setTokenENS(mint, "fleek_xyz2"); - fleekContract.setTokenBuild( - mint, - "afff3f62", - "https://github.com/fleekxyz/contracts2" - ); + fleekContract.setTokenBuild(mint, "afff3f62", "https://github.com/fleekxyz/contracts2"); string memory tokenURI = fleekContract.tokenURI(mint); @@ -211,20 +196,10 @@ contract FleekTest is Test { "}" ); - assertEq( - tokenURI, - string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode((dataURI)) - ) - ) - ); + assertEq(tokenURI, string(abi.encodePacked("data:application/json;base64,", Base64.encode((dataURI))))); } - function testFailChangingAllPossibleFieldsOnAnotherUsersTokenWithoutAccess() - public - { + function testFailChangingAllPossibleFieldsOnAnotherUsersTokenWithoutAccess() public { uint256 mint = fleekContract.mint( DEPLOYER, "Foundry Test App", @@ -241,18 +216,11 @@ contract FleekTest is Test { vm.prank(address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84)); fleekContract.setTokenName(mint, "Foundry Test App 2"); - fleekContract.setTokenDescription( - mint, - "This is a test application submitted by foundry tests. 2" - ); + fleekContract.setTokenDescription(mint, "This is a test application submitted by foundry tests. 2"); fleekContract.setTokenImage(mint, "https://fleek2.xyz"); fleekContract.setTokenExternalURL(mint, "https://fleek2.xyz"); fleekContract.setTokenENS(mint, "fleek_xyz2"); - fleekContract.setTokenBuild( - mint, - "afff3f62", - "https://github.com/fleekxyz/contracts2" - ); + fleekContract.setTokenBuild(mint, "afff3f62", "https://github.com/fleekxyz/contracts2"); string memory tokenURI = fleekContract.tokenURI(mint); @@ -274,15 +242,7 @@ contract FleekTest is Test { "}" ); - assertEq( - tokenURI, - string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode((dataURI)) - ) - ) - ); + assertEq(tokenURI, string(abi.encodePacked("data:application/json;base64,", Base64.encode((dataURI))))); } function testFailCallingTokenURIOnNonExistantToken() public { @@ -306,12 +266,7 @@ contract FleekTest is Test { assertEq( fleekContract.tokenURI(0), - string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode((dataURI)) - ) - ) + string(abi.encodePacked("data:application/json;base64,", Base64.encode((dataURI)))) ); } @@ -433,9 +388,7 @@ contract FleekTest is Test { fleekContract.setTokenDescription(mint, "NEW TOKEN NAME!"); } - function testFailSetTokenDescriptionOnAnotherUsersTokenWithoutAccess() - public - { + function testFailSetTokenDescriptionOnAnotherUsersTokenWithoutAccess() public { uint256 mint = fleekContract.mint( DEPLOYER, "Foundry Test App", @@ -507,9 +460,7 @@ contract FleekTest is Test { fleekContract.setTokenExternalURL(mint, "https://ethereum.org"); } - function testFailSetTokenExternalURLOnAnotherUsersTokenWithoutAccess() - public - { + function testFailSetTokenExternalURLOnAnotherUsersTokenWithoutAccess() public { uint256 mint = fleekContract.mint( DEPLOYER, "Foundry Test App", @@ -542,11 +493,7 @@ contract FleekTest is Test { assertEq(mint, 0); - fleekContract.setTokenBuild( - mint, - "aaaaaaa", - "https://github.com/fleekxyz/test_contracts" - ); + fleekContract.setTokenBuild(mint, "aaaaaaa", "https://github.com/fleekxyz/test_contracts"); } function testFailSetTokenBuildOnAnotherUsersTokenWithoutAccess() public { @@ -565,11 +512,7 @@ contract FleekTest is Test { vm.prank(address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84)); - fleekContract.setTokenBuild( - mint, - "aaaaaaa", - "https://github.com/fleekxyz/test_contracts" - ); + fleekContract.setTokenBuild(mint, "aaaaaaa", "https://github.com/fleekxyz/test_contracts"); } function testSetTokenENS() public { @@ -629,9 +572,7 @@ contract FleekTest is Test { ); } - function testFailAddTokenControllerOnAnotherUsersTokenWithoutAccess() - public - { + function testFailAddTokenControllerOnAnotherUsersTokenWithoutAccess() public { uint256 mint = fleekContract.mint( DEPLOYER, "Foundry Test App", @@ -706,9 +647,7 @@ contract FleekTest is Test { ); } - function testFailRemoveTokenControllerOnAnotherUsersTokenWithoutAccess() - public - { + function testFailRemoveTokenControllerOnAnotherUsersTokenWithoutAccess() public { uint256 mint = fleekContract.mint( DEPLOYER, "Foundry Test App", @@ -815,11 +754,7 @@ contract FleekTest is Test { 0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84 ); vm.prank(address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84)); - fleekContract.revokeTokenRole( - mint, - FleekAccessControl.Roles.Controller, - DEPLOYER - ); + fleekContract.revokeTokenRole(mint, FleekAccessControl.Roles.Controller, DEPLOYER); } function testBalanceOfDeployerAfterAndBeforeMinting() public { diff --git a/ui/package.json b/ui/package.json index 9a852b3..0c2a5e5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,46 +1,49 @@ -{ - "name": "sites-as-nfts", - "version": "0.0.1", - "description": "Minimal UI for sites as NFTs", - "main": "index.js", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "author": "Fleek", - "license": "ISC", - "dependencies": { - "@chakra-ui/icons": "^2.0.13", - "@chakra-ui/react": "^2.4.2", - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "formik": "^2.2.9", - "framer-motion": "^7.6.17", - "path": "^0.12.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.4.4" - }, - "devDependencies": { - "@types/jest": "^29.2.3", - "@types/node": "^18.11.9", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "@vitejs/plugin-react": "^2.2.0", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest": "^27.1.6", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.31.11", - "ethers": "^5.7.2", - "prettier": "^2.8.0", - "react-query": "^3.39.2", - "ts-loader": "^9.4.1", - "typescript": "^4.9.3", - "vite": "^3.2.4", - "vite-tsconfig-paths": "^3.6.0" - } -} +{ + "name": "sites-as-nfts", + "version": "0.0.1", + "description": "Minimal UI for sites as NFTs", + "main": "index.js", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "author": "Fleek", + "license": "ISC", + "dependencies": { + "@chakra-ui/icons": "^2.0.13", + "@chakra-ui/react": "^2.4.2", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@ethersproject/providers": "^5.7.2", + "@reduxjs/toolkit": "^1.9.1", + "formik": "^2.2.9", + "framer-motion": "^7.6.17", + "path": "^0.12.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^8.0.5", + "react-router-dom": "^6.4.4" + }, + "devDependencies": { + "@types/jest": "^29.2.3", + "@types/node": "^18.11.9", + "@types/react": "^18.0.25", + "@types/react-dom": "^18.0.9", + "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/parser": "^5.45.0", + "@vitejs/plugin-react": "^2.2.0", + "eslint": "^8.28.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-jest": "^27.1.6", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.31.11", + "ethers": "^5.7.2", + "prettier": "^2.8.0", + "react-query": "^3.39.2", + "ts-loader": "^9.4.1", + "typescript": "^4.9.3", + "vite": "^3.2.4", + "vite-tsconfig-paths": "^3.6.0" + } +} diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 7fe03d2..97f2a03 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,17 +1,23 @@ -import React from 'react'; import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom'; +import { WalletButton } from './components'; +import { initializeWallet } from './store'; import { Home, MintSite, MintedSiteDetail } from './views'; +initializeWallet(); + export const App = () => { return ( - - - } /> - } /> - } /> - } /> - - + <> + + + + } /> + } /> + } /> + } /> + + + ); }; diff --git a/ui/src/components/card/card-site.tsx b/ui/src/components/card/card-site.tsx index 557ebfd..b8e2287 100644 --- a/ui/src/components/card/card-site.tsx +++ b/ui/src/components/card/card-site.tsx @@ -11,10 +11,11 @@ import { Stack, } from '@chakra-ui/react'; import React from 'react'; +import { FleekERC721 } from '@/integrations'; +import { useQuery } from 'react-query'; interface CardSiteProps { - site: SiteNFTDetail; - tokenId?: string; // TODO add param and remove optional + tokenId: number; } type InfoContainerProps = { @@ -35,9 +36,15 @@ const InfoContainer = ({ heading, info, width }: InfoContainerProps) => ( /> ); -export const SiteCard: React.FC = ({ site, tokenId }) => { - const { name, owner, image, externalUrl } = site; +export const SiteCard: React.FC = ({ tokenId }) => { const navigate = useNavigate(); + const { data, isLoading } = useQuery( + `fetchDetail${tokenId}`, + () => FleekERC721.tokenMetadata(tokenId) + ); + + if (!data || isLoading) return null; + const { name, owner, image, external_url: externalUrl } = data as any; return ( = ({ site, tokenId }) => { borderRadius="10px" width="350px" height="350px" - // TODO add token id param - onClick={() => { - navigate(`/detail?tokenId=${1}`); - }} + onClick={() => navigate(`/detail?tokenId=${tokenId}`)} > @@ -78,8 +82,7 @@ export const SiteCard: React.FC = ({ site, tokenId }) => { - {/* TODO add param */} - + { + const { account = '', provider } = useWalletStore(); + + const dispatch = useAppDispatch(); + + const handleCopyAccount = useCallback(() => { + navigator.clipboard.writeText(account); + }, [account]); + + const handleDisconnect = useCallback(() => { + dispatch(walletActions.disconnect()); + }, [dispatch]); + + return ( + + + {`${provider} (${contractAddress(account)})`} + + + Copy Account + Disconnect + + + ); +}; + +const ConnectionMenu: React.FC = () => { + const { state } = useWalletStore(); + + const dispatch = useAppDispatch(); + + const handleConnectWallet = useCallback(() => { + dispatch(walletActions.connect('metamask')); + }, [dispatch]); + + return ( + + + Connect Wallet + + + Metamask + + + ); +}; + +export const WalletButton: React.FC = () => { + const { state } = useWalletStore(); + + if (state === 'connected') { + return ; + } + + return ; +}; diff --git a/ui/src/global.d.ts b/ui/src/global.d.ts new file mode 100644 index 0000000..593449a --- /dev/null +++ b/ui/src/global.d.ts @@ -0,0 +1,7 @@ +import { ExternalProvider } from '@ethersproject/providers'; + +declare global { + interface Window { + ethereum: ExternalProvider; + } +} diff --git a/ui/src/index.tsx b/ui/src/index.tsx index 887391c..369baa1 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -3,6 +3,8 @@ import ReactDOM from 'react-dom/client'; import { App } from './app'; import { ChakraProvider } from '@chakra-ui/react'; import { theme } from './theme'; +import { Provider as ReduxProvider } from 'react-redux'; +import { store } from './store'; import { QueryClient, QueryClientProvider } from 'react-query'; const queryClient = new QueryClient(); @@ -13,11 +15,13 @@ const root = ReactDOM.createRoot( root.render( - - - - - + + + + + + + ); diff --git a/ui/src/integrations/ethereum/contracts/FleekERC721.json b/ui/src/integrations/ethereum/contracts/FleekERC721.json new file mode 100644 index 0000000..7416f7c --- /dev/null +++ b/ui/src/integrations/ethereum/contracts/FleekERC721.json @@ -0,0 +1,1343 @@ +{ + "address": "0xB8594DC01580884AD69FE5d78EDEA5e66BeB5fFA", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "commit_hash", + "type": "string" + } + ], + "name": "NewBuild", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "NewTokenDescription", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "ENS", + "type": "string" + } + ], + "name": "NewTokenENS", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "external_url", + "type": "string" + } + ], + "name": "NewTokenExternalURL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "image", + "type": "string" + } + ], + "name": "NewTokenImage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "token", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "NewTokenName", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "COLLECTION_CONTROLLER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COLLECTION_OWNER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "addTokenController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isTokenController", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "string", + "name": "image", + "type": "string" + }, + { + "internalType": "string", + "name": "external_url", + "type": "string" + }, + { + "internalType": "string", + "name": "ENS", + "type": "string" + }, + { + "internalType": "string", + "name": "commit_hash", + "type": "string" + }, + { + "internalType": "string", + "name": "git_repository", + "type": "string" + }, + { + "internalType": "string", + "name": "author", + "type": "string" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "removeTokenController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_commit_hash", + "type": "string" + }, + { + "internalType": "string", + "name": "_git_repository", + "type": "string" + }, + { + "internalType": "string", + "name": "_author", + "type": "string" + } + ], + "name": "setTokenBuild", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenDescription", + "type": "string" + } + ], + "name": "setTokenDescription", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenENS", + "type": "string" + } + ], + "name": "setTokenENS", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenExternalURL", + "type": "string" + } + ], + "name": "setTokenExternalURL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenImage", + "type": "string" + } + ], + "name": "setTokenImage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenName", + "type": "string" + } + ], + "name": "setTokenName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x13c35bf6842a0688f3a8f4d5cdb5f03a5f4f069559b3971ce8182e2a1980181f", + "receipt": { + "to": null, + "from": "0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049", + "contractAddress": "0xB8594DC01580884AD69FE5d78EDEA5e66BeB5fFA", + "transactionIndex": 23, + "gasUsed": "4870336", + "logsBloom": "0x00000004000000000800000000000000080000100000000000000010000000000000000000200020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000002000100000000000000000000020000400000000000002800000000000000008080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000800000000001000000000004000000000000000000201000000000000000000000000000100100000001020000000000000000000000000000000000000000000020000000000000000100100", + "blockHash": "0xb0e51a6784e8eb45118c21fdaa1e6eab2374dbf9cfb71128fefe69f5f141b98e", + "transactionHash": "0x13c35bf6842a0688f3a8f4d5cdb5f03a5f4f069559b3971ce8182e2a1980181f", + "logs": [ + { + "transactionIndex": 23, + "blockNumber": 29554521, + "transactionHash": "0x13c35bf6842a0688f3a8f4d5cdb5f03a5f4f069559b3971ce8182e2a1980181f", + "address": "0xB8594DC01580884AD69FE5d78EDEA5e66BeB5fFA", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x", + "logIndex": 82, + "blockHash": "0xb0e51a6784e8eb45118c21fdaa1e6eab2374dbf9cfb71128fefe69f5f141b98e" + }, + { + "transactionIndex": 23, + "blockNumber": 29554521, + "transactionHash": "0x13c35bf6842a0688f3a8f4d5cdb5f03a5f4f069559b3971ce8182e2a1980181f", + "address": "0xB8594DC01580884AD69FE5d78EDEA5e66BeB5fFA", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc", + "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049", + "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049" + ], + "data": "0x", + "logIndex": 83, + "blockHash": "0xb0e51a6784e8eb45118c21fdaa1e6eab2374dbf9cfb71128fefe69f5f141b98e" + }, + { + "transactionIndex": 23, + "blockNumber": 29554521, + "transactionHash": "0x13c35bf6842a0688f3a8f4d5cdb5f03a5f4f069559b3971ce8182e2a1980181f", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x00000000000000000000000000000000000000000000000000223e2cc26efa000000000000000000000000000000000000000000000000000330148de3577a6d000000000000000000000000000000000000000000000941912dbfe086c95487000000000000000000000000000000000000000000000000030dd66120e8806d000000000000000000000000000000000000000000000941914ffe0d49384e87", + "logIndex": 84, + "blockHash": "0xb0e51a6784e8eb45118c21fdaa1e6eab2374dbf9cfb71128fefe69f5f141b98e" + } + ], + "blockNumber": 29554521, + "cumulativeGasUsed": "9189740", + "status": 1, + "byzantium": true + }, + "args": [ + "FleekSites", + "FLKSITE" + ], + "numDeployments": 1, + "solcInputHash": "0ee8c4d44ebad02e2364970b68450c98", + "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"commit_hash\",\"type\":\"string\"}],\"name\":\"NewBuild\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"NewTokenDescription\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"}],\"name\":\"NewTokenENS\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"external_url\",\"type\":\"string\"}],\"name\":\"NewTokenExternalURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"image\",\"type\":\"string\"}],\"name\":\"NewTokenImage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NewTokenName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLECTION_CONTROLLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COLLECTION_OWNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"addTokenController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isTokenController\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"image\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"external_url\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commit_hash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"git_repository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"author\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"removeTokenController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commit_hash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_git_repository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_author\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenImage\",\"type\":\"string\"}],\"name\":\"setTokenImage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(\\n address owner,\\n address operator,\\n bool approved\\n ) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256, /* firstTokenId */\\n uint256 batchSize\\n ) internal virtual {\\n if (batchSize > 1) {\\n if (from != address(0)) {\\n _balances[from] -= batchSize;\\n }\\n if (to != address(0)) {\\n _balances[to] += batchSize;\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 firstTokenId,\\n uint256 batchSize\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xd89f3585b211fc9e3408384a4c4efdc3a93b2f877a3821046fa01c219d35be1b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64 {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE = \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/FleekAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n\\r\\npragma solidity ^0.8.7;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\r\\n\\r\\nabstract contract FleekAccessControl is AccessControl {\\r\\n bytes32 public constant COLLECTION_OWNER_ROLE =\\r\\n keccak256(\\\"COLLECTION_OWNER_ROLE\\\");\\r\\n bytes32 public constant COLLECTION_CONTROLLER_ROLE =\\r\\n keccak256(\\\"COLLECTION_CONTROLLER_ROLE\\\");\\r\\n\\r\\n constructor() {\\r\\n _setRoleAdmin(COLLECTION_OWNER_ROLE, DEFAULT_ADMIN_ROLE);\\r\\n _grantRole(COLLECTION_OWNER_ROLE, msg.sender);\\r\\n }\\r\\n\\r\\n modifier requireCollectionOwner() {\\r\\n require(\\r\\n hasRole(COLLECTION_OWNER_ROLE, msg.sender),\\r\\n \\\"FleekAccessControl: must have collection owner role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n modifier requireCollectionController() {\\r\\n require(\\r\\n hasRole(COLLECTION_OWNER_ROLE, msg.sender) ||\\r\\n hasRole(COLLECTION_CONTROLLER_ROLE, msg.sender),\\r\\n \\\"FleekAccessControl: must have collection controller role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n modifier requireTokenController(uint256 tokenId) {\\r\\n require(\\r\\n hasRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), msg.sender),\\r\\n \\\"FleekAccessControl: must have token role\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n function isTokenController(\\r\\n uint256 tokenId,\\r\\n address account\\r\\n ) public view returns (bool) {\\r\\n return hasRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), account);\\r\\n }\\r\\n\\r\\n function _tokenRole(\\r\\n uint256 tokenId,\\r\\n string memory role\\r\\n ) internal pure returns (bytes32) {\\r\\n return keccak256(abi.encodePacked(\\\"TOKEN_\\\", role, tokenId));\\r\\n }\\r\\n\\r\\n function _clearTokenControllers(uint256 tokenId) internal {\\r\\n // TODO: Remove token controllers from AccessControl\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x6c8115940e2d11e8fb541873abefd9bbe1601bb6a3753580b2eea9feb2ce1014\",\"license\":\"MIT\"},\"contracts/FleekERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Base64.sol\\\";\\nimport \\\"./FleekAccessControl.sol\\\";\\n\\ncontract FleekERC721 is ERC721, FleekAccessControl {\\n using Strings for uint256;\\n using Counters for Counters.Counter;\\n\\n event NewBuild(uint256 indexed token, string indexed commit_hash);\\n event NewTokenName(uint256 indexed token, string indexed name);\\n event NewTokenDescription(uint256 indexed token, string indexed description);\\n event NewTokenImage(uint256 indexed token, string indexed image);\\n event NewTokenExternalURL(uint256 indexed token, string indexed external_url);\\n event NewTokenENS(uint256 indexed token, string indexed ENS);\\n\\n struct Build {\\n string commit_hash;\\n string git_repository;\\n string author;\\n }\\n\\n /**\\n * The properties are stored as string to keep consistency with\\n * other token contracts, we might consider changing for bytes32\\n * in the future due to gas optimization\\n */\\n struct App {\\n string name; // Name of the site\\n string description; // Description about the site\\n string image; // Preview Image IPFS Link\\n string external_url; // Site URL\\n string ENS; // ENS ID\\n uint256 current_build; // The current build number (Increments by one with each change, starts at zero)\\n mapping(uint256 => Build) builds; // Mapping to build details for each build number\\n }\\n\\n Counters.Counter private _tokenIds;\\n mapping(uint256 => App) private _apps;\\n\\n constructor(\\n string memory _name,\\n string memory _symbol\\n ) ERC721(_name, _symbol) {}\\n\\n modifier requireTokenOwner(uint256 tokenId) {\\n require(\\n msg.sender == ownerOf(tokenId),\\n \\\"FleekERC721: must be token owner\\\"\\n );\\n _;\\n }\\n\\n function mint(\\n address to,\\n string memory name,\\n string memory description,\\n string memory image,\\n string memory external_url,\\n string memory ENS,\\n string memory commit_hash,\\n string memory git_repository,\\n string memory author\\n ) public payable requireCollectionOwner returns (uint256) {\\n uint256 tokenId = _tokenIds.current();\\n _mint(to, tokenId);\\n _tokenIds.increment();\\n\\n App storage app = _apps[tokenId];\\n app.name = name;\\n app.description = description;\\n app.image = image;\\n app.external_url = external_url;\\n app.ENS = ENS;\\n\\n // The mint interaction is considered to be the first build of the site. Updates from now on all increment the current_build by one and update the mapping.\\n app.current_build = 0;\\n app.builds[0] = Build(commit_hash, git_repository, author);\\n\\n return tokenId;\\n }\\n\\n function tokenURI(\\n uint256 tokenId\\n ) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n address owner = ownerOf(tokenId);\\n App storage app = _apps[tokenId];\\n\\n bytes memory dataURI = abi.encodePacked(\\n '{',\\n '\\\"name\\\":\\\"', app.name, '\\\",',\\n '\\\"description\\\":\\\"', app.description, '\\\",',\\n '\\\"owner\\\":\\\"', Strings.toHexString(uint160(owner), 20), '\\\",',\\n '\\\"external_url\\\":\\\"', app.external_url, '\\\",',\\n '\\\"image\\\":\\\"', app.image, '\\\",',\\n '\\\"attributes\\\": [',\\n '{\\\"trait_type\\\": \\\"ENS\\\", \\\"value\\\":\\\"', app.ENS,'\\\"},',\\n '{\\\"trait_type\\\": \\\"Commit Hash\\\", \\\"value\\\":\\\"', app.builds[app.current_build].commit_hash,'\\\"},',\\n '{\\\"trait_type\\\": \\\"Repository\\\", \\\"value\\\":\\\"', app.builds[app.current_build].git_repository,'\\\"},',\\n '{\\\"trait_type\\\": \\\"Author\\\", \\\"value\\\":\\\"', app.builds[app.current_build].author,'\\\"},',\\n '{\\\"trait_type\\\": \\\"Version\\\", \\\"value\\\":\\\"', Strings.toString(app.current_build),'\\\"}',\\n ']',\\n '}'\\n );\\n\\n return string(abi.encodePacked(_baseURI(), Base64.encode((dataURI))));\\n }\\n\\n function addTokenController(\\n uint256 tokenId,\\n address controller\\n ) public requireTokenOwner(tokenId) {\\n _requireMinted(tokenId);\\n _grantRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), controller);\\n }\\n\\n function removeTokenController(\\n uint256 tokenId,\\n address controller\\n ) public requireTokenOwner(tokenId) {\\n _requireMinted(tokenId);\\n _revokeRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), controller);\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC721, AccessControl) returns (bool) {\\n return super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Override of _beforeTokenTransfer of ERC721.\\n * Here it needs to update the token controller roles for mint, burn and transfer.\\n * IMPORTANT: The function for clearing token controllers is not implemented yet.\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n uint256 batchSize\\n ) internal virtual override {\\n if (from != address(0) && to != address(0)) {\\n // Transfer\\n _clearTokenControllers(tokenId);\\n _grantRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), to);\\n } else if (from == address(0)) {\\n // Mint\\n _grantRole(_tokenRole(tokenId, \\\"CONTROLLER\\\"), to);\\n } else if (to == address(0)) {\\n // Burn\\n _clearTokenControllers(tokenId);\\n }\\n super._beforeTokenTransfer(from, to, tokenId, batchSize);\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return \\\"data:application/json;base64,\\\";\\n }\\n\\n function setTokenExternalURL(\\n uint256 tokenId,\\n string memory _tokenExternalURL\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].external_url = _tokenExternalURL;\\n emit NewTokenExternalURL(tokenId, _tokenExternalURL);\\n }\\n\\n function setTokenENS(\\n uint256 tokenId,\\n string memory _tokenENS\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].ENS = _tokenENS;\\n emit NewTokenENS(tokenId, _tokenENS);\\n }\\n\\n function setTokenName(\\n uint256 tokenId,\\n string memory _tokenName\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].name = _tokenName;\\n emit NewTokenName(tokenId, _tokenName);\\n }\\n\\n function setTokenDescription(\\n uint256 tokenId,\\n string memory _tokenDescription\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].description = _tokenDescription;\\n emit NewTokenDescription(tokenId, _tokenDescription);\\n }\\n\\n function setTokenImage(\\n uint256 tokenId,\\n string memory _tokenImage\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].image = _tokenImage;\\n emit NewTokenImage(tokenId, _tokenImage);\\n }\\n\\n function setTokenBuild(\\n uint256 tokenId,\\n string memory _commit_hash,\\n string memory _git_repository,\\n string memory _author\\n ) public virtual requireTokenController(tokenId) {\\n _requireMinted(tokenId);\\n _apps[tokenId].builds[++_apps[tokenId].current_build] = Build(\\n _commit_hash,\\n _git_repository,\\n _author\\n );\\n emit NewBuild(tokenId, _commit_hash);\\n }\\n\\n function burn(\\n uint256 tokenId\\n ) public virtual requireTokenOwner(tokenId) {\\n super._burn(tokenId);\\n\\n if (bytes(_apps[tokenId].external_url).length != 0) {\\n delete _apps[tokenId];\\n }\\n }\\n}\\n\",\"keccak256\":\"0x09e1fc900f727d7948ab307e3ed432c91e2e4b5c734343db7fd94577de3c27e3\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162005bda38038062005bda8339818101604052810190620000379190620003f3565b8181816000908051906020019062000051929190620002c5565b5080600190805190602001906200006a929190620002c5565b505050620000a27fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc6000801b620000dc60201b60201c565b620000d47fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc336200014060201b60201c565b5050620005fc565b6000620000ef836200023260201b60201c565b90508160066000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200015282826200025260201b60201c565b6200022e5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001d3620002bd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060066000838152602001908152602001600020600101549050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002d3906200050d565b90600052602060002090601f016020900481019282620002f7576000855562000343565b82601f106200031257805160ff191683800117855562000343565b8280016001018555821562000343579182015b828111156200034257825182559160200191906001019062000325565b5b50905062000352919062000356565b5090565b5b808211156200037157600081600090555060010162000357565b5090565b60006200038c6200038684620004a1565b62000478565b905082815260208101848484011115620003ab57620003aa620005dc565b5b620003b8848285620004d7565b509392505050565b600082601f830112620003d857620003d7620005d7565b5b8151620003ea84826020860162000375565b91505092915050565b600080604083850312156200040d576200040c620005e6565b5b600083015167ffffffffffffffff8111156200042e576200042d620005e1565b5b6200043c85828601620003c0565b925050602083015167ffffffffffffffff81111562000460576200045f620005e1565b5b6200046e85828601620003c0565b9150509250929050565b60006200048462000497565b905062000492828262000543565b919050565b6000604051905090565b600067ffffffffffffffff821115620004bf57620004be620005a8565b5b620004ca82620005eb565b9050602081019050919050565b60005b83811015620004f7578082015181840152602081019050620004da565b8381111562000507576000848401525b50505050565b600060028204905060018216806200052657607f821691505b602082108114156200053d576200053c62000579565b5b50919050565b6200054e82620005eb565b810181811067ffffffffffffffff8211171562000570576200056f620005a8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6155ce806200060c6000396000f3fe6080604052600436106101e35760003560e01c806395d89b4111610102578063befaa6a311610095578063dcd7818611610064578063dcd7818614610713578063e46f29c81461073c578063e985e9c514610767578063f9315177146107a4576101e3565b8063befaa6a31461065b578063c87b56dd14610684578063cdb0e89e146106c1578063d547741f146106ea576101e3565b8063a22cb465116100d1578063a22cb465146105b0578063b4ff9205146105d9578063b6959c3c14610609578063b88d4fde14610632576101e3565b806395d89b41146104f257806398b707931461051d5780639e8a3ca414610548578063a217fddf14610585576101e3565b806336568abe1161017a57806364140ec01161014957806364140ec01461042657806370a082311461044f57806378278cca1461048c57806391d14854146104b5576101e3565b806336568abe1461036e57806342842e0e1461039757806342966c68146103c05780636352211e146103e9576101e3565b806323b872dd116101b657806323b872dd146102b6578063246a908b146102df578063248a9ca3146103085780632f2ff15d14610345576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613b14565b6107cd565b60405161021c91906145f6565b60405180910390f35b34801561023157600080fd5b5061023a6107df565b604051610247919061462c565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613b6e565b610871565b604051610284919061458f565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613a67565b6108b7565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906137a7565b6109cf565b005b3480156102eb57600080fd5b5061030660048036038101906103019190613bdb565b610a2f565b005b34801561031457600080fd5b5061032f600480360381019061032a9190613aa7565b610b33565b60405161033c9190614611565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613ad4565b610b53565b005b34801561037a57600080fd5b5061039560048036038101906103909190613ad4565b610b74565b005b3480156103a357600080fd5b506103be60048036038101906103b991906137a7565b610bf7565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190613b6e565b610c17565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613b6e565b610d34565b60405161041d919061458f565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190613bdb565b610dbb565b005b34801561045b57600080fd5b506104766004803603810190610471919061373a565b610ebf565b604051610483919061484e565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613bdb565b610f77565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613ad4565b61107b565b6040516104e991906145f6565b60405180910390f35b3480156104fe57600080fd5b506105076110e6565b604051610514919061462c565b60405180910390f35b34801561052957600080fd5b50610532611178565b60405161053f9190614611565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190613b9b565b61119c565b60405161057c91906145f6565b60405180910390f35b34801561059157600080fd5b5061059a6111ee565b6040516105a79190614611565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d2919061387d565b6111f5565b005b6105f360048036038101906105ee91906138bd565b61120b565b604051610600919061484e565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613c37565b6113d2565b005b34801561063e57600080fd5b50610659600480360381019061065491906137fa565b611571565b005b34801561066757600080fd5b50610682600480360381019061067d9190613b9b565b6115d3565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613b6e565b6116a0565b6040516106b8919061462c565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613bdb565b6117cc565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613ad4565b6118d0565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613b9b565b6118f1565b005b34801561074857600080fd5b506107516119be565b60405161075e9190614611565b60405180910390f35b34801561077357600080fd5b5061078e60048036038101906107899190613767565b6119e2565b60405161079b91906145f6565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bdb565b611a76565b005b60006107d882611b7a565b9050919050565b6060600080546107ee90614b47565b80601f016020809104026020016040519081016040528092919081815260200182805461081a90614b47565b80156108675780601f1061083c57610100808354040283529160200191610867565b820191906000526020600020905b81548152906001019060200180831161084a57829003601f168201915b5050505050905090565b600061087c82611bf4565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282610d34565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a906147ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610952611c3f565b73ffffffffffffffffffffffffffffffffffffffff16148061098157506109808161097b611c3f565b6119e2565b5b6109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906147ce565b60405180910390fd5b6109ca8383611c47565b505050565b6109e06109da611c3f565b82611d00565b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a169061466e565b60405180910390fd5b610a2a838383611d95565b505050565b81610a78610a72826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061480e565b60405180910390fd5b610ac083611bf4565b81600860008581526020019081526020016000206001019080519060200190610aea9291906134f9565b5081604051610af99190614353565b6040518091039020837f9b3089e7af95b8d43fdceb16eb9cbf620a0cb486e1a291b15121a44e0f69127a60405160405180910390a3505050565b600060066000838152602001908152602001600020600101549050919050565b610b5c82610b33565b610b65816120c2565b610b6f83836120d6565b505050565b610b7c611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be09061482e565b60405180910390fd5b610bf382826121b7565b5050565b610c1283838360405180602001604052806000815250611571565b505050565b80610c2181610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061476e565b60405180910390fd5b610c9782612299565b6000600860008481526020019081526020016000206003018054610cba90614b47565b905014610d30576008600083815260200190815260200160002060008082016000610ce5919061357f565b600182016000610cf5919061357f565b600282016000610d05919061357f565b600382016000610d15919061357f565b600482016000610d25919061357f565b600582016000905550505b5050565b600080610d40836123e7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061478e565b60405180910390fd5b80915050919050565b81610e04610dfe826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a9061480e565b60405180910390fd5b610e4c83611bf4565b81600860008581526020019081526020016000206002019080519060200190610e769291906134f9565b5081604051610e859190614353565b6040518091039020837fb041870856ebefdd6a3cb1ac665eb6739281b855c912ff622e814dbf91c96bb660405160405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f279061472e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81610fc0610fba826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff69061480e565b60405180910390fd5b61100883611bf4565b816008600085815260200190815260200160002060040190805190602001906110329291906134f9565b50816040516110419190614353565b6040518091039020837fc1b5a2141fc60537be795a8771f5e8c80188922acb5399a6e463ea95aa852f3160405160405180910390a3505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546110f590614b47565b80601f016020809104026020016040519081016040528092919081815260200182805461112190614b47565b801561116e5780601f106111435761010080835404028352916020019161116e565b820191906000526020600020905b81548152906001019060200180831161115157829003601f168201915b5050505050905090565b7fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc81565b60006111e66111e0846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b8361107b565b905092915050565b6000801b81565b611207611200611c3f565b8383612424565b5050565b60006112377fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc3361107b565b611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906147ee565b60405180910390fd5b60006112826007612591565b905061128e8b8261259f565b61129860076127bd565b60006008600083815260200190815260200160002090508a8160000190805190602001906112c79291906134f9565b50898160010190805190602001906112e09291906134f9565b50888160020190805190602001906112f99291906134f9565b50878160030190805190602001906113129291906134f9565b508681600401908051906020019061132b9291906134f9565b506000816005018190555060405180606001604052808781526020018681526020018581525081600601600080815260200190815260200160002060008201518160000190805190602001906113829291906134f9565b50602082015181600101908051906020019061139f9291906134f9565b5060408201518160020190805190602001906113bc9291906134f9565b5090505081925050509998505050505050505050565b8361141b611415826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b61145a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114519061480e565b60405180910390fd5b61146385611bf4565b60405180606001604052808581526020018481526020018381525060086000878152602001908152602001600020600601600060086000898152602001908152602001600020600501600081546114b990614baa565b919050819055815260200190815260200160002060008201518160000190805190602001906114e99291906134f9565b5060208201518160010190805190602001906115069291906134f9565b5060408201518160020190805190602001906115239291906134f9565b50905050836040516115359190614353565b6040518091039020857ff0cd0ce9d5882a10e2780d2d9c805c18e7536b9b2c6412f7bfb7f163656dd0f660405160405180910390a35050505050565b61158261157c611c3f565b83611d00565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061466e565b60405180910390fd5b6115cd848484846127d3565b50505050565b816115dd81610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116419061476e565b60405180910390fd5b61165383611bf4565b61169b611695846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b836121b7565b505050565b60606116ab82611bf4565b60006116b683610d34565b90506000600860008581526020019081526020016000209050600081600001826001016116fa8573ffffffffffffffffffffffffffffffffffffffff16601461282f565b846003018560020186600401876006016000896005015481526020019081526020016000206000018860060160008a6005015481526020019081526020016000206001018960060160008b6005015481526020019081526020016000206002016117678b60050154612a6b565b6040516020016117809a999897969594939291906143c1565b6040516020818303038152906040529050611799612b43565b6117a282612b80565b6040516020016117b392919061436a565b6040516020818303038152906040529350505050919050565b8161181561180f826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061480e565b60405180910390fd5b61185d83611bf4565b816008600085815260200190815260200160002060000190805190602001906118879291906134f9565b50816040516118969190614353565b6040518091039020837fabf44020991f188f6b302a14e4b7a3dc94de10ed2140a6c03e16f4213d11b1c960405160405180910390a3505050565b6118d982610b33565b6118e2816120c2565b6118ec83836121b7565b505050565b816118fb81610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061476e565b60405180910390fd5b61197183611bf4565b6119b96119b3846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b836120d6565b505050565b7f54812023c8fe13756580f3420840aeb566f69714bea27346e22e4c654756d77e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81611abf611ab9826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af59061480e565b60405180910390fd5b611b0783611bf4565b81600860008581526020019081526020016000206003019080519060200190611b319291906134f9565b5081604051611b409190614353565b6040518091039020837f9f284fd257fb85bc33901e673c078261b0222fbcc4b52c74784c9566808e3cfc60405160405180910390a3505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bed5750611bec82612ce4565b5b9050919050565b611bfd81612dc6565b611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c339061478e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cba83610d34565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611d0c83610d34565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d4e5750611d4d81856119e2565b5b80611d8c57508373ffffffffffffffffffffffffffffffffffffffff16611d7484610871565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611db582610d34565b73ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906146ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e72906146ee565b60405180910390fd5b611e888383836001612e07565b8273ffffffffffffffffffffffffffffffffffffffff16611ea882610d34565b73ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef5906146ae565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461208a8383836001612fa1565b505050565b600081836040516020016120a492919061438e565b60405160208183030381529060405280519060200120905092915050565b6120d3816120ce611c3f565b612fa7565b50565b6120e0828261107b565b6121b35760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612158611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6121c1828261107b565b156122955760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061223a611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006122a482610d34565b90506122b4816000846001612e07565b6122bd82610d34565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e3816000846001612fa1565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a9061470e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161258491906145f6565b60405180910390a3505050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561260f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126069061474e565b60405180910390fd5b61261881612dc6565b15612658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264f906146ce565b60405180910390fd5b612666600083836001612e07565b61266f81612dc6565b156126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a6906146ce565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b9600083836001612fa1565b5050565b6001816000016000828254019250508190555050565b6127de848484611d95565b6127ea8484848461302c565b612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061468e565b60405180910390fd5b50505050565b60606000600283600261284291906149cf565b61284c9190614948565b67ffffffffffffffff81111561286557612864614cb9565b5b6040519080825280601f01601f1916602001820160405280156128975781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128cf576128ce614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061293357612932614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261297391906149cf565b61297d9190614948565b90505b6001811115612a1d577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129bf576129be614c8a565b5b1a60f81b8282815181106129d6576129d5614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a1690614b1d565b9050612980565b5060008414612a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a589061464e565b60405180910390fd5b8091505092915050565b606060006001612a7a846131c3565b01905060008167ffffffffffffffff811115612a9957612a98614cb9565b5b6040519080825280601f01601f191660200182016040528015612acb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612b38578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612b2257612b21614c2c565b5b0494506000851415612b3357612b38565b612ad9565b819350505050919050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082511415612ba357604051806020016040528060008152509050612cdf565b60006040518060600160405280604081526020016155596040913990506000600360028551612bd29190614948565b612bdc919061499e565b6004612be891906149cf565b67ffffffffffffffff811115612c0157612c00614cb9565b5b6040519080825280601f01601f191660200182016040528015612c335781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612c9f576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612c44565b5050600386510660018114612cbb5760028114612cce57612cd6565b603d6001830353603d6002830353612cd6565b603d60018303535b50505080925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612daf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dbf5750612dbe82613316565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612de8836123e7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015612e715750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612ecc57612e7f82613380565b612ec7612ec1836040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b846120d6565b612f8f565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f4e57612f49612f43836040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b846120d6565b612f8e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f8d57612f8c82613380565b5b5b5b612f9b84848484613383565b50505050565b50505050565b612fb1828261107b565b61302857612fbe816134a9565b612fcc8360001c602061282f565b604051602001612fdd929190614555565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f919061462c565b60405180910390fd5b5050565b600061304d8473ffffffffffffffffffffffffffffffffffffffff166134d6565b156131b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613076611c3f565b8786866040518563ffffffff1660e01b815260040161309894939291906145aa565b602060405180830381600087803b1580156130b257600080fd5b505af19250505080156130e357506040513d601f19601f820116820180604052508101906130e09190613b41565b60015b613166573d8060008114613113576040519150601f19603f3d011682016040523d82523d6000602084013e613118565b606091505b5060008151141561315e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131559061468e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131bb565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613221577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161321757613216614c2c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061325e576d04ee2d6d415b85acef8100000000838161325457613253614c2c565b5b0492506020810190505b662386f26fc10000831061328d57662386f26fc10000838161328357613282614c2c565b5b0492506010810190505b6305f5e10083106132b6576305f5e10083816132ac576132ab614c2c565b5b0492506008810190505b61271083106132db5761271083816132d1576132d0614c2c565b5b0492506004810190505b606483106132fe57606483816132f4576132f3614c2c565b5b0492506002810190505b600a831061330d576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50565b60018111156134a357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134175780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461340f9190614a29565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134a25780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349a9190614948565b925050819055505b5b50505050565b60606134cf8273ffffffffffffffffffffffffffffffffffffffff16601460ff1661282f565b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461350590614b47565b90600052602060002090601f016020900481019282613527576000855561356e565b82601f1061354057805160ff191683800117855561356e565b8280016001018555821561356e579182015b8281111561356d578251825591602001919060010190613552565b5b50905061357b91906135bf565b5090565b50805461358b90614b47565b6000825580601f1061359d57506135bc565b601f0160209004906000526020600020908101906135bb91906135bf565b5b50565b5b808211156135d85760008160009055506001016135c0565b5090565b60006135ef6135ea8461488e565b614869565b90508281526020810184848401111561360b5761360a614ced565b5b613616848285614adb565b509392505050565b600061363161362c846148bf565b614869565b90508281526020810184848401111561364d5761364c614ced565b5b613658848285614adb565b509392505050565b60008135905061366f816154e5565b92915050565b600081359050613684816154fc565b92915050565b60008135905061369981615513565b92915050565b6000813590506136ae8161552a565b92915050565b6000815190506136c38161552a565b92915050565b600082601f8301126136de576136dd614ce8565b5b81356136ee8482602086016135dc565b91505092915050565b600082601f83011261370c5761370b614ce8565b5b813561371c84826020860161361e565b91505092915050565b60008135905061373481615541565b92915050565b6000602082840312156137505761374f614cf7565b5b600061375e84828501613660565b91505092915050565b6000806040838503121561377e5761377d614cf7565b5b600061378c85828601613660565b925050602061379d85828601613660565b9150509250929050565b6000806000606084860312156137c0576137bf614cf7565b5b60006137ce86828701613660565b93505060206137df86828701613660565b92505060406137f086828701613725565b9150509250925092565b6000806000806080858703121561381457613813614cf7565b5b600061382287828801613660565b945050602061383387828801613660565b935050604061384487828801613725565b925050606085013567ffffffffffffffff81111561386557613864614cf2565b5b613871878288016136c9565b91505092959194509250565b6000806040838503121561389457613893614cf7565b5b60006138a285828601613660565b92505060206138b385828601613675565b9150509250929050565b60008060008060008060008060006101208a8c0312156138e0576138df614cf7565b5b60006138ee8c828d01613660565b99505060208a013567ffffffffffffffff81111561390f5761390e614cf2565b5b61391b8c828d016136f7565b98505060408a013567ffffffffffffffff81111561393c5761393b614cf2565b5b6139488c828d016136f7565b97505060608a013567ffffffffffffffff81111561396957613968614cf2565b5b6139758c828d016136f7565b96505060808a013567ffffffffffffffff81111561399657613995614cf2565b5b6139a28c828d016136f7565b95505060a08a013567ffffffffffffffff8111156139c3576139c2614cf2565b5b6139cf8c828d016136f7565b94505060c08a013567ffffffffffffffff8111156139f0576139ef614cf2565b5b6139fc8c828d016136f7565b93505060e08a013567ffffffffffffffff811115613a1d57613a1c614cf2565b5b613a298c828d016136f7565b9250506101008a013567ffffffffffffffff811115613a4b57613a4a614cf2565b5b613a578c828d016136f7565b9150509295985092959850929598565b60008060408385031215613a7e57613a7d614cf7565b5b6000613a8c85828601613660565b9250506020613a9d85828601613725565b9150509250929050565b600060208284031215613abd57613abc614cf7565b5b6000613acb8482850161368a565b91505092915050565b60008060408385031215613aeb57613aea614cf7565b5b6000613af98582860161368a565b9250506020613b0a85828601613660565b9150509250929050565b600060208284031215613b2a57613b29614cf7565b5b6000613b388482850161369f565b91505092915050565b600060208284031215613b5757613b56614cf7565b5b6000613b65848285016136b4565b91505092915050565b600060208284031215613b8457613b83614cf7565b5b6000613b9284828501613725565b91505092915050565b60008060408385031215613bb257613bb1614cf7565b5b6000613bc085828601613725565b9250506020613bd185828601613660565b9150509250929050565b60008060408385031215613bf257613bf1614cf7565b5b6000613c0085828601613725565b925050602083013567ffffffffffffffff811115613c2157613c20614cf2565b5b613c2d858286016136f7565b9150509250929050565b60008060008060808587031215613c5157613c50614cf7565b5b6000613c5f87828801613725565b945050602085013567ffffffffffffffff811115613c8057613c7f614cf2565b5b613c8c878288016136f7565b935050604085013567ffffffffffffffff811115613cad57613cac614cf2565b5b613cb9878288016136f7565b925050606085013567ffffffffffffffff811115613cda57613cd9614cf2565b5b613ce6878288016136f7565b91505092959194509250565b613cfb81614a5d565b82525050565b613d0a81614a6f565b82525050565b613d1981614a7b565b82525050565b6000613d2a82614905565b613d34818561491b565b9350613d44818560208601614aea565b613d4d81614cfc565b840191505092915050565b6000613d6382614910565b613d6d818561492c565b9350613d7d818560208601614aea565b613d8681614cfc565b840191505092915050565b6000613d9c82614910565b613da6818561493d565b9350613db6818560208601614aea565b80840191505092915050565b60008154613dcf81614b47565b613dd9818661493d565b94506001821660008114613df45760018114613e0557613e38565b60ff19831686528186019350613e38565b613e0e856148f0565b60005b83811015613e3057815481890152600182019150602081019050613e11565b838801955050505b50505092915050565b6000613e4e60208361492c565b9150613e5982614d0d565b602082019050919050565b6000613e71602d8361492c565b9150613e7c82614d36565b604082019050919050565b6000613e9460108361493d565b9150613e9f82614d85565b601082019050919050565b6000613eb760328361492c565b9150613ec282614dae565b604082019050919050565b6000613eda600f8361493d565b9150613ee582614dfd565b600f82019050919050565b6000613efd60028361493d565b9150613f0882614e26565b600282019050919050565b6000613f2060258361492c565b9150613f2b82614e4f565b604082019050919050565b6000613f4360238361493d565b9150613f4e82614e9e565b602382019050919050565b6000613f66601c8361492c565b9150613f7182614eed565b602082019050919050565b6000613f8960038361493d565b9150613f9482614f16565b600382019050919050565b6000613fac60248361492c565b9150613fb782614f3f565b604082019050919050565b6000613fcf60198361492c565b9150613fda82614f8e565b602082019050919050565b6000613ff260268361493d565b9150613ffd82614fb7565b602682019050919050565b600061401560088361493d565b915061402082615006565b600882019050919050565b600061403860228361493d565b91506140438261502f565b602282019050919050565b600061405b60068361493d565b91506140668261507e565b600682019050919050565b600061407e60298361492c565b9150614089826150a7565b604082019050919050565b60006140a160098361493d565b91506140ac826150f6565b600982019050919050565b60006140c460028361493d565b91506140cf8261511f565b600282019050919050565b60006140e760208361492c565b91506140f282615148565b602082019050919050565b600061410a60018361493d565b915061411582615171565b600182019050919050565b600061412d60208361492c565b91506141388261519a565b602082019050919050565b600061415060018361493d565b915061415b826151c3565b600182019050919050565b6000614173600f8361493d565b915061417e826151ec565b600f82019050919050565b600061419660098361493d565b91506141a182615215565b600982019050919050565b60006141b960188361492c565b91506141c48261523e565b602082019050919050565b60006141dc601f8361493d565b91506141e782615267565b601f82019050919050565b60006141ff60018361493d565b915061420a82615290565b600182019050919050565b600061422260218361492c565b915061422d826152b9565b604082019050919050565b600061424560278361493d565b915061425082615308565b602782019050919050565b6000614268603d8361492c565b915061427382615357565b604082019050919050565b600061428b60178361493d565b9150614296826153a6565b601782019050919050565b60006142ae60338361492c565b91506142b9826153cf565b604082019050919050565b60006142d160288361492c565b91506142dc8261541e565b604082019050919050565b60006142f460118361493d565b91506142ff8261546d565b601182019050919050565b6000614317602f8361492c565b915061432282615496565b604082019050919050565b61433681614ad1565b82525050565b61434d61434882614ad1565b614bf3565b82525050565b600061435f8284613d91565b915081905092915050565b60006143768285613d91565b91506143828284613d91565b91508190509392505050565b60006143998261404e565b91506143a58285613d91565b91506143b1828461433c565b6020820191508190509392505050565b60006143cc82614143565b91506143d782614008565b91506143e3828d613dc2565b91506143ee82613ef0565b91506143f982613ecd565b9150614405828c613dc2565b915061441082613ef0565b915061441b82614189565b9150614427828b613d91565b915061443282613ef0565b915061443d82613e87565b9150614449828a613dc2565b915061445482613ef0565b915061445f82614094565b915061446b8289613dc2565b915061447682613ef0565b915061448182614166565b915061448c826141cf565b91506144988288613dc2565b91506144a382613f7c565b91506144ae82614238565b91506144ba8287613dc2565b91506144c582613f7c565b91506144d082613fe5565b91506144dc8286613dc2565b91506144e782613f7c565b91506144f28261402b565b91506144fe8285613dc2565b915061450982613f7c565b915061451482613f36565b91506145208284613d91565b915061452b826140b7565b9150614536826141f2565b9150614541826140fd565b91508190509b9a5050505050505050505050565b60006145608261427e565b915061456c8285613d91565b9150614577826142e7565b91506145838284613d91565b91508190509392505050565b60006020820190506145a46000830184613cf2565b92915050565b60006080820190506145bf6000830187613cf2565b6145cc6020830186613cf2565b6145d9604083018561432d565b81810360608301526145eb8184613d1f565b905095945050505050565b600060208201905061460b6000830184613d01565b92915050565b60006020820190506146266000830184613d10565b92915050565b600060208201905081810360008301526146468184613d58565b905092915050565b6000602082019050818103600083015261466781613e41565b9050919050565b6000602082019050818103600083015261468781613e64565b9050919050565b600060208201905081810360008301526146a781613eaa565b9050919050565b600060208201905081810360008301526146c781613f13565b9050919050565b600060208201905081810360008301526146e781613f59565b9050919050565b6000602082019050818103600083015261470781613f9f565b9050919050565b6000602082019050818103600083015261472781613fc2565b9050919050565b6000602082019050818103600083015261474781614071565b9050919050565b60006020820190508181036000830152614767816140da565b9050919050565b6000602082019050818103600083015261478781614120565b9050919050565b600060208201905081810360008301526147a7816141ac565b9050919050565b600060208201905081810360008301526147c781614215565b9050919050565b600060208201905081810360008301526147e78161425b565b9050919050565b60006020820190508181036000830152614807816142a1565b9050919050565b60006020820190508181036000830152614827816142c4565b9050919050565b600060208201905081810360008301526148478161430a565b9050919050565b6000602082019050614863600083018461432d565b92915050565b6000614873614884565b905061487f8282614b79565b919050565b6000604051905090565b600067ffffffffffffffff8211156148a9576148a8614cb9565b5b6148b282614cfc565b9050602081019050919050565b600067ffffffffffffffff8211156148da576148d9614cb9565b5b6148e382614cfc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061495382614ad1565b915061495e83614ad1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561499357614992614bfd565b5b828201905092915050565b60006149a982614ad1565b91506149b483614ad1565b9250826149c4576149c3614c2c565b5b828204905092915050565b60006149da82614ad1565b91506149e583614ad1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1e57614a1d614bfd565b5b828202905092915050565b6000614a3482614ad1565b9150614a3f83614ad1565b925082821015614a5257614a51614bfd565b5b828203905092915050565b6000614a6882614ab1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b08578082015181840152602081019050614aed565b83811115614b17576000848401525b50505050565b6000614b2882614ad1565b91506000821415614b3c57614b3b614bfd565b5b600182039050919050565b60006002820490506001821680614b5f57607f821691505b60208210811415614b7357614b72614c5b565b5b50919050565b614b8282614cfc565b810181811067ffffffffffffffff82111715614ba157614ba0614cb9565b5b80604052505050565b6000614bb582614ad1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614be857614be7614bfd565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202256657273696f6e222c202276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b2274726169745f74797065223a20225265706f7369746f7279222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a2022417574686f72222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b4552433732313a206d75737420626520746f6b656e206f776e6572600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f7b2274726169745f74797065223a2022454e53222c202276616c7565223a2200600082015250565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e206f776e657220726f6c6500000000000000000000000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6154ee81614a5d565b81146154f957600080fd5b50565b61550581614a6f565b811461551057600080fd5b50565b61551c81614a7b565b811461552757600080fd5b50565b61553381614a85565b811461553e57600080fd5b50565b61554a81614ad1565b811461555557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205246882f1f7107874499f15cd7bbafb2b47fb926e7a8f78e5904c597b5cebf8b64736f6c63430008070033", + "deployedBytecode": "0x6080604052600436106101e35760003560e01c806395d89b4111610102578063befaa6a311610095578063dcd7818611610064578063dcd7818614610713578063e46f29c81461073c578063e985e9c514610767578063f9315177146107a4576101e3565b8063befaa6a31461065b578063c87b56dd14610684578063cdb0e89e146106c1578063d547741f146106ea576101e3565b8063a22cb465116100d1578063a22cb465146105b0578063b4ff9205146105d9578063b6959c3c14610609578063b88d4fde14610632576101e3565b806395d89b41146104f257806398b707931461051d5780639e8a3ca414610548578063a217fddf14610585576101e3565b806336568abe1161017a57806364140ec01161014957806364140ec01461042657806370a082311461044f57806378278cca1461048c57806391d14854146104b5576101e3565b806336568abe1461036e57806342842e0e1461039757806342966c68146103c05780636352211e146103e9576101e3565b806323b872dd116101b657806323b872dd146102b6578063246a908b146102df578063248a9ca3146103085780632f2ff15d14610345576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613b14565b6107cd565b60405161021c91906145f6565b60405180910390f35b34801561023157600080fd5b5061023a6107df565b604051610247919061462c565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613b6e565b610871565b604051610284919061458f565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613a67565b6108b7565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906137a7565b6109cf565b005b3480156102eb57600080fd5b5061030660048036038101906103019190613bdb565b610a2f565b005b34801561031457600080fd5b5061032f600480360381019061032a9190613aa7565b610b33565b60405161033c9190614611565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613ad4565b610b53565b005b34801561037a57600080fd5b5061039560048036038101906103909190613ad4565b610b74565b005b3480156103a357600080fd5b506103be60048036038101906103b991906137a7565b610bf7565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190613b6e565b610c17565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613b6e565b610d34565b60405161041d919061458f565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190613bdb565b610dbb565b005b34801561045b57600080fd5b506104766004803603810190610471919061373a565b610ebf565b604051610483919061484e565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190613bdb565b610f77565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613ad4565b61107b565b6040516104e991906145f6565b60405180910390f35b3480156104fe57600080fd5b506105076110e6565b604051610514919061462c565b60405180910390f35b34801561052957600080fd5b50610532611178565b60405161053f9190614611565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190613b9b565b61119c565b60405161057c91906145f6565b60405180910390f35b34801561059157600080fd5b5061059a6111ee565b6040516105a79190614611565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d2919061387d565b6111f5565b005b6105f360048036038101906105ee91906138bd565b61120b565b604051610600919061484e565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613c37565b6113d2565b005b34801561063e57600080fd5b50610659600480360381019061065491906137fa565b611571565b005b34801561066757600080fd5b50610682600480360381019061067d9190613b9b565b6115d3565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613b6e565b6116a0565b6040516106b8919061462c565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613bdb565b6117cc565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613ad4565b6118d0565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613b9b565b6118f1565b005b34801561074857600080fd5b506107516119be565b60405161075e9190614611565b60405180910390f35b34801561077357600080fd5b5061078e60048036038101906107899190613767565b6119e2565b60405161079b91906145f6565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bdb565b611a76565b005b60006107d882611b7a565b9050919050565b6060600080546107ee90614b47565b80601f016020809104026020016040519081016040528092919081815260200182805461081a90614b47565b80156108675780601f1061083c57610100808354040283529160200191610867565b820191906000526020600020905b81548152906001019060200180831161084a57829003601f168201915b5050505050905090565b600061087c82611bf4565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282610d34565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a906147ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610952611c3f565b73ffffffffffffffffffffffffffffffffffffffff16148061098157506109808161097b611c3f565b6119e2565b5b6109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906147ce565b60405180910390fd5b6109ca8383611c47565b505050565b6109e06109da611c3f565b82611d00565b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a169061466e565b60405180910390fd5b610a2a838383611d95565b505050565b81610a78610a72826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae9061480e565b60405180910390fd5b610ac083611bf4565b81600860008581526020019081526020016000206001019080519060200190610aea9291906134f9565b5081604051610af99190614353565b6040518091039020837f9b3089e7af95b8d43fdceb16eb9cbf620a0cb486e1a291b15121a44e0f69127a60405160405180910390a3505050565b600060066000838152602001908152602001600020600101549050919050565b610b5c82610b33565b610b65816120c2565b610b6f83836120d6565b505050565b610b7c611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be09061482e565b60405180910390fd5b610bf382826121b7565b5050565b610c1283838360405180602001604052806000815250611571565b505050565b80610c2181610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061476e565b60405180910390fd5b610c9782612299565b6000600860008481526020019081526020016000206003018054610cba90614b47565b905014610d30576008600083815260200190815260200160002060008082016000610ce5919061357f565b600182016000610cf5919061357f565b600282016000610d05919061357f565b600382016000610d15919061357f565b600482016000610d25919061357f565b600582016000905550505b5050565b600080610d40836123e7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da99061478e565b60405180910390fd5b80915050919050565b81610e04610dfe826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a9061480e565b60405180910390fd5b610e4c83611bf4565b81600860008581526020019081526020016000206002019080519060200190610e769291906134f9565b5081604051610e859190614353565b6040518091039020837fb041870856ebefdd6a3cb1ac665eb6739281b855c912ff622e814dbf91c96bb660405160405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f279061472e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81610fc0610fba826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff69061480e565b60405180910390fd5b61100883611bf4565b816008600085815260200190815260200160002060040190805190602001906110329291906134f9565b50816040516110419190614353565b6040518091039020837fc1b5a2141fc60537be795a8771f5e8c80188922acb5399a6e463ea95aa852f3160405160405180910390a3505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546110f590614b47565b80601f016020809104026020016040519081016040528092919081815260200182805461112190614b47565b801561116e5780601f106111435761010080835404028352916020019161116e565b820191906000526020600020905b81548152906001019060200180831161115157829003601f168201915b5050505050905090565b7fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc81565b60006111e66111e0846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b8361107b565b905092915050565b6000801b81565b611207611200611c3f565b8383612424565b5050565b60006112377fcac50f86c292f6863f130b9e1133a5f875e8e957fed41745b8fa2498550cbdfc3361107b565b611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906147ee565b60405180910390fd5b60006112826007612591565b905061128e8b8261259f565b61129860076127bd565b60006008600083815260200190815260200160002090508a8160000190805190602001906112c79291906134f9565b50898160010190805190602001906112e09291906134f9565b50888160020190805190602001906112f99291906134f9565b50878160030190805190602001906113129291906134f9565b508681600401908051906020019061132b9291906134f9565b506000816005018190555060405180606001604052808781526020018681526020018581525081600601600080815260200190815260200160002060008201518160000190805190602001906113829291906134f9565b50602082015181600101908051906020019061139f9291906134f9565b5060408201518160020190805190602001906113bc9291906134f9565b5090505081925050509998505050505050505050565b8361141b611415826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b61145a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114519061480e565b60405180910390fd5b61146385611bf4565b60405180606001604052808581526020018481526020018381525060086000878152602001908152602001600020600601600060086000898152602001908152602001600020600501600081546114b990614baa565b919050819055815260200190815260200160002060008201518160000190805190602001906114e99291906134f9565b5060208201518160010190805190602001906115069291906134f9565b5060408201518160020190805190602001906115239291906134f9565b50905050836040516115359190614353565b6040518091039020857ff0cd0ce9d5882a10e2780d2d9c805c18e7536b9b2c6412f7bfb7f163656dd0f660405160405180910390a35050505050565b61158261157c611c3f565b83611d00565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061466e565b60405180910390fd5b6115cd848484846127d3565b50505050565b816115dd81610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116419061476e565b60405180910390fd5b61165383611bf4565b61169b611695846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b836121b7565b505050565b60606116ab82611bf4565b60006116b683610d34565b90506000600860008581526020019081526020016000209050600081600001826001016116fa8573ffffffffffffffffffffffffffffffffffffffff16601461282f565b846003018560020186600401876006016000896005015481526020019081526020016000206000018860060160008a6005015481526020019081526020016000206001018960060160008b6005015481526020019081526020016000206002016117678b60050154612a6b565b6040516020016117809a999897969594939291906143c1565b6040516020818303038152906040529050611799612b43565b6117a282612b80565b6040516020016117b392919061436a565b6040516020818303038152906040529350505050919050565b8161181561180f826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061480e565b60405180910390fd5b61185d83611bf4565b816008600085815260200190815260200160002060000190805190602001906118879291906134f9565b50816040516118969190614353565b6040518091039020837fabf44020991f188f6b302a14e4b7a3dc94de10ed2140a6c03e16f4213d11b1c960405160405180910390a3505050565b6118d982610b33565b6118e2816120c2565b6118ec83836121b7565b505050565b816118fb81610d34565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061476e565b60405180910390fd5b61197183611bf4565b6119b96119b3846040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b836120d6565b505050565b7f54812023c8fe13756580f3420840aeb566f69714bea27346e22e4c654756d77e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81611abf611ab9826040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b3361107b565b611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af59061480e565b60405180910390fd5b611b0783611bf4565b81600860008581526020019081526020016000206003019080519060200190611b319291906134f9565b5081604051611b409190614353565b6040518091039020837f9f284fd257fb85bc33901e673c078261b0222fbcc4b52c74784c9566808e3cfc60405160405180910390a3505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bed5750611bec82612ce4565b5b9050919050565b611bfd81612dc6565b611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c339061478e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cba83610d34565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611d0c83610d34565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d4e5750611d4d81856119e2565b5b80611d8c57508373ffffffffffffffffffffffffffffffffffffffff16611d7484610871565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611db582610d34565b73ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906146ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e72906146ee565b60405180910390fd5b611e888383836001612e07565b8273ffffffffffffffffffffffffffffffffffffffff16611ea882610d34565b73ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef5906146ae565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461208a8383836001612fa1565b505050565b600081836040516020016120a492919061438e565b60405160208183030381529060405280519060200120905092915050565b6120d3816120ce611c3f565b612fa7565b50565b6120e0828261107b565b6121b35760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612158611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6121c1828261107b565b156122955760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061223a611c3f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006122a482610d34565b90506122b4816000846001612e07565b6122bd82610d34565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e3816000846001612fa1565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a9061470e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161258491906145f6565b60405180910390a3505050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561260f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126069061474e565b60405180910390fd5b61261881612dc6565b15612658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264f906146ce565b60405180910390fd5b612666600083836001612e07565b61266f81612dc6565b156126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a6906146ce565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b9600083836001612fa1565b5050565b6001816000016000828254019250508190555050565b6127de848484611d95565b6127ea8484848461302c565b612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061468e565b60405180910390fd5b50505050565b60606000600283600261284291906149cf565b61284c9190614948565b67ffffffffffffffff81111561286557612864614cb9565b5b6040519080825280601f01601f1916602001820160405280156128975781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128cf576128ce614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061293357612932614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261297391906149cf565b61297d9190614948565b90505b6001811115612a1d577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129bf576129be614c8a565b5b1a60f81b8282815181106129d6576129d5614c8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a1690614b1d565b9050612980565b5060008414612a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a589061464e565b60405180910390fd5b8091505092915050565b606060006001612a7a846131c3565b01905060008167ffffffffffffffff811115612a9957612a98614cb9565b5b6040519080825280601f01601f191660200182016040528015612acb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612b38578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612b2257612b21614c2c565b5b0494506000851415612b3357612b38565b612ad9565b819350505050919050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082511415612ba357604051806020016040528060008152509050612cdf565b60006040518060600160405280604081526020016155596040913990506000600360028551612bd29190614948565b612bdc919061499e565b6004612be891906149cf565b67ffffffffffffffff811115612c0157612c00614cb9565b5b6040519080825280601f01601f191660200182016040528015612c335781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612c9f576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612c44565b5050600386510660018114612cbb5760028114612cce57612cd6565b603d6001830353603d6002830353612cd6565b603d60018303535b50505080925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612daf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dbf5750612dbe82613316565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612de8836123e7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015612e715750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612ecc57612e7f82613380565b612ec7612ec1836040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b846120d6565b612f8f565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f4e57612f49612f43836040518060400160405280600a81526020017f434f4e54524f4c4c45520000000000000000000000000000000000000000000081525061208f565b846120d6565b612f8e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f8d57612f8c82613380565b5b5b5b612f9b84848484613383565b50505050565b50505050565b612fb1828261107b565b61302857612fbe816134a9565b612fcc8360001c602061282f565b604051602001612fdd929190614555565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f919061462c565b60405180910390fd5b5050565b600061304d8473ffffffffffffffffffffffffffffffffffffffff166134d6565b156131b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613076611c3f565b8786866040518563ffffffff1660e01b815260040161309894939291906145aa565b602060405180830381600087803b1580156130b257600080fd5b505af19250505080156130e357506040513d601f19601f820116820180604052508101906130e09190613b41565b60015b613166573d8060008114613113576040519150601f19603f3d011682016040523d82523d6000602084013e613118565b606091505b5060008151141561315e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131559061468e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131bb565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613221577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161321757613216614c2c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061325e576d04ee2d6d415b85acef8100000000838161325457613253614c2c565b5b0492506020810190505b662386f26fc10000831061328d57662386f26fc10000838161328357613282614c2c565b5b0492506010810190505b6305f5e10083106132b6576305f5e10083816132ac576132ab614c2c565b5b0492506008810190505b61271083106132db5761271083816132d1576132d0614c2c565b5b0492506004810190505b606483106132fe57606483816132f4576132f3614c2c565b5b0492506002810190505b600a831061330d576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50565b60018111156134a357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134175780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461340f9190614a29565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134a25780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349a9190614948565b925050819055505b5b50505050565b60606134cf8273ffffffffffffffffffffffffffffffffffffffff16601460ff1661282f565b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461350590614b47565b90600052602060002090601f016020900481019282613527576000855561356e565b82601f1061354057805160ff191683800117855561356e565b8280016001018555821561356e579182015b8281111561356d578251825591602001919060010190613552565b5b50905061357b91906135bf565b5090565b50805461358b90614b47565b6000825580601f1061359d57506135bc565b601f0160209004906000526020600020908101906135bb91906135bf565b5b50565b5b808211156135d85760008160009055506001016135c0565b5090565b60006135ef6135ea8461488e565b614869565b90508281526020810184848401111561360b5761360a614ced565b5b613616848285614adb565b509392505050565b600061363161362c846148bf565b614869565b90508281526020810184848401111561364d5761364c614ced565b5b613658848285614adb565b509392505050565b60008135905061366f816154e5565b92915050565b600081359050613684816154fc565b92915050565b60008135905061369981615513565b92915050565b6000813590506136ae8161552a565b92915050565b6000815190506136c38161552a565b92915050565b600082601f8301126136de576136dd614ce8565b5b81356136ee8482602086016135dc565b91505092915050565b600082601f83011261370c5761370b614ce8565b5b813561371c84826020860161361e565b91505092915050565b60008135905061373481615541565b92915050565b6000602082840312156137505761374f614cf7565b5b600061375e84828501613660565b91505092915050565b6000806040838503121561377e5761377d614cf7565b5b600061378c85828601613660565b925050602061379d85828601613660565b9150509250929050565b6000806000606084860312156137c0576137bf614cf7565b5b60006137ce86828701613660565b93505060206137df86828701613660565b92505060406137f086828701613725565b9150509250925092565b6000806000806080858703121561381457613813614cf7565b5b600061382287828801613660565b945050602061383387828801613660565b935050604061384487828801613725565b925050606085013567ffffffffffffffff81111561386557613864614cf2565b5b613871878288016136c9565b91505092959194509250565b6000806040838503121561389457613893614cf7565b5b60006138a285828601613660565b92505060206138b385828601613675565b9150509250929050565b60008060008060008060008060006101208a8c0312156138e0576138df614cf7565b5b60006138ee8c828d01613660565b99505060208a013567ffffffffffffffff81111561390f5761390e614cf2565b5b61391b8c828d016136f7565b98505060408a013567ffffffffffffffff81111561393c5761393b614cf2565b5b6139488c828d016136f7565b97505060608a013567ffffffffffffffff81111561396957613968614cf2565b5b6139758c828d016136f7565b96505060808a013567ffffffffffffffff81111561399657613995614cf2565b5b6139a28c828d016136f7565b95505060a08a013567ffffffffffffffff8111156139c3576139c2614cf2565b5b6139cf8c828d016136f7565b94505060c08a013567ffffffffffffffff8111156139f0576139ef614cf2565b5b6139fc8c828d016136f7565b93505060e08a013567ffffffffffffffff811115613a1d57613a1c614cf2565b5b613a298c828d016136f7565b9250506101008a013567ffffffffffffffff811115613a4b57613a4a614cf2565b5b613a578c828d016136f7565b9150509295985092959850929598565b60008060408385031215613a7e57613a7d614cf7565b5b6000613a8c85828601613660565b9250506020613a9d85828601613725565b9150509250929050565b600060208284031215613abd57613abc614cf7565b5b6000613acb8482850161368a565b91505092915050565b60008060408385031215613aeb57613aea614cf7565b5b6000613af98582860161368a565b9250506020613b0a85828601613660565b9150509250929050565b600060208284031215613b2a57613b29614cf7565b5b6000613b388482850161369f565b91505092915050565b600060208284031215613b5757613b56614cf7565b5b6000613b65848285016136b4565b91505092915050565b600060208284031215613b8457613b83614cf7565b5b6000613b9284828501613725565b91505092915050565b60008060408385031215613bb257613bb1614cf7565b5b6000613bc085828601613725565b9250506020613bd185828601613660565b9150509250929050565b60008060408385031215613bf257613bf1614cf7565b5b6000613c0085828601613725565b925050602083013567ffffffffffffffff811115613c2157613c20614cf2565b5b613c2d858286016136f7565b9150509250929050565b60008060008060808587031215613c5157613c50614cf7565b5b6000613c5f87828801613725565b945050602085013567ffffffffffffffff811115613c8057613c7f614cf2565b5b613c8c878288016136f7565b935050604085013567ffffffffffffffff811115613cad57613cac614cf2565b5b613cb9878288016136f7565b925050606085013567ffffffffffffffff811115613cda57613cd9614cf2565b5b613ce6878288016136f7565b91505092959194509250565b613cfb81614a5d565b82525050565b613d0a81614a6f565b82525050565b613d1981614a7b565b82525050565b6000613d2a82614905565b613d34818561491b565b9350613d44818560208601614aea565b613d4d81614cfc565b840191505092915050565b6000613d6382614910565b613d6d818561492c565b9350613d7d818560208601614aea565b613d8681614cfc565b840191505092915050565b6000613d9c82614910565b613da6818561493d565b9350613db6818560208601614aea565b80840191505092915050565b60008154613dcf81614b47565b613dd9818661493d565b94506001821660008114613df45760018114613e0557613e38565b60ff19831686528186019350613e38565b613e0e856148f0565b60005b83811015613e3057815481890152600182019150602081019050613e11565b838801955050505b50505092915050565b6000613e4e60208361492c565b9150613e5982614d0d565b602082019050919050565b6000613e71602d8361492c565b9150613e7c82614d36565b604082019050919050565b6000613e9460108361493d565b9150613e9f82614d85565b601082019050919050565b6000613eb760328361492c565b9150613ec282614dae565b604082019050919050565b6000613eda600f8361493d565b9150613ee582614dfd565b600f82019050919050565b6000613efd60028361493d565b9150613f0882614e26565b600282019050919050565b6000613f2060258361492c565b9150613f2b82614e4f565b604082019050919050565b6000613f4360238361493d565b9150613f4e82614e9e565b602382019050919050565b6000613f66601c8361492c565b9150613f7182614eed565b602082019050919050565b6000613f8960038361493d565b9150613f9482614f16565b600382019050919050565b6000613fac60248361492c565b9150613fb782614f3f565b604082019050919050565b6000613fcf60198361492c565b9150613fda82614f8e565b602082019050919050565b6000613ff260268361493d565b9150613ffd82614fb7565b602682019050919050565b600061401560088361493d565b915061402082615006565b600882019050919050565b600061403860228361493d565b91506140438261502f565b602282019050919050565b600061405b60068361493d565b91506140668261507e565b600682019050919050565b600061407e60298361492c565b9150614089826150a7565b604082019050919050565b60006140a160098361493d565b91506140ac826150f6565b600982019050919050565b60006140c460028361493d565b91506140cf8261511f565b600282019050919050565b60006140e760208361492c565b91506140f282615148565b602082019050919050565b600061410a60018361493d565b915061411582615171565b600182019050919050565b600061412d60208361492c565b91506141388261519a565b602082019050919050565b600061415060018361493d565b915061415b826151c3565b600182019050919050565b6000614173600f8361493d565b915061417e826151ec565b600f82019050919050565b600061419660098361493d565b91506141a182615215565b600982019050919050565b60006141b960188361492c565b91506141c48261523e565b602082019050919050565b60006141dc601f8361493d565b91506141e782615267565b601f82019050919050565b60006141ff60018361493d565b915061420a82615290565b600182019050919050565b600061422260218361492c565b915061422d826152b9565b604082019050919050565b600061424560278361493d565b915061425082615308565b602782019050919050565b6000614268603d8361492c565b915061427382615357565b604082019050919050565b600061428b60178361493d565b9150614296826153a6565b601782019050919050565b60006142ae60338361492c565b91506142b9826153cf565b604082019050919050565b60006142d160288361492c565b91506142dc8261541e565b604082019050919050565b60006142f460118361493d565b91506142ff8261546d565b601182019050919050565b6000614317602f8361492c565b915061432282615496565b604082019050919050565b61433681614ad1565b82525050565b61434d61434882614ad1565b614bf3565b82525050565b600061435f8284613d91565b915081905092915050565b60006143768285613d91565b91506143828284613d91565b91508190509392505050565b60006143998261404e565b91506143a58285613d91565b91506143b1828461433c565b6020820191508190509392505050565b60006143cc82614143565b91506143d782614008565b91506143e3828d613dc2565b91506143ee82613ef0565b91506143f982613ecd565b9150614405828c613dc2565b915061441082613ef0565b915061441b82614189565b9150614427828b613d91565b915061443282613ef0565b915061443d82613e87565b9150614449828a613dc2565b915061445482613ef0565b915061445f82614094565b915061446b8289613dc2565b915061447682613ef0565b915061448182614166565b915061448c826141cf565b91506144988288613dc2565b91506144a382613f7c565b91506144ae82614238565b91506144ba8287613dc2565b91506144c582613f7c565b91506144d082613fe5565b91506144dc8286613dc2565b91506144e782613f7c565b91506144f28261402b565b91506144fe8285613dc2565b915061450982613f7c565b915061451482613f36565b91506145208284613d91565b915061452b826140b7565b9150614536826141f2565b9150614541826140fd565b91508190509b9a5050505050505050505050565b60006145608261427e565b915061456c8285613d91565b9150614577826142e7565b91506145838284613d91565b91508190509392505050565b60006020820190506145a46000830184613cf2565b92915050565b60006080820190506145bf6000830187613cf2565b6145cc6020830186613cf2565b6145d9604083018561432d565b81810360608301526145eb8184613d1f565b905095945050505050565b600060208201905061460b6000830184613d01565b92915050565b60006020820190506146266000830184613d10565b92915050565b600060208201905081810360008301526146468184613d58565b905092915050565b6000602082019050818103600083015261466781613e41565b9050919050565b6000602082019050818103600083015261468781613e64565b9050919050565b600060208201905081810360008301526146a781613eaa565b9050919050565b600060208201905081810360008301526146c781613f13565b9050919050565b600060208201905081810360008301526146e781613f59565b9050919050565b6000602082019050818103600083015261470781613f9f565b9050919050565b6000602082019050818103600083015261472781613fc2565b9050919050565b6000602082019050818103600083015261474781614071565b9050919050565b60006020820190508181036000830152614767816140da565b9050919050565b6000602082019050818103600083015261478781614120565b9050919050565b600060208201905081810360008301526147a7816141ac565b9050919050565b600060208201905081810360008301526147c781614215565b9050919050565b600060208201905081810360008301526147e78161425b565b9050919050565b60006020820190508181036000830152614807816142a1565b9050919050565b60006020820190508181036000830152614827816142c4565b9050919050565b600060208201905081810360008301526148478161430a565b9050919050565b6000602082019050614863600083018461432d565b92915050565b6000614873614884565b905061487f8282614b79565b919050565b6000604051905090565b600067ffffffffffffffff8211156148a9576148a8614cb9565b5b6148b282614cfc565b9050602081019050919050565b600067ffffffffffffffff8211156148da576148d9614cb9565b5b6148e382614cfc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061495382614ad1565b915061495e83614ad1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561499357614992614bfd565b5b828201905092915050565b60006149a982614ad1565b91506149b483614ad1565b9250826149c4576149c3614c2c565b5b828204905092915050565b60006149da82614ad1565b91506149e583614ad1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1e57614a1d614bfd565b5b828202905092915050565b6000614a3482614ad1565b9150614a3f83614ad1565b925082821015614a5257614a51614bfd565b5b828203905092915050565b6000614a6882614ab1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b08578082015181840152602081019050614aed565b83811115614b17576000848401525b50505050565b6000614b2882614ad1565b91506000821415614b3c57614b3b614bfd565b5b600182039050919050565b60006002820490506001821680614b5f57607f821691505b60208210811415614b7357614b72614c5b565b5b50919050565b614b8282614cfc565b810181811067ffffffffffffffff82111715614ba157614ba0614cb9565b5b80604052505050565b6000614bb582614ad1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614be857614be7614bfd565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202256657273696f6e222c202276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b2274726169745f74797065223a20225265706f7369746f7279222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a2022417574686f72222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b4552433732313a206d75737420626520746f6b656e206f776e6572600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f7b2274726169745f74797065223a2022454e53222c202276616c7565223a2200600082015250565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e206f776e657220726f6c6500000000000000000000000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6154ee81614a5d565b81146154f957600080fd5b50565b61550581614a6f565b811461551057600080fd5b50565b61551c81614a7b565b811461552757600080fd5b50565b61553381614a85565b811461553e57600080fd5b50565b61554a81614ad1565b811461555557600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205246882f1f7107874499f15cd7bbafb2b47fb926e7a8f78e5904c597b5cebf8b64736f6c63430008070033", + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "details": "See {IERC721Metadata-tokenURI}." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 414, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_symbol", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 420, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_owners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 424, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_balances", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 428, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_tokenApprovals", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 434, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_operatorApprovals", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 24, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_roles", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + }, + { + "astId": 3248, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_tokenIds", + "offset": 0, + "slot": "7", + "type": "t_struct(Counter)1899_storage" + }, + { + "astId": 3253, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_apps", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_uint256,t_struct(App)3245_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_struct(App)3245_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct FleekERC721.App)", + "numberOfBytes": "32", + "value": "t_struct(App)3245_storage" + }, + "t_mapping(t_uint256,t_struct(Build)3227_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct FleekERC721.Build)", + "numberOfBytes": "32", + "value": "t_struct(Build)3227_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(App)3245_storage": { + "encoding": "inplace", + "label": "struct FleekERC721.App", + "members": [ + { + "astId": 3229, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 3231, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "description", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 3233, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "image", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + }, + { + "astId": 3235, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "external_url", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 3237, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "ENS", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 3239, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "current_build", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 3244, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "builds", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint256,t_struct(Build)3227_storage)" + } + ], + "numberOfBytes": "224" + }, + "t_struct(Build)3227_storage": { + "encoding": "inplace", + "label": "struct FleekERC721.Build", + "members": [ + { + "astId": 3222, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "commit_hash", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 3224, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "git_repository", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 3226, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "author", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Counter)1899_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "members": [ + { + "astId": 1898, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/ui/src/integrations/ethereum/contracts/index.ts b/ui/src/integrations/ethereum/contracts/index.ts new file mode 100644 index 0000000..745ef7c --- /dev/null +++ b/ui/src/integrations/ethereum/contracts/index.ts @@ -0,0 +1 @@ +export { default as FleekERC721 } from './FleekERC721.json'; diff --git a/ui/src/integrations/ethereum/ethereum.ts b/ui/src/integrations/ethereum/ethereum.ts new file mode 100644 index 0000000..c61b16f --- /dev/null +++ b/ui/src/integrations/ethereum/ethereum.ts @@ -0,0 +1,40 @@ +import { JsonRpcProvider, Networkish } from '@ethersproject/providers'; +import { ethers } from 'ethers'; +import * as Contracts from './contracts'; + +export const Ethereum: Ethereum.Core = { + defaultNetwork: 'https://rpc-mumbai.maticvigil.com', // TODO: make it environment variable + + provider: { + metamask: + window.ethereum && new ethers.providers.Web3Provider(window.ethereum), + }, + + getContract(contractName, providerName) { + const contract = Contracts[contractName]; + + const provider = + providerName && providerName in this.provider + ? this.provider[providerName].getSigner() + : ethers.getDefaultProvider(this.defaultNetwork); + + return new ethers.Contract(contract.address, contract.abi, provider); + }, +}; + +export namespace Ethereum { + export type Providers = 'metamask'; + + export type Core = { + defaultNetwork: Networkish; + + provider: { + [key in Providers]: JsonRpcProvider; + }; + + getContract: ( + contractName: keyof typeof Contracts, + providerName?: Providers + ) => ethers.Contract; + }; +} diff --git a/ui/src/integrations/ethereum/index.ts b/ui/src/integrations/ethereum/index.ts new file mode 100644 index 0000000..c4816e8 --- /dev/null +++ b/ui/src/integrations/ethereum/index.ts @@ -0,0 +1,2 @@ +export * from './ethereum'; +export * from './lib'; diff --git a/ui/src/integrations/ethereum/lib/fleek-erc721.ts b/ui/src/integrations/ethereum/lib/fleek-erc721.ts new file mode 100644 index 0000000..3f0bc49 --- /dev/null +++ b/ui/src/integrations/ethereum/lib/fleek-erc721.ts @@ -0,0 +1,63 @@ +import { Ethereum } from '../ethereum'; + +export const FleekERC721 = { + async mint( + params: FleekERC721.MintParams, + provider: Ethereum.Providers + ): Promise { + const contract = Ethereum.getContract('FleekERC721', provider); + + const response = await contract.mint( + params.owner, + params.name, + params.description, + params.image, + params.externalUrl, + params.ens, + params.commitHash, + params.repo, + 'author' // TODO: remove author after contract update + ); + + return response; + }, + + async tokenMetadata(tokenId: number): Promise { + const contract = Ethereum.getContract('FleekERC721'); + + const response = await contract.tokenURI(Number(tokenId)); + + const parsed = JSON.parse( + Buffer.from(response.slice(29), 'base64').toString('utf-8') + ); + + return parsed; + }, + + async lastTokenId(): Promise { + // TODO: fetch last token id + return 6; + }, +}; + +export namespace FleekERC721 { + export type MintParams = { + name: string; + description: string; + owner: string; + externalUrl: string; + image: string; + ens?: string; + commitHash: string; + repo: string; + }; + + export type Metadata = Omit & { + attributes: [ + { + trait_type: string; + value: string; + } + ]; + }; +} diff --git a/ui/src/integrations/ethereum/lib/index.ts b/ui/src/integrations/ethereum/lib/index.ts new file mode 100644 index 0000000..70da919 --- /dev/null +++ b/ui/src/integrations/ethereum/lib/index.ts @@ -0,0 +1 @@ +export * from './fleek-erc721'; diff --git a/ui/src/integrations/index.ts b/ui/src/integrations/index.ts new file mode 100644 index 0000000..a036217 --- /dev/null +++ b/ui/src/integrations/index.ts @@ -0,0 +1 @@ +export * from './ethereum'; diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts new file mode 100644 index 0000000..2beb9db --- /dev/null +++ b/ui/src/store/features/index.ts @@ -0,0 +1 @@ +export * from './wallet'; diff --git a/ui/src/store/features/wallet/async-thunk/connect.ts b/ui/src/store/features/wallet/async-thunk/connect.ts new file mode 100644 index 0000000..9d0c84c --- /dev/null +++ b/ui/src/store/features/wallet/async-thunk/connect.ts @@ -0,0 +1,34 @@ +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { walletActions, WalletState } from '../wallet-slice'; +import { RootState } from '@/store/store'; +import { Ethereum } from '@/integrations'; + +export const connect = createAsyncThunk< + void, + Exclude +>('wallet/connect', async (providerName, { dispatch, getState }) => { + if ((getState() as RootState).wallet.state === 'loading') return; + + try { + dispatch(walletActions.setState('loading')); + dispatch(walletActions.setProvider(providerName)); + + const response = await Ethereum.provider[providerName].send( + 'eth_requestAccounts', + [] + ); + + if (Array.isArray(response)) { + const [account] = response; + + if (typeof account !== 'string') throw Error('Invalid account type'); + dispatch(walletActions.setAccount(account)); + return; + } + + throw Error('Invalid response type'); + } catch (e) { + console.error('Could not connect to Wallet', e); + dispatch(walletActions.setState('disconnected')); + } +}); diff --git a/ui/src/store/features/wallet/async-thunk/index.ts b/ui/src/store/features/wallet/async-thunk/index.ts new file mode 100644 index 0000000..3c1ca14 --- /dev/null +++ b/ui/src/store/features/wallet/async-thunk/index.ts @@ -0,0 +1 @@ +export * from './connect'; diff --git a/ui/src/store/features/wallet/index.ts b/ui/src/store/features/wallet/index.ts new file mode 100644 index 0000000..6566b83 --- /dev/null +++ b/ui/src/store/features/wallet/index.ts @@ -0,0 +1,2 @@ +export * from './wallet-slice'; +export * from './utils'; diff --git a/ui/src/store/features/wallet/utils.ts b/ui/src/store/features/wallet/utils.ts new file mode 100644 index 0000000..343b841 --- /dev/null +++ b/ui/src/store/features/wallet/utils.ts @@ -0,0 +1,18 @@ +import { Ethereum } from '@/integrations'; +import { store } from '../../store'; +import { walletActions } from './wallet-slice'; + +export const initializeWallet = async (): Promise => { + // metamask + try { + const metamask = Ethereum.provider.metamask; + const accounts = await metamask.listAccounts(); + if (accounts && accounts.length > 0) { + store.dispatch(walletActions.setAccount(accounts[0])); + } + metamask.on('accountsChanged', (accounts: string[]) => { + store.dispatch(walletActions.setAccount(accounts[0])); + }); + store.dispatch(walletActions.setProvider('metamask')); + } catch {} +}; diff --git a/ui/src/store/features/wallet/wallet-slice.ts b/ui/src/store/features/wallet/wallet-slice.ts new file mode 100644 index 0000000..b31dec3 --- /dev/null +++ b/ui/src/store/features/wallet/wallet-slice.ts @@ -0,0 +1,64 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import * as asyncThunk from './async-thunk'; +import { RootState } from '@/store'; +import { useAppSelector } from '@/store/hooks'; +import { Ethereum } from '@/integrations'; + +export namespace WalletState { + export type Provider = Ethereum.Providers | null; + + export type State = 'disconnected' | 'loading' | 'connected'; + + export type Account = string; +} + +export interface WalletState { + provider: WalletState.Provider; + state: WalletState.State; + account?: WalletState.Account; +} + +const initialState: WalletState = { + provider: null, + state: 'disconnected', + account: undefined, +}; + +export const walletSlice = createSlice({ + name: 'wallet', + initialState, + reducers: { + setProvider: (state, action: PayloadAction) => { + state.provider = action.payload; + }, + setAccount: (state, action: PayloadAction) => { + state.state = 'connected'; + state.account = action.payload; + }, + setState: ( + state, + action: PayloadAction> + ) => { + state.state = action.payload; + state.provider = null; + state.account = undefined; + }, + disconnect: (state) => { + state.state = 'disconnected'; + state.provider = null; + state.account = undefined; + }, + }, +}); + +export const walletActions = { + ...walletSlice.actions, + ...asyncThunk, +}; + +const selectWalletState = (state: RootState): WalletState => state.wallet; + +export const useWalletStore = (): WalletState => + useAppSelector(selectWalletState); + +export default walletSlice.reducer; diff --git a/ui/src/store/hooks.ts b/ui/src/store/hooks.ts new file mode 100644 index 0000000..c4ca63a --- /dev/null +++ b/ui/src/store/hooks.ts @@ -0,0 +1,5 @@ +import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; +import type { AppDispatch, RootState } from './store'; + +export const useAppDispatch = (): AppDispatch => useDispatch(); +export const useAppSelector: TypedUseSelectorHook = useSelector; diff --git a/ui/src/store/index.ts b/ui/src/store/index.ts new file mode 100644 index 0000000..ff2f3e6 --- /dev/null +++ b/ui/src/store/index.ts @@ -0,0 +1,3 @@ +export * from './store'; +export * from './hooks'; +export * from './features'; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts new file mode 100644 index 0000000..65a3288 --- /dev/null +++ b/ui/src/store/store.ts @@ -0,0 +1,16 @@ +import { configureStore } from '@reduxjs/toolkit'; +import walletReducer from './features/wallet/wallet-slice'; + +export const store = configureStore({ + reducer: { + wallet: walletReducer, + }, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: false, + }), +}); + +export type RootState = ReturnType; + +export type AppDispatch = typeof store.dispatch; diff --git a/ui/src/utils/format.ts b/ui/src/utils/format.ts index e1b9c73..22b6b92 100644 --- a/ui/src/utils/format.ts +++ b/ui/src/utils/format.ts @@ -1,8 +1,13 @@ -export const getRepoAndCommit = (url: string) => { - //TODO validate is a github url - url = url.replace('/commit', ''); - const lastIndexSlash = url.lastIndexOf('/'); - const repo = url.substring(0, lastIndexSlash + 1).slice(0, lastIndexSlash); - const commit_hash = url.substring(lastIndexSlash + 1, url.length); - return { repo, commit_hash }; -}; +export const getRepoAndCommit = (url: string) => { + //TODO validate is a github url + url = url.replace('/commit', ''); + const lastIndexSlash = url.lastIndexOf('/'); + const repo = url.substring(0, lastIndexSlash + 1).slice(0, lastIndexSlash); + const commit_hash = url.substring(lastIndexSlash + 1, url.length); + return { repo, commit_hash }; +}; + +export const contractAddress = (address: string): string => { + return `${address.slice(0, 6)}...${address.slice(-4)}`; +}; + diff --git a/ui/src/views/detail/detail.tsx b/ui/src/views/detail/detail.tsx index 33ca886..23c8a7d 100644 --- a/ui/src/views/detail/detail.tsx +++ b/ui/src/views/detail/detail.tsx @@ -18,16 +18,17 @@ import { AttributesDetail, } from '@/components'; import { ExternalLinkIcon } from '@chakra-ui/icons'; -import { fetchSiteDetail } from '@/mocks'; import { ErrorScreen } from '@/views'; import { SiteNFTDetail } from '@/types'; +import { FleekERC721 } from '@/integrations'; export const MintedSiteDetail = () => { const [searchParams] = useSearchParams(); const tokenIdParam = searchParams.get('tokenId'); //TODO handle response type - const { data, status } = useQuery('fetchDetail', () => - fetchSiteDetail(tokenIdParam as string) + const { data, status } = useQuery( + `fetchDetail${tokenIdParam}`, + async () => FleekERC721.tokenMetadata(Number(tokenIdParam)) ); if (status === 'loading') { @@ -39,7 +40,8 @@ export const MintedSiteDetail = () => { } const { owner, name, description, image, externalUrl, attributes } = - data.data as SiteNFTDetail; + data as SiteNFTDetail; + return ( <> diff --git a/ui/src/views/home/list.tsx b/ui/src/views/home/list.tsx index 0a56228..df59d85 100644 --- a/ui/src/views/home/list.tsx +++ b/ui/src/views/home/list.tsx @@ -1,31 +1,22 @@ -import React from 'react'; import { Loading } from '@/components'; -import { fetchMintedSites } from '@/mocks'; -import { SiteNFTDetails } from '@/types'; -import { Grid, GridItem } from '@chakra-ui/react'; +import { Flex } from '@chakra-ui/react'; import { useQuery } from 'react-query'; import { SiteCard } from '@/components'; +import { FleekERC721 } from '@/integrations'; export const ListSites = () => { - const { data, isLoading } = useQuery, Error>( - 'fetchSites', - fetchMintedSites + const { data, isLoading } = useQuery('fetchLastTokenId', () => + FleekERC721.lastTokenId() ); - if (isLoading) return ; + if (!data || isLoading) return ; return ( - - {data && - data.listSites.map((site: SiteNFTDetails) => ( - - - - ))} - + + {new Array(data).fill(0).map((_, index) => { + const id = data - index - 1; + return ; + })} + ); }; diff --git a/ui/src/views/mint-site/mint-site.tsx b/ui/src/views/mint-site/mint-site.tsx index a511f76..dc52942 100644 --- a/ui/src/views/mint-site/mint-site.tsx +++ b/ui/src/views/mint-site/mint-site.tsx @@ -15,10 +15,11 @@ import { import { Formik, Field } from 'formik'; import { ArrowBackIcon } from '@chakra-ui/icons'; import { Link } from 'react-router-dom'; -import { mintSiteNFT } from '@/mocks'; import { getRepoAndCommit } from '@/utils'; import { validateFields } from './mint-site.utils'; import { InputFieldForm } from '@/components'; +import { FleekERC721 } from '@/integrations'; +import { useWalletStore } from '@/store'; import { useToast } from '@/hooks'; interface FormValues { @@ -43,46 +44,53 @@ const initialValues = { export const MintSite = () => { const setToastInfo = useToast(); + const { provider } = useWalletStore(); - const handleSubmitForm = useCallback(async (values: FormValues) => { - const { - name, - description, - githubCommit, - ownerAddress, - externalUrl, - image, - ens, - } = values; - - const { repo, commit_hash } = getRepoAndCommit(githubCommit); - - try { - await mintSiteNFT({ + const handleSubmitForm = useCallback( + async (values: FormValues) => { + const { name, description, - owner: ownerAddress, + githubCommit, + ownerAddress, externalUrl, image, ens, - commitHash: commit_hash, - repo, - }); - //TODO connect with the integration - setToastInfo({ - title: 'Success!', - description: 'Your site has been minted.', - status: 'success', - }); - } catch (err) { - setToastInfo({ - title: 'Error!', - description: - 'We had an error while minting your site. Please try again later', - status: 'error', - }); - } - }, []); + } = values; + + const { repo, commit_hash } = getRepoAndCommit(githubCommit); + + try { + if (!provider) throw new Error('No provider found'); + await FleekERC721.mint( + { + name, + description, + owner: ownerAddress, + externalUrl, + image, + ens, + commitHash: commit_hash, + repo, + }, + provider + ); + setToastInfo({ + title: 'Success!', + description: 'Your site has been minted.', + status: 'success', + }); + } catch (err) { + setToastInfo({ + title: 'Error!', + description: + 'We had an error while minting your site. Please try again later', + status: 'error', + }); + } + }, + [provider] + ); return ( <> @@ -198,7 +206,8 @@ export const MintSite = () => { !values.githubCommit || !values.ownerAddress || !values.image || - !values.externalUrl + !values.externalUrl || + !provider } > Mint diff --git a/ui/yarn.lock b/ui/yarn.lock index a9b5d9d..5de93a8 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -206,7 +206,7 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.19.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.9.2": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== @@ -304,12 +304,10 @@ "@chakra-ui/react-use-merge-refs" "2.0.5" "@chakra-ui/spinner" "2.0.11" -"@chakra-ui/card@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/card/-/card-2.1.1.tgz#b981a68d81d0f6447eb0d4d3fdcd7846bab2111f" - integrity sha512-vvmfuNn6gkfv6bGcXQe6kvWHspziPZgYnnffiEjPaZYtaf98WRszpjyPbFv0oQR/2H1RSE1oaTqa/J1rHrzw3A== - dependencies: - "@chakra-ui/react-context" "2.0.5" +"@chakra-ui/card@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/card/-/card-2.1.2.tgz#6a8b58d365557fd33da8e257e207fd8ba3640919" + integrity sha512-zLfrLe7NP14xWgzS+vVz07yapZNOTm3W0Gh9RCwwoQz7l4FNFNjGPmbktQGGp3fLqDUk9n9ugdFCNmxEcQ8wXA== "@chakra-ui/checkbox@2.2.5": version "2.2.5" @@ -509,14 +507,14 @@ "@chakra-ui/react-use-update-effect" "2.0.5" "@chakra-ui/transition" "2.0.12" -"@chakra-ui/modal@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.2.4.tgz#dbe884a9245ed840b6511a4f06b4a622fa86de4c" - integrity sha512-K2cafyNI0b4OSAB55qIXt5DLZqj7E1G0+Fza02ZOBZpgTCNQyDtc0KzdVMJZ9ryxKd16LUk5UmKHugY/VpHEWQ== +"@chakra-ui/modal@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.2.5.tgz#adcbf06c29d853b5fa17fec3a91b8096eecffe6b" + integrity sha512-QIoN89bT5wnR71wxZFHt7vsS65yF9WCfIwDtFk8ifxJORPi/UkLMwBpjTV2Jfsxd22W6Oo2VOpRR0a5WFeK+jA== dependencies: "@chakra-ui/close-button" "2.0.13" "@chakra-ui/focus-lock" "2.0.13" - "@chakra-ui/portal" "2.0.11" + "@chakra-ui/portal" "2.0.12" "@chakra-ui/react-context" "2.0.5" "@chakra-ui/react-types" "2.0.5" "@chakra-ui/react-use-merge-refs" "2.0.5" @@ -587,28 +585,28 @@ "@chakra-ui/react-use-merge-refs" "2.0.5" "@popperjs/core" "^2.9.3" -"@chakra-ui/portal@2.0.11": - version "2.0.11" - resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.0.11.tgz#7a6b3ebc621bb28b46550fcfb36b94926d0111a5" - integrity sha512-Css61i4WKzKO8ou1aGjBzcsXMy9LnfnpkOFfvaNCpUUNEd6c47z6+FhZNq7Gc38PGNjSfMLAd4LmH+H0ZanYIA== +"@chakra-ui/portal@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.0.12.tgz#bba0dac00f5610efbf2f15b0e5e6e984135c82c2" + integrity sha512-8D/1fFUdbJtzyGL5sCBIb4oyTnPG2v6rx/L/qbG43FcXDrongmzLj0+tJ//PbJr+5hxjXAWFUjpPvyx10pTN6Q== dependencies: "@chakra-ui/react-context" "2.0.5" "@chakra-ui/react-use-safe-layout-effect" "2.0.3" -"@chakra-ui/progress@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.1.1.tgz#b94399af12e9324737f9e690201f78546572ac59" - integrity sha512-ddAXaYGNObGqH1stRAYxkdospf6J4CDOhB0uyw9BeHRSsYkCUQWkUBd/melJuZeGHEH2ItF9T7FZ4JhcepP3GA== +"@chakra-ui/progress@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.1.2.tgz#dc3dcae7ddc94d18c3d7b64c2a84a83055038f4f" + integrity sha512-ofhMWTqCxnm1NiP/zH4SV7EvOLogfX15MSMTNfGqZv6t8eSSeTn6oRRzsTSllJfSqDey7oZNCRbP7vDhvx9HtQ== dependencies: "@chakra-ui/react-context" "2.0.5" -"@chakra-ui/provider@2.0.24": - version "2.0.24" - resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.0.24.tgz#733f0eacf779d39029cee164027af7bf5c6c66c3" - integrity sha512-32+DGfoXAOUOXwjLstdGQ+k/YoCwdFxWbwnEAp7WleislYsMcl0JeINDAbvksQH0piBty77swTuWfUU5cIox7g== +"@chakra-ui/provider@2.0.25": + version "2.0.25" + resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.0.25.tgz#6f27abcb8744a7d3c4ebd09409a9e00e0f90c566" + integrity sha512-9BQm9aqiUK/5xeYECpD9dfULd/BfxV4nncFGQNXFqZr0Nx54BALndeKdtId3j+36j9MwcKqjHgKyEpv4s+4vkQ== dependencies: "@chakra-ui/css-reset" "2.0.10" - "@chakra-ui/portal" "2.0.11" + "@chakra-ui/portal" "2.0.12" "@chakra-ui/react-env" "2.0.11" "@chakra-ui/system" "2.3.4" "@chakra-ui/utils" "2.0.12" @@ -765,16 +763,16 @@ "@chakra-ui/utils" "2.0.12" "@chakra-ui/react@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.4.2.tgz#60d0cf80965d77ab6e280e28124b800a0d7a5f8c" - integrity sha512-lPDCCuY3S7XSeIK+P+ypGIL+lFqEZQt8H3Iyq4coblULMsj8skdSUqaoQ4I9fGgOi1koTPe4OlXb+rmqwQQ9MQ== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.4.3.tgz#c86b92b38ebaa482f22e4515208da429cd4c94bf" + integrity sha512-OzeN8lb/yoJZMuLYgnX00ZcrvMwgMomIHvq3lD7v0jtfdzAQKEySgu7/CmHOsvWnDB7Qy9LMlSb8PLUII1aDow== dependencies: "@chakra-ui/accordion" "2.1.4" "@chakra-ui/alert" "2.0.13" "@chakra-ui/avatar" "2.2.1" "@chakra-ui/breadcrumb" "2.1.1" "@chakra-ui/button" "2.0.13" - "@chakra-ui/card" "2.1.1" + "@chakra-ui/card" "2.1.2" "@chakra-ui/checkbox" "2.2.5" "@chakra-ui/close-button" "2.0.13" "@chakra-ui/control-box" "2.0.11" @@ -790,19 +788,19 @@ "@chakra-ui/live-region" "2.0.11" "@chakra-ui/media-query" "3.2.8" "@chakra-ui/menu" "2.1.5" - "@chakra-ui/modal" "2.2.4" + "@chakra-ui/modal" "2.2.5" "@chakra-ui/number-input" "2.0.14" "@chakra-ui/pin-input" "2.0.16" "@chakra-ui/popover" "2.1.4" "@chakra-ui/popper" "3.0.10" - "@chakra-ui/portal" "2.0.11" - "@chakra-ui/progress" "2.1.1" - "@chakra-ui/provider" "2.0.24" + "@chakra-ui/portal" "2.0.12" + "@chakra-ui/progress" "2.1.2" + "@chakra-ui/provider" "2.0.25" "@chakra-ui/radio" "2.0.14" "@chakra-ui/react-env" "2.0.11" "@chakra-ui/select" "2.0.14" - "@chakra-ui/skeleton" "2.0.18" - "@chakra-ui/slider" "2.0.14" + "@chakra-ui/skeleton" "2.0.19" + "@chakra-ui/slider" "2.0.15" "@chakra-ui/spinner" "2.0.11" "@chakra-ui/stat" "2.0.13" "@chakra-ui/styled-system" "2.4.0" @@ -814,8 +812,8 @@ "@chakra-ui/textarea" "2.0.14" "@chakra-ui/theme" "2.2.2" "@chakra-ui/theme-utils" "2.0.5" - "@chakra-ui/toast" "4.0.4" - "@chakra-ui/tooltip" "2.2.2" + "@chakra-ui/toast" "4.0.5" + "@chakra-ui/tooltip" "2.2.3" "@chakra-ui/transition" "2.0.12" "@chakra-ui/utils" "2.0.12" "@chakra-ui/visually-hidden" "2.0.13" @@ -832,18 +830,18 @@ resolved "https://registry.yarnpkg.com/@chakra-ui/shared-utils/-/shared-utils-2.0.3.tgz#97cbc11282e381ebd9f581c603088f9d60ead451" integrity sha512-pCU+SUGdXzjAuUiUT8mriekL3tJVfNdwSTIaNeip7k/SWDzivrKGMwAFBxd3XVTDevtVusndkO4GJuQ3yILzDg== -"@chakra-ui/skeleton@2.0.18": - version "2.0.18" - resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.0.18.tgz#a2af241f0b1b692db4d10b90a887107a5e401c7d" - integrity sha512-qjcD8BgVx4kL8Lmb8EvmmDGM2ICl6CqhVE2LShJrgG7PDM6Rt6rYM617kqLurLYZjbJUiwgf9VXWifS0IpT31Q== +"@chakra-ui/skeleton@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.0.19.tgz#c2f8619edf06d8411aeb8fac8748134bfba7ea35" + integrity sha512-i/U70wB9rX3DdO9i50kQLfPVdLPw8oIZlKynq15DkXEch3uXzLMY8ZzcEQW99B/PnynC1gni0+P9jMfeX7Wi+Q== dependencies: "@chakra-ui/media-query" "3.2.8" "@chakra-ui/react-use-previous" "2.0.3" -"@chakra-ui/slider@2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.0.14.tgz#8fa8fb5df292525d8b97ea3c3c666e400fb365f2" - integrity sha512-z4Q5rWtYVTdFgBVvR6aUhSMg3CQuAgjJGHvLHEGDCUjYCuBXrb3SmWyvv03uKyjSbwRyKqSsvAnSCxtmHODt/w== +"@chakra-ui/slider@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.0.15.tgz#e574020d3240490b12204a6b1db4f40101567f87" + integrity sha512-1PwTBgaPKe8L1aOryGd1i52snqQY615Jd7d1Jyjzr/7s3uvLnpCmTE7bazu/cJU0h1qSpluMv++A+d+fjICdmA== dependencies: "@chakra-ui/number-utils" "2.0.5" "@chakra-ui/react-context" "2.0.5" @@ -957,26 +955,26 @@ "@chakra-ui/anatomy" "2.1.0" "@chakra-ui/theme-tools" "2.0.14" -"@chakra-ui/toast@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-4.0.4.tgz#254fb5c4c5bde0a373aab574927c654442fb0411" - integrity sha512-Gv52UQ4fJtziL9Qg0Yterb76C1GgzViryPDf2dxSzTlnCcKIbY4ktEhehyFBjDXYoGkFb47NZUEyhy+u8p3GUA== +"@chakra-ui/toast@4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-4.0.5.tgz#b501d7160ab67d9bcfa4df5c8b763d4aa789731e" + integrity sha512-avJKRiZZACi6v04cUc2uRcmta3gAes67HGkQhq5sHG/VV2cH9wXV2NMT3DolT8WiU9j7g8lWKxWe7bqFFrX+wA== dependencies: "@chakra-ui/alert" "2.0.13" "@chakra-ui/close-button" "2.0.13" - "@chakra-ui/portal" "2.0.11" + "@chakra-ui/portal" "2.0.12" "@chakra-ui/react-use-timeout" "2.0.3" "@chakra-ui/react-use-update-effect" "2.0.5" "@chakra-ui/styled-system" "2.4.0" "@chakra-ui/theme" "2.2.2" -"@chakra-ui/tooltip@2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.2.2.tgz#8ac0759fbc5adacec6e0ac7419c8055a67a95b5c" - integrity sha512-WDgQVEMHdsyUpKG9Nogy2FKLBgfdJG7hTSrSbH1WLvHsPkpPLknL4i5Z/pCvpa4A7SzTa6ps350mxtJ054MeMg== +"@chakra-ui/tooltip@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.2.3.tgz#92c9ed224e4c16839310acd0759c0017caec3134" + integrity sha512-yOne9ofFYfW2XHsbCEPWgLUTnHKm5z21f/cPjwEqtmvCS7aTCOLFiwz2ckRS8yJbIAy+mw0UG6jQsblYKgXj4A== dependencies: "@chakra-ui/popper" "3.0.10" - "@chakra-ui/portal" "2.0.11" + "@chakra-ui/portal" "2.0.12" "@chakra-ui/react-types" "2.0.5" "@chakra-ui/react-use-disclosure" "2.0.6" "@chakra-ui/react-use-event-listener" "2.0.5" @@ -1127,15 +1125,15 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== -"@esbuild/android-arm@0.15.16": - version "0.15.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.16.tgz#0642926178b15e3d1545efae6eee05c4f3451d15" - integrity sha512-nyB6CH++2mSgx3GbnrJsZSxzne5K0HMyNIWafDHqYy7IwxFc4fd/CgHVZXr8Eh+Q3KbIAcAe3vGyqIPhGblvMQ== +"@esbuild/android-arm@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" + integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== -"@esbuild/linux-loong64@0.15.16": - version "0.15.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.16.tgz#284522de76abe951e4ed2bd24a467e8d49c67933" - integrity sha512-SDLfP1uoB0HZ14CdVYgagllgrG7Mdxhkt4jDJOKl/MldKrkQ6vDJMZKl2+5XsEY/Lzz37fjgLQoJBGuAw/x8kQ== +"@esbuild/linux-loong64@0.15.18": + version "0.15.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" + integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== "@eslint/eslintrc@^1.3.3": version "1.3.3" @@ -1343,7 +1341,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -1495,9 +1493,9 @@ "@ethersproject/strings" "^5.7.0" "@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1579,56 +1577,56 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@motionone/animation@^10.13.1": - version "10.14.0" - resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.14.0.tgz#2f2a3517183bb58d82e389aac777fe0850079de6" - integrity sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ== +"@motionone/animation@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" + integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== dependencies: - "@motionone/easing" "^10.14.0" - "@motionone/types" "^10.14.0" - "@motionone/utils" "^10.14.0" + "@motionone/easing" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" tslib "^2.3.1" -"@motionone/dom@10.13.1": - version "10.13.1" - resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.13.1.tgz#fc29ea5d12538f21b211b3168e502cfc07a24882" - integrity sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ== +"@motionone/dom@^10.15.3": + version "10.15.3" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.3.tgz#afb27270032368a917f1ae8dd87e0069a6a9fe40" + integrity sha512-FQ7a2zMBXc1UeU8CG9G3yDpst55fbb0+C9A0VGfwOITitBCzigKZnXRgsRSWWR+FW57GSc13eGQxtYB0lKG0Ng== dependencies: - "@motionone/animation" "^10.13.1" - "@motionone/generators" "^10.13.1" - "@motionone/types" "^10.13.0" - "@motionone/utils" "^10.13.1" + "@motionone/animation" "^10.15.1" + "@motionone/generators" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/easing@^10.14.0": - version "10.14.0" - resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.14.0.tgz#d8154b7f71491414f3cdee23bd3838d763fffd00" - integrity sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA== +"@motionone/easing@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693" + integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== dependencies: - "@motionone/utils" "^10.14.0" + "@motionone/utils" "^10.15.1" tslib "^2.3.1" -"@motionone/generators@^10.13.1": - version "10.14.0" - resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.14.0.tgz#e05d9dd56da78a4b92db99185848a0f3db62242d" - integrity sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg== +"@motionone/generators@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c" + integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== dependencies: - "@motionone/types" "^10.14.0" - "@motionone/utils" "^10.14.0" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" tslib "^2.3.1" -"@motionone/types@^10.13.0", "@motionone/types@^10.14.0": - version "10.14.0" - resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.14.0.tgz#148c34f3270b175397e49c3058b33fab405c21e3" - integrity sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ== +"@motionone/types@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb" + integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== -"@motionone/utils@^10.13.1", "@motionone/utils@^10.14.0": - version "10.14.0" - resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.14.0.tgz#a19a3464ed35b08506747b062d035c7bc9bbe708" - integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== +"@motionone/utils@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438" + integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== dependencies: - "@motionone/types" "^10.14.0" + "@motionone/types" "^10.15.1" hey-listen "^1.0.8" tslib "^2.3.1" @@ -1658,16 +1656,34 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@remix-run/router@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.4.tgz#cbfbec6735711e7c2fc93b9b40adf70ef5a39990" - integrity sha512-gTL8H5USTAKOyVA4xczzDJnC3HMssdFa3tRlwBicXynx9XfiXwneHnYQogwSKpdCkjXISrEKSTtX62rLpNEVQg== +"@reduxjs/toolkit@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.1.tgz#4c34dc4ddcec161535288c60da5c19c3ef15180e" + integrity sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA== + dependencies: + immer "^9.0.16" + redux "^4.2.0" + redux-thunk "^2.4.2" + reselect "^4.1.7" + +"@remix-run/router@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.5.tgz#d5c65626add4c3c185a89aa5bd38b1e42daec075" + integrity sha512-my0Mycd+jruq/1lQuO5LBB6WTlL/e8DTCYWp44DfMTDcXz8DcTlgF0ISaLsGewt+ctHN+yA8xMq3q/N7uWJPug== "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -1688,9 +1704,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.2.3": - version "29.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" - integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + version "29.2.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" + integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -1713,9 +1729,9 @@ integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/node@*", "@types/node@^18.11.9": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + version "18.11.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.15.tgz#de0e1fbd2b22b962d45971431e2ae696643d3f5d" + integrity sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1735,9 +1751,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.0.25": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== + version "18.0.26" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" + integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1758,26 +1774,31 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" - integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== + version "17.0.17" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.17.tgz#5672e5621f8e0fca13f433a8017aae4b7a2a03e7" + integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" - integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz#098abb4c9354e19f460d57ab18bff1f676a6cff0" + integrity sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA== dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/type-utils" "5.45.0" - "@typescript-eslint/utils" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/type-utils" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -1786,71 +1807,71 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" - integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.1.tgz#1fc8e7102c1141eb64276c3b89d70da8c0ba5699" + integrity sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg== dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" - integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== +"@typescript-eslint/scope-manager@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz#70af8425c79bbc1178b5a63fb51102ddf48e104a" + integrity sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA== dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" -"@typescript-eslint/type-utils@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" - integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== +"@typescript-eslint/type-utils@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz#195033e4b30b51b870dfcf2828e88d57b04a11cc" + integrity sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng== dependencies: - "@typescript-eslint/typescript-estree" "5.45.0" - "@typescript-eslint/utils" "5.45.0" + "@typescript-eslint/typescript-estree" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" - integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== +"@typescript-eslint/types@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.1.tgz#4e9db2107b9a88441c4d5ecacde3bb7a5ebbd47e" + integrity sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== -"@typescript-eslint/typescript-estree@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" - integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== +"@typescript-eslint/typescript-estree@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz#5358088f98a8f9939355e0996f9c8f41c25eced2" + integrity sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg== dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.45.0", "@typescript-eslint/utils@^5.10.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" - integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== +"@typescript-eslint/utils@5.46.1", "@typescript-eslint/utils@^5.10.0": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.1.tgz#7da3c934d9fd0eb4002a6bb3429f33298b469b4a" + integrity sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" - integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== +"@typescript-eslint/visitor-keys@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz#126cc6fe3c0f83608b2b125c5d9daced61394242" + integrity sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg== dependencies: - "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/types" "5.46.1" eslint-visitor-keys "^3.3.0" "@vitejs/plugin-react@^2.2.0": @@ -2071,9 +2092,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001400: - version "1.0.30001435" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" - integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== + version "1.0.30001439" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" + integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== chalk@^2.0.0: version "2.4.2" @@ -2280,9 +2301,9 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + version "1.20.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" + integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -2290,6 +2311,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: function.prototype.name "^1.1.5" get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" @@ -2305,8 +2327,8 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" unbox-primitive "^1.0.2" es-shim-unscopables@^1.0.0: @@ -2325,133 +2347,133 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.16.tgz#0d6a16fa1bea441d5183976f1633183c25a764d5" - integrity sha512-Vwkv/sT0zMSgPSVO3Jlt1pUbnZuOgtOQJkJkyyJFAlLe7BiT8e9ESzo0zQSx4c3wW4T6kGChmKDPMbWTgtliQA== +esbuild-android-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" + integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA== -esbuild-android-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.16.tgz#78643bbbf396d26d20ba1f2fcdff3618c7c033e9" - integrity sha512-lqfKuofMExL5niNV3gnhMUYacSXfsvzTa/58sDlBET/hCOG99Zmeh+lz6kvdgvGOsImeo6J9SW21rFCogNPLxg== +esbuild-android-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04" + integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ== -esbuild-darwin-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.16.tgz#de3e91809dcd1ffb64409e2f990bb86e33e4ffd8" - integrity sha512-wo2VWk/n/9V2TmqUZ/KpzRjCEcr00n7yahEdmtzlrfQ3lfMCf3Wa+0sqHAbjk3C6CKkR3WKK/whkMq5Gj4Da9g== +esbuild-darwin-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410" + integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg== -esbuild-darwin-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.16.tgz#bc9cc8d51109d8e9db4ffe2c064dd53d1eb5a2a6" - integrity sha512-fMXaUr5ou0M4WnewBKsspMtX++C1yIa3nJ5R2LSbLCfJT3uFdcRoU/NZjoM4kOMKyOD9Sa/2vlgN8G07K3SJnw== +esbuild-darwin-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337" + integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA== -esbuild-freebsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.16.tgz#f8c54c679c16e9b20a1bf860ca91ba700d6c9c5d" - integrity sha512-UzIc0xlRx5x9kRuMr+E3+hlSOxa/aRqfuMfiYBXu2jJ8Mzej4lGL7+o6F5hzhLqWfWm1GWHNakIdlqg1ayaTNQ== +esbuild-freebsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2" + integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA== -esbuild-freebsd-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.16.tgz#dd28a55df0f062e2c1628266008434c32ddc7adf" - integrity sha512-8xyiYuGc0DLZphFQIiYaLHlfoP+hAN9RHbE+Ibh8EUcDNHAqbQgUrQg7pE7Bo00rXmQ5Ap6KFgcR0b4ALZls1g== +esbuild-freebsd-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635" + integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA== -esbuild-linux-32@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.16.tgz#41eb0b9b49b3430b9cc4577f1ad3d414ef70f806" - integrity sha512-iGijUTV+0kIMyUVoynK0v+32Oi8yyp0xwMzX69GX+5+AniNy/C/AL1MjFTsozRp/3xQPl7jVux/PLe2ds10/2w== +esbuild-linux-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce" + integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg== -esbuild-linux-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.16.tgz#b2fb0c7d49b7a579b2de26fbf4c7afb1835f2073" - integrity sha512-tuSOjXdLw7VzaUj89fIdAaQT7zFGbKBcz4YxbWrOiXkwscYgE7HtTxUavreBbnRkGxKwr9iT/gmeJWNm4djy/g== +esbuild-linux-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c" + integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw== -esbuild-linux-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.16.tgz#78fed3745b20251fc3bdc8db35ea0781e9b0e7c6" - integrity sha512-mPYksnfHnemNrvjrDhZyixL/AfbJN0Xn9S34ZOHYdh6/jJcNd8iTsv3JwJoEvTJqjMggjMhGUPJAdjnFBHoH8A== +esbuild-linux-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d" + integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug== -esbuild-linux-arm@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.16.tgz#6963f061a2b778aad7df2bfb6fa32d1904313f7f" - integrity sha512-XKcrxCEXDTOuoRj5l12tJnkvuxXBMKwEC5j0JISw3ziLf0j4zIwXbKbTmUrKFWbo6ZgvNpa7Y5dnbsjVvH39bQ== +esbuild-linux-arm@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc" + integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA== -esbuild-linux-mips64le@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.16.tgz#e2aed3527e551f8182c6b0fc8a045726fd98ad87" - integrity sha512-kSJO2PXaxfm0pWY39+YX+QtpFqyyrcp0ZeI8QPTrcFVQoWEPiPVtOfTZeS3ZKedfH+Ga38c4DSzmKMQJocQv6A== +esbuild-linux-mips64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb" + integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ== -esbuild-linux-ppc64le@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.16.tgz#fa3095b24950f63408f46f34b6d9a073ed88d53f" - integrity sha512-NimPikwkBY0yGABw6SlhKrtT35sU4O23xkhlrTT/O6lSxv3Pm5iSc6OYaqVAHWkLdVf31bF4UDVFO+D990WpAA== +esbuild-linux-ppc64le@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507" + integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w== -esbuild-linux-riscv64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.16.tgz#19c012dcc55c9d6d2a3855aa77c2c5217182cd1e" - integrity sha512-ty2YUHZlwFOwp7pR+J87M4CVrXJIf5ZZtU/umpxgVJBXvWjhziSLEQxvl30SYfUPq0nzeWKBGw5i/DieiHeKfw== +esbuild-linux-riscv64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6" + integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg== -esbuild-linux-s390x@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.16.tgz#aa61f64740e5b983cc3ebb4183a03df4b435a873" - integrity sha512-VkZaGssvPDQtx4fvVdZ9czezmyWyzpQhEbSNsHZZN0BHvxRLOYAQ7sjay8nMQwYswP6O2KlZluRMNPYefFRs+w== +esbuild-linux-s390x@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb" + integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ== -esbuild-netbsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.16.tgz#dffdc104c1f2bafc42be3faa21376c0a092f5702" - integrity sha512-ElQ9rhdY51et6MJTWrCPbqOd/YuPowD7Cxx3ee8wlmXQQVW7UvQI6nSprJ9uVFQISqSF5e5EWpwWqXZsECLvXg== +esbuild-netbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998" + integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg== -esbuild-openbsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.16.tgz#e5987f8eda55ea5f6ef6258afb1a838158f890bb" - integrity sha512-KgxMHyxMCT+NdLQE1zVJEsLSt2QQBAvJfmUGDmgEq8Fvjrf6vSKB00dVHUEDKcJwMID6CdgCpvYNt999tIYhqA== +esbuild-openbsd-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8" + integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ== -esbuild-sunos-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.16.tgz#60a085aa4b74d900e4de8c00a9fce207937320a2" - integrity sha512-exSAx8Phj7QylXHlMfIyEfNrmqnLxFqLxdQF6MBHPdHAjT7fsKaX6XIJn+aQEFiOcE4X8e7VvdMCJ+WDZxjSRQ== +esbuild-sunos-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971" + integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw== -esbuild-windows-32@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.16.tgz#24f94e5fb243d211c7db9a12985fd2880ba98ca3" - integrity sha512-zQgWpY5pUCSTOwqKQ6/vOCJfRssTvxFuEkpB4f2VUGPBpdddZfdj8hbZuFRdZRPIVHvN7juGcpgCA/XCF37mAQ== +esbuild-windows-32@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3" + integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ== -esbuild-windows-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.16.tgz#71d24d68d8b652bf5a93a6c7453c334584fa2211" - integrity sha512-HjW1hHRLSncnM3MBCP7iquatHVJq9l0S2xxsHHj4yzf4nm9TU4Z7k4NkeMlD/dHQ4jPlQQhwcMvwbJiOefSuZw== +esbuild-windows-64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0" + integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw== -esbuild-windows-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.16.tgz#77e804d60dec0390fe8f21401e39b435d5d1b863" - integrity sha512-oCcUKrJaMn04Vxy9Ekd8x23O8LoU01+4NOkQ2iBToKgnGj5eo1vU9i27NQZ9qC8NFZgnQQZg5oZWAejmbsppNA== +esbuild-windows-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7" + integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ== esbuild@^0.15.9: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.16.tgz#59324e5667985bf6aee8a91ea576baef6872cf21" - integrity sha512-o6iS9zxdHrrojjlj6pNGC2NAg86ECZqIETswTM5KmJitq+R1YmahhWtMumeQp9lHqJaROGnsBi2RLawGnfo5ZQ== + version "0.15.18" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.18.tgz#ea894adaf3fbc036d32320a00d4d6e4978a2f36d" + integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q== optionalDependencies: - "@esbuild/android-arm" "0.15.16" - "@esbuild/linux-loong64" "0.15.16" - esbuild-android-64 "0.15.16" - esbuild-android-arm64 "0.15.16" - esbuild-darwin-64 "0.15.16" - esbuild-darwin-arm64 "0.15.16" - esbuild-freebsd-64 "0.15.16" - esbuild-freebsd-arm64 "0.15.16" - esbuild-linux-32 "0.15.16" - esbuild-linux-64 "0.15.16" - esbuild-linux-arm "0.15.16" - esbuild-linux-arm64 "0.15.16" - esbuild-linux-mips64le "0.15.16" - esbuild-linux-ppc64le "0.15.16" - esbuild-linux-riscv64 "0.15.16" - esbuild-linux-s390x "0.15.16" - esbuild-netbsd-64 "0.15.16" - esbuild-openbsd-64 "0.15.16" - esbuild-sunos-64 "0.15.16" - esbuild-windows-32 "0.15.16" - esbuild-windows-64 "0.15.16" - esbuild-windows-arm64 "0.15.16" + "@esbuild/android-arm" "0.15.18" + "@esbuild/linux-loong64" "0.15.18" + esbuild-android-64 "0.15.18" + esbuild-android-arm64 "0.15.18" + esbuild-darwin-64 "0.15.18" + esbuild-darwin-arm64 "0.15.18" + esbuild-freebsd-64 "0.15.18" + esbuild-freebsd-arm64 "0.15.18" + esbuild-linux-32 "0.15.18" + esbuild-linux-64 "0.15.18" + esbuild-linux-arm "0.15.18" + esbuild-linux-arm64 "0.15.18" + esbuild-linux-mips64le "0.15.18" + esbuild-linux-ppc64le "0.15.18" + esbuild-linux-riscv64 "0.15.18" + esbuild-linux-s390x "0.15.18" + esbuild-netbsd-64 "0.15.18" + esbuild-openbsd-64 "0.15.18" + esbuild-sunos-64 "0.15.18" + esbuild-windows-32 "0.15.18" + esbuild-windows-64 "0.15.18" + esbuild-windows-arm64 "0.15.18" escalade@^3.1.1: version "3.1.1" @@ -2547,9 +2569,9 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.28.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== + version "8.29.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87" + integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== dependencies: "@eslint/eslintrc" "^1.3.3" "@humanwhocodes/config-array" "^0.11.6" @@ -2708,9 +2730,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" @@ -2775,15 +2797,12 @@ formik@^2.2.9: tslib "^1.10.0" framer-motion@^7.6.17: - version "7.6.17" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-7.6.17.tgz#195223e8897f3b9b41c350e3f6309fa9f6db5c32" - integrity sha512-NmGBjKMCWlTDT156zR8G+jcpiM8OXbvmlgf1CPsVNk5x2RqJ9tieBKMNr6/OjJhirwyOp9s8bt8TsfrrCBIsEw== + version "7.10.0" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-7.10.0.tgz#500c44f064aa26904abc3a1a683afc1311b7cec9" + integrity sha512-HZUl5hFIO23XuhxhGaWSVXaElYv0Wlk3iYXeqNmp1WF1JvD1vQMvuH3OE7Q5PsFX+a5+FrWRam7a4S7xDigEag== dependencies: - "@motionone/dom" "10.13.1" - framesync "6.1.2" + "@motionone/dom" "^10.15.3" hey-listen "^1.0.8" - popmotion "11.0.5" - style-value-types "5.1.2" tslib "2.4.0" optionalDependencies: "@emotion/is-prop-valid" "^0.8.2" @@ -2795,13 +2814,6 @@ framesync@5.3.0: dependencies: tslib "^2.1.0" -framesync@6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.1.2.tgz#755eff2fb5b8f3b4d2b266dd18121b300aefea27" - integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== - dependencies: - tslib "2.4.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2837,7 +2849,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== @@ -2908,9 +2920,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" @@ -2931,6 +2943,13 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -3004,7 +3023,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -3016,6 +3035,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== +immer@^9.0.16: + version "9.0.16" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" + integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -3048,11 +3072,11 @@ inherits@2.0.3: integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.1.3" has "^1.0.3" side-channel "^1.0.4" @@ -3430,9 +3454,9 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.7.tgz#593edbc7c22860ee4d32d3933cfebdfab0c0e0e5" + integrity sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" @@ -3597,20 +3621,10 @@ pirates@^4.0.1: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -popmotion@11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.5.tgz#8e3e014421a0ffa30ecd722564fd2558954e1f7d" - integrity sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA== - dependencies: - framesync "6.1.2" - hey-listen "^1.0.8" - style-value-types "5.1.2" - tslib "2.4.0" - postcss@^8.4.18: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -3629,9 +3643,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== pretty-format@^29.0.0, pretty-format@^29.3.1: version "29.3.1" @@ -3722,6 +3736,18 @@ react-query@^3.39.2: broadcast-channel "^3.4.1" match-sorter "^6.0.2" +react-redux@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.5.tgz#e5fb8331993a019b8aaf2e167a93d10af469c7bd" + integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -3747,19 +3773,19 @@ react-remove-scroll@^2.5.4: use-sidecar "^1.1.2" react-router-dom@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.4.tgz#4271ec66333c440d1754477e4e6a3a5acb5487f8" - integrity sha512-0Axverhw5d+4SBhLqLpzPhNkmv7gahUwlUVIOrRLGJ4/uwt30JVajVJXqv2Qr/LCwyvHhQc7YyK1Do8a9Jj7qA== + version "6.4.5" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.5.tgz#4fdb12efef4f3848c693a76afbeaed1f6ca02047" + integrity sha512-a7HsgikBR0wNfroBHcZUCd9+mLRqZS8R5U1Z1mzLWxFXEkUT3vR1XXmSIVoVpxVX8Bar0nQYYYc9Yipq8dWwAA== dependencies: - "@remix-run/router" "1.0.4" - react-router "6.4.4" + "@remix-run/router" "1.0.5" + react-router "6.4.5" -react-router@6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.4.tgz#8e7794f55ccc7050cb03937c87ff3720ce9f8b60" - integrity sha512-SA6tSrUCRfuLWeYsTJDuriRqfFIsrSvuH7SqAJHegx9ZgxadE119rU8oOX/rG5FYEthpdEaEljdjDlnBxvfr+Q== +react-router@6.4.5: + version "6.4.5" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.5.tgz#73f382af2c8b9a86d74e761a7c5fc3ce7cb0024d" + integrity sha512-1RQJ8bM70YEumHIlNUYc6mFfUDoWa5EgPDenK/fq0bxD8DYpQUi/S6Zoft+9DBrh2xmtg92N5HMAJgGWDhKJ5Q== dependencies: - "@remix-run/router" "1.0.4" + "@remix-run/router" "1.0.5" react-style-singleton@^2.2.1: version "2.2.1" @@ -3788,6 +3814,18 @@ recrawl-sync@^2.0.3: sucrase "^3.20.3" tslib "^1.9.3" +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" + integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== + dependencies: + "@babel/runtime" "^7.9.2" + regenerator-runtime@^0.13.11: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" @@ -3812,6 +3850,11 @@ remove-accents@0.4.2: resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== +reselect@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3956,7 +3999,7 @@ string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -string.prototype.trimend@^1.0.5: +string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== @@ -3965,7 +4008,7 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: +string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== @@ -3991,14 +4034,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-value-types@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.1.2.tgz#6be66b237bd546048a764883528072ed95713b62" - integrity sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q== - dependencies: - hey-listen "^1.0.8" - tslib "2.4.0" - stylis@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" @@ -4092,9 +4127,9 @@ ts-interface-checker@^0.1.9: integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== ts-loader@^9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.1.tgz#b6f3d82db0eac5a8295994f8cb5e4940ff6b1060" - integrity sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw== + version "9.4.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" + integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -4145,9 +4180,9 @@ type-fest@^0.20.2: integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== typescript@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== unbox-primitive@^1.0.2: version "1.0.2" @@ -4197,6 +4232,11 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" @@ -4215,9 +4255,9 @@ vite-tsconfig-paths@^3.6.0: tsconfig-paths "^4.0.0" vite@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e" - integrity sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.5.tgz#dee5678172a8a0ab3e547ad4148c3d547f90e86a" + integrity sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ== dependencies: esbuild "^0.15.9" postcss "^8.4.18"