diff --git a/wallet-web/.gitignore b/wallet-web/.gitignore new file mode 100644 index 0000000000..ffae275320 --- /dev/null +++ b/wallet-web/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel +.idea \ No newline at end of file diff --git a/wallet-web/README.md b/wallet-web/README.md new file mode 100644 index 0000000000..762c5d0f41 --- /dev/null +++ b/wallet-web/README.md @@ -0,0 +1,24 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +Install dependencies: + +```bash +yarn install +``` + +Run the development server: + +```bash +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + + +Build: + +```bash +yarn build +``` \ No newline at end of file diff --git a/wallet-web/common/helpers.ts b/wallet-web/common/helpers.ts new file mode 100644 index 0000000000..212aa6dd67 --- /dev/null +++ b/wallet-web/common/helpers.ts @@ -0,0 +1,148 @@ +import { createStyles, makeStyles, Theme } from "@material-ui/core/styles"; +import ValidatorClient, { + nativeCoinToDisplay, + nymGasLimits, + nymGasPrice, + printableCoin +} from "@nymproject/nym-validator-client"; +import { ADDRESS_LENGTH, DENOM, KEY_LENGTH, UDENOM } from "../pages/_app"; +import { buildFeeTable } from "@cosmjs/launchpad"; +import bs58 from "bs58"; + +export const makeBasicStyle = makeStyles((theme: Theme) => + createStyles({ + appBar: { + position: 'relative', + }, + root: { + textAlign: 'center', + paddingTop: theme.spacing(4), + }, + layout: { + width: 'auto', + marginLeft: theme.spacing(2), + marginRight: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: { + width: 650, + marginLeft: 'auto', + marginRight: 'auto', + }, + }, + paper: { + marginTop: theme.spacing(3), + marginBottom: theme.spacing(3), + padding: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: { + marginTop: theme.spacing(6), + marginBottom: theme.spacing(6), + padding: theme.spacing(3), + }, + }, + stepper: { + padding: theme.spacing(3, 0, 5), + }, + buttons: { + display: 'flex', + justifyContent: 'flex-end', + }, + button: { + marginTop: theme.spacing(3), + marginLeft: theme.spacing(1), + }, + menuButton: { + marginRight: theme.spacing(2), + }, + list: { + width: 250, + }, + wrapper: { + marginTop: theme.spacing(1), + marginBottom: theme.spacing(3), + } + }) +); + +type NodeOwnership = { + ownsMixnode: boolean, + ownsGateway: boolean +} + +export async function checkNodesOwnership(client: ValidatorClient): Promise { + const ownsMixnodePromise = client.ownsMixNode(); + const ownsGatewayPromise = client.ownsGateway(); + + let ownsMixnode = false; + let ownsGateway = false; + + await Promise.allSettled([ownsMixnodePromise, ownsGatewayPromise]).then((results) => { + if (results[0].status === "fulfilled") { + ownsMixnode = results[0].value + } else { + console.error("failed to check for mixnode ownership") + } + if (results[1].status === "fulfilled") { + ownsGateway = results[1].value + } else { + console.error("failed to check for gateway ownership") + } + }) + + return { + ownsMixnode, + ownsGateway + } +} + +export const validateClientAddress = (address: string): boolean => { + return address.length === ADDRESS_LENGTH && address.startsWith(DENOM) +} + +export const validateIdentityKey = (key: string): boolean => { + try { + const bytes = bs58.decode(key); + // of length 32 + return bytes.length === KEY_LENGTH; + } catch { + return false + } +} + +export const validateRawPort = (rawPort: string): boolean => { + // first of all it must be an integer + const port = parseInt(rawPort) + if (port == null) { + return false + } + // and it must be a non-zero 16 bit unsigned integer + return port >= 1 && port <= 65535 +} + +export const basicRawCoinValueValidation = (rawAmount: string): boolean => { + let amountFloat = parseFloat(rawAmount) + if (isNaN(amountFloat)) { + return false + } + + // it cannot have more than 6 decimal places + if ((amountFloat) != parseFloat(amountFloat.toFixed(6))) { + return false + } + + // it cannot be larger than the total supply + if (amountFloat > 1_000_000_000_000_000) { + return false + } + + // it can't be lower than one micro coin + return amountFloat >= 0.000001; +} + +export const getDisplayExecGasFee = (): string => { + const table = buildFeeTable(nymGasPrice(UDENOM), nymGasLimits, nymGasLimits) + return printableCoin(table.exec.amount[0]) +} + +export const getDisplaySendGasFee = (): string => { + const table = buildFeeTable(nymGasPrice(UDENOM), nymGasLimits, nymGasLimits) + return printableCoin(table.send.amount[0]) +} diff --git a/wallet-web/common/node.tsx b/wallet-web/common/node.tsx new file mode 100644 index 0000000000..e3f5c3a9f0 --- /dev/null +++ b/wallet-web/common/node.tsx @@ -0,0 +1,4 @@ +export enum NodeType { + Mixnode = "Mixnode", + Gateway = "Gateway", +} diff --git a/wallet-web/components/Confirmation.tsx b/wallet-web/components/Confirmation.tsx new file mode 100644 index 0000000000..ffb9d7d9f6 --- /dev/null +++ b/wallet-web/components/Confirmation.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import {CircularProgress} from "@material-ui/core"; +import {Alert, AlertTitle} from '@material-ui/lab'; + +type ConfirmationProps = { + finished: boolean, + progressMessage: string, + successMessage: string, + failureMessage: string, + error: Error, +} + +export default function Confirmation(props: ConfirmationProps) { + return ( + + {!props.finished ? ( + + + {props.progressMessage} + + + + + + ) : ( + + {props.error === null ? ( + {props.successMessage} + ) : ( + + {props.error.name} + {props.failureMessage} - {props.error.message} + + )} + + )} + + ); +} diff --git a/wallet-web/components/ExecFeeNotice.tsx b/wallet-web/components/ExecFeeNotice.tsx new file mode 100644 index 0000000000..5807ba0a46 --- /dev/null +++ b/wallet-web/components/ExecFeeNotice.tsx @@ -0,0 +1,18 @@ +import {Alert} from '@material-ui/lab'; +import { getDisplayExecGasFee } from "../common/helpers"; + +type ExecFeeNoticeProps = { + name: string +} + +const ExecFeeNotice = (props: ExecFeeNoticeProps) => { + return ( + + The gas fee for + {props.name} + {`is ${getDisplayExecGasFee()}`} + + ) +} + +export default ExecFeeNotice \ No newline at end of file diff --git a/wallet-web/components/Link.tsx b/wallet-web/components/Link.tsx new file mode 100644 index 0000000000..e9fe425824 --- /dev/null +++ b/wallet-web/components/Link.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import clsx from 'clsx'; +import { useRouter } from "next/router"; +import NextLink, { LinkProps as NextLinkProps } from 'next/link'; +import MuiLink, { LinkProps as MuiLinkProps } from '@material-ui/core/Link'; + +type NextComposedProps = React.AnchorHTMLAttributes & NextLinkProps; + +const NextComposed = React.forwardRef(function NextComposed(props: NextComposedProps, ref: React.Ref) { + const { as, href, ...other } = props; + + return ( + + + + ); +}); + +interface LinkPropsBase { + activeClassName?: string; + innerRef?: React.Ref; + naked?: boolean; +} + +type LinkProps = LinkPropsBase & NextComposedProps & Omit; + +function Link(props: LinkProps) { + const { + href, + activeClassName = 'active', + className: classNameProps, + innerRef, + naked, + ...other + } = props; + + const router = useRouter(); + const pathname = typeof href === 'string' ? href : href.pathname; + const className = clsx(classNameProps, { + [activeClassName]: router.pathname === pathname && activeClassName, + }); + + if (naked) { + return ; + } + + return ( + + ); +} + +export default React.forwardRef((props, ref) => ); diff --git a/wallet-web/components/MainNav.tsx b/wallet-web/components/MainNav.tsx new file mode 100644 index 0000000000..65f29f2bab --- /dev/null +++ b/wallet-web/components/MainNav.tsx @@ -0,0 +1,172 @@ +import { + AppBar, + Divider, + Drawer, + IconButton, + List, + ListItem, + ListItemIcon, + ListItemText, + ListSubheader, + Toolbar, + Typography +} from "@material-ui/core"; +import React, { useContext } from "react"; +import Link from 'next/link' +import VpnKeyIcon from "@material-ui/icons/VpnKey" +import AccountBalanceWalletIcon from '@material-ui/icons/AccountBalanceWallet'; +import { ValidatorClientContext } from "../contexts/ValidatorClient"; +import { ADMIN_ADDRESS } from "../pages/_app"; +import MenuIcon from '@material-ui/icons/Menu'; +import MonetizationOnIcon from '@material-ui/icons/MonetizationOn'; +import AttachMoneyIcon from '@material-ui/icons/AttachMoney'; +import MoneyOffIcon from '@material-ui/icons/MoneyOff'; +import HowToVoteIcon from '@material-ui/icons/HowToVote'; +import CancelIcon from '@material-ui/icons/Cancel'; +import PageviewIcon from '@material-ui/icons/Pageview'; +import { makeBasicStyle } from "../common/helpers"; +import { theme } from "../lib/theme"; + +export default function MainNav() { + const classes = makeBasicStyle(theme); + + const { client } = useContext(ValidatorClientContext) + + let adminPageDisplayed = false + + if (client !== null && client.address === ADMIN_ADDRESS) { + adminPageDisplayed = true + } + + const [open, setOpen] = React.useState(false) + + + const toggleDrawer = () => { + setOpen((prevOpen) => !prevOpen); + }; + + const closeDrawer = () => { + setOpen(false) + } + + return ( + + + + + + + + +
+ + Nym Wallet + + } + > + + + + + + + + + + + + + + + + + + + + + + + {/**/} + {/* */} + {/**/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {adminPageDisplayed && + + + + + + + + + + + + + } + +
+
+ + + + Nym + +
+
+
+ ) +} \ No newline at end of file diff --git a/wallet-web/components/NoClientError.tsx b/wallet-web/components/NoClientError.tsx new file mode 100644 index 0000000000..cd4dbff210 --- /dev/null +++ b/wallet-web/components/NoClientError.tsx @@ -0,0 +1,12 @@ +import {Alert, AlertTitle} from "@material-ui/lab"; +import React from "react"; +import Link from "./Link"; + +export default function NoClientError () { + return ( + + No client detected + Have you signed in? Try to go back to the main page and try again + + ) +} \ No newline at end of file diff --git a/wallet-web/components/NodeIdentityForm.tsx b/wallet-web/components/NodeIdentityForm.tsx new file mode 100644 index 0000000000..6f9f38ccd1 --- /dev/null +++ b/wallet-web/components/NodeIdentityForm.tsx @@ -0,0 +1,56 @@ +import TextField from "@material-ui/core/TextField"; +import { Button } from "@material-ui/core"; +import React from "react"; +import { makeBasicStyle, validateIdentityKey } from "../common/helpers"; +import { theme } from "../lib/theme"; + +type NodeIdentityFormProps = { + onSubmit: (event: any) => void + buttonText: string +} + +const NodeIdentityForm = (props: NodeIdentityFormProps) => { + const classes = makeBasicStyle(theme); + + const [validIdentity, setValidIdentity] = React.useState(true) + + const validateForm = (event: any): boolean => { + let validIdentity = validateIdentityKey(event.target.identity.value); + setValidIdentity(validIdentity) + + return validIdentity + } + + const submitForm = (event: any) => { + event.preventDefault() + + if (validateForm(event)) { + return props.onSubmit(event) + } + } + return ( +
+ +
+ +
+ + ) +} + +export default NodeIdentityForm \ No newline at end of file diff --git a/wallet-web/components/NodeTypeChooser.tsx b/wallet-web/components/NodeTypeChooser.tsx new file mode 100644 index 0000000000..4ac137ca2e --- /dev/null +++ b/wallet-web/components/NodeTypeChooser.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import { FormControl, FormControlLabel, FormLabel, RadioGroup } from "@material-ui/core"; +import { NodeType } from "../common/node"; +import Radio from "@material-ui/core/Radio"; +import { Dispatch, SetStateAction } from "react"; + +type NodeTypeChooserProps = { + nodeType: NodeType, + setNodeType: Dispatch> +} + +const NodeTypeChooser = (props: NodeTypeChooserProps) => { + const handleNodeTypeChange = (event: React.ChangeEvent) => { + let eventValue = (event.target as HTMLInputElement).value + let type = NodeType[eventValue as keyof typeof NodeType] + props.setNodeType(type); + }; + + return ( + + Select node type + + } label="Mixnode" /> + } label="Gateway" /> + + + ) +} + +export default NodeTypeChooser \ No newline at end of file diff --git a/wallet-web/components/SignIn.tsx b/wallet-web/components/SignIn.tsx new file mode 100644 index 0000000000..80e8257b99 --- /dev/null +++ b/wallet-web/components/SignIn.tsx @@ -0,0 +1,135 @@ +import React, { useContext, useState } from 'react'; +import Button from '@material-ui/core/Button'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import TextField from '@material-ui/core/TextField'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; +import Container from '@material-ui/core/Container'; +import { ValidatorClientContext } from "../contexts/ValidatorClient"; +import { useRouter } from "next/router"; +import ValidatorClient from "@nymproject/nym-validator-client"; +import { BONDING_CONTRACT_ADDRESS, DENOM, VALIDATOR_URLS } from "../pages/_app"; +import { LinearProgress } from "@material-ui/core"; +import { Alert, AlertTitle } from "@material-ui/lab"; +import Link from "./Link"; + + +const useStyles = makeStyles((theme) => ({ + paper: { + marginTop: theme.spacing(8), + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + }, + avatar: { + margin: theme.spacing(1), + backgroundColor: theme.palette.secondary.main, + }, + form: { + width: '100%', // Fix IE 11 issue. + marginTop: theme.spacing(1), + }, + submit: { + margin: theme.spacing(3, 0, 2), + }, +})); + +export default function SignIn() { + const classes = useStyles(); + const router = useRouter() + + const { client, setClient } = useContext(ValidatorClientContext) + const [loading, setLoading] = useState(false) + const [clientError, setClientError] = useState(null) + + console.log("context client is", client); + + const makeClient = (mnemonic: string): Promise => { + return ValidatorClient.connect( + BONDING_CONTRACT_ADDRESS, + mnemonic, + VALIDATOR_URLS, + DENOM, + ).then((client) => { + setClient(client); + console.log(`connected to validator, our address is ${client.address}`); + console.log("connected to validator", client.urls[0]) + return true + }).catch((err) => { + setClientError(err) + throw new Error("failed to create the client"); + }); + + } + + const failedClient = (err: Error) => { + return ( + + Could not create the client + {err.message} + + ) + } + + const handleSubmit = async (event) => { + event.preventDefault() + setLoading(true) + setClientError(null) + let mnemonic = event.target.mnemonic.value + makeClient(mnemonic).then(async () => { + // only push `/send` if we managed to create the client! + await router.push("/bond") + } + ).catch((_err) => { + setLoading(false) + }) + } + + return ( + + +
+ {/* + + */} + + Sign in + +
+ + {clientError !== null && failedClient(clientError)} + + {loading && } + + + + + {"Don't have an account? Create one"} + + + + +
+
+ ); +} diff --git a/wallet-web/components/admin/AdminForm.tsx b/wallet-web/components/admin/AdminForm.tsx new file mode 100644 index 0000000000..0859dfe337 --- /dev/null +++ b/wallet-web/components/admin/AdminForm.tsx @@ -0,0 +1,105 @@ +import { Button, Grid, InputAdornment } from "@material-ui/core"; +import TextField from "@material-ui/core/TextField"; +import React from "react"; +import { nativeToPrintable, StateParams } from "@nymproject/nym-validator-client"; +import { DENOM } from "../../pages/_app"; +import { theme } from "../../lib/theme"; +import { makeBasicStyle } from "../../common/helpers"; + +type AdminFormProps = { + onSubmit: (event: any) => void + currentParams: StateParams, +} + +export default function AdminForm(props: AdminFormProps) { + const classes = makeBasicStyle(theme); + + return ( +
+ + + {DENOM} + }} + /> + + + {DENOM} + }} + /> + + + + + + + + + hours + }} + /> + + + + + +
+ +
+
+ ) +} diff --git a/wallet-web/components/bond/BondNodeForm.tsx b/wallet-web/components/bond/BondNodeForm.tsx new file mode 100644 index 0000000000..f3d03e4730 --- /dev/null +++ b/wallet-web/components/bond/BondNodeForm.tsx @@ -0,0 +1,379 @@ +import React from 'react'; +import Grid from '@material-ui/core/Grid'; +import TextField from '@material-ui/core/TextField'; +import { Button, Checkbox, FormControlLabel, InputAdornment } from "@material-ui/core"; +import bs58 from "bs58"; +import semver from "semver" +import { NodeType } from "../../common/node"; +import { theme } from "../../lib/theme"; +import { basicRawCoinValueValidation, makeBasicStyle, validateRawPort } from "../../common/helpers"; +import { Coin, printableCoin } from "@nymproject/nym-validator-client"; +import { DENOM } from "../../pages/_app"; +import { printableBalanceToNative } from "@nymproject/nym-validator-client/dist/currency"; +import { BondingInformation } from "./NodeBond"; + +const DEFAULT_MIX_PORT = 1789 +const DEFAULT_VERLOC_PORT = 1790 +const DEFAULT_HTTP_API_PORT = 8000 +const DEFAULT_CLIENTS_PORT = 9000 + +type BondNodeFormProps = { + type: NodeType + minimumMixnodeBond: Coin, + minimumGatewayBond: Coin, + onSubmit: (event: any) => void +} + +export default function BondNodeForm(props: BondNodeFormProps) { + const classes = makeBasicStyle(theme); + + const [validity, setValidity] = React.useState({ + validAmount: true, + validSphinxKey: true, + validIdentityKey: true, + validHost: true, + validVersion: true, + validLocation: true, + validMixPort: true, + + // this should have probably be somehow split to be subclasses of the validity matrix + // the above is more true now as more fields are added. This looks kinda disgusting... + // mixnode-specific: + validVerlocPort: true, + validHttpApiPort: true, + + // gateway-specific: + validClientsPort: true, + }) + + const [advancedShown, setAdvancedShown] = React.useState(false) + + const handleCheckboxToggle = () => { + setAdvancedShown((prevSet) => !prevSet); + } + + + const validateForm = (event: any): boolean => { + let validAmount = validateAmount(event.target.amount.value); + let validSphinxKey = validateKey(event.target.sphinxkey.value); + let validIdentityKey = validateKey(event.target.identity.value); + let validHost = validateHost(event.target.host.value); + let validVersion = validateVersion(event.target.version.value); + + let validLocation = (props.type == NodeType.Gateway) ? validateLocation(event.target.location.value) : true; + + let newValidity = { + validAmount: validAmount, + validSphinxKey: validSphinxKey, + validIdentityKey: validIdentityKey, + validHost: validHost, + validVersion: validVersion, + + validLocation: validLocation, + } + + if (advancedShown) { + let validMixPort = validateRawPort(event.target.mixPort.value) + let validVerlocPort = (props.type == NodeType.Mixnode) ? validateRawPort(event.target.verlocPort.value) : true; + let validHttpApiPort = (props.type == NodeType.Mixnode) ? validateRawPort(event.target.httpApiPort.value) : true; + let validClientsPort = (props.type == NodeType.Gateway) ? validateRawPort(event.target.clientsPort.value) : true; + + newValidity = { + ...newValidity, ...{ + validMixPort: validMixPort, + validVerlocPort: validVerlocPort, + validHttpApiPort: validHttpApiPort, + validClientsPort: validClientsPort, + } + } + } + + setValidity((previousState) => { + return {...previousState, ...newValidity} + }); + + // just AND everything together + const reducer = (acc, current) => acc && current; + return Object.entries(newValidity).map((entry) => entry[1]).reduce(reducer, true) + } + + const validateAmount = (rawValue: string): boolean => { + // tests basic coin value requirements, like no more than 6 decimal places, value lower than total supply, etc + if (!basicRawCoinValueValidation(rawValue)) { + return false + } + + // this conversion seems really iffy but I'm not sure how to better approach it + let nativeValueString = printableBalanceToNative(rawValue) + let nativeValue = parseInt(nativeValueString) + if (props.type == NodeType.Mixnode) { + return nativeValue >= parseInt(props.minimumMixnodeBond.amount) + } else { + return nativeValue >= parseInt(props.minimumGatewayBond.amount) + } + } + + const validateKey = (key: string): boolean => { + // it must be a valid base58 key + try { + const bytes = bs58.decode(key); + // of length 32 + return bytes.length === 32 + } catch { + return false + } + } + + const validateHost = (host: string): boolean => { + // I don't think that proper checks are in scope of the change here + // what would need to be checked is whether one of the following is true: + // - host is an ipv4 address + // - host is an ipv6 address + // - host is a valid hostname + + // so at least perform the dumbest possible checks + // ipv4 needs 4 dot-separated octets + // ipv6 can have multiple possible representations, but it needs to contain at least two colons + // a hostname (in this case) needs to have a top level domain present + + const dot_occurrences = host.split('.').length - 1 + const colon_occurrences = host.split(':').length - 1 + + if (dot_occurrences == 3) { + // possible ipv4 + // make sure it has no ports attached! + return colon_occurrences == 0 + } else if (colon_occurrences >= 2) { + // possible ipv6 + return true + } else if (dot_occurrences >= 1) { + // possible hostname + // make sure it has no ports attached! + return colon_occurrences == 0 + } + return false + } + + const validateVersion = (version: string): boolean => { + // check if its a valid semver + return semver.valid(version) + } + + const validateLocation = (location: string): boolean => { + // right now only perform the stupid check of whether the user copy-pasted the tooltip... (with or without brackets) + return !location.trim().includes("physical location of your node") + } + + const constructMixnodeBondingInfo = (event: any): BondingInformation => { + return { + amount: event.target.amount.value, + nodeDetails: { + host: event.target.host.value, + http_api_port: advancedShown ? parseInt(event.target.httpApiPort.value) : DEFAULT_HTTP_API_PORT, + mix_port: advancedShown ? parseInt(event.target.mixPort.value) : DEFAULT_MIX_PORT, + verloc_port: advancedShown ? parseInt(event.target.verlocPort.value) : DEFAULT_VERLOC_PORT, + sphinx_key: event.target.sphinxkey.value, + identity_key: event.target.identity.value, + version: event.target.version.value, + } + } + } + + const constructGatewayBondingInfo = (event: any): BondingInformation => { + return { + amount: event.target.amount.value, + nodeDetails: { + host: event.target.host.value, + mix_port: advancedShown ? parseInt(event.target.mixPort.value) : DEFAULT_MIX_PORT, + clients_port: advancedShown ? parseInt(event.target.clientsPort.value) : DEFAULT_CLIENTS_PORT, + sphinx_key: event.target.sphinxkey.value, + identity_key: event.target.identity.value, + version: event.target.version.value, + location: event.target.location.value + } + } + } + + const submitForm = (event: any) => { + event.preventDefault() + + if (validateForm(event)) { + if (props.type == NodeType.Mixnode) { + return props.onSubmit(constructMixnodeBondingInfo(event)) + } else { + return props.onSubmit(constructGatewayBondingInfo(event)) + } + } + } + + let minimumBond = props.minimumMixnodeBond; + if (props.type == NodeType.Gateway) { + minimumBond = props.minimumGatewayBond + } + + // if this whole interface wasn't to be completely redone in a month time, I would have definitely redone the form + // but I guess it's fine for time being + return ( +
+ + + {DENOM} + }} + /> + + + + + + + + + + + + + {/* if it's a gateway - get location */} + { + props.type === NodeType.Gateway && + + } + + + + + + + + + } + label="Show advanced options" + /> + + + {advancedShown && + + + + + + {/*yes, I also hate so many layers of indentation here*/} + {props.type === NodeType.Mixnode ? ( + + + + + + + + + + ) : ( + + + + )} + + } + + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/wallet-web/components/bond/NodeBond.tsx b/wallet-web/components/bond/NodeBond.tsx new file mode 100644 index 0000000000..f7f1b18cf6 --- /dev/null +++ b/wallet-web/components/bond/NodeBond.tsx @@ -0,0 +1,164 @@ +import React, { useContext, useEffect } from 'react'; +import Typography from '@material-ui/core/Typography'; +import { Grid, LinearProgress, Paper } from '@material-ui/core'; +import { Gateway, MixNode } from '@nymproject/nym-validator-client/dist/types'; +import Confirmation from "../Confirmation"; +import { ValidatorClientContext } from "../../contexts/ValidatorClient"; +import NoClientError from "../NoClientError"; +import { useRouter } from "next/router"; +import BondNodeForm from "./BondNodeForm"; +import { NodeType } from "../../common/node"; +import Link from "../Link"; +import { theme } from "../../lib/theme"; +import { checkNodesOwnership, makeBasicStyle } from "../../common/helpers"; +import NodeTypeChooser from "../NodeTypeChooser"; +import ExecFeeNotice from "../ExecFeeNotice"; +import { printableBalanceToNative } from "@nymproject/nym-validator-client/dist/currency"; +import { coin } from "@nymproject/nym-validator-client"; +import { UDENOM } from "../../pages/_app"; + +export type BondingInformation = { + amount: string, + nodeDetails: MixNode | Gateway; +} + +const BondNode = () => { + const classes = makeBasicStyle(theme); + const router = useRouter() + const {client} = useContext(ValidatorClientContext) + + const [bondingStarted, setBondingStarted] = React.useState(false) + const [bondingFinished, setBondingFinished] = React.useState(false) + const [bondingError, setBondingError] = React.useState(null) + + const [checkedOwnership, setCheckedOwnership] = React.useState(false) + const [ownsMixnode, setOwnsMixnode] = React.useState(false) + const [ownsGateway, setOwnsGateway] = React.useState(false) + + const [minimumMixnodeBond, setMinimumMixnodeBond] = React.useState(null) + const [minimumGatewayBond, setMinimumGatewayBond] = React.useState(null) + + const [nodeType, setNodeType] = React.useState(NodeType.Mixnode) + + useEffect(() => { + const getInitialData = async () => { + if (client === null) { + await router.push("/") + } else { + const nodeOwnership = await checkNodesOwnership(client) + setOwnsMixnode(nodeOwnership.ownsMixnode) + setOwnsGateway(nodeOwnership.ownsGateway) + + const minimumMixnodeBond = await client.minimumMixnodeBond() + setMinimumMixnodeBond(minimumMixnodeBond) + const minimumGatewayBond = await client.minimumGatewayBond() + setMinimumGatewayBond(minimumGatewayBond) + + setCheckedOwnership(true) + } + } + getInitialData() + }, [client]) + + const bondNode = async (bondingInformation: BondingInformation) => { + setBondingStarted(true) + // event.preventDefault(); + console.log(`BOND button pressed`); + + console.log(bondingInformation) + let amountValue = parseInt(printableBalanceToNative(bondingInformation.amount)) + let amount = coin(amountValue, UDENOM) + + console.log(bondingInformation.nodeDetails) + + if (nodeType == NodeType.Mixnode) { + let mixnode = (bondingInformation.nodeDetails as MixNode) + client.bondMixnode(mixnode, amount).then((value => { + console.log("bonded mixnode!", value) + })).catch(setBondingError).finally(() => setBondingFinished(true)) + } else { + let gateway = (bondingInformation.nodeDetails as Gateway) + client.bondGateway(gateway, amount).then((value => { + console.log("bonded gateway!", value) + })).catch(setBondingError).finally(() => setBondingFinished(true)) + } + } + + const getBondContent = () => { + // we're not signed in + if (client === null) { + return () + } + + // we haven't checked whether we actually already own a node + if (!checkedOwnership) { + return () + } + + // we already own a mixnode + if (ownsMixnode) { + return ( + + + + You have already have a bonded mixnode. If you wish to bond a different one, you need to + first unbond the existing one. + + + + ) + } + + // we already own a gateway + if (ownsGateway) { + return ( + + + + You have already have a bonded gateway. If you wish to bond a different one, you need to + first unbond the existing one. + + + + ) + } + + // we haven't clicked bond button yet + if (!bondingStarted) { + return ( + + + + + ) + } + + // We started bonding + return ( + + ) + } + + return ( + +
+ + + + Bond a {nodeType} + + {getBondContent()} + +
+
+ ); +}; + +export default BondNode; diff --git a/wallet-web/components/delegate/DelegateForm.tsx b/wallet-web/components/delegate/DelegateForm.tsx new file mode 100644 index 0000000000..0e5bf469d8 --- /dev/null +++ b/wallet-web/components/delegate/DelegateForm.tsx @@ -0,0 +1,121 @@ +import Grid from "@material-ui/core/Grid"; +import React from "react"; +import { Button, InputAdornment } from "@material-ui/core"; +import TextField from "@material-ui/core/TextField"; +import { DENOM } from "../../pages/_app"; +import { theme } from "../../lib/theme"; +import { basicRawCoinValueValidation, makeBasicStyle, validateIdentityKey } from "../../common/helpers"; + + +type DelegateFormProps = { + onSubmit: (event: any) => void +} + +export default function DelegateForm(props: DelegateFormProps) { + const classes = makeBasicStyle(theme); + + const [validAmount, setValidAmount] = React.useState(true) + const [validIdentity, setValidIdentity] = React.useState(true) + // const [checkboxSet, setCheckboxSet] = React.useState(false) + + // const handleCheckboxToggle = () => { + // setCheckboxSet((prevSet) => !prevSet); + // } + + const handleAmountChange = (event: any) => { + let nonZeroAmount = event.target.value.length > 0 + if (nonZeroAmount) { + // don't ask me about that. javascript works in mysterious ways + // and this is apparently a good way of checking if string + // is purely made of numeric characters + let parsed = +event.target.value + if (isNaN(parsed)) { + setValidAmount(false) + } else { + setValidAmount(true) + } + } + } + + const validateForm = (event: any): boolean => { + let validIdentity = validateIdentityKey(event.target.identity.value); + let validAmount = validateAmount(event.target.amount.value); + + setValidIdentity(validIdentity) + setValidAmount(validAmount) + + return validIdentity && validAmount + } + + const validateAmount = (rawAmount: string): boolean => { + return basicRawCoinValueValidation(rawAmount) + } + + const submitForm = (event: any) => { + event.preventDefault() + + if (validateForm(event)) { + return props.onSubmit(event) + } + } + + return ( +
+ + + + + + + + {DENOM} + }} + /> + + + {/**/} + {/* */} + {/* }*/} + {/* label="checkbox text"*/} + {/* />*/} + {/**/} + + +
+ +
+
+ ) +} \ No newline at end of file diff --git a/wallet-web/components/delegate/NodeDelegation.tsx b/wallet-web/components/delegate/NodeDelegation.tsx new file mode 100644 index 0000000000..62e8adc2b7 --- /dev/null +++ b/wallet-web/components/delegate/NodeDelegation.tsx @@ -0,0 +1,112 @@ +import React, { useContext, useEffect } from "react"; +import { Paper } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { useRouter } from "next/router"; +import { ValidatorClientContext } from "../../contexts/ValidatorClient"; +import { NodeType } from "../../common/node"; +import NoClientError from "../NoClientError"; +import Confirmation from "../Confirmation"; +import DelegateForm from "./DelegateForm"; +import { printableBalanceToNative } from "@nymproject/nym-validator-client/dist/currency"; +import { Coin } from "@cosmjs/launchpad"; +import { coin, printableCoin } from "@nymproject/nym-validator-client"; +import { UDENOM } from "../../pages/_app"; +import { theme } from "../../lib/theme"; +import { makeBasicStyle } from "../../common/helpers"; +import NodeTypeChooser from "../NodeTypeChooser"; +import ExecFeeNotice from "../ExecFeeNotice"; + +const DelegateToNode = () => { + const classes = makeBasicStyle(theme); + const router = useRouter() + const {client} = useContext(ValidatorClientContext) + + const [delegationStarted, setDelegationStarted] = React.useState(false) + const [delegationFinished, setDelegationFinished] = React.useState(false) + const [delegationError, setDelegationError] = React.useState(null) + + const [nodeType, setNodeType] = React.useState(NodeType.Mixnode) + const [stakeValue, setStakeValue] = React.useState("0 HAL") + const [nodeIdentity, setNodeIdentity] = React.useState("") + + useEffect(() => { + const checkClient = async () => { + if (client === null) { + await router.push("/") + } + } + checkClient() + }, [client]) + + const getDelegationValue = (raw: string): Coin => { + let native = printableBalanceToNative(raw) + return coin(parseInt(native), UDENOM) + } + + const delegateToNode = async (event) => { + event.preventDefault(); + console.log(`DELEGATE button pressed`); + + const nodeIdentity = event.target.identity.value; + const delegationValue = getDelegationValue(event.target.amount.value) + + setNodeIdentity(nodeIdentity) + setStakeValue(printableCoin(delegationValue)) + setDelegationStarted(true) + + if (nodeType == NodeType.Mixnode) { + client.delegateToMixnode(nodeIdentity, delegationValue).then((value => { + console.log("delegated to mixnode!", value) + })).catch(setDelegationError).finally(() => setDelegationFinished(true)) + } else { + client.delegateToGateway(nodeIdentity, delegationValue).then((value => { + console.log("delegated to gateway!", value) + })).catch(setDelegationError).finally(() => setDelegationFinished(true)) + } + } + + const getDelegationContent = () => { + // we're not signed in + if (client === null) { + return () + } + + // we haven't clicked delegate button yet + if (!delegationStarted) { + return ( + + + + + ) + } + + // We started delegation + return ( + + ) + } + + return ( + +
+ + + + Delegate to {nodeType} + + {getDelegationContent()} + +
+
+ ); +} + + +export default DelegateToNode; diff --git a/wallet-web/components/delegation-check/DelegationCheck.tsx b/wallet-web/components/delegation-check/DelegationCheck.tsx new file mode 100644 index 0000000000..40e9dc5ca3 --- /dev/null +++ b/wallet-web/components/delegation-check/DelegationCheck.tsx @@ -0,0 +1,114 @@ +import React, { useContext, useEffect } from "react"; +import { Button, Paper } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { useRouter } from "next/router"; +import { ValidatorClientContext } from "../../contexts/ValidatorClient"; +import { NodeType } from "../../common/node"; +import NoClientError from "../NoClientError"; +import Confirmation from "../Confirmation"; +import NodeTypeChooser from "../NodeTypeChooser"; +import { printableCoin } from "@nymproject/nym-validator-client"; +import { theme } from "../../lib/theme"; +import { makeBasicStyle } from "../../common/helpers"; +import NodeIdentityForm from "../NodeIdentityForm"; + + +const DelegationCheck = () => { + const classes = makeBasicStyle(theme); + const router = useRouter() + const {client} = useContext(ValidatorClientContext) + + const [checkStarted, setCheckStarted] = React.useState(false) + const [checkFinished, setCheckFinished] = React.useState(false) + const [checkError, setCheckError] = React.useState(null) + + const [nodeType, setNodeType] = React.useState(NodeType.Mixnode) + const [stakeValue, setStakeValue] = React.useState("0") + const [nodeIdentity, setNodeIdentity] = React.useState("") + + + useEffect(() => { + const checkClient = async () => { + if (client === null) { + await router.push("/") + } + } + checkClient() + }, [client]) + + + // eh, crude, but I guess does the trick + const handleDelegationCheckError = (err: Error) => { + if (err.message.includes("Could not find any delegation information associated with")) { + setStakeValue("0 HAL") + } else { + setCheckError(err) + } + } + + const checkDelegation = async (event) => { + event.preventDefault(); + + console.log(`CHECK DELEGATION button pressed`); + + let identity = event.target.identity.value + setNodeIdentity(identity) + setCheckStarted(true) + + if (nodeType == NodeType.Mixnode) { + client.getMixDelegation(identity, client.address).then((value => { + setStakeValue(printableCoin(value.amount)) + })).catch(handleDelegationCheckError).finally(() => setCheckFinished(true)) + } else { + client.getGatewayDelegation(identity, client.address).then((value => { + setStakeValue(printableCoin(value.amount)) + })).catch(handleDelegationCheckError).finally(() => setCheckFinished(true)) + } + + } + + const getDelegationCheckContent = () => { + // we're not signed in + if (client === null) { + return () + } + + // we haven't clicked delegate button yet + if (!checkStarted) { + return ( + + + + + ) + } + + // We started the check + const stakeMessage = `Current stake on ${nodeType} ${nodeIdentity} is ${stakeValue}` + return ( + + ) + } + + return ( + +
+ + + Check your stake on a {nodeType} + + {getDelegationCheckContent()} + +
+
+ ); +} + + +export default DelegationCheck; diff --git a/wallet-web/components/send-funds/Review.tsx b/wallet-web/components/send-funds/Review.tsx new file mode 100644 index 0000000000..56e41a3041 --- /dev/null +++ b/wallet-web/components/send-funds/Review.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import { SendFundsMsg } from '../../pages/send'; +import { printableCoin } from "@nymproject/nym-validator-client"; +import { getDisplaySendGasFee } from "../../common/helpers"; + +const useStyles = makeStyles((theme) => ({ + listItem: { + padding: theme.spacing(1, 0), + }, + total: { + fontWeight: 700, + }, + title: { + marginTop: theme.spacing(2), + }, +})); + +export const Review = (parentTrans: SendFundsMsg) => { + const classes = useStyles(); + + return ( + + + + + You are about to send + + {printableCoin(parentTrans.coin)} + to + {parentTrans.recipient} + With additional gas fee of + {getDisplaySendGasFee()} + + + + ); +} diff --git a/wallet-web/components/send-funds/SendNymForm.tsx b/wallet-web/components/send-funds/SendNymForm.tsx new file mode 100644 index 0000000000..76e8500aa2 --- /dev/null +++ b/wallet-web/components/send-funds/SendNymForm.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import { DENOM } from '../../pages/_app'; +import { InputAdornment } from "@material-ui/core"; + +type SendNymFormProps = { + address: string, + setFormStatus: (nonEmpty: boolean) => void, +} + +export default function SendNymForm({ address, setFormStatus }: SendNymFormProps) { + const [recipientHasValue, setRecipientHasValue] = React.useState(false) + const [amountHasValue, setAmountHasValue] = React.useState(false) + const [validAmount, setValidAmount] = React.useState(true) + + const handleInputData = (element) => (event) => { + if (element === "recipient") { + let nonZeroRecipient = event.target.value.length > 0 + setRecipientHasValue(nonZeroRecipient) + setFormStatus(nonZeroRecipient && amountHasValue) + } else if (element === "amount") { + let nonZeroAmount = event.target.value.length > 0 + setAmountHasValue(nonZeroAmount) + setFormStatus(recipientHasValue && nonZeroAmount) + if (nonZeroAmount) { + // don't ask me about that. javascript works in mysterious ways + // and this is apparently a good way of checking if string + // is purely made of numeric characters + let parsed = +event.target.value + if (isNaN(parsed)) { + setValidAmount(false) + } else { + setValidAmount(true) + } + } + + } + + } + + return ( + + + Enter recipient address and the amount + + + + Sending from {address} + + + + + + {DENOM} + }} + /> + + + + ); +} diff --git a/wallet-web/components/unbond/UnbondNode.tsx b/wallet-web/components/unbond/UnbondNode.tsx new file mode 100644 index 0000000000..d60e9ee7bf --- /dev/null +++ b/wallet-web/components/unbond/UnbondNode.tsx @@ -0,0 +1,141 @@ +import { NodeType } from "../../common/node"; +import { useRouter } from "next/router"; +import React, { useContext, useEffect } from "react"; +import { ValidatorClientContext } from "../../contexts/ValidatorClient"; +import NoClientError from "../NoClientError"; +import { Grid, LinearProgress, Paper } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import UnbondNotice from "./UnbondNotice"; +import Confirmation from "../Confirmation"; +import { theme } from "../../lib/theme"; +import { checkNodesOwnership, makeBasicStyle } from "../../common/helpers"; +import ExecFeeNotice from "../ExecFeeNotice"; + +const UnbondNode = () => { + const classes = makeBasicStyle(theme); + const router = useRouter() + const {client} = useContext(ValidatorClientContext) + + const [unbondingStarted, setUnbondingStarted] = React.useState(false) + const [unbondingFinished, setUnbondingFinished] = React.useState(false) + const [unbondingError, setUnbondingError] = React.useState(null) + + const [checkedOwnership, setCheckedOwnership] = React.useState(false) + const [ownsMixnode, setOwnsMixnode] = React.useState(false) + const [ownsGateway, setOwnsGateway] = React.useState(false) + + const [nodeType, setNodeType] = React.useState(NodeType.Mixnode) + + useEffect(() => { + const checkOwnership = async () => { + if (client === null) { + await router.push("/") + } else { + const nodeOwnership = await checkNodesOwnership(client).finally(() => setCheckedOwnership(true)); + setOwnsMixnode(nodeOwnership.ownsMixnode) + setOwnsGateway(nodeOwnership.ownsGateway) + if (nodeOwnership.ownsGateway) { + setNodeType(NodeType.Gateway) + } + } + } + checkOwnership() + }, [client]) + + const unbondNode = async (event) => { + setUnbondingStarted(true) + event.preventDefault(); + console.log(`UNBOND button pressed`); + + if (nodeType == NodeType.Mixnode) { + client.unbondMixnode() + .then(value => console.log("unbonded mixnode!", value)) + .catch(err => setUnbondingError(err)) + .finally(() => setUnbondingFinished(true)) + } else { + client.unbondGateway() + .then(value => console.log("unbonded gateway!", value)) + .catch(err => setUnbondingError(err)) + .finally(() => setUnbondingFinished(true)) + } + } + + const getUnbondContent = () => { + // we're not signed in + if (client === null) { + return () + } + + // we haven't checked whether we actually own a node to unbond + if (!checkedOwnership) { + return () + } + + // somehow this address has both a mixnode and a gateway bonded - this is super undesirable + // if that happens it means the user must have sent transactions outside the wallet before the contract update + // so they can send transactions outside the wallet to fix themselves up + if (ownsMixnode && ownsGateway) { + return ( + + + + You seem to have both a mixnode and a gateway bonded - how the hell did you manage to do that? + + + + ) + } + + // we don't own anything + if (!ownsMixnode && !ownsGateway) { + return ( + + + + You do not currently have a mixnode or a gateway bonded. + + + + ) + } + + // we haven't clicked unbond button yet + if (!unbondingStarted) { + return ( + + ) + } + + // We started unbonding + return ( + + ) + } + + let headerText = "Node" + if (ownsGateway || ownsGateway) { + headerText = nodeType + } + + return ( + +
+ + + + Unbond a {headerText} + + {getUnbondContent()} + +
+
+ ); +} + +export default UnbondNode \ No newline at end of file diff --git a/wallet-web/components/unbond/UnbondNotice.tsx b/wallet-web/components/unbond/UnbondNotice.tsx new file mode 100644 index 0000000000..8e94d6f157 --- /dev/null +++ b/wallet-web/components/unbond/UnbondNotice.tsx @@ -0,0 +1,36 @@ +import {Button, Grid} from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import React from "react"; +import { theme } from "../../lib/theme"; +import { makeBasicStyle } from "../../common/helpers"; + +type unbondNoticeProps = { + onClick: (event: any) => void +} + +export default function UnbondNotice(props: unbondNoticeProps) { + const classes = makeBasicStyle(theme); + + return ( + + + + + You can only have 1 mixnode or gateway per account. Unbond it by pressing the button below. + + + +
+ +
+
+ ) +} \ No newline at end of file diff --git a/wallet-web/components/undelegate/NodeUndelegation.tsx b/wallet-web/components/undelegate/NodeUndelegation.tsx new file mode 100644 index 0000000000..3fe1f64493 --- /dev/null +++ b/wallet-web/components/undelegate/NodeUndelegation.tsx @@ -0,0 +1,101 @@ +import React, { useContext, useEffect } from "react"; +import { Paper } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { useRouter } from "next/router"; +import { ValidatorClientContext } from "../../contexts/ValidatorClient"; +import { NodeType } from "../../common/node"; +import NoClientError from "../NoClientError"; +import Confirmation from "../Confirmation"; +import { theme } from "../../lib/theme"; +import { makeBasicStyle } from "../../common/helpers"; +import NodeTypeChooser from "../NodeTypeChooser"; +import NodeIdentityForm from "../NodeIdentityForm"; +import ExecFeeNotice from "../ExecFeeNotice"; + + +const UndelegateFromNode = () => { + const classes = makeBasicStyle(theme); + const router = useRouter() + const { client } = useContext(ValidatorClientContext) + + const [undelegationStarted, setUndelegationStarted] = React.useState(false) + const [undelegationFinished, setUndelegationFinished] = React.useState(false) + const [undelegationError, setUndelegationError] = React.useState(null) + + const [nodeType, setNodeType] = React.useState(NodeType.Mixnode) + + useEffect(() => { + const checkClient = async () => { + if (client === null) { + await router.push("/") + } + } + checkClient() + }, [client]) + + + const undelegateFromNode = async (event) => { + event.preventDefault(); + + console.log(`UNDELEGATE button pressed`); + + let address = event.target.identity.value + setUndelegationStarted(true) + + if (nodeType == NodeType.Mixnode) { + client.removeMixnodeDelegation(address).then((value => { + console.log("undelegated from mixnode!", value) + })).catch(setUndelegationError).finally(() => setUndelegationFinished(true)) + } else { + client.removeGatewayDelegation(address).then((value => { + console.log("undelegated from gateway!", value) + })).catch(setUndelegationError).finally(() => setUndelegationFinished(true)) + } + } + + + const getUndelegationContent = () => { + // we're not signed in + if (client === null) { + return () + } + + // we haven't clicked undelegate button yet + if (!undelegationStarted) { + return ( + + + + + ) + } + + // We started delegation + return ( + + ) + } + + return ( + +
+ + + + Undelegate stake from {nodeType} + + {getUndelegationContent()} + +
+
+ ); +} + + +export default UndelegateFromNode; diff --git a/wallet-web/contexts/ValidatorClient.tsx b/wallet-web/contexts/ValidatorClient.tsx new file mode 100644 index 0000000000..13d3eab369 --- /dev/null +++ b/wallet-web/contexts/ValidatorClient.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import ValidatorClient from "@nymproject/nym-validator-client"; + +type ClientContext = { + client: ValidatorClient, + setClient: (client: ValidatorClient) => void +} + +const defaultValue: ClientContext = { + client: null, + setClient: () => { }, +} + +export const ValidatorClientContext = React.createContext(defaultValue); + diff --git a/wallet-web/lib/theme.ts b/wallet-web/lib/theme.ts new file mode 100644 index 0000000000..5dfacf9e00 --- /dev/null +++ b/wallet-web/lib/theme.ts @@ -0,0 +1,19 @@ +import { createMuiTheme } from '@material-ui/core/styles'; +import red from '@material-ui/core/colors/red'; + +export const theme = createMuiTheme({ + palette: { + primary: { + main: '#556cd6', + }, + secondary: { + main: '#19857b', + }, + error: { + main: red.A400, + }, + background: { + default: '#fff', + }, + }, +}); diff --git a/wallet-web/next-env.d.ts b/wallet-web/next-env.d.ts new file mode 100644 index 0000000000..7b7aa2c772 --- /dev/null +++ b/wallet-web/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/wallet-web/next.config.js b/wallet-web/next.config.js new file mode 100644 index 0000000000..468e2f7402 --- /dev/null +++ b/wallet-web/next.config.js @@ -0,0 +1,7 @@ +// according to https://nextjs.org/docs/messages/webpack5 this should +// improve speed of subsequent `next build` calls due to better caching +module.exports = { + future: { + webpack5: true, + }, +} \ No newline at end of file diff --git a/wallet-web/package.json b/wallet-web/package.json new file mode 100644 index 0000000000..77a2f6cbf6 --- /dev/null +++ b/wallet-web/package.json @@ -0,0 +1,29 @@ +{ + "name": "nym-wallet-web", + "version": "0.1.0", + "private": true, + "description": "Bond, unbond, and delegate stake on Nym mixnodes, transfer Nym coins, and run Nym privacy clients.", + "author": "Dave Hrycyszyn ", + "scripts": { + "dev": "next dev", + "build": "next build && next export", + "start": "next start" + }, + "dependencies": { + "@material-ui/core": "^4.11.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.57", + "@nymproject/nym-validator-client": "0.16.0", + "@types/react-dom": "^17.0.3", + "bs58": "^4.0.1", + "next": "10.1.3", + "react": "17.0.2", + "react-dom": "17.0.2", + "semver": "^7.3.5" + }, + "devDependencies": { + "@types/node": "^14.6.4", + "@types/react": "^16.9.49", + "typescript": "^4.2.2" + } +} \ No newline at end of file diff --git a/wallet-web/pages/_app.tsx b/wallet-web/pages/_app.tsx new file mode 100644 index 0000000000..c7064abf06 --- /dev/null +++ b/wallet-web/pages/_app.tsx @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import Head from 'next/head'; +import { ThemeProvider } from '@material-ui/core/styles'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import { theme } from '../lib/theme'; +import type { AppProps } from 'next/app'; +import { ValidatorClientContext } from "../contexts/ValidatorClient"; + +// TODO: should it perhaps be pulled from some config or also user provided? +export const BONDING_CONTRACT_ADDRESS: string = "punk10pyejy66429refv3g35g2t7am0was7yalwrzen"; +export const VALIDATOR_URLS: string[] = [ + "https://testnet-milhon-validator1.nymtech.net", + "https://testnet-milhon-validator2.nymtech.net", +]; +export const ADDRESS_LENGTH: number = 43; +export const ADMIN_ADDRESS: string = "punk1h3w4nj7kny5dfyjw2le4vm74z03v9vd4dstpu0" +export const DENOM: string = "punk"; // used everywhere else +export const KEY_LENGTH: number = 32; +export const UDENOM: string = "upunk"; // required for client and coin construction + + +export default function Application(props: AppProps) { + const { Component, pageProps } = props; + + const [client, setClient] = useState(null) + + React.useEffect(() => { + const jssStyles = document.querySelector('#jss-server-side'); + if (jssStyles) { + jssStyles.parentElement.removeChild(jssStyles); + } + }, []); + + return ( + + + + + Nym + + + + + + + + + ); +} diff --git a/wallet-web/pages/_document.tsx b/wallet-web/pages/_document.tsx new file mode 100644 index 0000000000..524c9ed3a4 --- /dev/null +++ b/wallet-web/pages/_document.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import Document, { Html, Head, Main, NextScript } from 'next/document'; +import { ServerStyleSheets } from '@material-ui/styles'; +import { theme } from '../lib/theme'; + +export default class MyDocument extends Document { + render() { + return ( + + + + + + +
+ + + + ); + } +} + +MyDocument.getInitialProps = async ctx => { + const sheets = new ServerStyleSheets(); + const originalRenderPage = ctx.renderPage; + + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => sheets.collect(), + }); + + const initialProps = await Document.getInitialProps(ctx); + + return { + ...initialProps, + styles: [ + ...React.Children.toArray(initialProps.styles), + sheets.getStyleElement(), + ], + }; +}; diff --git a/wallet-web/pages/admin.tsx b/wallet-web/pages/admin.tsx new file mode 100644 index 0000000000..7564c43f62 --- /dev/null +++ b/wallet-web/pages/admin.tsx @@ -0,0 +1,146 @@ +import { useRouter } from "next/router"; +import React, { useContext, useEffect, useState } from "react"; +import { ValidatorClientContext } from "../contexts/ValidatorClient"; +import MainNav from "../components/MainNav"; +import Paper from "@material-ui/core/Paper"; +import Typography from "@material-ui/core/Typography"; +import NoClientError from "../components/NoClientError"; +import { makeStyles } from "@material-ui/core/styles"; +import { ADMIN_ADDRESS } from "./_app"; +import { LinearProgress } from "@material-ui/core"; +import AdminForm from "../components/admin/AdminForm"; +import { StateParams } from "@nymproject/nym-validator-client"; +import { Alert, AlertTitle } from "@material-ui/lab"; +import { printableBalanceToNative } from "@nymproject/nym-validator-client/dist/currency"; + +const useStyles = makeStyles((theme) => ({ + appBar: { + position: 'relative', + }, + layout: { + width: 'auto', + marginLeft: theme.spacing(2), + marginRight: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: { + width: 600, + marginLeft: 'auto', + marginRight: 'auto', + }, + }, + paper: { + marginTop: theme.spacing(3), + marginBottom: theme.spacing(3), + padding: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: { + marginTop: theme.spacing(6), + marginBottom: theme.spacing(6), + padding: theme.spacing(3), + }, + }, + buttons: { + display: 'flex', + justifyContent: 'flex-end', + }, + button: { + marginTop: theme.spacing(3), + marginLeft: theme.spacing(1), + }, +})); + +export default function Admin() { + const classes = useStyles(); + const router = useRouter() + + const {client} = useContext(ValidatorClientContext) + + const [currentStateParams, setCurrentStateParams] = useState(null) + const [updateError, setUpdateError] = useState(null) + const [updatingState, setUpdatingState] = useState(false) + + // naive way of preventing non-tech-savvy people from accessing this page by manually changing + // page to /admin and thinking they're "l33t h4x0rs". + // However, even if somebody does access this page by telling the page their address is + // the same as that of the current admin, + // nothing is going to happen as they will be unable to sign a transaction to the contract without having + // access to the account itself + useEffect(() => { + (async () => { + if (client === null || client.address !== ADMIN_ADDRESS) { + await router.push("404") + } else { + let params = await client.getStateParams() + setCurrentStateParams(params) + } + })() + }, [client]) + + const updateStateParams = async (event) => { + event.preventDefault() + let newState: StateParams = { + // need to convert those to native coin (i.e. hal -> uhal) + minimum_mixnode_bond: printableBalanceToNative(event.target.mix_bond.value), + minimum_gateway_bond: printableBalanceToNative(event.target.gateway_bond.value), + mixnode_bond_reward_rate: event.target.mix_reward.value, + gateway_bond_reward_rate: event.target.gateway_reward.value, + epoch_length: parseInt(event.target.epoch_length.value), + mixnode_active_set_size: parseInt(event.target.active_set.value), + }; + setUpdatingState(true) + await client.updateStateParams(newState) + .then((_) => setCurrentStateParams(newState)) + .catch((err) => setUpdateError(err)) + .finally(() => setUpdatingState(false)) + } + + const getAdminContent = () => { + // we're not signed in (I guess it should get displayed super briefly before getting forwarded + // to a 404) + if (client === null) { + return () + } + + // we encountered error while trying to update state + if (updateError !== null) { + return ( + + {updateError.name} + Failed to update contract state - {updateError.message} + + ) + } + + // We're getting current state params + if (currentStateParams === null) { + return () + } + + if (updatingState) { + return ( + +
+ + Updating contract state... + + +
+ ) + } + + return () + } + + return ( + + +
+ + + Contract control + + + {getAdminContent()} + +
+
+ ) +} \ No newline at end of file diff --git a/wallet-web/pages/balanceCheck.tsx b/wallet-web/pages/balanceCheck.tsx new file mode 100644 index 0000000000..5e16d5cd4f --- /dev/null +++ b/wallet-web/pages/balanceCheck.tsx @@ -0,0 +1,128 @@ +import React, { useContext, useEffect } from "react"; +import MainNav from "../components/MainNav"; +import Paper from "@material-ui/core/Paper"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import { makeStyles } from "@material-ui/core/styles"; +import Confirmation from "../components/Confirmation"; +import RefreshIcon from "@material-ui/icons/Refresh" +import { ValidatorClientContext } from "../contexts/ValidatorClient"; +import NoClientError from "../components/NoClientError"; +import { useRouter } from "next/router"; +import { printableCoin } from "@nymproject/nym-validator-client"; + +const useStyles = makeStyles((theme) => ({ + appBar: { + position: 'relative', + }, + layout: { + width: 'auto', + marginLeft: theme.spacing(2), + marginRight: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: { + width: 600, + marginLeft: 'auto', + marginRight: 'auto', + }, + }, + paper: { + marginTop: theme.spacing(3), + marginBottom: theme.spacing(3), + padding: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: { + marginTop: theme.spacing(6), + marginBottom: theme.spacing(6), + padding: theme.spacing(3), + }, + }, + buttons: { + display: 'flex', + justifyContent: 'flex-end', + }, + button: { + marginTop: theme.spacing(3), + marginLeft: theme.spacing(1), + }, +})); + +export default function CheckBalance() { + const classes = useStyles(); + const router = useRouter() + + const { client } = useContext(ValidatorClientContext) + + useEffect(() => { + const updateBalance = async () => { + if (client === null) { + await router.push("/") + } else { + await getBalance() + } + } + updateBalance() + }, [client]) + + const [balanceCheckStarted, setBalanceCheckStarted] = React.useState(false) + const [balanceCheckFinished, setBalanceCheckFinished] = React.useState(false) + const [balanceCheckError, setBalanceCheckError] = React.useState(null) + const [accountBalance, setAccountBalance] = React.useState("") + + const getBalance = async () => { + setBalanceCheckFinished(false) + setBalanceCheckStarted(true) + + console.log(`using the context client, our address is ${client.address}`); + + client.getBalance(client.address).then(value => { + setAccountBalance(printableCoin(value)) + setBalanceCheckFinished(true) + }).catch(err => { + setBalanceCheckError(err) + setBalanceCheckFinished(true) + }) + } + + const balanceMessage = `Current account balance is ${accountBalance}` + + return ( + + +
+ + + Check Balance + + + {client === null ? + ( + + ) : ( + + +
+ +
+
+ ) + } +
+
+
+ ) +} \ No newline at end of file diff --git a/wallet-web/pages/bond.tsx b/wallet-web/pages/bond.tsx new file mode 100644 index 0000000000..ecb98778e8 --- /dev/null +++ b/wallet-web/pages/bond.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import MainNav from "../components/MainNav"; +import BondNode from "../components/bond/NodeBond"; + +const Bond = () => { + return ( + + + + + ); +} + +export default Bond \ No newline at end of file diff --git a/wallet-web/pages/checkDelegation.tsx b/wallet-web/pages/checkDelegation.tsx new file mode 100644 index 0000000000..f3606a135f --- /dev/null +++ b/wallet-web/pages/checkDelegation.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import MainNav from "../components/MainNav"; +import DelegationCheck from "../components/delegation-check/DelegationCheck"; + +const CheckDelegation = () => { + return ( + + + + + ); +} + +export default CheckDelegation \ No newline at end of file diff --git a/wallet-web/pages/createAccount.tsx b/wallet-web/pages/createAccount.tsx new file mode 100644 index 0000000000..548d91081e --- /dev/null +++ b/wallet-web/pages/createAccount.tsx @@ -0,0 +1,148 @@ +import React, { useState } from "react"; +import MainNav from "../components/MainNav"; +import Paper from "@material-ui/core/Paper"; +import Typography from "@material-ui/core/Typography"; +import { makeStyles } from "@material-ui/core/styles"; +import Button from "@material-ui/core/Button"; +import ValidatorClient from "@nymproject/nym-validator-client"; +import { LinearProgress } from "@material-ui/core"; +import { useRouter } from "next/router"; + +const useStyles = makeStyles((theme) => ({ + appBar: { + position: 'relative', + }, + layout: { + width: 'auto', + marginLeft: theme.spacing(2), + marginRight: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: { + width: 600, + marginLeft: 'auto', + marginRight: 'auto', + }, + }, + paper: { + marginTop: theme.spacing(3), + marginBottom: theme.spacing(3), + padding: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: { + marginTop: theme.spacing(6), + marginBottom: theme.spacing(6), + padding: theme.spacing(3), + }, + }, + buttons: { + display: 'flex', + justifyContent: 'center', + }, + button: { + marginTop: theme.spacing(3), + marginLeft: theme.spacing(1), + }, +})); + + +type AccountDetailsProps = { + mnemonic: String, + address: String +} + +function AccountDetails(props: AccountDetailsProps) { + if (props.mnemonic === "" || props.address === "") { + return + } + + return ( + // Yeah, I probably should have done it properly with CSS but inserting `
` was way quicker to achieve + // the same result + +
+ + + Mnemonic + + + {props.mnemonic} + +
+ + + Account Address + + + {props.address} + +
+ + + Save your mnemonic in a safe space as it's your only way to recover your account! + +
+ ) +} + +export default function CreateAccount() { + const classes = useStyles(); + const router = useRouter() + + const [mnemonic, setMnemonic] = useState(""); + const [address, setAddress] = useState("") + + const [loading, setLoading] = useState(false) + const [created, setCreated] = useState(false) + + const createAccount = () => { + let mnemonic = ValidatorClient.randomMnemonic(); + setMnemonic(mnemonic) + + ValidatorClient.mnemonicToAddress(mnemonic, "punk").then((address) => { + setAddress(address) + setCreated(true) + }) + } + + const handleBack = async (event) => { + setLoading(true) + event.preventDefault() + await router.push("/") + // no need to set loading to false as at this point the component is unmounted + } + + return ( + + +
+ + + Create new account + + + {loading && } +
+ {!created ? ( + + ) : ( + + ) + } +
+
+
+
+ ) +} diff --git a/wallet-web/pages/delegateStake.tsx b/wallet-web/pages/delegateStake.tsx new file mode 100644 index 0000000000..3eed5c30ca --- /dev/null +++ b/wallet-web/pages/delegateStake.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import MainNav from "../components/MainNav"; +import NodeDelegation from "../components/delegate/NodeDelegation"; + +const DelegateStake = () => { + return ( + + + + + ); +} + +export default DelegateStake \ No newline at end of file diff --git a/wallet-web/pages/index.tsx b/wallet-web/pages/index.tsx new file mode 100644 index 0000000000..21706af599 --- /dev/null +++ b/wallet-web/pages/index.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Head from 'next/head'; +import { Theme, makeStyles, createStyles } from '@material-ui/core/styles'; +import SignIn from '../components/SignIn'; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + root: { + textAlign: 'center', + paddingTop: theme.spacing(4), + }, + }) +); + +const Home = () => { + const classes = useStyles({}); + + return ( + + + Nym Wallet + +
+ +
+
+ ); +}; + +export default Home; diff --git a/wallet-web/pages/send.tsx b/wallet-web/pages/send.tsx new file mode 100644 index 0000000000..64cdb233d5 --- /dev/null +++ b/wallet-web/pages/send.tsx @@ -0,0 +1,258 @@ +import React, { useContext } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Paper from '@material-ui/core/Paper'; +import Stepper from '@material-ui/core/Stepper'; +import Step from '@material-ui/core/Step'; +import StepLabel from '@material-ui/core/StepLabel'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; +import { Review } from '../components/send-funds/Review'; +import SendNymForm from '../components/send-funds/SendNymForm'; +import { coin, Coin, printableCoin } from '@nymproject/nym-validator-client'; +import Confirmation from '../components/Confirmation'; +import MainNav from '../components/MainNav'; +import { ValidatorClientContext } from "../contexts/ValidatorClient"; +import NoClientError from "../components/NoClientError"; +import { UDENOM } from './_app'; +import { printableBalanceToNative } from "@nymproject/nym-validator-client/dist/currency"; + +const useStyles = makeStyles((theme) => ({ + appBar: { + position: 'relative', + }, + layout: { + width: 'auto', + marginLeft: theme.spacing(2), + marginRight: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: { + width: 600, + marginLeft: 'auto', + marginRight: 'auto', + }, + }, + paper: { + marginTop: theme.spacing(3), + marginBottom: theme.spacing(3), + padding: theme.spacing(2), + [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: { + marginTop: theme.spacing(6), + marginBottom: theme.spacing(6), + padding: theme.spacing(3), + }, + }, + stepper: { + padding: theme.spacing(3, 0, 5), + }, + buttons: { + display: 'flex', + justifyContent: 'flex-end', + }, + button: { + marginTop: theme.spacing(3), + marginLeft: theme.spacing(1), + }, +})); + +const steps = ['Enter addresses', 'Review & send', 'Await confirmation']; + +export interface SendFundsMsg { + sender: string, + recipient: string, + coin?: Coin, +} + +export default function SendFunds() { + const getStepContent = (step) => { + switch (step) { + case 0: + return ; + case 1: + return ; + case 2: + const successMessage = `Funds transfer was complete! - sent ${printableCoin(transaction.coin)} to ${transaction.recipient}` + return + default: + throw new Error('Unknown step'); + } + } + + + const classes = useStyles(); + const { client } = useContext(ValidatorClientContext) + + console.log("client in send", client) + + + // Here's the React state + const [activeStep, setActiveStep] = React.useState(0); + const send: SendFundsMsg = { sender: "", recipient: "", coin: null }; + const [transaction, setTransaction] = React.useState(send); + const [formFilled, setFormFilled] = React.useState(false) + + const [sendingStarted, setSendingStarted] = React.useState(false) + const [sendingFinished, setSendingFinished] = React.useState(false) + const [sendingError, setSendingError] = React.useState(null) + + + const setFormStatus = (nonEmpty: boolean) => { + setFormFilled(nonEmpty) + } + + const handleNext = (event) => { + event.preventDefault(); + if (activeStep == 0) { + console.log("activeStep is 0, handling form") + try { + handleForm(event); + setActiveStep(activeStep + 1); + } catch (e) { + // right now just don't do anything. + // this error can be thrown when a value with more than 6 fractionalDigits is entered + // ideally it should show an error to the user, but it'd involve some additional + // work to correctly wire it to the form and I'm not sure it's worth it at this current + // time + } + } else if (activeStep == 1) { + console.log("activeStep is 1, sending funds") + setActiveStep(activeStep + 1); + setSendingStarted(true) + console.log("starting funds transfer") + sendFunds(transaction).then(() => { + console.log("funds transfer is finished!") + setSendingStarted(false) + setSendingFinished(true) + }).catch(err => { + setSendingError(err) + setSendingStarted(false) + setSendingFinished(true) + }); + } else { + console.log("resetting the progress") + setSendingStarted(false) + setSendingFinished(false) + setSendingError(null) + setActiveStep(0) + } + }; + + const handleBack = () => { + setActiveStep(activeStep - 1); + }; + + const getCoinValue = (raw: string): number => { + let native = printableBalanceToNative(raw) + return parseInt(native) + } + + const handleForm = (event) => { + event.preventDefault(); + let coinValue = getCoinValue(event.target.amount.value) + + const send: SendFundsMsg = { + sender: client.address, + recipient: event.target.recipient.value, + coin: coin(coinValue, UDENOM) + }; + console.log("Setting transaction", send); + setTransaction(send); + } + + const sendFunds = async (transaction: SendFundsMsg) => { + console.log(`using the context client, our address is ${client.address}`); + await client.send(client.address, transaction.recipient, [transaction.coin]); + } + + const checkButtonDisabled = (): boolean => { + if (activeStep === 0) { + return !formFilled + // the form must be filled + } else if (activeStep === 1) { + // it should always be enabled + return false + } else if (activeStep === 2) { + // transfer must be completed + return sendingStarted + } + + return false + } + + const getStepperContent = () => { + return ( + + + {steps.map((label) => ( + + {label} + + ))} + + + {activeStep === steps.length ? ( + + + Payment complete. + + + You ({transaction.sender}) + + + have sent {printableCoin(transaction.coin)} + + + to {transaction.recipient}. + + + ) : ( + +
+ {getStepContent(activeStep)} +
+ {activeStep !== 0 && ( + + )} + +
+
+
+ )} +
+
+ ) + } + + return ( + + +
+ + + Send Nym + + + {client === null ? ( + + ) : ( + getStepperContent() + )} + +
+
+ ); +} diff --git a/wallet-web/pages/unbond.tsx b/wallet-web/pages/unbond.tsx new file mode 100644 index 0000000000..880d685919 --- /dev/null +++ b/wallet-web/pages/unbond.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import MainNav from "../components/MainNav"; +import UnbondNode from "../components/unbond/UnbondNode"; + +const Unbond = () => { + return ( + + + + + ); +} + +export default Unbond \ No newline at end of file diff --git a/wallet-web/pages/undelegateStake.tsx b/wallet-web/pages/undelegateStake.tsx new file mode 100644 index 0000000000..95b30291b6 --- /dev/null +++ b/wallet-web/pages/undelegateStake.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import MainNav from "../components/MainNav"; +import NodeUndelegation from "../components/undelegate/NodeUndelegation"; + +const UndelegateStake = () => { + return ( + + + + + ); +} + +export default UndelegateStake \ No newline at end of file diff --git a/wallet-web/public/favicon.ico b/wallet-web/public/favicon.ico new file mode 100644 index 0000000000..4965832f2c Binary files /dev/null and b/wallet-web/public/favicon.ico differ diff --git a/wallet-web/public/vercel.svg b/wallet-web/public/vercel.svg new file mode 100644 index 0000000000..fbf0e25a65 --- /dev/null +++ b/wallet-web/public/vercel.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/wallet-web/styles/Home.module.css b/wallet-web/styles/Home.module.css new file mode 100644 index 0000000000..42e7e60094 --- /dev/null +++ b/wallet-web/styles/Home.module.css @@ -0,0 +1,122 @@ +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.main { + padding: 5rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +.footer img { + margin-left: 0.5rem; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 3rem; +} + +.card { + margin: 1rem; + flex-basis: 45%; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h3 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/wallet-web/styles/globals.css b/wallet-web/styles/globals.css new file mode 100644 index 0000000000..e5e2dcc23b --- /dev/null +++ b/wallet-web/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/wallet-web/tsconfig.json b/wallet-web/tsconfig.json new file mode 100644 index 0000000000..fdfbcc3693 --- /dev/null +++ b/wallet-web/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/wallet-web/yarn.lock b/wallet-web/yarn.lock new file mode 100644 index 0000000000..bff5fef601 --- /dev/null +++ b/wallet-web/yarn.lock @@ -0,0 +1,2594 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/highlight@^7.10.4": + version "7.13.10" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/runtime@7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": + version "7.12.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/types@7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@confio/ics23@^0.6.3": + version "0.6.3" + resolved "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.3.tgz" + integrity sha512-SQDH9tTzXIbC1AVTrjL7BEXfsYwERXNOB7F995LhfJDrP44cC5sl3Prh+lkfKOjn1jkgxknVUyaGx3tMG88gjQ== + dependencies: + protobufjs "^6.8.8" + ripemd160 "^2.0.2" + sha.js "^2.4.11" + +"@cosmjs/amino@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.25.5.tgz#a22abac74057848834f1e3b0d2b90a0a328dd119" + integrity sha512-q9tU2b9hJ3S/KxYCLSyiZCfkaidbSPBr2sJ5HPLxz48y5O4k9sYM7bPa0zioeePaIBnby3AOgyjucVxlbzUlYg== + dependencies: + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + +"@cosmjs/cosmwasm-launchpad@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-launchpad/-/cosmwasm-launchpad-0.25.5.tgz#270dd139c7a52a1c51324e9c9e9aa730ddc0f1a4" + integrity sha512-9/Z8m9rfovtgchN1thcdVBEBXCrh5clVNgpVp1rpbkUSSGA7T5tCR8H1qX0+Yd3HLRh212O5EnCfzzXjNxR21A== + dependencies: + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/launchpad" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + pako "^2.0.2" + +"@cosmjs/cosmwasm-stargate@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.25.5.tgz#481ab455ed860c40490117f623dedc7a32ae2c55" + integrity sha512-lUwjXMnVO+8iZtqwKr4hEBgA9q03AqAhUBNNyyG8oeTpgASrQ1ZlLjjmBWgvEpw4JokRduDf7il+NNENjaeAhQ== + dependencies: + "@cosmjs/amino" "^0.25.5" + "@cosmjs/cosmwasm-launchpad" "^0.25.5" + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/proto-signing" "^0.25.5" + "@cosmjs/stargate" "^0.25.5" + "@cosmjs/tendermint-rpc" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + long "^4.0.0" + pako "^2.0.2" + protobufjs "~6.10.2" + +"@cosmjs/cosmwasm@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm/-/cosmwasm-0.25.5.tgz#8f207da4aba348c9e5a6a2470f1ff314a9dcf50b" + integrity sha512-PsK28ARcow5hEd+hKAdGsjtjz/g5UMtPpSWD7l1WxWhuASLmJVXFebBUPJAu3CDeFG3FrlCRP5J8tLvJOisuJQ== + dependencies: + "@cosmjs/cosmwasm-launchpad" "^0.25.5" + +"@cosmjs/crypto@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.25.5.tgz#4b8e4a8693f9f597b4de92df1b1057f61ec7a735" + integrity sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg== + dependencies: + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + bip39 "^3.0.2" + bn.js "^4.11.8" + elliptic "^6.5.3" + js-sha3 "^0.8.0" + libsodium-wrappers "^0.7.6" + ripemd160 "^2.0.2" + sha.js "^2.4.11" + +"@cosmjs/encoding@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.25.5.tgz#edc90084b112b57ca73ec82c1682ac9c4da3bb3a" + integrity sha512-QT7MaPBiMeCaMJ6VZZKeOqDQlAxMEzTFjBFhbkdyx5DVRc4dPOVO4HbTggmIN5/eizIv4/CNJSVTR//tO53J0A== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/json-rpc@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.25.5.tgz#34c7489fc6ae32a4acaabf658e057a55c431a193" + integrity sha512-WFDallAolxBqB8V/mYxU0riF/OBoc6Fc2DDsZhds5xOZxeN9sTX0qWhu1UiFyURw4Z9D+SjB9QngqSDBTMTdjw== + dependencies: + "@cosmjs/stream" "^0.25.5" + xstream "^11.14.0" + +"@cosmjs/launchpad@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.25.5.tgz#bfd7b5ce89145f26c35ebbce98e3f6ec0e06c520" + integrity sha512-7zsFWQHLAiOUBXV/QWvffI/5Ssma67lEO3V01DZ8CtfnWiO4bCSbnU2sslSAH11RkrPdNfRBM7WOBczMMigIzw== + dependencies: + "@cosmjs/amino" "^0.25.5" + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + axios "^0.21.1" + fast-deep-equal "^3.1.3" + +"@cosmjs/math@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.25.5.tgz#0f586610353c95b2055d1b2556a232622cd2d453" + integrity sha512-LWovT1uTHlr+VEce27/14Wrgc4INJYOYk1+ncyvbZertixNFH6OMnc9Xkk0DIV4RYmW+/fvB9kCXVnNtQGSuHg== + dependencies: + bn.js "^4.11.8" + +"@cosmjs/proto-signing@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz#93122ed1d57518a1c520917afde62e5aa9754033" + integrity sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug== + dependencies: + "@cosmjs/amino" "^0.25.5" + long "^4.0.0" + protobufjs "~6.10.2" + +"@cosmjs/socket@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.25.5.tgz#2b565afd310cdfaf3b106b901302ae93d849ec54" + integrity sha512-wcJVbD4xlF4+5hMum4tOmAy5ppX+E9qrB9Pvt3T7BK+6T5uobxiBQCLEiDwHP3n42RBj+xQWJrScPf5IEWmZKg== + dependencies: + "@cosmjs/stream" "^0.25.5" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/stargate@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.25.5.tgz#29d0ce8d50f5c3030bd8c127bee355460a88c609" + integrity sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ== + dependencies: + "@confio/ics23" "^0.6.3" + "@cosmjs/amino" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/proto-signing" "^0.25.5" + "@cosmjs/stream" "^0.25.5" + "@cosmjs/tendermint-rpc" "^0.25.5" + "@cosmjs/utils" "^0.25.5" + long "^4.0.0" + protobufjs "~6.10.2" + +"@cosmjs/stream@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.25.5.tgz#5c538fc11e9d3d3ef16849164730dafee180e22e" + integrity sha512-a+0sDNKZTxw9p4j5tl7SI0siMTii7AQot1+5vkH5BkQoAv3C3D8jagPouUz3RUFuh13qftPxPLiHzDFLNSjTnQ== + dependencies: + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz#5467391f430f648d46d9f39aa4324515affb8578" + integrity sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA== + dependencies: + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/encoding" "^0.25.5" + "@cosmjs/json-rpc" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/socket" "^0.25.5" + "@cosmjs/stream" "^0.25.5" + axios "^0.21.1" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/utils@^0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.5.tgz#6dc9d8de81acb9d49b6d1420f61ea2390f5d5f07" + integrity sha512-U4YdgJadFgXWblthgyXqP28Yw5rsw2IX/cOES0pa6fiB81hoYl2LXqXiuKp2yVPoAgk8JpkFh3i5KchcD9muJg== + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@hapi/accept@5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz" + integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x": + version "9.1.1" + resolved "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.1.tgz" + integrity sha512-VNR8eDbBrOxBgbkddRYIe7+8DZ+vSbV6qlmaN2x7eWjsUjy2VmQgChkOKcVZIeupEZYj+I0dqNg430OhwzagjA== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.1.1" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz" + integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== + +"@material-ui/core@^4.11.3": + version "4.11.3" + resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz" + integrity sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.3" + "@material-ui/system" "^4.11.3" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.2": + version "4.11.2" + resolved "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/lab@^4.0.0-alpha.57": + version "4.0.0-alpha.57" + resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz" + integrity sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.3": + version "4.11.3" + resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.3.tgz" + integrity sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.11.3": + version "4.11.3" + resolved "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz" + integrity sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@next/env@10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-10.1.3.tgz#29e5d62919b4a7b1859f8d36169848dc3f5ddebe" + integrity sha512-q7z7NvmRs66lCQmVJtKjDxVtMTjSwP6ExVzaH46pbTH60MHgzEJ9H4jXrFLTihPmCIvpAv6Ai04jbS8dcg1ZMQ== + +"@next/polyfill-module@10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.1.3.tgz#beafe89bc4235d436fa0ed02c9d2a5d311fb0238" + integrity sha512-1DtUVcuoBJAn5IrxIZQjUG1KTPkiXMYloykPSkRxawimgvG9dRj2kscU+4KGNSFxHoxW9c68VRCb+7MDz5aGGw== + +"@next/react-dev-overlay@10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.1.3.tgz#ee1c6033b29be9b383e061bd9705021d131ea445" + integrity sha512-vIgUah3bR9+MKzwU1Ni5ONfYM0VdI42i7jZ+Ei1c0wjwkG9anVnDqhSQ3mVg62GP2nt7ExaaFyf9THbsw5KYXg== + dependencies: + "@babel/code-frame" "7.12.11" + anser "1.4.9" + chalk "4.0.0" + classnames "2.2.6" + css.escape "1.5.1" + data-uri-to-buffer "3.0.1" + platform "1.3.6" + shell-quote "1.7.2" + source-map "0.8.0-beta.0" + stacktrace-parser "0.1.10" + strip-ansi "6.0.0" + +"@next/react-refresh-utils@10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.1.3.tgz#65b3e1b9846c02452787fde1d54ad9c54b506dbd" + integrity sha512-P4GJZuLKfD/o42JvGZ/xP4Hxg68vd3NeZxOLqIuQKFjjaYgC2IrO+lE5PTwGmRkytjfprJC+9j7Jss/xQAS6QA== + +"@nymproject/nym-validator-client@0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@nymproject/nym-validator-client/-/nym-validator-client-0.16.0.tgz#983c4fcc1e175e14225e5ffe241be8f9fc2c8c9c" + integrity sha512-tczc9qx68D3CJsw+BZ3N6ReCq/smgpgL58iQQ0yo5MD2ZoGIu6J8Zhg2vau/IR9uRyGtg4ipNSe0Wtxi++pnJQ== + dependencies: + "@cosmjs/cosmwasm" "^0.25.5" + "@cosmjs/cosmwasm-stargate" "^0.25.5" + "@cosmjs/crypto" "^0.25.5" + "@cosmjs/launchpad" "^0.25.5" + "@cosmjs/math" "^0.25.5" + "@cosmjs/proto-signing" "^0.25.5" + axios "^0.19.2" + +"@opentelemetry/api@0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-0.14.0.tgz" + integrity sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== + dependencies: + "@opentelemetry/context-base" "^0.14.0" + +"@opentelemetry/context-base@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.14.0.tgz" + integrity sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/node@*": + version "14.14.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" + integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + +"@types/node@^13.7.0": + version "13.13.47" + resolved "https://registry.npmjs.org/@types/node/-/node-13.13.47.tgz" + integrity sha512-R6851wTjN1YJza8ZIeX6puNBSi/ZULHVh4WVleA7q256l+cP2EtXnKbO455fTs2ytQk3dL9qkU+Wh8l/uROdKg== + +"@types/node@^14.6.4": + version "14.14.34" + resolved "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz" + integrity sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/react-dom@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.3.tgz#7fdf37b8af9d6d40127137865bb3fff8871d7ee1" + integrity sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.2.0": + version "4.4.1" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz" + integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.49": + version "16.14.5" + resolved "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz" + integrity sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.1" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz" + integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + +anser@1.4.9: + version "1.4.9" + resolved "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +available-typed-arrays@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" + integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== + dependencies: + array-filter "^1.0.0" + +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + +babel-plugin-syntax-jsx@6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +base-x@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.0.2, base64-js@^1.3.0: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bip39@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz" + integrity sha512-P0dKrz4g0V0BjXfx7d9QNkJ/Txcz/k+hM9TnjqjUaXtuOfAvxXSw2rJw8DX0e3ZPwnK/IgDxoRqf0bvoVCqbMg== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@0.2.0, browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.16.1: + version "4.16.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz" + integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA== + dependencies: + caniuse-lite "^1.0.30001173" + colorette "^1.2.1" + electron-to-chromium "^1.3.634" + escalade "^3.1.1" + node-releases "^1.1.69" + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caniuse-lite@^1.0.30001173, caniuse-lite@^1.0.30001179: + version "1.0.30001199" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001199.tgz" + integrity sha512-ifbK2eChUCFUwGhlEzIoVwzFt1+iriSjyKKFYNfv6hN34483wyWpLLavYQXhnR036LhkdUYaSDpHg1El++VgHQ== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@1.0.0, constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css.escape@1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +cssnano-preset-simple@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz" + integrity sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ== + dependencies: + caniuse-lite "^1.0.30001179" + postcss "^7.0.32" + +cssnano-simple@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.2.tgz" + integrity sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g== + dependencies: + cssnano-preset-simple "1.2.2" + postcss "^7.0.32" + +csstype@^2.5.2: + version "2.6.16" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.16.tgz" + integrity sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q== + +csstype@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz" + integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== + +data-uri-to-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + +debug@2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dom-helpers@^5.0.1: + version "5.2.0" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +domain-browser@4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +electron-to-chromium@^1.3.634: + version "1.3.687" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.687.tgz" + integrity sha512-IpzksdQNl3wdgkzf7dnA7/v10w0Utf1dF2L+B4+gKrloBrxCut+au+kky3PYvle3RMdSxZP+UiCZtLbcYRxSNQ== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encoding@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-orientation@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + dependencies: + stream-parser "^0.3.1" + +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + +graceful-fs@^4.1.2: + version "4.2.6" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-browserify@1.0.0, https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +indefinite-observable@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz" + integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== + dependencies: + symbol-observable "1.2.0" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-generator-function@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" + integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typed-array@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" + integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.2" + es-abstract "^1.18.0-next.2" + foreach "^2.0.5" + has-symbols "^1.0.1" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jest-worker@27.0.0-next.5: + version "27.0.0-next.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jss-plugin-camel-case@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.1.tgz" + integrity sha512-9+oymA7wPtswm+zxVti1qiowC5q7bRdCJNORtns2JUj/QHp2QPXYwSNRD8+D2Cy3/CEMtdJzlNnt5aXmpS6NAg== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.5.1" + +jss-plugin-default-unit@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.1.tgz" + integrity sha512-D48hJBc9Tj3PusvlillHW8Fz0y/QqA7MNmTYDQaSB/7mTrCZjt7AVRROExoOHEtd2qIYKOYJW3Jc2agnvsXRlQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-global@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.1.tgz" + integrity sha512-jX4XpNgoaB8yPWw/gA1aPXJEoX0LNpvsROPvxlnYe+SE0JOhuvF7mA6dCkgpXBxfTWKJsno7cDSCgzHTocRjCQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-nested@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.1.tgz" + integrity sha512-xXkWKOCljuwHNjSYcXrCxBnjd8eJp90KVFW1rlhvKKRXnEKVD6vdKXYezk2a89uKAHckSvBvBoDGsfZrldWqqQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.1.tgz" + integrity sha512-t+2vcevNmMg4U/jAuxlfjKt46D/jHzCPEjsjLRj/J56CvP7Iy03scsUP58Iw8mVnaV36xAUZH2CmAmAdo8994g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-rule-value-function@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.1.tgz" + integrity sha512-3gjrSxsy4ka/lGQsTDY8oYYtkt2esBvQiceGBB4PykXxHoGRz14tbCK31Zc6DHEnIeqsjMUGbq+wEly5UViStQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.1.tgz" + integrity sha512-cLkH6RaPZWHa1TqSfd2vszNNgxT1W0omlSjAd6hCFHp3KIocSrW21gaHjlMU26JpTHwkc+tJTCQOmE/O1A4FKQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.5.1" + +jss@10.5.1, jss@^10.5.1: + version "10.5.1" + resolved "https://registry.npmjs.org/jss/-/jss-10.5.1.tgz" + integrity sha512-hbbO3+FOTqVdd7ZUoTiwpHzKXIo5vGpMNbuXH1a0wubRSWLWSBvwvaq4CiHH/U42CmjOnp6lVNNs/l+Z7ZdDmg== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + indefinite-observable "^2.0.1" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +libsodium-wrappers@^0.7.6: + version "0.7.9" + resolved "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + +line-column@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz" + integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= + dependencies: + isarray "^1.0.0" + isobject "^2.0.0" + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.13: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimist@^1.2.0: + version "1.2.5" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nanoid@^3.1.16: + version "3.1.21" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.21.tgz" + integrity sha512-A6oZraK4DJkAOICstsGH98dvycPr/4GGDH7ZWKmMdd3vGcOurZ6JmWFUt0DA5bzrrn2FrUjmv6mFNWvv8jpppA== + +native-url@0.3.4: + version "0.3.4" + resolved "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz" + integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + dependencies: + querystring "^0.2.0" + +next@10.1.3: + version "10.1.3" + resolved "https://registry.yarnpkg.com/next/-/next-10.1.3.tgz#e26e8371343a42bc2ba9be5cb253a7d324d03673" + integrity sha512-8Jf38F+s0YcXXkJGF5iUxOqSmbHrey0fX5Epc43L0uwDKmN2jK9vhc2ihCwXC1pmu8d2m/8wfTiXRJKGti55yw== + dependencies: + "@babel/runtime" "7.12.5" + "@hapi/accept" "5.0.1" + "@next/env" "10.1.3" + "@next/polyfill-module" "10.1.3" + "@next/react-dev-overlay" "10.1.3" + "@next/react-refresh-utils" "10.1.3" + "@opentelemetry/api" "0.14.0" + assert "2.0.0" + ast-types "0.13.2" + browserify-zlib "0.2.0" + browserslist "4.16.1" + buffer "5.6.0" + caniuse-lite "^1.0.30001179" + chalk "2.4.2" + chokidar "3.5.1" + constants-browserify "1.0.0" + crypto-browserify "3.12.0" + cssnano-simple "1.2.2" + domain-browser "4.19.0" + encoding "0.1.13" + etag "1.8.1" + find-cache-dir "3.3.1" + get-orientation "1.1.2" + https-browserify "1.0.0" + jest-worker "27.0.0-next.5" + native-url "0.3.4" + node-fetch "2.6.1" + node-html-parser "1.4.9" + node-libs-browser "^2.2.1" + os-browserify "0.3.0" + p-limit "3.1.0" + path-browserify "1.0.1" + pnp-webpack-plugin "1.6.4" + postcss "8.1.7" + process "0.11.10" + prop-types "15.7.2" + querystring-es3 "0.2.1" + raw-body "2.4.1" + react-is "16.13.1" + react-refresh "0.8.3" + stream-browserify "3.0.0" + stream-http "3.1.1" + string_decoder "1.3.0" + styled-jsx "3.3.2" + timers-browserify "2.0.12" + tty-browserify "0.0.1" + use-subscription "1.5.1" + util "0.12.3" + vm-browserify "1.1.2" + watchpack "2.1.1" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-html-parser@1.4.9: + version "1.4.9" + resolved "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.69: + version "1.1.71" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +os-browserify@0.3.0, os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-limit@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz" + integrity sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +pbkdf2@^3.0.3, pbkdf2@^3.0.9: + version "3.1.1" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +platform@1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +postcss@8.1.7: + version "8.1.7" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.1.7.tgz" + integrity sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ== + dependencies: + colorette "^1.2.1" + line-column "^1.0.2" + nanoid "^3.1.16" + source-map "^0.6.1" + +postcss@^7.0.32: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@0.11.10, process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +prop-types@15.7.2, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +protobufjs@^6.8.8, protobufjs@~6.10.2: + version "6.10.2" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz" + integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" + long "^4.0.0" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring-es3@0.2.1, querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-is@16.13.1, react-is@^16.7.0, "react-is@^16.8.0 || ^17.0.0", react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-refresh@0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +source-map@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + dependencies: + debug "2" + +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +styled-jsx@3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.3.2.tgz" + integrity sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== + dependencies: + "@babel/types" "7.8.3" + babel-plugin-syntax-jsx "6.18.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +symbol-observable@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-observable@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + +timers-browserify@2.0.12, timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typescript@^4.2.2: + version "4.2.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz" + integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-subscription@1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@0.12.3, util@^0.12.0: + version "0.12.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" + integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +vm-browserify@1.1.2, vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" + integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.0" + es-abstract "^1.18.0-next.1" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" + +ws@^7: + version "7.5.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" + integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== + +xstream@^11.14.0: + version "11.14.0" + resolved "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz" + integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== + dependencies: + globalthis "^1.0.1" + symbol-observable "^2.0.3" + +xtend@^4.0.0, xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==