diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index 14ef043..0000000
--- a/.babelrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "presets": ["next/babel"],
-  "plugins": [
-    [
-      "styled-components",
-      {
-        "ssr": true,
-        "displayName": true,
-        "preprocess": false
-      }
-    ]
-  ]
-}
diff --git a/.dvmrc b/.dvmrc
new file mode 100644
index 0000000..57807d6
--- /dev/null
+++ b/.dvmrc
@@ -0,0 +1 @@
+1.22.0
diff --git a/.env.sample b/.env.sample
index efb69c7..8526897 100644
--- a/.env.sample
+++ b/.env.sample
@@ -1,4 +1 @@
-NODE_PATH=/
-AWS_ACCESS_KEY_ID=accesskey
-AWS_SECRET_ACCESS_KEY=sshhh
-NEXT_PUBLIC_USERBASE_APP_ID=get-from-userbase.com
+USERBASE_APP_ID=get-from-userbase.com
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 35b8cf5..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1,10 +0,0 @@
-**/public/precache.*.*.js
-**/public/sw.js
-**/public/workbox-*.js
-**/public/worker-*.js
-**/public/fallback-*.js
-**/public/precache.*.*.js.map
-**/public/sw.js.map
-**/public/workbox-*.js.map
-**/public/worker-*.js.map
-**/public/fallback-*.js
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index b4a7851..0000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,99 +0,0 @@
-const eslint = {
-  parser: '@typescript-eslint/parser',
-  extends: [
-    'airbnb',
-    'eslint:recommended',
-    'plugin:@typescript-eslint/recommended',
-    'prettier',
-  ],
-  rules: {
-    semi: 2,
-    'max-len': 'off',
-    'react/react-in-jsx-scope': 'off',
-    'react/jsx-no-bind': 'off',
-    'react/jsx-one-expression-per-line': 'off',
-    'react/destructuring-assignment': 'off',
-    'react/forbid-prop-types': 'off',
-    'react/prefer-stateless-function': 'off',
-    'react/no-danger': 'off',
-    'no-console': 'off',
-    'no-param-reassign': 'off',
-    'import/prefer-default-export': 'off',
-    'import/no-extraneous-dependencies': 'off',
-    'implicit-arrow-linebreak': 'off',
-    'object-curly-newline': 'off',
-    'react/jsx-closing-tag-location': 'off',
-    'no-restricted-syntax': 'off',
-    'operator-linebreak': 'off',
-    'arrow-body-style': 'off',
-    'jsx-a11y/anchor-is-valid': 'off',
-    'react/jsx-filename-extension': [
-      1,
-      { extensions: ['.js', '.jsx', '.ts', '.tsx'] },
-    ],
-    'no-underscore-dangle': 'off',
-    '@typescript-eslint/no-empty-function': 'off',
-    '@typescript-eslint/no-var-requires': 'off',
-    '@typescript-eslint/explicit-function-return-type': 'off',
-    'react/jsx-props-no-spreading': 'off',
-    'jsx-a11y/html-has-lang': 'off',
-    'spaced-comment': 'off',
-    '@typescript-eslint/no-empty-interface': 'off',
-    'react/no-array-index-key': 'off',
-    'jsx-a11y/no-noninteractive-element-interactions': 'off',
-    'jsx-a11y/click-events-have-key-events': 'off',
-    '@typescript-eslint/no-explicit-any': 'off',
-    'import/first': 'off',
-    '@typescript-eslint/camelcase': 'off',
-    '@typescript-eslint/ban-ts-ignore': 'off',
-    'jsx-a11y/label-has-associated-control': 'off',
-    'no-await-in-loop': 'off',
-    'react/no-did-update-set-state': 'off',
-    'no-continue': 'off',
-    'react/no-unescaped-entities': 'off',
-    'no-use-before-define': 'off',
-    '@typescript-eslint/no-use-before-define': ['error'],
-    '@typescript-eslint/ban-ts-comment': 'off',
-    'react/require-default-props': 'off',
-    '@typescript-eslint/explicit-module-boundary-types': 'off',
-    'import/extensions': [
-      'error',
-      'ignorePackages',
-      {
-        js: 'never',
-        jsx: 'never',
-        ts: 'never',
-        tsx: 'never',
-      },
-    ],
-    'function-paren-newline': 'off',
-    'no-confusing-arrow': 'off',
-    'react/jsx-curly-newline': 'off',
-    'react/function-component-definition': 'off',
-    'react/jsx-no-useless-fragment': 'off',
-    'no-nested-ternary': 'off',
-  },
-  parserOptions: {
-    ecmaFeatures: {
-      jsx: true,
-    },
-    useJSXTextNode: true,
-    extraFileExtensions: ['.ts', '.tsx'],
-  },
-  settings: {
-    'import/resolver': {
-      node: {
-        paths: ['.'],
-        extensions: ['.js', '.jsx', '.ts', '.tsx'],
-      },
-    },
-  },
-  plugins: ['react', '@typescript-eslint'],
-  env: {
-    browser: true,
-    node: true,
-    jest: true,
-  },
-};
-
-module.exports = eslint;
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 4426b5f..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-name: Run Tests
-
-on: [push]
-
-jobs:
-  test:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v2
-      - uses: actions/setup-node@v1
-        with:
-          node-version: 12.x
-      - run: |
-          make install
-      - run: |
-          make test/ci
-        env:
-          CI: true
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..8ecea55
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,14 @@
+name: Run Tests
+
+on: [push]
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: denoland/setup-deno@v1
+        with:
+          deno-version: v1.22.0
+      - run: |
+          make test
diff --git a/.gitignore b/.gitignore
index 59ee055..4c49bd7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1 @@
-.DS_Store
-node_modules
-*.log
-*.zip
 .env
-.next
-.env.build
-.serverless
-.serverless_nextjs
-**/public/precache.*.*.js
-**/public/sw.js
-**/public/workbox-*.js
-**/public/worker-*.js
-**/public/fallback-*.js
-**/public/precache.*.*.js.map
-**/public/sw.js.map
-**/public/workbox-*.js.map
-**/public/worker-*.js.map
-**/public/fallback-*.js
-*.tsbuildinfo
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index cffe8cd..0000000
--- a/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-save-exact=true
diff --git a/.nvmrc b/.nvmrc
deleted file mode 100644
index f0b10f1..0000000
--- a/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-v16.13.1
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 17c3147..0000000
--- a/.prettierignore
+++ /dev/null
@@ -1,15 +0,0 @@
-node_modules
-.next
-package-lock.json
-.serverless
-.serverless_nextjs
-**/public/precache.*.*.js
-**/public/sw.js
-**/public/workbox-*.js
-**/public/worker-*.js
-**/public/fallback-*.js
-**/public/precache.*.*.js.map
-**/public/sw.js.map
-**/public/workbox-*.js.map
-**/public/worker-*.js.map
-**/public/fallback-*.js
diff --git a/.prettierrc.js b/.prettierrc.js
deleted file mode 100644
index 6fe40d5..0000000
--- a/.prettierrc.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
-  trailingComma: 'all',
-  tabWidth: 2,
-  singleQuote: true,
-  arrowParens: 'always',
-};
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e1533c2
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+  "deno.enable": true,
+  "deno.lint": true
+}
diff --git a/Makefile b/Makefile
index 0fbce29..d19c121 100644
--- a/Makefile
+++ b/Makefile
@@ -1,39 +1,13 @@
-.PHONY: install
-install:
-	-cp -n .env.sample .env
-	npm install --legacy-peer-deps
-
 .PHONY: start
 start:
-	npm run dev
+	deno run --watch --allow-net --allow-read --allow-env=PORT,USERBASE_APP_ID main.ts
+
+.PHONY: format
+format:
+	deno fmt
 
 .PHONY: test
 test:
-	make lint
-	npm run test
-
-.PHONY: test/update
-test/update:
-	make lint
-	npm run test -- -u
-
-.PHONY: test/pretty
-test/pretty:
-	npm run pretty/test
-
-.PHONY: test/ci
-test/ci:
-	make test/pretty
-	make test
-
-.PHONY: lint
-lint:
-	npm run lint
-
-.PHONY: pretty
-pretty:
-	npm run pretty
-
-.PHONY: deploy
-deploy:
-	serverless
+	deno fmt --check
+	deno lint
+	deno test --allow-net --allow-read --allow-env=PORT,USERBASE_APP_ID --check=all
diff --git a/README.md b/README.md
index 2d9d7ce..6234742 100644
--- a/README.md
+++ b/README.md
@@ -2,23 +2,39 @@
 
 [![](https://github.com/BrunoBernardino/budgetzen-web/workflows/Run%20Tests/badge.svg)](https://github.com/BrunoBernardino/budgetzen-web/actions?workflow=Run+Tests)
 
-This is the web app for the [Budget Zen app](https://budgetzen.net), built with Next.js and deployed to AWS with Serverless.
+This is the web app for the [Budget Zen app](https://budgetzen.net), built with [Deno](https://deno.land) and deployed to [Deno Deploy](https://deno.com/deploy).
 
 This is v2, which is [end-to-end encrypted via userbase](https://userbase.com), and works via web on any device (it's a PWA - Progressive Web App).
 
 It's not compatible with Budget Zen v1 (not end-to-end encrypted), which you can still get locally from [this commit](https://github.com/BrunoBernardino/budgetzen-web/tree/397d625469b7dfd8d1968c847b32e607ee7c8ee9). You can still export and import the data as the JSON format is the same (unencrypted).
 
+## Requirements
+
+This was tested with `deno@1.22.0`, though it's possible older versions might work.
+
+There are no other dependencies. **Deno**!
+
 ## Development
 
-```bash
-make install  # installs dependencies
-make start  # starts the app
-make pretty  # prettifies the code
-make test  # runs linting and tests
-make deploy  # deploys to app.budgetzen.net (requires `serverless` to be installed globally)
+```sh
+$ make start
+$ make format
+$ make test
 ```
 
-## TODOs
+## Structure
+
+This is vanilla JS, web standards, no frameworks. If you'd like to see/use [the Next.js version deployed to AWS via Serverless, check this commit](https://github.com/BrunoBernardino/budgetzen-web/tree/b1097c710ba89abf9aed044a7d7444e91d04a6a7).
+
+- Backend routes are defined at `routes.ts`.
+- Static files are defined at `public/`.
+- Pages are defined at `pages/`.
+
+## Deployment
+
+- Deno Deploy: Just push to the `main` branch. Any other branch will create a preview deployment.
+
+## TODOs:
 
-- [ ] Improve UI/UX in general
-- [ ] Improve dark/light mode
+- [ ] Enable true offline mode (securely cache data, allow read-only)
+  - https://github.com/smallbets/userbase/issues/255 has interesting ideas, while it's not natively supported
diff --git a/components/Budget/index.tsx b/components/Budget/index.tsx
deleted file mode 100644
index 65947ee..0000000
--- a/components/Budget/index.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-
-import { formatNumber } from 'lib/utils';
-import { colors, fontSizes } from 'lib/constants';
-
-import * as T from 'lib/types';
-
-interface BudgetProps extends T.Budget {
-  currency: T.Currency;
-  onClick: () => void;
-  expensesCost: number;
-}
-
-type ContainerProps = {
-  isTotal: boolean;
-};
-
-const Container = styled.section<ContainerProps>`
-  display: flex;
-  flex: 1;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: flex-start;
-  padding: 14px 16px;
-  border-radius: 12px;
-  box-shadow: 0px 0px 4px
-    rgba(0, 0, 0, ${({ isTotal }) => (isTotal ? '0.2' : '0.1')});
-  background-color: ${({ isTotal }) =>
-    isTotal ? colors().secondaryBackground : colors().background};
-  margin: 8px;
-  cursor: pointer;
-  min-width: 200px;
-  &:hover {
-    box-shadow: 0px 0px 4px
-      rgba(0, 0, 0, ${({ isTotal }) => (isTotal ? '0.5' : '0.3')});
-  }
-`;
-
-const LeftColumn = styled.div`
-  display: flex;
-  flex: 1;
-  flex-direction: column;
-`;
-
-const Cost = styled.span`
-  color: ${colors().text};
-  font-size: ${fontSizes.label}px;
-  font-weight: bold;
-  text-align: left;
-`;
-
-const Name = styled.span`
-  color: ${colors().text};
-  font-size: ${fontSizes.text}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 6px;
-`;
-
-const BudgetMissing = styled.div`
-  color: ${colors().secondaryText};
-  font-size: ${fontSizes.largeText}px;
-  font-weight: normal;
-  text-align: right;
-`;
-
-const Budget = (props: BudgetProps) => {
-  const budgetMissing = props.value - props.expensesCost;
-  return (
-    <Container isTotal={props.name === 'Total'} onClick={props.onClick}>
-      <LeftColumn>
-        <Cost>
-          {formatNumber(props.currency, props.expensesCost)} of{' '}
-          {formatNumber(props.currency, props.value)}
-        </Cost>
-        <Name>{props.name}</Name>
-      </LeftColumn>
-      <BudgetMissing>
-        {formatNumber(props.currency, budgetMissing)}
-      </BudgetMissing>
-    </Container>
-  );
-};
-
-export default Budget;
diff --git a/components/BudgetModal.tsx b/components/BudgetModal.tsx
deleted file mode 100644
index 73b9acf..0000000
--- a/components/BudgetModal.tsx
+++ /dev/null
@@ -1,203 +0,0 @@
-import React, { useState, useCallback } from 'react';
-import styled from 'styled-components';
-import Rodal from 'rodal';
-import Swal from 'sweetalert2';
-
-import Button from 'components/Button';
-import { showNotification } from 'lib/utils';
-import { saveBudget, deleteBudget } from 'lib/data-utils';
-import { colors, fontSizes } from 'lib/constants';
-import * as T from 'lib/types';
-
-interface BudgetModalProps {
-  isOpen: boolean;
-  onClose: () => void;
-  id: string;
-  name: string;
-  month: string;
-  value: number;
-  reloadData: () => Promise<void>;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  background-color: ${colors().background};
-  padding: 0 16px;
-`;
-
-const Label = styled.label`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.inputLabel}px;
-  font-weight: bold;
-  text-align: left;
-  margin-top: 38px;
-`;
-
-const Input = styled.input`
-  font-family: inherit;
-  color: ${colors().inputField};
-  font-size: ${fontSizes.inputField}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 8px;
-  background-color: ${colors().background};
-  padding: 5px 8px;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 5px;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const BudgetModal = (props: BudgetModalProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [name, setName] = useState(props.name);
-  const [month, setMonth] = useState(`${props.month}-01`);
-  const [value, setValue] = useState(props.value.toString());
-
-  const { id, isOpen, reloadData } = props;
-
-  const onClose = useCallback(() => {
-    const { onClose: closeModal } = props;
-    setName('');
-    setMonth('');
-    setValue('');
-    closeModal();
-  }, []);
-
-  const addBudget = async () => {
-    if (isSubmitting) {
-      // Ignore sequential clicks
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const parsedBudget: T.Budget = {
-      id: id || 'newBudget',
-      value: Number.parseFloat(value.replace(',', '.')),
-      name,
-      month: month ? month.substring(0, 7) : '',
-    };
-
-    const success = await saveBudget(parsedBudget);
-
-    setIsSubmitting(false);
-
-    if (success) {
-      showNotification(`Budget ${id ? 'updated' : 'added'} successfully.`);
-      onClose();
-    }
-
-    await reloadData();
-  };
-
-  const removeBudget = async () => {
-    if (isSubmitting) {
-      // Ignore sequential clicks
-      return;
-    }
-
-    const confirmationResult = await Swal.fire({
-      icon: 'warning',
-      title: 'Are you sure?',
-      text: 'Are you sure you want to delete this budget?\n\nThis action is irreversible.',
-      showDenyButton: true,
-      showCancelButton: true,
-      confirmButtonText: 'Yes!',
-      denyButtonText: 'Nope, cancel.',
-    });
-
-    if (!confirmationResult || !confirmationResult.isConfirmed) {
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const success = await deleteBudget(id);
-
-    setIsSubmitting(false);
-
-    if (success) {
-      showNotification('Budget deleted successfully.');
-      onClose();
-    }
-
-    await reloadData();
-  };
-
-  const onKeyDown = useCallback(
-    (event: React.KeyboardEvent<HTMLDivElement>) => {
-      if (event.key === 'Enter') {
-        event.preventDefault();
-        event.stopPropagation();
-        addBudget();
-      }
-    },
-    [],
-  );
-
-  return (
-    <Rodal visible={isOpen} onClose={onClose} animation="slideDown">
-      <Container>
-        <Label>Name</Label>
-        <Input
-          placeholder="Food"
-          onChange={(event) => setName(event.target.value)}
-          value={name}
-          autoComplete="off"
-          type="text"
-          onKeyDown={onKeyDown}
-        />
-
-        <Label>Value</Label>
-        <Input
-          placeholder="100"
-          onChange={(event) => setValue(event.target.value)}
-          value={value}
-          autoComplete="off"
-          type="number"
-          inputMode="decimal"
-          onKeyDown={onKeyDown}
-        />
-
-        <Label>Month</Label>
-        <Input
-          onChange={(event) => setMonth(event.target.value)}
-          value={month}
-          autoComplete="off"
-          type="date"
-          onKeyDown={onKeyDown}
-        />
-
-        <Button
-          onClick={() => addBudget()}
-          type="primary"
-          style={{ margin: '20px 0' }}
-        >
-          {id ? 'Save Budget' : 'Add Budget'}
-        </Button>
-
-        {Boolean(id) && (
-          <Button
-            onClick={() => removeBudget()}
-            type="delete"
-            style={{ margin: '20px 0' }}
-          >
-            Delete Budget
-          </Button>
-        )}
-      </Container>
-    </Rodal>
-  );
-};
-
-export default BudgetModal;
diff --git a/components/Button/__snapshots__/test.tsx.snap b/components/Button/__snapshots__/test.tsx.snap
deleted file mode 100644
index 14165c8..0000000
--- a/components/Button/__snapshots__/test.tsx.snap
+++ /dev/null
@@ -1,11 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Button renders the button as expected 1`] = `
-<button
-  className="Button__StyledButton-sc-1hxbnbg-0 undefined Button Button--primary "
-  disabled={false}
-  type="button"
->
-  Hello
-</button>
-`;
diff --git a/components/Button/index.tsx b/components/Button/index.tsx
deleted file mode 100644
index da6747e..0000000
--- a/components/Button/index.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import React, { forwardRef } from 'react';
-import styled from 'styled-components';
-
-import styles from './styles.module.scss';
-
-interface ButtonProps {
-  element?: 'button' | 'a';
-  isDisabled?: boolean;
-  type?: 'primary' | 'secondary' | 'delete';
-  href?: string;
-  onClick?: any;
-  className?: string;
-  width?: '' | 'large' | 'tiny';
-  style?: any;
-}
-
-const Button: React.FC<ButtonProps> = forwardRef(
-  (props: ButtonProps, ref: any) => {
-    const { element, className, type, isDisabled, width, ...remainingProps } =
-      props;
-
-    if (element === 'button') {
-      const StyledButton = styled.button.attrs({
-        className: `${styles[className] || ''} ${styles.Button} ${
-          styles[`Button--${type}`]
-        } ${width ? styles[`Button--${width}`] : ''}`,
-      })``;
-      return (
-        <StyledButton
-          ref={ref}
-          type="button"
-          disabled={isDisabled}
-          {...remainingProps}
-        />
-      );
-    }
-
-    const StyledAnchor = styled.a.attrs({
-      className: `${styles[className] || ''} ${styles.Button} ${
-        styles[`Button--${type}`]
-      } ${width ? styles[`Button--${width}`] : ''}`,
-    })``;
-
-    return <StyledAnchor ref={ref} {...remainingProps} />;
-  },
-);
-
-Button.defaultProps = {
-  element: 'button',
-  isDisabled: false,
-  type: 'primary',
-  width: '',
-};
-
-export default Button;
diff --git a/components/Button/styles.module.scss b/components/Button/styles.module.scss
deleted file mode 100644
index ee6da09..0000000
--- a/components/Button/styles.module.scss
+++ /dev/null
@@ -1,87 +0,0 @@
-@import 'styles/__variables';
-
-$transition-speed: 140ms;
-
-a.Button {
-  display: inline-block;
-  padding: 1.3rem 1.8rem;
-
-  &--large {
-    padding: 1.3rem 4.2rem;
-  }
-
-  &--tiny {
-    font-size: 0.85rem;
-    line-height: 1.2rem;
-    margin: 0 auto;
-    text-align: center;
-    padding: 0.5rem 0.8rem;
-    font-weight: normal;
-  }
-}
-
-button.Button {
-  display: block;
-  padding: 1rem 1.8rem;
-
-  &--large {
-    padding: 1rem 4.2rem;
-  }
-
-  &--tiny {
-    padding: 1rem;
-  }
-}
-
-.Button {
-  color: $color-white;
-  font-size: 1.3rem;
-  line-height: 1.5rem;
-  margin: 0 auto;
-  text-align: center;
-  padding: 1rem 1.3rem;
-  border-radius: 5px;
-  cursor: pointer;
-  text-decoration: none;
-  font-weight: 500;
-  z-index: 0;
-  position: relative;
-  background-size: 100%;
-  transition: all $transition-speed ease-in;
-  border: none;
-
-  &:focus,
-  &:hover {
-    color: $color-white;
-    box-shadow: 1px 1px 3px $color-block-border;
-    text-shadow: 1px 1px 1px $color-text;
-    outline: none;
-
-    opacity: 0.7;
-  }
-
-  &--primary {
-    background-color: $color-menu-background;
-  }
-
-  &--secondary {
-    background-color: $color-light-gray;
-
-    @media (prefers-color-scheme: dark) {
-      background-color: $color-text-gray;
-    }
-    @at-root .theme-dark #{&} {
-      background-color: $color-text-gray;
-    }
-
-    &:focus,
-    &:hover {
-      box-shadow: 1px 1px 3px $color-block-border;
-      text-shadow: 1px 1px 1px $color-block-border;
-    }
-  }
-
-  &--delete {
-    background-color: $color-background-red;
-  }
-}
diff --git a/components/Button/test.tsx b/components/Button/test.tsx
deleted file mode 100644
index 18a1776..0000000
--- a/components/Button/test.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import renderer from 'react-test-renderer';
-import { shallow } from 'enzyme';
-import expect from 'expect';
-import enzymify from 'expect-enzyme';
-
-import Button from './index';
-
-expect.extend(enzymify());
-
-describe('Button', () => {
-  it('renders the button without errors', () => {
-    const wrapper = shallow(<Button>Hello</Button>);
-    expect(wrapper.first().text()).toBe('Hello');
-  });
-
-  it('renders the button as expected', () => {
-    const tree = renderer.create(<Button>Hello</Button>).toJSON();
-    expect(tree).toMatchSnapshot();
-  });
-});
diff --git a/components/Expense/index.tsx b/components/Expense/index.tsx
deleted file mode 100644
index 7a8230f..0000000
--- a/components/Expense/index.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import React from 'react';
-import moment from 'moment';
-import styled from 'styled-components';
-
-import { formatNumber } from 'lib/utils';
-import { colors, fontSizes } from 'lib/constants';
-
-import * as T from 'lib/types';
-
-interface ExpenseProps extends T.Expense {
-  currency: T.Currency;
-  onClick: () => void;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex: 1;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: flex-start;
-  padding: 14px 16px;
-  border-radius: 12px;
-  box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.1);
-  background-color: ${colors().background};
-  margin: 8px;
-  cursor: pointer;
-  min-width: 200px;
-`;
-
-const LeftColumn = styled.div`
-  display: flex;
-  flex: 0.5;
-  flex-direction: column;
-`;
-const Cost = styled.span`
-  color: ${colors().text};
-  font-size: ${fontSizes.label}px;
-  font-weight: bold;
-  text-align: left;
-`;
-const Budget = styled.span`
-  color: ${colors().secondaryText};
-  font-size: ${fontSizes.text}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 6px;
-`;
-const Description = styled.div`
-  color: ${colors().text};
-  font-size: ${fontSizes.mediumText}px;
-  font-weight: normal;
-  text-align: left;
-  padding: 0 6px;
-`;
-const Date = styled.div`
-  color: ${colors().secondaryText};
-  font-size: ${fontSizes.largeText}px;
-  font-weight: normal;
-  text-align: right;
-  text-transform: uppercase;
-`;
-
-const Expense = (props: ExpenseProps) => {
-  const expenseDate = moment(props.date, 'YYYY-MM-DD');
-  return (
-    <Container onClick={props.onClick}>
-      <LeftColumn>
-        <Cost>{formatNumber(props.currency, props.cost)}</Cost>
-        <Budget>{props.budget}</Budget>
-      </LeftColumn>
-      <Description>{props.description}</Description>
-      <Date>
-        {expenseDate.format('DD')}
-        {'\n'}
-        {expenseDate.format('MMM')}
-      </Date>
-    </Container>
-  );
-};
-
-export default Expense;
diff --git a/components/ExpenseModal.tsx b/components/ExpenseModal.tsx
deleted file mode 100644
index c825cf0..0000000
--- a/components/ExpenseModal.tsx
+++ /dev/null
@@ -1,252 +0,0 @@
-import React, { useState, useCallback } from 'react';
-import styled from 'styled-components';
-import Rodal from 'rodal';
-import Swal from 'sweetalert2';
-
-import Button from 'components/Button';
-import { showNotification } from 'lib/utils';
-import { saveExpense, deleteExpense } from 'lib/data-utils';
-import { colors, fontSizes } from 'lib/constants';
-import * as T from 'lib/types';
-
-interface ExpenseModalProps {
-  isOpen: boolean;
-  onClose: () => void;
-  id: string;
-  cost: number;
-  description: string;
-  budget: string;
-  date: string;
-  budgets: T.Budget[];
-  reloadData: () => Promise<void>;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  background-color: ${colors().background};
-  padding: 0 16px;
-`;
-
-const Label = styled.label`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.inputLabel}px;
-  font-weight: bold;
-  text-align: left;
-  margin-top: 38px;
-`;
-
-const Input = styled.input`
-  font-family: inherit;
-  color: ${colors().inputField};
-  font-size: ${fontSizes.inputField}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 8px;
-  background-color: ${colors().background};
-  padding: 5px 8px;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 5px;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const Select = styled.select`
-  color: ${colors().inputField};
-  font-size: ${fontSizes.inputField}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 8px;
-  background-color: ${colors().background};
-  padding: 5px 8px;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 5px;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const ExpenseModal = (props: ExpenseModalProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [description, setDescription] = useState(props.description);
-  const [cost, setCost] = useState(props.cost.toString());
-  const [budget, setBudget] = useState(props.budget);
-  const [date, setDate] = useState(props.date);
-
-  const { id, isOpen, budgets, reloadData } = props;
-
-  const onClose = useCallback(() => {
-    const { onClose: closeModal } = props;
-    setDescription('');
-    setCost('');
-    setBudget('');
-    setDate('');
-    closeModal();
-  }, []);
-
-  const addExpense = async () => {
-    if (isSubmitting) {
-      // Ignore sequential clicks
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const parsedExpense: T.Expense = {
-      id: id || 'newExpense',
-      description,
-      cost: Number.parseFloat(cost.replace(',', '.')),
-      budget,
-      date,
-    };
-
-    const success = await saveExpense(parsedExpense);
-
-    setIsSubmitting(false);
-
-    if (success) {
-      showNotification(`Expense ${id ? 'updated' : 'added'} successfully.`);
-      onClose();
-    }
-
-    await reloadData();
-  };
-
-  const removeExpense = async () => {
-    if (isSubmitting) {
-      // Ignore sequential clicks
-      return;
-    }
-
-    const confirmationResult = await Swal.fire({
-      icon: 'warning',
-      title: 'Are you sure?',
-      text: 'Are you sure you want to delete this expense?\n\nThis action is irreversible.',
-      showDenyButton: true,
-      showCancelButton: true,
-      confirmButtonText: 'Yes!',
-      denyButtonText: 'Nope, cancel.',
-    });
-
-    if (!confirmationResult || !confirmationResult.isConfirmed) {
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const success = await deleteExpense(id);
-
-    setIsSubmitting(false);
-
-    if (success) {
-      showNotification('Expense deleted successfully.');
-      onClose();
-    }
-
-    await reloadData();
-  };
-
-  const onKeyDown = useCallback(
-    (event: React.KeyboardEvent<HTMLInputElement>) => {
-      // @ts-ignore: Convert comma to dot
-      if (event.key === ',' && event.target.type === 'number') {
-        event.preventDefault();
-        event.stopPropagation();
-        setCost(`${cost}.`);
-      }
-
-      if (event.key === 'Enter') {
-        event.preventDefault();
-        event.stopPropagation();
-        addExpense();
-      }
-    },
-    [cost, description, budget, date],
-  );
-
-  return (
-    <Rodal visible={isOpen} onClose={onClose} animation="slideDown">
-      <Container>
-        <Label>Cost</Label>
-        <Input
-          placeholder="10.99"
-          onChange={(event) => setCost(event.target.value)}
-          value={cost}
-          autoComplete="off"
-          type="number"
-          inputMode="decimal"
-          onKeyDown={onKeyDown}
-        />
-
-        <Label>Description</Label>
-        <Input
-          placeholder="Lunch"
-          onChange={(event) => setDescription(event.target.value)}
-          value={description}
-          autoComplete="off"
-          type="text"
-          onKeyDown={onKeyDown}
-        />
-
-        <Label>Budget</Label>
-        <Select
-          placeholder="Misc"
-          onChange={(event) =>
-            setBudget(budgets[event.target.selectedIndex].name)
-          }
-          value={budget || 'Misc'}
-        >
-          {budgets.map((budgetOption: T.Budget) => (
-            <option key={budgetOption.id} value={budgetOption.name}>
-              {budgetOption.name}
-            </option>
-          ))}
-        </Select>
-
-        <Label>Date</Label>
-        <Input
-          placeholder="Today"
-          onChange={(event) => setDate(event.target.value)}
-          value={date}
-          autoComplete="off"
-          type="date"
-          onKeyDown={onKeyDown}
-        />
-
-        <Button
-          onClick={() => addExpense()}
-          type="primary"
-          style={{ margin: '20px 0' }}
-        >
-          {id ? 'Save Expense' : 'Add Expense'}
-        </Button>
-
-        {Boolean(id) && (
-          <Button
-            onClick={() => removeExpense()}
-            type="delete"
-            style={{ margin: '20px 0' }}
-          >
-            Delete Expense
-          </Button>
-        )}
-      </Container>
-    </Rodal>
-  );
-};
-
-export default ExpenseModal;
diff --git a/components/FilterBudgetModal.tsx b/components/FilterBudgetModal.tsx
deleted file mode 100644
index 25337d2..0000000
--- a/components/FilterBudgetModal.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-import Rodal from 'rodal';
-import Switch from 'react-toggle-switch';
-
-import { colors, fontSizes } from 'lib/constants';
-
-import * as T from 'lib/types';
-
-interface FilterBudgetModalProps {
-  isOpen: boolean;
-  onClose: () => void;
-  onFilterBudgetToggle: (budgetName: string, newValue: boolean) => void;
-  budgets: T.Budget[];
-  filterBudgets: Set<string>;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  background-color: ${colors().background};
-  padding: 0 16px;
-`;
-
-const IntroText = styled.p`
-  color: ${colors().secondaryText};
-  font-size: ${fontSizes.mediumText};
-  margin-bottom: 20px;
-`;
-
-const Budget = styled.section<{ isOdd: boolean }>`
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  background-color: ${({ isOdd }) =>
-    isOdd ? colors().alternateBackground : colors().background};
-  padding: 8px;
-  border-radius: 10px;
-`;
-
-const BudgetName = styled.span`
-  font-size: ${fontSizes.label};
-`;
-
-const FilterBudgetModal = (props: FilterBudgetModalProps) => {
-  const { isOpen, onClose, budgets, onFilterBudgetToggle, filterBudgets } =
-    props;
-  return (
-    <Rodal visible={isOpen} onClose={onClose} animation="slideDown">
-      <Container>
-        <IntroText>Choose which budgets to filter by:</IntroText>
-        {budgets.map((budget, index) => (
-          <Budget key={budget.id} isOdd={index % 2 !== 0}>
-            <BudgetName>{budget.name}</BudgetName>
-            <Switch
-              on={filterBudgets.has(budget.name)}
-              onClick={() =>
-                onFilterBudgetToggle(
-                  budget.name,
-                  !filterBudgets.has(budget.name),
-                )
-              }
-            />
-          </Budget>
-        ))}
-      </Container>
-    </Rodal>
-  );
-};
-
-export default FilterBudgetModal;
diff --git a/components/IconButton.tsx b/components/IconButton.tsx
deleted file mode 100644
index 0f34da6..0000000
--- a/components/IconButton.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import React from 'react';
-import { IonIcon, addIcons } from 'react-svg-ionicons';
-import styled from 'styled-components';
-import settings from 'react-svg-ionicons/icons/settings';
-import options from 'react-svg-ionicons/icons/options';
-import arrowBack from 'react-svg-ionicons/icons/arrow-back';
-import arrowForward from 'react-svg-ionicons/icons/arrow-forward';
-
-interface IconButtonProps {
-  icon: 'settings' | 'options' | 'arrow-back' | 'arrow-forward';
-  size: number;
-  color: string;
-  onClick: () => void;
-  className?: string;
-}
-
-const bundle = {
-  settings,
-  options,
-  'arrow-back': arrowBack,
-  'arrow-forward': arrowForward,
-};
-addIcons(bundle);
-
-const Container = styled.div`
-  display: flex;
-  flex: 1;
-  justify-content: center;
-  align-items: center;
-  padding: 0 10px;
-`;
-
-const Button = styled.button`
-  background: transparent;
-  border: none;
-  align-items: center;
-  padding: 5px 10px;
-  cursor: pointer;
-  outline: none;
-  &:hover,
-  &:focus,
-  &:active {
-    opacity: 0.6;
-  }
-`;
-
-const IconButton = ({
-  icon,
-  size,
-  color,
-  className,
-  onClick,
-}: IconButtonProps) => {
-  return (
-    <Container className={className}>
-      <Button onClick={() => onClick()}>
-        <IonIcon name={icon} size={size} color={color} mode="ios" />
-      </Button>
-    </Container>
-  );
-};
-
-export default IconButton;
diff --git a/components/ImportExportModal.tsx b/components/ImportExportModal.tsx
deleted file mode 100644
index e3fbc27..0000000
--- a/components/ImportExportModal.tsx
+++ /dev/null
@@ -1,204 +0,0 @@
-import React, { useState } from 'react';
-import styled from 'styled-components';
-import Rodal from 'rodal';
-import Swal from 'sweetalert2';
-
-import Button from 'components/Button';
-import { showNotification } from 'lib/utils';
-import { exportAllData, importData } from 'lib/data-utils';
-import { colors, fontSizes } from 'lib/constants';
-import * as T from 'lib/types';
-
-type ImportedFileData = {
-  budgets?: T.Budget[];
-  expenses?: T.Expense[];
-};
-
-interface ImportExportModalProps {
-  isOpen: boolean;
-  onClose: () => void;
-  setIsLoading: (isLoading: boolean) => void;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  background-color: ${colors().background};
-  padding: 0 16px;
-`;
-
-const Label = styled.label`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.inputLabel}px;
-  font-weight: bold;
-  text-align: left;
-  margin-top: 38px;
-`;
-
-const Note = styled.span`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.mediumText}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 30px;
-`;
-
-const ImportExportModal = (props: ImportExportModalProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-
-  const { isOpen, onClose, setIsLoading } = props;
-
-  const onRequestImport = async () => {
-    if (isSubmitting) {
-      // Ignore sequential taps
-      return;
-    }
-
-    const importFileDialogResult = await Swal.fire({
-      icon: 'warning',
-      input: 'file',
-      title: 'Choose JSON File',
-      inputAttributes: {
-        accept: 'text/pain,application/json,.json',
-        'aria-label': 'Import your budgets and expenses',
-      },
-    });
-
-    if (!importFileDialogResult || !importFileDialogResult.value) {
-      return;
-    }
-
-    const reader = new FileReader();
-    reader.onload = async (fileRead) => {
-      const importFileContents = fileRead.target.result;
-
-      let importedFileData: ImportedFileData = {};
-
-      try {
-        importedFileData = JSON.parse(importFileContents.toString());
-      } catch (error) {
-        importedFileData = {};
-      }
-
-      if (
-        !Object.prototype.hasOwnProperty.call(importedFileData, 'budgets') &&
-        !Object.prototype.hasOwnProperty.call(importedFileData, 'expenses')
-      ) {
-        showNotification(
-          'Could not parse the file. Please confirm what you chose is correct.',
-          'error',
-        );
-        return;
-      }
-
-      const budgets = importedFileData.budgets || [];
-      const expenses = importedFileData.expenses || [];
-
-      const mergeOrReplaceDialogResult = await Swal.fire({
-        icon: 'question',
-        title: 'Merge or Replace?',
-        text: 'Do you want to merge this with your existing data, or replace it?',
-        showCancelButton: true,
-        showDenyButton: true,
-        confirmButtonText: 'Merge',
-        denyButtonText: 'Replace',
-        cancelButtonText: 'Wait, cancel.',
-      });
-
-      if (
-        mergeOrReplaceDialogResult.isConfirmed ||
-        mergeOrReplaceDialogResult.isDenied
-      ) {
-        setIsSubmitting(true);
-        setIsLoading(true);
-
-        const success = await importData(
-          mergeOrReplaceDialogResult.isDenied,
-          budgets,
-          expenses,
-        );
-
-        setIsSubmitting(false);
-        setIsLoading(false);
-
-        if (success) {
-          onClose();
-        }
-      }
-    };
-
-    reader.readAsText(importFileDialogResult.value);
-  };
-
-  const onRequestExport = async () => {
-    if (isSubmitting) {
-      // Ignore sequential taps
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const fileName = `data-export-${new Date()
-      .toISOString()
-      .substring(0, 19)
-      .replace(/:/g, '-')}.json`;
-
-    const exportData = await exportAllData();
-
-    const exportContents = JSON.stringify(exportData, null, 2);
-
-    // Add content-type
-    const jsonContent = `data:application/json;charset=utf-8,${exportContents}`;
-
-    // Download the file
-    const data = encodeURI(jsonContent);
-    const link = document.createElement('a');
-    link.setAttribute('href', data);
-    link.setAttribute('download', fileName);
-    link.click();
-    link.remove();
-
-    setIsSubmitting(false);
-
-    showNotification('Data exported successfully!');
-  };
-
-  return (
-    <Rodal visible={isOpen} onClose={onClose} animation="slideDown">
-      <Container>
-        <Label>Import</Label>
-        <Note>
-          Import a JSON file exported from Budget Zen (v1 or v2) before.
-        </Note>
-
-        <Button
-          element="a"
-          href="https://budgetzen.net/import-export-file-format"
-          type="secondary"
-          style={{ margin: '20px 0', alignSelf: 'center' }}
-        >
-          Learn more
-        </Button>
-
-        <Button
-          onClick={() => onRequestImport()}
-          type="secondary"
-          style={{ margin: '20px 0', alignSelf: 'center' }}
-        >
-          Import Data
-        </Button>
-
-        <Button
-          onClick={() => onRequestExport()}
-          type="primary"
-          style={{ margin: '20px 0', alignSelf: 'center' }}
-        >
-          Export Data
-        </Button>
-      </Container>
-    </Rodal>
-  );
-};
-
-export default ImportExportModal;
diff --git a/components/Layout/Footer.module.scss b/components/Layout/Footer.module.scss
deleted file mode 100644
index 8885c89..0000000
--- a/components/Layout/Footer.module.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-@import 'styles/__variables';
-
-.Footer {
-  display: block;
-  padding: 20px 10px;
-  margin: 20px auto 0;
-  text-align: center;
-  background-color: #dfdfdf;
-
-  @media (prefers-color-scheme: dark) {
-    background-color: #161616;
-  }
-  @at-root .theme-dark #{&} {
-    background-color: #161616;
-  }
-
-  &__faq {
-    display: block;
-    padding: 1em 2em 2em;
-    border-bottom: 1px solid #999;
-
-    h3 {
-      font-size: 1.3em;
-      font-weight: 500;
-      line-height: 1.5em;
-      margin-bottom: 1em;
-    }
-  }
-
-  &__faq-items {
-    display: block;
-    max-width: 100%;
-    margin: 0 auto;
-
-    @media #{$bigger-screen} {
-      @include flex;
-      flex-wrap: wrap;
-      width: $max-width;
-    }
-  }
-
-  &__faq-item {
-    display: block;
-    margin: 1em 1em 2em;
-    text-align: left;
-    line-height: 1.4em;
-    font-size: 0.9em;
-    text-align: center;
-
-    @media #{$bigger-screen} {
-      margin: 1em;
-      width: 45%;
-    }
-
-    h4 {
-      font-size: 1.1em;
-      font-weight: 500;
-      margin-bottom: 0.2em;
-    }
-  }
-
-  &__links {
-    font-size: 0.8rem;
-    line-height: 1rem;
-    font-weight: 400;
-    margin-top: 1.5em;
-
-    a {
-      text-decoration: none;
-
-      @media (prefers-color-scheme: dark) {
-        color: $color-menu-background-hover;
-      }
-      @at-root .theme-dark #{&} {
-        color: $color-menu-background-hover;
-      }
-
-      &:hover,
-      &:focus {
-        @media (prefers-color-scheme: dark) {
-          color: #f3f3f3;
-        }
-        @at-root .theme-dark #{&} {
-          color: #f3f3f3;
-        }
-      }
-    }
-  }
-}
diff --git a/components/Layout/Footer.test.tsx b/components/Layout/Footer.test.tsx
deleted file mode 100644
index b485924..0000000
--- a/components/Layout/Footer.test.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import { shallow } from 'enzyme';
-import expect from 'expect';
-import enzymify from 'expect-enzyme';
-
-import Footer from './Footer';
-
-expect.extend(enzymify());
-
-describe('Footer', () => {
-  it('renders the Footer with a link', () => {
-    const wrapper = shallow(<Footer />);
-    expect(
-      wrapper.find('a[href="https://brunobernardino.com"]').length,
-    ).toEqual(1);
-  });
-});
diff --git a/components/Layout/Footer.tsx b/components/Layout/Footer.tsx
deleted file mode 100644
index 5bfcec0..0000000
--- a/components/Layout/Footer.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import Link from 'next/link';
-
-import styles from './Footer.module.scss';
-
-const Footer = ({ hasValidSession }: { hasValidSession: boolean }) => {
-  return (
-    <footer className={styles.Footer}>
-      <section className={styles.Footer__faq}>
-        <h3>Frequently asked questions</h3>
-
-        <div className={styles['Footer__faq-items']}>
-          <div className={styles['Footer__faq-item']}>
-            <h4>What is Budget Zen?</h4>
-            <p>
-              Simple and encrypted budget management.{' '}
-              <a href="https://budgetzen.net">Read more here</a>.
-            </p>
-          </div>
-
-          {hasValidSession ? (
-            <>
-              <div className={styles['Footer__faq-item']}>
-                <h4>How can I manage my subscription?</h4>
-                <p>
-                  <Link href="/billing">
-                    <a>In your billing section</a>
-                  </Link>
-                  .
-                </p>
-              </div>
-              <div className={styles['Footer__faq-item']}>
-                <h4>How can I change my email or password / ecryption key?</h4>
-                <p>
-                  <Link href="/email-password">
-                    <a>Right here</a>
-                  </Link>
-                  .
-                </p>
-              </div>
-            </>
-          ) : (
-            <div className={styles['Footer__faq-item']}>
-              <h4>How can I subscribe?</h4>
-              <p>
-                <Link href="/pricing">
-                  <a>In the pricing section</a>
-                </Link>
-                .
-              </p>
-            </div>
-          )}
-
-          <div className={styles['Footer__faq-item']}>
-            <h4>Where's the code for this web app?</h4>
-            <p>
-              <a href="https://github.com/BrunoBernardino/budgetzen-web">
-                It's in GitHub
-              </a>
-              .
-            </p>
-          </div>
-        </div>
-      </section>
-      <h3 className={styles.Footer__links}>
-        <a href="https://budgetzen.net/privacy">Privacy Policy</a> |{' '}
-        <a href="mailto:me@brunobernardino.com">Get Help</a> | by{' '}
-        <a href="https://brunobernardino.com">Bruno Bernardino</a>
-      </h3>
-    </footer>
-  );
-};
-
-export default Footer;
diff --git a/components/Layout/Header.module.scss b/components/Layout/Header.module.scss
deleted file mode 100644
index cd55170..0000000
--- a/components/Layout/Header.module.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-@import 'styles/__variables';
-
-.Header {
-  display: block;
-  text-align: right;
-
-  &__logo {
-    display: block;
-    margin: 0 1em;
-
-    img {
-      width: 220px;
-    }
-  }
-}
diff --git a/components/Layout/Header.tsx b/components/Layout/Header.tsx
deleted file mode 100644
index bdf75c7..0000000
--- a/components/Layout/Header.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import Link from 'next/link';
-
-import styles from './Header.module.scss';
-
-const Header = () => {
-  return (
-    <header className={styles.Header}>
-      <h1 className={styles.Header__logo}>
-        <Link href="/">
-          <a>
-            <img
-              alt="Logo: stylized letters Budget Zen"
-              src="/images/logo.svg"
-            />
-          </a>
-        </Link>
-      </h1>
-    </header>
-  );
-};
-
-export default Header;
diff --git a/components/Layout/Main.tsx b/components/Layout/Main.tsx
deleted file mode 100644
index 4f550a4..0000000
--- a/components/Layout/Main.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { ReactNode } from 'react';
-import Head from 'next/head';
-import Helmet from 'react-helmet';
-
-import { Footer } from 'components/Layout';
-
-interface MainLayoutProps {
-  children: ReactNode;
-  title?: string;
-  description?: string;
-  keywords?: string;
-  hasValidSession?: boolean;
-}
-
-const MainLayout = ({
-  children,
-  title,
-  description,
-  keywords,
-  hasValidSession,
-}: MainLayoutProps) => {
-  const metaTags = [
-    { property: 'og:title', content: title },
-    {
-      name: 'description',
-      content: description,
-    },
-    {
-      name: 'keywords',
-      content: keywords,
-    },
-  ];
-
-  const SEOOverride: JSX.Element =
-    title && description ? <Helmet title={title} meta={metaTags} /> : null;
-
-  return (
-    <>
-      <Head>
-        {title && <title>{title}</title>}
-        {title && <meta property="og:title" content={title} />}
-        {description && <meta name="description" content={description} />}
-        {keywords && <meta name="keywords" content={keywords} />}
-      </Head>
-      {SEOOverride}
-      <div className="wrapper">{children}</div>
-      <Footer hasValidSession={Boolean(hasValidSession)} />
-    </>
-  );
-};
-
-export default MainLayout;
diff --git a/components/Layout/index.ts b/components/Layout/index.ts
deleted file mode 100644
index b10b1cd..0000000
--- a/components/Layout/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { default as Header } from './Header';
-export { default as Footer } from './Footer';
-export { default as Main } from './Main';
diff --git a/components/Loading/styles.module.scss b/components/Loading/styles.module.scss
deleted file mode 100644
index 240a5b5..0000000
--- a/components/Loading/styles.module.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.Loading {
-  position: fixed;
-  top: 0;
-  left: 0;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-  height: 100%;
-  z-index: 10000;
-  background: rgba(0, 0, 0, 0.7);
-  transition: all 200ms ease-in-out;
-  opacity: 0;
-  visibility: hidden;
-
-  svg path,
-  svg rect {
-    fill: #ffffff;
-  }
-
-  &--show {
-    visibility: visible;
-    opacity: 1;
-  }
-}
diff --git a/components/Loading/test.tsx b/components/Loading/test.tsx
deleted file mode 100644
index 0997141..0000000
--- a/components/Loading/test.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from 'react';
-import { shallow } from 'enzyme';
-import expect from 'expect';
-import enzymify from 'expect-enzyme';
-
-import Loading from './index';
-
-expect.extend(enzymify());
-
-describe('Loading', () => {
-  it('renders the loading hidden', () => {
-    const wrapper = shallow(<Loading />);
-    expect(wrapper.find('.Loading--show').exists()).toBe(false);
-  });
-
-  it('renders the loading visible', () => {
-    const wrapper = shallow(<Loading isShowing />);
-    expect(wrapper.find('.Loading--show').exists()).toBe(true);
-  });
-});
diff --git a/components/MonthNavigation.tsx b/components/MonthNavigation.tsx
deleted file mode 100644
index b9cf6b3..0000000
--- a/components/MonthNavigation.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import React, { useCallback } from 'react';
-import moment from 'moment';
-import styled from 'styled-components';
-
-import IconButton from 'components/IconButton';
-import { colors } from 'lib/constants';
-
-interface MonthNavigationProps {
-  currentMonth: string;
-  handleChangeMonth: (newMonth: string) => void;
-}
-
-const Container = styled.section`
-  display: flex;
-  margin-top: 20;
-  align-items: center;
-  flex-direction: row;
-  justify-content: space-between;
-`;
-const Text = styled.span`
-  color: ${colors().inputLabel};
-  width: 70%;
-  padding: 0 20px;
-  font-size: 24px;
-  font-weight: bold;
-  text-align: center;
-`;
-
-const MonthNavigation = ({
-  currentMonth,
-  handleChangeMonth,
-}: MonthNavigationProps) => {
-  const goBack = useCallback(() => {
-    const previousMonth = moment(currentMonth, 'YYYY-MM')
-      .subtract(1, 'month')
-      .format('YYYY-MM');
-    handleChangeMonth(previousMonth);
-  }, [currentMonth]);
-
-  const goForward = useCallback(() => {
-    const nextMonth = moment(currentMonth, 'YYYY-MM')
-      .add(1, 'month')
-      .format('YYYY-MM');
-    handleChangeMonth(nextMonth);
-  }, [currentMonth]);
-
-  return (
-    <Container>
-      <IconButton
-        onClick={goBack}
-        icon="arrow-back"
-        size={32}
-        color={colors().inputLabel}
-      />
-      <Text>{moment(currentMonth, 'YYYY-MM').format('MMMM YYYY')}</Text>
-      <IconButton
-        onClick={goForward}
-        icon="arrow-forward"
-        size={32}
-        color={colors().inputLabel}
-      />
-    </Container>
-  );
-};
-
-export default MonthNavigation;
diff --git a/components/Panels/AddExpense.tsx b/components/Panels/AddExpense.tsx
deleted file mode 100644
index 6f3b976..0000000
--- a/components/Panels/AddExpense.tsx
+++ /dev/null
@@ -1,227 +0,0 @@
-import React, { useState, useCallback } from 'react';
-import styled from 'styled-components';
-
-import Button from 'components/Button';
-import { colors, fontSizes } from 'lib/constants';
-import { showNotification } from 'lib/utils';
-import { saveExpense } from 'lib/data-utils';
-import * as T from 'lib/types';
-
-interface AddExpenseProps {
-  budgets: T.Budget[];
-  reloadData: () => Promise<void>;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  background-color: ${colors().background};
-  padding: 0 16px;
-  width: 86vw;
-  border-radius: 5px;
-  margin: 10px 0 30px;
-
-  @media only screen and (min-width: 800px) {
-    max-width: 280px;
-    margin-top: 5px;
-    margin-bottom: 10px;
-  }
-`;
-
-const Logo = styled.img`
-  margin-top: 10px;
-  margin-bottom: -20px;
-  height: 50px;
-  resize-mode: contain;
-  align-self: center;
-`;
-
-const Label = styled.label`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.inputLabel}px;
-  font-weight: bold;
-  text-align: left;
-  margin-top: 38px;
-`;
-
-const Input = styled.input`
-  font-family: inherit;
-  color: ${colors().inputField};
-  font-size: ${fontSizes.inputField}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 8px;
-  background-color: ${colors().background};
-  padding: 5px 8px;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 5px;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const Select = styled.select`
-  color: ${colors().inputField};
-  font-size: ${fontSizes.inputField}px;
-  font-weight: normal;
-  text-align: left;
-  margin-top: 8px;
-  background-color: ${colors().background};
-  padding: 5px 8px;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 5px;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const AddExpense = ({ budgets, reloadData }: AddExpenseProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [description, setDescription] = useState('');
-  const [cost, setCost] = useState('');
-  const [budget, setBudget] = useState('');
-  const [date, setDate] = useState('');
-
-  const addExpense = async () => {
-    if (isSubmitting) {
-      // Ignore sequential clicks
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const parsedExpense: T.Expense = {
-      id: 'newExpense',
-      cost: Number.parseFloat(cost.replace(',', '.')),
-      description,
-      budget,
-      date,
-    };
-
-    const success = await saveExpense(parsedExpense);
-
-    setIsSubmitting(false);
-
-    if (success) {
-      setDescription('');
-      setCost('');
-      setBudget('');
-      setDate('');
-      showNotification('Expense added successfully.');
-    }
-
-    await reloadData();
-  };
-
-  const onKeyDown = useCallback(
-    (event: React.KeyboardEvent<HTMLInputElement>) => {
-      // @ts-ignore: Convert comma to dot
-      if (event.key === ',' && event.target.type === 'number') {
-        event.preventDefault();
-        event.stopPropagation();
-        setCost(`${cost}.`);
-      }
-
-      if (event.key === 'Enter') {
-        event.preventDefault();
-        event.stopPropagation();
-        addExpense();
-      }
-    },
-    [cost, description, budget, date],
-  );
-
-  const budgetsToShow = [...budgets];
-
-  if (budgetsToShow.length === 0) {
-    // Only the name matters/is used below
-    budgetsToShow.push({
-      id: 'fake',
-      name: 'Misc',
-      month: '',
-      value: 0,
-    });
-  }
-
-  return (
-    <Container>
-      <Logo
-        alt="Logo: stylized letters Budget Zen"
-        src="/images/logomark.png"
-      />
-      <Label>Cost</Label>
-      <Input
-        placeholder="10.99"
-        onChange={(event) => setCost(event.target.value)}
-        value={cost}
-        autoComplete="off"
-        type="number"
-        inputMode="decimal"
-        onKeyDown={onKeyDown}
-        data-automation="add-expense-cost"
-      />
-
-      <Label>Description</Label>
-      <Input
-        placeholder="Lunch"
-        onChange={(event) => setDescription(event.target.value)}
-        value={description}
-        autoComplete="off"
-        type="text"
-        onKeyDown={onKeyDown}
-        data-automation="add-expense-description"
-      />
-
-      <Label>Budget</Label>
-      <Select
-        placeholder="Misc"
-        onChange={(event) =>
-          setBudget(budgets[event.target.selectedIndex].name)
-        }
-        value={budget || 'Misc'}
-        data-automation="add-expense-budget"
-      >
-        {budgetsToShow.map((budgetOption: T.Budget) => (
-          <option key={budgetOption.id} value={budgetOption.name}>
-            {budgetOption.name}
-          </option>
-        ))}
-      </Select>
-
-      <Label>Date</Label>
-      <Input
-        placeholder="Today"
-        onChange={(event) => setDate(event.target.value)}
-        value={date}
-        autoComplete="off"
-        type="date"
-        onKeyDown={onKeyDown}
-        data-automation="add-expense-date"
-      />
-      <Button
-        isDisabled={isSubmitting}
-        onClick={() => addExpense()}
-        type="primary"
-        style={{ margin: '20px 0' }}
-        data-automation="add-expense-button"
-      >
-        {isSubmitting ? 'Adding...' : 'Add Expense'}
-      </Button>
-    </Container>
-  );
-};
-
-export default AddExpense;
diff --git a/components/Panels/All.tsx b/components/Panels/All.tsx
deleted file mode 100644
index 51b1980..0000000
--- a/components/Panels/All.tsx
+++ /dev/null
@@ -1,183 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import moment from 'moment';
-import styled from 'styled-components';
-import { useAsync } from 'react-use';
-import { useRouter } from 'next/router';
-
-import LogoutLink from 'modules/auth/LogoutLink';
-import { Loading } from 'components';
-import { getUserInfo, showNotification, getUserSession } from 'lib/utils';
-import {
-  initializeDb,
-  fetchBudgets,
-  fetchExpenses,
-  copyBudgets,
-} from 'lib/data-utils';
-import * as T from 'lib/types';
-
-import Navigation from './Navigation';
-import Expenses from './Expenses';
-import Budgets from './Budgets';
-import AddExpense from './AddExpense';
-import Settings from './Settings';
-
-const Wrapper = styled.main`
-  display: flex;
-  flex: 1;
-  justify-content: center;
-  align-items: flex-start;
-  flex-direction: column-reverse;
-  max-width: 100vw;
-
-  @media only screen and (min-width: 800px) {
-    flex-direction: row;
-  }
-`;
-
-const LeftSide = styled.section`
-  display: flex;
-  flex: 1;
-  justify-content: flex-start;
-  align-items: center;
-  flex-direction: column;
-`;
-
-const All = () => {
-  const router = useRouter();
-  const [isLoading, setIsLoading] = useState(true);
-  const [monthInView, setMonthInView] = useState(moment().format('YYYY-MM'));
-  const [currency, setCurrency] = useState<T.Currency>('USD');
-  const [theme, setTheme] = useState<T.Theme>('light');
-  const [budgets, setBudgets] = useState<T.Budget[]>([]);
-  const [expenses, setExpenses] = useState<T.Expense[]>([]);
-
-  type ReloadData = (options?: {
-    monthToLoad?: string;
-    isComingFromEmptyState?: boolean;
-  }) => Promise<void>;
-  const reloadData: ReloadData = async ({
-    monthToLoad,
-    isComingFromEmptyState = false,
-  } = {}) => {
-    setIsLoading(true);
-
-    const fetchedBudgets = await fetchBudgets(monthToLoad || monthInView);
-    setBudgets(fetchedBudgets);
-
-    const fetchedExpenses = await fetchExpenses(monthToLoad || monthInView);
-    setExpenses(fetchedExpenses);
-
-    // If this is for the current or next month and there are no budgets, create budgets based on the previous/current month.
-    if (fetchedBudgets.length === 0 && !isComingFromEmptyState) {
-      const currentMonth = moment().format('YYYY-MM');
-      const nextMonth = moment().add(1, 'month').format('YYYY-MM');
-      const previousMonth = moment().subtract(1, 'month').format('YYYY-MM');
-
-      if (
-        (monthToLoad && monthToLoad === nextMonth) ||
-        (!monthToLoad && monthInView === nextMonth)
-      ) {
-        await copyBudgets(currentMonth, nextMonth);
-        await reloadData({ monthToLoad, isComingFromEmptyState: true });
-        return;
-      }
-
-      if (
-        (monthToLoad && monthToLoad === currentMonth) ||
-        (!monthToLoad && monthInView === currentMonth)
-      ) {
-        await copyBudgets(previousMonth, currentMonth);
-        await reloadData({ monthToLoad, isComingFromEmptyState: true });
-        return;
-      }
-    }
-
-    setIsLoading(false);
-  };
-
-  const changeMonthInView = async (month: string) => {
-    const nextMonth = moment().add(1, 'month').format('YYYY-MM');
-
-    if (month > nextMonth) {
-      showNotification('Cannot travel further into the future!', 'error');
-      return;
-    }
-
-    setMonthInView(month);
-
-    await reloadData({ monthToLoad: month });
-  };
-
-  useAsync(async () => {
-    if (typeof window !== 'undefined') {
-      const userInfo = getUserInfo();
-      setCurrency(userInfo.currency);
-      setTheme(userInfo.theme || 'light');
-
-      await initializeDb();
-
-      await reloadData();
-
-      const userSession = await getUserSession();
-
-      const trialDaysLeft = moment(userSession.trialExpirationDate).diff(
-        moment(),
-        'days',
-      );
-      if (userSession.subscriptionStatus !== 'active' && trialDaysLeft < 0) {
-        showNotification('Your trial has expired!', 'error');
-        // Give people some time to logout or export
-        setTimeout(() => {
-          router.push('/pricing');
-        }, 10000);
-      }
-    }
-  }, []);
-
-  useEffect(() => {
-    if (theme === 'dark') {
-      document.getElementsByTagName('html')[0].classList.add('theme-dark');
-      document.getElementsByTagName('body')[0].classList.add('theme-dark');
-    }
-  }, [theme]);
-
-  return (
-    <Wrapper className="wrapper">
-      <Loading isShowing={isLoading} />
-      <LeftSide>
-        <Navigation
-          changeMonthInView={changeMonthInView}
-          monthInView={monthInView}
-        />
-        <Wrapper>
-          <Expenses
-            monthInView={monthInView}
-            currency={currency}
-            budgets={budgets}
-            expenses={expenses}
-            reloadData={reloadData}
-          />
-          <Budgets
-            monthInView={monthInView}
-            currency={currency}
-            budgets={budgets}
-            expenses={expenses}
-            reloadData={reloadData}
-          />
-        </Wrapper>
-      </LeftSide>
-      <AddExpense budgets={budgets} reloadData={reloadData} />
-      <Settings
-        currentCurrency={currency}
-        updateCurrency={setCurrency}
-        currentTheme={theme}
-        updateTheme={setTheme}
-        setIsLoading={setIsLoading}
-        reloadData={reloadData}
-      />
-      <LogoutLink />
-    </Wrapper>
-  );
-};
-
-export default All;
diff --git a/components/Panels/Billing.tsx b/components/Panels/Billing.tsx
deleted file mode 100644
index 3c9ac86..0000000
--- a/components/Panels/Billing.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import React, { useCallback } from 'react';
-import Link from 'next/link';
-import styled from 'styled-components';
-import userbase from 'userbase-js';
-
-import { Title, Subtitle, Paragraph } from 'components';
-import { Header } from 'components/Layout';
-import Button from 'components/Button';
-
-interface BillingProps {
-  hasValidSession: boolean;
-  hasValidSubscription: boolean;
-  isTrialing: boolean;
-  isSubscriptionCanceled: boolean;
-  isSubscriptionMonthly: boolean;
-}
-
-const Hero = styled.section`
-  @media only screen and (min-width: 600px) {
-    display: flex;
-    align-items: center;
-  }
-`;
-
-const HeroText = styled.section`
-  margin-right: 1em;
-`;
-
-const Billing = ({
-  hasValidSession,
-  hasValidSubscription,
-  isTrialing,
-  isSubscriptionCanceled,
-  isSubscriptionMonthly,
-}: BillingProps) => {
-  const handleSubscriptionCancelClick = useCallback(async () => {
-    await userbase.cancelSubscription();
-    window.location.reload();
-  }, []);
-
-  const handleSubscriptionResumeClick = useCallback(async () => {
-    await userbase.resumeSubscription();
-    window.location.reload();
-  }, []);
-
-  const handlePaymentDetailsUpdateClick = useCallback(async () => {
-    await userbase.updatePaymentMethod({
-      successUrl: window.location.href,
-      cancelUrl: window.location.href,
-    });
-  }, []);
-
-  return (
-    <>
-      <Header />
-      <Title>Billing</Title>
-      <Hero>
-        <HeroText>
-          <Paragraph>Billing is simple.</Paragraph>
-          <Paragraph>
-            Below, you can easily cancel your subscription anytime and email me
-            to ask for a refund. You can also update your payment details.
-          </Paragraph>
-        </HeroText>
-      </Hero>
-      {hasValidSession ? (
-        hasValidSubscription ? (
-          <>
-            <Subtitle>Thank you so much for your support!</Subtitle>
-            <Paragraph>
-              You're currently paying{' '}
-              <strong>
-                {isSubscriptionMonthly ? '€2 / month' : '€18 / year'}
-              </strong>
-              .
-            </Paragraph>
-            <Button
-              onClick={handlePaymentDetailsUpdateClick}
-              type="primary"
-              width="large"
-              style={{ margin: '2rem auto 1rem' }}
-            >
-              Update payment details
-            </Button>
-            {!isSubscriptionCanceled ? (
-              <>
-                <Button
-                  onClick={handleSubscriptionCancelClick}
-                  type="delete"
-                  style={{ margin: '5rem auto 1rem' }}
-                >
-                  Cancel subscription
-                </Button>
-                <Paragraph isCentered>
-                  The subscription will be canceled at the end of the current
-                  billing period.
-                </Paragraph>
-              </>
-            ) : null}
-            {isSubscriptionCanceled ? (
-              <>
-                <Paragraph style={{ marginTop: '5rem' }}>
-                  Your subscription is currently set to be canceled at the end
-                  of the current billing period.
-                </Paragraph>
-                <Button
-                  onClick={handleSubscriptionResumeClick}
-                  type="secondary"
-                  width="large"
-                  style={{ margin: '2rem auto 1rem' }}
-                >
-                  Resume subscription
-                </Button>
-              </>
-            ) : null}
-          </>
-        ) : isTrialing ? (
-          <>
-            <Subtitle>Your are on an active trial!</Subtitle>
-            <Paragraph>
-              If you're ready to pay, you probably want to check out the{' '}
-              <Link href="/pricing">
-                <a>pricing section</a>
-              </Link>{' '}
-              instead.
-            </Paragraph>
-          </>
-        ) : (
-          <>
-            <Subtitle>Your subscription has expired!</Subtitle>
-            <Paragraph>
-              You probably want to check out the{' '}
-              <Link href="/pricing">
-                <a>pricing section</a>
-              </Link>{' '}
-              instead.
-            </Paragraph>
-          </>
-        )
-      ) : (
-        <>
-          <Subtitle>Signup or Login first</Subtitle>
-          <Paragraph>
-            Before you can pay, you need to{' '}
-            <Link href="/">
-              <a>Signup or Login</a>
-            </Link>{' '}
-            first.
-          </Paragraph>
-        </>
-      )}
-    </>
-  );
-};
-
-export default Billing;
diff --git a/components/Panels/Budgets.tsx b/components/Panels/Budgets.tsx
deleted file mode 100644
index 2adee4c..0000000
--- a/components/Panels/Budgets.tsx
+++ /dev/null
@@ -1,157 +0,0 @@
-import React, { useState } from 'react';
-import styled from 'styled-components';
-import moment from 'moment';
-
-import Budget from 'components/Budget';
-import Button from 'components/Button';
-import BudgetModal from 'components/BudgetModal';
-import { sortByMissingBudget, showNotification } from 'lib/utils';
-import { colors, fontSizes } from 'lib/constants';
-import * as T from 'lib/types';
-
-interface BudgetsProps extends T.PanelProps {}
-
-interface BudgetsToShow extends T.Budget {
-  expensesCost: number;
-}
-
-// user-agent sniffing sucks, but I couldn't figure out why this problem only happens on Safari (macOS and iOS)
-const safariFix =
-  typeof navigator !== 'undefined' &&
-  navigator.userAgent &&
-  navigator.userAgent.includes('Safari')
-    ? 'max-block-size: 100%;'
-    : '';
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  margin: 20px 10px;
-  max-height: 80vh;
-  overflow: auto;
-  ${safariFix}
-  width: 90vw;
-
-  @media only screen and (min-width: 800px) {
-    width: auto;
-    margin: 0 10px;
-  }
-`;
-
-const NoBudgetsFoundText = styled.p`
-  color: ${colors().secondaryText};
-  text-align: center;
-  align-items: center;
-  flex: 1;
-  display: flex;
-  font-size: ${fontSizes.text}px;
-`;
-
-const NoBudgetsFound = () => {
-  return (
-    <NoBudgetsFoundText>
-      No budgets found for this month.{'\n'}Add one below!
-    </NoBudgetsFoundText>
-  );
-};
-
-const defaultBudget = {
-  id: '',
-  name: '',
-  month: moment().startOf('month').format('YYYY-MM'),
-  value: 100,
-};
-
-const Budgets = ({
-  currency,
-  monthInView,
-  budgets,
-  expenses,
-  reloadData,
-}: BudgetsProps) => {
-  const [isBudgetModalOpen, setIsBudgetModalOpen] = useState(false);
-  const [chosenBudget, setChosenBudget] = useState({
-    ...defaultBudget,
-  });
-
-  const openBudgetModal = (budget?: T.Budget) => {
-    if (budget && budget.id === 'total') {
-      showNotification("Can't edit the budget Total", 'error');
-      return;
-    }
-
-    setIsBudgetModalOpen(true);
-    setChosenBudget({ ...(budget || defaultBudget) });
-  };
-
-  const closeBudgetModal = () => {
-    setIsBudgetModalOpen(false);
-    setChosenBudget({ ...defaultBudget });
-  };
-
-  let totalCost = 0;
-  let totalBudget = 0;
-
-  const budgetsToShow: BudgetsToShow[] = [...budgets]
-    .map((budget) => {
-      const budgetToShow = {
-        expensesCost: 0,
-        ...budget,
-      };
-
-      // Calculate expenses cost
-      expenses.forEach((expense) => {
-        if (expense.budget === budget.name) {
-          budgetToShow.expensesCost += expense.cost;
-        }
-      });
-
-      totalCost += budgetToShow.expensesCost;
-      totalBudget += budgetToShow.value;
-
-      return budgetToShow;
-    })
-    .sort(sortByMissingBudget);
-
-  // Add Total budget
-  if (budgetsToShow.length > 0) {
-    budgetsToShow.unshift({
-      id: 'total',
-      name: 'Total',
-      value: totalBudget,
-      expensesCost: totalCost,
-      month: monthInView,
-    });
-  }
-
-  return (
-    <Container>
-      {budgetsToShow.map((budget) => (
-        <Budget
-          key={budget.id}
-          {...budget}
-          currency={currency}
-          onClick={() => openBudgetModal(budget)}
-        />
-      ))}
-      {budgetsToShow.length === 0 && <NoBudgetsFound />}
-      <Button
-        onClick={() => openBudgetModal()}
-        type="primary"
-        style={{ margin: '20px 10px' }}
-      >
-        Add Budget
-      </Button>
-      <BudgetModal
-        key={chosenBudget.id}
-        isOpen={isBudgetModalOpen}
-        onClose={() => closeBudgetModal()}
-        reloadData={reloadData}
-        {...chosenBudget}
-      />
-    </Container>
-  );
-};
-
-export default Budgets;
diff --git a/components/Panels/EmailPassword.tsx b/components/Panels/EmailPassword.tsx
deleted file mode 100644
index 474d0fe..0000000
--- a/components/Panels/EmailPassword.tsx
+++ /dev/null
@@ -1,161 +0,0 @@
-import React, { useState, useCallback, useEffect } from 'react';
-import Link from 'next/link';
-import styled from 'styled-components';
-import userbase from 'userbase-js';
-import Swal from 'sweetalert2';
-
-import { Title, Subtitle, Paragraph } from 'components';
-import { Header } from 'components/Layout';
-import Button from 'components/Button';
-import TextInput from 'components/TextInput';
-import Loading from 'components/Loading';
-import { showNotification } from 'lib/utils';
-
-interface EmailPasswordProps {
-  hasValidSession: boolean;
-  currentEmail: string;
-}
-
-const Hero = styled.section`
-  @media only screen and (min-width: 600px) {
-    display: flex;
-    align-items: center;
-  }
-`;
-
-const HeroText = styled.section`
-  margin-right: 1em;
-`;
-
-const EmailPassword = ({
-  hasValidSession,
-  currentEmail,
-}: EmailPasswordProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [email, setEmail] = useState(currentEmail);
-  const [currentPassword, setCurrentPassword] = useState('');
-  const [newPassword, setNewPassword] = useState('');
-
-  const handleEmailChangeClick = useCallback(async () => {
-    setIsSubmitting(true);
-
-    try {
-      await userbase.updateUser({
-        username: email,
-        email,
-      });
-
-      window.location.reload();
-    } catch (error) {
-      showNotification(error, 'error');
-    }
-
-    setIsSubmitting(false);
-  }, [email]);
-
-  const handlePasswordChangeClick = useCallback(async () => {
-    setIsSubmitting(true);
-
-    try {
-      await userbase.updateUser({
-        currentPassword,
-        newPassword,
-      });
-
-      setCurrentPassword('');
-      setNewPassword('');
-    } catch (error) {
-      showNotification(error, 'error');
-    }
-
-    setIsSubmitting(false);
-
-    Swal.fire(
-      'Alright!',
-      "If your current password matched, it changed successfully and you'll need to login in other devices again.",
-      'success',
-    );
-  }, [currentPassword, newPassword]);
-
-  useEffect(() => {
-    setEmail(currentEmail);
-  }, [currentEmail]);
-
-  return (
-    <>
-      <Loading isShowing={isSubmitting} />
-      <Header />
-      <Title>Email and Password</Title>
-      <Hero>
-        <HeroText>
-          <Paragraph>Change your email or password.</Paragraph>
-          <Paragraph>
-            When you change either, you'll need to login in other devices again.
-          </Paragraph>
-        </HeroText>
-      </Hero>
-      {hasValidSession ? (
-        <>
-          <Paragraph>Change your email</Paragraph>
-          <TextInput
-            type="email"
-            label="Email"
-            name="email"
-            value={email}
-            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
-              setEmail(event.target.value)
-            }
-          />
-          <Button
-            onClick={handleEmailChangeClick}
-            width="large"
-            type="secondary"
-            style={{ margin: '5rem auto' }}
-          >
-            Change Email
-          </Button>
-          <Paragraph>Change your password / encryption key</Paragraph>
-          <TextInput
-            type="password"
-            label="Current Password / Encryption Key"
-            name="currentPassword"
-            value={currentPassword}
-            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
-              setCurrentPassword(event.target.value)
-            }
-          />
-          <TextInput
-            type="password"
-            label="New Password / Encryption Key"
-            name="newPassword"
-            value={newPassword}
-            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
-              setNewPassword(event.target.value)
-            }
-          />
-          <Button
-            onClick={handlePasswordChangeClick}
-            width="large"
-            type="secondary"
-            style={{ margin: '5rem auto' }}
-          >
-            Change Password / Encryption Key
-          </Button>
-        </>
-      ) : (
-        <>
-          <Subtitle>Signup or Login first</Subtitle>
-          <Paragraph>
-            Before you can change your email or password, you need to{' '}
-            <Link href="/">
-              <a>Signup or Login</a>
-            </Link>{' '}
-            first.
-          </Paragraph>
-        </>
-      )}
-    </>
-  );
-};
-
-export default EmailPassword;
diff --git a/components/Panels/Expenses.tsx b/components/Panels/Expenses.tsx
deleted file mode 100644
index cd8e33b..0000000
--- a/components/Panels/Expenses.tsx
+++ /dev/null
@@ -1,207 +0,0 @@
-import React, { useState } from 'react';
-import styled from 'styled-components';
-import moment from 'moment';
-
-import Expense from 'components/Expense';
-import ExpenseModal from 'components/ExpenseModal';
-import FilterBudgetModal from 'components/FilterBudgetModal';
-import IconButton from 'components/IconButton';
-import { colors, fontSizes } from 'lib/constants';
-import * as T from 'lib/types';
-
-interface ExpensesProps extends T.PanelProps {}
-
-// user-agent sniffing sucks, but I couldn't figure out why this problem only happens on Safari (macOS and iOS)
-const safariFix =
-  typeof navigator !== 'undefined' &&
-  navigator.userAgent &&
-  navigator.userAgent.includes('Safari')
-    ? 'max-block-size: 100%;'
-    : '';
-
-const Container = styled.section`
-  display: flex;
-  flex-direction: column;
-  flex: 1;
-  margin: 20px 10px;
-  max-height: 80vh;
-  overflow: auto;
-  ${safariFix}
-  width: 90vw;
-
-  @media only screen and (min-width: 800px) {
-    width: auto;
-    margin: 0;
-  }
-`;
-
-const FiltersContainer = styled.section`
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  margin: 20px auto 40px;
-`;
-
-const SearchInput = styled.input`
-  color: ${colors().inputField};
-  font-size: ${fontSizes.text}px;
-  font-weight: normal;
-  text-align: left;
-  border: 1px solid ${colors().secondaryBackground};
-  border-radius: 50px;
-  padding: 10px 10px 10px 15px;
-  flex: 1;
-  min-width: 75%;
-  outline: none;
-  &::-webkit-input-placeholder {
-    color: ${colors().inputPlaceholder};
-  }
-  &:hover,
-  &:focus,
-  &:active {
-    box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
-  }
-`;
-
-const NoExpensesFoundText = styled.p`
-  color: ${colors().secondaryText};
-  text-align: center;
-  align-items: center;
-  flex: 1;
-  display: flex;
-  font-size: ${fontSizes.text}px;
-`;
-
-type NoExpensesFoundProps = {
-  hasFiltersOrSearch: boolean;
-};
-
-const NoExpensesFound = (props: NoExpensesFoundProps) => {
-  return (
-    <>
-      {props.hasFiltersOrSearch ? (
-        <NoExpensesFoundText>
-          No expenses found matching those filters.{'\n'}Try changing them!
-        </NoExpensesFoundText>
-      ) : (
-        <NoExpensesFoundText>
-          No expenses found for this month.{'\n'}Go add one!
-        </NoExpensesFoundText>
-      )}
-    </>
-  );
-};
-
-const defaultExpense = {
-  id: '',
-  cost: 0,
-  description: '',
-  budget: '',
-  date: moment().format('YYYY-MM-DD'),
-};
-
-const Expenses = ({
-  expenses,
-  budgets,
-  currency,
-  reloadData,
-}: ExpensesProps) => {
-  const [filterExpenseDescription, setFilterExpenseDescription] = useState('');
-  const [filterBudgets, setFilterBudgets] = useState<Set<string>>(new Set());
-  const [isExpenseModalOpen, setIsExpenseModalOpen] = useState(false);
-  const [isFilterBudgetsModalOpen, setIsFilterBudgetsModalOpen] =
-    useState(false);
-  const [chosenExpense, setChosenExpense] = useState({ ...defaultExpense });
-
-  const openExpenseModal = (expense: T.Expense) => {
-    setIsExpenseModalOpen(true);
-    setChosenExpense({ ...expense });
-  };
-
-  const closeExpenseModal = () => {
-    setIsExpenseModalOpen(false);
-    setChosenExpense({ ...defaultExpense });
-  };
-
-  let expensesToShow = expenses;
-
-  if (filterExpenseDescription) {
-    expensesToShow = expensesToShow.filter((expense) =>
-      expense.description
-        .toLowerCase()
-        .includes(filterExpenseDescription.toLowerCase()),
-    );
-  }
-
-  if (filterBudgets.size > 0) {
-    expensesToShow = expensesToShow.filter((expense) =>
-      filterBudgets.has(expense.budget),
-    );
-  }
-
-  return (
-    <Container>
-      <FiltersContainer>
-        <SearchInput
-          type="search"
-          placeholder="Search for an expense"
-          onChange={(event) => setFilterExpenseDescription(event.target.value)}
-          value={filterExpenseDescription}
-          autoComplete="off"
-        />
-        <IconButton
-          icon="options"
-          size={32}
-          color={
-            filterBudgets.size > 0
-              ? colors().primaryButtonBackground
-              : colors().secondaryButtonBackground
-          }
-          onClick={() => setIsFilterBudgetsModalOpen(true)}
-        />
-      </FiltersContainer>
-      {expensesToShow.map((expense) => (
-        <Expense
-          key={expense.id}
-          {...expense}
-          currency={currency}
-          onClick={() => openExpenseModal(expense)}
-        />
-      ))}
-      {expensesToShow.length === 0 && (
-        <NoExpensesFound
-          hasFiltersOrSearch={
-            filterExpenseDescription.length > 0 || filterBudgets.size > 0
-          }
-        />
-      )}
-      <ExpenseModal
-        key={chosenExpense.id}
-        isOpen={isExpenseModalOpen}
-        onClose={() => closeExpenseModal()}
-        budgets={budgets}
-        reloadData={reloadData}
-        {...chosenExpense}
-      />
-      <FilterBudgetModal
-        isOpen={isFilterBudgetsModalOpen}
-        onClose={() => setIsFilterBudgetsModalOpen(false)}
-        onFilterBudgetToggle={(budgetName, newValue) => {
-          const newFilterBudgets = new Set(filterBudgets);
-          if (newValue) {
-            newFilterBudgets.add(budgetName);
-          } else {
-            newFilterBudgets.delete(budgetName);
-          }
-
-          setFilterBudgets(newFilterBudgets);
-        }}
-        budgets={budgets}
-        filterBudgets={filterBudgets}
-      />
-    </Container>
-  );
-};
-
-export default Expenses;
diff --git a/components/Panels/Login.tsx b/components/Panels/Login.tsx
deleted file mode 100644
index dfe60e8..0000000
--- a/components/Panels/Login.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-
-import { Title, Subtitle, Paragraph } from 'components';
-import { Header } from 'components/Layout';
-import LoginButton from 'modules/auth/LoginButton';
-
-const Hero = styled.section`
-  @media only screen and (min-width: 600px) {
-    display: flex;
-    align-items: center;
-  }
-`;
-
-const HeroText = styled.section`
-  margin-right: 1em;
-`;
-
-const Login = () => {
-  return (
-    <>
-      <Header />
-      <Title>Simple + Encrypted Budget Management</Title>
-      <Hero>
-        <HeroText>
-          <Paragraph>
-            Budget Zen is a simple and <strong>encrypted</strong> budget
-            management app. You can{' '}
-            <a href="https://budgetzen.net">learn more about it here</a>, as
-            this is the app.
-          </Paragraph>
-          <Paragraph>
-            Currently it's available on every device via web browser, and you
-            can browse its source code.
-          </Paragraph>
-          <Paragraph>
-            You have a <strong>30-day free trial</strong> (no credit card
-            required), and at the end, you can pay <strong>€18 / year</strong>,
-            or <strong>€2 / month</strong>, no limits.
-          </Paragraph>
-          <LoginButton />
-          <Paragraph>
-            Note that logging in will take up a few seconds. This is
-            intentional, in order to generate a safer assymetric encryption key.
-            After logging in, the app should be blazing fast in any device.
-          </Paragraph>
-        </HeroText>
-      </Hero>
-      <Subtitle>Need help?</Subtitle>
-      <Paragraph>
-        If you're having any issues or have any questions,{' '}
-        <strong>
-          <a href="mailto:me@brunobernardino.com">please reach out</a>
-        </strong>
-        .
-      </Paragraph>
-    </>
-  );
-};
-
-export default Login;
diff --git a/components/Panels/Navigation.tsx b/components/Panels/Navigation.tsx
deleted file mode 100644
index b2a960e..0000000
--- a/components/Panels/Navigation.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-
-import MonthNavigation from 'components/MonthNavigation';
-
-interface NavigationProps {
-  changeMonthInView: (month: string) => void;
-  monthInView: string;
-}
-
-const Container = styled.section`
-  display: block;
-  overflow: auto;
-`;
-
-const Navigation = ({ changeMonthInView, monthInView }: NavigationProps) => {
-  return (
-    <Container>
-      <MonthNavigation
-        currentMonth={monthInView}
-        handleChangeMonth={changeMonthInView}
-      />
-    </Container>
-  );
-};
-
-export default Navigation;
diff --git a/components/Panels/Pricing.tsx b/components/Panels/Pricing.tsx
deleted file mode 100644
index 4c90253..0000000
--- a/components/Panels/Pricing.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import React, { useCallback } from 'react';
-import Link from 'next/link';
-import styled from 'styled-components';
-import userbase from 'userbase-js';
-
-import { Title, Subtitle, Paragraph } from 'components';
-import { Header } from 'components/Layout';
-import Button from 'components/Button';
-
-interface PricingProps {
-  hasValidSession: boolean;
-  hasValidSubscription: boolean;
-  trialDaysLeft: number;
-}
-
-const Hero = styled.section`
-  @media only screen and (min-width: 600px) {
-    display: flex;
-    align-items: center;
-  }
-`;
-
-const HeroText = styled.section`
-  margin-right: 1em;
-`;
-
-const Pricing = ({
-  hasValidSession,
-  hasValidSubscription,
-  trialDaysLeft,
-}: PricingProps) => {
-  const handleMonthlySubscriptionClick = useCallback(async () => {
-    await userbase.purchaseSubscription({
-      successUrl: window.location.href,
-      cancelUrl: window.location.href,
-      priceId: 'budget-zen-v2-monthly',
-    });
-  }, []);
-
-  const handleYearlySubscriptionClick = useCallback(async () => {
-    await userbase.purchaseSubscription({
-      successUrl: window.location.href,
-      cancelUrl: window.location.href,
-      priceId: 'budget-zen-v2-annual',
-    });
-  }, []);
-
-  return (
-    <>
-      <Header />
-      <Title>Pricing</Title>
-      <Hero>
-        <HeroText>
-          <Paragraph>Pricing is simple.</Paragraph>
-          <Paragraph>
-            You have a <strong>30-day free trial</strong> (no credit card
-            required), and at the end, you can pay <strong>€18 / year</strong>,
-            or <strong>€2 / month</strong>, no limits.
-          </Paragraph>
-        </HeroText>
-      </Hero>
-      {hasValidSession ? (
-        hasValidSubscription ? (
-          <>
-            <Subtitle>You're already a customer!</Subtitle>
-            <Paragraph>
-              You probably want to check out the{' '}
-              <Link href="/billing">
-                <a>billing section</a>
-              </Link>{' '}
-              instead.
-            </Paragraph>
-          </>
-        ) : (
-          <>
-            <Paragraph isBold>
-              Your trial{' '}
-              {trialDaysLeft > 0
-                ? `will expire in ${trialDaysLeft} day${
-                    trialDaysLeft !== 1 ? 's' : ''
-                  }`
-                : 'has expired'}
-              .
-            </Paragraph>
-            <Button
-              onClick={handleMonthlySubscriptionClick}
-              type="secondary"
-              style={{ margin: '3rem auto 1.5rem' }}
-            >
-              Pay €2 / month
-            </Button>
-            <Button
-              onClick={handleYearlySubscriptionClick}
-              type="primary"
-              width="large"
-            >
-              Pay €18 / year
-            </Button>
-          </>
-        )
-      ) : (
-        <>
-          <Subtitle>Signup or Login first</Subtitle>
-          <Paragraph>
-            Before you can pay, you need to{' '}
-            <Link href="/">
-              <a>Signup or Login</a>
-            </Link>{' '}
-            first.
-          </Paragraph>
-        </>
-      )}
-    </>
-  );
-};
-
-export default Pricing;
diff --git a/components/Panels/Settings.tsx b/components/Panels/Settings.tsx
deleted file mode 100644
index 209c2f0..0000000
--- a/components/Panels/Settings.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import styled from 'styled-components';
-import Rodal from 'rodal';
-import Link from 'next/link';
-
-import SegmentedControl from 'components/SegmentedControl';
-import Button from 'components/Button';
-import IconButton from 'components/IconButton';
-import ImportExportModal from 'components/ImportExportModal';
-import Paragraph from 'components/Paragraph';
-import { colors, fontSizes } from 'lib/constants';
-import { updatePreferences, showNotification } from 'lib/utils';
-import * as T from 'lib/types';
-
-import appPackage from '../../package.json';
-
-interface SettingsProps {
-  currentCurrency: T.Currency;
-  updateCurrency: (currency: T.Currency) => void;
-  currentTheme: T.Theme;
-  updateTheme: (theme: T.Theme) => void;
-  setIsLoading: (isLoading: boolean) => void;
-  reloadData: () => Promise<void>;
-}
-
-// @ts-ignore manually added
-const { build: appBuild, version: appVersion } = appPackage;
-
-const SettingsButton = styled(IconButton)`
-  top: 8px;
-  right: 70px;
-  position: absolute;
-`;
-
-const Container = styled.section`
-  display: flex;
-  flex: 1;
-  justify-content: center;
-  align-items: stretch;
-  flex-direction: column;
-  background-color: ${colors().background};
-`;
-
-const Label = styled.span`
-  color: ${colors().inputLabel};
-  font-size: ${fontSizes.inputLabel}px;
-  font-weight: bold;
-  text-align: left;
-  margin-top: 38px;
-`;
-
-const StyledSegmentedControl = styled(SegmentedControl)`
-  margin: 15px auto 10px;
-  width: 96%;
-`;
-
-const BottomContainer = styled.section`
-  display: flex;
-  flex: 0.5;
-  flex-direction: column;
-`;
-
-const Version = styled.p`
-  color: ${colors().secondaryText};
-  font-size: ${fontSizes.smallText}px;
-  font-weight: normal;
-  text-align: center;
-  margin-top: 30px;
-`;
-
-const currencyLabels = ['$', '€', '£'];
-const currencyValues: T.Currency[] = ['USD', 'EUR', 'GBP'];
-
-const themeLabels = ['Light', 'Dark'];
-const themeValues: T.Theme[] = ['light', 'dark'];
-
-const Settings = ({
-  currentCurrency,
-  updateCurrency,
-  currentTheme,
-  updateTheme,
-  setIsLoading,
-  reloadData,
-}: SettingsProps) => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [isSettingsModalOpen, setIsSettingsModalOpen] = useState(false);
-  const [isImportExportModalOpen, setIsImportExportModalOpen] = useState(false);
-  const [currency, setCurrency] = useState(currentCurrency);
-  const [theme, setTheme] = useState(currentTheme);
-
-  useEffect(() => {
-    setCurrency(currentCurrency);
-  }, [currentCurrency]);
-
-  useEffect(() => {
-    setTheme(currentTheme);
-  }, [currentTheme]);
-
-  const saveCurrency = async (newCurrency: T.Currency) => {
-    if (isSubmitting) {
-      // Ignore sequential taps
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const success = updatePreferences(newCurrency, currentTheme);
-
-    if (success) {
-      updateCurrency(newCurrency);
-      return;
-    }
-
-    if (success) {
-      showNotification('Settings saved successfully.');
-    }
-  };
-
-  const saveTheme = async (newTheme: T.Theme) => {
-    if (isSubmitting) {
-      // Ignore sequential taps
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const success = updatePreferences(currentCurrency, newTheme);
-
-    if (success) {
-      updateTheme(newTheme);
-      return;
-    }
-
-    if (success) {
-      showNotification('Settings saved successfully.');
-    }
-  };
-
-  const selectedCurrencyIndex = currencyValues.findIndex(
-    (_currency) => currency === _currency,
-  );
-
-  const selectedThemeIndex = themeValues.findIndex(
-    (_theme) => theme === _theme,
-  );
-
-  return (
-    <>
-      <SettingsButton
-        icon="settings"
-        size={26}
-        color={colors().secondaryButtonBackground}
-        onClick={() => setIsSettingsModalOpen(true)}
-      />
-      <Rodal
-        visible={isSettingsModalOpen}
-        onClose={() => setIsSettingsModalOpen(false)}
-        animation="slideDown"
-      >
-        <Container>
-          <Label>Currency</Label>
-          <StyledSegmentedControl
-            values={currencyLabels}
-            selectedIndex={
-              selectedCurrencyIndex === -1 ? 0 : selectedCurrencyIndex
-            }
-            onChange={(selectedSegmentIndex: number) => {
-              setCurrency(currencyValues[selectedSegmentIndex]);
-              saveCurrency(currencyValues[selectedSegmentIndex]);
-            }}
-          />
-          <Label>Theme</Label>
-          <StyledSegmentedControl
-            values={themeLabels}
-            selectedIndex={selectedThemeIndex === -1 ? 0 : selectedThemeIndex}
-            onChange={(selectedSegmentIndex: number) => {
-              setTheme(themeValues[selectedSegmentIndex]);
-              saveTheme(themeValues[selectedSegmentIndex]);
-            }}
-          />
-          <Paragraph isCentered style={{ marginTop: '2rem' }}>
-            <Link href="/email-password">
-              <a>Change your email or password</a>
-            </Link>
-          </Paragraph>
-          <Paragraph isCentered>
-            <Link href="/billing">
-              <a>Manage billing</a>
-            </Link>
-          </Paragraph>
-          <BottomContainer>
-            <Version>
-              v{appVersion}-{appBuild}
-            </Version>
-            <Button
-              onClick={() => setIsImportExportModalOpen(true)}
-              type="secondary"
-              style={{
-                margin: '5px auto 10px',
-                alignSelf: 'center',
-              }}
-            >
-              Import or Export Data
-            </Button>
-            <Button
-              element="a"
-              href="mailto:help@budgetzen.net"
-              type="primary"
-              style={{
-                margin: '0 auto 10px',
-                alignSelf: 'center',
-              }}
-            >
-              Get Help
-            </Button>
-          </BottomContainer>
-          <ImportExportModal
-            isOpen={isImportExportModalOpen}
-            onClose={async () => {
-              setIsImportExportModalOpen(false);
-              await reloadData();
-            }}
-            setIsLoading={setIsLoading}
-          />
-        </Container>
-      </Rodal>
-    </>
-  );
-};
-
-export default Settings;
diff --git a/components/Paragraph.tsx b/components/Paragraph.tsx
deleted file mode 100644
index 5f6168f..0000000
--- a/components/Paragraph.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import styled from 'styled-components';
-
-type Props = {
-  isCentered?: boolean;
-  isBold?: boolean;
-};
-
-const Paragraph = styled.p.attrs({
-  className: 'common__line',
-})`
-  ${(props: Props) => (props.isCentered ? 'text-align: center;' : '')}
-  ${(props: Props) => (props.isBold ? 'font-weight: bold;' : '')}
-`;
-
-export default Paragraph;
diff --git a/components/SegmentedControl.tsx b/components/SegmentedControl.tsx
deleted file mode 100644
index d6d45ae..0000000
--- a/components/SegmentedControl.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-
-import { colors, fontSizes } from 'lib/constants';
-
-interface SegmentedControlProps {
-  values: string[];
-  selectedIndex: number;
-  onChange: (selectedSegmentIndex: number) => void;
-  className?: string;
-}
-
-const Container = styled.section`
-  display: flex;
-  flex: 1;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  color: ${colors().secondaryText};
-  background-color: ${colors().secondaryBackground};
-  border-radius: 5px;
-  padding: 3px;
-`;
-
-type SegmentProps = {
-  selected?: boolean;
-};
-
-const Segment = styled.button<SegmentProps>`
-  align-items: center;
-  border: none;
-  background-color: ${({ selected }) =>
-    selected ? colors().primaryButtonBackground : 'transparent'};
-  padding: 10px;
-  border-radius: 5px;
-  min-width: 33%;
-  color: ${({ selected }) =>
-    selected ? colors().primaryButtonText : 'inherit'};
-  font-size: ${fontSizes.button}px;
-  cursor: pointer;
-  outline: none;
-  &:hover,
-  &:focus,
-  &:active {
-    opacity: 0.8;
-  }
-`;
-
-const SegmentedControl = ({
-  values,
-  selectedIndex,
-  onChange,
-  className,
-}: SegmentedControlProps) => {
-  return (
-    <Container className={className}>
-      {values.map((value: string, index: number) => (
-        <Segment
-          key={`segment-${index}`}
-          selected={selectedIndex === index}
-          onClick={() => onChange(index)}
-        >
-          {value}
-        </Segment>
-      ))}
-    </Container>
-  );
-};
-
-export default SegmentedControl;
diff --git a/components/Subtitle.tsx b/components/Subtitle.tsx
deleted file mode 100644
index 96b3aed..0000000
--- a/components/Subtitle.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import styled from 'styled-components';
-
-const Subtitle = styled.h1.attrs({
-  className: 'common__line',
-})`
-  font-size: 2.5em;
-  font-weight: bold;
-  text-align: left;
-  line-height: 1.2em;
-  color: #666;
-  margin-top: 2em;
-
-  @media (prefers-color-scheme: dark) {
-    color: #f0f0f0;
-  }
-
-  &:after {
-    display: block;
-    content: ' ';
-    width: 1.5em;
-    height: 2px;
-    margin-top: 0.15em;
-    margin-bottom: 1em;
-    background-color: #666;
-
-    @media (prefers-color-scheme: dark) {
-      background-color: #f0f0f0;
-    }
-  }
-`;
-
-export default Subtitle;
diff --git a/components/TextInput/__snapshots__/test.tsx.snap b/components/TextInput/__snapshots__/test.tsx.snap
deleted file mode 100644
index be633cb..0000000
--- a/components/TextInput/__snapshots__/test.tsx.snap
+++ /dev/null
@@ -1,22 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`TextInput renders the input as expected 1`] = `
-<div
-  className=" TextInput"
->
-  <label
-    className="TextInput__label"
-    htmlFor="name"
-  >
-    Name
-  </label>
-  <input
-    className="TextInput__StyledInput-sc-7736i8-0 TextInput__input"
-    disabled={false}
-    id="name"
-    name="name"
-    type="text"
-    value="Bruno"
-  />
-</div>
-`;
diff --git a/components/TextInput/index.tsx b/components/TextInput/index.tsx
deleted file mode 100644
index c02cf14..0000000
--- a/components/TextInput/index.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React, { forwardRef } from 'react';
-import styled from 'styled-components';
-
-import styles from './styles.module.scss';
-
-interface TextInputProps {
-  label?: string;
-  name: string;
-  placeholder?: string;
-  isDisabled?: boolean;
-  type?: 'text' | 'email' | 'password' | 'url';
-  value: any;
-  onChange?: any;
-  onKeyDown?: any;
-  onClick?: any;
-  className?: string;
-  ref?: any;
-  id?: string;
-  note?: string;
-  title?: string;
-}
-
-const StyledInput = styled.input``;
-
-const TextInput: React.FC<TextInputProps> = forwardRef(
-  (props: TextInputProps, ref: any) => {
-    const { label, id, name, className, isDisabled, note, ...remainingProps } =
-      props;
-
-    return (
-      <div className={`${className || ''} ${styles.TextInput}`}>
-        {label ? (
-          <label className={styles.TextInput__label} htmlFor={id || name}>
-            {label}
-          </label>
-        ) : null}
-        <StyledInput
-          className={styles.TextInput__input}
-          disabled={isDisabled}
-          id={id || name}
-          name={name}
-          ref={ref}
-          {...remainingProps}
-        />
-        {note ? <p className={styles.TextInput__note}>{note}</p> : null}
-      </div>
-    );
-  },
-);
-
-TextInput.defaultProps = {
-  isDisabled: false,
-  type: 'text',
-};
-
-export default TextInput;
diff --git a/components/TextInput/styles.module.scss b/components/TextInput/styles.module.scss
deleted file mode 100644
index ec0f10d..0000000
--- a/components/TextInput/styles.module.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-@import 'styles/__variables';
-
-$transition-speed: 140ms;
-
-.TextInput {
-  &__label {
-    color: $color-text;
-    padding: 0.5rem 1rem 0.5rem 0.7rem;
-    border-left: 5px solid $color-block-border;
-    text-transform: uppercase;
-    font-weight: 500;
-    display: block;
-    font-size: 1.3rem;
-
-    @media (prefers-color-scheme: dark) {
-      color: $color-link-hover;
-    }
-    @at-root .theme-dark #{&} {
-      color: $color-link-hover;
-    }
-  }
-
-  &__input {
-    color: $color-text-gray;
-    font-size: 1.7rem;
-    margin: 0.5rem 0 1rem;
-    display: block;
-    text-align: left;
-    padding: 0.7rem 1.5rem;
-    border-radius: 5px;
-    font-weight: 500;
-    background: $color-white;
-    transition: all $transition-speed ease-in;
-    border: 1px solid $color-block-border;
-    width: calc(100% - 3rem);
-
-    &:hover,
-    &:focus {
-      border-color: $color-block-border;
-      outline: none;
-      box-shadow: 1px 1px 3px $color-block-border;
-    }
-  }
-
-  &__note {
-    color: $color-text-gray;
-    font-size: 0.8rem;
-    margin: 1rem 0 0;
-    display: block;
-    text-align: left;
-  }
-}
diff --git a/components/TextInput/test.tsx b/components/TextInput/test.tsx
deleted file mode 100644
index 420f987..0000000
--- a/components/TextInput/test.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-import renderer from 'react-test-renderer';
-import { mount } from 'enzyme';
-import expect from 'expect';
-import enzymify from 'expect-enzyme';
-
-import TextInput from './index';
-
-expect.extend(enzymify());
-
-describe('TextInput', () => {
-  // TODO: enzyme still doesn't work with React 17: https://github.com/enzymejs/enzyme/issues/2429
-  it.skip('renders the text input without errors', () => {
-    const wrapper = mount(
-      <TextInput label="Name" name="name" value="Bruno" onChange={() => {}} />,
-    );
-    expect(wrapper.find('input').props().value).toBe('Bruno');
-    expect(wrapper.find('label').text()).toBe('Name');
-  });
-
-  it('renders the input as expected', () => {
-    const tree = renderer
-      .create(<TextInput label="Name" name="name" value="Bruno" />)
-      .toJSON();
-    expect(tree).toMatchSnapshot();
-  });
-});
diff --git a/components/Title.tsx b/components/Title.tsx
deleted file mode 100644
index 06ec1b7..0000000
--- a/components/Title.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import styled from 'styled-components';
-
-const Title = styled.h1.attrs({
-  className: 'common__line',
-})`
-  font-size: 3.5em;
-  font-weight: bold;
-  text-align: left;
-  line-height: 1.2em;
-  color: #666;
-  margin-top: 1em;
-
-  @media (prefers-color-scheme: dark) {
-    color: #f0f0f0;
-  }
-
-  &:after {
-    display: block;
-    content: ' ';
-    width: 2em;
-    height: 3px;
-    margin-top: 0.15em;
-    margin-bottom: 1em;
-    background-color: #666;
-
-    @media (prefers-color-scheme: dark) {
-      background-color: #f0f0f0;
-    }
-  }
-`;
-
-export default Title;
diff --git a/components/footer.ts b/components/footer.ts
new file mode 100644
index 0000000..56d3f77
--- /dev/null
+++ b/components/footer.ts
@@ -0,0 +1,56 @@
+import { html } from '../lib/utils.ts';
+
+export default function footer() {
+  return html`
+    <footer>
+      <section class="faq">
+        <h3>Frequently asked questions</h3>
+        <div class="faq-items">
+          <article class="faq-item" data-has-invalid-session>
+            <h4>What is Budget Zen?</h4>
+            <p>
+              Simple and encrypted budget management.
+              <a href="https://budgetzen.net">Read more here</a>.
+            </p>
+          </article>
+          <article class="faq-item hidden" data-has-valid-session>
+            <h4>How can I import/export data?</h4>
+            <p>
+              <a href="/settings">In your settings</a>.
+            </p>
+          </article>
+          <article class="faq-item">
+            <h4>Where's the code for this web app?</h4>
+            <p>
+              <a href="https://github.com/BrunoBernardino/budgetzen-web">It's in GitHub</a>.
+            </p>
+          </article>
+          <article class="faq-item hidden" data-has-valid-session>
+            <h4>How can I change my email<br />or password / encryption key?</h4>
+            <p>
+              <a href="/settings">In your settings</a>.
+            </p>
+          </article>
+          <article class="faq-item hidden" data-has-valid-session>
+            <h4>How can I manage my subscription?</h4>
+            <p>
+              <a href="/billing">In your billing section</a>.
+            </p>
+          </article>
+          <article class="faq-item" data-has-invalid-session>
+            <h4>How can I subscribe?</h4>
+            <p>
+              <a href="/pricing">In the pricing section</a>.
+            </p>
+          </article>
+        </div>
+      </section>
+      <h3 class="links">
+        <a href="https://budgetzen.net/blog">Blog</a> | 
+        <a href="https://budgetzen.net/privacy">Privacy Policy</a> | 
+        <a href="mailto:me@brunobernardino.com">Get Help</a> | <span class="by">by</span> 
+        <a href="https://brunobernardino.com">Bruno Bernardino</a>
+      </h3>
+    </footer>
+  `;
+}
diff --git a/components/header.ts b/components/header.ts
new file mode 100644
index 0000000..f986c5b
--- /dev/null
+++ b/components/header.ts
@@ -0,0 +1,31 @@
+import { html } from '../lib/utils.ts';
+
+export default function header(currentPath: string) {
+  return html`
+    <header>
+      <section class="wrapper">
+        <h1>
+          <a href="/">
+            <img alt="Logo: stack of money notes with a 'B' on them and stylized letters Budget Zen below" src="/public/images/logo.svg" />
+          </a>
+        </h1>
+        <nav>
+          <ul>
+            <li data-has-valid-session class="hidden ${currentPath.includes('/settings') ? 'active' : ''}">
+              <a href="/settings">Settings</a>
+            </li>
+            <li data-has-valid-session class="hidden ${currentPath.includes('/billing') ? 'active' : ''}">
+              <a href="/billing">Billing</a>
+            </li>
+            <li class="${currentPath.includes('/pricing') ? 'active' : ''}">
+              <a href="/pricing">Pricing</a>
+            </li>
+            <li data-has-valid-session class="hidden">
+              <a onclick="window.app.doLogout();" style="cursor: pointer;">Logout</a>
+            </li>
+          </ul>
+        </nav>
+      </section>
+    </header>
+  `;
+}
diff --git a/components/index.ts b/components/index.ts
deleted file mode 100644
index d120167..0000000
--- a/components/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export { default as Loading } from './Loading';
-export { default as Title } from './Title';
-export { default as Subtitle } from './Subtitle';
-export { default as Paragraph } from './Paragraph';
-export { default as Button } from './Button';
-export { default as TextInput } from './TextInput';
diff --git a/components/Loading/index.tsx b/components/loading.ts
similarity index 70%
rename from components/Loading/index.tsx
rename to components/loading.ts
index bf48afb..49b59f7 100644
--- a/components/Loading/index.tsx
+++ b/components/loading.ts
@@ -1,16 +1,8 @@
-import styles from './styles.module.scss';
+import { html } from '../lib/utils.ts';
 
-interface LoadingProps {
-  isShowing?: boolean;
-}
-
-const Loading = ({ isShowing = false }: LoadingProps) => {
-  return (
-    <div
-      className={`${styles.Loading} ${
-        isShowing ? styles['Loading--show'] : ''
-      }`}
-    >
+export default function loading() {
+  return html`
+    <div id="loading">
       <svg
         version="1.1"
         id="loader-1"
@@ -24,7 +16,7 @@ const Loading = ({ isShowing = false }: LoadingProps) => {
         xmlSpace="preserve"
       >
         <path
-          fill="#000"
+          fill="#f0f0f0"
           d="M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z"
         >
           <animateTransform
@@ -39,7 +31,5 @@ const Loading = ({ isShowing = false }: LoadingProps) => {
         </path>
       </svg>
     </div>
-  );
-};
-
-export default Loading;
+  `;
+}
diff --git a/deno.json b/deno.json
new file mode 100644
index 0000000..660feee
--- /dev/null
+++ b/deno.json
@@ -0,0 +1,35 @@
+{
+  "fmt": {
+    "options": {
+      "useTabs": false,
+      "lineWidth": 120,
+      "indentWidth": 2,
+      "singleQuote": true,
+      "proseWrap": "preserve"
+    },
+    "files": {
+      "exclude": [
+        "public/js/stripe.js",
+        "public/js/sweetalert.js",
+        "public/js/userbase.js",
+        "public/js/userbase.js.map"
+      ]
+    }
+  },
+  "lint": {
+    "rules": {
+      "exclude": [
+        "no-explicit-any",
+        "no-window-prefix"
+      ]
+    },
+    "files": {
+      "exclude": [
+        "public/js/stripe.js",
+        "public/js/sweetalert.js",
+        "public/js/userbase.js",
+        "public/js/userbase.js.map"
+      ]
+    }
+  }
+}
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index 3c889fb..0000000
--- a/jest.config.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const TEST_REGEX = '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|js?|tsx?|ts?)$';
-
-module.exports = {
-  setupFiles: ['<rootDir>/jest.setup.js'],
-  testRegex: TEST_REGEX,
-  transform: {
-    '^.+\\.tsx?$': 'babel-jest',
-  },
-  testPathIgnorePatterns: ['<rootDir>/.next/', '<rootDir>/node_modules/'],
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
-  collectCoverage: false,
-  moduleNameMapper: {
-    '\\.(scss|sass|css)$': 'identity-obj-proxy',
-  },
-  moduleDirectories: ['node_modules', '.'],
-};
diff --git a/jest.setup.js b/jest.setup.js
deleted file mode 100644
index c07c082..0000000
--- a/jest.setup.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const Enzyme = require('enzyme');
-const Adapter = require('@wojtekmaj/enzyme-adapter-react-17');
-
-Enzyme.configure({ adapter: new Adapter() });
diff --git a/lib/constants.ts b/lib/constants.ts
deleted file mode 100644
index fd6527a..0000000
--- a/lib/constants.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { getUserInfo } from 'lib/utils';
-
-export const baseUrl = 'https://app.budgetzen.net';
-export const defaultTitle =
-  'Budget Zen — Simple and Encrypted Budget Management';
-export const defaultDescription = 'Simple and encryped budget management.';
-export const defaultKeywords =
-  'budget, zen, encrypted, e2ee, end-to-end, simple, app, web, android, linux, ios, macos';
-
-export const sessionNamespace = 'BudgetZen_v2_appSession';
-
-type Theme = 'dark' | 'light';
-
-export const colors = (theme: Theme = 'light') => {
-  const userInfo = getUserInfo();
-
-  if (typeof window !== 'undefined') {
-    if (
-      typeof window.matchMedia === 'function' &&
-      window.matchMedia('(prefers-color-scheme: dark)').matches
-    ) {
-      theme = 'dark';
-    }
-  }
-
-  if (
-    typeof document !== 'undefined' &&
-    typeof document.getElementsByTagName === 'function' &&
-    document.getElementsByTagName('body')[0].classList.contains('theme-dark')
-  ) {
-    theme = 'dark';
-  }
-
-  if (userInfo && userInfo.theme === 'dark') {
-    theme = 'dark';
-  }
-
-  return {
-    inputLabel: theme === 'dark' ? '#fff' : '#000',
-    inputField: theme === 'dark' ? '#666' : '#666',
-    inputPlaceholder: theme === 'dark' ? '#333' : '#ccc',
-    text: theme === 'dark' ? '#efefef' : '#333',
-    secondaryText: theme === 'dark' ? '#666' : '#999',
-    background: theme === 'dark' ? '#222' : '#fff',
-    secondaryBackground: theme === 'dark' ? '#333' : '#efefef',
-    alternateBackground: theme === 'dark' ? '#2f2f2f' : '#f9f9f9',
-    primaryButtonText: theme === 'dark' ? '#000' : '#fff',
-    primaryButtonBackground: theme === 'dark' ? '#fff' : '#000',
-    secondaryButtonText: theme === 'dark' ? '#000' : '#fff',
-    secondaryButtonBackground: theme === 'dark' ? '#999' : '#666',
-  };
-};
-
-export const fontSizes = {
-  inputLabel: 24,
-  inputField: 18,
-  label: 18,
-  text: 14,
-  mediumText: 15,
-  largeText: 18,
-  smallText: 12,
-  button: 18,
-};
diff --git a/lib/data-utils.ts b/lib/data-utils.ts
deleted file mode 100644
index a851d38..0000000
--- a/lib/data-utils.ts
+++ /dev/null
@@ -1,751 +0,0 @@
-import userbase from 'userbase-js';
-import Swal from 'sweetalert2';
-import moment from 'moment';
-
-import {
-  sortByName,
-  sortByDate,
-  splitArrayInChunks,
-  showNotification,
-} from './utils';
-import * as T from './types';
-
-const USERBASE_APP_ID = process.env.NEXT_PUBLIC_USERBASE_APP_ID;
-
-const cachedData: { budgets: T.Budget[]; expenses: T.Expense[] } = {
-  budgets: [],
-  expenses: [],
-};
-
-const hasFinishedLoading = {
-  budgets: false,
-  expenses: false,
-};
-
-const sessionLengthInHours = 90 * 24;
-
-export const validateLogin = async (email: string, password: string) => {
-  try {
-    await userbase.signIn({
-      username: email,
-      password,
-      sessionLength: sessionLengthInHours,
-      rememberMe: 'local',
-    });
-    return { success: true };
-  } catch (error) {
-    console.log(error);
-    return { success: false, error };
-  }
-};
-
-export const createAccount = async (email: string, password: string) => {
-  try {
-    await userbase.signUp({
-      username: email,
-      password,
-      sessionLength: sessionLengthInHours,
-      rememberMe: 'local',
-      email,
-    });
-    return { success: true };
-  } catch (error) {
-    console.log(error);
-    return { success: false, error };
-  }
-};
-
-const getBudgetFromItem = (item: userbase.Item) => {
-  try {
-    return {
-      id: item.itemId,
-      name: item.item.name,
-      month: item.item.month,
-      value: item.item.value,
-    } as T.Budget;
-  } catch (error) {
-    return null;
-  }
-};
-
-const getExpenseFromItem = (item: userbase.Item) => {
-  try {
-    return {
-      id: item.itemId,
-      cost: item.item.cost,
-      description: item.item.description,
-      budget: item.item.budget,
-      date: item.item.date,
-    } as T.Expense;
-  } catch (error) {
-    return null;
-  }
-};
-
-const loadItemsAsync = async () => {
-  await userbase.openDatabase({
-    databaseName: 'budgets',
-    changeHandler: async (items) => {
-      const budgets = items
-        .map(getBudgetFromItem)
-        .filter((budget) => Boolean(budget));
-
-      hasFinishedLoading.budgets = true;
-
-      cachedData.budgets = budgets;
-    },
-  });
-
-  await userbase.openDatabase({
-    databaseName: 'expenses',
-    changeHandler: (items) => {
-      const expenses = items
-        .map(getExpenseFromItem)
-        .filter((expense) => Boolean(expense));
-
-      hasFinishedLoading.expenses = true;
-
-      cachedData.expenses = expenses;
-    },
-  });
-};
-
-export const initializeDb = async () => {
-  try {
-    await userbase.init({
-      appId: USERBASE_APP_ID,
-      sessionLength: sessionLengthInHours,
-    });
-
-    await loadItemsAsync();
-  } catch (error) {
-    console.log(error);
-    showNotification(error, 'error');
-  }
-};
-
-export const fetchBudgets = async (month?: string) => {
-  try {
-    // Very ugly, but... works.
-    while (!hasFinishedLoading.budgets) {
-      await new Promise((resolve) => {
-        setTimeout(resolve, 100);
-      });
-    }
-
-    const budgets = cachedData.budgets
-      .filter((budget) => {
-        if (!month) {
-          return true;
-        }
-
-        if (budget.month === month) {
-          return true;
-        }
-
-        return false;
-      })
-      .sort(sortByName);
-
-    return budgets;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong fetching budgets.',
-    });
-
-    console.error(error);
-  }
-
-  return [];
-};
-
-export const fetchExpenses = async (month?: string) => {
-  try {
-    // Very ugly, but... works.
-    while (!hasFinishedLoading.expenses) {
-      await new Promise((resolve) => {
-        setTimeout(resolve, 100);
-      });
-    }
-
-    const expenses = cachedData.expenses
-      .filter((expense) => {
-        if (!month) {
-          return true;
-        }
-
-        if (expense.date >= `${month}-01` && expense.date <= `${month}-31`) {
-          return true;
-        }
-
-        return false;
-      })
-      .sort(sortByDate)
-      .reverse();
-
-    return expenses;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong fetching expenses.',
-    });
-
-    console.error(error);
-  }
-
-  return [];
-};
-
-export const saveBudget = async (budget: T.Budget) => {
-  try {
-    if (budget.name === 'Total') {
-      showNotification('Cannot create budget named "Total".', 'error');
-      return false;
-    }
-
-    if (budget.name.trim().length === 0) {
-      showNotification('The budget needs a valid name.', 'error');
-      return false;
-    }
-
-    if (budget.value <= 0 || Number.isNaN(budget.value)) {
-      showNotification('The budget needs a valid value.', 'error');
-      return false;
-    }
-
-    if (!moment(budget.month, 'YYYY-MM').isValid()) {
-      budget.month = moment().format('YYYY-MM');
-    }
-
-    // Check if the name is unique for the given month
-    const existingBudgetsInMonth = await fetchBudgets(budget.month);
-    const duplicateBudget = existingBudgetsInMonth.find(
-      (existingBudget) =>
-        existingBudget.name === budget.name && existingBudget.id !== budget.id,
-    );
-
-    if (duplicateBudget) {
-      showNotification(
-        'A budget with the same name for the same month already exists.',
-        'error',
-      );
-      return false;
-    }
-
-    if (budget.id === 'newBudget') {
-      budget.id = `${Date.now().toString()}:${Math.random()}`;
-
-      await userbase.insertItem({
-        databaseName: 'budgets',
-        item: {
-          name: budget.name,
-          value: budget.value,
-          month: budget.month,
-        } as T.BudgetContent,
-        itemId: budget.id,
-      });
-    } else {
-      const existingBudget = cachedData.budgets.find(
-        (_budget) => _budget.id === budget.id,
-      );
-      const oldName = existingBudget.name;
-      const newName = budget.name;
-
-      await userbase.updateItem({
-        databaseName: 'budgets',
-        item: {
-          name: budget.name,
-          value: budget.value,
-          month: existingBudget.month, // Don't allow changing a budget's month
-        } as T.BudgetContent,
-        itemId: budget.id,
-      });
-
-      const cachedBudgetIndex = cachedData.budgets.findIndex(
-        (_budget) => _budget.id === budget.id,
-      );
-      if (cachedBudgetIndex !== -1) {
-        cachedData.budgets[cachedBudgetIndex].name = budget.name;
-        cachedData.budgets[cachedBudgetIndex].value = budget.value;
-      }
-
-      // Update all expenses with the previous budget name to the new one, if it changed
-      if (oldName !== newName) {
-        const matchingExpenses = (
-          await fetchExpenses(existingBudget.month)
-        ).filter((expense) => expense.budget === oldName);
-
-        for (const expense of matchingExpenses) {
-          const cachedExpenseIndex = cachedData.expenses.findIndex(
-            (_expense) => _expense.id === expense.id,
-          );
-          if (cachedExpenseIndex !== -1) {
-            cachedData.expenses[cachedExpenseIndex].budget = newName;
-          }
-        }
-
-        const updateChunks: T.Expense[][] = splitArrayInChunks(
-          matchingExpenses,
-          10,
-        );
-
-        for (const machingExpensesChunk of updateChunks) {
-          await userbase.putTransaction({
-            databaseName: 'expenses',
-            operations: machingExpensesChunk.map((expense) => ({
-              command: 'Update',
-              item: {
-                cost: expense.cost,
-                description: expense.description,
-                budget: newName,
-                date: expense.date,
-              } as T.ExpenseContent,
-              itemId: expense.id,
-            })),
-          });
-        }
-      }
-    }
-
-    return true;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong saving that budget.',
-    });
-
-    console.error(error);
-  }
-
-  return false;
-};
-
-export const deleteBudget = async (budgetId: string) => {
-  try {
-    const existingBudget = cachedData.budgets.find(
-      (budget) => budget.id === budgetId,
-    );
-
-    // Check if the budget has no expenses, if so, don't delete
-    const matchingExpenses = (await fetchExpenses(existingBudget.month)).filter(
-      (expense) => expense.budget === existingBudget.name,
-    );
-
-    if (matchingExpenses.length > 0) {
-      // Check if there are duplicate budgets (can happen on slow sync)
-      const matchingBudgets = (await fetchBudgets(existingBudget.month)).filter(
-        (budget) => budget.name === existingBudget.name,
-      );
-
-      if (matchingBudgets.length === 1) {
-        showNotification(
-          "There are expenses using this budget. You can't delete a budget with expenses",
-          'error',
-        );
-        return false;
-      }
-    }
-
-    await userbase.deleteItem({
-      databaseName: 'budgets',
-      itemId: budgetId,
-    });
-
-    const cachedItemIndex = cachedData.budgets.findIndex(
-      (budget) => budget.id === budgetId,
-    );
-    if (cachedItemIndex !== -1) {
-      cachedData.budgets.splice(cachedItemIndex, 1);
-    }
-
-    return true;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong deleting that budget.',
-    });
-
-    console.error(error);
-  }
-
-  return false;
-};
-
-export const saveExpense = async (expense: T.Expense) => {
-  try {
-    if (!expense.cost || typeof expense.cost !== 'number') {
-      showNotification('Cost missing or invalid', 'error');
-      return false;
-    }
-
-    if (!expense.description || typeof expense.description !== 'string') {
-      showNotification('Description missing or invalid', 'error');
-      return false;
-    }
-
-    if (!expense.date || typeof expense.date !== 'string') {
-      expense.date = moment().format('YYYY-MM-DD');
-    }
-
-    // Check if there's an existing expense with a better budget
-    if (
-      (!expense.budget || expense.budget === 'Misc') &&
-      expense.id === 'newExpense'
-    ) {
-      const matchingExpense = (await fetchExpenses()).find(
-        (_expense) => _expense.description === expense.description,
-      );
-
-      if (matchingExpense && matchingExpense.budget) {
-        expense.budget = matchingExpense.budget;
-      }
-    }
-
-    if (!expense.budget || typeof expense.budget !== 'string') {
-      expense.budget = 'Misc';
-    }
-
-    // Check if the budget exists for the expense in that given month, otherwise create one
-    const existingBudget = (
-      await fetchBudgets(expense.date.substring(0, 7))
-    ).find((budget) => budget.name === expense.budget);
-
-    if (!existingBudget) {
-      const newBudgetId = `${Date.now().toString()}:${Math.random()}`;
-
-      await userbase.insertItem({
-        databaseName: 'budgets',
-        item: {
-          name: expense.budget,
-          month: expense.date.substring(0, 7),
-          value: 100,
-        } as T.BudgetContent,
-        itemId: newBudgetId,
-      });
-    }
-
-    if (expense.id === 'newExpense') {
-      expense.id = `${Date.now().toString()}:${Math.random()}`;
-
-      await userbase.insertItem({
-        databaseName: 'expenses',
-        item: {
-          cost: expense.cost,
-          budget: expense.budget,
-          description: expense.description,
-          date: expense.date,
-        } as T.ExpenseContent,
-        itemId: expense.id,
-      });
-    } else {
-      await userbase.updateItem({
-        databaseName: 'expenses',
-        item: {
-          cost: expense.cost,
-          description: expense.description,
-          budget: expense.budget,
-          date: expense.date,
-        } as T.ExpenseContent,
-        itemId: expense.id,
-      });
-
-      const cachedItemIndex = cachedData.expenses.findIndex(
-        (_expense) => _expense.id === expense.id,
-      );
-      if (cachedItemIndex !== -1) {
-        cachedData.expenses[cachedItemIndex].cost = expense.cost;
-        cachedData.expenses[cachedItemIndex].description = expense.description;
-        cachedData.expenses[cachedItemIndex].budget = expense.budget;
-        cachedData.expenses[cachedItemIndex].date = expense.date;
-      }
-    }
-
-    return true;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong saving that expense.',
-    });
-
-    console.error(error);
-  }
-
-  return false;
-};
-
-export const deleteExpense = async (expenseId: string) => {
-  try {
-    await userbase.deleteItem({
-      databaseName: 'expenses',
-      itemId: expenseId,
-    });
-
-    const cachedItemIndex = cachedData.expenses.findIndex(
-      (expense) => expense.id === expenseId,
-    );
-    if (cachedItemIndex !== -1) {
-      cachedData.expenses.splice(cachedItemIndex, 1);
-    }
-
-    return true;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong deleting that expense.',
-    });
-
-    console.error(error);
-  }
-
-  return false;
-};
-
-export const deleteAllData = async () => {
-  const budgets = await fetchBudgets();
-  const expenses = await fetchExpenses();
-
-  const deleteBudgetChunks: T.Budget[][] = splitArrayInChunks(budgets, 10);
-  const deleteExpenseChunks: T.Expense[][] = splitArrayInChunks(expenses, 10);
-
-  for (const budgetsToDelete of deleteBudgetChunks) {
-    await userbase.putTransaction({
-      databaseName: 'budgets',
-      operations: budgetsToDelete.map((budget) => ({
-        command: 'Delete',
-        itemId: budget.id,
-      })),
-    });
-
-    // Wait a second, to avoid hitting rate limits
-    await new Promise((resolve) => {
-      setTimeout(resolve, 1000);
-    });
-  }
-
-  for (const expensesToDelete of deleteExpenseChunks) {
-    await userbase.putTransaction({
-      databaseName: 'expenses',
-      operations: expensesToDelete.map((expense) => ({
-        command: 'Delete',
-        itemId: expense.id,
-      })),
-    });
-
-    // Wait a second, to avoid hitting rate limits
-    await new Promise((resolve) => {
-      setTimeout(resolve, 1000);
-    });
-  }
-
-  cachedData.budgets.length = 0;
-  cachedData.expenses.length = 0;
-  hasFinishedLoading.budgets = false;
-  hasFinishedLoading.expenses = false;
-};
-
-type ExportAllData = () => Promise<{
-  budgets?: T.Budget[];
-  expenses?: T.Expense[];
-}>;
-
-export const exportAllData: ExportAllData = async () => {
-  // Don't import anything until we're done with the first full load
-  if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
-    return {};
-  }
-
-  try {
-    const budgets = (await fetchBudgets()).sort(sortByName);
-    const expenses = (await fetchExpenses()).sort(sortByDate);
-
-    return { budgets, expenses };
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong exporting data.',
-    });
-
-    console.error(error);
-  }
-
-  return {};
-};
-
-export const importData = async (
-  replaceData: boolean,
-  budgets: T.Budget[],
-  expenses: T.Expense[],
-) => {
-  // Don't import anything until we're done with the first full load
-  if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
-    return false;
-  }
-
-  try {
-    if (replaceData) {
-      await deleteAllData();
-
-      await initializeDb();
-
-      // Very ugly, but... works.
-      while (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
-        await new Promise((resolve) => {
-          setTimeout(resolve, 100);
-        });
-      }
-    }
-
-    const finalBudgetsToAdd: T.Budget[] = [];
-
-    for (const budget of budgets) {
-      const newBudgetId = `${Date.now().toString()}:${Math.random()}`;
-      const newBudget: T.Budget = {
-        id: newBudgetId,
-        name: budget.name,
-        value: budget.value,
-        month: budget.month,
-      };
-
-      finalBudgetsToAdd.push(newBudget);
-    }
-
-    const addBudgetChunks: T.Budget[][] = splitArrayInChunks(
-      finalBudgetsToAdd,
-      10,
-    );
-
-    for (const budgetsToAdd of addBudgetChunks) {
-      await userbase.putTransaction({
-        databaseName: 'budgets',
-        operations: budgetsToAdd.map((budget) => ({
-          command: 'Insert',
-          item: {
-            name: budget.name,
-            value: budget.value,
-            month: budget.month,
-          } as T.BudgetContent,
-          itemId: budget.id,
-        })),
-      });
-
-      // Wait a second, to avoid hitting rate limits
-      await new Promise((resolve) => {
-        setTimeout(resolve, 1000);
-      });
-    }
-
-    const finalExpensesToAdd: T.Expense[] = [];
-
-    for (const expense of expenses) {
-      const newExpenseId = `${Date.now().toString()}:${Math.random()}`;
-      const newExpense: T.Expense = {
-        id: newExpenseId,
-        cost: expense.cost,
-        budget: expense.budget,
-        description: expense.description,
-        date: expense.date,
-      };
-
-      finalExpensesToAdd.push(newExpense);
-    }
-
-    const addExpenseChunks: T.Expense[][] = splitArrayInChunks(
-      finalExpensesToAdd,
-      10,
-    );
-
-    for (const expensesToAdd of addExpenseChunks) {
-      await userbase.putTransaction({
-        databaseName: 'expenses',
-        operations: expensesToAdd.map((expense) => ({
-          command: 'Insert',
-          item: {
-            cost: expense.cost,
-            budget: expense.budget,
-            description: expense.description,
-            date: expense.date,
-          } as T.ExpenseContent,
-          itemId: expense.id,
-        })),
-      });
-
-      // Wait a second, to avoid hitting rate limits
-      await new Promise((resolve) => {
-        setTimeout(resolve, 1000);
-      });
-    }
-
-    return true;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong importing data.',
-    });
-
-    console.error(error);
-  }
-
-  return false;
-};
-
-export const copyBudgets = async (
-  originalMonth: string,
-  destinationMonth: string,
-) => {
-  // Don't copy anything until we're done with the first full load
-  if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
-    return;
-  }
-
-  const originalBudgets = await fetchBudgets(originalMonth);
-  const destinationBudgets = originalBudgets.map((budget) => {
-    const newBudget: T.Budget = { ...budget };
-    newBudget.id = `${Date.now().toString()}:${Math.random()}`;
-    newBudget.month = destinationMonth;
-    return newBudget;
-  });
-  if (destinationBudgets.length > 0) {
-    try {
-      const finalBudgetsToAdd: T.Budget[] = [];
-
-      for (const budget of destinationBudgets) {
-        const newBudget: T.Budget = {
-          id: budget.id,
-          name: budget.name,
-          value: budget.value,
-          month: budget.month,
-        };
-
-        finalBudgetsToAdd.push(newBudget);
-      }
-
-      const addBudgetChunks: T.Budget[][] = splitArrayInChunks(
-        finalBudgetsToAdd,
-        10,
-      );
-
-      for (const budgetsToAdd of addBudgetChunks) {
-        await userbase.putTransaction({
-          databaseName: 'budgets',
-          operations: budgetsToAdd.map((budget) => ({
-            command: 'Insert',
-            item: {
-              name: budget.name,
-              value: budget.value,
-              month: budget.month,
-            } as T.BudgetContent,
-            itemId: budget.id,
-          })),
-        });
-      }
-    } catch (error) {
-      Swal.fire({
-        title: 'Uh-oh',
-        text: 'Something went wrong copying budgets.',
-      });
-
-      console.error(error);
-    }
-  }
-};
diff --git a/lib/types.ts b/lib/types.ts
deleted file mode 100644
index 0c07eca..0000000
--- a/lib/types.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-export interface PlainObject {
-  [key: string]: any;
-}
-
-export type Currency = 'USD' | 'EUR' | 'GBP';
-
-export type Theme = 'dark' | 'light';
-
-export interface AuthToken {
-  currency: Currency;
-  theme?: Theme;
-}
-
-export interface ExpenseContent {
-  cost: number;
-  description: string;
-  budget: string;
-  date: string;
-}
-
-export interface Expense extends ExpenseContent {
-  id: string;
-}
-
-export interface BudgetContent {
-  name: string;
-  month: string;
-  value: number;
-}
-
-export interface Budget extends BudgetContent {
-  id: string;
-}
-
-export interface PanelProps {
-  currency: Currency;
-  monthInView: string;
-  budgets: Budget[];
-  expenses: Expense[];
-  reloadData: () => Promise<void>;
-}
diff --git a/lib/utils.test.ts b/lib/utils.test.ts
deleted file mode 100644
index 624a54b..0000000
--- a/lib/utils.test.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { formatNumber, splitArrayInChunks } from './utils';
-
-describe('lib/utils', () => {
-  it('.formatNumber', () => {
-    const tests = [
-      { currency: 'USD', number: 10000, expected: '$10,000' },
-      { currency: 'USD', number: 10000.5, expected: '$10,000.5' },
-      { currency: 'EUR', number: 10000, expected: '€10,000' },
-      { currency: 'EUR', number: 900.999, expected: '€901' },
-      { currency: 'EUR', number: 900.991, expected: '€900.99' },
-      { currency: 'USD', number: 50.11, expected: '$50.11' },
-      { currency: 'GBP', number: 900.999, expected: '£901' },
-      { currency: 'GBP', number: 900.991, expected: '£900.99' },
-      { currency: 'GBP', number: 50.11, expected: '£50.11' },
-    ];
-
-    for (const test of tests) {
-      const result = formatNumber(test.currency, test.number);
-      expect(result).toEqual(test.expected);
-    }
-  });
-
-  it('.splitArrayInChunks', () => {
-    const tests = [
-      {
-        input: {
-          array: [
-            { number: 1 },
-            { number: 2 },
-            { number: 3 },
-            { number: 4 },
-            { number: 5 },
-            { number: 6 },
-          ],
-          chunkLength: 2,
-        },
-        expected: [
-          [{ number: 1 }, { number: 2 }],
-          [{ number: 3 }, { number: 4 }],
-          [{ number: 5 }, { number: 6 }],
-        ],
-      },
-      {
-        input: {
-          array: [
-            { number: 1 },
-            { number: 2 },
-            { number: 3 },
-            { number: 4 },
-            { number: 5 },
-          ],
-          chunkLength: 2,
-        },
-        expected: [
-          [{ number: 1 }, { number: 2 }],
-          [{ number: 3 }, { number: 4 }],
-          [{ number: 5 }],
-        ],
-      },
-      {
-        input: {
-          array: [
-            { number: 1 },
-            { number: 2 },
-            { number: 3 },
-            { number: 4 },
-            { number: 5 },
-            { number: 6 },
-          ],
-          chunkLength: 3,
-        },
-        expected: [
-          [{ number: 1 }, { number: 2 }, { number: 3 }],
-          [{ number: 4 }, { number: 5 }, { number: 6 }],
-        ],
-      },
-    ];
-
-    for (const test of tests) {
-      const result = splitArrayInChunks(
-        test.input.array,
-        test.input.chunkLength,
-      );
-      expect(result).toEqual(test.expected);
-    }
-  });
-});
diff --git a/lib/utils.ts b/lib/utils.ts
index 1e4f3ad..be3da2e 100644
--- a/lib/utils.ts
+++ b/lib/utils.ts
@@ -1,25 +1,118 @@
-import userbase from 'userbase-js';
-import Swal from 'sweetalert2';
+import 'https://deno.land/std@0.142.0/dotenv/load.ts';
 
-import { sessionNamespace } from 'lib/constants';
-import { AuthToken, Currency, Theme } from 'lib/types';
+import header from '../components/header.ts';
+import footer from '../components/footer.ts';
+import loading from '../components/loading.ts';
 
-const USERBASE_APP_ID = process.env.NEXT_PUBLIC_USERBASE_APP_ID;
-const sessionLengthInHours = 90 * 24;
+// This allows us to have nice html syntax highlighting in template literals
+export const html = String.raw;
 
-export const formatNumber = (currency: Currency, number: number) =>
-  new Intl.NumberFormat('en-US', {
+const USERBASE_APP_ID = Deno.env.get('USERBASE_APP_ID') || '';
+const sessionLengthInHours = 90 * 24; // 3 months
+
+export const baseUrl = 'https://app.budgetzen.net';
+export const defaultTitle = 'Budget Zen — Simple and end-to-end encrypted budget and expense manager';
+export const defaultDescription = 'Simple and end-to-end encrypted budget and expense manager.';
+
+export interface PageContentResult {
+  htmlContent: string;
+  titlePrefix?: string;
+  description?: string;
+}
+
+interface BasicLayoutOptions {
+  currentPath: string;
+  titlePrefix?: string;
+  description?: string;
+}
+
+function basicLayout(htmlContent: string, { currentPath, titlePrefix, description }: BasicLayoutOptions) {
+  let title = defaultTitle;
+
+  if (titlePrefix) {
+    title = `${titlePrefix} - Budget Zen`;
+  }
+
+  return html`
+    <!doctype html>
+    <html lang="en">
+    <head>
+      <meta charset="utf-8">
+      <meta name="viewport" content="width=device-width, initial-scale=1">
+      <title>${title}</title>
+      <meta name="description" content="${description || defaultDescription}">
+      <meta name="author" content="Bruno Bernardino">
+      <meta property="og:title" content="${title}" />
+      <link rel="icon" href="/public/images/favicon.png" type="image/png">
+      <link rel="apple-touch-icon" href="/public/images/favicon.png">
+      <link rel="stylesheet" href="/public/css/style.css">
+
+      <link rel="manifest" href="/public/manifest.json" />
+      
+      <link rel="alternate" type="application/rss+xml" href="https://budgetzen.net/rss.xml" />
+      <link rel="alternate" type="application/atom+xml" href="https://budgetzen.net/atom.xml" />
+      <link rel="alternate" type="application/feed+json" href="https://budgetzen.net/feed.json" />
+    </head>
+    <body>
+      ${loading()}
+      ${header(currentPath)}
+      <section class="wrapper" id="app-root">
+        ${htmlContent}
+      </section>
+      ${footer()}
+      <script type="text/javascript">
+        window.app = {};
+        window.app.userbaseConfig = {
+          appId: "${USERBASE_APP_ID}",
+          sessionLength: ${sessionLengthInHours},
+        };
+      </script>
+      <script src="/public/js/userbase.js"></script>
+      <script src="/public/js/script.js"></script>
+      <script src="/public/js/sweetalert.js" defer></script>
+      <script src="/public/js/stripe.js" defer></script>
+    </body>
+    </html>
+    `;
+}
+
+export function basicLayoutResponse(htmlContent: string, options: BasicLayoutOptions) {
+  return new Response(basicLayout(htmlContent, options), {
+    headers: {
+      'content-type': 'text/html; charset=utf-8',
+      'content-security-policy':
+        'default-src \'self\' https://*.userbase.com wss://*.userbase.com https://*.stripe.com https://stripe.com data: blob:; child-src \'self\' data: blob: https://*.stripe.com; img-src \'self\' data: blob: https://*.stripe.com; style-src \'self\' \'unsafe-inline\' https://*.stripe.com; script-src \'self\' \'unsafe-inline\' \'unsafe-eval\';',
+      'x-frame-options': 'DENY',
+      'strict-transport-security': 'max-age=31536000; includeSubDomains; preload',
+    },
+  });
+}
+
+export function isRunningLocally(urlPatternResult: URLPatternResult) {
+  return urlPatternResult.hostname.input === 'localhost';
+}
+
+// NOTE: The functions below are used in the frontend, but this copy allows for easier testing and type-checking
+
+export function escapeHtml(unsafe: string) {
+  return unsafe.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;')
+    .replaceAll('\'', '&#039;');
+}
+
+export function formatNumber(currency: string, number: number) {
+  return new Intl.NumberFormat('en-US', {
     style: 'currency',
     currency: currency || 'USD',
     minimumFractionDigits: 0,
     maximumFractionDigits: 2,
   }).format(number);
+}
 
 type SortableByDate = { date: string };
-export const sortByDate = (
+export function sortByDate(
   objectA: SortableByDate,
   objectB: SortableByDate,
-) => {
+) {
   if (objectA.date < objectB.date) {
     return -1;
   }
@@ -27,13 +120,27 @@ export const sortByDate = (
     return 1;
   }
   return 0;
-};
+}
+
+type SortableByCount = { count: number };
+export function sortByCount(
+  objectA: SortableByCount,
+  objectB: SortableByCount,
+) {
+  if (objectA.count < objectB.count) {
+    return 1;
+  }
+  if (objectA.count > objectB.count) {
+    return -1;
+  }
+  return 0;
+}
 
 type SortableByName = { name: string };
-export const sortByName = (
+export function sortByName(
   objectA: SortableByName,
   objectB: SortableByName,
-) => {
+) {
   const nameA = objectA.name.toUpperCase();
   const nameB = objectB.name.toUpperCase();
   if (nameA < nameB) {
@@ -43,165 +150,64 @@ export const sortByName = (
     return 1;
   }
   return 0;
-};
+}
 
 type SortableByMissingBudget = { expensesCost: number; value: number };
-export const sortByMissingBudget = (
+export function sortByMissingBudget(
   objectA: SortableByMissingBudget,
   objectB: SortableByMissingBudget,
-) => {
+) {
   const valueA = objectA.value - objectA.expensesCost;
   const valueB = objectB.value - objectB.expensesCost;
   return valueB - valueA;
-};
+}
 
-export const splitArrayInChunks = (array: any[], chunkLength: number) => {
+export function splitArrayInChunks(array: any[], chunkLength: number) {
   const chunks = [];
   let chunkIndex = 0;
   const arrayLength = array.length;
 
   while (chunkIndex < arrayLength) {
-    chunks.push(array.slice(chunkIndex, (chunkIndex += chunkLength)));
+    chunks.push(array.slice(chunkIndex, chunkIndex += chunkLength));
   }
 
   return chunks;
-};
+}
 
-export const uniqBy = (
+export function uniqueBy(
   array: any[],
   predicate: string | ((item: any) => any),
-) => {
-  const filter =
-    typeof predicate === 'function'
-      ? predicate
-      : (object: any) => object[predicate];
+) {
+  const filter = typeof predicate === 'function' ? predicate : (object: any) => object[predicate];
 
   return [
     ...array
       .reduce((map, item) => {
         const key = item === null || item === undefined ? item : filter(item);
 
-        // eslint-disable-next-line
         map.has(key) || map.set(key, item);
 
         return map;
       }, new Map())
       .values(),
   ];
-};
-
-export const showNotification = (
-  message: string,
-  type: 'success' | 'error' = 'success',
-) => {
-  const Toast = Swal.mixin({
-    toast: true,
-    position: 'top-end',
-    showConfirmButton: false,
-    timer: type === 'success' ? 2500 : 0,
-    timerProgressBar: type === 'success',
-    didOpen: (toast) => {
-      toast.addEventListener('mouseenter', Swal.stopTimer);
-      toast.addEventListener('mouseleave', Swal.resumeTimer);
-    },
-  });
-
-  Toast.fire({
-    icon: type,
-    title: message,
-  });
-};
-
-export const updatePreferences = (
-  currency: Currency = 'USD',
-  theme: Theme = 'light',
-) => {
-  const authToken: AuthToken = {
-    currency,
-    theme,
-  };
+}
 
+export async function recordPageView(pathname: string) {
   try {
-    localStorage.setItem(
-      `${sessionNamespace}:userInfo`,
-      JSON.stringify(authToken),
-    );
-    return true;
-  } catch (error) {
-    Swal.fire(
-      'Something went wrong!',
-      `Uh oh! Something wrong happened: ${error && error.message}`,
-      'error',
-    );
-  }
-
-  return false;
-};
-
-export const doLogout = async () => {
-  try {
-    localStorage.removeItem(`${sessionNamespace}:userInfo`);
-    await userbase.signOut();
-    return true;
-  } catch (error) {
-    Swal.fire(
-      'Something went wrong!',
-      `Uh oh! Something wrong happened: ${error && error.message}`,
-      'error',
-    );
-  }
-
-  return false;
-};
-
-export const isLoggedIn = async () => {
-  try {
-    const session = await userbase.init({
-      appId: USERBASE_APP_ID,
-      sessionLength: sessionLengthInHours,
+    await fetch('https://stats.onbrn.com/api/event', {
+      method: 'POST',
+      headers: {
+        'content-type': 'application/json; charset=utf-8',
+      },
+      body: JSON.stringify({
+        domain: baseUrl.replace('https://', ''),
+        name: 'pageview',
+        url: `${baseUrl}${pathname}`,
+      }),
     });
-    if (session.user) {
-      return true;
-    }
   } catch (error) {
-    // Do nothing
+    console.log('Failed to log pageview');
+    console.error(error);
   }
-
-  return false;
-};
-
-export const getUserSession = async () => {
-  try {
-    const session = await userbase.init({
-      appId: USERBASE_APP_ID,
-      sessionLength: sessionLengthInHours,
-    });
-    return session.user;
-  } catch (error) {
-    // Do nothing
-  }
-
-  return null;
-};
-
-type GetUserInfo = () => AuthToken;
-export const getUserInfo: GetUserInfo = () => {
-  const defaultAuthToken: AuthToken = {
-    currency: 'USD',
-    theme: 'light',
-  };
-
-  try {
-    const userInfo: AuthToken = JSON.parse(
-      localStorage.getItem(`${sessionNamespace}:userInfo`),
-    );
-    return userInfo || defaultAuthToken;
-  } catch (error) {
-    Swal.fire({
-      title: 'Uh-oh',
-      text: 'Something went wrong getting user info.',
-    });
-  }
-
-  return defaultAuthToken;
-};
+}
diff --git a/lib/utils_test.ts b/lib/utils_test.ts
new file mode 100644
index 0000000..c5b2a6b
--- /dev/null
+++ b/lib/utils_test.ts
@@ -0,0 +1,104 @@
+import { assertEquals } from 'https://deno.land/std@0.142.0/testing/asserts.ts';
+import { escapeHtml, formatNumber, splitArrayInChunks } from './utils.ts';
+
+Deno.test('that escapeHtml works', () => {
+  const tests = [
+    {
+      input: '<a href="https://brunobernardino.com">URL</a>',
+      expected: '&lt;a href=&quot;https://brunobernardino.com&quot;&gt;URL&lt;/a&gt;',
+    },
+    {
+      input: '"><img onerror=\'alert(1)\' />',
+      expected: '&quot;&gt;&lt;img onerror=&#039;alert(1)&#039; /&gt;',
+    },
+  ];
+
+  for (const test of tests) {
+    const output = escapeHtml(test.input);
+    assertEquals(output, test.expected);
+  }
+});
+
+Deno.test('that formatNumber works', () => {
+  const tests = [
+    { currency: 'USD', number: 10000, expected: '$10,000' },
+    { currency: 'USD', number: 10000.5, expected: '$10,000.5' },
+    { currency: 'EUR', number: 10000, expected: '€10,000' },
+    { currency: 'EUR', number: 900.999, expected: '€901' },
+    { currency: 'EUR', number: 900.991, expected: '€900.99' },
+    { currency: 'USD', number: 50.11, expected: '$50.11' },
+    { currency: 'GBP', number: 900.999, expected: '£901' },
+    { currency: 'GBP', number: 900.991, expected: '£900.99' },
+    { currency: 'GBP', number: 50.11, expected: '£50.11' },
+  ];
+
+  for (const test of tests) {
+    const result = formatNumber(test.currency, test.number);
+    assertEquals(result, test.expected);
+  }
+});
+
+Deno.test('that splitArrayInChunks works', () => {
+  const tests = [
+    {
+      input: {
+        array: [
+          { number: 1 },
+          { number: 2 },
+          { number: 3 },
+          { number: 4 },
+          { number: 5 },
+          { number: 6 },
+        ],
+        chunkLength: 2,
+      },
+      expected: [
+        [{ number: 1 }, { number: 2 }],
+        [{ number: 3 }, { number: 4 }],
+        [{ number: 5 }, { number: 6 }],
+      ],
+    },
+    {
+      input: {
+        array: [
+          { number: 1 },
+          { number: 2 },
+          { number: 3 },
+          { number: 4 },
+          { number: 5 },
+        ],
+        chunkLength: 2,
+      },
+      expected: [
+        [{ number: 1 }, { number: 2 }],
+        [{ number: 3 }, { number: 4 }],
+        [{ number: 5 }],
+      ],
+    },
+    {
+      input: {
+        array: [
+          { number: 1 },
+          { number: 2 },
+          { number: 3 },
+          { number: 4 },
+          { number: 5 },
+          { number: 6 },
+        ],
+        chunkLength: 3,
+      },
+      expected: [
+        [{ number: 1 }, { number: 2 }, { number: 3 }],
+        [{ number: 4 }, { number: 5 }, { number: 6 }],
+      ],
+    },
+  ];
+
+  for (const test of tests) {
+    const output = splitArrayInChunks(
+      test.input.array,
+      test.input.chunkLength,
+    );
+    assertEquals(output, test.expected);
+  }
+});
diff --git a/main.ts b/main.ts
new file mode 100644
index 0000000..a54c91e
--- /dev/null
+++ b/main.ts
@@ -0,0 +1,25 @@
+import { serve } from 'https://deno.land/std@0.142.0/http/server.ts';
+import routes, { Route } from './routes.ts';
+
+function handler(request: Request) {
+  const routeKeys = Object.keys(routes);
+
+  for (const routeKey of routeKeys) {
+    const route: Route = routes[routeKey];
+    const match = route.pattern.exec(request.url);
+
+    if (match) {
+      return route.handler(request, match);
+    }
+  }
+
+  return new Response('Not found', {
+    status: 404,
+  });
+}
+
+export const abortController = new AbortController();
+
+const PORT = Deno.env.get('PORT') || 8000;
+
+serve(handler, { port: PORT as number, signal: abortController.signal });
diff --git a/main_test.ts b/main_test.ts
new file mode 100644
index 0000000..69338aa
--- /dev/null
+++ b/main_test.ts
@@ -0,0 +1,25 @@
+import { assertEquals } from 'https://deno.land/std@0.142.0/testing/asserts.ts';
+import { abortController } from './main.ts';
+
+const baseUrl = 'http://localhost:8000';
+
+Deno.test({
+  name: 'HTTP Server',
+  fn: async () => {
+    let response = await fetch(`${baseUrl}/`);
+    assertEquals(response.status, 200);
+
+    let responseText = await response.text();
+    assertEquals(responseText.includes('Budget Zen'), true);
+
+    response = await fetch(`${baseUrl}/blah`);
+    assertEquals(response.status, 404);
+
+    responseText = await response.text();
+    assertEquals(responseText, 'Not found');
+
+    abortController.abort('Test finished');
+  },
+  sanitizeResources: false,
+  sanitizeOps: false,
+});
diff --git a/modules/auth/LoginButton.tsx b/modules/auth/LoginButton.tsx
deleted file mode 100644
index 3c1fcf6..0000000
--- a/modules/auth/LoginButton.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import { useCallback, useState } from 'react';
-import Swal from 'sweetalert2';
-
-import Loading from 'components/Loading';
-import Button from 'components/Button';
-import TextInput from 'components/TextInput';
-import Paragraph from 'components/Paragraph';
-import { validateLogin, createAccount } from 'lib/data-utils';
-import { showNotification, updatePreferences } from 'lib/utils';
-
-const LoginButton = () => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const [email, setEmail] = useState('');
-  const [password, setPassword] = useState('');
-  const handleLogin = useCallback(async () => {
-    if (!email || !password) {
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const { success, error } = await validateLogin(email, password);
-
-    if (success) {
-      Swal.fire(
-        'Alright!',
-        "That looks alright. Let's get on with it!",
-        'success',
-      );
-
-      updatePreferences();
-
-      window.location.reload();
-    } else {
-      if (error) {
-        showNotification(error, 'error');
-      }
-
-      setIsSubmitting(false);
-    }
-  }, [isSubmitting, email, password]);
-
-  const handleSignup = useCallback(async () => {
-    if (!email || !password) {
-      return;
-    }
-
-    setIsSubmitting(true);
-
-    const { success, error } = await createAccount(email, password);
-
-    if (success) {
-      Swal.fire(
-        'Alright!',
-        "That looks alright. Let's get on with it!",
-        'success',
-      );
-
-      window.location.reload();
-    } else {
-      if (error) {
-        showNotification(error, 'error');
-      }
-
-      setIsSubmitting(false);
-    }
-  }, [isSubmitting, email, password]);
-
-  return (
-    <>
-      <Loading isShowing={isSubmitting} />
-      <TextInput
-        type="email"
-        label="Email"
-        name="email"
-        value={email}
-        onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
-          setEmail(event.target.value)
-        }
-        onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
-          if (event.key === 'Enter') {
-            handleLogin();
-          }
-        }}
-        data-automation="login-email"
-      />
-      <TextInput
-        type="password"
-        label="Password / Encryption Key"
-        name="password"
-        value={password}
-        onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
-          setPassword(event.target.value)
-        }
-        onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
-          if (event.key === 'Enter') {
-            handleLogin();
-          }
-        }}
-        data-automation="login-password"
-      />
-      <Button
-        onClick={handleLogin}
-        width="large"
-        type="primary"
-        style={{ margin: '20px auto' }}
-        data-automation="login-button"
-      >
-        Login
-      </Button>
-      <Paragraph style={{ textAlign: 'center' }}>or</Paragraph>
-      <Button
-        onClick={handleSignup}
-        width="large"
-        type="secondary"
-        style={{ margin: '20px auto' }}
-      >
-        Signup
-      </Button>
-    </>
-  );
-};
-
-export default LoginButton;
diff --git a/modules/auth/LogoutLink.tsx b/modules/auth/LogoutLink.tsx
deleted file mode 100644
index 4b5eb35..0000000
--- a/modules/auth/LogoutLink.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { useCallback, useState } from 'react';
-import Swal from 'sweetalert2';
-import styled from 'styled-components';
-
-import Loading from 'components/Loading';
-import Button from 'components/Button';
-import { doLogout } from 'lib/utils';
-
-const Container = styled.div`
-  top: 8px;
-  right: 8px;
-  position: absolute;
-`;
-
-const LogoutLink = () => {
-  const [isSubmitting, setIsSubmitting] = useState(false);
-  const handleLogout = useCallback(async () => {
-    setIsSubmitting(true);
-
-    doLogout();
-
-    Swal.fire('Alright!', 'No idea who you are right now.', 'success');
-
-    window.location.reload();
-  }, [isSubmitting]);
-
-  return (
-    <Container>
-      <Loading isShowing={isSubmitting} />
-      <Button element="a" onClick={handleLogout} width="tiny">
-        Logout
-      </Button>
-    </Container>
-  );
-};
-
-export default LogoutLink;
diff --git a/next-env.d.ts b/next-env.d.ts
deleted file mode 100644
index 4f11a03..0000000
--- a/next-env.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-/// <reference types="next" />
-/// <reference types="next/image-types/global" />
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/next.config.js b/next.config.js
deleted file mode 100644
index 703597e..0000000
--- a/next.config.js
+++ /dev/null
@@ -1,53 +0,0 @@
-const path = require('path');
-const withPWA = require('next-pwa');
-
-const securityHeaders = [
-  {
-    key: 'X-Frame-Options',
-    value: 'DENY',
-  },
-  {
-    key: 'Content-Security-Policy',
-    value:
-      "default-src 'self' https://*.userbase.com wss://*.userbase.com https://*.stripe.com data: blob:; child-src 'self' data: blob: https://*.stripe.com; img-src 'self' data: blob: https://*.stripe.com; style-src 'self' 'unsafe-inline' https://*.stripe.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.stripe.com",
-  },
-  {
-    key: 'Strict-Transport-Security',
-    value: 'max-age=31536000; includeSubDomains; preload',
-  },
-];
-
-module.exports = withPWA({
-  pwa: {
-    dest: 'public',
-    register: true,
-    skipWaiting: true,
-  },
-  target: 'serverless',
-  sassLoaderOptions: {
-    includePaths: [
-      path.join(__dirname, 'styles'),
-      path.join(__dirname, 'node_modules'),
-    ],
-  },
-  webpack(config) {
-    config.resolve.alias.pages = path.join(__dirname, 'pages');
-    config.resolve.alias.components = path.join(__dirname, 'components');
-    config.resolve.alias.modules = path.join(__dirname, 'modules');
-    config.resolve.alias.lib = path.join(__dirname, 'lib');
-    config.resolve.alias.styles = path.join(__dirname, 'styles');
-    return config;
-  },
-  async headers() {
-    return [
-      {
-        source: '/',
-        headers: securityHeaders,
-      },
-      {
-        source: '/:path*',
-        headers: securityHeaders,
-      },
-    ];
-  },
-});
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index b9f12b6..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,24762 +0,0 @@
-{
-  "name": "budgetzen-app",
-  "version": "2.0.0",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "budgetzen-app",
-      "version": "2.0.0",
-      "license": "UNLICENSED",
-      "dependencies": {
-        "@types/node": "17.0.6",
-        "@types/react": "17.0.38",
-        "@types/react-dom": "17.0.11",
-        "@types/styled-components": "5.1.19",
-        "axios": "0.27.2",
-        "ky": "0.28.7",
-        "moment": "2.29.1",
-        "next": "12.0.7",
-        "next-pwa": "5.4.4",
-        "react": "17.0.2",
-        "react-dom": "17.0.2",
-        "react-helmet": "6.1.0",
-        "react-svg-ionicons": "0.2.3",
-        "react-toggle-switch": "3.0.4",
-        "react-use": "17.3.2",
-        "rodal": "1.8.1",
-        "sass": "1.45.2",
-        "styled-components": "5.3.3",
-        "sweetalert2": "11.3.3",
-        "typescript": "4.5.4",
-        "userbase-js": "2.8.0"
-      },
-      "devDependencies": {
-        "@types/enzyme": "3.10.11",
-        "@types/jest": "27.4.0",
-        "@types/react-helmet": "6.1.5",
-        "@typescript-eslint/eslint-plugin": "5.8.1",
-        "@typescript-eslint/parser": "5.8.1",
-        "@wojtekmaj/enzyme-adapter-react-17": "0.6.6",
-        "babel-core": "6.26.3",
-        "babel-eslint": "10.1.0",
-        "babel-jest": "27.4.5",
-        "babel-plugin-styled-components": "2.0.2",
-        "enzyme": "3.11.0",
-        "enzyme-adapter-react-16": "1.15.6",
-        "eslint": "8.6.0",
-        "eslint-config-airbnb": "19.0.4",
-        "eslint-config-prettier": "8.3.0",
-        "eslint-plugin-babel": "5.3.1",
-        "eslint-plugin-import": "2.25.3",
-        "eslint-plugin-jsx-a11y": "6.5.1",
-        "eslint-plugin-react": "7.28.0",
-        "expect": "27.4.2",
-        "expect-enzyme": "1.3.0",
-        "identity-obj-proxy": "3.0.0",
-        "jest": "27.4.5",
-        "prettier": "2.5.1",
-        "react-addons-test-utils": "15.6.2",
-        "react-test-renderer": "17.0.2",
-        "webpack": "5.65.0"
-      },
-      "engines": {
-        "node": "16.13.1",
-        "npm": "8.2.0"
-      }
-    },
-    "node_modules/@apideck/better-ajv-errors": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz",
-      "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==",
-      "dependencies": {
-        "json-schema": "^0.4.0",
-        "jsonpointer": "^5.0.0",
-        "leven": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "ajv": ">=8"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
-      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
-      "dependencies": {
-        "@babel/highlight": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.16.4",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
-      "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz",
-      "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==",
-      "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.7",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helpers": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.1.2",
-        "semver": "^6.3.0",
-        "source-map": "^0.5.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/babel"
-      }
-    },
-    "node_modules/@babel/core/node_modules/json5": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@babel/core/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz",
-      "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==",
-      "dependencies": {
-        "@babel/types": "^7.16.7",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
-      "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
-      "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
-      "dependencies": {
-        "@babel/helper-explode-assignable-expression": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
-      "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
-      "dependencies": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-validator-option": "^7.16.7",
-        "browserslist": "^4.17.5",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz",
-      "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
-      "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "regexpu-core": "^4.7.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz",
-      "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==",
-      "dependencies": {
-        "@babel/helper-compilation-targets": "^7.13.0",
-        "@babel/helper-module-imports": "^7.12.13",
-        "@babel/helper-plugin-utils": "^7.13.0",
-        "@babel/traverse": "^7.13.0",
-        "debug": "^4.1.1",
-        "lodash.debounce": "^4.0.8",
-        "resolve": "^1.14.2",
-        "semver": "^6.1.2"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.4.0-0"
-      }
-    },
-    "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
-      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-explode-assignable-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
-      "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
-      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
-      "dependencies": {
-        "@babel/helper-get-function-arity": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-get-function-arity": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
-      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
-      "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
-      "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
-      "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
-      "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
-      "dependencies": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
-      "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
-      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz",
-      "integrity": "sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-wrap-function": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-replace-supers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
-      "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
-      "dependencies": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
-      "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.16.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
-      "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
-      "dependencies": {
-        "@babel/types": "^7.16.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
-      "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
-      "dependencies": {
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
-      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
-      "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-wrap-function": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz",
-      "integrity": "sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw==",
-      "dependencies": {
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
-      "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
-      "dependencies": {
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
-      "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/chalk": {
-      "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"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "node_modules/@babel/highlight/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz",
-      "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==",
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
-      "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.13.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz",
-      "integrity": "sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.7",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-class-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
-      "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-class-static-block": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
-      "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.12.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-dynamic-import": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
-      "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
-      "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-json-strings": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
-      "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-json-strings": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
-      "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
-      "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-numeric-separator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
-      "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
-      "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
-      "dependencies": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
-      "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-private-methods": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz",
-      "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
-      "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
-      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=4"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-bigint": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-class-properties": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.12.13"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-class-static-block": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
-      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.3"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz",
-      "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-private-property-in-object": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
-      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-top-level-await": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
-      "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
-      "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz",
-      "integrity": "sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
-      "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
-      "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
-      "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
-      "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
-      "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
-      "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
-      "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
-      "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
-      "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
-      "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
-      "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
-      "dependencies": {
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
-      "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
-      "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
-      "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz",
-      "integrity": "sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w==",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
-      "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
-      "dependencies": {
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
-      "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz",
-      "integrity": "sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg==",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
-      "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
-      "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
-      "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
-      "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
-      "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
-      "dependencies": {
-        "regenerator-transform": "^0.14.2"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
-      "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
-      "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
-      "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
-      "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
-      "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
-      "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
-      "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
-      "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/preset-env": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz",
-      "integrity": "sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ==",
-      "dependencies": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-option": "^7.16.7",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-async-generator-functions": "^7.16.7",
-        "@babel/plugin-proposal-class-properties": "^7.16.7",
-        "@babel/plugin-proposal-class-static-block": "^7.16.7",
-        "@babel/plugin-proposal-dynamic-import": "^7.16.7",
-        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
-        "@babel/plugin-proposal-json-strings": "^7.16.7",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
-        "@babel/plugin-proposal-numeric-separator": "^7.16.7",
-        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-private-methods": "^7.16.7",
-        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-class-properties": "^7.12.13",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-        "@babel/plugin-syntax-top-level-await": "^7.14.5",
-        "@babel/plugin-transform-arrow-functions": "^7.16.7",
-        "@babel/plugin-transform-async-to-generator": "^7.16.7",
-        "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
-        "@babel/plugin-transform-block-scoping": "^7.16.7",
-        "@babel/plugin-transform-classes": "^7.16.7",
-        "@babel/plugin-transform-computed-properties": "^7.16.7",
-        "@babel/plugin-transform-destructuring": "^7.16.7",
-        "@babel/plugin-transform-dotall-regex": "^7.16.7",
-        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
-        "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
-        "@babel/plugin-transform-for-of": "^7.16.7",
-        "@babel/plugin-transform-function-name": "^7.16.7",
-        "@babel/plugin-transform-literals": "^7.16.7",
-        "@babel/plugin-transform-member-expression-literals": "^7.16.7",
-        "@babel/plugin-transform-modules-amd": "^7.16.7",
-        "@babel/plugin-transform-modules-commonjs": "^7.16.7",
-        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
-        "@babel/plugin-transform-modules-umd": "^7.16.7",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.7",
-        "@babel/plugin-transform-new-target": "^7.16.7",
-        "@babel/plugin-transform-object-super": "^7.16.7",
-        "@babel/plugin-transform-parameters": "^7.16.7",
-        "@babel/plugin-transform-property-literals": "^7.16.7",
-        "@babel/plugin-transform-regenerator": "^7.16.7",
-        "@babel/plugin-transform-reserved-words": "^7.16.7",
-        "@babel/plugin-transform-shorthand-properties": "^7.16.7",
-        "@babel/plugin-transform-spread": "^7.16.7",
-        "@babel/plugin-transform-sticky-regex": "^7.16.7",
-        "@babel/plugin-transform-template-literals": "^7.16.7",
-        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
-        "@babel/plugin-transform-unicode-escapes": "^7.16.7",
-        "@babel/plugin-transform-unicode-regex": "^7.16.7",
-        "@babel/preset-modules": "^0.1.5",
-        "@babel/types": "^7.16.7",
-        "babel-plugin-polyfill-corejs2": "^0.3.0",
-        "babel-plugin-polyfill-corejs3": "^0.4.0",
-        "babel-plugin-polyfill-regenerator": "^0.3.0",
-        "core-js-compat": "^3.19.1",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/preset-env/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/preset-modules": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
-      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
-      "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
-      "dependencies": {
-        "regenerator-runtime": "^0.13.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/runtime-corejs3": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.7.tgz",
-      "integrity": "sha512-MiYR1yk8+TW/CpOD0CyX7ve9ffWTKqLk/L6pk8TPl0R8pNi+1pFY8fH9yET55KlvukQ4PAWfXsGr2YHVjcI4Pw==",
-      "dev": true,
-      "dependencies": {
-        "core-js-pure": "^3.19.0",
-        "regenerator-runtime": "^0.13.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": {
-      "version": "0.13.9",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
-      "dev": true
-    },
-    "node_modules/@babel/runtime/node_modules/regenerator-runtime": {
-      "version": "0.13.9",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
-    },
-    "node_modules/@babel/template": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
-      "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
-      "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz",
-      "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==",
-      "dependencies": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/types": "^7.16.7",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz",
-      "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "to-fast-properties": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@bcoe/v8-coverage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-      "dev": true
-    },
-    "node_modules/@emotion/is-prop-valid": {
-      "version": "0.8.8",
-      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
-      "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
-      "dependencies": {
-        "@emotion/memoize": "0.7.4"
-      }
-    },
-    "node_modules/@emotion/memoize": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
-      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
-    },
-    "node_modules/@emotion/stylis": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
-      "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
-    },
-    "node_modules/@emotion/unitless": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
-      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
-    },
-    "node_modules/@eslint/eslintrc": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
-      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^9.2.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
-    },
-    "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "13.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@hapi/accept": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz",
-      "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==",
-      "dependencies": {
-        "@hapi/boom": "9.x.x",
-        "@hapi/hoek": "9.x.x"
-      }
-    },
-    "node_modules/@hapi/boom": {
-      "version": "9.1.4",
-      "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
-      "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
-      "dependencies": {
-        "@hapi/hoek": "9.x.x"
-      }
-    },
-    "node_modules/@hapi/hoek": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz",
-      "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw=="
-    },
-    "node_modules/@humanwhocodes/config-array": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
-      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
-      "dev": true,
-      "dependencies": {
-        "@humanwhocodes/object-schema": "^1.2.1",
-        "debug": "^4.1.1",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=10.10.0"
-      }
-    },
-    "node_modules/@humanwhocodes/object-schema": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
-      "dev": true
-    },
-    "node_modules/@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@istanbuljs/schema": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/console": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz",
-      "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^27.4.2",
-        "jest-util": "^27.4.2",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/console/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@jest/console/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@jest/console/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/console/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/console/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/console/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/core": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz",
-      "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^27.4.2",
-        "@jest/reporters": "^27.4.5",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "emittery": "^0.8.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-changed-files": "^27.4.2",
-        "jest-config": "^27.4.5",
-        "jest-haste-map": "^27.4.5",
-        "jest-message-util": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-resolve-dependencies": "^27.4.5",
-        "jest-runner": "^27.4.5",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "jest-watcher": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "rimraf": "^3.0.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@jest/core/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/core/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@jest/core/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@jest/core/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/core/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/core/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/core/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/core/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/environment": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz",
-      "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/fake-timers": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz",
-      "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "@sinonjs/fake-timers": "^8.0.1",
-        "@types/node": "*",
-        "jest-message-util": "^27.4.2",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/globals": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz",
-      "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^27.4.4",
-        "@jest/types": "^27.4.2",
-        "expect": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/reporters": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz",
-      "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==",
-      "dev": true,
-      "dependencies": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^27.4.2",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.2.4",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.0.2",
-        "jest-haste-map": "^27.4.5",
-        "jest-resolve": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.0",
-        "string-length": "^4.0.1",
-        "terminal-link": "^2.0.0",
-        "v8-to-istanbul": "^8.1.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.7.5",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.0.0",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@jest/reporters/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/source-map": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz",
-      "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.4",
-        "source-map": "^0.6.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/source-map/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@jest/test-result": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz",
-      "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/test-sequencer": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz",
-      "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/test-result": "^27.4.2",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-runtime": "^27.4.5"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/transform": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz",
-      "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.1.0",
-        "@jest/types": "^27.4.2",
-        "babel-plugin-istanbul": "^6.0.0",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^1.4.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-regex-util": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "pirates": "^4.0.1",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.1",
-        "write-file-atomic": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/transform/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@jest/transform/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jest/types": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz",
-      "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^16.0.0",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@jest/types/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@jest/types/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@jest/types/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@jest/types/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@jest/types/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jsbits/get-package-version": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@jsbits/get-package-version/-/get-package-version-1.0.3.tgz",
-      "integrity": "sha512-IJy1jRL01x7p6UEpgKa1lVLstMUx8EiIR8pPoS5sBfsHEoeLkzYiNpAfxPx8zLDUJyS1yBbChJjcWdPqyH285w==",
-      "engines": {
-        "node": ">=4.2"
-      }
-    },
-    "node_modules/@napi-rs/triples": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz",
-      "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA=="
-    },
-    "node_modules/@next/env": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.7.tgz",
-      "integrity": "sha512-TNDqBV37wd95SiNdZsSUq8gnnrTwr+aN9wqy4Zxrxw4bC/jCHNsbK94DxjkG99VL30VCRXXDBTA1/Wa2jIpF9Q=="
-    },
-    "node_modules/@next/polyfill-module": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.7.tgz",
-      "integrity": "sha512-sA8LAMMlmcspIZw/jeQuJTyA3uGrqOhTBaQE+G9u6DPohqrBFRkaz7RzzJeqXkUXw600occsIBknSjyVd1R67A=="
-    },
-    "node_modules/@next/react-dev-overlay": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.7.tgz",
-      "integrity": "sha512-dSQLgpZ5uzyittFtIHlJCLAbc0LlMFbRBSYuGsIlrtGyjYN+WMcnz8lK48VLxNPFGuB/hEzkWV4TW5Zu75+Fzg==",
-      "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.3",
-        "source-map": "0.8.0-beta.0",
-        "stacktrace-parser": "0.1.10",
-        "strip-ansi": "6.0.1"
-      },
-      "peerDependencies": {
-        "react": "^17.0.2",
-        "react-dom": "^17.0.2",
-        "webpack": "^4 || ^5"
-      },
-      "peerDependenciesMeta": {
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/@babel/code-frame": {
-      "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"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/ansi-styles": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/chalk": {
-      "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"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/color-convert": {
-      "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"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/source-map": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/supports-color": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/tr46": {
-      "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"
-      }
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/webidl-conversions": {
-      "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=="
-    },
-    "node_modules/@next/react-dev-overlay/node_modules/whatwg-url": {
-      "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"
-      }
-    },
-    "node_modules/@next/react-refresh-utils": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.7.tgz",
-      "integrity": "sha512-Pglj1t+7RxH0txEqVcD8ZxrJgqLDmKvQDqxKq3ZPRWxMv7LTl7FVT2Pnb36QFeBwCvMVl67jxsADKsW0idz8sA==",
-      "peerDependencies": {
-        "react-refresh": "0.8.3",
-        "webpack": "^4 || ^5"
-      },
-      "peerDependenciesMeta": {
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@next/swc-android-arm64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.7.tgz",
-      "integrity": "sha512-yViT7EEc7JqxncRT+ZTeTsrAYXLlcefo0Y0eAfYmmalGD2605L4FWAVrJi4WnrSLji7l+veczw1WBmNeHICKKA==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-darwin-arm64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.7.tgz",
-      "integrity": "sha512-vhAyW2rDEUcQesRVaj0z1hSoz7QhDzzGd0V1/5/5i9YJOfOtyrPsVJ82tlf7BfXl6/Ep+eKNfWVIb5/Jv89EKg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-darwin-x64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.7.tgz",
-      "integrity": "sha512-km+6Rx6TvbraoQ1f0MXa69ol/x0RxzucFGa2OgZaYJERas0spy0iwW8hpASsGcf597D8VRW1x+R2C7ZdjVBSTw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-linux-arm-gnueabihf": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.7.tgz",
-      "integrity": "sha512-d0zWr877YqZ2cf/DQy6obouaR39r0FPebcXj2nws9AC99m68CO2xVpWv9jT7mFvpY+T40HJisLH80jSZ2iQ9sA==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-linux-arm64-gnu": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.7.tgz",
-      "integrity": "sha512-fdobh5u6gG13Gd5LkHhJ+W8tF9hbaFolRW99FhzArMe5/nMKlLdBymOxvitE3K4gSFQxbXJA6TbU0Vv0e59Kww==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-linux-arm64-musl": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.7.tgz",
-      "integrity": "sha512-vx0c5Q3oIScFNT/4jI9rCe0yPzKuCqWOkiO/OOV0ixSI2gLhbrwDIcdkm79fKVn3i8JOJunxE4zDoFeR/g8xqQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-linux-x64-gnu": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.7.tgz",
-      "integrity": "sha512-9ITyp6s6uGVKNx3C/GP7GrYycbcwTADG7TdIXzXUxOOZORrdB1GNg3w/EL3Am4VMPPEpO6v1RfKo2IKZpVKfTA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-linux-x64-musl": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.7.tgz",
-      "integrity": "sha512-C+k+cygbIZXYfc+Hx2fNPUBEg7jzio+mniP5ywZevuTXW14zodIfQ3ZMoMJR8EpOVvYpjWFk2uAjiwqgx8vo/g==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-win32-arm64-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.7.tgz",
-      "integrity": "sha512-7jTRjOKkDVnb5s7VoHT7eX+eyT/5BQJ/ljP2G56riAgKGqPL63/V7FXemLhhLT67D+OjoP8DRA2E2ne6IPHk4w==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-win32-ia32-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.7.tgz",
-      "integrity": "sha512-2u5pGDsk7H6gGxob2ATIojzlwKzgYsrijo7RRpXOiPePVqwPWg6/pmhaJzLdpfjaBgRg1NFmwSp/7Ump9X8Ijg==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@next/swc-win32-x64-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.7.tgz",
-      "integrity": "sha512-frEWtbf+q8Oz4e2UqKJrNssk6DZ6/NLCQXn5/ORWE9dPAfe9XS6aK5FRZ6DuEPmmKd5gOoRkKJFFz5nYd+TeyQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@rollup/plugin-babel": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
-      "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.10.4",
-        "@rollup/pluginutils": "^3.1.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0",
-        "@types/babel__core": "^7.1.9",
-        "rollup": "^1.20.0||^2.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/babel__core": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "11.2.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
-      "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
-      "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
-      }
-    },
-    "node_modules/@rollup/plugin-replace": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
-      "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
-      "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "magic-string": "^0.25.7"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0 || ^2.0.0"
-      }
-    },
-    "node_modules/@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
-      "dependencies": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
-      }
-    },
-    "node_modules/@sinonjs/commons": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-      "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
-      "dev": true,
-      "dependencies": {
-        "type-detect": "4.0.8"
-      }
-    },
-    "node_modules/@sinonjs/commons/node_modules/type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@sinonjs/fake-timers": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
-      "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
-      "dev": true,
-      "dependencies": {
-        "@sinonjs/commons": "^1.7.0"
-      }
-    },
-    "node_modules/@surma/rollup-plugin-off-main-thread": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
-      "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
-      "dependencies": {
-        "ejs": "^3.1.6",
-        "json5": "^2.2.0",
-        "magic-string": "^0.25.0",
-        "string.prototype.matchall": "^4.0.6"
-      }
-    },
-    "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/json5": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@tootallnate/once": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/@types/babel__core": {
-      "version": "7.1.18",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz",
-      "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==",
-      "devOptional": true,
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "node_modules/@types/babel__generator": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
-      "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
-      "devOptional": true,
-      "dependencies": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__template": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
-      "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
-      "devOptional": true,
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__traverse": {
-      "version": "7.14.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
-      "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
-      "devOptional": true,
-      "dependencies": {
-        "@babel/types": "^7.3.0"
-      }
-    },
-    "node_modules/@types/cheerio": {
-      "version": "0.22.30",
-      "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz",
-      "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/enzyme": {
-      "version": "3.10.11",
-      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.11.tgz",
-      "integrity": "sha512-LEtC7zXsQlbGXWGcnnmOI7rTyP+i1QzQv4Va91RKXDEukLDaNyxu0rXlfMiGEhJwfgTPCTb0R+Pnlj//oM9e/w==",
-      "dev": true,
-      "dependencies": {
-        "@types/cheerio": "*",
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/eslint": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz",
-      "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==",
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.2.tgz",
-      "integrity": "sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ==",
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
-    },
-    "node_modules/@types/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
-      "dependencies": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/graceful-fs": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-      "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/hoist-non-react-statics": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
-      "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
-      "dependencies": {
-        "@types/react": "*",
-        "hoist-non-react-statics": "^3.3.0"
-      }
-    },
-    "node_modules/@types/istanbul-lib-coverage": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-      "dev": true
-    },
-    "node_modules/@types/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "*"
-      }
-    },
-    "node_modules/@types/istanbul-reports": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/@types/jest": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
-      "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
-      "dev": true,
-      "dependencies": {
-        "jest-diff": "^27.0.0",
-        "pretty-format": "^27.0.0"
-      }
-    },
-    "node_modules/@types/js-cookie": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
-      "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.9",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
-    },
-    "node_modules/@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
-    },
-    "node_modules/@types/minimatch": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
-      "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
-    },
-    "node_modules/@types/node": {
-      "version": "17.0.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.6.tgz",
-      "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA=="
-    },
-    "node_modules/@types/prettier": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz",
-      "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==",
-      "dev": true
-    },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.4",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
-      "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
-    },
-    "node_modules/@types/react": {
-      "version": "17.0.38",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz",
-      "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==",
-      "dependencies": {
-        "@types/prop-types": "*",
-        "@types/scheduler": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@types/react-dom": {
-      "version": "17.0.11",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
-      "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/react-helmet": {
-      "version": "6.1.5",
-      "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz",
-      "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==",
-      "dev": true,
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/scheduler": {
-      "version": "0.16.2",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
-      "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
-    },
-    "node_modules/@types/stack-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
-      "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
-      "dev": true
-    },
-    "node_modules/@types/styled-components": {
-      "version": "5.1.19",
-      "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.19.tgz",
-      "integrity": "sha512-hNj14Oamk7Jhb/fMMQG7TUkd3e8uMMgxsCTH+ueJNGdFo/PuhlGDQTPChqyilpZP0WttgBHkc2YyT5UG+yc6Yw==",
-      "dependencies": {
-        "@types/hoist-non-react-statics": "*",
-        "@types/react": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@types/trusted-types": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
-      "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
-    },
-    "node_modules/@types/yargs": {
-      "version": "16.0.4",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-      "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
-      "dev": true,
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/@types/yargs-parser": {
-      "version": "20.2.1",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
-      "dev": true
-    },
-    "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz",
-      "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/experimental-utils": "5.8.1",
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "debug": "^4.3.2",
-        "functional-red-black-tree": "^1.0.1",
-        "ignore": "^5.1.8",
-        "regexpp": "^3.2.0",
-        "semver": "^7.3.5",
-        "tsutils": "^3.21.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "@typescript-eslint/parser": "^5.0.0",
-        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/experimental-utils": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz",
-      "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==",
-      "dev": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.9",
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/typescript-estree": "5.8.1",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^3.0.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/@typescript-eslint/parser": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz",
-      "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/typescript-estree": "5.8.1",
-        "debug": "^4.3.2"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz",
-      "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/visitor-keys": "5.8.1"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/types": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz",
-      "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz",
-      "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/visitor-keys": "5.8.1",
-        "debug": "^4.3.2",
-        "globby": "^11.0.4",
-        "is-glob": "^4.0.3",
-        "semver": "^7.3.5",
-        "tsutils": "^3.21.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz",
-      "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "5.8.1",
-        "eslint-visitor-keys": "^3.0.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
-      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
-      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
-      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
-      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
-    },
-    "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
-      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
-      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
-      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
-      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
-      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
-      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
-      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
-      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
-      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
-      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
-      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@wojtekmaj/enzyme-adapter-react-17": {
-      "version": "0.6.6",
-      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.6.tgz",
-      "integrity": "sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==",
-      "dev": true,
-      "dependencies": {
-        "@wojtekmaj/enzyme-adapter-utils": "^0.1.2",
-        "enzyme-shallow-equal": "^1.0.0",
-        "has": "^1.0.0",
-        "prop-types": "^15.7.0",
-        "react-is": "^17.0.0",
-        "react-test-renderer": "^17.0.0"
-      },
-      "peerDependencies": {
-        "enzyme": "^3.0.0",
-        "react": "^17.0.0-0",
-        "react-dom": "^17.0.0-0"
-      }
-    },
-    "node_modules/@wojtekmaj/enzyme-adapter-react-17/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
-    },
-    "node_modules/@wojtekmaj/enzyme-adapter-utils": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.2.tgz",
-      "integrity": "sha512-MM/DqDqvxNVlWLqSVQiUbRN9MuDLJfefmPbJ8ZKdmdf5ID8G+i42XhFpoQh5bAZUCdwzRae3+WSZl2lXcFOrhw==",
-      "dev": true,
-      "dependencies": {
-        "function.prototype.name": "^1.1.0",
-        "has": "^1.0.0",
-        "object.fromentries": "^2.0.0",
-        "prop-types": "^15.7.0"
-      },
-      "peerDependencies": {
-        "react": "^17.0.0-0"
-      }
-    },
-    "node_modules/@xobotyi/scrollbar-width": {
-      "version": "1.9.5",
-      "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
-      "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
-    },
-    "node_modules/abab": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
-      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
-      "dev": true
-    },
-    "node_modules/acorn": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
-      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-globals": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-walk": "^7.1.1"
-      }
-    },
-    "node_modules/acorn-globals/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-import-assertions": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
-      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
-      "peerDependencies": {
-        "acorn": "^8"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/airbnb-prop-types": {
-      "version": "2.16.0",
-      "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
-      "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
-      "dev": true,
-      "dependencies": {
-        "array.prototype.find": "^2.1.1",
-        "function.prototype.name": "^1.1.2",
-        "is-regex": "^1.1.0",
-        "object-is": "^1.1.2",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.2",
-        "prop-types": "^15.7.2",
-        "prop-types-exact": "^1.2.0",
-        "react-is": "^16.13.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      },
-      "peerDependencies": {
-        "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "peerDependencies": {
-        "ajv": "^6.9.1"
-      }
-    },
-    "node_modules/anser": {
-      "version": "1.4.9",
-      "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz",
-      "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA=="
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.21.3"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/aria-query": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
-      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.10.2",
-        "@babel/runtime-corejs3": "^7.10.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/array-includes": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
-      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1",
-        "get-intrinsic": "^1.1.1",
-        "is-string": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array.prototype.filter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz",
-      "integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "es-array-method-boxes-properly": "^1.0.0",
-        "is-string": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array.prototype.find": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz",
-      "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array.prototype.flat": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
-      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array.prototype.flatmap": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
-      "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/asn1.js": {
-      "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"
-      }
-    },
-    "node_modules/asn1.js/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/assert": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
-      "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"
-      }
-    },
-    "node_modules/ast-types-flow": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
-      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
-      "dev": true
-    },
-    "node_modules/async": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
-      "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-    },
-    "node_modules/at-least-node": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/available-typed-arrays": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
-      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/axe-core": {
-      "version": "4.3.5",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
-      "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/axios": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
-      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
-      "dependencies": {
-        "follow-redirects": "^1.14.9",
-        "form-data": "^4.0.0"
-      }
-    },
-    "node_modules/axios/node_modules/form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/axobject-query": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
-      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
-      "dev": true
-    },
-    "node_modules/babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      }
-    },
-    "node_modules/babel-core": {
-      "version": "6.26.3",
-      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
-      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
-      "dev": true,
-      "dependencies": {
-        "babel-code-frame": "^6.26.0",
-        "babel-generator": "^6.26.0",
-        "babel-helpers": "^6.24.1",
-        "babel-messages": "^6.23.0",
-        "babel-register": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "babel-template": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "convert-source-map": "^1.5.1",
-        "debug": "^2.6.9",
-        "json5": "^0.5.1",
-        "lodash": "^4.17.4",
-        "minimatch": "^3.0.4",
-        "path-is-absolute": "^1.0.1",
-        "private": "^0.1.8",
-        "slash": "^1.0.0",
-        "source-map": "^0.5.7"
-      }
-    },
-    "node_modules/babel-core/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/babel-core/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "peerDependencies": {
-        "eslint": ">= 4.12.1"
-      }
-    },
-    "node_modules/babel-eslint/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "dependencies": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      }
-    },
-    "node_modules/babel-generator/node_modules/jsesc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      }
-    },
-    "node_modules/babel-helpers": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
-      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
-      "dev": true,
-      "dependencies": {
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "node_modules/babel-jest": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz",
-      "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/babel__core": "^7.1.14",
-        "babel-plugin-istanbul": "^6.0.0",
-        "babel-preset-jest": "^27.4.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.8.0"
-      }
-    },
-    "node_modules/babel-jest/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/babel-jest/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/babel-jest/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/babel-jest/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/babel-jest/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/babel-jest/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/babel-loader": {
-      "version": "8.2.3",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
-      "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
-      "dependencies": {
-        "find-cache-dir": "^3.3.1",
-        "loader-utils": "^1.4.0",
-        "make-dir": "^3.1.0",
-        "schema-utils": "^2.6.5"
-      },
-      "engines": {
-        "node": ">= 8.9"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0",
-        "webpack": ">=2"
-      }
-    },
-    "node_modules/babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "dependencies": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "node_modules/babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "dependencies": {
-        "object.assign": "^4.1.0"
-      }
-    },
-    "node_modules/babel-plugin-istanbul": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
-      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@istanbuljs/load-nyc-config": "^1.0.0",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-instrument": "^5.0.4",
-        "test-exclude": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/babel-plugin-jest-hoist": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz",
-      "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.3.3",
-        "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.0.0",
-        "@types/babel__traverse": "^7.0.6"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz",
-      "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==",
-      "dependencies": {
-        "@babel/compat-data": "^7.13.11",
-        "@babel/helper-define-polyfill-provider": "^0.3.0",
-        "semver": "^6.1.1"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
-      "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==",
-      "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.3.0",
-        "core-js-compat": "^3.18.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz",
-      "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==",
-      "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.3.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/babel-plugin-styled-components": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz",
-      "integrity": "sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.16.0",
-        "@babel/helper-module-imports": "^7.16.0",
-        "babel-plugin-syntax-jsx": "^6.18.0",
-        "lodash": "^4.17.11"
-      },
-      "peerDependencies": {
-        "styled-components": ">= 2"
-      }
-    },
-    "node_modules/babel-plugin-syntax-jsx": {
-      "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="
-    },
-    "node_modules/babel-preset-current-node-syntax": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-bigint": "^7.8.3",
-        "@babel/plugin-syntax-class-properties": "^7.8.3",
-        "@babel/plugin-syntax-import-meta": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/babel-preset-jest": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz",
-      "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==",
-      "dev": true,
-      "dependencies": {
-        "babel-plugin-jest-hoist": "^27.4.0",
-        "babel-preset-current-node-syntax": "^1.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/babel-register": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
-      "dev": true,
-      "dependencies": {
-        "babel-core": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "core-js": "^2.5.0",
-        "home-or-tmp": "^2.0.0",
-        "lodash": "^4.17.4",
-        "mkdirp": "^0.5.1",
-        "source-map-support": "^0.4.15"
-      }
-    },
-    "node_modules/babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "dependencies": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "node_modules/babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "dependencies": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "node_modules/babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "dependencies": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      }
-    },
-    "node_modules/babel-traverse/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/babel-traverse/node_modules/globals": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/babel-traverse/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "dependencies": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      }
-    },
-    "node_modules/babel-types/node_modules/to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-      "dev": true,
-      "bin": {
-        "babylon": "bin/babylon.js"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "node_modules/base64-arraybuffer": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
-      "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/bn.js": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
-      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
-    },
-    "node_modules/boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "node_modules/browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
-      "dev": true
-    },
-    "node_modules/browserify-aes": {
-      "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"
-      }
-    },
-    "node_modules/browserify-cipher": {
-      "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"
-      }
-    },
-    "node_modules/browserify-des": {
-      "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"
-      }
-    },
-    "node_modules/browserify-rsa": {
-      "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"
-      }
-    },
-    "node_modules/browserify-sign": {
-      "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"
-      }
-    },
-    "node_modules/browserify-sign/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/browserify-zlib": {
-      "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"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.19.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
-      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001286",
-        "electron-to-chromium": "^1.4.17",
-        "escalade": "^3.1.1",
-        "node-releases": "^2.0.1",
-        "picocolors": "^1.0.0"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
-    },
-    "node_modules/bser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-      "dev": true,
-      "dependencies": {
-        "node-int64": "^0.4.0"
-      }
-    },
-    "node_modules/buffer": {
-      "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"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-    },
-    "node_modules/buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "node_modules/builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "node_modules/bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/camelize": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
-      "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001294",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz",
-      "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/char-regex": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cheerio": {
-      "version": "1.0.0-rc.10",
-      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
-      "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
-      "dev": true,
-      "dependencies": {
-        "cheerio-select": "^1.5.0",
-        "dom-serializer": "^1.3.2",
-        "domhandler": "^4.2.0",
-        "htmlparser2": "^6.1.0",
-        "parse5": "^6.0.1",
-        "parse5-htmlparser2-tree-adapter": "^6.0.1",
-        "tslib": "^2.2.0"
-      },
-      "engines": {
-        "node": ">= 6"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
-      }
-    },
-    "node_modules/cheerio-select": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
-      "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
-      "dev": true,
-      "dependencies": {
-        "css-select": "^4.1.3",
-        "css-what": "^5.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0",
-        "domutils": "^2.7.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/chokidar": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.1"
-      }
-    },
-    "node_modules/chokidar/node_modules/glob-parent": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
-      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/ci-info": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
-      "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
-      "dev": true
-    },
-    "node_modules/cipher-base": {
-      "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"
-      }
-    },
-    "node_modules/cjs-module-lexer": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
-      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
-      "dev": true
-    },
-    "node_modules/classnames": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
-      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
-    },
-    "node_modules/clean-webpack-plugin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz",
-      "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==",
-      "dependencies": {
-        "del": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "webpack": ">=4.0.0 <6.0.0"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true,
-      "engines": {
-        "iojs": ">= 1.0.0",
-        "node": ">= 0.12.0"
-      }
-    },
-    "node_modules/collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-      "dev": true
-    },
-    "node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "node_modules/colorette": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
-      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "node_modules/common-tags": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
-      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "node_modules/confusing-browser-globals": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
-      "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
-      "dev": true
-    },
-    "node_modules/constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "node_modules/convert-source-map": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
-      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
-      "dependencies": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "node_modules/copy-to-clipboard": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
-      "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
-      "dependencies": {
-        "toggle-selection": "^1.0.6"
-      }
-    },
-    "node_modules/core-js": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
-      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
-      "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
-      "dev": true,
-      "hasInstallScript": true
-    },
-    "node_modules/core-js-compat": {
-      "version": "3.20.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.1.tgz",
-      "integrity": "sha512-AVhKZNpqMV3Jz8hU0YEXXE06qoxtQGsAqU0u1neUngz5IusDJRX/ZJ6t3i7mS7QxNyEONbCo14GprkBrxPlTZA==",
-      "dependencies": {
-        "browserslist": "^4.19.1",
-        "semver": "7.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/core-js"
-      }
-    },
-    "node_modules/core-js-compat/node_modules/semver": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/core-js-pure": {
-      "version": "3.20.1",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.1.tgz",
-      "integrity": "sha512-yeNNr3L9cEBwNy6vhhIJ0nko7fE7uFO6PgawcacGt2VWep4WqQx0RiqlkgSP7kqUMC1IKdfO9qPeWXcUheHLVQ==",
-      "dev": true,
-      "hasInstallScript": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/core-js"
-      }
-    },
-    "node_modules/create-ecdh": {
-      "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"
-      }
-    },
-    "node_modules/create-ecdh/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/create-hash": {
-      "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"
-      }
-    },
-    "node_modules/create-hmac": {
-      "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"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/crypto-browserify": {
-      "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"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/css-color-keywords": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
-      "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/css-in-js-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
-      "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
-      "dependencies": {
-        "hyphenate-style-name": "^1.0.2",
-        "isobject": "^3.0.1"
-      }
-    },
-    "node_modules/css-select": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
-      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
-      "dev": true,
-      "dependencies": {
-        "boolbase": "^1.0.0",
-        "css-what": "^5.1.0",
-        "domhandler": "^4.3.0",
-        "domutils": "^2.8.0",
-        "nth-check": "^2.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/css-to-react-native": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz",
-      "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==",
-      "dependencies": {
-        "camelize": "^1.0.0",
-        "css-color-keywords": "^1.0.0",
-        "postcss-value-parser": "^4.0.2"
-      }
-    },
-    "node_modules/css-tree": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
-      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
-      "dependencies": {
-        "mdn-data": "2.0.14",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/css-tree/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/css-what": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
-      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/css.escape": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
-      "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
-    },
-    "node_modules/cssnano-preset-simple": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz",
-      "integrity": "sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001202"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.15"
-      }
-    },
-    "node_modules/cssnano-simple": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz",
-      "integrity": "sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==",
-      "dependencies": {
-        "cssnano-preset-simple": "^3.0.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.15"
-      },
-      "peerDependenciesMeta": {
-        "postcss": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
-      "dev": true
-    },
-    "node_modules/cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-      "dev": true,
-      "dependencies": {
-        "cssom": "~0.3.6"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cssstyle/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "dev": true
-    },
-    "node_modules/csstype": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
-      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
-    },
-    "node_modules/damerau-levenshtein": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz",
-      "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==",
-      "dev": true
-    },
-    "node_modules/data-uri-to-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
-      "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-      "dev": true,
-      "dependencies": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.3.3",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
-      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/decimal.js": {
-      "version": "10.3.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
-      "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
-      "dev": true
-    },
-    "node_modules/dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "node_modules/deep-eql": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz",
-      "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=",
-      "dev": true,
-      "dependencies": {
-        "type-detect": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-      "dev": true
-    },
-    "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/define-properties": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/del": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-      "dependencies": {
-        "@types/glob": "^7.1.1",
-        "globby": "^6.1.0",
-        "is-path-cwd": "^2.0.0",
-        "is-path-in-cwd": "^2.0.0",
-        "p-map": "^2.0.0",
-        "pify": "^4.0.1",
-        "rimraf": "^2.6.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/del/node_modules/array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dependencies": {
-        "array-uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/del/node_modules/globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dependencies": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/del/node_modules/globby/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/del/node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/des.js": {
-      "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"
-      }
-    },
-    "node_modules/detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "dependencies": {
-        "repeating": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/diff-sequences": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz",
-      "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==",
-      "dev": true,
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/diffie-hellman": {
-      "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"
-      }
-    },
-    "node_modules/diffie-hellman/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dependencies": {
-        "path-type": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/discontinuous-range": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
-      "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=",
-      "dev": true
-    },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/dom-serializer": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
-      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.2.0",
-        "entities": "^2.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/domain-browser": {
-      "version": "4.19.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz",
-      "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://bevry.me/fund"
-      }
-    },
-    "node_modules/domelementtype": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
-      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ]
-    },
-    "node_modules/domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "dev": true,
-      "dependencies": {
-        "webidl-conversions": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/domexception/node_modules/webidl-conversions": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-      "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/domhandler": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
-      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
-      "dev": true,
-      "dependencies": {
-        "domelementtype": "^2.2.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/domutils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
-      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
-      "dev": true,
-      "dependencies": {
-        "dom-serializer": "^1.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/ejs": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
-      "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
-      "dependencies": {
-        "jake": "^10.6.1"
-      },
-      "bin": {
-        "ejs": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.4.31",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz",
-      "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ=="
-    },
-    "node_modules/elliptic": {
-      "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"
-      }
-    },
-    "node_modules/elliptic/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/emittery": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
-      "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
-      "dev": true
-    },
-    "node_modules/emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/encoding": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "dependencies": {
-        "iconv-lite": "^0.6.2"
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.8.3",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
-      "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "dependencies": {
-        "ansi-colors": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/enzyme": {
-      "version": "3.11.0",
-      "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
-      "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==",
-      "dev": true,
-      "dependencies": {
-        "array.prototype.flat": "^1.2.3",
-        "cheerio": "^1.0.0-rc.3",
-        "enzyme-shallow-equal": "^1.0.1",
-        "function.prototype.name": "^1.1.2",
-        "has": "^1.0.3",
-        "html-element-map": "^1.2.0",
-        "is-boolean-object": "^1.0.1",
-        "is-callable": "^1.1.5",
-        "is-number-object": "^1.0.4",
-        "is-regex": "^1.0.5",
-        "is-string": "^1.0.5",
-        "is-subset": "^0.1.1",
-        "lodash.escape": "^4.0.1",
-        "lodash.isequal": "^4.5.0",
-        "object-inspect": "^1.7.0",
-        "object-is": "^1.0.2",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.1",
-        "object.values": "^1.1.1",
-        "raf": "^3.4.1",
-        "rst-selector-parser": "^2.2.3",
-        "string.prototype.trim": "^1.2.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/enzyme-adapter-react-16": {
-      "version": "1.15.6",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz",
-      "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==",
-      "dev": true,
-      "dependencies": {
-        "enzyme-adapter-utils": "^1.14.0",
-        "enzyme-shallow-equal": "^1.0.4",
-        "has": "^1.0.3",
-        "object.assign": "^4.1.2",
-        "object.values": "^1.1.2",
-        "prop-types": "^15.7.2",
-        "react-is": "^16.13.1",
-        "react-test-renderer": "^16.0.0-0",
-        "semver": "^5.7.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      },
-      "peerDependencies": {
-        "enzyme": "^3.0.0",
-        "react": "^16.0.0-0",
-        "react-dom": "^16.0.0-0"
-      }
-    },
-    "node_modules/enzyme-adapter-react-16/node_modules/react-test-renderer": {
-      "version": "16.14.0",
-      "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz",
-      "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==",
-      "dev": true,
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "prop-types": "^15.6.2",
-        "react-is": "^16.8.6",
-        "scheduler": "^0.19.1"
-      },
-      "peerDependencies": {
-        "react": "^16.14.0"
-      }
-    },
-    "node_modules/enzyme-adapter-react-16/node_modules/scheduler": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
-      "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
-      "dev": true,
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "node_modules/enzyme-adapter-react-16/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/enzyme-adapter-utils": {
-      "version": "1.14.0",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz",
-      "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==",
-      "dev": true,
-      "dependencies": {
-        "airbnb-prop-types": "^2.16.0",
-        "function.prototype.name": "^1.1.3",
-        "has": "^1.0.3",
-        "object.assign": "^4.1.2",
-        "object.fromentries": "^2.0.3",
-        "prop-types": "^15.7.2",
-        "semver": "^5.7.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      },
-      "peerDependencies": {
-        "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0"
-      }
-    },
-    "node_modules/enzyme-adapter-utils/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/enzyme-shallow-equal": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz",
-      "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3",
-        "object-is": "^1.1.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/error-stack-parser": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
-      "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
-      "dependencies": {
-        "stackframe": "^1.1.1"
-      }
-    },
-    "node_modules/es-abstract": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
-      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.1",
-        "get-symbol-description": "^1.0.0",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
-        "is-negative-zero": "^2.0.1",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.1",
-        "is-string": "^1.0.7",
-        "is-weakref": "^1.0.1",
-        "object-inspect": "^1.11.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.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es-array-method-boxes-properly": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
-      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
-      "dev": true
-    },
-    "node_modules/es-module-lexer": {
-      "version": "0.9.3",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
-      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
-    },
-    "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es6-object-assign": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
-      "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw="
-    },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/escodegen": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-      "dev": true,
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^5.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/escodegen/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/eslint": {
-      "version": "8.6.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
-      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
-      "dev": true,
-      "dependencies": {
-        "@eslint/eslintrc": "^1.0.5",
-        "@humanwhocodes/config-array": "^0.9.2",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.0",
-        "eslint-utils": "^3.0.0",
-        "eslint-visitor-keys": "^3.1.0",
-        "espree": "^9.3.0",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^6.0.1",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^4.1.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.2.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.1",
-        "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-config-airbnb": {
-      "version": "19.0.4",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
-      "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
-      "dev": true,
-      "dependencies": {
-        "eslint-config-airbnb-base": "^15.0.0",
-        "object.assign": "^4.1.2",
-        "object.entries": "^1.1.5"
-      },
-      "engines": {
-        "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "eslint": "^7.32.0 || ^8.2.0",
-        "eslint-plugin-import": "^2.25.3",
-        "eslint-plugin-jsx-a11y": "^6.5.1",
-        "eslint-plugin-react": "^7.28.0",
-        "eslint-plugin-react-hooks": "^4.3.0"
-      }
-    },
-    "node_modules/eslint-config-airbnb-base": {
-      "version": "15.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
-      "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
-      "dev": true,
-      "dependencies": {
-        "confusing-browser-globals": "^1.0.10",
-        "object.assign": "^4.1.2",
-        "object.entries": "^1.1.5",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "peerDependencies": {
-        "eslint": "^7.32.0 || ^8.2.0",
-        "eslint-plugin-import": "^2.25.2"
-      }
-    },
-    "node_modules/eslint-config-airbnb-base/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/eslint-config-prettier": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
-      "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
-      "dev": true,
-      "bin": {
-        "eslint-config-prettier": "bin/cli.js"
-      },
-      "peerDependencies": {
-        "eslint": ">=7.0.0"
-      }
-    },
-    "node_modules/eslint-import-resolver-node": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
-      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^3.2.7",
-        "resolve": "^1.20.0"
-      }
-    },
-    "node_modules/eslint-import-resolver-node/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/eslint-module-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
-      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^3.2.7",
-        "find-up": "^2.1.0",
-        "pkg-dir": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-module-utils/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-plugin-babel": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz",
-      "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==",
-      "dev": true,
-      "dependencies": {
-        "eslint-rule-composer": "^0.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      },
-      "peerDependencies": {
-        "eslint": ">=4.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-import": {
-      "version": "2.25.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz",
-      "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==",
-      "dev": true,
-      "dependencies": {
-        "array-includes": "^3.1.4",
-        "array.prototype.flat": "^1.2.5",
-        "debug": "^2.6.9",
-        "doctrine": "^2.1.0",
-        "eslint-import-resolver-node": "^0.3.6",
-        "eslint-module-utils": "^2.7.1",
-        "has": "^1.0.3",
-        "is-core-module": "^2.8.0",
-        "is-glob": "^4.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.5",
-        "resolve": "^1.20.0",
-        "tsconfig-paths": "^3.11.0"
-      },
-      "engines": {
-        "node": ">=4"
-      },
-      "peerDependencies": {
-        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/eslint-plugin-jsx-a11y": {
-      "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
-      "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/runtime": "^7.16.3",
-        "aria-query": "^4.2.2",
-        "array-includes": "^3.1.4",
-        "ast-types-flow": "^0.0.7",
-        "axe-core": "^4.3.5",
-        "axobject-query": "^2.2.0",
-        "damerau-levenshtein": "^1.0.7",
-        "emoji-regex": "^9.2.2",
-        "has": "^1.0.3",
-        "jsx-ast-utils": "^3.2.1",
-        "language-tags": "^1.0.5",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependencies": {
-        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
-      }
-    },
-    "node_modules/eslint-plugin-react": {
-      "version": "7.28.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
-      "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
-      "dev": true,
-      "dependencies": {
-        "array-includes": "^3.1.4",
-        "array.prototype.flatmap": "^1.2.5",
-        "doctrine": "^2.1.0",
-        "estraverse": "^5.3.0",
-        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
-        "minimatch": "^3.0.4",
-        "object.entries": "^1.1.5",
-        "object.fromentries": "^2.0.5",
-        "object.hasown": "^1.1.0",
-        "object.values": "^1.1.5",
-        "prop-types": "^15.7.2",
-        "resolve": "^2.0.0-next.3",
-        "semver": "^6.3.0",
-        "string.prototype.matchall": "^4.0.6"
-      },
-      "engines": {
-        "node": ">=4"
-      },
-      "peerDependencies": {
-        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
-      }
-    },
-    "node_modules/eslint-plugin-react/node_modules/doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eslint-plugin-react/node_modules/resolve": {
-      "version": "2.0.0-next.3",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
-      "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/eslint-plugin-react/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/eslint-rule-composer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
-      "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/eslint-scope/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      },
-      "peerDependencies": {
-        "eslint": ">=5"
-      }
-    },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
-      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/eslint/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/eslint/node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
-    },
-    "node_modules/eslint/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/eslint/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/eslint/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/eslint/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint/node_modules/eslint-scope": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
-      "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
-      "dev": true,
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/eslint/node_modules/globals": {
-      "version": "13.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-      "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint/node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/eslint/node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/eslint/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/eslint/node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/espree": {
-      "version": "9.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
-      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.7.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^3.1.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
-      "dev": true,
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/evp_bytestokey": {
-      "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"
-      }
-    },
-    "node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/expect": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz",
-      "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "ansi-styles": "^5.0.0",
-        "jest-get-type": "^27.4.0",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-regex-util": "^27.4.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/expect-enzyme": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/expect-enzyme/-/expect-enzyme-1.3.0.tgz",
-      "integrity": "sha512-bV+xqYOC4Hm4LfFJDLKcs8fIH5jb4UZJCUXP2t2bixHuOXPJPwVw4I67u6YvlZUDiLmCSi7rVo1x/fjLLfUDAw==",
-      "dev": true,
-      "dependencies": {
-        "deep-eql": "^2.0.2",
-        "react-display-name": "^0.2.0",
-        "stringify-object": "^3.2.0"
-      },
-      "peerDependencies": {
-        "enzyme": "2.x.x - 3.x.x",
-        "expect": "1.x.x",
-        "react": "13.0.0 - 16.x.x",
-        "react-dom": "13.0.0 - 16.x.x"
-      }
-    },
-    "node_modules/expect/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "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=="
-    },
-    "node_modules/fast-glob": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
-      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
-      "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.4"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/fast-glob/node_modules/glob-parent": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "node_modules/fast-shallow-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
-      "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
-    },
-    "node_modules/fastest-stable-stringify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
-      "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
-    },
-    "node_modules/fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/fb-watchman": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
-      "dev": true,
-      "dependencies": {
-        "bser": "2.1.1"
-      }
-    },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-      "dev": true,
-      "dependencies": {
-        "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/filelist": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
-      "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
-      "dependencies": {
-        "minimatch": "^3.0.4"
-      }
-    },
-    "node_modules/fill-range": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-cache-dir": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/pkg-dir": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-up": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
-      "dependencies": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
-      "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
-      "dev": true
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
-      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/foreach": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
-    },
-    "node_modules/form-data": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-      "dev": true,
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/fs-extra/node_modules/universalify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "node_modules/function.prototype.name": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
-      "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "functions-have-names": "^1.2.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "node_modules/functions-have-names": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
-      "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-orientation": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz",
-      "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==",
-      "dependencies": {
-        "stream-parser": "^0.3.1"
-      }
-    },
-    "node_modules/get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
-    },
-    "node_modules/get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/get-symbol-description": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "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=="
-    },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globby": {
-      "version": "11.0.4",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
-      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
-      "dependencies": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/globby/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
-      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
-    },
-    "node_modules/harmony-reflect": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
-      "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
-      "dev": true
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hash-base": {
-      "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"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/hash-base/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/hash.js": {
-      "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"
-      }
-    },
-    "node_modules/he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "bin": {
-        "he": "bin/he"
-      }
-    },
-    "node_modules/hmac-drbg": {
-      "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"
-      }
-    },
-    "node_modules/hoist-non-react-statics": {
-      "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"
-      }
-    },
-    "node_modules/home-or-tmp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
-      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
-      "dev": true,
-      "dependencies": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/html-element-map": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz",
-      "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==",
-      "dev": true,
-      "dependencies": {
-        "array.prototype.filter": "^1.0.0",
-        "call-bind": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/html-encoding-sniffer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-      "dev": true,
-      "dependencies": {
-        "whatwg-encoding": "^1.0.5"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
-    },
-    "node_modules/htmlparser2": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
-      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
-      "dev": true,
-      "funding": [
-        "https://github.com/fb55/htmlparser2?sponsor=1",
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ],
-      "dependencies": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.0.0",
-        "domutils": "^2.5.2",
-        "entities": "^2.0.0"
-      }
-    },
-    "node_modules/http-errors": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-      "dev": true,
-      "dependencies": {
-        "@tootallnate/once": "1",
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "node_modules/https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
-      "dev": true,
-      "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10.17.0"
-      }
-    },
-    "node_modules/hyphenate-style-name": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
-      "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/idb": {
-      "version": "6.1.5",
-      "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz",
-      "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw=="
-    },
-    "node_modules/identity-obj-proxy": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
-      "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
-      "dev": true,
-      "dependencies": {
-        "harmony-reflect": "^1.4.6"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/image-size": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
-      "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
-      "dependencies": {
-        "queue": "6.0.2"
-      },
-      "bin": {
-        "image-size": "bin/image-size.js"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/immutable": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
-      "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw=="
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/import-fresh/node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/import-local": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
-      "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
-      "dev": true,
-      "dependencies": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "bin": {
-        "import-local-fixture": "fixtures/cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/import-local/node_modules/pkg-dir": {
-      "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==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/inline-style-prefixer": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz",
-      "integrity": "sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==",
-      "dependencies": {
-        "css-in-js-utils": "^2.0.0"
-      }
-    },
-    "node_modules/internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "dependencies": {
-        "get-intrinsic": "^1.1.0",
-        "has": "^1.0.3",
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "dependencies": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "node_modules/is-arguments": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
-      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dependencies": {
-        "has-bigints": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-binary-path": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
-      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-generator-function": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
-      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
-    },
-    "node_modules/is-nan": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
-      "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-negative-zero": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-number-object": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
-      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-path-cwd": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-path-in-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-      "dependencies": {
-        "is-path-inside": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-path-inside": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-      "dependencies": {
-        "path-is-inside": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/is-potential-custom-element-name": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
-      "dev": true
-    },
-    "node_modules/is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-shared-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-subset": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
-      "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
-      "dev": true
-    },
-    "node_modules/is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-typed-array": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
-      "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-abstract": "^1.18.5",
-        "foreach": "^2.0.5",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "node_modules/is-weakref": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "dependencies": {
-        "call-bind": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/istanbul-lib-coverage": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
-      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
-      "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
-      "dependencies": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-report/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-source-maps": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/istanbul-reports": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz",
-      "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==",
-      "dev": true,
-      "dependencies": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jake": {
-      "version": "10.8.2",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
-      "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
-      "dependencies": {
-        "async": "0.9.x",
-        "chalk": "^2.4.2",
-        "filelist": "^1.0.1",
-        "minimatch": "^3.0.4"
-      },
-      "bin": {
-        "jake": "bin/cli.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/jake/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/jake/node_modules/chalk": {
-      "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"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/jake/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/jake/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/jest": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz",
-      "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/core": "^27.4.5",
-        "import-local": "^3.0.2",
-        "jest-cli": "^27.4.5"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/jest-changed-files": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz",
-      "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "execa": "^5.0.0",
-        "throat": "^6.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-circus": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz",
-      "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^27.4.4",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "dedent": "^0.7.0",
-        "expect": "^27.4.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^27.4.2",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3",
-        "throat": "^6.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-circus/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-circus/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-circus/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-circus/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-circus/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-circus/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-cli": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz",
-      "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/core": "^27.4.5",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "import-local": "^3.0.2",
-        "jest-config": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "prompts": "^2.0.1",
-        "yargs": "^16.2.0"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/jest-cli/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-cli/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-cli/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-cli/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-cli/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-config": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz",
-      "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.1.0",
-        "@jest/test-sequencer": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "babel-jest": "^27.4.5",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.2.4",
-        "jest-circus": "^27.4.5",
-        "jest-environment-jsdom": "^27.4.4",
-        "jest-environment-node": "^27.4.4",
-        "jest-get-type": "^27.4.0",
-        "jest-jasmine2": "^27.4.5",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-runner": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "peerDependencies": {
-        "ts-node": ">=9.0.0"
-      },
-      "peerDependenciesMeta": {
-        "ts-node": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/jest-config/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-config/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-config/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-config/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-config/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-config/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-diff": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz",
-      "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0",
-        "diff-sequences": "^27.4.0",
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-diff/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-diff/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-diff/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-diff/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-diff/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-docblock": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz",
-      "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==",
-      "dev": true,
-      "dependencies": {
-        "detect-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-each": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz",
-      "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-each/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-each/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-each/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-each/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-each/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-environment-jsdom": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz",
-      "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^27.4.4",
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2",
-        "jsdom": "^16.6.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-environment-node": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz",
-      "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^27.4.4",
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-get-type": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz",
-      "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==",
-      "dev": true,
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-haste-map": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz",
-      "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "@types/graceful-fs": "^4.1.2",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-regex-util": "^27.4.0",
-        "jest-serializer": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "micromatch": "^4.0.4",
-        "walker": "^1.0.7"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "^2.3.2"
-      }
-    },
-    "node_modules/jest-jasmine2": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz",
-      "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/traverse": "^7.1.0",
-        "@jest/environment": "^27.4.4",
-        "@jest/source-map": "^27.4.0",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "expect": "^27.4.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^27.4.2",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2",
-        "throat": "^6.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-jasmine2/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-jasmine2/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-leak-detector": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz",
-      "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==",
-      "dev": true,
-      "dependencies": {
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-matcher-utils": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz",
-      "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^27.4.2",
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-matcher-utils/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-matcher-utils/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-message-util": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz",
-      "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^27.4.2",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-message-util/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-mock": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz",
-      "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      },
-      "peerDependencies": {
-        "jest-resolve": "*"
-      },
-      "peerDependenciesMeta": {
-        "jest-resolve": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/jest-regex-util": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz",
-      "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==",
-      "dev": true,
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-resolve": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz",
-      "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "resolve": "^1.20.0",
-        "resolve.exports": "^1.1.0",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-resolve-dependencies": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz",
-      "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-snapshot": "^27.4.5"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-resolve/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-resolve/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runner": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz",
-      "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^27.4.2",
-        "@jest/environment": "^27.4.4",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.8.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-docblock": "^27.4.0",
-        "jest-environment-jsdom": "^27.4.4",
-        "jest-environment-node": "^27.4.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-leak-detector": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-resolve": "^27.4.5",
-        "jest-runtime": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "source-map-support": "^0.5.6",
-        "throat": "^6.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-runner/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-runner/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-runner/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-runner/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-runner/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/jest-runner/node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "dev": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/jest-runner/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runtime": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz",
-      "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/console": "^27.4.2",
-        "@jest/environment": "^27.4.4",
-        "@jest/globals": "^27.4.4",
-        "@jest/source-map": "^27.4.0",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/yargs": "^16.0.0",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^1.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "execa": "^5.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-message-util": "^27.4.2",
-        "jest-mock": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0",
-        "yargs": "^16.2.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-runtime/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-runtime/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-serializer": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz",
-      "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*",
-        "graceful-fs": "^4.2.4"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-snapshot": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz",
-      "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/core": "^7.7.2",
-        "@babel/generator": "^7.7.2",
-        "@babel/parser": "^7.7.2",
-        "@babel/plugin-syntax-typescript": "^7.7.2",
-        "@babel/traverse": "^7.7.2",
-        "@babel/types": "^7.0.0",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/babel__traverse": "^7.0.4",
-        "@types/prettier": "^2.1.5",
-        "babel-preset-current-node-syntax": "^1.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^27.4.2",
-        "graceful-fs": "^4.2.4",
-        "jest-diff": "^27.4.2",
-        "jest-get-type": "^27.4.0",
-        "jest-haste-map": "^27.4.5",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-resolve": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^27.4.2",
-        "semver": "^7.3.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-snapshot/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-util": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz",
-      "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "graceful-fs": "^4.2.4",
-        "picomatch": "^2.2.3"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-util/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-util/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-util/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-util/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-validate": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz",
-      "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^27.4.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^27.4.2"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-validate/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-validate/node_modules/camelcase": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
-      "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/jest-validate/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-validate/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-validate/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-validate/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-watcher": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz",
-      "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "jest-util": "^27.4.2",
-        "string-length": "^4.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/jest-watcher/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/jest-watcher/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-worker": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz",
-      "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/js-cookie": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
-      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
-    },
-    "node_modules/js-tokens": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
-    },
-    "node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsdom": {
-      "version": "16.7.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-      "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-      "dev": true,
-      "dependencies": {
-        "abab": "^2.0.5",
-        "acorn": "^8.2.4",
-        "acorn-globals": "^6.0.0",
-        "cssom": "^0.4.4",
-        "cssstyle": "^2.3.0",
-        "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.1",
-        "domexception": "^2.0.1",
-        "escodegen": "^2.0.0",
-        "form-data": "^3.0.0",
-        "html-encoding-sniffer": "^2.0.1",
-        "http-proxy-agent": "^4.0.1",
-        "https-proxy-agent": "^5.0.0",
-        "is-potential-custom-element-name": "^1.0.1",
-        "nwsapi": "^2.2.0",
-        "parse5": "6.0.1",
-        "saxes": "^5.0.1",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^4.0.0",
-        "w3c-hr-time": "^1.0.2",
-        "w3c-xmlserializer": "^2.0.0",
-        "webidl-conversions": "^6.1.0",
-        "whatwg-encoding": "^1.0.5",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.5.0",
-        "ws": "^7.4.6",
-        "xml-name-validator": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "canvas": "^2.5.0"
-      },
-      "peerDependenciesMeta": {
-        "canvas": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
-    },
-    "node_modules/json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "node_modules/json5": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true,
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/jsonfile": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-      "dependencies": {
-        "universalify": "^2.0.0"
-      },
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jsonfile/node_modules/universalify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/jsonpointer": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz",
-      "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/jsx-ast-utils": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
-      "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
-      "dev": true,
-      "dependencies": {
-        "array-includes": "^3.1.3",
-        "object.assign": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ky": {
-      "version": "0.28.7",
-      "resolved": "https://registry.npmjs.org/ky/-/ky-0.28.7.tgz",
-      "integrity": "sha512-a23i6qSr/ep15vdtw/zyEQIDLoUaKDg9Jf04CYl/0ns/wXNYna26zJpI+MeIFaPeDvkrjLPrKtKOiiI3IE53RQ==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/ky?sponsor=1"
-      }
-    },
-    "node_modules/language-subtag-registry": {
-      "version": "0.3.21",
-      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
-      "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==",
-      "dev": true
-    },
-    "node_modules/language-tags": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
-      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
-      "dev": true,
-      "dependencies": {
-        "language-subtag-registry": "~0.3.2"
-      }
-    },
-    "node_modules/leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
-      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/loader-utils": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/loader-utils/node_modules/json5": {
-      "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"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/locate-path": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "node_modules/lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
-    },
-    "node_modules/lodash.escape": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
-      "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=",
-      "dev": true
-    },
-    "node_modules/lodash.flattendeep": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
-      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
-      "dev": true
-    },
-    "node_modules/lodash.isequal": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
-      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
-      "dev": true
-    },
-    "node_modules/lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "node_modules/lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
-    },
-    "node_modules/loose-envify": {
-      "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"
-      },
-      "bin": {
-        "loose-envify": "cli.js"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "dependencies": {
-        "sourcemap-codec": "^1.4.4"
-      }
-    },
-    "node_modules/make-dir": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/makeerror": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
-      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
-      "dev": true,
-      "dependencies": {
-        "tmpl": "1.0.5"
-      }
-    },
-    "node_modules/md5.js": {
-      "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"
-      }
-    },
-    "node_modules/mdn-data": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-      "dependencies": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.2.3"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/miller-rabin": {
-      "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"
-      },
-      "bin": {
-        "miller-rabin": "bin/miller-rabin"
-      }
-    },
-    "node_modules/miller-rabin/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/mime-db": {
-      "version": "1.51.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
-      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.34",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
-      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
-      "dependencies": {
-        "mime-db": "1.51.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
-    },
-    "node_modules/minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
-    },
-    "node_modules/mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/moment": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
-      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/moo": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
-      "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==",
-      "dev": true
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "node_modules/nano-css": {
-      "version": "5.3.4",
-      "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz",
-      "integrity": "sha512-wfcviJB6NOxDIDfr7RFn/GlaN7I/Bhe4d39ZRCJ3xvZX60LVe2qZ+rDqM49nm4YT81gAjzS+ZklhKP/Gnfnubg==",
-      "dependencies": {
-        "css-tree": "^1.1.2",
-        "csstype": "^3.0.6",
-        "fastest-stable-stringify": "^2.0.2",
-        "inline-style-prefixer": "^6.0.0",
-        "rtl-css-js": "^1.14.0",
-        "sourcemap-codec": "^1.4.8",
-        "stacktrace-js": "^2.0.2",
-        "stylis": "^4.0.6"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
-      }
-    },
-    "node_modules/nanoid": {
-      "version": "3.1.30",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
-      "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "node_modules/nearley": {
-      "version": "2.20.1",
-      "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
-      "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
-      "dev": true,
-      "dependencies": {
-        "commander": "^2.19.0",
-        "moo": "^0.5.0",
-        "railroad-diagrams": "^1.0.0",
-        "randexp": "0.4.6"
-      },
-      "bin": {
-        "nearley-railroad": "bin/nearley-railroad.js",
-        "nearley-test": "bin/nearley-test.js",
-        "nearley-unparse": "bin/nearley-unparse.js",
-        "nearleyc": "bin/nearleyc.js"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://nearley.js.org/#give-to-nearley"
-      }
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
-    },
-    "node_modules/next": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/next/-/next-12.0.7.tgz",
-      "integrity": "sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA==",
-      "dependencies": {
-        "@babel/runtime": "7.15.4",
-        "@hapi/accept": "5.0.2",
-        "@napi-rs/triples": "1.0.3",
-        "@next/env": "12.0.7",
-        "@next/polyfill-module": "12.0.7",
-        "@next/react-dev-overlay": "12.0.7",
-        "@next/react-refresh-utils": "12.0.7",
-        "acorn": "8.5.0",
-        "assert": "2.0.0",
-        "browserify-zlib": "0.2.0",
-        "browserslist": "4.16.6",
-        "buffer": "5.6.0",
-        "caniuse-lite": "^1.0.30001228",
-        "chalk": "2.4.2",
-        "chokidar": "3.5.1",
-        "constants-browserify": "1.0.0",
-        "crypto-browserify": "3.12.0",
-        "cssnano-simple": "3.0.0",
-        "domain-browser": "4.19.0",
-        "encoding": "0.1.13",
-        "etag": "1.8.1",
-        "events": "3.3.0",
-        "find-cache-dir": "3.3.1",
-        "get-orientation": "1.1.2",
-        "https-browserify": "1.0.0",
-        "image-size": "1.0.0",
-        "jest-worker": "27.0.0-next.5",
-        "node-fetch": "2.6.1",
-        "node-html-parser": "1.4.9",
-        "os-browserify": "0.3.0",
-        "p-limit": "3.1.0",
-        "path-browserify": "1.0.1",
-        "postcss": "8.2.15",
-        "process": "0.11.10",
-        "querystring-es3": "0.2.1",
-        "raw-body": "2.4.1",
-        "react-is": "17.0.2",
-        "react-refresh": "0.8.3",
-        "regenerator-runtime": "0.13.4",
-        "stream-browserify": "3.0.0",
-        "stream-http": "3.1.1",
-        "string_decoder": "1.3.0",
-        "styled-jsx": "5.0.0-beta.3",
-        "timers-browserify": "2.0.12",
-        "tty-browserify": "0.0.1",
-        "use-subscription": "1.5.1",
-        "util": "0.12.4",
-        "vm-browserify": "1.1.2",
-        "watchpack": "2.3.0"
-      },
-      "bin": {
-        "next": "dist/bin/next"
-      },
-      "engines": {
-        "node": ">=12.22.0"
-      },
-      "optionalDependencies": {
-        "@next/swc-android-arm64": "12.0.7",
-        "@next/swc-darwin-arm64": "12.0.7",
-        "@next/swc-darwin-x64": "12.0.7",
-        "@next/swc-linux-arm-gnueabihf": "12.0.7",
-        "@next/swc-linux-arm64-gnu": "12.0.7",
-        "@next/swc-linux-arm64-musl": "12.0.7",
-        "@next/swc-linux-x64-gnu": "12.0.7",
-        "@next/swc-linux-x64-musl": "12.0.7",
-        "@next/swc-win32-arm64-msvc": "12.0.7",
-        "@next/swc-win32-ia32-msvc": "12.0.7",
-        "@next/swc-win32-x64-msvc": "12.0.7"
-      },
-      "peerDependencies": {
-        "fibers": ">= 3.1.0",
-        "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0",
-        "react": "^17.0.2 || ^18.0.0-0",
-        "react-dom": "^17.0.2 || ^18.0.0-0",
-        "sass": "^1.3.0"
-      },
-      "peerDependenciesMeta": {
-        "fibers": {
-          "optional": true
-        },
-        "node-sass": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/next-pwa": {
-      "version": "5.4.4",
-      "resolved": "https://registry.npmjs.org/next-pwa/-/next-pwa-5.4.4.tgz",
-      "integrity": "sha512-Wo7DctXO9ZZzMCuRK/q2U3x5k49LBRv7p31woJIUfiR6tJChSMoojHUvvgeCY72gSo4mtovS5KRm6iHIs/kxeg==",
-      "dependencies": {
-        "babel-loader": "^8.2.3",
-        "clean-webpack-plugin": "^4.0.0",
-        "globby": "^11.0.4",
-        "terser-webpack-plugin": "^5.2.5",
-        "workbox-webpack-plugin": "^6.4.2",
-        "workbox-window": "^6.4.2"
-      },
-      "peerDependencies": {
-        "next": ">=9.0.0"
-      }
-    },
-    "node_modules/next/node_modules/@babel/runtime": {
-      "version": "7.15.4",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
-      "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
-      "dependencies": {
-        "regenerator-runtime": "^0.13.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/next/node_modules/acorn": {
-      "version": "8.5.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
-      "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/next/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/next/node_modules/browserslist": {
-      "version": "4.16.6",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
-      "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001219",
-        "colorette": "^1.2.2",
-        "electron-to-chromium": "^1.3.723",
-        "escalade": "^3.1.1",
-        "node-releases": "^1.1.71"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
-    },
-    "node_modules/next/node_modules/chalk": {
-      "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"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/next/node_modules/jest-worker": {
-      "version": "27.0.0-next.5",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz",
-      "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/next/node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/next/node_modules/node-fetch": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      }
-    },
-    "node_modules/next/node_modules/node-releases": {
-      "version": "1.1.77",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
-      "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ=="
-    },
-    "node_modules/next/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
-    },
-    "node_modules/next/node_modules/regenerator-runtime": {
-      "version": "0.13.4",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz",
-      "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g=="
-    },
-    "node_modules/next/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/next/node_modules/supports-color/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/node-html-parser": {
-      "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_modules/node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
-      "dev": true
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
-      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
-      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
-      "dev": true,
-      "dependencies": {
-        "boolbase": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/nth-check?sponsor=1"
-      }
-    },
-    "node_modules/nwsapi": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
-      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
-      "dev": true
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
-      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "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"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.entries": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
-      "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.fromentries": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
-      "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.hasown": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
-      "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
-      "dev": true,
-      "dependencies": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.values": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
-      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "node_modules/os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "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"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/p-locate/node_modules/p-limit": {
-      "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"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate/node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-asn1": {
-      "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"
-      }
-    },
-    "node_modules/parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
-      "dev": true
-    },
-    "node_modules/parse5-htmlparser2-tree-adapter": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
-      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
-      "dev": true,
-      "dependencies": {
-        "parse5": "^6.0.1"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pbkdf2": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
-      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
-      "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"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pirates": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
-      "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/platform": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
-      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
-    },
-    "node_modules/postcss": {
-      "version": "8.2.15",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz",
-      "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==",
-      "dependencies": {
-        "colorette": "^1.2.2",
-        "nanoid": "^3.1.23",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
-    },
-    "node_modules/postcss/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/prettier": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
-      "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
-      "dev": true,
-      "bin": {
-        "prettier": "bin-prettier.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/pretty-format": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz",
-      "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^27.4.2",
-        "ansi-regex": "^5.0.1",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^17.0.1"
-      },
-      "engines": {
-        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/pretty-format/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
-    },
-    "node_modules/private": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-      "dev": true,
-      "dependencies": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/prop-types": {
-      "version": "15.8.0",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.0.tgz",
-      "integrity": "sha512-fDGekdaHh65eI3lMi5OnErU6a8Ighg2KjcjQxO7m8VHyWjcPyj5kiOgV1LQDOOOgVy3+5FgjXvdSSX7B8/5/4g==",
-      "dependencies": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
-      }
-    },
-    "node_modules/prop-types-exact": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz",
-      "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3",
-        "object.assign": "^4.1.0",
-        "reflect.ownkeys": "^0.2.0"
-      }
-    },
-    "node_modules/psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
-    },
-    "node_modules/public-encrypt": {
-      "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"
-      }
-    },
-    "node_modules/public-encrypt/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/queue": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
-      "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
-      "dependencies": {
-        "inherits": "~2.0.3"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/raf": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
-      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
-      "dev": true,
-      "dependencies": {
-        "performance-now": "^2.1.0"
-      }
-    },
-    "node_modules/railroad-diagrams": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
-      "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=",
-      "dev": true
-    },
-    "node_modules/randexp": {
-      "version": "0.4.6",
-      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
-      "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
-      "dev": true,
-      "dependencies": {
-        "discontinuous-range": "1.0.0",
-        "ret": "~0.1.10"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/randombytes": {
-      "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"
-      }
-    },
-    "node_modules/randomfill": {
-      "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"
-      }
-    },
-    "node_modules/raw-body": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/raw-body/node_modules/iconv-lite": {
-      "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"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
-      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-addons-test-utils": {
-      "version": "15.6.2",
-      "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.6.2.tgz",
-      "integrity": "sha1-wStu/cIkfBDae4dw0YUICnsEcVY=",
-      "dev": true,
-      "peerDependencies": {
-        "react-dom": "^15.4.2"
-      }
-    },
-    "node_modules/react-display-name": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz",
-      "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==",
-      "dev": true
-    },
-    "node_modules/react-dom": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
-      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1",
-        "scheduler": "^0.20.2"
-      },
-      "peerDependencies": {
-        "react": "17.0.2"
-      }
-    },
-    "node_modules/react-fast-compare": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
-      "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
-    },
-    "node_modules/react-helmet": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz",
-      "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "prop-types": "^15.7.2",
-        "react-fast-compare": "^3.1.1",
-        "react-side-effect": "^2.1.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.3.0"
-      }
-    },
-    "node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
-    },
-    "node_modules/react-refresh": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
-      "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-shallow-renderer": {
-      "version": "16.14.1",
-      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
-      "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
-      "dev": true,
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "react-is": "^16.12.0 || ^17.0.0"
-      },
-      "peerDependencies": {
-        "react": "^16.0.0 || ^17.0.0"
-      }
-    },
-    "node_modules/react-side-effect": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz",
-      "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==",
-      "peerDependencies": {
-        "react": "^16.3.0 || ^17.0.0"
-      }
-    },
-    "node_modules/react-svg-ionicons": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/react-svg-ionicons/-/react-svg-ionicons-0.2.3.tgz",
-      "integrity": "sha512-/o8YFlMvKaO1EzYTYEEmvdDUt02eeGJhMD1Gmreq9gn9tVe1BRL2H6Rpfn1OBWH2X2Q+aZfaRNSTuiRk8L1iag==",
-      "dependencies": {
-        "@jsbits/get-package-version": "^1.0.3",
-        "invariant": "^2.0.0",
-        "prop-types": "^15.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.3"
-      }
-    },
-    "node_modules/react-test-renderer": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
-      "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
-      "dev": true,
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "react-is": "^17.0.2",
-        "react-shallow-renderer": "^16.13.1",
-        "scheduler": "^0.20.2"
-      },
-      "peerDependencies": {
-        "react": "17.0.2"
-      }
-    },
-    "node_modules/react-test-renderer/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
-    },
-    "node_modules/react-toggle-switch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/react-toggle-switch/-/react-toggle-switch-3.0.4.tgz",
-      "integrity": "sha512-eM2Izl0qNrdFZlmRwpXPpUjaYVISHVy8dxCN9l6eRZ7KpmrDsIGInDpoSRU2QPs596+Al+udOArdXX5wCRg0Gg==",
-      "deprecated": "This package is no longer maintained.  Please try something like react-switch instead.",
-      "peerDependencies": {
-        "prop-types": "^15.5.10",
-        "react": ">=0.13.3"
-      }
-    },
-    "node_modules/react-universal-interface": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
-      "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
-      "peerDependencies": {
-        "react": "*",
-        "tslib": "*"
-      }
-    },
-    "node_modules/react-use": {
-      "version": "17.3.2",
-      "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.3.2.tgz",
-      "integrity": "sha512-bj7OD0/1wL03KyWmzFXAFe425zziuTf7q8olwCYBfOeFHY1qfO1FAMjROQLsLZYwG4Rx63xAfb7XAbBrJsZmEw==",
-      "dependencies": {
-        "@types/js-cookie": "^2.2.6",
-        "@xobotyi/scrollbar-width": "^1.9.5",
-        "copy-to-clipboard": "^3.3.1",
-        "fast-deep-equal": "^3.1.3",
-        "fast-shallow-equal": "^1.0.0",
-        "js-cookie": "^2.2.1",
-        "nano-css": "^5.3.1",
-        "react-universal-interface": "^0.6.2",
-        "resize-observer-polyfill": "^1.5.1",
-        "screenfull": "^5.1.0",
-        "set-harmonic-interval": "^1.0.1",
-        "throttle-debounce": "^3.0.1",
-        "ts-easing": "^0.2.0",
-        "tslib": "^2.1.0"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0  || ^17.0.0",
-        "react-dom": "^16.8.0  || ^17.0.0"
-      }
-    },
-    "node_modules/readable-stream": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/readdirp": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/reflect.ownkeys": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz",
-      "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=",
-      "dev": true
-    },
-    "node_modules/regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
-    },
-    "node_modules/regenerate-unicode-properties": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
-      "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
-      "dependencies": {
-        "regenerate": "^1.4.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-      "dev": true
-    },
-    "node_modules/regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
-      "dependencies": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "node_modules/regexp.prototype.flags": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/regexpp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "node_modules/regexpu-core": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
-      "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
-      "dependencies": {
-        "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^9.0.0",
-        "regjsgen": "^0.5.2",
-        "regjsparser": "^0.7.0",
-        "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
-    },
-    "node_modules/regjsparser": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
-      "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
-      "dependencies": {
-        "jsesc": "~0.5.0"
-      },
-      "bin": {
-        "regjsparser": "bin/parser"
-      }
-    },
-    "node_modules/regjsparser/node_modules/jsesc": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      }
-    },
-    "node_modules/repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "dependencies": {
-        "is-finite": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/resize-observer-polyfill": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
-      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
-    },
-    "node_modules/resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "dependencies": {
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve.exports": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-      "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/ripemd160": {
-      "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"
-      }
-    },
-    "node_modules/rodal": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/rodal/-/rodal-1.8.1.tgz",
-      "integrity": "sha512-3BpwZrLpaWSDHu8Atzz/S83MkpqpnXL9uGjNPZy1N6V7p4eWWsBSP8er5t+1xV+fZmbGEjLTNo01pUzYHqc7vg==",
-      "dependencies": {
-        "classnames": "^2.2.6"
-      },
-      "peerDependencies": {
-        "prop-types": "^15.6.0",
-        "react": "^16.0.0"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "2.62.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz",
-      "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==",
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
-      "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.0.0"
-      }
-    },
-    "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/rollup-plugin-terser/node_modules/supports-color": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/rst-selector-parser": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
-      "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=",
-      "dev": true,
-      "dependencies": {
-        "lodash.flattendeep": "^4.4.0",
-        "nearley": "^2.7.10"
-      }
-    },
-    "node_modules/rtl-css-js": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.15.0.tgz",
-      "integrity": "sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==",
-      "dependencies": {
-        "@babel/runtime": "^7.1.2"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "node_modules/sass": {
-      "version": "1.45.2",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.2.tgz",
-      "integrity": "sha512-cKfs+F9AMPAFlbbTXNsbGvg3y58nV0mXA3E94jqaySKcC8Kq3/8983zVKQ0TLMUrHw7hF9Tnd3Bz9z5Xgtrl9g==",
-      "dependencies": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      },
-      "bin": {
-        "sass": "sass.js"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dev": true,
-      "dependencies": {
-        "xmlchars": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/scheduler": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
-      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "node_modules/schema-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-      "dependencies": {
-        "@types/json-schema": "^7.0.5",
-        "ajv": "^6.12.4",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 8.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/screenfull": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
-      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
-      "engines": {
-        "node": ">=0.10.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/scrypt-js": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
-      "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
-    },
-    "node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/serialize-javascript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/set-harmonic-interval": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
-      "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==",
-      "engines": {
-        "node": ">=6.9"
-      }
-    },
-    "node_modules/setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
-    },
-    "node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-    },
-    "node_modules/sha.js": {
-      "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"
-      },
-      "bin": {
-        "sha.js": "bin.js"
-      }
-    },
-    "node_modules/shallowequal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
-      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shell-quote": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
-      "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw=="
-    },
-    "node_modules/side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
-      "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
-      "dev": true
-    },
-    "node_modules/sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-      "dev": true
-    },
-    "node_modules/slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sorted-array": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/sorted-array/-/sorted-array-2.0.4.tgz",
-      "integrity": "sha512-58INzrX0rL6ttCfsGoFmOuQY5AjR6A5E/MmGKJ5JvWHOey6gOEOC6vO8K6C0Y2bQR6KJ8o8aFwHjp/mJ/HcYsQ=="
-    },
-    "node_modules/source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
-    },
-    "node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
-      "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.4.18",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
-      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "^0.5.6"
-      }
-    },
-    "node_modules/source-map-url": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
-    },
-    "node_modules/sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "node_modules/stack-generator": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz",
-      "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==",
-      "dependencies": {
-        "stackframe": "^1.1.1"
-      }
-    },
-    "node_modules/stack-utils": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-      "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/stack-utils/node_modules/escape-string-regexp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/stackframe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
-      "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA=="
-    },
-    "node_modules/stacktrace-gps": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz",
-      "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==",
-      "dependencies": {
-        "source-map": "0.5.6",
-        "stackframe": "^1.1.1"
-      }
-    },
-    "node_modules/stacktrace-gps/node_modules/source-map": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
-      "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/stacktrace-js": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
-      "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
-      "dependencies": {
-        "error-stack-parser": "^2.0.6",
-        "stack-generator": "^2.0.5",
-        "stacktrace-gps": "^3.0.4"
-      }
-    },
-    "node_modules/stacktrace-parser": {
-      "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"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/stacktrace-parser/node_modules/type-fest": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
-      "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/stream-browserify": {
-      "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"
-      }
-    },
-    "node_modules/stream-http": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz",
-      "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"
-      }
-    },
-    "node_modules/stream-parser": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
-      "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
-      "dependencies": {
-        "debug": "2"
-      }
-    },
-    "node_modules/stream-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/stream-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-    },
-    "node_modules/string_decoder": {
-      "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"
-      }
-    },
-    "node_modules/string_decoder/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/string-hash": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
-      "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs="
-    },
-    "node_modules/string-length": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
-      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
-      "dev": true,
-      "dependencies": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/string-length/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-length/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/string-width/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string.prototype.matchall": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz",
-      "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1",
-        "get-intrinsic": "^1.1.1",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "regexp.prototype.flags": "^1.3.1",
-        "side-channel": "^1.0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trim": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
-      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimstart": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "dependencies": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
-      "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/styled-components": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz",
-      "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/traverse": "^7.4.5",
-        "@emotion/is-prop-valid": "^0.8.8",
-        "@emotion/stylis": "^0.8.4",
-        "@emotion/unitless": "^0.7.4",
-        "babel-plugin-styled-components": ">= 1.12.0",
-        "css-to-react-native": "^3.0.0",
-        "hoist-non-react-statics": "^3.0.0",
-        "shallowequal": "^1.1.0",
-        "supports-color": "^5.5.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/styled-components"
-      },
-      "peerDependencies": {
-        "react": ">= 16.8.0",
-        "react-dom": ">= 16.8.0",
-        "react-is": ">= 16.8.0"
-      }
-    },
-    "node_modules/styled-components/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/styled-components/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/styled-jsx": {
-      "version": "5.0.0-beta.3",
-      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz",
-      "integrity": "sha512-HtDDGSFPvmjHIqWf9n8Oo54tAoY/DTplvlyOH2+YOtD80Sp31Ap8ffSmxhgk5EkUoJ7xepdXMGT650mSffWuRA==",
-      "dependencies": {
-        "@babel/plugin-syntax-jsx": "7.14.5",
-        "@babel/types": "7.15.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"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "peerDependencies": {
-        "react": ">= 16.8.0 || 17.x.x || 18.x.x"
-      },
-      "peerDependenciesMeta": {
-        "@babel/core": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/styled-jsx/node_modules/@babel/types": {
-      "version": "7.15.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
-      "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.14.9",
-        "to-fast-properties": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/convert-source-map": {
-      "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"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/json5": {
-      "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"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/loader-utils": {
-      "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"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/styled-jsx/node_modules/stylis": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
-      "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
-    },
-    "node_modules/stylis": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
-      "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
-    },
-    "node_modules/stylis-rule-sheet": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
-      "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==",
-      "peerDependencies": {
-        "stylis": "^3.5.0"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/supports-hyperlinks": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
-      "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-hyperlinks/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/sweetalert2": {
-      "version": "11.3.3",
-      "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.3.3.tgz",
-      "integrity": "sha512-10Keqbmjng/+XpkpSOQ6dttpztl7XNohjnpC6bX6XFgm0WpRXM81YE0wmonGYOP6uyzd76vpfnZS04PdVvO31Q==",
-      "funding": {
-        "url": "https://sweetalert2.github.io/#donations"
-      }
-    },
-    "node_modules/symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-      "dev": true
-    },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/temp-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
-      "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/tempy": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
-      "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
-      "dependencies": {
-        "is-stream": "^2.0.0",
-        "temp-dir": "^2.0.0",
-        "type-fest": "^0.16.0",
-        "unique-string": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/tempy/node_modules/type-fest": {
-      "version": "0.16.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
-      "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/terminal-link": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.2.1",
-        "supports-hyperlinks": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/terser": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
-      "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "acorn": "^8.5.0"
-      },
-      "peerDependenciesMeta": {
-        "acorn": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz",
-      "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==",
-      "dependencies": {
-        "jest-worker": "^27.4.1",
-        "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "esbuild": {
-          "optional": true
-        },
-        "uglify-js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-      "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/terser-webpack-plugin/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/terser/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/terser/node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/terser/node_modules/source-map-support/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "dependencies": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "node_modules/throat": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-      "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
-      "dev": true
-    },
-    "node_modules/throttle-debounce": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
-      "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/timers-browserify": {
-      "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"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/tmpl": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
-      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
-      "dev": true
-    },
-    "node_modules/to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "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"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/toggle-selection": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
-      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
-    },
-    "node_modules/toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/tough-cookie": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-      "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
-      "dev": true,
-      "dependencies": {
-        "psl": "^1.1.33",
-        "punycode": "^2.1.1",
-        "universalify": "^0.1.2"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-      "dev": true,
-      "dependencies": {
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ts-easing": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
-      "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
-    },
-    "node_modules/tsconfig-paths": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
-      "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
-      "dev": true,
-      "dependencies": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "node_modules/tsconfig-paths/node_modules/json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/tsconfig-paths/node_modules/strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-    },
-    "node_modules/tsutils": {
-      "version": "3.21.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^1.8.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      },
-      "peerDependencies": {
-        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
-      }
-    },
-    "node_modules/tsutils/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/type-detect": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz",
-      "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "dependencies": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "4.5.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
-      "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=4.2.0"
-      }
-    },
-    "node_modules/unbox-primitive": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
-      "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"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
-      "dependencies": {
-        "unicode-canonical-property-names-ecmascript": "^2.0.0",
-        "unicode-property-aliases-ecmascript": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-value-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-property-aliases-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "dependencies": {
-        "crypto-random-string": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/use-subscription": {
-      "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"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0"
-      }
-    },
-    "node_modules/userbase-js": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/userbase-js/-/userbase-js-2.8.0.tgz",
-      "integrity": "sha512-fjGgfpI018T+HY3k9XW1bkUyppHDa1bLzfJJ+Virq+58YzzcN74c5AF8W/cww76syyyscndbCvzLduvwiVKlwA==",
-      "dependencies": {
-        "@babel/runtime": "^7.9.2",
-        "base64-arraybuffer": "^0.2.0",
-        "diffie-hellman": "^5.0.3",
-        "scrypt-js": "^3.0.0",
-        "sorted-array": "^2.0.4",
-        "uuid": "^3.4.0"
-      }
-    },
-    "node_modules/util": {
-      "version": "0.12.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
-      "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
-      "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"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "node_modules/uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
-      "bin": {
-        "uuid": "bin/uuid"
-      }
-    },
-    "node_modules/v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
-      "dev": true
-    },
-    "node_modules/v8-to-istanbul": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz",
-      "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==",
-      "dev": true,
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0",
-        "source-map": "^0.7.3"
-      },
-      "engines": {
-        "node": ">=10.12.0"
-      }
-    },
-    "node_modules/v8-to-istanbul/node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
-    },
-    "node_modules/w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "dev": true,
-      "dependencies": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "node_modules/w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "dev": true,
-      "dependencies": {
-        "xml-name-validator": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/walker": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
-      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
-      "dev": true,
-      "dependencies": {
-        "makeerror": "1.0.12"
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz",
-      "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==",
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=10.4"
-      }
-    },
-    "node_modules/webpack": {
-      "version": "5.65.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz",
-      "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==",
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.50",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "acorn": "^8.4.1",
-        "acorn-import-assertions": "^1.7.6",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.8.3",
-        "es-module-lexer": "^0.9.0",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
-        "watchpack": "^2.3.1",
-        "webpack-sources": "^3.2.2"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-      "dependencies": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/webpack-sources/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/webpack/node_modules/@types/estree": {
-      "version": "0.0.50",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
-      "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
-    },
-    "node_modules/webpack/node_modules/schema-utils": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-      "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/webpack/node_modules/watchpack": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
-      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack/node_modules/webpack-sources": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz",
-      "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==",
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "dev": true,
-      "dependencies": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "node_modules/whatwg-encoding/node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
-      "dev": true
-    },
-    "node_modules/whatwg-url": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.7.0",
-        "tr46": "^2.1.0",
-        "webidl-conversions": "^6.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "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"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/which-typed-array": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
-      "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-abstract": "^1.18.5",
-        "foreach": "^2.0.5",
-        "has-tostringtag": "^1.0.0",
-        "is-typed-array": "^1.1.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/workbox-background-sync": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz",
-      "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==",
-      "dependencies": {
-        "idb": "^6.1.4",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-broadcast-update": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz",
-      "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-build": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz",
-      "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==",
-      "dependencies": {
-        "@apideck/better-ajv-errors": "^0.3.1",
-        "@babel/core": "^7.11.1",
-        "@babel/preset-env": "^7.11.0",
-        "@babel/runtime": "^7.11.2",
-        "@rollup/plugin-babel": "^5.2.0",
-        "@rollup/plugin-node-resolve": "^11.2.1",
-        "@rollup/plugin-replace": "^2.4.1",
-        "@surma/rollup-plugin-off-main-thread": "^2.2.3",
-        "ajv": "^8.6.0",
-        "common-tags": "^1.8.0",
-        "fast-json-stable-stringify": "^2.1.0",
-        "fs-extra": "^9.0.1",
-        "glob": "^7.1.6",
-        "lodash": "^4.17.20",
-        "pretty-bytes": "^5.3.0",
-        "rollup": "^2.43.1",
-        "rollup-plugin-terser": "^7.0.0",
-        "source-map": "^0.8.0-beta.0",
-        "source-map-url": "^0.4.0",
-        "stringify-object": "^3.3.0",
-        "strip-comments": "^2.0.1",
-        "tempy": "^0.6.0",
-        "upath": "^1.2.0",
-        "workbox-background-sync": "6.4.2",
-        "workbox-broadcast-update": "6.4.2",
-        "workbox-cacheable-response": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-expiration": "6.4.2",
-        "workbox-google-analytics": "6.4.2",
-        "workbox-navigation-preload": "6.4.2",
-        "workbox-precaching": "6.4.2",
-        "workbox-range-requests": "6.4.2",
-        "workbox-recipes": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2",
-        "workbox-streams": "6.4.2",
-        "workbox-sw": "6.4.2",
-        "workbox-window": "6.4.2"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/workbox-build/node_modules/ajv": {
-      "version": "8.8.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
-      "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/workbox-build/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
-    },
-    "node_modules/workbox-build/node_modules/source-map": {
-      "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"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/workbox-build/node_modules/tr46": {
-      "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"
-      }
-    },
-    "node_modules/workbox-build/node_modules/webidl-conversions": {
-      "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=="
-    },
-    "node_modules/workbox-build/node_modules/whatwg-url": {
-      "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"
-      }
-    },
-    "node_modules/workbox-cacheable-response": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz",
-      "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-core": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz",
-      "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw=="
-    },
-    "node_modules/workbox-expiration": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz",
-      "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==",
-      "dependencies": {
-        "idb": "^6.1.4",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-google-analytics": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz",
-      "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==",
-      "dependencies": {
-        "workbox-background-sync": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "node_modules/workbox-navigation-preload": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz",
-      "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-precaching": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz",
-      "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==",
-      "dependencies": {
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "node_modules/workbox-range-requests": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz",
-      "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-recipes": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz",
-      "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==",
-      "dependencies": {
-        "workbox-cacheable-response": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-expiration": "6.4.2",
-        "workbox-precaching": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "node_modules/workbox-routing": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz",
-      "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-strategies": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz",
-      "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==",
-      "dependencies": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/workbox-streams": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz",
-      "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==",
-      "dependencies": {
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2"
-      }
-    },
-    "node_modules/workbox-sw": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz",
-      "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg=="
-    },
-    "node_modules/workbox-webpack-plugin": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz",
-      "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==",
-      "dependencies": {
-        "fast-json-stable-stringify": "^2.1.0",
-        "pretty-bytes": "^5.4.1",
-        "source-map-url": "^0.4.0",
-        "upath": "^1.2.0",
-        "webpack-sources": "^1.4.3",
-        "workbox-build": "6.4.2"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "webpack": "^4.4.0 || ^5.9.0"
-      }
-    },
-    "node_modules/workbox-window": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz",
-      "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==",
-      "dependencies": {
-        "@types/trusted-types": "^2.0.2",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "node_modules/write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "node_modules/ws": {
-      "version": "7.5.6",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
-      "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.3.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
-      "dev": true
-    },
-    "node_modules/xmlchars": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
-      "dev": true
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "node_modules/yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "dev": true,
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    }
-  },
-  "dependencies": {
-    "@apideck/better-ajv-errors": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz",
-      "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==",
-      "requires": {
-        "json-schema": "^0.4.0",
-        "jsonpointer": "^5.0.0",
-        "leven": "^3.1.0"
-      }
-    },
-    "@babel/code-frame": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
-      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
-      "requires": {
-        "@babel/highlight": "^7.16.7"
-      }
-    },
-    "@babel/compat-data": {
-      "version": "7.16.4",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
-      "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q=="
-    },
-    "@babel/core": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz",
-      "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==",
-      "requires": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.7",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helpers": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.1.2",
-        "semver": "^6.3.0",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-          "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "@babel/generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz",
-      "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==",
-      "requires": {
-        "@babel/types": "^7.16.7",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
-      }
-    },
-    "@babel/helper-annotate-as-pure": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
-      "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
-      "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
-      "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-compilation-targets": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
-      "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
-      "requires": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-validator-option": "^7.16.7",
-        "browserslist": "^4.17.5",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "@babel/helper-create-class-features-plugin": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz",
-      "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7"
-      }
-    },
-    "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
-      "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "regexpu-core": "^4.7.1"
-      }
-    },
-    "@babel/helper-define-polyfill-provider": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz",
-      "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==",
-      "requires": {
-        "@babel/helper-compilation-targets": "^7.13.0",
-        "@babel/helper-module-imports": "^7.12.13",
-        "@babel/helper-plugin-utils": "^7.13.0",
-        "@babel/traverse": "^7.13.0",
-        "debug": "^4.1.1",
-        "lodash.debounce": "^4.0.8",
-        "resolve": "^1.14.2",
-        "semver": "^6.1.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "@babel/helper-environment-visitor": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
-      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-explode-assignable-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
-      "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
-      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
-      "requires": {
-        "@babel/helper-get-function-arity": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-get-function-arity": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
-      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
-      "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
-      "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
-      "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
-      "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
-      "requires": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
-      "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
-      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA=="
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz",
-      "integrity": "sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-wrap-function": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
-      "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
-      "requires": {
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-member-expression-to-functions": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
-      "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.16.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
-      "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
-      "requires": {
-        "@babel/types": "^7.16.0"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
-      "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
-      "requires": {
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
-      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
-    },
-    "@babel/helper-validator-option": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
-      "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ=="
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz",
-      "integrity": "sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw==",
-      "requires": {
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/helpers": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
-      "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
-      "requires": {
-        "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/highlight": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
-      "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-        },
-        "js-tokens": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz",
-      "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA=="
-    },
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
-      "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7"
-      }
-    },
-    "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz",
-      "integrity": "sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.7",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
-      }
-    },
-    "@babel/plugin-proposal-class-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
-      "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
-      "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-proposal-class-static-block": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
-      "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
-      "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5"
-      }
-    },
-    "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
-      "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
-      "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-json-strings": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
-      "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-json-strings": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
-      "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
-      "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
-      "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-      }
-    },
-    "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
-      "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
-      "requires": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.16.7"
-      }
-    },
-    "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
-      "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
-      "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
-      }
-    },
-    "@babel/plugin-proposal-private-methods": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz",
-      "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==",
-      "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
-      "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-create-class-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
-      }
-    },
-    "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
-      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-bigint": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-class-properties": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.12.13"
-      }
-    },
-    "@babel/plugin-syntax-class-static-block": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
-      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      }
-    },
-    "@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.3"
-      }
-    },
-    "@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-jsx": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz",
-      "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      }
-    },
-    "@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-private-property-in-object": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
-      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      }
-    },
-    "@babel/plugin-syntax-top-level-await": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      }
-    },
-    "@babel/plugin-syntax-typescript": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
-      "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-arrow-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
-      "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-async-to-generator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz",
-      "integrity": "sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg==",
-      "requires": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-remap-async-to-generator": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
-      "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-block-scoping": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
-      "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-classes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
-      "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-optimise-call-expression": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "globals": "^11.1.0"
-      }
-    },
-    "@babel/plugin-transform-computed-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
-      "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-destructuring": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
-      "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-dotall-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
-      "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
-      "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
-      "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
-      "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-for-of": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
-      "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-function-name": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
-      "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
-      "requires": {
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
-      "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
-      "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-modules-amd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
-      "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
-      "requires": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz",
-      "integrity": "sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w==",
-      "requires": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-simple-access": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
-      "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
-      "requires": {
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
-      }
-    },
-    "@babel/plugin-transform-modules-umd": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
-      "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
-      "requires": {
-        "@babel/helper-module-transforms": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz",
-      "integrity": "sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg==",
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-new-target": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
-      "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-object-super": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
-      "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-replace-supers": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-parameters": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
-      "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-property-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
-      "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-regenerator": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
-      "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
-      "requires": {
-        "regenerator-transform": "^0.14.2"
-      }
-    },
-    "@babel/plugin-transform-reserved-words": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
-      "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
-      "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-spread": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
-      "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
-      }
-    },
-    "@babel/plugin-transform-sticky-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
-      "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-template-literals": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
-      "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
-      "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-unicode-escapes": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
-      "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/plugin-transform-unicode-regex": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
-      "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
-      "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7"
-      }
-    },
-    "@babel/preset-env": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz",
-      "integrity": "sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ==",
-      "requires": {
-        "@babel/compat-data": "^7.16.4",
-        "@babel/helper-compilation-targets": "^7.16.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "@babel/helper-validator-option": "^7.16.7",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-async-generator-functions": "^7.16.7",
-        "@babel/plugin-proposal-class-properties": "^7.16.7",
-        "@babel/plugin-proposal-class-static-block": "^7.16.7",
-        "@babel/plugin-proposal-dynamic-import": "^7.16.7",
-        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
-        "@babel/plugin-proposal-json-strings": "^7.16.7",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
-        "@babel/plugin-proposal-numeric-separator": "^7.16.7",
-        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
-        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
-        "@babel/plugin-proposal-private-methods": "^7.16.7",
-        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-class-properties": "^7.12.13",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-        "@babel/plugin-syntax-top-level-await": "^7.14.5",
-        "@babel/plugin-transform-arrow-functions": "^7.16.7",
-        "@babel/plugin-transform-async-to-generator": "^7.16.7",
-        "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
-        "@babel/plugin-transform-block-scoping": "^7.16.7",
-        "@babel/plugin-transform-classes": "^7.16.7",
-        "@babel/plugin-transform-computed-properties": "^7.16.7",
-        "@babel/plugin-transform-destructuring": "^7.16.7",
-        "@babel/plugin-transform-dotall-regex": "^7.16.7",
-        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
-        "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
-        "@babel/plugin-transform-for-of": "^7.16.7",
-        "@babel/plugin-transform-function-name": "^7.16.7",
-        "@babel/plugin-transform-literals": "^7.16.7",
-        "@babel/plugin-transform-member-expression-literals": "^7.16.7",
-        "@babel/plugin-transform-modules-amd": "^7.16.7",
-        "@babel/plugin-transform-modules-commonjs": "^7.16.7",
-        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
-        "@babel/plugin-transform-modules-umd": "^7.16.7",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.7",
-        "@babel/plugin-transform-new-target": "^7.16.7",
-        "@babel/plugin-transform-object-super": "^7.16.7",
-        "@babel/plugin-transform-parameters": "^7.16.7",
-        "@babel/plugin-transform-property-literals": "^7.16.7",
-        "@babel/plugin-transform-regenerator": "^7.16.7",
-        "@babel/plugin-transform-reserved-words": "^7.16.7",
-        "@babel/plugin-transform-shorthand-properties": "^7.16.7",
-        "@babel/plugin-transform-spread": "^7.16.7",
-        "@babel/plugin-transform-sticky-regex": "^7.16.7",
-        "@babel/plugin-transform-template-literals": "^7.16.7",
-        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
-        "@babel/plugin-transform-unicode-escapes": "^7.16.7",
-        "@babel/plugin-transform-unicode-regex": "^7.16.7",
-        "@babel/preset-modules": "^0.1.5",
-        "@babel/types": "^7.16.7",
-        "babel-plugin-polyfill-corejs2": "^0.3.0",
-        "babel-plugin-polyfill-corejs3": "^0.4.0",
-        "babel-plugin-polyfill-regenerator": "^0.3.0",
-        "core-js-compat": "^3.19.1",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "@babel/preset-modules": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
-      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
-      }
-    },
-    "@babel/runtime": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
-      "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
-      "requires": {
-        "regenerator-runtime": "^0.13.4"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.13.9",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-          "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
-        }
-      }
-    },
-    "@babel/runtime-corejs3": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.7.tgz",
-      "integrity": "sha512-MiYR1yk8+TW/CpOD0CyX7ve9ffWTKqLk/L6pk8TPl0R8pNi+1pFY8fH9yET55KlvukQ4PAWfXsGr2YHVjcI4Pw==",
-      "dev": true,
-      "requires": {
-        "core-js-pure": "^3.19.0",
-        "regenerator-runtime": "^0.13.4"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.13.9",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-          "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/template": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
-      "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
-      "requires": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/types": "^7.16.7"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz",
-      "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==",
-      "requires": {
-        "@babel/code-frame": "^7.16.7",
-        "@babel/generator": "^7.16.7",
-        "@babel/helper-environment-visitor": "^7.16.7",
-        "@babel/helper-function-name": "^7.16.7",
-        "@babel/helper-hoist-variables": "^7.16.7",
-        "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/parser": "^7.16.7",
-        "@babel/types": "^7.16.7",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
-      }
-    },
-    "@babel/types": {
-      "version": "7.16.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz",
-      "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
-    "@bcoe/v8-coverage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-      "dev": true
-    },
-    "@emotion/is-prop-valid": {
-      "version": "0.8.8",
-      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
-      "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
-      "requires": {
-        "@emotion/memoize": "0.7.4"
-      }
-    },
-    "@emotion/memoize": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
-      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
-    },
-    "@emotion/stylis": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
-      "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
-    },
-    "@emotion/unitless": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
-      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
-    },
-    "@eslint/eslintrc": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
-      "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^9.2.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-          "dev": true
-        },
-        "globals": {
-          "version": "13.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-          "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.20.2"
-          }
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-          "dev": true,
-          "requires": {
-            "argparse": "^2.0.1"
-          }
-        },
-        "type-fest": {
-          "version": "0.20.2",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-          "dev": true
-        }
-      }
-    },
-    "@hapi/accept": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz",
-      "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==",
-      "requires": {
-        "@hapi/boom": "9.x.x",
-        "@hapi/hoek": "9.x.x"
-      }
-    },
-    "@hapi/boom": {
-      "version": "9.1.4",
-      "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
-      "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
-      "requires": {
-        "@hapi/hoek": "9.x.x"
-      }
-    },
-    "@hapi/hoek": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz",
-      "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw=="
-    },
-    "@humanwhocodes/config-array": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
-      "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
-      "dev": true,
-      "requires": {
-        "@humanwhocodes/object-schema": "^1.2.1",
-        "debug": "^4.1.1",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "@humanwhocodes/object-schema": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
-      "dev": true
-    },
-    "@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      }
-    },
-    "@istanbuljs/schema": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
-      "dev": true
-    },
-    "@jest/console": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz",
-      "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^27.4.2",
-        "jest-util": "^27.4.2",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jest/core": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz",
-      "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^27.4.2",
-        "@jest/reporters": "^27.4.5",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "emittery": "^0.8.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-changed-files": "^27.4.2",
-        "jest-config": "^27.4.5",
-        "jest-haste-map": "^27.4.5",
-        "jest-message-util": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-resolve-dependencies": "^27.4.5",
-        "jest-runner": "^27.4.5",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "jest-watcher": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "rimraf": "^3.0.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jest/environment": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz",
-      "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==",
-      "dev": true,
-      "requires": {
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2"
-      }
-    },
-    "@jest/fake-timers": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz",
-      "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "@sinonjs/fake-timers": "^8.0.1",
-        "@types/node": "*",
-        "jest-message-util": "^27.4.2",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2"
-      }
-    },
-    "@jest/globals": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz",
-      "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^27.4.4",
-        "@jest/types": "^27.4.2",
-        "expect": "^27.4.2"
-      }
-    },
-    "@jest/reporters": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz",
-      "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==",
-      "dev": true,
-      "requires": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^27.4.2",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.2.4",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.0.2",
-        "jest-haste-map": "^27.4.5",
-        "jest-resolve": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.0",
-        "string-length": "^4.0.1",
-        "terminal-link": "^2.0.0",
-        "v8-to-istanbul": "^8.1.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "istanbul-lib-instrument": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-          "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
-          "dev": true,
-          "requires": {
-            "@babel/core": "^7.7.5",
-            "@istanbuljs/schema": "^0.1.2",
-            "istanbul-lib-coverage": "^3.0.0",
-            "semver": "^6.3.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jest/source-map": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz",
-      "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.4",
-        "source-map": "^0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "@jest/test-result": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz",
-      "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      }
-    },
-    "@jest/test-sequencer": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz",
-      "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^27.4.2",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-runtime": "^27.4.5"
-      }
-    },
-    "@jest/transform": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz",
-      "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/types": "^27.4.2",
-        "babel-plugin-istanbul": "^6.0.0",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^1.4.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-regex-util": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "pirates": "^4.0.1",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.1",
-        "write-file-atomic": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jest/types": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz",
-      "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^16.0.0",
-        "chalk": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jsbits/get-package-version": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@jsbits/get-package-version/-/get-package-version-1.0.3.tgz",
-      "integrity": "sha512-IJy1jRL01x7p6UEpgKa1lVLstMUx8EiIR8pPoS5sBfsHEoeLkzYiNpAfxPx8zLDUJyS1yBbChJjcWdPqyH285w=="
-    },
-    "@napi-rs/triples": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz",
-      "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA=="
-    },
-    "@next/env": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.7.tgz",
-      "integrity": "sha512-TNDqBV37wd95SiNdZsSUq8gnnrTwr+aN9wqy4Zxrxw4bC/jCHNsbK94DxjkG99VL30VCRXXDBTA1/Wa2jIpF9Q=="
-    },
-    "@next/polyfill-module": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.7.tgz",
-      "integrity": "sha512-sA8LAMMlmcspIZw/jeQuJTyA3uGrqOhTBaQE+G9u6DPohqrBFRkaz7RzzJeqXkUXw600occsIBknSjyVd1R67A=="
-    },
-    "@next/react-dev-overlay": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.7.tgz",
-      "integrity": "sha512-dSQLgpZ5uzyittFtIHlJCLAbc0LlMFbRBSYuGsIlrtGyjYN+WMcnz8lK48VLxNPFGuB/hEzkWV4TW5Zu75+Fzg==",
-      "requires": {
-        "@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.3",
-        "source-map": "0.8.0-beta.0",
-        "stacktrace-parser": "0.1.10",
-        "strip-ansi": "6.0.1"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.12.11",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
-          "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
-          "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "source-map": {
-          "version": "0.8.0-beta.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
-          "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
-          "requires": {
-            "whatwg-url": "^7.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "tr46": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
-          "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        },
-        "webidl-conversions": {
-          "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": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
-          "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
-          "requires": {
-            "lodash.sortby": "^4.7.0",
-            "tr46": "^1.0.1",
-            "webidl-conversions": "^4.0.2"
-          }
-        }
-      }
-    },
-    "@next/react-refresh-utils": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.7.tgz",
-      "integrity": "sha512-Pglj1t+7RxH0txEqVcD8ZxrJgqLDmKvQDqxKq3ZPRWxMv7LTl7FVT2Pnb36QFeBwCvMVl67jxsADKsW0idz8sA==",
-      "requires": {}
-    },
-    "@next/swc-android-arm64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.7.tgz",
-      "integrity": "sha512-yViT7EEc7JqxncRT+ZTeTsrAYXLlcefo0Y0eAfYmmalGD2605L4FWAVrJi4WnrSLji7l+veczw1WBmNeHICKKA==",
-      "optional": true
-    },
-    "@next/swc-darwin-arm64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.7.tgz",
-      "integrity": "sha512-vhAyW2rDEUcQesRVaj0z1hSoz7QhDzzGd0V1/5/5i9YJOfOtyrPsVJ82tlf7BfXl6/Ep+eKNfWVIb5/Jv89EKg==",
-      "optional": true
-    },
-    "@next/swc-darwin-x64": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.7.tgz",
-      "integrity": "sha512-km+6Rx6TvbraoQ1f0MXa69ol/x0RxzucFGa2OgZaYJERas0spy0iwW8hpASsGcf597D8VRW1x+R2C7ZdjVBSTw==",
-      "optional": true
-    },
-    "@next/swc-linux-arm-gnueabihf": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.7.tgz",
-      "integrity": "sha512-d0zWr877YqZ2cf/DQy6obouaR39r0FPebcXj2nws9AC99m68CO2xVpWv9jT7mFvpY+T40HJisLH80jSZ2iQ9sA==",
-      "optional": true
-    },
-    "@next/swc-linux-arm64-gnu": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.7.tgz",
-      "integrity": "sha512-fdobh5u6gG13Gd5LkHhJ+W8tF9hbaFolRW99FhzArMe5/nMKlLdBymOxvitE3K4gSFQxbXJA6TbU0Vv0e59Kww==",
-      "optional": true
-    },
-    "@next/swc-linux-arm64-musl": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.7.tgz",
-      "integrity": "sha512-vx0c5Q3oIScFNT/4jI9rCe0yPzKuCqWOkiO/OOV0ixSI2gLhbrwDIcdkm79fKVn3i8JOJunxE4zDoFeR/g8xqQ==",
-      "optional": true
-    },
-    "@next/swc-linux-x64-gnu": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.7.tgz",
-      "integrity": "sha512-9ITyp6s6uGVKNx3C/GP7GrYycbcwTADG7TdIXzXUxOOZORrdB1GNg3w/EL3Am4VMPPEpO6v1RfKo2IKZpVKfTA==",
-      "optional": true
-    },
-    "@next/swc-linux-x64-musl": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.7.tgz",
-      "integrity": "sha512-C+k+cygbIZXYfc+Hx2fNPUBEg7jzio+mniP5ywZevuTXW14zodIfQ3ZMoMJR8EpOVvYpjWFk2uAjiwqgx8vo/g==",
-      "optional": true
-    },
-    "@next/swc-win32-arm64-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.7.tgz",
-      "integrity": "sha512-7jTRjOKkDVnb5s7VoHT7eX+eyT/5BQJ/ljP2G56riAgKGqPL63/V7FXemLhhLT67D+OjoP8DRA2E2ne6IPHk4w==",
-      "optional": true
-    },
-    "@next/swc-win32-ia32-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.7.tgz",
-      "integrity": "sha512-2u5pGDsk7H6gGxob2ATIojzlwKzgYsrijo7RRpXOiPePVqwPWg6/pmhaJzLdpfjaBgRg1NFmwSp/7Ump9X8Ijg==",
-      "optional": true
-    },
-    "@next/swc-win32-x64-msvc": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.7.tgz",
-      "integrity": "sha512-frEWtbf+q8Oz4e2UqKJrNssk6DZ6/NLCQXn5/ORWE9dPAfe9XS6aK5FRZ6DuEPmmKd5gOoRkKJFFz5nYd+TeyQ==",
-      "optional": true
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "requires": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@rollup/plugin-babel": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
-      "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
-      "requires": {
-        "@babel/helper-module-imports": "^7.10.4",
-        "@rollup/pluginutils": "^3.1.0"
-      }
-    },
-    "@rollup/plugin-node-resolve": {
-      "version": "11.2.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
-      "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
-      "requires": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
-      }
-    },
-    "@rollup/plugin-replace": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
-      "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
-      "requires": {
-        "@rollup/pluginutils": "^3.1.0",
-        "magic-string": "^0.25.7"
-      }
-    },
-    "@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
-      "requires": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
-      }
-    },
-    "@sinonjs/commons": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-      "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
-      "dev": true,
-      "requires": {
-        "type-detect": "4.0.8"
-      },
-      "dependencies": {
-        "type-detect": {
-          "version": "4.0.8",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-          "dev": true
-        }
-      }
-    },
-    "@sinonjs/fake-timers": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
-      "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
-      "dev": true,
-      "requires": {
-        "@sinonjs/commons": "^1.7.0"
-      }
-    },
-    "@surma/rollup-plugin-off-main-thread": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
-      "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
-      "requires": {
-        "ejs": "^3.1.6",
-        "json5": "^2.2.0",
-        "magic-string": "^0.25.0",
-        "string.prototype.matchall": "^4.0.6"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-          "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        }
-      }
-    },
-    "@tootallnate/once": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-      "dev": true
-    },
-    "@types/babel__core": {
-      "version": "7.1.18",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz",
-      "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==",
-      "devOptional": true,
-      "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "@types/babel__generator": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
-      "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
-      "devOptional": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__template": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
-      "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
-      "devOptional": true,
-      "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__traverse": {
-      "version": "7.14.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
-      "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
-      "devOptional": true,
-      "requires": {
-        "@babel/types": "^7.3.0"
-      }
-    },
-    "@types/cheerio": {
-      "version": "0.22.30",
-      "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz",
-      "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/enzyme": {
-      "version": "3.10.11",
-      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.11.tgz",
-      "integrity": "sha512-LEtC7zXsQlbGXWGcnnmOI7rTyP+i1QzQv4Va91RKXDEukLDaNyxu0rXlfMiGEhJwfgTPCTb0R+Pnlj//oM9e/w==",
-      "dev": true,
-      "requires": {
-        "@types/cheerio": "*",
-        "@types/react": "*"
-      }
-    },
-    "@types/eslint": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz",
-      "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==",
-      "requires": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "@types/eslint-scope": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.2.tgz",
-      "integrity": "sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ==",
-      "requires": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
-    },
-    "@types/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
-      "requires": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/graceful-fs": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-      "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/hoist-non-react-statics": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
-      "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
-      "requires": {
-        "@types/react": "*",
-        "hoist-non-react-statics": "^3.3.0"
-      }
-    },
-    "@types/istanbul-lib-coverage": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-      "dev": true
-    },
-    "@types/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "*"
-      }
-    },
-    "@types/istanbul-reports": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "@types/jest": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
-      "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
-      "dev": true,
-      "requires": {
-        "jest-diff": "^27.0.0",
-        "pretty-format": "^27.0.0"
-      }
-    },
-    "@types/js-cookie": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
-      "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
-    },
-    "@types/json-schema": {
-      "version": "7.0.9",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
-    },
-    "@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
-      "dev": true
-    },
-    "@types/minimatch": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
-      "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
-    },
-    "@types/node": {
-      "version": "17.0.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.6.tgz",
-      "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA=="
-    },
-    "@types/prettier": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz",
-      "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==",
-      "dev": true
-    },
-    "@types/prop-types": {
-      "version": "15.7.4",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
-      "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
-    },
-    "@types/react": {
-      "version": "17.0.38",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz",
-      "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==",
-      "requires": {
-        "@types/prop-types": "*",
-        "@types/scheduler": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "@types/react-dom": {
-      "version": "17.0.11",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
-      "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
-      "requires": {
-        "@types/react": "*"
-      }
-    },
-    "@types/react-helmet": {
-      "version": "6.1.5",
-      "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz",
-      "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==",
-      "dev": true,
-      "requires": {
-        "@types/react": "*"
-      }
-    },
-    "@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/scheduler": {
-      "version": "0.16.2",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
-      "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
-    },
-    "@types/stack-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
-      "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
-      "dev": true
-    },
-    "@types/styled-components": {
-      "version": "5.1.19",
-      "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.19.tgz",
-      "integrity": "sha512-hNj14Oamk7Jhb/fMMQG7TUkd3e8uMMgxsCTH+ueJNGdFo/PuhlGDQTPChqyilpZP0WttgBHkc2YyT5UG+yc6Yw==",
-      "requires": {
-        "@types/hoist-non-react-statics": "*",
-        "@types/react": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "@types/trusted-types": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
-      "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
-    },
-    "@types/yargs": {
-      "version": "16.0.4",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-      "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
-      "dev": true,
-      "requires": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "@types/yargs-parser": {
-      "version": "20.2.1",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
-      "dev": true
-    },
-    "@typescript-eslint/eslint-plugin": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz",
-      "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/experimental-utils": "5.8.1",
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "debug": "^4.3.2",
-        "functional-red-black-tree": "^1.0.1",
-        "ignore": "^5.1.8",
-        "regexpp": "^3.2.0",
-        "semver": "^7.3.5",
-        "tsutils": "^3.21.0"
-      }
-    },
-    "@typescript-eslint/experimental-utils": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz",
-      "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==",
-      "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.9",
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/typescript-estree": "5.8.1",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^3.0.0"
-      }
-    },
-    "@typescript-eslint/parser": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz",
-      "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/scope-manager": "5.8.1",
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/typescript-estree": "5.8.1",
-        "debug": "^4.3.2"
-      }
-    },
-    "@typescript-eslint/scope-manager": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz",
-      "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/visitor-keys": "5.8.1"
-      }
-    },
-    "@typescript-eslint/types": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz",
-      "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==",
-      "dev": true
-    },
-    "@typescript-eslint/typescript-estree": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz",
-      "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "5.8.1",
-        "@typescript-eslint/visitor-keys": "5.8.1",
-        "debug": "^4.3.2",
-        "globby": "^11.0.4",
-        "is-glob": "^4.0.3",
-        "semver": "^7.3.5",
-        "tsutils": "^3.21.0"
-      }
-    },
-    "@typescript-eslint/visitor-keys": {
-      "version": "5.8.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz",
-      "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==",
-      "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "5.8.1",
-        "eslint-visitor-keys": "^3.0.0"
-      }
-    },
-    "@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
-      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
-      "requires": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
-      }
-    },
-    "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
-      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
-    },
-    "@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
-      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
-    },
-    "@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
-      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
-    },
-    "@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
-      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
-      "requires": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
-      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
-    },
-    "@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
-      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
-      }
-    },
-    "@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
-      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
-      "requires": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
-      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
-      "requires": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
-      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
-    },
-    "@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
-      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
-      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
-      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
-      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
-      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@wojtekmaj/enzyme-adapter-react-17": {
-      "version": "0.6.6",
-      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.6.tgz",
-      "integrity": "sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==",
-      "dev": true,
-      "requires": {
-        "@wojtekmaj/enzyme-adapter-utils": "^0.1.2",
-        "enzyme-shallow-equal": "^1.0.0",
-        "has": "^1.0.0",
-        "prop-types": "^15.7.0",
-        "react-is": "^17.0.0",
-        "react-test-renderer": "^17.0.0"
-      },
-      "dependencies": {
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        }
-      }
-    },
-    "@wojtekmaj/enzyme-adapter-utils": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.2.tgz",
-      "integrity": "sha512-MM/DqDqvxNVlWLqSVQiUbRN9MuDLJfefmPbJ8ZKdmdf5ID8G+i42XhFpoQh5bAZUCdwzRae3+WSZl2lXcFOrhw==",
-      "dev": true,
-      "requires": {
-        "function.prototype.name": "^1.1.0",
-        "has": "^1.0.0",
-        "object.fromentries": "^2.0.0",
-        "prop-types": "^15.7.0"
-      }
-    },
-    "@xobotyi/scrollbar-width": {
-      "version": "1.9.5",
-      "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
-      "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
-    },
-    "@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
-    },
-    "@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
-    },
-    "abab": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
-      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
-      "dev": true
-    },
-    "acorn": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
-      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ=="
-    },
-    "acorn-globals": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.1.1",
-        "acorn-walk": "^7.1.1"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "dev": true
-        }
-      }
-    },
-    "acorn-import-assertions": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
-      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
-      "requires": {}
-    },
-    "acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "requires": {}
-    },
-    "acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-      "dev": true
-    },
-    "agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "dev": true,
-      "requires": {
-        "debug": "4"
-      }
-    },
-    "airbnb-prop-types": {
-      "version": "2.16.0",
-      "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
-      "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
-      "dev": true,
-      "requires": {
-        "array.prototype.find": "^2.1.1",
-        "function.prototype.name": "^1.1.2",
-        "is-regex": "^1.1.0",
-        "object-is": "^1.1.2",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.2",
-        "prop-types": "^15.7.2",
-        "prop-types-exact": "^1.2.0",
-        "react-is": "^16.13.1"
-      }
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "requires": {}
-    },
-    "anser": {
-      "version": "1.4.9",
-      "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz",
-      "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA=="
-    },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.21.3"
-      }
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "aria-query": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
-      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.10.2",
-        "@babel/runtime-corejs3": "^7.10.2"
-      }
-    },
-    "array-includes": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
-      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1",
-        "get-intrinsic": "^1.1.1",
-        "is-string": "^1.0.7"
-      }
-    },
-    "array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
-    },
-    "array.prototype.filter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz",
-      "integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "es-array-method-boxes-properly": "^1.0.0",
-        "is-string": "^1.0.7"
-      }
-    },
-    "array.prototype.find": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz",
-      "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      }
-    },
-    "array.prototype.flat": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
-      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      }
-    },
-    "array.prototype.flatmap": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
-      "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0"
-      }
-    },
-    "asn1.js": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
-      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "safer-buffer": "^2.1.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "assert": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
-      "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
-      "requires": {
-        "es6-object-assign": "^1.1.0",
-        "is-nan": "^1.2.1",
-        "object-is": "^1.0.1",
-        "util": "^0.12.0"
-      }
-    },
-    "ast-types-flow": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
-      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
-      "dev": true
-    },
-    "async": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
-      "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-    },
-    "at-least-node": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
-    },
-    "available-typed-arrays": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
-      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
-    },
-    "axe-core": {
-      "version": "4.3.5",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
-      "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
-      "dev": true
-    },
-    "axios": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
-      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
-      "requires": {
-        "follow-redirects": "^1.14.9",
-        "form-data": "^4.0.0"
-      },
-      "dependencies": {
-        "form-data": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-          "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-          "requires": {
-            "asynckit": "^0.4.0",
-            "combined-stream": "^1.0.8",
-            "mime-types": "^2.1.12"
-          }
-        }
-      }
-    },
-    "axobject-query": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
-      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
-      "dev": true
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      }
-    },
-    "babel-core": {
-      "version": "6.26.3",
-      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
-      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-generator": "^6.26.0",
-        "babel-helpers": "^6.24.1",
-        "babel-messages": "^6.23.0",
-        "babel-register": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "babel-template": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "convert-source-map": "^1.5.1",
-        "debug": "^2.6.9",
-        "json5": "^0.5.1",
-        "lodash": "^4.17.4",
-        "minimatch": "^3.0.4",
-        "path-is-absolute": "^1.0.1",
-        "private": "^0.1.8",
-        "slash": "^1.0.0",
-        "source-map": "^0.5.7"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "babel-eslint": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-          "dev": true
-        }
-      }
-    },
-    "babel-helpers": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
-      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-jest": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz",
-      "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==",
-      "dev": true,
-      "requires": {
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/babel__core": "^7.1.14",
-        "babel-plugin-istanbul": "^6.0.0",
-        "babel-preset-jest": "^27.4.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "babel-loader": {
-      "version": "8.2.3",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
-      "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
-      "requires": {
-        "find-cache-dir": "^3.3.1",
-        "loader-utils": "^1.4.0",
-        "make-dir": "^3.1.0",
-        "schema-utils": "^2.6.5"
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "requires": {
-        "object.assign": "^4.1.0"
-      }
-    },
-    "babel-plugin-istanbul": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
-      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@istanbuljs/load-nyc-config": "^1.0.0",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-instrument": "^5.0.4",
-        "test-exclude": "^6.0.0"
-      }
-    },
-    "babel-plugin-jest-hoist": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz",
-      "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.3.3",
-        "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.0.0",
-        "@types/babel__traverse": "^7.0.6"
-      }
-    },
-    "babel-plugin-polyfill-corejs2": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz",
-      "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==",
-      "requires": {
-        "@babel/compat-data": "^7.13.11",
-        "@babel/helper-define-polyfill-provider": "^0.3.0",
-        "semver": "^6.1.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "babel-plugin-polyfill-corejs3": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
-      "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==",
-      "requires": {
-        "@babel/helper-define-polyfill-provider": "^0.3.0",
-        "core-js-compat": "^3.18.0"
-      }
-    },
-    "babel-plugin-polyfill-regenerator": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz",
-      "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==",
-      "requires": {
-        "@babel/helper-define-polyfill-provider": "^0.3.0"
-      }
-    },
-    "babel-plugin-styled-components": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz",
-      "integrity": "sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw==",
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.16.0",
-        "@babel/helper-module-imports": "^7.16.0",
-        "babel-plugin-syntax-jsx": "^6.18.0",
-        "lodash": "^4.17.11"
-      }
-    },
-    "babel-plugin-syntax-jsx": {
-      "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="
-    },
-    "babel-preset-current-node-syntax": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-      "dev": true,
-      "requires": {
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-bigint": "^7.8.3",
-        "@babel/plugin-syntax-class-properties": "^7.8.3",
-        "@babel/plugin-syntax-import-meta": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3"
-      }
-    },
-    "babel-preset-jest": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz",
-      "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==",
-      "dev": true,
-      "requires": {
-        "babel-plugin-jest-hoist": "^27.4.0",
-        "babel-preset-current-node-syntax": "^1.0.0"
-      }
-    },
-    "babel-register": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
-      "dev": true,
-      "requires": {
-        "babel-core": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "core-js": "^2.5.0",
-        "home-or-tmp": "^2.0.0",
-        "lodash": "^4.17.4",
-        "mkdirp": "^0.5.1",
-        "source-map-support": "^0.4.15"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "globals": {
-          "version": "9.18.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      },
-      "dependencies": {
-        "to-fast-properties": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-          "dev": true
-        }
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "base64-arraybuffer": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
-      "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
-    },
-    "base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
-    },
-    "big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
-    },
-    "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
-    },
-    "bn.js": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
-      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
-    },
-    "boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
-      "dev": true
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "requires": {
-        "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": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
-      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
-      "requires": {
-        "bn.js": "^5.0.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
-      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
-      "requires": {
-        "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"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "browserslist": {
-      "version": "4.19.1",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
-      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
-      "requires": {
-        "caniuse-lite": "^1.0.30001286",
-        "electron-to-chromium": "^1.4.17",
-        "escalade": "^3.1.1",
-        "node-releases": "^2.0.1",
-        "picocolors": "^1.0.0"
-      }
-    },
-    "bser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-      "dev": true,
-      "requires": {
-        "node-int64": "^0.4.0"
-      }
-    },
-    "buffer": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
-      "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA=="
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
-    },
-    "camelize": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
-      "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
-    },
-    "caniuse-lite": {
-      "version": "1.0.30001294",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz",
-      "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g=="
-    },
-    "chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      }
-    },
-    "char-regex": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-      "dev": true
-    },
-    "cheerio": {
-      "version": "1.0.0-rc.10",
-      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
-      "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
-      "dev": true,
-      "requires": {
-        "cheerio-select": "^1.5.0",
-        "dom-serializer": "^1.3.2",
-        "domhandler": "^4.2.0",
-        "htmlparser2": "^6.1.0",
-        "parse5": "^6.0.1",
-        "parse5-htmlparser2-tree-adapter": "^6.0.1",
-        "tslib": "^2.2.0"
-      }
-    },
-    "cheerio-select": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
-      "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
-      "dev": true,
-      "requires": {
-        "css-select": "^4.1.3",
-        "css-what": "^5.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0",
-        "domutils": "^2.7.0"
-      }
-    },
-    "chokidar": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
-      "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
-      "requires": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.3.1",
-        "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"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        }
-      }
-    },
-    "chrome-trace-event": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
-      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
-    },
-    "ci-info": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
-      "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
-      "dev": true
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "cjs-module-lexer": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
-      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
-      "dev": true
-    },
-    "classnames": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
-      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
-    },
-    "clean-webpack-plugin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz",
-      "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==",
-      "requires": {
-        "del": "^4.1.1"
-      }
-    },
-    "cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-      "dev": true
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "colorette": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
-      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "common-tags": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
-      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "confusing-browser-globals": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
-      "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
-      "dev": true
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "convert-source-map": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
-      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "copy-to-clipboard": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
-      "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
-      "requires": {
-        "toggle-selection": "^1.0.6"
-      }
-    },
-    "core-js": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
-      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
-      "dev": true
-    },
-    "core-js-compat": {
-      "version": "3.20.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.1.tgz",
-      "integrity": "sha512-AVhKZNpqMV3Jz8hU0YEXXE06qoxtQGsAqU0u1neUngz5IusDJRX/ZJ6t3i7mS7QxNyEONbCo14GprkBrxPlTZA==",
-      "requires": {
-        "browserslist": "^4.19.1",
-        "semver": "7.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
-        }
-      }
-    },
-    "core-js-pure": {
-      "version": "3.20.1",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.1.tgz",
-      "integrity": "sha512-yeNNr3L9cEBwNy6vhhIJ0nko7fE7uFO6PgawcacGt2VWep4WqQx0RiqlkgSP7kqUMC1IKdfO9qPeWXcUheHLVQ==",
-      "dev": true
-    },
-    "create-ecdh": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
-      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.5.3"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "requires": {
-        "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": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "requires": {
-        "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"
-      }
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "requires": {
-        "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"
-      }
-    },
-    "crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
-    },
-    "css-color-keywords": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
-      "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
-    },
-    "css-in-js-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
-      "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
-      "requires": {
-        "hyphenate-style-name": "^1.0.2",
-        "isobject": "^3.0.1"
-      }
-    },
-    "css-select": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
-      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
-      "dev": true,
-      "requires": {
-        "boolbase": "^1.0.0",
-        "css-what": "^5.1.0",
-        "domhandler": "^4.3.0",
-        "domutils": "^2.8.0",
-        "nth-check": "^2.0.1"
-      }
-    },
-    "css-to-react-native": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz",
-      "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==",
-      "requires": {
-        "camelize": "^1.0.0",
-        "css-color-keywords": "^1.0.0",
-        "postcss-value-parser": "^4.0.2"
-      }
-    },
-    "css-tree": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
-      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
-      "requires": {
-        "mdn-data": "2.0.14",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
-      }
-    },
-    "css-what": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
-      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
-      "dev": true
-    },
-    "css.escape": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
-      "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
-    },
-    "cssnano-preset-simple": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz",
-      "integrity": "sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==",
-      "requires": {
-        "caniuse-lite": "^1.0.30001202"
-      }
-    },
-    "cssnano-simple": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz",
-      "integrity": "sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==",
-      "requires": {
-        "cssnano-preset-simple": "^3.0.0"
-      }
-    },
-    "cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
-      "dev": true
-    },
-    "cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-      "dev": true,
-      "requires": {
-        "cssom": "~0.3.6"
-      },
-      "dependencies": {
-        "cssom": {
-          "version": "0.3.8",
-          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-          "dev": true
-        }
-      }
-    },
-    "csstype": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
-      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
-    },
-    "damerau-levenshtein": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz",
-      "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==",
-      "dev": true
-    },
-    "data-uri-to-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
-      "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
-    },
-    "data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-      "dev": true,
-      "requires": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
-      }
-    },
-    "debug": {
-      "version": "4.3.3",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
-      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "decimal.js": {
-      "version": "10.3.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
-      "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
-      "dev": true
-    },
-    "dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "deep-eql": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz",
-      "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=",
-      "dev": true,
-      "requires": {
-        "type-detect": "^3.0.0"
-      }
-    },
-    "deep-is": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-      "dev": true
-    },
-    "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "del": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-      "requires": {
-        "@types/glob": "^7.1.1",
-        "globby": "^6.1.0",
-        "is-path-cwd": "^2.0.0",
-        "is-path-in-cwd": "^2.0.0",
-        "p-map": "^2.0.0",
-        "pify": "^4.0.1",
-        "rimraf": "^2.6.3"
-      },
-      "dependencies": {
-        "array-union": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-          "requires": {
-            "array-uniq": "^1.0.1"
-          }
-        },
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-          "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
-            }
-          }
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
-    },
-    "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-    },
-    "des.js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
-      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-      "dev": true
-    },
-    "diff-sequences": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz",
-      "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "requires": {
-        "path-type": "^4.0.0"
-      }
-    },
-    "discontinuous-range": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
-      "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=",
-      "dev": true
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dom-serializer": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
-      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.2.0",
-        "entities": "^2.0.0"
-      }
-    },
-    "domain-browser": {
-      "version": "4.19.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz",
-      "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ=="
-    },
-    "domelementtype": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
-      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
-      "dev": true
-    },
-    "domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "dev": true,
-      "requires": {
-        "webidl-conversions": "^5.0.0"
-      },
-      "dependencies": {
-        "webidl-conversions": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-          "dev": true
-        }
-      }
-    },
-    "domhandler": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
-      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "^2.2.0"
-      }
-    },
-    "domutils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
-      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
-      "dev": true,
-      "requires": {
-        "dom-serializer": "^1.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0"
-      }
-    },
-    "ejs": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
-      "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
-      "requires": {
-        "jake": "^10.6.1"
-      }
-    },
-    "electron-to-chromium": {
-      "version": "1.4.31",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz",
-      "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ=="
-    },
-    "elliptic": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
-      "requires": {
-        "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"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "emittery": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
-      "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
-      "dev": true
-    },
-    "emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
-      "dev": true
-    },
-    "emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
-    },
-    "encoding": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "requires": {
-        "iconv-lite": "^0.6.2"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "5.8.3",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
-      "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
-      "requires": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      }
-    },
-    "enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^4.1.1"
-      }
-    },
-    "entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-      "dev": true
-    },
-    "enzyme": {
-      "version": "3.11.0",
-      "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
-      "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==",
-      "dev": true,
-      "requires": {
-        "array.prototype.flat": "^1.2.3",
-        "cheerio": "^1.0.0-rc.3",
-        "enzyme-shallow-equal": "^1.0.1",
-        "function.prototype.name": "^1.1.2",
-        "has": "^1.0.3",
-        "html-element-map": "^1.2.0",
-        "is-boolean-object": "^1.0.1",
-        "is-callable": "^1.1.5",
-        "is-number-object": "^1.0.4",
-        "is-regex": "^1.0.5",
-        "is-string": "^1.0.5",
-        "is-subset": "^0.1.1",
-        "lodash.escape": "^4.0.1",
-        "lodash.isequal": "^4.5.0",
-        "object-inspect": "^1.7.0",
-        "object-is": "^1.0.2",
-        "object.assign": "^4.1.0",
-        "object.entries": "^1.1.1",
-        "object.values": "^1.1.1",
-        "raf": "^3.4.1",
-        "rst-selector-parser": "^2.2.3",
-        "string.prototype.trim": "^1.2.1"
-      }
-    },
-    "enzyme-adapter-react-16": {
-      "version": "1.15.6",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz",
-      "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==",
-      "dev": true,
-      "requires": {
-        "enzyme-adapter-utils": "^1.14.0",
-        "enzyme-shallow-equal": "^1.0.4",
-        "has": "^1.0.3",
-        "object.assign": "^4.1.2",
-        "object.values": "^1.1.2",
-        "prop-types": "^15.7.2",
-        "react-is": "^16.13.1",
-        "react-test-renderer": "^16.0.0-0",
-        "semver": "^5.7.0"
-      },
-      "dependencies": {
-        "react-test-renderer": {
-          "version": "16.14.0",
-          "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz",
-          "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4.1.1",
-            "prop-types": "^15.6.2",
-            "react-is": "^16.8.6",
-            "scheduler": "^0.19.1"
-          }
-        },
-        "scheduler": {
-          "version": "0.19.1",
-          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
-          "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
-          "dev": true,
-          "requires": {
-            "loose-envify": "^1.1.0",
-            "object-assign": "^4.1.1"
-          }
-        },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
-      }
-    },
-    "enzyme-adapter-utils": {
-      "version": "1.14.0",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz",
-      "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==",
-      "dev": true,
-      "requires": {
-        "airbnb-prop-types": "^2.16.0",
-        "function.prototype.name": "^1.1.3",
-        "has": "^1.0.3",
-        "object.assign": "^4.1.2",
-        "object.fromentries": "^2.0.3",
-        "prop-types": "^15.7.2",
-        "semver": "^5.7.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
-      }
-    },
-    "enzyme-shallow-equal": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz",
-      "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3",
-        "object-is": "^1.1.2"
-      }
-    },
-    "error-stack-parser": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
-      "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
-      "requires": {
-        "stackframe": "^1.1.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
-      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.1",
-        "get-symbol-description": "^1.0.0",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
-        "is-negative-zero": "^2.0.1",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.1",
-        "is-string": "^1.0.7",
-        "is-weakref": "^1.0.1",
-        "object-inspect": "^1.11.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.1"
-      }
-    },
-    "es-array-method-boxes-properly": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
-      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
-      "dev": true
-    },
-    "es-module-lexer": {
-      "version": "0.9.3",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
-      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
-    },
-    "es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
-    },
-    "es6-object-assign": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
-      "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw="
-    },
-    "escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "escodegen": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-      "dev": true,
-      "requires": {
-        "esprima": "^4.0.1",
-        "estraverse": "^5.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "dev": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        }
-      }
-    },
-    "eslint": {
-      "version": "8.6.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz",
-      "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==",
-      "dev": true,
-      "requires": {
-        "@eslint/eslintrc": "^1.0.5",
-        "@humanwhocodes/config-array": "^0.9.2",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.0",
-        "eslint-utils": "^3.0.0",
-        "eslint-visitor-keys": "^3.1.0",
-        "espree": "^9.3.0",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^6.0.1",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^4.1.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.2.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.1",
-        "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "argparse": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-          "dev": true
-        },
-        "eslint-scope": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
-          "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
-          "dev": true,
-          "requires": {
-            "esrecurse": "^4.3.0",
-            "estraverse": "^5.2.0"
-          }
-        },
-        "globals": {
-          "version": "13.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
-          "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.20.2"
-          }
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-          "dev": true,
-          "requires": {
-            "argparse": "^2.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "type-fest": {
-          "version": "0.20.2",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-config-airbnb": {
-      "version": "19.0.4",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
-      "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
-      "dev": true,
-      "requires": {
-        "eslint-config-airbnb-base": "^15.0.0",
-        "object.assign": "^4.1.2",
-        "object.entries": "^1.1.5"
-      }
-    },
-    "eslint-config-airbnb-base": {
-      "version": "15.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
-      "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
-      "dev": true,
-      "requires": {
-        "confusing-browser-globals": "^1.0.10",
-        "object.assign": "^4.1.2",
-        "object.entries": "^1.1.5",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-config-prettier": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
-      "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
-      "dev": true,
-      "requires": {}
-    },
-    "eslint-import-resolver-node": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
-      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.2.7",
-        "resolve": "^1.20.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
-      }
-    },
-    "eslint-module-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
-      "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.2.7",
-        "find-up": "^2.1.0",
-        "pkg-dir": "^2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "find-up": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-          "dev": true,
-          "requires": {
-            "locate-path": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-babel": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz",
-      "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==",
-      "dev": true,
-      "requires": {
-        "eslint-rule-composer": "^0.3.0"
-      }
-    },
-    "eslint-plugin-import": {
-      "version": "2.25.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz",
-      "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.4",
-        "array.prototype.flat": "^1.2.5",
-        "debug": "^2.6.9",
-        "doctrine": "^2.1.0",
-        "eslint-import-resolver-node": "^0.3.6",
-        "eslint-module-utils": "^2.7.1",
-        "has": "^1.0.3",
-        "is-core-module": "^2.8.0",
-        "is-glob": "^4.0.3",
-        "minimatch": "^3.0.4",
-        "object.values": "^1.1.5",
-        "resolve": "^1.20.0",
-        "tsconfig-paths": "^3.11.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "doctrine": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-jsx-a11y": {
-      "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
-      "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.16.3",
-        "aria-query": "^4.2.2",
-        "array-includes": "^3.1.4",
-        "ast-types-flow": "^0.0.7",
-        "axe-core": "^4.3.5",
-        "axobject-query": "^2.2.0",
-        "damerau-levenshtein": "^1.0.7",
-        "emoji-regex": "^9.2.2",
-        "has": "^1.0.3",
-        "jsx-ast-utils": "^3.2.1",
-        "language-tags": "^1.0.5",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "eslint-plugin-react": {
-      "version": "7.28.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
-      "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.4",
-        "array.prototype.flatmap": "^1.2.5",
-        "doctrine": "^2.1.0",
-        "estraverse": "^5.3.0",
-        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
-        "minimatch": "^3.0.4",
-        "object.entries": "^1.1.5",
-        "object.fromentries": "^2.0.5",
-        "object.hasown": "^1.1.0",
-        "object.values": "^1.1.5",
-        "prop-types": "^15.7.2",
-        "resolve": "^2.0.0-next.3",
-        "semver": "^6.3.0",
-        "string.prototype.matchall": "^4.0.6"
-      },
-      "dependencies": {
-        "doctrine": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2"
-          }
-        },
-        "resolve": {
-          "version": "2.0.0-next.3",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
-          "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
-          "dev": true,
-          "requires": {
-            "is-core-module": "^2.2.0",
-            "path-parse": "^1.0.6"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-rule-composer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
-      "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
-      "dev": true
-    },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
-        }
-      }
-    },
-    "eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
-      "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
-      "dev": true
-    },
-    "espree": {
-      "version": "9.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
-      "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
-      "dev": true,
-      "requires": {
-        "acorn": "^8.7.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^3.1.0"
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.1.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "requires": {
-        "estraverse": "^5.2.0"
-      }
-    },
-    "estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
-    },
-    "estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
-    },
-    "events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true
-    },
-    "expect": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz",
-      "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "ansi-styles": "^5.0.0",
-        "jest-get-type": "^27.4.0",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-regex-util": "^27.4.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-          "dev": true
-        }
-      }
-    },
-    "expect-enzyme": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/expect-enzyme/-/expect-enzyme-1.3.0.tgz",
-      "integrity": "sha512-bV+xqYOC4Hm4LfFJDLKcs8fIH5jb4UZJCUXP2t2bixHuOXPJPwVw4I67u6YvlZUDiLmCSi7rVo1x/fjLLfUDAw==",
-      "dev": true,
-      "requires": {
-        "deep-eql": "^2.0.2",
-        "react-display-name": "^0.2.0",
-        "stringify-object": "^3.2.0"
-      }
-    },
-    "fast-deep-equal": {
-      "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=="
-    },
-    "fast-glob": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
-      "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.4"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        }
-      }
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fast-shallow-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
-      "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
-    },
-    "fastest-stable-stringify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
-      "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
-    },
-    "fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
-      "requires": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "fb-watchman": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
-      "dev": true,
-      "requires": {
-        "bser": "2.1.1"
-      }
-    },
-    "file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^3.0.4"
-      }
-    },
-    "filelist": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
-      "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
-      "requires": {
-        "minimatch": "^3.0.4"
-      }
-    },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "requires": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "find-cache-dir": {
-      "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==",
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^3.0.2",
-        "pkg-dir": "^4.1.0"
-      },
-      "dependencies": {
-        "pkg-dir": {
-          "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==",
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        }
-      }
-    },
-    "find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "requires": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      }
-    },
-    "flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
-      "requires": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      }
-    },
-    "flatted": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
-      "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
-      "dev": true
-    },
-    "follow-redirects": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
-      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
-    },
-    "foreach": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
-    },
-    "form-data": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "requires": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "dependencies": {
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
-        }
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "function.prototype.name": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
-      "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "functions-have-names": "^1.2.2"
-      }
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "functions-have-names": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
-      "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
-      "dev": true
-    },
-    "gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "get-orientation": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz",
-      "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==",
-      "requires": {
-        "stream-parser": "^0.3.1"
-      }
-    },
-    "get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
-    },
-    "get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "dev": true
-    },
-    "get-symbol-description": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
-      }
-    },
-    "glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.3"
-      }
-    },
-    "glob-to-regexp": {
-      "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=="
-    },
-    "globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
-    },
-    "globby": {
-      "version": "11.0.4",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
-      "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
-      "requires": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
-        }
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
-      "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
-    },
-    "harmony-reflect": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
-      "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
-      "dev": true
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-    },
-    "has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
-    },
-    "has-tostringtag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "requires": {
-        "has-symbols": "^1.0.2"
-      }
-    },
-    "hash-base": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
-      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
-      "requires": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
-      }
-    },
-    "hash.js": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
-      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "hoist-non-react-statics": {
-      "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==",
-      "requires": {
-        "react-is": "^16.7.0"
-      }
-    },
-    "home-or-tmp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
-      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.1"
-      }
-    },
-    "html-element-map": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz",
-      "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==",
-      "dev": true,
-      "requires": {
-        "array.prototype.filter": "^1.0.0",
-        "call-bind": "^1.0.2"
-      }
-    },
-    "html-encoding-sniffer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-      "dev": true,
-      "requires": {
-        "whatwg-encoding": "^1.0.5"
-      }
-    },
-    "html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
-    },
-    "htmlparser2": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
-      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.0.0",
-        "domutils": "^2.5.2",
-        "entities": "^2.0.0"
-      }
-    },
-    "http-errors": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
-      "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
-      }
-    },
-    "http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-      "dev": true,
-      "requires": {
-        "@tootallnate/once": "1",
-        "agent-base": "6",
-        "debug": "4"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
-      "dev": true,
-      "requires": {
-        "agent-base": "6",
-        "debug": "4"
-      }
-    },
-    "human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-      "dev": true
-    },
-    "hyphenate-style-name": {
-      "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": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      }
-    },
-    "idb": {
-      "version": "6.1.5",
-      "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz",
-      "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw=="
-    },
-    "identity-obj-proxy": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
-      "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
-      "dev": true,
-      "requires": {
-        "harmony-reflect": "^1.4.6"
-      }
-    },
-    "ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
-    },
-    "ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
-    },
-    "image-size": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
-      "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
-      "requires": {
-        "queue": "6.0.2"
-      }
-    },
-    "immutable": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
-      "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw=="
-    },
-    "import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-          "dev": true
-        }
-      }
-    },
-    "import-local": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
-      "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "dependencies": {
-        "pkg-dir": {
-          "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==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        }
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "inline-style-prefixer": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz",
-      "integrity": "sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==",
-      "requires": {
-        "css-in-js-utils": "^2.0.0"
-      }
-    },
-    "internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "requires": {
-        "get-intrinsic": "^1.1.0",
-        "has": "^1.0.3",
-        "side-channel": "^1.0.4"
-      }
-    },
-    "invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "requires": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "is-arguments": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
-      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "requires": {
-        "has-bigints": "^1.0.1"
-      }
-    },
-    "is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
-    },
-    "is-core-module": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
-      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
-    },
-    "is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true
-    },
-    "is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-      "dev": true
-    },
-    "is-generator-function": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
-      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
-    },
-    "is-nan": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
-      "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "is-negative-zero": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
-    },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
-    },
-    "is-number-object": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
-      "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
-    },
-    "is-path-cwd": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
-    },
-    "is-path-in-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-      "requires": {
-        "is-path-inside": "^2.1.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-      "requires": {
-        "path-is-inside": "^1.0.2"
-      }
-    },
-    "is-potential-custom-element-name": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
-      "dev": true
-    },
-    "is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
-    },
-    "is-shared-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
-    },
-    "is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
-    },
-    "is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "requires": {
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-subset": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
-      "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
-      "dev": true
-    },
-    "is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "requires": {
-        "has-symbols": "^1.0.2"
-      }
-    },
-    "is-typed-array": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
-      "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
-      "requires": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-abstract": "^1.18.5",
-        "foreach": "^2.0.5",
-        "has-tostringtag": "^1.0.0"
-      }
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-weakref": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "requires": {
-        "call-bind": "^1.0.2"
-      }
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-    },
-    "istanbul-lib-coverage": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
-      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
-      "dev": true
-    },
-    "istanbul-lib-instrument": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
-      "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
-      "requires": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-lib-source-maps": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "istanbul-reports": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz",
-      "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==",
-      "dev": true,
-      "requires": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      }
-    },
-    "jake": {
-      "version": "10.8.2",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
-      "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
-      "requires": {
-        "async": "0.9.x",
-        "chalk": "^2.4.2",
-        "filelist": "^1.0.1",
-        "minimatch": "^3.0.4"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "jest": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz",
-      "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==",
-      "dev": true,
-      "requires": {
-        "@jest/core": "^27.4.5",
-        "import-local": "^3.0.2",
-        "jest-cli": "^27.4.5"
-      }
-    },
-    "jest-changed-files": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz",
-      "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "execa": "^5.0.0",
-        "throat": "^6.0.1"
-      }
-    },
-    "jest-circus": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz",
-      "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^27.4.4",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "dedent": "^0.7.0",
-        "expect": "^27.4.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^27.4.2",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3",
-        "throat": "^6.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-cli": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz",
-      "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==",
-      "dev": true,
-      "requires": {
-        "@jest/core": "^27.4.5",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "import-local": "^3.0.2",
-        "jest-config": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "prompts": "^2.0.1",
-        "yargs": "^16.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-config": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz",
-      "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/test-sequencer": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "babel-jest": "^27.4.5",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.2.4",
-        "jest-circus": "^27.4.5",
-        "jest-environment-jsdom": "^27.4.4",
-        "jest-environment-node": "^27.4.4",
-        "jest-get-type": "^27.4.0",
-        "jest-jasmine2": "^27.4.5",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-runner": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-diff": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz",
-      "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "diff-sequences": "^27.4.0",
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-docblock": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz",
-      "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==",
-      "dev": true,
-      "requires": {
-        "detect-newline": "^3.0.0"
-      }
-    },
-    "jest-each": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz",
-      "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-environment-jsdom": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz",
-      "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^27.4.4",
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2",
-        "jsdom": "^16.6.0"
-      }
-    },
-    "jest-environment-node": {
-      "version": "27.4.4",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz",
-      "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^27.4.4",
-        "@jest/fake-timers": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "jest-mock": "^27.4.2",
-        "jest-util": "^27.4.2"
-      }
-    },
-    "jest-get-type": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz",
-      "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==",
-      "dev": true
-    },
-    "jest-haste-map": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz",
-      "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "@types/graceful-fs": "^4.1.2",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "fsevents": "^2.3.2",
-        "graceful-fs": "^4.2.4",
-        "jest-regex-util": "^27.4.0",
-        "jest-serializer": "^27.4.0",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "micromatch": "^4.0.4",
-        "walker": "^1.0.7"
-      }
-    },
-    "jest-jasmine2": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz",
-      "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==",
-      "dev": true,
-      "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@jest/environment": "^27.4.4",
-        "@jest/source-map": "^27.4.0",
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "expect": "^27.4.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^27.4.2",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-runtime": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "pretty-format": "^27.4.2",
-        "throat": "^6.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-leak-detector": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz",
-      "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==",
-      "dev": true,
-      "requires": {
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      }
-    },
-    "jest-matcher-utils": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz",
-      "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^27.4.2",
-        "jest-get-type": "^27.4.0",
-        "pretty-format": "^27.4.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-message-util": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz",
-      "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^27.4.2",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^27.4.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-mock": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz",
-      "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*"
-      }
-    },
-    "jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true,
-      "requires": {}
-    },
-    "jest-regex-util": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz",
-      "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==",
-      "dev": true
-    },
-    "jest-resolve": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz",
-      "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "resolve": "^1.20.0",
-        "resolve.exports": "^1.1.0",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-resolve-dependencies": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz",
-      "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-snapshot": "^27.4.5"
-      }
-    },
-    "jest-runner": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz",
-      "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^27.4.2",
-        "@jest/environment": "^27.4.4",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.8.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-docblock": "^27.4.0",
-        "jest-environment-jsdom": "^27.4.4",
-        "jest-environment-node": "^27.4.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-leak-detector": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-resolve": "^27.4.5",
-        "jest-runtime": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-worker": "^27.4.5",
-        "source-map-support": "^0.5.6",
-        "throat": "^6.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "source-map-support": {
-          "version": "0.5.21",
-          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-          "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-          "dev": true,
-          "requires": {
-            "buffer-from": "^1.0.0",
-            "source-map": "^0.6.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-runtime": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz",
-      "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^27.4.2",
-        "@jest/environment": "^27.4.4",
-        "@jest/globals": "^27.4.4",
-        "@jest/source-map": "^27.4.0",
-        "@jest/test-result": "^27.4.2",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/yargs": "^16.0.0",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^1.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "execa": "^5.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^27.4.5",
-        "jest-message-util": "^27.4.2",
-        "jest-mock": "^27.4.2",
-        "jest-regex-util": "^27.4.0",
-        "jest-resolve": "^27.4.5",
-        "jest-snapshot": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "jest-validate": "^27.4.2",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0",
-        "yargs": "^16.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-serializer": {
-      "version": "27.4.0",
-      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz",
-      "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "graceful-fs": "^4.2.4"
-      }
-    },
-    "jest-snapshot": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz",
-      "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.7.2",
-        "@babel/generator": "^7.7.2",
-        "@babel/parser": "^7.7.2",
-        "@babel/plugin-syntax-typescript": "^7.7.2",
-        "@babel/traverse": "^7.7.2",
-        "@babel/types": "^7.0.0",
-        "@jest/transform": "^27.4.5",
-        "@jest/types": "^27.4.2",
-        "@types/babel__traverse": "^7.0.4",
-        "@types/prettier": "^2.1.5",
-        "babel-preset-current-node-syntax": "^1.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^27.4.2",
-        "graceful-fs": "^4.2.4",
-        "jest-diff": "^27.4.2",
-        "jest-get-type": "^27.4.0",
-        "jest-haste-map": "^27.4.5",
-        "jest-matcher-utils": "^27.4.2",
-        "jest-message-util": "^27.4.2",
-        "jest-resolve": "^27.4.5",
-        "jest-util": "^27.4.2",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^27.4.2",
-        "semver": "^7.3.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-util": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz",
-      "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "graceful-fs": "^4.2.4",
-        "picomatch": "^2.2.3"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-validate": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz",
-      "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^27.4.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^27.4.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "camelcase": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
-          "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-watcher": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz",
-      "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^27.4.2",
-        "@jest/types": "^27.4.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "jest-util": "^27.4.2",
-        "string-length": "^4.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-worker": {
-      "version": "27.4.5",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz",
-      "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==",
-      "requires": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "8.1.1",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "js-cookie": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
-      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
-    },
-    "js-tokens": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
-    },
-    "js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "jsdom": {
-      "version": "16.7.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-      "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-      "dev": true,
-      "requires": {
-        "abab": "^2.0.5",
-        "acorn": "^8.2.4",
-        "acorn-globals": "^6.0.0",
-        "cssom": "^0.4.4",
-        "cssstyle": "^2.3.0",
-        "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.1",
-        "domexception": "^2.0.1",
-        "escodegen": "^2.0.0",
-        "form-data": "^3.0.0",
-        "html-encoding-sniffer": "^2.0.1",
-        "http-proxy-agent": "^4.0.1",
-        "https-proxy-agent": "^5.0.0",
-        "is-potential-custom-element-name": "^1.0.1",
-        "nwsapi": "^2.2.0",
-        "parse5": "6.0.1",
-        "saxes": "^5.0.1",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^4.0.0",
-        "w3c-hr-time": "^1.0.2",
-        "w3c-xmlserializer": "^2.0.0",
-        "webidl-conversions": "^6.1.0",
-        "whatwg-encoding": "^1.0.5",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.5.0",
-        "ws": "^7.4.6",
-        "xml-name-validator": "^3.0.0"
-      }
-    },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
-    },
-    "json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
-    },
-    "jsonfile": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-      "requires": {
-        "graceful-fs": "^4.1.6",
-        "universalify": "^2.0.0"
-      },
-      "dependencies": {
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
-        }
-      }
-    },
-    "jsonpointer": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz",
-      "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg=="
-    },
-    "jsx-ast-utils": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
-      "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
-      "dev": true,
-      "requires": {
-        "array-includes": "^3.1.3",
-        "object.assign": "^4.1.2"
-      }
-    },
-    "kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true
-    },
-    "ky": {
-      "version": "0.28.7",
-      "resolved": "https://registry.npmjs.org/ky/-/ky-0.28.7.tgz",
-      "integrity": "sha512-a23i6qSr/ep15vdtw/zyEQIDLoUaKDg9Jf04CYl/0ns/wXNYna26zJpI+MeIFaPeDvkrjLPrKtKOiiI3IE53RQ=="
-    },
-    "language-subtag-registry": {
-      "version": "0.3.21",
-      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
-      "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==",
-      "dev": true
-    },
-    "language-tags": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
-      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
-      "dev": true,
-      "requires": {
-        "language-subtag-registry": "~0.3.2"
-      }
-    },
-    "leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
-    },
-    "levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      }
-    },
-    "loader-runner": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
-      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw=="
-    },
-    "loader-utils": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-      "requires": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        }
-      }
-    },
-    "locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "requires": {
-        "p-locate": "^4.1.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
-    },
-    "lodash.escape": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
-      "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=",
-      "dev": true
-    },
-    "lodash.flattendeep": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
-      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
-      "dev": true
-    },
-    "lodash.isequal": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
-      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
-      "dev": true
-    },
-    "lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "requires": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      }
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "requires": {
-        "sourcemap-codec": "^1.4.4"
-      }
-    },
-    "make-dir": {
-      "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==",
-      "requires": {
-        "semver": "^6.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-        }
-      }
-    },
-    "makeerror": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
-      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
-      "dev": true,
-      "requires": {
-        "tmpl": "1.0.5"
-      }
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "mdn-data": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
-    },
-    "micromatch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-      "requires": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.2.3"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "mime-db": {
-      "version": "1.51.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
-      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
-    },
-    "mime-types": {
-      "version": "2.1.34",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
-      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
-      "requires": {
-        "mime-db": "1.51.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "minimalistic-assert": {
-      "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": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
-    },
-    "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "moment": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
-      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
-    },
-    "moo": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
-      "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "nano-css": {
-      "version": "5.3.4",
-      "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz",
-      "integrity": "sha512-wfcviJB6NOxDIDfr7RFn/GlaN7I/Bhe4d39ZRCJ3xvZX60LVe2qZ+rDqM49nm4YT81gAjzS+ZklhKP/Gnfnubg==",
-      "requires": {
-        "css-tree": "^1.1.2",
-        "csstype": "^3.0.6",
-        "fastest-stable-stringify": "^2.0.2",
-        "inline-style-prefixer": "^6.0.0",
-        "rtl-css-js": "^1.14.0",
-        "sourcemap-codec": "^1.4.8",
-        "stacktrace-js": "^2.0.2",
-        "stylis": "^4.0.6"
-      }
-    },
-    "nanoid": {
-      "version": "3.1.30",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
-      "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ=="
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "nearley": {
-      "version": "2.20.1",
-      "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
-      "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
-      "dev": true,
-      "requires": {
-        "commander": "^2.19.0",
-        "moo": "^0.5.0",
-        "railroad-diagrams": "^1.0.0",
-        "randexp": "0.4.6"
-      }
-    },
-    "neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
-    },
-    "next": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/next/-/next-12.0.7.tgz",
-      "integrity": "sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA==",
-      "requires": {
-        "@babel/runtime": "7.15.4",
-        "@hapi/accept": "5.0.2",
-        "@napi-rs/triples": "1.0.3",
-        "@next/env": "12.0.7",
-        "@next/polyfill-module": "12.0.7",
-        "@next/react-dev-overlay": "12.0.7",
-        "@next/react-refresh-utils": "12.0.7",
-        "@next/swc-android-arm64": "12.0.7",
-        "@next/swc-darwin-arm64": "12.0.7",
-        "@next/swc-darwin-x64": "12.0.7",
-        "@next/swc-linux-arm-gnueabihf": "12.0.7",
-        "@next/swc-linux-arm64-gnu": "12.0.7",
-        "@next/swc-linux-arm64-musl": "12.0.7",
-        "@next/swc-linux-x64-gnu": "12.0.7",
-        "@next/swc-linux-x64-musl": "12.0.7",
-        "@next/swc-win32-arm64-msvc": "12.0.7",
-        "@next/swc-win32-ia32-msvc": "12.0.7",
-        "@next/swc-win32-x64-msvc": "12.0.7",
-        "acorn": "8.5.0",
-        "assert": "2.0.0",
-        "browserify-zlib": "0.2.0",
-        "browserslist": "4.16.6",
-        "buffer": "5.6.0",
-        "caniuse-lite": "^1.0.30001228",
-        "chalk": "2.4.2",
-        "chokidar": "3.5.1",
-        "constants-browserify": "1.0.0",
-        "crypto-browserify": "3.12.0",
-        "cssnano-simple": "3.0.0",
-        "domain-browser": "4.19.0",
-        "encoding": "0.1.13",
-        "etag": "1.8.1",
-        "events": "3.3.0",
-        "find-cache-dir": "3.3.1",
-        "get-orientation": "1.1.2",
-        "https-browserify": "1.0.0",
-        "image-size": "1.0.0",
-        "jest-worker": "27.0.0-next.5",
-        "node-fetch": "2.6.1",
-        "node-html-parser": "1.4.9",
-        "os-browserify": "0.3.0",
-        "p-limit": "3.1.0",
-        "path-browserify": "1.0.1",
-        "postcss": "8.2.15",
-        "process": "0.11.10",
-        "querystring-es3": "0.2.1",
-        "raw-body": "2.4.1",
-        "react-is": "17.0.2",
-        "react-refresh": "0.8.3",
-        "regenerator-runtime": "0.13.4",
-        "stream-browserify": "3.0.0",
-        "stream-http": "3.1.1",
-        "string_decoder": "1.3.0",
-        "styled-jsx": "5.0.0-beta.3",
-        "timers-browserify": "2.0.12",
-        "tty-browserify": "0.0.1",
-        "use-subscription": "1.5.1",
-        "util": "0.12.4",
-        "vm-browserify": "1.1.2",
-        "watchpack": "2.3.0"
-      },
-      "dependencies": {
-        "@babel/runtime": {
-          "version": "7.15.4",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
-          "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
-          "requires": {
-            "regenerator-runtime": "^0.13.4"
-          }
-        },
-        "acorn": {
-          "version": "8.5.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
-          "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q=="
-        },
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "browserslist": {
-          "version": "4.16.6",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
-          "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
-          "requires": {
-            "caniuse-lite": "^1.0.30001219",
-            "colorette": "^1.2.2",
-            "electron-to-chromium": "^1.3.723",
-            "escalade": "^3.1.1",
-            "node-releases": "^1.1.71"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "jest-worker": {
-          "version": "27.0.0-next.5",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz",
-          "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==",
-          "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^8.0.0"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "8.1.1",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-              "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-              "requires": {
-                "has-flag": "^4.0.0"
-              }
-            }
-          }
-        },
-        "node-fetch": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-          "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
-        },
-        "node-releases": {
-          "version": "1.1.77",
-          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
-          "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ=="
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
-        },
-        "regenerator-runtime": {
-          "version": "0.13.4",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz",
-          "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g=="
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "requires": {
-            "has-flag": "^3.0.0"
-          },
-          "dependencies": {
-            "has-flag": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-            }
-          }
-        }
-      }
-    },
-    "next-pwa": {
-      "version": "5.4.4",
-      "resolved": "https://registry.npmjs.org/next-pwa/-/next-pwa-5.4.4.tgz",
-      "integrity": "sha512-Wo7DctXO9ZZzMCuRK/q2U3x5k49LBRv7p31woJIUfiR6tJChSMoojHUvvgeCY72gSo4mtovS5KRm6iHIs/kxeg==",
-      "requires": {
-        "babel-loader": "^8.2.3",
-        "clean-webpack-plugin": "^4.0.0",
-        "globby": "^11.0.4",
-        "terser-webpack-plugin": "^5.2.5",
-        "workbox-webpack-plugin": "^6.4.2",
-        "workbox-window": "^6.4.2"
-      }
-    },
-    "node-html-parser": {
-      "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==",
-      "requires": {
-        "he": "1.2.0"
-      }
-    },
-    "node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
-      "dev": true
-    },
-    "node-releases": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
-      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
-      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
-      "dev": true,
-      "requires": {
-        "boolbase": "^1.0.0"
-      }
-    },
-    "nwsapi": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
-      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "object-inspect": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
-      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
-    },
-    "object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
-    },
-    "object.assign": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "object.entries": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
-      "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "object.fromentries": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
-      "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "object.hasown": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
-      "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "object.values": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
-      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^2.1.0"
-      }
-    },
-    "optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "requires": {
-        "yocto-queue": "^0.1.0"
-      }
-    },
-    "p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "requires": {
-        "p-limit": "^2.2.0"
-      },
-      "dependencies": {
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
-        }
-      }
-    },
-    "p-map": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
-    },
-    "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true
-    },
-    "pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
-    },
-    "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
-      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
-      "requires": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
-      "dev": true
-    },
-    "parse5-htmlparser2-tree-adapter": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
-      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
-      "dev": true,
-      "requires": {
-        "parse5": "^6.0.1"
-      }
-    },
-    "path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
-    },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
-    },
-    "pbkdf2": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
-      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "picomatch": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
-    },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pirates": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
-      "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
-      "dev": true
-    },
-    "pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.1.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-          "dev": true,
-          "requires": {
-            "locate-path": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-          "dev": true,
-          "requires": {
-            "p-locate": "^2.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-          "dev": true,
-          "requires": {
-            "p-try": "^1.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-          "dev": true,
-          "requires": {
-            "p-limit": "^1.1.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        }
-      }
-    },
-    "platform": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
-      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
-    },
-    "postcss": {
-      "version": "8.2.15",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz",
-      "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==",
-      "requires": {
-        "colorette": "^1.2.2",
-        "nanoid": "^3.1.23",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
-      }
-    },
-    "postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
-      "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
-      "dev": true
-    },
-    "pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
-    },
-    "pretty-format": {
-      "version": "27.4.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz",
-      "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^27.4.2",
-        "ansi-regex": "^5.0.1",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^17.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-          "dev": true
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        }
-      }
-    },
-    "private": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-    },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
-    },
-    "prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-      "dev": true,
-      "requires": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      }
-    },
-    "prop-types": {
-      "version": "15.8.0",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.0.tgz",
-      "integrity": "sha512-fDGekdaHh65eI3lMi5OnErU6a8Ighg2KjcjQxO7m8VHyWjcPyj5kiOgV1LQDOOOgVy3+5FgjXvdSSX7B8/5/4g==",
-      "requires": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
-      }
-    },
-    "prop-types-exact": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz",
-      "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3",
-        "object.assign": "^4.1.0",
-        "reflect.ownkeys": "^0.2.0"
-      }
-    },
-    "psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "requires": {
-        "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"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "punycode": {
-      "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": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
-    },
-    "queue": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
-      "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
-      "requires": {
-        "inherits": "~2.0.3"
-      }
-    },
-    "queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
-    },
-    "raf": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
-      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
-      "dev": true,
-      "requires": {
-        "performance-now": "^2.1.0"
-      }
-    },
-    "railroad-diagrams": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
-      "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=",
-      "dev": true
-    },
-    "randexp": {
-      "version": "0.4.6",
-      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
-      "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
-      "dev": true,
-      "requires": {
-        "discontinuous-range": "1.0.0",
-        "ret": "~0.1.10"
-      }
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "raw-body": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
-      "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
-      "requires": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.3",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        }
-      }
-    },
-    "react": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
-      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
-      "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "react-addons-test-utils": {
-      "version": "15.6.2",
-      "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.6.2.tgz",
-      "integrity": "sha1-wStu/cIkfBDae4dw0YUICnsEcVY=",
-      "dev": true,
-      "requires": {}
-    },
-    "react-display-name": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz",
-      "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==",
-      "dev": true
-    },
-    "react-dom": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
-      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
-      "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1",
-        "scheduler": "^0.20.2"
-      }
-    },
-    "react-fast-compare": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
-      "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
-    },
-    "react-helmet": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz",
-      "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
-      "requires": {
-        "object-assign": "^4.1.1",
-        "prop-types": "^15.7.2",
-        "react-fast-compare": "^3.1.1",
-        "react-side-effect": "^2.1.0"
-      }
-    },
-    "react-is": {
-      "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": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
-      "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
-    },
-    "react-shallow-renderer": {
-      "version": "16.14.1",
-      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
-      "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.1.1",
-        "react-is": "^16.12.0 || ^17.0.0"
-      }
-    },
-    "react-side-effect": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz",
-      "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==",
-      "requires": {}
-    },
-    "react-svg-ionicons": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/react-svg-ionicons/-/react-svg-ionicons-0.2.3.tgz",
-      "integrity": "sha512-/o8YFlMvKaO1EzYTYEEmvdDUt02eeGJhMD1Gmreq9gn9tVe1BRL2H6Rpfn1OBWH2X2Q+aZfaRNSTuiRk8L1iag==",
-      "requires": {
-        "@jsbits/get-package-version": "^1.0.3",
-        "invariant": "^2.0.0",
-        "prop-types": "^15.0.0"
-      }
-    },
-    "react-test-renderer": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
-      "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.1.1",
-        "react-is": "^17.0.2",
-        "react-shallow-renderer": "^16.13.1",
-        "scheduler": "^0.20.2"
-      },
-      "dependencies": {
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        }
-      }
-    },
-    "react-toggle-switch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/react-toggle-switch/-/react-toggle-switch-3.0.4.tgz",
-      "integrity": "sha512-eM2Izl0qNrdFZlmRwpXPpUjaYVISHVy8dxCN9l6eRZ7KpmrDsIGInDpoSRU2QPs596+Al+udOArdXX5wCRg0Gg==",
-      "requires": {}
-    },
-    "react-universal-interface": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
-      "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
-      "requires": {}
-    },
-    "react-use": {
-      "version": "17.3.2",
-      "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.3.2.tgz",
-      "integrity": "sha512-bj7OD0/1wL03KyWmzFXAFe425zziuTf7q8olwCYBfOeFHY1qfO1FAMjROQLsLZYwG4Rx63xAfb7XAbBrJsZmEw==",
-      "requires": {
-        "@types/js-cookie": "^2.2.6",
-        "@xobotyi/scrollbar-width": "^1.9.5",
-        "copy-to-clipboard": "^3.3.1",
-        "fast-deep-equal": "^3.1.3",
-        "fast-shallow-equal": "^1.0.0",
-        "js-cookie": "^2.2.1",
-        "nano-css": "^5.3.1",
-        "react-universal-interface": "^0.6.2",
-        "resize-observer-polyfill": "^1.5.1",
-        "screenfull": "^5.1.0",
-        "set-harmonic-interval": "^1.0.1",
-        "throttle-debounce": "^3.0.1",
-        "ts-easing": "^0.2.0",
-        "tslib": "^2.1.0"
-      }
-    },
-    "readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "requires": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "reflect.ownkeys": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz",
-      "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=",
-      "dev": true
-    },
-    "regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
-    },
-    "regenerate-unicode-properties": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
-      "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
-      "requires": {
-        "regenerate": "^1.4.2"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-      "dev": true
-    },
-    "regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
-      "requires": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "regexp.prototype.flags": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "regexpp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true
-    },
-    "regexpu-core": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
-      "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
-      "requires": {
-        "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^9.0.0",
-        "regjsgen": "^0.5.2",
-        "regjsparser": "^0.7.0",
-        "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.0.0"
-      }
-    },
-    "regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
-    },
-    "regjsparser": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
-      "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
-      "requires": {
-        "jsesc": "~0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
-        }
-      }
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
-    },
-    "resize-observer-polyfill": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
-      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
-    },
-    "resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "requires": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^5.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true
-    },
-    "resolve.exports": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-      "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
-      "dev": true
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
-    },
-    "rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "rodal": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/rodal/-/rodal-1.8.1.tgz",
-      "integrity": "sha512-3BpwZrLpaWSDHu8Atzz/S83MkpqpnXL9uGjNPZy1N6V7p4eWWsBSP8er5t+1xV+fZmbGEjLTNo01pUzYHqc7vg==",
-      "requires": {
-        "classnames": "^2.2.6"
-      }
-    },
-    "rollup": {
-      "version": "2.62.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz",
-      "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==",
-      "requires": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
-      },
-      "dependencies": {
-        "jest-worker": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-          "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-          "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^7.0.0"
-          }
-        },
-        "serialize-javascript": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "rst-selector-parser": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
-      "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=",
-      "dev": true,
-      "requires": {
-        "lodash.flattendeep": "^4.4.0",
-        "nearley": "^2.7.10"
-      }
-    },
-    "rtl-css-js": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.15.0.tgz",
-      "integrity": "sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==",
-      "requires": {
-        "@babel/runtime": "^7.1.2"
-      }
-    },
-    "run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "requires": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "safe-buffer": {
-      "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": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "sass": {
-      "version": "1.45.2",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.2.tgz",
-      "integrity": "sha512-cKfs+F9AMPAFlbbTXNsbGvg3y58nV0mXA3E94jqaySKcC8Kq3/8983zVKQ0TLMUrHw7hF9Tnd3Bz9z5Xgtrl9g==",
-      "requires": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      }
-    },
-    "saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dev": true,
-      "requires": {
-        "xmlchars": "^2.2.0"
-      }
-    },
-    "scheduler": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
-      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
-      "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "schema-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
-      "requires": {
-        "@types/json-schema": "^7.0.5",
-        "ajv": "^6.12.4",
-        "ajv-keywords": "^3.5.2"
-      }
-    },
-    "screenfull": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
-      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
-    },
-    "scrypt-js": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
-      "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
-    },
-    "semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
-    },
-    "serialize-javascript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
-      "requires": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "set-harmonic-interval": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
-      "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g=="
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
-    },
-    "setprototypeof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shallowequal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
-      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "shell-quote": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
-      "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw=="
-    },
-    "side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      }
-    },
-    "signal-exit": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
-      "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
-      "dev": true
-    },
-    "sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-      "dev": true
-    },
-    "slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
-    },
-    "sorted-array": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/sorted-array/-/sorted-array-2.0.4.tgz",
-      "integrity": "sha512-58INzrX0rL6ttCfsGoFmOuQY5AjR6A5E/MmGKJ5JvWHOey6gOEOC6vO8K6C0Y2bQR6KJ8o8aFwHjp/mJ/HcYsQ=="
-    },
-    "source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-    },
-    "source-map-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
-      "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA=="
-    },
-    "source-map-support": {
-      "version": "0.4.18",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
-      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.5.6"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
-    },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "stack-generator": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz",
-      "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==",
-      "requires": {
-        "stackframe": "^1.1.1"
-      }
-    },
-    "stack-utils": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-      "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-          "dev": true
-        }
-      }
-    },
-    "stackframe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
-      "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA=="
-    },
-    "stacktrace-gps": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz",
-      "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==",
-      "requires": {
-        "source-map": "0.5.6",
-        "stackframe": "^1.1.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
-          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
-        }
-      }
-    },
-    "stacktrace-js": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
-      "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
-      "requires": {
-        "error-stack-parser": "^2.0.6",
-        "stack-generator": "^2.0.5",
-        "stacktrace-gps": "^3.0.4"
-      }
-    },
-    "stacktrace-parser": {
-      "version": "0.1.10",
-      "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
-      "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
-      "requires": {
-        "type-fest": "^0.7.1"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.7.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
-          "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="
-        }
-      }
-    },
-    "statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-    },
-    "stream-browserify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
-      "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
-      "requires": {
-        "inherits": "~2.0.4",
-        "readable-stream": "^3.5.0"
-      }
-    },
-    "stream-http": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz",
-      "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==",
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "xtend": "^4.0.2"
-      }
-    },
-    "stream-parser": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
-      "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
-      "requires": {
-        "debug": "2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        }
-      }
-    },
-    "string_decoder": {
-      "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==",
-      "requires": {
-        "safe-buffer": "~5.2.0"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
-      }
-    },
-    "string-hash": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
-      "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs="
-    },
-    "string-length": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
-      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
-      "dev": true,
-      "requires": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "string.prototype.matchall": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz",
-      "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1",
-        "get-intrinsic": "^1.1.1",
-        "has-symbols": "^1.0.2",
-        "internal-slot": "^1.0.3",
-        "regexp.prototype.flags": "^1.3.1",
-        "side-channel": "^1.0.4"
-      }
-    },
-    "string.prototype.trim": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
-      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
-      }
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "requires": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      }
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true
-    },
-    "strip-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
-      "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw=="
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "styled-components": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz",
-      "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==",
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/traverse": "^7.4.5",
-        "@emotion/is-prop-valid": "^0.8.8",
-        "@emotion/stylis": "^0.8.4",
-        "@emotion/unitless": "^0.7.4",
-        "babel-plugin-styled-components": ">= 1.12.0",
-        "css-to-react-native": "^3.0.0",
-        "hoist-non-react-statics": "^3.0.0",
-        "shallowequal": "^1.1.0",
-        "supports-color": "^5.5.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "styled-jsx": {
-      "version": "5.0.0-beta.3",
-      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz",
-      "integrity": "sha512-HtDDGSFPvmjHIqWf9n8Oo54tAoY/DTplvlyOH2+YOtD80Sp31Ap8ffSmxhgk5EkUoJ7xepdXMGT650mSffWuRA==",
-      "requires": {
-        "@babel/plugin-syntax-jsx": "7.14.5",
-        "@babel/types": "7.15.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"
-      },
-      "dependencies": {
-        "@babel/types": {
-          "version": "7.15.0",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
-          "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.14.9",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "convert-source-map": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-          "requires": {
-            "safe-buffer": "~5.1.1"
-          }
-        },
-        "emojis-list": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
-        },
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.2.3",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^2.0.0",
-            "json5": "^1.0.1"
-          }
-        },
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
-        },
-        "stylis": {
-          "version": "3.5.4",
-          "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
-          "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
-        }
-      }
-    },
-    "stylis": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
-      "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
-    },
-    "stylis-rule-sheet": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
-      "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==",
-      "requires": {}
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true
-    },
-    "supports-hyperlinks": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
-      "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "sweetalert2": {
-      "version": "11.3.3",
-      "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.3.3.tgz",
-      "integrity": "sha512-10Keqbmjng/+XpkpSOQ6dttpztl7XNohjnpC6bX6XFgm0WpRXM81YE0wmonGYOP6uyzd76vpfnZS04PdVvO31Q=="
-    },
-    "symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-      "dev": true
-    },
-    "tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
-    },
-    "temp-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
-      "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="
-    },
-    "tempy": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
-      "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
-      "requires": {
-        "is-stream": "^2.0.0",
-        "temp-dir": "^2.0.0",
-        "type-fest": "^0.16.0",
-        "unique-string": "^2.0.0"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.16.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
-          "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg=="
-        }
-      }
-    },
-    "terminal-link": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "supports-hyperlinks": "^2.0.0"
-      }
-    },
-    "terser": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
-      "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
-      "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.20"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
-        },
-        "source-map-support": {
-          "version": "0.5.21",
-          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-          "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-          "requires": {
-            "buffer-from": "^1.0.0",
-            "source-map": "^0.6.0"
-          },
-          "dependencies": {
-            "source-map": {
-              "version": "0.6.1",
-              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-            }
-          }
-        }
-      }
-    },
-    "terser-webpack-plugin": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz",
-      "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==",
-      "requires": {
-        "jest-worker": "^27.4.1",
-        "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.2"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-          "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
-      }
-    },
-    "test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "requires": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "throat": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-      "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
-      "dev": true
-    },
-    "throttle-debounce": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
-      "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg=="
-    },
-    "timers-browserify": {
-      "version": "2.0.12",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
-      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
-      "requires": {
-        "setimmediate": "^1.0.4"
-      }
-    },
-    "tmpl": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
-      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "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": {
-      "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==",
-      "requires": {
-        "is-number": "^7.0.0"
-      }
-    },
-    "toggle-selection": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
-      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
-    },
-    "toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
-    },
-    "tough-cookie": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-      "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
-      "dev": true,
-      "requires": {
-        "psl": "^1.1.33",
-        "punycode": "^2.1.1",
-        "universalify": "^0.1.2"
-      }
-    },
-    "tr46": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.1"
-      }
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true
-    },
-    "ts-easing": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
-      "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
-    },
-    "tsconfig-paths": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
-      "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
-      "dev": true,
-      "requires": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
-        "minimist": "^1.2.0",
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-          "dev": true
-        }
-      }
-    },
-    "tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-    },
-    "tsutils": {
-      "version": "3.21.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.8.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-    },
-    "type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1"
-      }
-    },
-    "type-detect": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz",
-      "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=",
-      "dev": true
-    },
-    "type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "dev": true
-    },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "requires": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "typescript": {
-      "version": "4.5.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
-      "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg=="
-    },
-    "unbox-primitive": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
-      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has-bigints": "^1.0.1",
-        "has-symbols": "^1.0.2",
-        "which-boxed-primitive": "^1.0.2"
-      }
-    },
-    "unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
-    },
-    "unicode-match-property-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
-      "requires": {
-        "unicode-canonical-property-names-ecmascript": "^2.0.0",
-        "unicode-property-aliases-ecmascript": "^2.0.0"
-      }
-    },
-    "unicode-match-property-value-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
-    },
-    "unicode-property-aliases-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
-    },
-    "unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "requires": {
-        "crypto-random-string": "^2.0.0"
-      }
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
-    },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "use-subscription": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
-      "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
-      "requires": {
-        "object-assign": "^4.1.1"
-      }
-    },
-    "userbase-js": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/userbase-js/-/userbase-js-2.8.0.tgz",
-      "integrity": "sha512-fjGgfpI018T+HY3k9XW1bkUyppHDa1bLzfJJ+Virq+58YzzcN74c5AF8W/cww76syyyscndbCvzLduvwiVKlwA==",
-      "requires": {
-        "@babel/runtime": "^7.9.2",
-        "base64-arraybuffer": "^0.2.0",
-        "diffie-hellman": "^5.0.3",
-        "scrypt-js": "^3.0.0",
-        "sorted-array": "^2.0.4",
-        "uuid": "^3.4.0"
-      }
-    },
-    "util": {
-      "version": "0.12.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
-      "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
-      "requires": {
-        "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-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
-    },
-    "v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
-      "dev": true
-    },
-    "v8-to-istanbul": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz",
-      "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0",
-        "source-map": "^0.7.3"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        }
-      }
-    },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
-    },
-    "w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "dev": true,
-      "requires": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "dev": true,
-      "requires": {
-        "xml-name-validator": "^3.0.0"
-      }
-    },
-    "walker": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
-      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
-      "dev": true,
-      "requires": {
-        "makeerror": "1.0.12"
-      }
-    },
-    "watchpack": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz",
-      "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==",
-      "requires": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      }
-    },
-    "webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-      "dev": true
-    },
-    "webpack": {
-      "version": "5.65.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz",
-      "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==",
-      "requires": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.50",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "acorn": "^8.4.1",
-        "acorn-import-assertions": "^1.7.6",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.8.3",
-        "es-module-lexer": "^0.9.0",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
-        "watchpack": "^2.3.1",
-        "webpack-sources": "^3.2.2"
-      },
-      "dependencies": {
-        "@types/estree": {
-          "version": "0.0.50",
-          "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
-          "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
-        },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-          "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
-        },
-        "watchpack": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
-          "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
-          "requires": {
-            "glob-to-regexp": "^0.4.1",
-            "graceful-fs": "^4.1.2"
-          }
-        },
-        "webpack-sources": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz",
-          "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw=="
-        }
-      }
-    },
-    "webpack-sources": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-      "requires": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
-      }
-    },
-    "whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "dev": true,
-      "requires": {
-        "iconv-lite": "0.4.24"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        }
-      }
-    },
-    "whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
-      "dev": true
-    },
-    "whatwg-url": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.7.0",
-        "tr46": "^2.1.0",
-        "webidl-conversions": "^6.1.0"
-      }
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "requires": {
-        "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": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
-      "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
-      "requires": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-abstract": "^1.18.5",
-        "foreach": "^2.0.5",
-        "has-tostringtag": "^1.0.0",
-        "is-typed-array": "^1.1.7"
-      }
-    },
-    "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "dev": true
-    },
-    "workbox-background-sync": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz",
-      "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==",
-      "requires": {
-        "idb": "^6.1.4",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-broadcast-update": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz",
-      "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-build": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz",
-      "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==",
-      "requires": {
-        "@apideck/better-ajv-errors": "^0.3.1",
-        "@babel/core": "^7.11.1",
-        "@babel/preset-env": "^7.11.0",
-        "@babel/runtime": "^7.11.2",
-        "@rollup/plugin-babel": "^5.2.0",
-        "@rollup/plugin-node-resolve": "^11.2.1",
-        "@rollup/plugin-replace": "^2.4.1",
-        "@surma/rollup-plugin-off-main-thread": "^2.2.3",
-        "ajv": "^8.6.0",
-        "common-tags": "^1.8.0",
-        "fast-json-stable-stringify": "^2.1.0",
-        "fs-extra": "^9.0.1",
-        "glob": "^7.1.6",
-        "lodash": "^4.17.20",
-        "pretty-bytes": "^5.3.0",
-        "rollup": "^2.43.1",
-        "rollup-plugin-terser": "^7.0.0",
-        "source-map": "^0.8.0-beta.0",
-        "source-map-url": "^0.4.0",
-        "stringify-object": "^3.3.0",
-        "strip-comments": "^2.0.1",
-        "tempy": "^0.6.0",
-        "upath": "^1.2.0",
-        "workbox-background-sync": "6.4.2",
-        "workbox-broadcast-update": "6.4.2",
-        "workbox-cacheable-response": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-expiration": "6.4.2",
-        "workbox-google-analytics": "6.4.2",
-        "workbox-navigation-preload": "6.4.2",
-        "workbox-precaching": "6.4.2",
-        "workbox-range-requests": "6.4.2",
-        "workbox-recipes": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2",
-        "workbox-streams": "6.4.2",
-        "workbox-sw": "6.4.2",
-        "workbox-window": "6.4.2"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "8.8.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
-          "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "json-schema-traverse": "^1.0.0",
-            "require-from-string": "^2.0.2",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
-        },
-        "source-map": {
-          "version": "0.8.0-beta.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
-          "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
-          "requires": {
-            "whatwg-url": "^7.0.0"
-          }
-        },
-        "tr46": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
-          "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        },
-        "webidl-conversions": {
-          "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": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
-          "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
-          "requires": {
-            "lodash.sortby": "^4.7.0",
-            "tr46": "^1.0.1",
-            "webidl-conversions": "^4.0.2"
-          }
-        }
-      }
-    },
-    "workbox-cacheable-response": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz",
-      "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-core": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz",
-      "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw=="
-    },
-    "workbox-expiration": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz",
-      "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==",
-      "requires": {
-        "idb": "^6.1.4",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-google-analytics": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz",
-      "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==",
-      "requires": {
-        "workbox-background-sync": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "workbox-navigation-preload": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz",
-      "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-precaching": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz",
-      "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==",
-      "requires": {
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "workbox-range-requests": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz",
-      "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-recipes": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz",
-      "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==",
-      "requires": {
-        "workbox-cacheable-response": "6.4.2",
-        "workbox-core": "6.4.2",
-        "workbox-expiration": "6.4.2",
-        "workbox-precaching": "6.4.2",
-        "workbox-routing": "6.4.2",
-        "workbox-strategies": "6.4.2"
-      }
-    },
-    "workbox-routing": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz",
-      "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-strategies": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz",
-      "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==",
-      "requires": {
-        "workbox-core": "6.4.2"
-      }
-    },
-    "workbox-streams": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz",
-      "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==",
-      "requires": {
-        "workbox-core": "6.4.2",
-        "workbox-routing": "6.4.2"
-      }
-    },
-    "workbox-sw": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz",
-      "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg=="
-    },
-    "workbox-webpack-plugin": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz",
-      "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==",
-      "requires": {
-        "fast-json-stable-stringify": "^2.1.0",
-        "pretty-bytes": "^5.4.1",
-        "source-map-url": "^0.4.0",
-        "upath": "^1.2.0",
-        "webpack-sources": "^1.4.3",
-        "workbox-build": "6.4.2"
-      }
-    },
-    "workbox-window": {
-      "version": "6.4.2",
-      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz",
-      "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==",
-      "requires": {
-        "@types/trusted-types": "^2.0.2",
-        "workbox-core": "6.4.2"
-      }
-    },
-    "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "ws": {
-      "version": "7.5.6",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
-      "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
-      "dev": true,
-      "requires": {}
-    },
-    "xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
-      "dev": true
-    },
-    "xmlchars": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
-      "dev": true
-    },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
-    },
-    "y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "dev": true,
-      "requires": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      }
-    },
-    "yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-      "dev": true
-    },
-    "yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
-    }
-  }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index aaf1214..0000000
--- a/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "name": "budgetzen-app",
-  "version": "2.0.0",
-  "build": "iuf6sxAv",
-  "author": "Bruno Bernardino <me@brunobernardino.com>",
-  "license": "UNLICENSED",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/BrunoBernardino/budgetzen-web.git"
-  },
-  "engines": {
-    "node": "16.13.1",
-    "npm": "8.2.0"
-  },
-  "scripts": {
-    "test": "jest",
-    "dev": "next",
-    "build": "next build",
-    "start": "next start",
-    "lint": "eslint --ext .js,.jsx,.ts,.tsx . && tsc --noEmit",
-    "pretty": "prettier --write .",
-    "pretty/test": "prettier --check ."
-  },
-  "dependencies": {
-    "@types/node": "17.0.6",
-    "@types/react": "17.0.38",
-    "@types/react-dom": "17.0.11",
-    "@types/styled-components": "5.1.19",
-    "axios": "0.27.2",
-    "ky": "0.28.7",
-    "moment": "2.29.1",
-    "next": "12.0.7",
-    "next-pwa": "5.4.4",
-    "react": "17.0.2",
-    "react-dom": "17.0.2",
-    "react-helmet": "6.1.0",
-    "react-svg-ionicons": "0.2.3",
-    "react-toggle-switch": "3.0.4",
-    "react-use": "17.3.2",
-    "rodal": "1.8.1",
-    "sass": "1.45.2",
-    "styled-components": "5.3.3",
-    "sweetalert2": "11.3.3",
-    "typescript": "4.5.4",
-    "userbase-js": "2.8.0"
-  },
-  "devDependencies": {
-    "@types/enzyme": "3.10.11",
-    "@types/jest": "27.4.0",
-    "@types/react-helmet": "6.1.5",
-    "@typescript-eslint/eslint-plugin": "5.8.1",
-    "@typescript-eslint/parser": "5.8.1",
-    "@wojtekmaj/enzyme-adapter-react-17": "0.6.6",
-    "babel-core": "6.26.3",
-    "babel-eslint": "10.1.0",
-    "babel-jest": "27.4.5",
-    "babel-plugin-styled-components": "2.0.2",
-    "enzyme": "3.11.0",
-    "enzyme-adapter-react-16": "1.15.6",
-    "eslint": "8.6.0",
-    "eslint-config-airbnb": "19.0.4",
-    "eslint-config-prettier": "8.3.0",
-    "eslint-plugin-babel": "5.3.1",
-    "eslint-plugin-import": "2.25.3",
-    "eslint-plugin-jsx-a11y": "6.5.1",
-    "eslint-plugin-react": "7.28.0",
-    "expect": "27.4.2",
-    "expect-enzyme": "1.3.0",
-    "identity-obj-proxy": "3.0.0",
-    "jest": "27.4.5",
-    "prettier": "2.5.1",
-    "react-addons-test-utils": "15.6.2",
-    "react-test-renderer": "17.0.2",
-    "webpack": "5.65.0"
-  }
-}
diff --git a/pages/_app.tsx b/pages/_app.tsx
deleted file mode 100644
index 34ed6ec..0000000
--- a/pages/_app.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from 'react';
-import Head from 'next/head';
-import { AppProps } from 'next/app';
-
-import {
-  defaultTitle,
-  defaultDescription,
-  defaultKeywords,
-} from 'lib/constants';
-
-import 'rodal/lib/rodal.css';
-import 'react-toggle-switch/dist/css/switch.min.css';
-import 'styles/main.scss';
-import 'styles/_common.scss';
-
-try {
-  // @ts-ignore this is to prevent a problem with react-svg-ionicons
-  global.navigator = global.navigator || {};
-} catch (error) {
-  // Do nothing
-}
-
-const MyApp = ({ Component, pageProps }: AppProps) => {
-  return (
-    <>
-      <Head>
-        <title>{defaultTitle}</title>
-        <meta name="viewport" content="width=device-width, initial-scale=1" />
-        <meta property="og:title" content={defaultTitle} />
-        <meta name="description" content={defaultDescription} />
-        <meta name="keywords" content={defaultKeywords} />
-      </Head>
-      <Component {...pageProps} />
-    </>
-  );
-};
-
-export default MyApp;
diff --git a/pages/_document.tsx b/pages/_document.tsx
deleted file mode 100644
index 96568e2..0000000
--- a/pages/_document.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import Document, {
-  DocumentContext,
-  Html,
-  Head,
-  Main,
-  NextScript,
-} from 'next/document';
-import { ServerStyleSheet } from 'styled-components';
-
-export default class MyDocument extends Document {
-  static async getInitialProps(ctx: DocumentContext) {
-    const sheet = new ServerStyleSheet();
-    const originalRenderPage = ctx.renderPage;
-
-    try {
-      ctx.renderPage = () =>
-        originalRenderPage({
-          enhanceApp: (App) => (props) =>
-            sheet.collectStyles(<App {...props} />),
-        });
-
-      const initialProps = await Document.getInitialProps(ctx);
-      return {
-        ...initialProps,
-        styles: (
-          <>
-            {initialProps.styles}
-            {sheet.getStyleElement()}
-          </>
-        ),
-      };
-    } finally {
-      sheet.seal();
-    }
-  }
-
-  render() {
-    return (
-      <Html lang="en">
-        <Head>
-          <meta charSet="utf-8" />
-          <meta name="theme-color" content="#ffffff" />
-          <link rel="icon" type="image/png" href="/images/favicon.png" />
-          <link rel="apple-touch-icon" href="/images/favicon.png" />
-          <link rel="manifest" href="/manifest.json" />
-          <link
-            rel="alternate"
-            type="application/rss+xml"
-            href="https://news.onbrn.com/rss.xml"
-          />
-        </Head>
-        <body>
-          <Main />
-          <NextScript />
-          <script src="https://js.stripe.com/v3/" defer />
-        </body>
-      </Html>
-    );
-  }
-}
diff --git a/pages/billing.ts b/pages/billing.ts
new file mode 100644
index 0000000..15cd551
--- /dev/null
+++ b/pages/billing.ts
@@ -0,0 +1,186 @@
+import { html, PageContentResult } from '../lib/utils.ts';
+
+export function pageAction() {
+  return new Response('Not Implemented', { status: 501 });
+}
+
+export function pageContent() {
+  const htmlContent = html`
+    <section class="main-section">
+      <h1>Billing</h1>
+      <section class="hero">
+        <p>Billing is simple.</p>
+        <p>Below, you can easily cancel your subscription anytime and email me to ask for a refund. You can also update your payment details.</p>
+      </section>
+      <div data-has-invalid-session style="margin-top: 2rem;">
+        <h2>Signup or Login first</h2>
+        <p>Before you can pay, you need to <a href="/">Signup or Login</a> first.</p>
+      </div>
+      <div data-has-valid-session class="hidden" id="subscription-info" style="margin-top: 2rem;">
+      </div>
+      <div data-has-valid-session class="hidden" style="margin-top: 5rem;">
+        <h2>Delete your account</h2>
+        <p>
+          You can delete your account which will cancel your subscription and delete your data.
+        </p>
+        <button class="delete-button" type="button" id="delete-account" style="margin: 2rem 0 1rem;">
+          Delete account
+        </button>
+      </div>
+    </section>
+    <template id="valid-subscription">
+      <section>
+        <h2>Thank you so much for your support!</h2>
+        <p>You're currently paying <strong class="subscription-value">...</strong>.</p>
+        <button class="secondary" type="button" id="update-payment" style="margin: 2rem auto 1rem;">
+          Update payment details
+        </button>
+        <div id="subscription-is-not-canceled">
+          <button class="delete-button" type="button" id="cancel-subscription" style="margin: 5rem auto 1rem;">
+            Cancel subscription
+          </button>
+          <p>
+            The subscription will be canceled at the end of the current billing period.
+          </p>
+        </div>
+        <div class="hidden" id="subscription-is-canceled">
+          <p style="margin-top: 5rem;">
+            Your subscription is currently set to be canceled at the end of the current billing period.
+          </p>
+          <button class="secondary" type="button" id="resume-subscription" style="margin: 2rem auto 1rem;">
+            Resume subscription
+          </button>
+        </div>
+      </section>
+    </template>
+    <template id="trial-subscription">
+      <section>
+        <h2>You are on an active trial!</h2>
+        <p>If you're ready to pay, you probably want to check out the <a href="/pricing">pricing section</a> instead.</p>
+      </section>
+    </template>
+    <template id="invalid-subscription">
+      <section>
+        <h2>Your subscription has expired!</h2>
+        <p>You probably want to check out the <a href="/pricing">pricing section</a> instead.</p>
+      </section>
+    </template>
+    <script type="text/javascript">
+      (() => {
+        document.addEventListener('app-loaded', () => {
+          const subscriptionInfo = document.getElementById('subscription-info');
+          const deleteAccountButton = document.getElementById('delete-account');
+          async function updatePayment(event) {
+            event.preventDefault();
+            event.stopPropagation();
+            window.app.showLoading();
+            await userbase.updatePaymentMethod({
+              successUrl: window.location.href,
+              cancelUrl: window.location.href,
+            });
+          }
+          async function cancelSubscription(event) {
+            const { userbase } = window;
+            event.preventDefault();
+            event.stopPropagation();
+            window.app.showLoading();
+            await userbase.cancelSubscription();
+            window.location.reload();
+          }
+          async function resumeSubscription(event) {
+            const { userbase } = window;
+            event.preventDefault();
+            event.stopPropagation();
+            window.app.showLoading();
+            await userbase.resumeSubscription();
+            window.location.reload();
+          }
+          async function deleteAccount(event) {
+            const { userbase } = window;
+            event.preventDefault();
+            event.stopPropagation();
+            const { isConfirmed } = await Swal.fire({
+              title: 'Are you sure?',
+              text: 'You won\'t be able to recover your data!',
+              icon: 'warning',
+              showCancelButton: true,
+              confirmButtonColor: 'red',
+              confirmButtonText: 'Yes, delete it!',
+            });
+            if (isConfirmed) {
+              window.app.showLoading();
+              await userbase.deleteUser();
+              window.location.reload();
+            }
+          }
+          function getValidSubscriptionHtmlElement({ isSubscriptionCanceled, isSubscriptionMonthly }) {
+            const template = document.getElementById('valid-subscription');
+            const clonedElement = template.content.firstElementChild.cloneNode(true);
+            const paymentTextElement = clonedElement.querySelector('.subscription-value');
+            paymentTextElement.textContent = isSubscriptionMonthly ? '€2 / month' : '€18 / year';
+            const notCanceledElement = clonedElement.querySelector('#subscription-is-not-canceled');
+            const canceledElement = clonedElement.querySelector('#subscription-is-canceled');
+            if (isSubscriptionCanceled) {
+              notCanceledElement.classList.add('hidden');
+              canceledElement.classList.remove('hidden');
+            }
+            return clonedElement;
+          }
+          function getInvalidSubscriptionHtmlElement() {
+            const template = document.getElementById('invalid-subscription');
+            const clonedElement = template.content.firstElementChild.cloneNode(true);
+            return clonedElement;
+          }
+          function getTrialSubscriptionHtmlElement() {
+            const template = document.getElementById('trial-subscription');
+            const clonedElement = template.content.firstElementChild.cloneNode(true);
+            return clonedElement;
+          }
+          async function updateUI() {
+            const userSession = await window.app.getUserSession();
+            const isSubscriptionValid = userSession.subscriptionStatus === 'active';
+            let trialDaysLeft = 30;
+            if (userSession.trialExpirationDate) {
+              const trialExpirationDate = new Date(userSession.trialExpirationDate);
+              trialDaysLeft = window.app.utils.dateDiffInDays(new Date(), trialExpirationDate);
+            }
+            const isTrialing = userSession.subscriptionStatus !== 'active' && trialDaysLeft > 0;
+            const isSubscriptionCanceled = Boolean(userSession.cancelSubscriptionAt);
+            const isSubscriptionMonthly = userSession.subscriptionPlanId === 'budget-zen-v2-monthly';
+            subscriptionInfo.replaceChildren();
+            if (isSubscriptionValid) {
+              const subscriptionElement = getValidSubscriptionHtmlElement({ isSubscriptionCanceled, isSubscriptionMonthly });
+              subscriptionInfo.appendChild(subscriptionElement);
+              const updateButton = document.getElementById('update-payment');
+              const cancelButton = document.getElementById('cancel-subscription');
+              const resumeButton = document.getElementById('resume-subscription');
+              updateButton.addEventListener('click', updatePayment);
+              cancelButton.addEventListener('click', cancelSubscription);
+              resumeButton.addEventListener('click', resumeSubscription);
+            } else if (isTrialing) {
+              const subscriptionElement = getTrialSubscriptionHtmlElement();
+              subscriptionInfo.appendChild(subscriptionElement);
+            } else {
+              const subscriptionElement = getInvalidSubscriptionHtmlElement();
+              subscriptionInfo.appendChild(subscriptionElement);
+            }
+          }
+          async function initializePage() {
+            await window.app.dataUtils.initializeDb();
+            updateUI();
+          }
+          if (window.app.isLoggedIn) {
+            initializePage();
+          }
+          deleteAccountButton.addEventListener('click', deleteAccount);
+        });
+      })();
+    </script>
+  `;
+
+  return {
+    htmlContent,
+    titlePrefix: 'Billing',
+    description: 'Simple billing for Budget Zen.',
+  } as PageContentResult;
+}
diff --git a/pages/billing.tsx b/pages/billing.tsx
deleted file mode 100644
index da61233..0000000
--- a/pages/billing.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import moment from 'moment';
-import axios from 'axios';
-
-import { Main } from 'components/Layout';
-import Billing from 'components/Panels/Billing';
-import Loading from 'components/Loading';
-import { getUserSession } from 'lib/utils';
-import {
-  defaultTitle,
-  defaultDescription,
-  defaultKeywords,
-  baseUrl,
-} from 'lib/constants';
-
-const BillingPage = () => {
-  const [isLoading, setIsLoading] = useState(true);
-  const [hasValidSession, setHasValidSession] = useState(false);
-  const [hasValidSubscription, setHasValidSubscription] = useState(false);
-  const [isTrialing, setIsTrialing] = useState(false);
-  const [isSubscriptionCanceled, setIsSubscriptionCanceled] = useState(false);
-  const [isSubscriptionMonthly, setIsSubscriptionMonthly] = useState(false);
-
-  useEffect(() => {
-    const checkSession = async () => {
-      const userSession = await getUserSession();
-      if (userSession) {
-        const trialDaysLeft = moment(userSession.trialExpirationDate).diff(
-          moment(),
-          'days',
-        );
-        setHasValidSession(true);
-        setHasValidSubscription(userSession.subscriptionStatus === 'active');
-        setIsTrialing(
-          userSession.subscriptionStatus !== 'active' && trialDaysLeft > 0,
-        );
-        setIsSubscriptionCanceled(Boolean(userSession.cancelSubscriptionAt));
-        setIsSubscriptionMonthly(
-          userSession.subscriptionPlanId === 'budget-zen-v2-monthly',
-        );
-      }
-
-      setIsLoading(false);
-    };
-
-    checkSession();
-  }, []);
-
-  return (
-    <Main
-      title={defaultTitle}
-      description={defaultDescription}
-      keywords={defaultKeywords}
-      hasValidSession={hasValidSession}
-    >
-      <div className="billing common">
-        <Billing
-          hasValidSession={hasValidSession}
-          hasValidSubscription={hasValidSubscription}
-          isTrialing={isTrialing}
-          isSubscriptionCanceled={isSubscriptionCanceled}
-          isSubscriptionMonthly={isSubscriptionMonthly}
-        />
-      </div>
-      <Loading isShowing={isLoading} />
-    </Main>
-  );
-};
-
-export const getServerSideProps = async ({ req }: { req: Request }) => {
-  // @ts-ignore it does exist
-  if (req && req.headers && !req.headers.host.startsWith('localhost')) {
-    const pathname = req.url;
-
-    try {
-      await axios.post('https://stats.onbrn.com/api/event', {
-        domain: baseUrl.replace('https://', ''),
-        name: 'pageview',
-        url: `${baseUrl}${pathname}`,
-      });
-    } catch (error) {
-      console.log('Failed to log pageview');
-      console.error(error);
-    }
-  }
-
-  return {
-    props: {},
-  };
-};
-
-export default BillingPage;
diff --git a/pages/email-password.tsx b/pages/email-password.tsx
deleted file mode 100644
index a492844..0000000
--- a/pages/email-password.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import axios from 'axios';
-
-import { Main } from 'components/Layout';
-import EmailPassword from 'components/Panels/EmailPassword';
-import Loading from 'components/Loading';
-import { getUserSession } from 'lib/utils';
-import {
-  defaultTitle,
-  defaultDescription,
-  defaultKeywords,
-  baseUrl,
-} from 'lib/constants';
-
-const EmailPasswordPage = () => {
-  const [isLoading, setIsLoading] = useState(true);
-  const [hasValidSession, setHasValidSession] = useState(false);
-  const [currentEmail, setCurrentEmail] = useState('');
-
-  useEffect(() => {
-    const checkSession = async () => {
-      const userSession = await getUserSession();
-      if (userSession) {
-        setHasValidSession(true);
-        setCurrentEmail(userSession.email);
-      }
-
-      setIsLoading(false);
-    };
-
-    checkSession();
-  }, []);
-
-  return (
-    <Main
-      title={defaultTitle}
-      description={defaultDescription}
-      keywords={defaultKeywords}
-      hasValidSession={hasValidSession}
-    >
-      <div className="email-password common">
-        <EmailPassword
-          hasValidSession={hasValidSession}
-          currentEmail={currentEmail}
-        />
-      </div>
-      <Loading isShowing={isLoading} />
-    </Main>
-  );
-};
-
-export const getServerSideProps = async ({ req }: { req: Request }) => {
-  // @ts-ignore it does exist
-  if (req && req.headers && !req.headers.host.startsWith('localhost')) {
-    const pathname = req.url;
-
-    try {
-      await axios.post('https://stats.onbrn.com/api/event', {
-        domain: baseUrl.replace('https://', ''),
-        name: 'pageview',
-        url: `${baseUrl}${pathname}`,
-      });
-    } catch (error) {
-      console.log('Failed to log pageview');
-      console.error(error);
-    }
-  }
-
-  return {
-    props: {},
-  };
-};
-
-export default EmailPasswordPage;
diff --git a/pages/index.ts b/pages/index.ts
new file mode 100644
index 0000000..9b67caf
--- /dev/null
+++ b/pages/index.ts
@@ -0,0 +1,326 @@
+import { html, PageContentResult } from '../lib/utils.ts';
+
+export function pageAction() {
+  return new Response('Not Implemented', { status: 501 });
+}
+
+export function pageContent() {
+  const htmlContent = html`
+    <section class="main-section">
+      <div data-has-invalid-session>
+        <h1>Simple + Encrypted Budget Management</h1>
+        <section class="hero">
+          <p>
+            Budget Zen is a simple and <strong>encrypted</strong> budget management
+            app. You can <a href="https://budgetzen.net">learn more about it here</a>, as this
+            is the app.
+          </p>
+          <p>
+            Currently it's available on every device via web browser, and you
+            can browse its source code.
+          </p>
+          <p>
+            You have a <strong>30-day free trial</strong> (no credit card
+            required), and at the end, you can pay <strong>€18 / year</strong>,
+            or <strong>€2 / month</strong>, no limits.
+          </p>
+          <form id="login-form">
+            <fieldset class="input-wrapper">
+              <label for="email">Email</label>
+              <input
+                id="email"
+                type="email"
+                placeholder="you@example.com"
+                name="email"
+              />
+            </fieldset>
+            <fieldset class="input-wrapper">
+              <label for="password">Password / Encryption Key</label>
+              <input
+                id="password"
+                type="password"
+                placeholder="something secret"
+                name="password"
+              />
+            </fieldset>
+            <div class="buttons-wrapper">
+              <button type="submit" id="login-button">
+                Login
+              </button>
+              <span class="or">or</span>
+              <button type="button" id="signup-button">
+                Signup
+              </button>
+            </div>
+          </form>
+          <p>
+            When you signup, you're agreeing with the <a href="https://budgetzen.net/terms">Terms of Service</a>.
+          </p>
+          <p>
+            Note that logging in will take up a few seconds. This is intentional, in order to generate a safer assymetric encryption key. After logging in, the app should be blazing fast in any device.
+          </p>
+        </section>
+        <h2>Need help?</h2>
+        <p>
+          If you're having any issues or have any questions, <strong><a href="mailto:me@brunobernardino.com">please reach out</a></strong>.
+        </p>
+      </div>
+      
+      <div data-has-valid-session class="hidden panels">
+        <div class="left-panel">
+          <div class="panels">
+            <section class="expenses-wrapper">
+              <section class="expenses-filter-wrapper">
+                <form id="expenses-filter">
+                  <fieldset class="input-wrapper">
+                    <input
+                      id="expenses-filter-search"
+                      placeholder="Search for an expense"
+                      autocomplete="off"
+                      type="text"
+                    />
+                  </fieldset>
+                </form>
+                <button id="budgets-filter-button" type="button">≡</button>
+              </section>
+              <section id="expenses">
+              
+              </section>
+            </section>
+            <section class="budgets-wrapper">
+              <section id="month-navigation">
+                <svg id="month-navigation-previous" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"/></svg>
+                <span id="current-month">...</span>
+                <svg id="month-navigation-next" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"/></svg>
+              </section>
+              
+              <section id="budgets">
+              </section>
+
+              <button type="button" id="add-budget-button">Add Budget</button>
+            </section>
+          </div>
+        </div>
+        <section id="add-expense">
+          <form id="add-expense-form">
+            <span class="text">
+              Fill out the form below to add a new expense.
+            </span>
+            <fieldset class="input-wrapper">
+              <label for="expense-cost">Cost</label>
+              <input
+                id="expense-cost"
+                placeholder="10.99"
+                autocomplete="off"
+                type="text"
+                inputmode="decimal"
+              />
+            </fieldset>
+            <fieldset class="input-wrapper">
+              <label for="expense-description">Description</label>
+              <input
+                id="expense-description"
+                placeholder="Volunteering"
+                autocomplete="off"
+                type="text"
+              />
+            </fieldset>
+            <fieldset class="input-wrapper">
+              <label for="expense-budget">Budget</label>
+              <select
+                id="expense-budget"
+                placeholder="Misc"
+                autocomplete="off"
+              ></select>
+            </fieldset>
+            <fieldset class="input-wrapper">
+              <label for="expense-date">Date</label>
+              <input
+                id="expense-date"
+                placeholder="Today"
+                autocomplete="off"
+                type="date"
+              />
+            </fieldset>
+            
+            <button type="submit" id="add-expense-button">Add Expense</button>
+          </form>
+        </section>
+      </div>
+    </section>
+    <template id="expense-item">
+      <section class="expense-item" data-id="{expense.id}">
+        <article>
+          <span class="cost">{expense.cost}</span>
+          <span class="budget">{expense.budget}</span>
+        </article>
+        <span class="description">{expense.description}</span>
+        <time>{expense.date}</time>
+      </section>
+    </template>
+    <template id="budget-item">
+      <section class="budget-item" data-name="{budget.name}">
+        <article>
+          <span class="cost">{budget.expensesCost} of {budget.value}</span>
+          <span class="name">{budget.name}</span>
+        </article>
+        <span class="missing">{budget.missing}</span>
+      </section>
+    </template>
+    <template id="budget-select-option">
+      <option>{budget.name}</option>
+    </template>
+    <template id="edit-expense-modal">
+      <swal-title>
+        Edit expense
+      </swal-title>
+      <swal-html>
+        <form id="edit-expense-form">
+          <fieldset class="input-wrapper">
+            <label for="edit-expense-cost">Cost</label>
+            <input
+              id="edit-expense-cost"
+              placeholder="10.99"
+              autocomplete="off"
+              type="text"
+              inputmode="decimal"
+            />
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="edit-expense-description">Description</label>
+            <input
+              id="edit-expense-description"
+              placeholder="Volunteering"
+              autocomplete="off"
+              type="text"
+            />
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="edit-expense-budget">Budget</label>
+            <select
+              id="edit-expense-budget"
+              placeholder="Misc"
+              autocomplete="off"
+            ></select>
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="edit-expense-date">Date</label>
+            <input
+              id="edit-expense-date"
+              placeholder="Today"
+              autocomplete="off"
+              type="date"
+            />
+          </fieldset>
+        </form>
+      </swal-html>
+      <swal-button type="confirm">
+        Save
+      </swal-button>
+      <swal-button type="cancel">
+        Cancel
+      </swal-button>
+      <swal-button type="deny">
+        Delete
+      </swal-button>
+    </template>
+    <template id="edit-budget-modal">
+      <swal-title>
+        Edit budget
+      </swal-title>
+      <swal-html>
+        <form id="edit-budget-form">
+          <fieldset class="input-wrapper">
+            <label for="edit-budget-name">Name</label>
+            <input
+              id="edit-budget-name"
+              placeholder="Food"
+              autocomplete="off"
+              type="text"
+            />
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="edit-budget-value">Value</label>
+            <input
+              id="edit-budget-value"
+              placeholder="100"
+              autocomplete="off"
+              type="text"
+              inputmode="decimal"
+            />
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="edit-budget-month">Month</label>
+            <input
+              id="edit-budget-month"
+              placeholder="Today"
+              autocomplete="off"
+              type="date"
+            />
+          </fieldset>
+        </form>
+      </swal-html>
+      <swal-button type="confirm">
+        Save
+      </swal-button>
+      <swal-button type="cancel">
+        Cancel
+      </swal-button>
+      <swal-button type="deny">
+        Delete
+      </swal-button>
+    </template>
+    <template id="budgets-filter-modal">
+      <swal-title>
+        Filter by Budgets
+      </swal-title>
+      <swal-html>
+        <form id="budgets-filter-form">
+        </form>
+      </swal-html>
+      <swal-button type="cancel">
+        Close
+      </swal-button>
+    </template>
+    <template id="budgets-filter-modal-budget-item">
+      <fieldset class="input-wrapper">
+        <label for="budget-filter-name-{budget.id}" class="checkbox">
+          <span>{budget.name}</span>
+          <input
+            id="budget-filter-name-{budget.id}"
+            type="checkbox"
+            value="{budget.name}"
+          />
+        </label>
+      </fieldset>
+    </template>
+    <template id="choose-month-modal">
+      <swal-title>
+        Navigate to month
+      </swal-title>
+      <swal-html>
+        <form id="choose-month-form">
+          <fieldset class="input-wrapper">
+            <label for="choose-month-input">Month</label>
+            <input
+              id="choose-month-input"
+              type="date"
+            />
+          </fieldset>
+        </form>
+      </swal-html>
+      <swal-button type="confirm">
+        Go
+      </swal-button>
+      <swal-button type="cancel">
+        Cancel
+      </swal-button>
+    </template>
+    <script src="/public/js/index.js"></script>
+  `;
+
+  return {
+    htmlContent,
+    titlePrefix: '',
+  } as PageContentResult;
+}
diff --git a/pages/index.tsx b/pages/index.tsx
deleted file mode 100644
index 19e3dfa..0000000
--- a/pages/index.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import axios from 'axios';
-
-import { Main } from 'components/Layout';
-import Login from 'components/Panels/Login';
-import AllPanels from 'components/Panels/All';
-import Loading from 'components/Loading';
-import { isLoggedIn } from 'lib/utils';
-import {
-  defaultTitle,
-  defaultDescription,
-  defaultKeywords,
-  baseUrl,
-} from 'lib/constants';
-
-const IndexPage = () => {
-  const [isLoading, setIsLoading] = useState(true);
-  const [hasValidSession, setHasValidSession] = useState(false);
-
-  useEffect(() => {
-    const checkSession = async () => {
-      const isUserLoggedIn = await isLoggedIn();
-      setHasValidSession(isUserLoggedIn);
-      setIsLoading(false);
-    };
-
-    checkSession();
-  }, []);
-
-  return (
-    <Main
-      title={defaultTitle}
-      description={defaultDescription}
-      keywords={defaultKeywords}
-      hasValidSession={hasValidSession}
-    >
-      <div className="index common">
-        {!hasValidSession ? <Login /> : <AllPanels />}
-      </div>
-      <Loading isShowing={isLoading} />
-    </Main>
-  );
-};
-
-export const getServerSideProps = async ({ req }: { req: Request }) => {
-  // @ts-ignore it does exist
-  if (req && req.headers && !req.headers.host.startsWith('localhost')) {
-    const pathname = req.url;
-
-    try {
-      await axios.post('https://stats.onbrn.com/api/event', {
-        domain: baseUrl.replace('https://', ''),
-        name: 'pageview',
-        url: `${baseUrl}${pathname}`,
-      });
-    } catch (error) {
-      console.log('Failed to log pageview');
-      console.error(error);
-    }
-  }
-
-  return {
-    props: {},
-  };
-};
-
-export default IndexPage;
diff --git a/pages/pricing.ts b/pages/pricing.ts
new file mode 100644
index 0000000..5020211
--- /dev/null
+++ b/pages/pricing.ts
@@ -0,0 +1,126 @@
+import { html, PageContentResult } from '../lib/utils.ts';
+
+export function pageAction() {
+  return new Response('Not Implemented', { status: 501 });
+}
+
+export function pageContent() {
+  const htmlContent = html`
+    <section class="main-section">
+      <h1>Pricing</h1>
+      <section class="hero">
+        <p>Pricing is simple.</p>
+        <p>You have a <strong>30-day free trial</strong> (no credit card required), and at the end, you can pay <strong>€18 / year</strong>, or <strong>€2 / month</strong>, no limits.</p>
+      </section>
+      <div data-has-invalid-session>
+        <h2>Signup or Login first</h2>
+        <p>Before you can pay, you need to <a href="/">Signup or Login</a> first.</p>
+      </div>
+      <div data-has-valid-session class="hidden" id="subscription-info">
+      </div>
+    </section>
+    <template id="valid-subscription">
+      <section>
+        <h2>You're already a customer!</h2>
+        <p>
+          You probably want to check out the <a href="/billing">billing section</a> instead.
+        </p>
+      </section>
+    </template>
+    <template id="trial-subscription">
+      <section>
+        <p class="expiration">
+          ...
+        </p>
+        <div class="buttons-wrapper">
+          <button class="secondary" type="button" id="subscribe-month">
+            Pay €2 / month
+          </button>
+          <span class="or">or</span>
+          <button type="button" id="subscribe-year">
+            Pay €18 / year
+          </button>
+        </div>
+      </section>
+    </template>
+    <script type="text/javascript">
+      (() => {
+        document.addEventListener('app-loaded', () => {
+          const subscriptionInfo = document.getElementById('subscription-info');
+          async function subscribeMonthly(event) {
+            event.preventDefault();
+            event.stopPropagation();
+            await userbase.purchaseSubscription({
+              successUrl: window.location.href,
+              cancelUrl: window.location.href,
+              priceId: 'budget-zen-v2-monthly',
+            });
+          }
+          async function subscribeYearly(event) {
+            event.preventDefault();
+            event.stopPropagation();
+            await userbase.purchaseSubscription({
+              successUrl: window.location.href,
+              cancelUrl: window.location.href,
+              priceId: 'budget-zen-v2-annual',
+            });
+          }
+          function getValidSubscriptionHtmlElement() {
+            const template = document.getElementById('valid-subscription');
+            const clonedElement = template.content.firstElementChild.cloneNode(true);
+            return clonedElement;
+          }
+          function getTrialSubscriptionHtmlElement(trialDaysLeft) {
+            const template = document.getElementById('trial-subscription');
+            const clonedElement = template.content.firstElementChild.cloneNode(true);
+            const expirationTextElement = clonedElement.querySelector('.expiration');
+            const message = ['Your trial'];
+            if (trialDaysLeft > 0) {
+              message.push('will expire in');
+              message.push(trialDaysLeft);
+              message.push(trialDaysLeft === 1 ? 'day.' : 'days.');
+            } else {
+              message.push('has expired.');
+            }
+            expirationTextElement.textContent = message.join(' ');
+            return clonedElement;
+          }
+          async function updateUI() {
+            const userSession = await window.app.getUserSession();
+            const isSubscriptionValid = userSession.subscriptionStatus === 'active';
+            let trialDaysLeft = 30;
+            if (userSession.trialExpirationDate) {
+              const trialExpirationDate = new Date(userSession.trialExpirationDate);
+              trialDaysLeft = window.app.utils.dateDiffInDays(new Date(), trialExpirationDate);
+            }
+            subscriptionInfo.replaceChildren();
+            if (isSubscriptionValid) {
+              const subscriptionElement = getValidSubscriptionHtmlElement();
+              subscriptionInfo.appendChild(subscriptionElement);
+            } else {
+              const subscriptionElement = getTrialSubscriptionHtmlElement(trialDaysLeft);
+              subscriptionInfo.appendChild(subscriptionElement);
+              const subscribeMonthButton = document.getElementById('subscribe-month');
+              const subscribeYearButton = document.getElementById('subscribe-year');
+              subscribeMonthButton.addEventListener('click', subscribeMonthly);
+              subscribeYearButton.addEventListener('click', subscribeYearly);
+            }
+          }
+          async function initializePage() {
+            await window.app.dataUtils.initializeDb();
+            updateUI();
+          }
+          if (window.app.isLoggedIn) {
+            initializePage();
+          }
+        });
+      })();
+    </script>
+  `;
+
+  return {
+    htmlContent,
+    titlePrefix: 'Pricing',
+    description: 'Simple pricing for Budget Zen.',
+  } as PageContentResult;
+}
diff --git a/pages/pricing.tsx b/pages/pricing.tsx
deleted file mode 100644
index fbef049..0000000
--- a/pages/pricing.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import moment from 'moment';
-import axios from 'axios';
-
-import { Main } from 'components/Layout';
-import Pricing from 'components/Panels/Pricing';
-import Loading from 'components/Loading';
-import { getUserSession } from 'lib/utils';
-import {
-  defaultTitle,
-  defaultDescription,
-  defaultKeywords,
-  baseUrl,
-} from 'lib/constants';
-
-const PricingPage = () => {
-  const [isLoading, setIsLoading] = useState(true);
-  const [hasValidSession, setHasValidSession] = useState(false);
-  const [hasValidSubscription, setHasValidSubscription] = useState(false);
-  const [trialDaysLeft, setTrialDaysLeft] = useState(30);
-
-  useEffect(() => {
-    const checkSession = async () => {
-      const userSession = await getUserSession();
-      if (userSession) {
-        setHasValidSession(true);
-        setHasValidSubscription(userSession.subscriptionStatus === 'active');
-        if (userSession.subscriptionStatus !== 'trialing') {
-          const daysLeft = moment(userSession.trialExpirationDate).diff(
-            moment(),
-            'days',
-          );
-          setTrialDaysLeft(daysLeft < 0 ? 0 : daysLeft);
-        }
-      }
-
-      setIsLoading(false);
-    };
-
-    checkSession();
-  }, []);
-
-  return (
-    <Main
-      title={defaultTitle}
-      description={defaultDescription}
-      keywords={defaultKeywords}
-      hasValidSession={hasValidSession}
-    >
-      <div className="pricing common">
-        <Pricing
-          hasValidSession={hasValidSession}
-          hasValidSubscription={hasValidSubscription}
-          trialDaysLeft={trialDaysLeft}
-        />
-      </div>
-      <Loading isShowing={isLoading} />
-    </Main>
-  );
-};
-
-export const getServerSideProps = async ({ req }: { req: Request }) => {
-  // @ts-ignore it does exist
-  if (req && req.headers && !req.headers.host.startsWith('localhost')) {
-    const pathname = req.url;
-
-    try {
-      await axios.post('https://stats.onbrn.com/api/event', {
-        domain: baseUrl.replace('https://', ''),
-        name: 'pageview',
-        url: `${baseUrl}${pathname}`,
-      });
-    } catch (error) {
-      console.log('Failed to log pageview');
-      console.error(error);
-    }
-  }
-
-  return {
-    props: {},
-  };
-};
-
-export default PricingPage;
diff --git a/pages/settings.ts b/pages/settings.ts
new file mode 100644
index 0000000..71df7ee
--- /dev/null
+++ b/pages/settings.ts
@@ -0,0 +1,113 @@
+import { html, PageContentResult } from '../lib/utils.ts';
+
+export function pageAction() {
+  return new Response('Not Implemented', { status: 501 });
+}
+
+export function pageContent() {
+  const htmlContent = html`
+    <section class="main-section">
+      <h1>Settings</h1>
+      <section class="hero" data-has-invalid-session>
+        <p>Before you can change your settings, you need to <a href="/">Signup or Login</a> first.</p>
+      </section>
+      <section class="hidden" data-has-valid-session>
+        <h2>Change currency</h2>
+        <p>When you change the currency, it only affects the displayed numbers for this client/browser. It won't make any currency conversions.</p>
+        <form id="change-currency-form">
+          <fieldset class="input-wrapper">
+            <label for="new-currency">Currency</label>
+            <select
+              id="new-currency"
+              placeholder="$"
+              name="new-currency"
+            >
+            <option>$</option>
+            <option>€</option>
+            <option>£</option>
+            <option>¥</option>
+            <option>₹</option>
+          </select>
+          </fieldset>
+          <button type="submit" id="change-currency-button">
+            Change currency
+          </button>
+        </form>
+      </section>
+      <section class="hidden" data-has-valid-session style="margin-top: 2rem;">
+        <h2>Import/Export data</h2>
+        <p>
+          You can import a JSON file exported from Budget Zen (v1 or v2) before. <a href="https://budgetzen.net/import-export-file-format">Learn more about the file format</a>.
+        </p>
+        <div class="buttons-wrapper">
+          <button type="button" id="import-button">
+            Import data
+          </button>
+          <span class="or">&nbsp;</span>
+          <button type="button" id="export-button">
+            Export data
+          </button>
+        </div>
+      </section>
+      <section class="hidden" data-has-valid-session style="margin-top: 2rem;">
+        <h2>Change Email</h2>
+        <p>
+          When you change your email or password, you'll need to login in other devices again.
+        </p>
+        <form id="change-email-form">
+          <fieldset class="input-wrapper">
+            <label for="new-email">New Email</label>
+            <input
+              id="new-email"
+              type="email"
+              placeholder="you@example.com"
+              name="new-email"
+            />
+          </fieldset>
+          <button type="submit" id="change-email-button">
+            Change email
+          </button>
+        </form>
+      </section>
+      <section class="hidden" data-has-valid-session style="margin-top: 2rem;">
+        <h2>Change Password / Encryption Key</h2>
+        <form id="change-password-form">
+          <fieldset class="input-wrapper">
+            <label for="current-password">Current Password / Encryption Key</label>
+            <input
+              id="current-password"
+              type="password"
+              placeholder="something secret"
+              name="current-password"
+            />
+          </fieldset>
+          <fieldset class="input-wrapper">
+            <label for="new-password">New Password / Encryption Key</label>
+            <input
+              id="new-password"
+              type="password"
+              placeholder="something even more secret"
+              name="new-password"
+            />
+          </fieldset>
+          <button type="submit" id="change-password-button">
+            Change password / encryption key
+          </button>
+        </form>
+      </section>
+      <section class="hidden" data-has-valid-session style="margin-top: 2rem;">
+        <h2>Delete account</h2>
+        <p>
+          You can delete your account and cancel your subscription from the <a href="/billing">billing section</a>.
+        </p>
+      </section>
+    </section>
+    <script src="/public/js/settings.js"></script>
+  `;
+
+  return {
+    htmlContent,
+    titlePrefix: 'Settings',
+    description: 'Settings for Budget Zen.',
+  } as PageContentResult;
+}
diff --git a/public/css/style.css b/public/css/style.css
new file mode 100644
index 0000000..d6c8e35
--- /dev/null
+++ b/public/css/style.css
@@ -0,0 +1,781 @@
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section {
+	display: block;
+}
+body {
+	line-height: 1;
+}
+ol, ul {
+	list-style: none;
+}
+blockquote, q {
+	quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+	content: '';
+	content: none;
+}
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
+
+/* Variables */
+
+:root {
+  --color-dark-background: #101010;
+  --color-background: #222;
+  --color-text: #f3f3f3;
+  --color-link: #ccc;
+  --color-link-hover: #fff;
+  --color-link-hover-dark: #303030;
+  --max-width: 1024px;
+  --min-width: 320px;
+}
+
+/* Base/Custom */
+
+html,
+body {
+  font: 16px/16px 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell',
+    'Fira Sans', 'Droid Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  background: var(--color-background);
+  background-size: cover;
+  color: var(--color-text);
+}
+pre, code {
+  font-family: 'Courier New', Courier, monospace;
+}
+code {
+  background-color: var(--color-background);
+}
+
+a {
+  color: var(--color-link);
+  text-decoration: underline;
+  transition: all 80ms ease-in;
+}
+
+a:hover,
+a:focus {
+  text-decoration: none;
+  color: var(--color-link-hover);
+}
+
+h1, h2, h3, strong {
+  font-weight: bold;
+}
+
+.wrapper {
+  margin: 0 auto;
+  display: block;
+  max-width: var(--max-width);
+  min-width: var(--min-width);
+}
+
+header {
+  display: block;
+  text-align: center;
+  padding: 0 0 1rem;
+  background-color: var(--color-dark-background);
+}
+
+@media only screen and (min-width: 600px) {
+  header {
+    padding: 1.3rem 0;
+  }
+
+  header .wrapper {
+    display: flex;
+    flex: 1;
+    flex-wrap: nowrap;
+    align-items: center;
+    justify-content: space-between;
+  }
+}
+
+header h1 {
+  font-size: 1rem;
+  line-height: 1rem;
+  font-weight: 100;
+}
+
+header h1 a {
+  text-decoration: none;
+  display: block;
+}
+
+header h1 a:hover {
+  opacity: 0.7;
+}
+
+header h1 img {
+  width: 160px;
+}
+
+header nav ul {
+  display: flex;
+  flex: 1;
+  margin: 20px auto;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: center;
+}
+
+@media only screen and (min-width: 600px) {
+  header nav ul {
+    flex-wrap: nowrap;
+    justify-content: flex-end;
+  }
+}
+
+header nav ul li {
+  display: block;
+  margin: 0 0.3rem 0.3rem;
+}
+
+@media only screen and (min-width: 600px) {
+  header nav ul li {
+    margin: 0 0.3rem;
+  }
+}
+
+header nav ul li a {
+  display: block;
+  padding: 0.5rem;
+  text-decoration: none;
+  font-weight: bold;
+  font-size: 1.1rem;
+  color: var(--color-link);
+}
+header nav ul li a:hover,
+header nav ul li a:focus {
+  text-decoration: underline;
+  color: var(--color-link-hover);
+}
+
+header nav ul li.active a {
+  color: var(--color-link-hover);
+  text-decoration: underline;
+}
+
+footer {
+  display: block;
+  padding: 20px 10px;
+  margin: 20px auto 0;
+  text-align: center;
+  background-color: var(--color-dark-background);
+}
+
+footer .faq {
+  display: block;
+  padding: 1em 2em 2em;
+  border-bottom: 1px solid #333;
+}
+
+footer .faq h3 {
+  font-size: 1.3em;
+  font-weight: 500;
+  line-height: 1.5em;
+  margin-bottom: 1em;
+}
+
+footer .faq-items {
+  display: block;
+  max-width: 100%;
+  margin: 0 auto;
+}
+
+@media only screen and (min-width: 600px) {
+  footer .faq-items {
+    display: flex;
+    flex: 1;
+    flex-wrap: wrap;
+    justify-content: center;
+    align-items: center;
+    width: var(--max-width);
+  }
+}
+
+footer .faq-item {
+  display: block;
+  margin: 1em 1em 2em;
+  text-align: left;
+  line-height: 1.4em;
+  font-size: 0.9em;
+  text-align: center;
+}
+
+@media only screen and (min-width: 600px) {
+  footer .faq-item {
+    margin: 1em;
+    width: 45%;
+  }
+}
+
+footer .faq-item h4 {
+  font-size: 1.1em;
+  font-weight: 500;
+  margin-bottom: 0.2em;
+}
+
+footer .links {
+  font-size: 0.8rem;
+  line-height: 1rem;
+  font-weight: 400;
+  margin-top: 1.5em;
+}
+
+footer .links a {
+  text-decoration: underline;
+  margin: 0 0.5rem;
+}
+
+footer .links a:hover,
+footer .links a:focus {
+  text-decoration: none;
+}
+
+footer .links span.by {
+  margin-left: 0.5rem;
+  margin-right: -0.4rem;
+}
+
+#loading {
+  position: fixed;
+  top: 0;
+  left: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  z-index: 10000;
+  background: rgba(0, 0, 0, 0.7);
+  transition: all 200ms ease-in-out;
+  visibility: visible;
+  opacity: 1;
+}
+
+#loading svg path,
+#loading svg rect {
+  fill: rgba(255, 255, 255, 0.8);
+}
+
+#loading.hide {
+  opacity: 0;
+  visibility: hidden;
+}
+
+hr {
+  border: 0;
+  height: 1px;
+  width: 20%;
+  position: relative;
+  margin: 5rem auto;
+  background: var(--color-link-hover);
+}
+
+hr:before {
+  content: "";
+  width: 6px;
+  height: 6px;
+  background: var(--color-link-hover);
+  display: inline-block;
+  border: 2px solid var(--color-link-hover);
+  position: absolute;
+  top: -5px;
+  left: 50%;
+  margin: 0 0 0 -3px;
+  transform:rotate(45deg);
+}
+
+button, a.button {
+  margin: 1rem auto;
+  padding: 1rem 1.5rem;
+  font-size: 1.2rem;
+  border: none;
+  border-radius: 3px;
+  color: var(--color-text);
+  background: var(--color-link-hover-dark);
+  cursor: pointer;
+  transition: all 80ms ease-in-out;
+  text-decoration: none;
+}
+
+button:hover,
+button:active,
+button:focus,
+a.button:hover,
+a.button:active,
+a.button:focus {
+  background: var(--color-link);
+  color: var(--color-background);
+}
+
+button.secondary,
+a.button.secondary {
+  padding: 0.8rem 1.2rem;
+  font-size: 1.1rem;
+  background-color: #666;
+}
+button.secondary:hover,
+button.secondary:active,
+button.secondary:focus,
+a.button.secondary:hover,
+a.button.secondary:active,
+a.button.secondary:focus {
+  background-color: #999;
+}
+
+.delete-button {
+  background:rgb(161, 0, 0);
+  color: #fff;
+  margin-left: 1rem;
+  margin-right: 1rem;
+}
+
+.input-wrapper {
+	display: block;
+	border: none;
+	margin: 2rem 0 1rem;
+  transition: all 100ms ease-in-out;
+}
+
+.input-wrapper > label {
+	font-size: 1rem;
+  display: block;
+  margin-bottom: 0.5rem;
+  font-weight: bold;
+  color: var(--color-link-hover-dark);
+  text-align: left;
+}
+
+.input-wrapper > label.checkbox {
+  cursor: pointer;
+  display: inline-block;
+}
+
+#add-expense-form .input-wrapper>label {
+  color: var(--color-link);
+}
+
+.input-wrapper input[type="text"],
+.input-wrapper input[type="date"],
+.input-wrapper input[type="datetime"],
+.input-wrapper input[type="email"],
+.input-wrapper input[type="number"],
+.input-wrapper input[type="search"],
+.input-wrapper input[type="time"],
+.input-wrapper input[type="url"],
+.input-wrapper input[type="password"],
+.input-wrapper textarea,
+.input-wrapper select 
+{
+	box-sizing: border-box;
+	width: 100%;
+	display: block;
+	outline: none;
+	border: none;
+	height: 2.5rem;
+	line-height: 2.5rem;
+	font-size: 1.1rem;
+	padding: 0.5rem 1rem;
+  border: 1px solid #fff;
+  background: #fff;
+  border-radius: 3px;
+  transition: all 80ms ease-in-out;
+}
+.input-wrapper input[type="text"]:focus,
+.input-wrapper input[type="date"]:focus,
+.input-wrapper input[type="datetime"]:focus,
+.input-wrapper input[type="email"]:focus,
+.input-wrapper input[type="number"]:focus,
+.input-wrapper input[type="search"]:focus,
+.input-wrapper input[type="time"]:focus,
+.input-wrapper input[type="url"]:focus,
+.input-wrapper input[type="password"]:focus,
+.input-wrapper textarea:focus,
+.input-wrapper select:focus 
+{
+  border-color: var(--color-link-hover);
+}
+
+.input-wrapper textarea {
+  min-height: 10rem;
+  resize: vertical;
+}
+
+.hidden {
+  display: none !important;
+}
+
+.error,
+.success,
+.warning {
+  padding: 1.5rem;
+  margin-bottom: 1.5rem;
+  border-radius: 3px;
+  border-bottom: 3px solid rgb(161, 0, 0);
+  color: var(--color-text);
+  background-image: linear-gradient(rgb(255, 166, 166), #faa);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, .3);
+}
+
+.success {
+  border-color: rgb(0, 161, 0);
+  background-image: linear-gradient(rgb(166, 255, 166), #afa);
+}
+
+.warning {
+  border-color: rgb(161, 158, 0);
+  background-image: linear-gradient(rgb(251, 255, 170), rgb(245, 245, 133));
+}
+
+.error h3,
+.success h3,
+.warning h3,
+.error p,
+.success p,
+.warning p {
+  font-size: 1.1rem;
+  font-weight: bold;
+  color: var(--color-text);
+  margin-bottom: 1rem;
+}
+
+.error p,
+.success p,
+.warning p {
+  font-size: 1rem;
+  font-weight: normal;
+}
+
+.no-data {
+  color: #ccc;
+  text-align: center;
+  font-size: 0.9rem;
+  display: block;
+}
+
+/* Index */
+.main-section {
+  margin: 2rem auto;
+  padding: 0 1rem 2rem;
+  min-height: 50vh;
+}
+
+@media only screen and (min-width: 600px) {
+  .main-section {
+    padding: 0 0 2rem;
+  }
+}
+
+.main-section p {
+  font-size: 1rem;
+  line-height: 1.7rem;
+  margin-bottom: 1rem;
+}
+
+.main-section ul {
+  font-size: 1rem;
+  line-height: 1.7rem;
+  margin-bottom: 1rem;
+  list-style: none;
+}
+
+.main-section h1 {
+  font-size: 2rem;
+  line-height: 3rem;
+  margin-bottom: 2rem;
+  font-weight: bold;
+  color: var(--color-link);
+}
+
+.main-section h2 {
+  font-size: 1.5rem;
+  line-height: 2rem;
+  margin-bottom: 1rem;
+  font-weight: bold;
+  color: var(--color-link-hover);
+}
+
+.buttons-wrapper {
+  margin: 0 auto;
+  display: flex;
+  align-items: center;
+  width: fit-content;
+}
+
+.or {
+  margin: 0 1.5rem;
+}
+
+.expense-item,
+.budget-item {
+  display: flex;
+  flex: 1;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: flex-start;
+  padding: 1rem 1.5rem;
+  border-radius: 3px;
+  box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.1);
+  background-color: #f0f0f0;
+  margin: 0.5rem;
+  cursor: pointer;
+  min-width: 200px;
+}
+
+.expense-item:hover,
+.budget-item:hover {
+  box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.3);
+}
+
+.expense-item article,
+.budget-item article {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  text-align: left;
+}
+
+.budget-item article {
+  flex-grow: 2;
+}
+
+.expense-item article span,
+.budget-item article span {
+  color: #333;
+  font-size: 0.9rem;
+  font-weight: normal;
+  text-align: left;
+  margin-top: 5px;
+}
+
+.expense-item span.description {
+  color: #333;
+  font-size: 1rem;
+  font-weight: normal;
+  text-align: left;
+  flex: 1;
+  flex-grow: 2;
+}
+
+.expense-item article span.cost,
+.budget-item article span.cost {
+  font-size: 1rem;
+  font-weight: bold;
+  margin-top: 0;
+}
+
+.budget-item.total {
+  background-color: #fff;
+  cursor: inherit;
+}
+
+.budget-item span.missing {
+  color: #666;
+  text-align: right;
+  flex: 1;
+  font-size: 1rem;
+}
+
+.expense-item time {
+  color: #666;
+  font-size: 0.9rem;
+  font-weight: normal;
+  text-align: right;
+  text-transform: uppercase;
+}
+
+.panels {
+  display: flex;
+  flex: 1;
+  justify-content: center;
+  align-items: flex-start;
+  flex-direction: column-reverse;
+  max-width: 100vw;
+}
+
+@media only screen and (min-width: 600px) {
+  .panels {
+    flex-direction: row;
+  }
+}
+
+.left-panel {
+  display: flex;
+  flex: 1;
+  justify-content: flex-start;
+  align-items: center;
+  /* flex-direction: column; */
+}
+
+.expenses-wrapper {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  margin: 20px 10px;
+  max-height: 100vh;
+  overflow: auto;
+  min-height: 30vh;
+  min-width: calc(80vw - 20px);
+  width: calc(100vw - 50px);
+}
+
+@media only screen and (min-width: 600px) {
+  .expenses-wrapper {
+    margin: 0 20px;
+    min-width: auto;
+    width: auto;
+  }
+}
+
+.expenses-wrapper .expenses-filter-wrapper {
+  display: flex;
+  margin: 20px 0.5rem;
+}
+
+#expenses-filter .input-wrapper {
+  margin: 0 1rem 0 0;
+}
+
+#expenses-filter .input-wrapper input {
+  font-size: 1rem;
+}
+
+#budgets-filter-button {
+  padding: 0.5rem 1rem;
+  margin: 0;
+}
+
+#budgets-filter-button.active {
+  background-color: var(--color-link);
+  color: var(--color-dark-background);
+}
+
+#budgets-filter-form .input-wrapper {
+  margin: 0.5rem 0;
+}
+
+#budgets-filter-form .input-wrapper > label {
+  display: flex;
+  justify-content: space-between;
+  padding: 0.5rem;
+  transition: all 60ms ease-in-out;
+}
+
+#budgets-filter-form .input-wrapper > label:hover {
+  background-color: var(--color-link);
+}
+
+#add-expense {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  padding: 0;
+  margin: 10px 0 30px;
+}
+
+@media only screen and (min-width: 600px) {
+  #add-expense {
+    max-width: 320px;
+    margin-top: 5px;
+    margin-bottom: 10px;
+  }
+}
+
+#add-expense-form {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  background-color: rgba(0, 0, 0, 0.1);
+  padding: 0 16px;
+  border-radius: 5px;
+  margin-top: 20px;
+  margin-right: -2px;
+}
+
+#month-navigation {
+  display: flex;
+  margin: 20px 0;
+  align-items: center;
+  flex-direction: row;
+  justify-content: space-between;
+  user-select: none;
+}
+
+#month-navigation-previous, #month-navigation-next {
+  width: 16px;
+  cursor: pointer;
+  padding: 5px 10px;
+  fill: var(--color-link);
+}
+
+#current-month {
+  color: var(--color-link);
+  flex: 1;
+  padding: 0 20px;
+  font-size: 24px;
+  line-height: 24px;
+  font-weight: bold;
+  text-align: center;
+  cursor: pointer;
+}
+
+.budgets-wrapper {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  margin: 20px 10px;
+  width: calc(100vw - 50px);
+}
+
+@media only screen and (min-width: 600px) {
+  .budgets-wrapper {
+    width: auto;
+    margin: 0 15px 0 0;
+  }
+}
+
+#budgets {
+  margin-top: 5px;
+}
+
+.text {
+  color: #ccc;
+  text-align: center;
+  align-items: center;
+  flex: 1;
+  display: flex;
+  font-size: 14px;
+  margin: 1rem 2rem;
+}
diff --git a/public/js/index.js b/public/js/index.js
new file mode 100644
index 0000000..ef375a9
--- /dev/null
+++ b/public/js/index.js
@@ -0,0 +1,695 @@
+(() => {
+  document.addEventListener('app-loaded', () => {
+    const loginForm = document.getElementById('login-form');
+    const emailInput = document.getElementById('email');
+    const passwordInput = document.getElementById('password');
+    const loginButton = document.getElementById('login-button');
+    const signupButton = document.getElementById('signup-button');
+    const expensesFilterSearchInput = document.getElementById('expenses-filter-search');
+    const budgetsFilterButton = document.getElementById('budgets-filter-button');
+    const addBudgetButton = document.getElementById('add-budget-button');
+
+    const expensesList = document.getElementById('expenses');
+    const budgetsList = document.getElementById('budgets');
+    const addExpenseForm = document.getElementById('add-expense-form');
+    const addExpenseButton = document.getElementById('add-expense-button');
+    const expenseCostInput = document.getElementById('expense-cost');
+    const expenseDescriptionInput = document.getElementById('expense-description');
+    const expenseBudgetSelect = document.getElementById('expense-budget');
+    const expenseDateInput = document.getElementById('expense-date');
+
+    const monthNavigationPreviousButton = document.getElementById('month-navigation-previous');
+    const monthNavigationNextButton = document.getElementById('month-navigation-next');
+    const monthNavigationLabel = document.getElementById('current-month');
+
+    let currentMonth = (new Date().toISOString()).substring(0, 7);
+    let currency = '$';
+    const budgetFilters = new Set();
+
+    async function login(event) {
+      loginButton.textContent = 'Logging in...';
+      await loginOrSignup(event, false);
+      loginButton.textContent = 'Login';
+    }
+
+    async function signup(event) {
+      signupButton.textContent = 'Signing up...';
+      await loginOrSignup(event, true);
+      signupButton.textContent = 'Signup';
+    }
+
+    let isLoggingInOrSigningUp = false;
+
+    async function loginOrSignup(event, isSigningUp) {
+      event.preventDefault();
+      event.stopPropagation();
+
+      if (isLoggingInOrSigningUp) {
+        return;
+      }
+
+      isLoggingInOrSigningUp = true;
+      window.app.showLoading();
+
+      const email = emailInput.value;
+      const password = passwordInput.value;
+
+      const loginOrSignupMethod = isSigningUp ? window.app.dataUtils.createAccount : window.app.dataUtils.validateLogin;
+
+      const { success, error } = await loginOrSignupMethod(email, password);
+
+      if (success) {
+        const { Swal } = window;
+
+        Swal.fire(
+          'Alright!',
+          'That looks alright. Let\'s get on with it!',
+          'success',
+        );
+
+        window.app.showValidSessionElements();
+        loginForm.reset();
+        await initializePage();
+      } else {
+        if (error) {
+          window.app.showNotification(error, 'error');
+        }
+      }
+
+      window.app.hideLoading();
+      isLoggingInOrSigningUp = false;
+    }
+
+    function getExpenseItemHtmlElement(expense) {
+      const template = document.getElementById('expense-item');
+
+      const clonedElement = template.content.firstElementChild.cloneNode(true);
+      clonedElement.dataset.id = expense.id;
+
+      const costElement = clonedElement.querySelector('article span.cost');
+      costElement.textContent = window.app.utils.formatNumber(currency, expense.cost);
+
+      const budgetElement = clonedElement.querySelector('article span.budget');
+      budgetElement.textContent = expense.budget;
+
+      const descriptionElement = clonedElement.querySelector('span.description');
+      descriptionElement.textContent = expense.description;
+
+      const dateElement = clonedElement.querySelector('time');
+      dateElement.textContent = window.app.utils.showFormattedDate(expense.date);
+
+      return clonedElement;
+    }
+
+    function getBudgetItemHtmlElement(budget) {
+      const template = document.getElementById('budget-item');
+
+      const clonedElement = template.content.firstElementChild.cloneNode(true);
+      clonedElement.dataset.name = budget.name;
+
+      const costElement = clonedElement.querySelector('article span.cost');
+      costElement.textContent = `${window.app.utils.formatNumber(currency, budget.expensesCost)} of ${
+        window.app.utils.formatNumber(currency, budget.value)
+      }`;
+
+      const nameElement = clonedElement.querySelector('article span.name');
+      nameElement.textContent = budget.name;
+
+      const missingElement = clonedElement.querySelector('span.missing');
+      missingElement.textContent = window.app.utils.formatNumber(currency, budget.value - budget.expensesCost);
+
+      if (budget.id === 'total') {
+        clonedElement.classList.add('total');
+      }
+
+      return clonedElement;
+    }
+
+    function getBudgetSelectOptionHtmlElement(budgetName) {
+      const template = document.getElementById('budget-select-option');
+
+      const clonedElement = template.content.firstElementChild.cloneNode(true);
+      clonedElement.textContent = budgetName;
+
+      return clonedElement;
+    }
+
+    function getBudgetsFilterModalBudgetItemHtmlElement(budget) {
+      const template = document.getElementById('budgets-filter-modal-budget-item');
+
+      const clonedElement = template.content.firstElementChild.cloneNode(true);
+
+      const labelElement = clonedElement.querySelector('label');
+      labelElement.attributes[0].value = `budget-filter-name-${budget.id}`;
+
+      const nameElement = clonedElement.querySelector('label span');
+      nameElement.textContent = budget.name;
+
+      const inputElement = clonedElement.querySelector('input');
+      inputElement.value = budget.name;
+      inputElement.id = `budget-filter-name-${budget.id}`;
+
+      if (budgetFilters.has(budget.name)) {
+        inputElement.checked = true;
+      }
+
+      return clonedElement;
+    }
+
+    async function showData(isComingFromEmptyState = false) {
+      monthNavigationLabel.textContent = window.app.utils.showFormattedDate(currentMonth, {
+        showDay: false,
+        showYear: true,
+        longMonth: true,
+        longYear: true,
+      });
+
+      const allBudgets = await window.app.dataUtils.fetchBudgets();
+      const budgets = await window.app.dataUtils.fetchBudgets(currentMonth);
+      const expenses = await window.app.dataUtils.fetchExpenses(currentMonth);
+
+      const budgetOptions = new Set([{ name: 'Misc' }, ...allBudgets].map((budget) => budget.name));
+
+      let totalCost = 0;
+      let totalBudget = 0;
+
+      const budgetsToShow = [...budgets]
+        .map((budget) => {
+          const budgetToShow = {
+            expensesCost: 0,
+            ...budget,
+          };
+
+          // Calculate expenses cost
+          expenses.forEach((expense) => {
+            if (expense.budget === budget.name) {
+              budgetToShow.expensesCost += expense.cost;
+            }
+          });
+
+          totalCost += budgetToShow.expensesCost;
+          totalBudget += budgetToShow.value;
+
+          return budgetToShow;
+        })
+        .sort(window.app.utils.sortByMissingBudget);
+
+      // Add Total budget
+      if (budgetsToShow.length > 0) {
+        budgetsToShow.unshift({
+          id: 'total',
+          name: 'Total',
+          value: totalBudget,
+          expensesCost: totalCost,
+          month: currentMonth,
+        });
+      }
+
+      // If this is for the current or next month and there are no budgets, create budgets based on the previous/current month.
+      if (budgets.length === 0 && !isComingFromEmptyState) {
+        const currentMonthDate = new Date(`${currentMonth}-15`);
+        currentMonthDate.setMonth(currentMonthDate.getMonth() + 1);
+        const actualCurrentMonth = currentMonthDate.toISOString().substring(0, 7);
+
+        const nextMonthDate = new Date();
+        nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
+        const nextMonth = nextMonthDate.toISOString().substring(0, 7);
+
+        if (currentMonth === nextMonth || currentMonth === actualCurrentMonth) {
+          const previousMonthDate = new Date(`${currentMonth}-15`);
+          previousMonthDate.setMonth(previousMonthDate.getMonth() - 1);
+          const previousMonth = previousMonthDate.toISOString().substring(0, 7);
+
+          await window.app.dataUtils.copyBudgets(previousMonth, currentMonth);
+          await showData(true);
+          return;
+        }
+      }
+
+      let expensesToShow = expenses;
+
+      if (expensesFilterSearchInput.value) {
+        expensesToShow = expensesToShow.filter((expense) =>
+          expense.description
+            .toLowerCase()
+            .includes(expensesFilterSearchInput.value.toLowerCase())
+        );
+      }
+
+      if (budgetFilters.size > 0) {
+        budgetsFilterButton.classList.add('active');
+        expensesToShow = expensesToShow.filter((expense) => budgetFilters.has(expense.budget));
+      } else {
+        budgetsFilterButton.classList.remove('active');
+      }
+
+      // Show month's budgets
+      budgetsList.replaceChildren();
+      for (const budget of budgetsToShow) {
+        const element = getBudgetItemHtmlElement(budget);
+
+        if (budget.id !== 'total') {
+          element.addEventListener('click', () => showEditBudgetModal(budget));
+        }
+
+        budgetsList.appendChild(element);
+      }
+
+      if (budgetsToShow.length === 0) {
+        budgetsList.innerHTML = '<span class="no-data">There are no budgets yet. Add some!</span>';
+      }
+
+      // Show month's expenses
+      expensesList.replaceChildren();
+      for (const expense of expensesToShow) {
+        const element = getExpenseItemHtmlElement(expense);
+
+        element.addEventListener('click', () => showEditExpenseModal(expense));
+
+        expensesList.appendChild(element);
+      }
+
+      if (expensesToShow.length === 0) {
+        expensesList.innerHTML = '<span class="no-data">No expenses found for this month. Add some!</span>';
+      }
+
+      // Show all budgets in expenseBudgetSelect
+      expenseBudgetSelect.replaceChildren();
+      for (const budgetName of budgetOptions.values()) {
+        const element = getBudgetSelectOptionHtmlElement(budgetName);
+
+        expenseBudgetSelect.appendChild(element);
+      }
+    }
+
+    async function navigateToMonth(month) {
+      currentMonth = month;
+      await showData();
+    }
+
+    async function navigateToPreviousMonth() {
+      const previousMonthDate = new Date(`${currentMonth}-15`);
+      previousMonthDate.setMonth(previousMonthDate.getMonth() - 1);
+      const month = previousMonthDate.toISOString().substring(0, 7);
+
+      await navigateToMonth(month);
+    }
+
+    async function navigateToNextMonth() {
+      const currentMonthDate = new Date(`${currentMonth}-15`);
+      currentMonthDate.setMonth(currentMonthDate.getMonth() + 1);
+      const month = currentMonthDate.toISOString().substring(0, 7);
+
+      const nextMonthDate = new Date();
+      nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
+      const nextMonth = nextMonthDate.toISOString().substring(0, 7);
+
+      if (month > nextMonth) {
+        window.app.showNotification('Cannot travel further into the future!', 'error');
+        return;
+      }
+
+      await navigateToMonth(month);
+    }
+
+    async function initializePage() {
+      await window.app.dataUtils.initializeDb();
+
+      const userSession = await window.app.getUserSession();
+      currency = userSession.profile?.currency || '$';
+
+      showData();
+    }
+
+    let isAddingExpense = false;
+
+    async function addExpense(event) {
+      event.preventDefault();
+      event.stopPropagation();
+
+      if (isAddingExpense) {
+        return;
+      }
+
+      addExpenseButton.textContent = 'Adding...';
+      isAddingExpense = true;
+      window.app.showLoading();
+
+      const cost = Number.parseFloat(expenseCostInput.value.replace(',', '.'));
+      const description = expenseDescriptionInput.value;
+      const budget = expenseBudgetSelect.value;
+      const date = expenseDateInput.value;
+
+      const parsedExpense = {
+        id: 'newExpense',
+        cost,
+        description,
+        budget,
+        date,
+      };
+
+      const success = await window.app.dataUtils.saveExpense(parsedExpense);
+
+      if (success) {
+        window.app.showNotification('Expense added successfully.');
+        addExpenseForm.reset();
+      }
+
+      await showData();
+
+      window.app.hideLoading();
+      isAddingExpense = false;
+      addExpenseButton.textContent = 'Add Expense';
+    }
+
+    async function showEditExpenseModal(expense) {
+      const { Swal } = window;
+
+      let isUpdating = false;
+
+      await Swal.fire({
+        template: '#edit-expense-modal',
+        focusConfirm: false,
+        allowEscapeKey: true,
+        preConfirm: async () => {
+          const updatedExpense = {
+            id: expense.id,
+            cost: Number.parseFloat(document.getElementById('edit-expense-cost').value.replace(',', '.')),
+            description: document.getElementById('edit-expense-description').value,
+            budget: document.getElementById('edit-expense-budget').value,
+            date: document.getElementById('edit-expense-date').value,
+          };
+
+          const saveExpenseButton = Swal.getConfirmButton();
+
+          if (isUpdating) {
+            return false;
+          }
+
+          saveExpenseButton.textContent = 'Saving...';
+          isUpdating = true;
+          window.app.showLoading();
+
+          const success = await window.app.dataUtils.saveExpense(updatedExpense);
+
+          if (success) {
+            window.app.showNotification('Expense updated successfully.');
+          }
+
+          await showData();
+
+          window.app.hideLoading();
+          isUpdating = false;
+          saveExpenseButton.textContent = 'Save';
+
+          return Boolean(success);
+        },
+        preDeny: async () => {
+          const deleteExpenseButton = Swal.getDenyButton();
+
+          if (isUpdating) {
+            return false;
+          }
+
+          const { isConfirmed } = await Swal.fire({
+            title: 'Are you sure?',
+            text: 'You won\'t be able to recover this expense!',
+            icon: 'warning',
+            showCancelButton: true,
+            confirmButtonColor: 'red',
+            confirmButtonText: 'Yes, delete it!',
+          });
+
+          if (isConfirmed) {
+            deleteExpenseButton.textContent = 'Deleting...';
+            isUpdating = true;
+            window.app.showLoading();
+
+            const success = await window.app.dataUtils.deleteExpense(expense.id);
+
+            if (success) {
+              window.app.showNotification('Expense deleted successfully.');
+            }
+
+            await showData();
+
+            window.app.hideLoading();
+            isUpdating = false;
+            deleteExpenseButton.textContent = 'Delete';
+
+            return Boolean(success);
+          }
+
+          return false;
+        },
+        willOpen: async () => {
+          // Show all budgets in expenseBudgetSelect
+          const allBudgets = await window.app.dataUtils.fetchBudgets();
+          const budgetOptions = new Set([{ name: 'Misc' }, ...allBudgets].map((budget) => budget.name));
+          const budgetSelect = document.getElementById('edit-expense-budget');
+          budgetSelect.replaceChildren();
+          for (const budgetName of budgetOptions.values()) {
+            const element = getBudgetSelectOptionHtmlElement(budgetName);
+
+            budgetSelect.appendChild(element);
+          }
+
+          document.getElementById('edit-expense-cost').value = expense.cost;
+          document.getElementById('edit-expense-description').value = expense.description;
+          document.getElementById('edit-expense-budget').value = expense.budget;
+          document.getElementById('edit-expense-date').value = expense.date;
+        },
+      });
+    }
+
+    async function showEditBudgetModal(budget) {
+      const { Swal } = window;
+
+      let isUpdating = false;
+
+      await Swal.fire({
+        template: '#edit-budget-modal',
+        focusConfirm: false,
+        allowEscapeKey: true,
+        preConfirm: async () => {
+          const updatedBudget = {
+            id: budget.id,
+            name: document.getElementById('edit-budget-name').value,
+            value: Number.parseFloat(document.getElementById('edit-budget-value').value.replace(',', '.')),
+            month: document.getElementById('edit-budget-month').value.substring(0, 7),
+          };
+
+          const saveBudgetButton = Swal.getConfirmButton();
+
+          if (isUpdating) {
+            return false;
+          }
+
+          saveBudgetButton.textContent = 'Saving...';
+          isUpdating = true;
+          window.app.showLoading();
+
+          const success = await window.app.dataUtils.saveBudget(updatedBudget);
+
+          if (success) {
+            window.app.showNotification('Budget updated successfully.');
+          }
+
+          await showData();
+
+          window.app.hideLoading();
+          isUpdating = false;
+          saveBudgetButton.textContent = 'Save';
+
+          return Boolean(success);
+        },
+        preDeny: async () => {
+          const deleteBudgetButton = Swal.getDenyButton();
+
+          if (isUpdating) {
+            return false;
+          }
+
+          const { isConfirmed } = await Swal.fire({
+            title: 'Are you sure?',
+            text: 'You won\'t be able to recover this budget!',
+            icon: 'warning',
+            showCancelButton: true,
+            confirmButtonColor: 'red',
+            confirmButtonText: 'Yes, delete it!',
+          });
+
+          if (isConfirmed) {
+            deleteBudgetButton.textContent = 'Deleting...';
+            isUpdating = true;
+            window.app.showLoading();
+
+            const success = await window.app.dataUtils.deleteBudget(budget.id);
+
+            if (success) {
+              window.app.showNotification('Budget deleted successfully.');
+            }
+
+            await showData();
+
+            window.app.hideLoading();
+            isUpdating = false;
+            deleteBudgetButton.textContent = 'Delete';
+
+            return Boolean(success);
+          }
+
+          return false;
+        },
+        willOpen: () => {
+          document.getElementById('edit-budget-name').value = budget.name;
+          document.getElementById('edit-budget-value').value = budget.value;
+          document.getElementById('edit-budget-month').value = `${budget.month}-15`;
+        },
+      });
+    }
+
+    async function showAddBudgetModal() {
+      const { Swal } = window;
+
+      let isAdding = false;
+
+      await Swal.fire({
+        template: '#edit-budget-modal',
+        focusConfirm: false,
+        allowEscapeKey: true,
+        showDenyButton: false,
+        title: 'Add Budget',
+        preConfirm: async () => {
+          const newBudget = {
+            id: 'newBudget',
+            name: document.getElementById('edit-budget-name').value,
+            value: Number.parseFloat(document.getElementById('edit-budget-value').value.replace(',', '.')),
+            month: document.getElementById('edit-budget-month').value.substring(0, 7),
+          };
+
+          const saveBudgetButton = Swal.getConfirmButton();
+
+          if (isAdding) {
+            return false;
+          }
+
+          saveBudgetButton.textContent = 'Adding...';
+          isAdding = true;
+          window.app.showLoading();
+
+          const success = await window.app.dataUtils.saveBudget(newBudget);
+
+          if (success) {
+            window.app.showNotification('Budget added successfully.');
+          }
+
+          await showData();
+
+          window.app.hideLoading();
+          isAdding = false;
+          saveBudgetButton.textContent = 'Add';
+
+          return Boolean(success);
+        },
+        willOpen: () => {
+          const saveBudgetButton = Swal.getConfirmButton();
+          saveBudgetButton.textContent = 'Add';
+
+          document.getElementById('edit-budget-name').value = '';
+          document.getElementById('edit-budget-value').value = 100;
+          document.getElementById('edit-budget-month').value = `${currentMonth}-15`;
+        },
+      });
+    }
+
+    async function showBudgetsFilterModal() {
+      const { Swal } = window;
+
+      await Swal.fire({
+        template: '#budgets-filter-modal',
+        focusConfirm: false,
+        allowEscapeKey: true,
+        didClose: () => {
+          budgetsFilterButton.blur();
+        },
+        willOpen: async () => {
+          // Show all budgets in #budgets-filter-form
+          const allBudgets = await window.app.dataUtils.fetchBudgets();
+          const allUniquelyNamedBudgets = allBudgets.reduce((budgetsList, budget) => {
+            if (!budgetsList.some((_budget) => budget.name === _budget.name)) {
+              budgetsList.push(budget);
+            }
+
+            return budgetsList;
+          }, []);
+          const budgetsFilterForm = document.getElementById('budgets-filter-form');
+          budgetsFilterForm.replaceChildren();
+          for (const budget of allUniquelyNamedBudgets) {
+            const element = getBudgetsFilterModalBudgetItemHtmlElement(budget);
+
+            const inputElement = element.querySelector('input');
+
+            inputElement.addEventListener('change', () => {
+              if (!inputElement.checked) {
+                budgetFilters.delete(budget.name);
+              } else {
+                budgetFilters.add(budget.name);
+              }
+
+              showData();
+            });
+
+            budgetsFilterForm.appendChild(element);
+          }
+        },
+      });
+    }
+
+    async function chooseMonthModal() {
+      const { Swal } = window;
+
+      const { value: newMonth } = await Swal.fire({
+        template: '#choose-month-modal',
+        focusConfirm: false,
+        allowEscapeKey: true,
+        preConfirm: () => {
+          const monthInput = document.getElementById('choose-month-input').value;
+          const month = monthInput.substring(0, 7);
+
+          const nextMonthDate = new Date();
+          nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
+          const nextMonth = nextMonthDate.toISOString().substring(0, 7);
+
+          if (month > nextMonth) {
+            window.app.showNotification('Cannot travel further into the future!', 'error');
+            return false;
+          }
+
+          return month;
+        },
+        willOpen: () => {
+          document.getElementById('choose-month-input').value = `${currentMonth}-15`;
+        },
+      });
+
+      if (newMonth) {
+        await navigateToMonth(newMonth);
+      }
+    }
+
+    if (window.app.isLoggedIn) {
+      initializePage();
+    }
+
+    loginForm.addEventListener('submit', login);
+    signupButton.addEventListener('click', signup);
+    addExpenseForm.addEventListener('submit', addExpense);
+    addBudgetButton.addEventListener('click', showAddBudgetModal);
+    budgetsFilterButton.addEventListener('click', showBudgetsFilterModal);
+    expensesFilterSearchInput.addEventListener('keyup', window.app.utils.debounce(showData, 150));
+    monthNavigationPreviousButton.addEventListener('click', navigateToPreviousMonth);
+    monthNavigationNextButton.addEventListener('click', navigateToNextMonth);
+    monthNavigationLabel.addEventListener('click', chooseMonthModal);
+  });
+})();
diff --git a/public/js/script.js b/public/js/script.js
new file mode 100644
index 0000000..8ea0d3d
--- /dev/null
+++ b/public/js/script.js
@@ -0,0 +1,1027 @@
+(() => {
+  const cachedData = {
+    budgets: [],
+    expenses: [],
+  };
+
+  async function initializeApp() {
+    window.app = window.app || {};
+    initializeLoading();
+
+    // if (navigator && navigator.serviceWorker) {
+    //   navigator.serviceWorker.register('/public/js/sw.js');
+    // }
+
+    // Expose helper functions
+    window.app.isLoggedIn = false;
+    window.app.showNotification = showNotification;
+    window.app.doLogout = doLogout;
+    window.app.getUserSession = getUserSession;
+    window.app.showValidSessionElements = showValidSessionElements;
+    window.app.hideValidSessionElements = hideValidSessionElements;
+    window.app.dataUtils = {
+      validateLogin,
+      createAccount,
+      initializeDb,
+      fetchExpenses,
+      saveExpense,
+      deleteExpense,
+      fetchBudgets,
+      saveBudget,
+      deleteBudget,
+      copyBudgets,
+      deleteAllData,
+      exportAllData,
+      importData,
+      generateId,
+    };
+    window.app.utils = {
+      formatNumber,
+      showFormattedDate,
+      sortByDate,
+      sortByCount,
+      sortByName,
+      sortByMissingBudget,
+      dateDiffInDays,
+      debounce,
+    };
+
+    const checkForValidSession = async () => {
+      const isUserLoggedIn = await isLoggedIn();
+
+      if (isUserLoggedIn) {
+        window.app.isLoggedIn = true;
+        showValidSessionElements();
+
+        const userSession = await getUserSession();
+
+        if (userSession.trialExpirationDate) {
+          const trialExpirationDate = new Date(userSession.trialExpirationDate);
+          const now = new Date();
+
+          if (userSession.subscriptionStatus !== 'active' && trialExpirationDate < now) {
+            showNotification('Your trial has expired!', 'error');
+
+            // Give people some time to logout or export
+            setTimeout(() => {
+              window.location.href = '/pricing';
+            }, 10000);
+          }
+        }
+      }
+    };
+
+    await checkForValidSession();
+
+    document.dispatchEvent(new Event('app-loaded'));
+
+    window.app.hideLoading();
+  }
+
+  function initializeLoading() {
+    const loadingComponent = document.getElementById('loading');
+
+    window.app.showLoading = () => loadingComponent.classList.remove('hide');
+    window.app.hideLoading = () => loadingComponent.classList.add('hide');
+  }
+
+  function showValidSessionElements() {
+    const elementsToShow = document.querySelectorAll('[data-has-valid-session]');
+    const elementsToHide = document.querySelectorAll('[data-has-invalid-session]');
+
+    elementsToShow.forEach((element) => element.classList.remove('hidden'));
+    elementsToHide.forEach((element) => element.classList.add('hidden'));
+  }
+
+  function hideValidSessionElements() {
+    const elementsToShow = document.querySelectorAll('[data-has-invalid-session]');
+    const elementsToHide = document.querySelectorAll('[data-has-valid-session]');
+
+    elementsToShow.forEach((element) => element.classList.remove('hidden'));
+    elementsToHide.forEach((element) => element.classList.add('hidden'));
+  }
+
+  function showNotification(message, type = 'success') {
+    const { Swal } = window;
+
+    const Toast = window.Swal.mixin({
+      toast: true,
+      position: 'top-end',
+      showConfirmButton: false,
+      timer: type === 'success' ? 2500 : 0,
+      timerProgressBar: type === 'success',
+      didOpen: (toast) => {
+        toast.addEventListener('mouseenter', Swal.stopTimer);
+        toast.addEventListener('mouseleave', Swal.resumeTimer);
+      },
+    });
+
+    Toast.fire({
+      icon: type,
+      title: message,
+    });
+  }
+
+  async function doLogout() {
+    try {
+      const { userbase } = window;
+      await userbase.signOut();
+      hideValidSessionElements();
+
+      Swal.fire('Alright!', 'No idea who you are right now.', 'success');
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire(
+        'Something went wrong!',
+        `Uh oh! Something wrong happened: ${error && error.message}`,
+        'error',
+      );
+    }
+
+    return false;
+  }
+
+  async function isLoggedIn() {
+    try {
+      const { userbase } = window;
+      const { userbaseConfig } = window.app;
+      const session = await userbase.init(userbaseConfig);
+      if (session.user) {
+        return true;
+      }
+    } catch (_error) {
+      // Do nothing
+    }
+
+    return false;
+  }
+
+  async function getUserSession() {
+    try {
+      const { userbase } = window;
+      const { userbaseConfig } = window.app;
+      const session = await userbase.init(userbaseConfig);
+      return session.user;
+    } catch (_error) {
+      // Do nothing
+    }
+
+    return null;
+  }
+
+  async function validateLogin(email, password) {
+    try {
+      const { userbase } = window;
+      const { userbaseConfig } = window.app;
+      await userbase.signIn({
+        username: email,
+        password,
+        sessionLength: userbaseConfig.sessionLength,
+        rememberMe: 'local',
+      });
+      return { success: true };
+    } catch (error) {
+      console.log(error);
+      return { success: false, error };
+    }
+  }
+
+  async function createAccount(email, password) {
+    try {
+      const { userbase } = window;
+      const { userbaseConfig } = window.app;
+      await userbase.signUp({
+        username: email,
+        password,
+        sessionLength: userbaseConfig.sessionLength,
+        rememberMe: 'local',
+        email,
+      });
+      return { success: true };
+    } catch (error) {
+      console.log(error);
+      return { success: false, error };
+    }
+  }
+
+  function getExpenseFromItem(item) {
+    try {
+      return {
+        id: item.itemId,
+        cost: item.item.cost,
+        description: item.item.description,
+        budget: item.item.budget,
+        date: item.item.date,
+      };
+    } catch (_error) {
+      return null;
+    }
+  }
+
+  function getBudgetFromItem(item) {
+    try {
+      return {
+        id: item.itemId,
+        name: item.item.name,
+        month: item.item.month,
+        value: item.item.value,
+      };
+    } catch (_error) {
+      return null;
+    }
+  }
+
+  async function loadItemsAsync() {
+    const { userbase } = window;
+    await userbase.openDatabase({
+      databaseName: 'expenses',
+      changeHandler: (items) => {
+        const expenses = items
+          .map(getExpenseFromItem)
+          .filter((expense) => Boolean(expense));
+
+        hasFinishedLoading.expenses = true;
+
+        cachedData.expenses = expenses;
+      },
+    });
+
+    await userbase.openDatabase({
+      databaseName: 'budgets',
+      changeHandler: (items) => {
+        const budgets = items
+          .map(getBudgetFromItem)
+          .filter((budget) => Boolean(budget));
+
+        hasFinishedLoading.budgets = true;
+
+        cachedData.budgets = budgets;
+      },
+    });
+  }
+
+  async function initializeDb() {
+    try {
+      const { userbase } = window;
+      const { userbaseConfig } = window.app;
+      await userbase.init(userbaseConfig);
+
+      await loadItemsAsync();
+    } catch (error) {
+      console.log(error);
+      showNotification(error, 'error');
+    }
+  }
+
+  const hasFinishedLoading = {
+    budgets: false,
+    expenses: false,
+  };
+
+  async function fetchBudgets(month) {
+    try {
+      // Very ugly, but... works.
+      while (!hasFinishedLoading.budgets) {
+        await new Promise((resolve) => {
+          setTimeout(resolve, 100);
+        });
+      }
+
+      const sortedBudgets = cachedData.budgets
+        .filter((budget) => {
+          if (!month) {
+            return true;
+          }
+
+          if (budget.month === month) {
+            return true;
+          }
+
+          return false;
+        })
+        .sort(sortByName);
+
+      return sortedBudgets;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong fetching budgets.',
+      });
+
+      console.error(error);
+    }
+
+    return [];
+  }
+
+  async function fetchExpenses(month) {
+    try {
+      // Very ugly, but... works.
+      while (!hasFinishedLoading.expenses) {
+        await new Promise((resolve) => {
+          setTimeout(resolve, 100);
+        });
+      }
+
+      const sortedExpenses = cachedData.expenses
+        .filter((expense) => {
+          if (!month) {
+            return true;
+          }
+
+          if (expense.date >= `${month}-01` && expense.date <= `${month}-31`) {
+            return true;
+          }
+
+          return false;
+        })
+        .sort(sortByDate)
+        .reverse();
+
+      return sortedExpenses;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong fetching expenses.',
+      });
+
+      console.error(error);
+    }
+
+    return [];
+  }
+
+  async function saveBudget(budget) {
+    try {
+      if (budget.name === 'Total') {
+        showNotification('Cannot create budget named "Total".', 'error');
+        return false;
+      }
+
+      if (budget.name.trim().length === 0) {
+        showNotification('The budget needs a valid name.', 'error');
+        return false;
+      }
+
+      if (budget.value <= 0 || Number.isNaN(budget.value)) {
+        showNotification('The budget needs a valid value.', 'error');
+        return false;
+      }
+
+      if (!isValidDate(budget.month)) {
+        budget.month = new Date().toISOString().substring(0, 7);
+      }
+
+      // Check if the name is unique for the given month
+      const existingBudgetsInMonth = await fetchBudgets(budget.month);
+      const duplicateBudget = existingBudgetsInMonth.find(
+        (existingBudget) => existingBudget.name === budget.name && existingBudget.id !== budget.id,
+      );
+
+      if (duplicateBudget) {
+        showNotification(
+          'A budget with the same name for the same month already exists.',
+          'error',
+        );
+        return false;
+      }
+
+      const { userbase } = window;
+
+      if (budget.id === 'newBudget') {
+        budget.id = `${generateId()}`;
+
+        await userbase.insertItem({
+          databaseName: 'budgets',
+          item: {
+            name: budget.name,
+            value: budget.value,
+            month: budget.month,
+          },
+          itemId: budget.id,
+        });
+      } else {
+        const existingBudget = cachedData.budgets.find(
+          (_budget) => _budget.id === budget.id,
+        );
+        const oldName = existingBudget.name;
+        const newName = budget.name;
+
+        await userbase.updateItem({
+          databaseName: 'budgets',
+          item: {
+            name: budget.name,
+            value: budget.value,
+            month: existingBudget.month, // Don't allow changing a budget's month
+          },
+          itemId: budget.id,
+        });
+
+        // Update all expenses with the previous budget name to the new one, if it changed
+        if (oldName !== newName) {
+          const matchingExpenses = (
+            await fetchExpenses(existingBudget.month)
+          ).filter((expense) => expense.budget === oldName);
+
+          const updateChunks = splitArrayInChunks(
+            matchingExpenses,
+            10,
+          );
+
+          for (const machingExpensesChunk of updateChunks) {
+            await userbase.putTransaction({
+              databaseName: 'expenses',
+              operations: machingExpensesChunk.map((expense) => ({
+                command: 'Update',
+                item: {
+                  cost: expense.cost,
+                  description: expense.description,
+                  budget: newName,
+                  date: expense.date,
+                },
+                itemId: expense.id,
+              })),
+            });
+          }
+        }
+      }
+
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong saving that budget.',
+      });
+
+      console.error(error);
+    }
+
+    return false;
+  }
+
+  async function saveExpense(expense) {
+    try {
+      if (!expense.cost || typeof expense.cost !== 'number') {
+        showNotification('Cost missing or invalid', 'error');
+        return false;
+      }
+
+      if (expense.description.trim().length === 0) {
+        showNotification('The expense needs a valid description.', 'error');
+        return false;
+      }
+
+      if (!isValidDate(expense.date)) {
+        expense.date = new Date().toISOString().substring(0, 10);
+      }
+
+      // Check if there's an existing expense with a better budget
+      if (
+        (!expense.budget || expense.budget === 'Misc') &&
+        expense.id === 'newExpense'
+      ) {
+        const matchingExpense = (await fetchExpenses()).find(
+          (_expense) => _expense.description === expense.description,
+        );
+
+        if (matchingExpense && matchingExpense.budget) {
+          expense.budget = matchingExpense.budget;
+        }
+      }
+
+      if (!expense.budget || typeof expense.budget !== 'string') {
+        expense.budget = 'Misc';
+      }
+
+      // Check if the budget exists for the expense in that given month, otherwise create one
+      const existingBudget = (
+        await fetchBudgets(expense.date.substring(0, 7))
+      ).find((budget) => budget.name === expense.budget);
+
+      if (!existingBudget) {
+        const newBudgetId = `${generateId()}`;
+
+        await userbase.insertItem({
+          databaseName: 'budgets',
+          item: {
+            name: expense.budget,
+            month: expense.date.substring(0, 7),
+            value: 100,
+          },
+          itemId: newBudgetId,
+        });
+      }
+
+      const { userbase } = window;
+
+      if (expense.id === 'newExpense') {
+        expense.id = `${generateId()}`;
+
+        await userbase.insertItem({
+          databaseName: 'expenses',
+          item: {
+            cost: expense.cost,
+            description: expense.description,
+            budget: expense.budget,
+            date: expense.date,
+          },
+          itemId: expense.id,
+        });
+      } else {
+        await userbase.updateItem({
+          databaseName: 'expenses',
+          item: {
+            cost: expense.cost,
+            description: expense.description,
+            budget: expense.budget,
+            date: expense.date,
+          },
+          itemId: expense.id,
+        });
+      }
+
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong saving that expense.',
+      });
+
+      console.error(error);
+    }
+
+    return false;
+  }
+
+  async function deleteBudget(budgetId) {
+    try {
+      const existingBudget = cachedData.budgets.find(
+        (budget) => budget.id === budgetId,
+      );
+
+      // Check if the budget has no expenses, if so, don't delete
+      const matchingExpenses = (await fetchExpenses(existingBudget.month)).filter(
+        (expense) => expense.budget === existingBudget.name,
+      );
+
+      if (matchingExpenses.length > 0) {
+        // Check if there are duplicate budgets (can happen on slow sync)
+        const matchingBudgets = (await fetchBudgets(existingBudget.month)).filter(
+          (budget) => budget.name === existingBudget.name,
+        );
+
+        if (matchingBudgets.length === 1) {
+          showNotification(
+            'There are expenses using this budget. You can\'t delete a budget with expenses',
+            'error',
+          );
+          return false;
+        }
+      }
+
+      const { userbase } = window;
+
+      await userbase.deleteItem({
+        databaseName: 'budgets',
+        itemId: budgetId,
+      });
+
+      const cachedItemIndex = cachedData.budgets.findIndex(
+        (budget) => budget.id === budgetId,
+      );
+      if (cachedItemIndex !== -1) {
+        cachedData.budgets.splice(cachedItemIndex, 1);
+      }
+
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong deleting that budget.',
+      });
+
+      console.error(error);
+    }
+
+    return false;
+  }
+
+  async function deleteExpense(expenseId) {
+    try {
+      const { userbase } = window;
+
+      await userbase.deleteItem({
+        databaseName: 'expenses',
+        itemId: expenseId,
+      });
+
+      const cachedItemIndex = cachedData.expenses.findIndex(
+        (expense) => expense.id === expenseId,
+      );
+      if (cachedItemIndex !== -1) {
+        cachedData.expenses.splice(cachedItemIndex, 1);
+      }
+
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong deleting that expense.',
+      });
+
+      console.error(error);
+    }
+
+    return false;
+  }
+
+  async function deleteAllData() {
+    const budgets = await fetchBudgets();
+    const expenses = await fetchExpenses();
+
+    const deleteBudgetChunks = splitArrayInChunks(budgets, 10);
+    const deleteExpenseChunks = splitArrayInChunks(expenses, 10);
+
+    const { userbase } = window;
+
+    for (const budgetsToDelete of deleteBudgetChunks) {
+      await userbase.putTransaction({
+        databaseName: 'budgets',
+        operations: budgetsToDelete.map((budget) => ({
+          command: 'Delete',
+          itemId: budget.id,
+        })),
+      });
+
+      // Wait a second, to avoid hitting rate limits
+      await new Promise((resolve) => {
+        setTimeout(resolve, 1000);
+      });
+    }
+
+    for (const expensesToDelete of deleteExpenseChunks) {
+      await userbase.putTransaction({
+        databaseName: 'expenses',
+        operations: expensesToDelete.map((expense) => ({
+          command: 'Delete',
+          itemId: expense.id,
+        })),
+      });
+
+      // Wait a second, to avoid hitting rate limits
+      await new Promise((resolve) => {
+        setTimeout(resolve, 1000);
+      });
+    }
+
+    cachedData.budgets.length = 0;
+    cachedData.expenses.length = 0;
+    hasFinishedLoading.budgets = false;
+    hasFinishedLoading.expenses = false;
+  }
+
+  async function exportAllData() {
+    // Don't export anything until we're done with the first full load
+    if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
+      return {};
+    }
+
+    try {
+      const budgets = (await fetchBudgets()).sort(sortByName);
+      const expenses = (await fetchExpenses()).sort(sortByDate);
+
+      return { budgets, expenses };
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong exporting data.',
+      });
+
+      console.error(error);
+    }
+
+    return {};
+  }
+
+  async function importData(replaceData, budgets, expenses) {
+    // Don't import anything until we're done with the first full load
+    if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
+      return false;
+    }
+
+    try {
+      if (replaceData) {
+        await deleteAllData();
+
+        await initializeDb();
+
+        // Very ugly, but... works.
+        while (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
+          await new Promise((resolve) => {
+            setTimeout(resolve, 100);
+          });
+        }
+      }
+
+      const finalBudgetsToAdd = [];
+
+      for (const budget of budgets) {
+        const newBudgetId = `${generateId()}`;
+        const newBudget = {
+          id: newBudgetId,
+          name: budget.name,
+          value: budget.value,
+          month: budget.month,
+        };
+
+        finalBudgetsToAdd.push(newBudget);
+      }
+
+      const addBudgetChunks = splitArrayInChunks(
+        finalBudgetsToAdd,
+        10,
+      );
+
+      const { userbase } = window;
+
+      for (const budgetsToAdd of addBudgetChunks) {
+        await userbase.putTransaction({
+          databaseName: 'budgets',
+          operations: budgetsToAdd.map((budget) => ({
+            command: 'Insert',
+            item: {
+              name: budget.name,
+              value: budget.value,
+              month: budget.month,
+            },
+            itemId: budget.id,
+          })),
+        });
+
+        // Wait a second, to avoid hitting rate limits
+        await new Promise((resolve) => {
+          setTimeout(resolve, 1000);
+        });
+      }
+
+      const finalExpensesToAdd = [];
+
+      for (const expense of expenses) {
+        const newExpenseId = `${generateId()}`;
+        const newExpense = {
+          id: newExpenseId,
+          cost: expense.cost,
+          budget: expense.budget,
+          description: expense.description,
+          date: expense.date,
+        };
+
+        finalExpensesToAdd.push(newExpense);
+      }
+
+      const addExpenseChunks = splitArrayInChunks(
+        finalExpensesToAdd,
+        10,
+      );
+
+      for (const expensesToAdd of addExpenseChunks) {
+        await userbase.putTransaction({
+          databaseName: 'expenses',
+          operations: expensesToAdd.map((expense) => ({
+            command: 'Insert',
+            item: {
+              cost: expense.cost,
+              budget: expense.budget,
+              description: expense.description,
+              date: expense.date,
+            },
+            itemId: expense.id,
+          })),
+        });
+
+        // Wait a second, to avoid hitting rate limits
+        await new Promise((resolve) => {
+          setTimeout(resolve, 1000);
+        });
+      }
+
+      return true;
+    } catch (error) {
+      const { Swal } = window;
+
+      Swal.fire({
+        title: 'Uh-oh',
+        text: 'Something went wrong importing data.',
+      });
+
+      console.error(error);
+    }
+
+    return false;
+  }
+
+  async function copyBudgets(originalMonth, destinationMonth) {
+    // Don't copy anything until we're done with the first full load
+    if (!hasFinishedLoading.budgets || !hasFinishedLoading.expenses) {
+      return;
+    }
+
+    const originalBudgets = await fetchBudgets(originalMonth);
+    const destinationBudgets = originalBudgets.map((budget) => {
+      const newBudget = { ...budget };
+      newBudget.id = `${generateId()}`;
+      newBudget.month = destinationMonth;
+      return newBudget;
+    });
+    if (destinationBudgets.length > 0) {
+      try {
+        const finalBudgetsToAdd = [];
+
+        for (const budget of destinationBudgets) {
+          const newBudget = {
+            id: budget.id,
+            name: budget.name,
+            value: budget.value,
+            month: budget.month,
+          };
+
+          finalBudgetsToAdd.push(newBudget);
+        }
+
+        const addBudgetChunks = splitArrayInChunks(
+          finalBudgetsToAdd,
+          10,
+        );
+
+        for (const budgetsToAdd of addBudgetChunks) {
+          await userbase.putTransaction({
+            databaseName: 'budgets',
+            operations: budgetsToAdd.map((budget) => ({
+              command: 'Insert',
+              item: {
+                name: budget.name,
+                value: budget.value,
+                month: budget.month,
+              },
+              itemId: budget.id,
+            })),
+          });
+        }
+      } catch (error) {
+        Swal.fire({
+          title: 'Uh-oh',
+          text: 'Something went wrong copying budgets.',
+        });
+
+        console.error(error);
+      }
+    }
+  }
+
+  function generateId() {
+    return `${Date.now().toString()}:${Math.random()}`;
+  }
+
+  function splitArrayInChunks(array, chunkLength) {
+    const chunks = [];
+    let chunkIndex = 0;
+    const arrayLength = array.length;
+
+    while (chunkIndex < arrayLength) {
+      chunks.push(array.slice(chunkIndex, chunkIndex += chunkLength));
+    }
+
+    return chunks;
+  }
+
+  function sortByDate(objectA, objectB) {
+    if (objectA.date < objectB.date) {
+      return -1;
+    }
+    if (objectA.date > objectB.date) {
+      return 1;
+    }
+    return 0;
+  }
+
+  function sortByCount(objectA, objectB) {
+    if (objectA.count < objectB.count) {
+      return 1;
+    }
+    if (objectA.count > objectB.count) {
+      return -1;
+    }
+    return 0;
+  }
+
+  function sortByName(objectA, objectB) {
+    const nameA = objectA.name.toUpperCase();
+    const nameB = objectB.name.toUpperCase();
+    if (nameA < nameB) {
+      return -1;
+    }
+    if (nameA > nameB) {
+      return 1;
+    }
+    return 0;
+  }
+
+  function sortByMissingBudget(objectA, objectB) {
+    const valueA = objectA.value - objectA.expensesCost;
+    const valueB = objectB.value - objectB.expensesCost;
+    return valueB - valueA;
+  }
+
+  const currencyMap = new Map([
+    ['$', 'USD'],
+    ['€', 'EUR'],
+    ['£', 'GBP'],
+    ['¥', 'JPY'],
+    ['₹', 'INR'],
+  ]);
+
+  function formatNumber(currency, number) {
+    return new Intl.NumberFormat('en-US', {
+      style: 'currency',
+      currency: currencyMap.get(currency) || 'USD',
+      minimumFractionDigits: 0,
+      maximumFractionDigits: 2,
+    }).format(Number.parseFloat(`${number}`.replace(',', '.')));
+  }
+
+  const months = [
+    'January',
+    'February',
+    'March',
+    'April',
+    'May',
+    'June',
+    'July',
+    'August',
+    'September',
+    'October',
+    'November',
+    'December',
+  ];
+
+  function showFormattedDate(
+    stringDate,
+    { showDay = true, showYear = false, longMonth = false, longYear = false } = {},
+  ) {
+    const dateYear = parseInt(stringDate.substring(0, 4));
+    const dateMonth = parseInt(stringDate.substring(5, 7), 10) - 1;
+    const dateDay = parseInt(stringDate.substring(8, 10), 10);
+
+    const monthName = longMonth ? months[dateMonth] : months[dateMonth].substring(0, 3);
+    const yearName = longYear ? dateYear.toString() : `'${dateYear.toString().substring(2, 4)}`;
+
+    if (showYear) {
+      if (showDay) {
+        return `${dateDay} ${monthName} ${yearName}`;
+      }
+
+      return `${monthName} ${yearName}`;
+    }
+
+    return `${dateDay} ${monthName}`;
+  }
+
+  function dateDiffInDays(startDate, endDate) {
+    return Math.round((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));
+  }
+
+  function isValidDate(dateObject) {
+    return new Date(dateObject).toString() !== 'Invalid Date';
+  }
+
+  function debounce(callback, waitInMs) {
+    let timeoutId = null;
+    return (...args) => {
+      window.clearTimeout(timeoutId);
+
+      timeoutId = window.setTimeout(() => {
+        callback.apply(null, args);
+      }, waitInMs);
+    };
+  }
+
+  document.addEventListener('DOMContentLoaded', () => {
+    initializeApp();
+  });
+})();
diff --git a/public/js/settings.js b/public/js/settings.js
new file mode 100644
index 0000000..d0a942d
--- /dev/null
+++ b/public/js/settings.js
@@ -0,0 +1,250 @@
+(() => {
+  document.addEventListener('app-loaded', () => {
+    const changeCurrencyForm = document.getElementById('change-currency-form');
+    const newCurrencySelect = document.getElementById('new-currency');
+    const changeCurrencyButton = document.getElementById('change-currency-button');
+
+    const importDataButton = document.getElementById('import-button');
+    const exportDataButton = document.getElementById('export-button');
+
+    const changeEmailForm = document.getElementById('change-email-form');
+    const newEmailInput = document.getElementById('new-email');
+    const changeEmailButton = document.getElementById('change-email-button');
+
+    const changePasswordForm = document.getElementById('change-password-form');
+    const currentPasswordInput = document.getElementById('current-password');
+    const newPasswordInput = document.getElementById('new-password');
+    const changePasswordButton = document.getElementById('change-password-button');
+
+    let isUpdating = false;
+
+    async function changeCurrency(event) {
+      event.preventDefault();
+      event.stopPropagation();
+
+      if (isUpdating) {
+        return;
+      }
+
+      isUpdating = true;
+      window.app.showLoading();
+      changeCurrencyButton.textContent = 'Changing...';
+
+      const currency = newCurrencySelect.value;
+
+      try {
+        await userbase.updateUser({
+          profile: {
+            currency,
+          },
+        });
+
+        window.app.showNotification('Currency changed successfully!');
+      } catch (error) {
+        window.app.showNotification(error, 'error');
+      }
+
+      isUpdating = false;
+      window.app.hideLoading();
+      changeCurrencyButton.textContent = 'Change currency';
+    }
+
+    async function importData() {
+      const { Swal } = window;
+
+      if (isUpdating) {
+        return;
+      }
+
+      const importFileDialogResult = await Swal.fire({
+        icon: 'warning',
+        input: 'file',
+        title: 'Choose JSON File',
+        inputAttributes: {
+          accept: 'text/pain,application/json,.json',
+          'aria-label': 'Import your budgets and expenses',
+        },
+      });
+
+      if (!importFileDialogResult || !importFileDialogResult.value) {
+        return;
+      }
+
+      const reader = new FileReader();
+      reader.onload = async (fileRead) => {
+        const importFileContents = fileRead.target.result;
+
+        let importedFileData = {};
+
+        try {
+          importedFileData = JSON.parse(importFileContents.toString());
+        } catch (_error) {
+          importedFileData = {};
+        }
+
+        if (
+          !Object.prototype.hasOwnProperty.call(importedFileData, 'budgets') &&
+          !Object.prototype.hasOwnProperty.call(importedFileData, 'expenses')
+        ) {
+          window.app.showNotification(
+            'Could not parse the file. Please confirm what you chose is correct.',
+            'error',
+          );
+          return;
+        }
+
+        const budgets = importedFileData.budgets || [];
+        const expenses = importedFileData.expenses || [];
+
+        const mergeOrReplaceDialogResult = await Swal.fire({
+          icon: 'question',
+          title: 'Merge or Replace?',
+          text: 'Do you want to merge this with your existing data, or replace it?',
+          showCancelButton: true,
+          showDenyButton: true,
+          confirmButtonText: 'Merge',
+          denyButtonText: 'Replace',
+          cancelButtonText: 'Wait, cancel.',
+        });
+
+        if (
+          mergeOrReplaceDialogResult.isConfirmed ||
+          mergeOrReplaceDialogResult.isDenied
+        ) {
+          isUpdating = true;
+          window.app.showLoading();
+
+          const success = await window.app.dataUtils.importData(
+            mergeOrReplaceDialogResult.isDenied,
+            budgets,
+            expenses,
+          );
+
+          isUpdating = false;
+          window.app.hideLoading();
+
+          if (success) {
+            window.app.showNotification('Data imported successfully!');
+          }
+        }
+      };
+
+      reader.readAsText(importFileDialogResult.value);
+    }
+
+    async function exportData() {
+      if (isUpdating) {
+        return;
+      }
+
+      isUpdating = true;
+      window.app.showLoading();
+
+      const fileName = [
+        'budget-zen-data-export-',
+        new Date().toISOString().substring(0, 19).replace(/:/g, '-'),
+        '.json',
+      ]
+        .join('');
+
+      const exportData = await window.app.dataUtils.exportAllData();
+
+      const exportContents = JSON.stringify(exportData, null, 2);
+
+      // Add content-type
+      const jsonContent = ['data:application/json; charset=utf-8,', exportContents].join('');
+
+      // Download the file
+      const data = encodeURI(jsonContent);
+      const link = document.createElement('a');
+      link.setAttribute('href', data);
+      link.setAttribute('download', fileName);
+      link.click();
+      link.remove();
+
+      isUpdating = false;
+      window.app.hideLoading();
+
+      window.app.showNotification('Data exported successfully!');
+    }
+
+    async function changeEmail(event) {
+      event.preventDefault();
+      event.stopPropagation();
+
+      if (isUpdating) {
+        return;
+      }
+
+      isUpdating = true;
+      window.app.showLoading();
+      changeEmailButton.textContent = 'Changing...';
+
+      const email = newEmailInput.value;
+
+      try {
+        await userbase.updateUser({
+          username: email,
+          email,
+        });
+
+        window.location.reload();
+      } catch (error) {
+        isUpdating = false;
+        window.app.hideLoading();
+        changeEmailButton.textContent = 'Change email';
+        window.app.showNotification(error, 'error');
+      }
+    }
+
+    async function changePassword(event) {
+      event.preventDefault();
+      event.stopPropagation();
+
+      if (isUpdating) {
+        return;
+      }
+
+      isUpdating = true;
+      window.app.showLoading();
+      changePasswordButton.textContent = 'Changing...';
+
+      const currentPassword = currentPasswordInput.value;
+      const newPassword = newPasswordInput.value;
+
+      try {
+        await userbase.updateUser({
+          currentPassword,
+          newPassword,
+        });
+
+        window.location.reload();
+      } catch (error) {
+        isUpdating = false;
+        window.app.hideLoading();
+        changePasswordButton.textContent = 'Change password / encryption key';
+        window.app.showNotification(error, 'error');
+      }
+    }
+
+    async function initializePage() {
+      await window.app.dataUtils.initializeDb();
+
+      const userSession = await window.app.getUserSession();
+      const currentCurrency = userSession.profile?.currency || '$';
+      newCurrencySelect.value = currentCurrency;
+    }
+
+    if (window.app.isLoggedIn) {
+      initializePage();
+    }
+
+    changeCurrencyForm.addEventListener('submit', changeCurrency);
+
+    importDataButton.addEventListener('click', importData);
+    exportDataButton.addEventListener('click', exportData);
+
+    changeEmailForm.addEventListener('submit', changeEmail);
+    changePasswordForm.addEventListener('submit', changePassword);
+  });
+})();
diff --git a/public/js/stripe.js b/public/js/stripe.js
new file mode 100644
index 0000000..7798f2c
--- /dev/null
+++ b/public/js/stripe.js
@@ -0,0 +1 @@
+!function(e){function t(t){for(var n,a,o=t[0],i=t[1],c=0,u=[];c<o.length;c++)a=o[c],Object.prototype.hasOwnProperty.call(r,a)&&r[a]&&u.push(r[a][0]),r[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(s&&s(t);u.length;)u.shift()()}var n={},r={12:0};function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],n=r[e];if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((function(t,a){n=r[e]=[t,a]}));t.push(n[2]=o);var i,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"fingerprinted/js/"+({2:"elements-affirm-message",3:"elements-affirm-modal",4:"elements-afterpay-clearpay-message",5:"elements-afterpay-clearpay-modal",6:"orders-outer",7:"payment-intent-outer-actions-cardimageverification",13:"trusted-types-checker"}[e]||e)+"-"+{2:"4b6af45d90b61505b87d352cdf1875b5",3:"078320ff3871964a6885cc4b757842e4",4:"8c26f336e8d6b15ffaa896906a4ef893",5:"85cf80c70ff3dccaad47aec1bb8f44fa",6:"b25075565159f2045a40e615c25980cd",7:"a4b4d543133799e244f9f79344652bcb",13:"8f145f1c4f05a13814c9d72ead77e23d"}[e]+".js"}(e);var s=new Error;i=function(t){c.onerror=c.onload=null,clearTimeout(u);var n=r[e];if(0!==n){if(n){var a=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+e+" failed.\n("+a+": "+o+")",s.name="ChunkLoadError",s.type=a,s.request=o,n[1](s)}r[e]=void 0}};var u=setTimeout((function(){i({type:"timeout",target:c})}),12e4);c.onerror=c.onload=i,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)a.d(n,r,function(t){return e[t]}.bind(null,r));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="https://js.stripe.com/v3/",a.oe=function(e){throw console.error(e),e};var o=window.__webpackStripeJSv3Jsonp=window.__webpackStripeJSv3Jsonp||[],i=o.push.bind(o);o.push=t,o=o.slice();for(var c=0;c<o.length;c++)t(o[c]);var s=i;a(a.s=74)}([function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"g",(function(){return J})),n.d(t,"c",(function(){return X})),n.d(t,"d",(function(){return te})),n.d(t,"E",(function(){return f})),n.d(t,"G",(function(){return m})),n.d(t,"j",(function(){return h})),n.d(t,"k",(function(){return _})),n.d(t,"m",(function(){return b})),n.d(t,"i",(function(){return y})),n.d(t,"w",(function(){return v})),n.d(t,"q",(function(){return O})),n.d(t,"x",(function(){return g})),n.d(t,"l",(function(){return j})),n.d(t,"A",(function(){return k})),n.d(t,"z",(function(){return E})),n.d(t,"u",(function(){return S})),n.d(t,"v",(function(){return P})),n.d(t,"C",(function(){return A})),n.d(t,"D",(function(){return I})),n.d(t,"B",(function(){return C})),n.d(t,"J",(function(){return T})),n.d(t,"e",(function(){return N})),n.d(t,"r",(function(){return M})),n.d(t,"s",(function(){return R})),n.d(t,"f",(function(){return B})),n.d(t,"o",(function(){return L})),n.d(t,"t",(function(){return D})),n.d(t,"b",(function(){return q})),n.d(t,"F",(function(){return F})),n.d(t,"n",(function(){return U})),n.d(t,"p",(function(){return H})),n.d(t,"h",(function(){return z})),n.d(t,"y",(function(){return K})),n.d(t,"I",(function(){return Y})),n.d(t,"H",(function(){return W}));var r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"absurd";throw new Error(t)},a=n(5),o=n(7),i=n(1),c=n(2),s=n(13),u=n(45),l={AE:"AE",AT:"AT",AU:"AU",BE:"BE",BG:"BG",BR:"BR",CA:"CA",CH:"CH",CI:"CI",CR:"CR",CY:"CY",CZ:"CZ",DE:"DE",DK:"DK",DO:"DO",EE:"EE",ES:"ES",FI:"FI",FR:"FR",GB:"GB",GI:"GI",GR:"GR",GT:"GT",HK:"HK",HR:"HR",HU:"HU",ID:"ID",IE:"IE",IN:"IN",IT:"IT",JP:"JP",LI:"LI",LT:"LT",LU:"LU",LV:"LV",MT:"MT",MX:"MX",MY:"MY",NL:"NL",NO:"NO",NZ:"NZ",PE:"PE",PH:"PH",PL:"PL",PT:"PT",RO:"RO",SE:"SE",SG:"SG",SI:"SI",SK:"SK",SN:"SN",TH:"TH",TT:"TT",US:"US",UY:"UY"},d=Object.keys(l),p=n(29),f=(n(15),function(e,t,n){var r=n.path.reduce((function(e,t,n){return 0===n?t:0===t.indexOf(".")?"".concat(e,'["').concat(t,'"]'):"".concat(e,".").concat(t)}),"");return"undefined"===t?"Missing value for ".concat(n.label,": ").concat(r||"value"," should be ").concat(e,"."):"Invalid value for ".concat(n.label,": ").concat(r||"value"," should be ").concat(e,". You specified: ").concat(t,".")}),m=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return{type:"valid",value:e,warnings:t}},h=function(e){return{error:e,errorType:"full",type:"error"}},_=function(e,t,n){var r=new c.b(f(e,t,n));return h(r)},b=function(e,t,n){return{expected:e,actual:String(t),options:n,errorType:"mismatch",type:"error"}},y=function(e,t){return Object(i.a)(Object(i.a)({},e),{},{path:[].concat(Object(o.a)(e.path),[t])})},v=function(e){return function(t,n){return void 0===t?m(t):e(t,n)}},O=function(e){return function(t,n){return null===t?m(t):e(t,n)}},g=function(e,t){return function(n,r){var a=function(e){var t=e.options.path.join(".")||"value";return{error:"".concat(t," should be ").concat(e.expected),actual:"".concat(t," as ").concat(e.actual)}},o=function(e,t,n){return h(new c.b("Invalid value for ".concat(e,": ").concat(t,". You specified ").concat(n,".")))},i=e(n,r),s=t(n,r);if("error"===i.type&&"error"===s.type){if("mismatch"===i.errorType&&"mismatch"===s.errorType){var u=a(i),l=u.error,d=u.actual,p=a(s),f=p.error,m=p.actual;return o(r.label,l===f?l:"".concat(l," or ").concat(f),d===m?d:"".concat(d," and ").concat(m))}if("mismatch"===i.errorType){var _=a(i),b=_.error,y=_.actual;return o(r.label,b,y)}if("mismatch"===s.errorType){var v=a(s),O=v.error,g=v.actual;return o(r.label,O,g)}return h(i.error)}return"valid"===i.type?i:s}},j=function(e,t){return function(n,r){return n instanceof e?m(n):b("a ".concat(t," instance"),n,r)}},w=function(e,t){return function(n,r){var a=Object(s.a)(e,(function(e){return e===n}));if(void 0===a){var o=t?"a recognized string.":"one of the following strings: ".concat(e.join(", "));return b(o,n,r)}return m(a)}},k=function(e){return function(t,n){return"string"==typeof t&&0===t.indexOf(e)?m(t):b("a string starting with ".concat(e),t,n)}},E=function(e,t){return function(n,r){return"string"==typeof n&&n.length>=e&&n.length<=t?m(n):b(e===t?"a string of ".concat(e," characters"):"a string with ".concat(e," to ").concat(t," characters"),n,r)}},S=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return w(t,!1)},P=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return w(t,!0)},A=S.apply(void 0,Object(o.a)(d)),I=S.apply(void 0,Object(o.a)(u.a)),C=(S.apply(void 0,Object(o.a)(Object.keys(p.a))),function(e,t){return"string"==typeof e?m(e):b("a string",e,t)}),T=function(e,t){return function(n,r){return void 0===n?m(t()):e(n,r)}},N=function(e,t){return"boolean"==typeof e?m(e):b("a boolean",e,t)},M=function(e,t){return"number"==typeof e?m(e):b("a number",e,t)},R=function(e){return function(t,n){return"number"==typeof t&&t>e?m(t):b("a number greater than ".concat(e),t,n)}},x=function(e){return function(t,n){return"number"==typeof t&&t===parseInt(t,10)&&(!e||t>=0)?m(t):b(e?"a positive amount in the currency's subunit":"an amount in the currency's subunit",t,n)}},B=function(e,t){return x(!1)(e,t)},L=function(e,t){return x(!0)(e,t)},D=function(e,t){return e&&"object"==typeof e?m(e):b("an object",e,t)},q=function(e){return function(t,n){return Array.isArray(t)?t.map((function(t,r){return e(t,y(n,String(r)))})).reduce((function(e,t){return"error"===e.type?e:"error"===t.type?t:m([].concat(Object(o.a)(e.value),[t.value]),[].concat(Object(o.a)(e.warnings),Object(o.a)(t.warnings)))}),m([])):b("array",t,n)}},F=function(e){return function(t){return function(n,r){if(Array.isArray(n)){var a=t(n,r);if("valid"===a.type)for(var o={},i=0;i<a.value.length;i+=1){var s=a.value[i];if("object"==typeof s&&s&&"string"==typeof s[e]){var u=s[e],l="_".concat(u);if(o[l])return h(new c.b("Duplicate value for ".concat(e,": ").concat(u,". The property '").concat(e,"' of '").concat(r.path.join("."),"' has to be unique.")));o[l]=!0}}return a}return b("array",n,r)}}},U=function(e){return function(t,n){return void 0===t?m(void 0):b("used in ".concat(e," instead"),t,n)}},H=function(e){return function(t,n){return void 0===t?m(void 0):h(new c.b(e))}},G=function(e){return function(t){return function(n,r){if(n&&"object"==typeof n&&!Array.isArray(n)){var u=n,l=Object(s.a)(Object.keys(u),(function(e){return!t[e]}));if(l&&e)return h(new c.b("Invalid ".concat(r.label," parameter: ").concat([].concat(Object(o.a)(r.path),[l]).join(".")," is not an accepted parameter.")));var d=Object.keys(u),p=m({});return l&&(p=d.reduce((function(e,n){return t[n]?e:m(e.value,[].concat(Object(o.a)(e.warnings),["Unrecognized ".concat(r.label," parameter: ").concat([].concat(Object(o.a)(r.path),[n]).join(".")," is not a recognized parameter. This may cause issues with your integration in the future.")]))}),p)),Object.keys(t).reduce((function(e,n){if("error"===e.type)return e;var c=(0,t[n])(u[n],y(r,n));return"valid"===c.type&&void 0!==c.value?m(Object(i.a)(Object(i.a)({},e.value),{},Object(a.a)({},n,c.value)),[].concat(Object(o.a)(e.warnings),Object(o.a)(c.warnings))):"valid"===c.type?m(e.value,[].concat(Object(o.a)(e.warnings),Object(o.a)(c.warnings))):c}),p)}return b("an object",n,r)}}},z=G(!0),K=G(!1),Y=function(e,t,n,r){var a=r||{},o=e(t,{authenticatedOrigin:a.authenticatedOrigin||"",element:a.element||"",label:n,path:a.path||[]});return"valid"===o.type||"full"===o.errorType?o:{type:"error",errorType:"full",error:new c.b(f(o.expected,o.actual,o.options))}},W=function(e,t,n,a){var o=Y(e,t,n,a);switch(o.type){case"valid":return{value:o.value,warnings:o.warnings};case"error":throw o.error;default:return r(o)}},V={_componentName:C,_implementation:K({_frame:K({id:C})})},J=K(V),X=function(e){var t=Y(J,e,"");return"error"===t.type?null:t.value},$={clientSecret:v(K({id:C,clientSecret:C,type:C}))},Q=K($),Z={_elements:q(J),_id:C,_commonOptions:Q},ee=K(Z),te=function(e){var t=Y(ee,e,"");return"error"===t.type?null:t.value}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(5);function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){Object(r.a)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return l}));var r=n(9),a=n(17),o=n(18),i=n(30),c=function(e){Object(a.a)(n,e);var t=Object(o.a)(n);function n(e,a){var o;return Object(r.a)(this,n),(o=t.call(this)).name="FetchError",o.type="fetch_error",o.message="Error fetching ".concat(a),o.requestUrl=a,"string"==typeof e?o.message+=": ".concat(e):(o.originalError=e,o.message+=": ".concat(e.message)),o}return n}(Object(i.a)(Error)),s=n(21),u=function(e){Object(a.a)(n,e);var t=Object(o.a)(n);function n(e){var a;return Object(r.a)(this,n),a=t.call(this,e),window.__stripeElementsController&&window.__stripeElementsController.reportIntegrationError(e),a.name="IntegrationError",Object.defineProperty(Object(s.a)(a),"message",{value:a.message,enumerable:!0}),a}return n}(Object(i.a)(Error)),l=(Error,function(e){Object(a.a)(n,e);var t=Object(o.a)(n);function n(e){var a;return Object(r.a)(this,n),(a=t.call(this,e)).name="NetworkError",a.type="network_error",a.requestUrl=e,a}return n}(Object(i.a)(Error)))},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(50),a=n.n(r),o=(n(55),window.Promise?Promise:a.a)},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"m",(function(){return a})),n.d(t,"n",(function(){return i})),n.d(t,"k",(function(){return s})),n.d(t,"i",(function(){return u})),n.d(t,"j",(function(){return l})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return p})),n.d(t,"h",(function(){return f})),n.d(t,"c",(function(){return m})),n.d(t,"l",(function(){return h})),n.d(t,"a",(function(){return _})),n.d(t,"b",(function(){return b})),n.d(t,"d",(function(){return j}));var r={card:"card",cardNumber:"cardNumber",cardExpiry:"cardExpiry",cardCvc:"cardCvc",postalCode:"postalCode",iban:"iban",idealBank:"idealBank",p24Bank:"p24Bank",paymentRequestButton:"paymentRequestButton",auBankAccount:"auBankAccount",fpxBank:"fpxBank",netbankingBank:"netbankingBank",epsBank:"epsBank",affirmMessage:"affirmMessage",afterpayClearpayMessage:"afterpayClearpayMessage",linkAuthentication:"linkAuthentication",payment:"payment",shippingAddress:"shippingAddress",cart:"cart",idealBankSecondary:"idealBankSecondary",p24BankSecondary:"p24BankSecondary",auBankAccountNumber:"auBankAccountNumber",auBsb:"auBsb",fpxBankSecondary:"fpxBankSecondary",netbankingBankSecondary:"netbankingBankSecondary",issuingCardNumberDisplay:"issuingCardNumberDisplay",issuingCardCopyButton:"issuingCardCopyButton",issuingCardCvcDisplay:"issuingCardCvcDisplay",issuingCardExpiryDisplay:"issuingCardExpiryDisplay",issuingCardPinDisplay:"issuingCardPinDisplay",epsBankSecondary:"epsBankSecondary",affirmMessageModal:"affirmMessageModal",afterpayClearpayMessageModal:"afterpayClearpayMessageModal",autocompleteSuggestions:"autocompleteSuggestions",achBankSearchResults:"achBankSearchResults",linkInfoModal:"linkInfoModal",loaderUi:"loaderUi"},a=[r.card,r.cardNumber,r.cardExpiry,r.cardCvc,r.postalCode],o=n(15),i="https://js.stripe.com/v3/",c=Object(o.i)(i),s=c?c.origin:"",u=5,l=["stripe_3ds2_challenge","stripe_3ds2_fingerprint","three_d_secure_redirect","intent_cardimageverification_challenge"],d="https://verify.stripe.com/",p={PAYMENT_INTENT:"PAYMENT_INTENT",SETUP_INTENT:"SETUP_INTENT"},f={family:"font-family",src:"src",unicodeRange:"unicode-range",style:"font-style",variant:"font-variant",stretch:"font-stretch",weight:"font-weight",display:"font-display"},m=Object.keys(f).reduce((function(e,t){return e[f[t]]=t,e}),{}),h=[r.issuingCardCopyButton,r.idealBank,r.p24Bank,r.netbankingBank,r.idealBankSecondary,r.p24BankSecondary,r.netbankingBankSecondary,r.fpxBank,r.fpxBankSecondary,r.epsBank,r.epsBankSecondary],_=(Object.keys({visa:"visa",amex:"amex",discover:"discover",mastercard:"mastercard",jcb:"jcb",diners:"diners",unionpay:"unionpay",elo:"elo",unknown:"unknown"}),{VISA:"visa",MASTERCARD:"mastercard",AMEX:"amex",DISCOVER:"discover",JCB:"jcb",DINERS:"diners",UNIONPAY:"unionpay",ELO:"elo"}),b=Object.keys(_).map((function(e){return _[e]})),y="13d9fd9c4",v="stripe.js/".concat(y),O="".concat(v,"; stripe-js-v3/").concat(y),g=("".concat(O,"; raw-card"),"".concat(O,"; create-source-card-data"),"checkout"),j=("".concat(O,"; ").concat(g),"".concat(O,"; ").concat("payment-link","; ").concat(g),"".concat(O,"; hip"),"".concat(O,"; payment-element"),"dashboard")},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s})),n.d(t,"c",(function(){return u})),n.d(t,"d",(function(){return l})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return m}));var r,a=n(7),o=n(15),i=n(0),c={checkout_beta_2:"checkout_beta_2",checkout_beta_3:"checkout_beta_3",checkout_beta_4:"checkout_beta_4",checkout_beta_testcards:"checkout_beta_testcards",payment_intent_beta_1:"payment_intent_beta_1",payment_intent_beta_2:"payment_intent_beta_2",payment_intent_beta_3:"payment_intent_beta_3",google_pay_beta_1:"google_pay_beta_1",acss_debit_beta_1:"acss_debit_beta_1",acss_debit_beta_2:"acss_debit_beta_2",afterpay_clearpay_setup_intents_beta:"afterpay_clearpay_setup_intents_beta",bacs_debit_beta:"bacs_debit_beta",fpx_bank_beta_1:"fpx_bank_beta_1",ideal_pm_beta_1:"ideal_pm_beta_1",line_items_beta_1:"line_items_beta_1",oxxo_pm_beta_1:"oxxo_pm_beta_1",paypal_pm_beta_1:"paypal_pm_beta_1",sepa_pm_beta_1:"sepa_pm_beta_1",tax_product_beta_1:"tax_product_beta_1",wechat_pay_pm_beta_1:"wechat_pay_pm_beta_1",wechat_pay_pm_beta_2:"wechat_pay_pm_beta_2",checkout_beta_locales:"checkout_beta_locales",stripe_js_beta_locales:"stripe_js_beta_locales",upi_beta_1:"upi_beta_1",blik_beta_1:"blik_beta_1",issuing_elements_1:"issuing_elements_1",issuing_elements_2:"issuing_elements_2",return_intents_beta_1:"return_intents_beta_1",netbanking_beta_1:"netbanking_beta_1",netbanking_bank_beta_1:"netbanking_bank_beta_1",instant_debits_beta_1:"instant_debits_beta_1",link_beta_1:"link_beta_1",link_beta_2:"link_beta_2",link_beta_3:"link_beta_3",link_default_integration_beta_1:"link_default_integration_beta_1",payment_element_beta_1:"payment_element_beta_1",elements_customers_beta_1:"elements_customers_beta_1",card_country_event_beta_1:"card_country_event_beta_1",id_bank_transfer_beta_1:"id_bank_transfer_beta_1",id_bank_transfer_beta_2:"id_bank_transfer_beta_2",us_bank_account_beta_2:"us_bank_account_beta_2",cup_apple_pay_beta_1:"cup_apple_pay_beta_1",nz_bank_account_beta_1:"nz_bank_account_beta_1",customer_balance_beta_1:"customer_balance_beta_1",payment_element_apple_pay_beta_1:"payment_element_apple_pay_beta_1",link_autofill_modal_beta_1:"link_autofill_modal_beta_1",pix_beta_1:"pix_beta_1",pix_beta_2:"pix_beta_2",shipping_address_element_beta_1:"shipping_address_element_beta_1",process_order_beta_1:"process_order_beta_1",update_order_beta_1:"update_order_beta_1",server_side_confirmation_beta_1:"server_side_confirmation_beta_1",cart_beta_1:"cart_beta_1",pay_by_bank_beta_1:"pay_by_bank_beta_1",blocked_card_brands_beta_1:"blocked_card_brands_beta_1",qris_beta_1:"qris_beta_1",networks_change_1:"networks_change_1"},s=Object.freeze({netbankingBank:"netbanking_bank_beta_1",shippingAddress:["shipping_address_element_beta_1","link_beta_1","link_beta_2","link_beta_3"],cart:"cart_beta_1"}),u=Object.keys(c),l=function(e,t){return Array.isArray(t)?t.some((function(t){return e.indexOf(t)>-1})):e.indexOf(t)>-1},d=window.location.hash.substring(1).split("?")[0],p=Object(i.I)(Object(i.y)({betas:Object(i.J)(Object(i.b)(i.u.apply(void 0,Object(a.a)(u))),(function(){return[]}))}),Object(o.a)(d),"internal"),f=("valid"===p.type&&p.value.betas,function(e){var t=[],n=[];if(e&&e.forEach((function(e){u.indexOf(e)>-1?t.push(c[e]):n.push(e)})),n.length>0){var r="The following betas are unrecognized for Stripe() parameter:\n\n- ".concat(n.join("\n- "),"\n\n They are either invalid or expired betas, please remove these beta flags to prevent future integration issues.");return{validBetas:t,betaWarning:r}}return{validBetas:t}}),m=(r=[],function(e,t){return l(t,c.stripe_js_beta_locales)||-1===r.indexOf(e)?e:"auto"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(31);var a=n(34),o=n(28);function i(e){return function(e){if(Array.isArray(e))return Object(r.a)(e)}(e)||Object(a.a)(e)||Object(o.a)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i.a})),n.d(t,"a",(function(){return c})),n.d(t,"d",(function(){return a.a})),n.d(t,"f",(function(){return d})),n.d(t,"e",(function(){return p})),n.d(t,"g",(function(){return f}));var r=n(25),a=n(16),o=function(e){var t={frameborder:"0",allowTransparency:"true",scrolling:"no"},n=!r.f;if(n&&(t.allow="payment *"),"STRIPE_3DS2_CHALLENGE"===e){var o="publickey-credentials-get ".concat(Object(a.a)());t.allow=n?"payment *; ".concat(o):o}if("PAYMENT_REQUEST_GOOGLE_PAY"===e){t.sandbox=["allow-scripts","allow-forms","allow-popups","allow-popups-to-escape-sandbox","allow-same-origin"].join(" "),t.referrerpolicy="origin"}return t},i=n(66),c={ADDRESS_AUTOCOMPLETE:"ADDRESS_AUTOCOMPLETE",CARD_ELEMENT:"CARD_ELEMENT",CONTROLLER:"CONTROLLER",METRICS_CONTROLLER:"METRICS_CONTROLLER",PAYMENT_REQUEST_ELEMENT:"PAYMENT_REQUEST_ELEMENT",PAYMENT_REQUEST_BROWSER:"PAYMENT_REQUEST_BROWSER",PAYMENT_REQUEST_GOOGLE_PAY:"PAYMENT_REQUEST_GOOGLE_PAY",IBAN_ELEMENT:"IBAN_ELEMENT",IDEAL_BANK_ELEMENT:"IDEAL_BANK_ELEMENT",P24_BANK_ELEMENT:"P24_BANK_ELEMENT",AUTHORIZE_WITH_URL:"AUTHORIZE_WITH_URL",STRIPE_3DS2_CHALLENGE:"STRIPE_3DS2_CHALLENGE",STRIPE_3DS2_FINGERPRINT:"STRIPE_3DS2_FINGERPRINT",AU_BANK_ACCOUNT_ELEMENT:"AU_BANK_ACCOUNT_ELEMENT",FPX_BANK_ELEMENT:"FPX_BANK_ELEMENT",LIGHTBOX_APP:"LIGHTBOX_APP",ISSUING_CARD_NUMBER_DISPLAY_ELEMENT:"ISSUING_CARD_NUMBER_DISPLAY_ELEMENT",ISSUING_CARD_COPY_BUTTON_ELEMENT:"ISSUING_CARD_COPY_BUTTON_ELEMENT",ISSUING_CARD_CVC_DISPLAY_ELEMENT:"ISSUING_CARD_CVC_DISPLAY_ELEMENT",ISSUING_CARD_EXPIRY_DISPLAY_ELEMENT:"ISSUING_CARD_EXPIRY_DISPLAY_ELEMENT",ISSUING_CARD_PIN_DISPLAY_ELEMENT:"ISSUING_CARD_PIN_DISPLAY_ELEMENT",EPS_BANK_ELEMENT:"EPS_BANK_ELEMENT",HCAPTCHA_APP:"HCAPTCHA_APP",LINK_LOGIN:"LINK_LOGIN",NETBANKING_BANK_ELEMENT:"NETBANKING_BANK_ELEMENT",AFFIRM_MESSAGE_ELEMENT:"AFFIRM_MESSAGE_ELEMENT",AFFIRM_MESSAGE_MODAL_ELEMENT:"AFFIRM_MESSAGE_MODAL_ELEMENT",AFTERPAY_MESSAGE_MODAL_ELEMENT:"AFTERPAY_MESSAGE_MODAL_ELEMENT",AUTOCOMPLETE_SUGGESTIONS_ELEMENT:"AUTOCOMPLETE_SUGGESTIONS_ELEMENT",ACH_BANK_SEARCH_RESULTS_ELEMENT:"ACH_BANK_SEARCH_RESULTS_ELEMENT",INSTANT_DEBITS_APP:"INSTANT_DEBITS_APP",LINK_AUTHENTICATION_ELEMENT:"LINK_AUTHENTICATION_ELEMENT",PAYMENT_ELEMENT:"PAYMENT_ELEMENT",LINKED_ACCOUNTS_INNER:"LINKED_ACCOUNTS_INNER",WECHAT_PAY_INNER:"WECHAT_PAY_INNER",PAYNOW_INNER:"PAYNOW_INNER",PIX_INNER:"PIX_INNER",PROMPTPAY_INNER:"PROMPTPAY_INNER",SHIPPING_ADDRESS_ELEMENT:"SHIPPING_ADDRESS_ELEMENT",LINK_AUTOFILL_MODAL:"LINK_AUTOFILL_MODAL",LINK_INFO_MODAL:"LINK_INFO_MODAL",GOOGLE_MAPS_APP:"GOOGLE_MAPS_APP",LOADER_UI_APP:"LOADER_UI_APP",CART_ELEMENT:"CART_ELEMENT",BACS_MANDATE_CONFIRMATION_APP:"BACS_MANDATE_CONFIRMATION_APP",BACS_CONFIRMATION_INNER:"BACS_CONFIRMATION_INNER"},s=(n(9),n(23),n(1)),u=(n(0),n(4)),l=n(12),d=function(e){var t,n=e.controllerId,r=e.frameId,a=e.targetOrigin,o=e.type,i=a;if("controller"===o?t=Object(l.m)(r):"group"===o?t=Object(l.m)(n):"outer"===o||"hosted"===o?t=window.frames[r]:"inner"===o&&(i=i||"*",t=window.parent),i=i||u.k,t&&"function"==typeof t.postMessage){var c=e.message.delegate?{targetOrigin:i,delegate:e.message.delegate}:i;t.postMessage(JSON.stringify(Object(s.a)(Object(s.a)({},e),{},{__stripeJsV3:!0})),c)}},p=function(e){try{var t="string"==typeof e?JSON.parse(e):e;return t.__stripeJsV3?t:null}catch(e){return null}},f=function(e){return e}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return i})),n.d(t,"g",(function(){return c})),n.d(t,"h",(function(){return s})),n.d(t,"d",(function(){return u})),n.d(t,"e",(function(){return l})),n.d(t,"f",(function(){return d})),n.d(t,"c",(function(){return p}));var r=n(1),a=n(0),o=(n(4),"webauthn"),i="spc",c=function(e,t){switch(e.type){case"object":return{paymentIntent:e.object};case"error":var n=t?{payment_intent:t}:{};return{error:Object(r.a)(Object(r.a)({},n),e.error)};default:return Object(a.a)(e)}},s=function(e,t){switch(e.type){case"error":return{error:Object(r.a)(Object(r.a)({},t?{setup_intent:t}:{}),e.error)};case"object":return{setupIntent:e.object};default:return Object(a.a)(e)}},u=function(e){var t=e.trim().match(/^((seti|pi)_[^_]+)_secret_[^-]+$/);return t?"pi"===t[2]?{id:t[1],clientSecret:t[0],type:"PAYMENT_INTENT"}:{id:t[1],clientSecret:t[0],type:"SETUP_INTENT"}:null},l=function(e){return"payment_intent"===e.object?{id:e.id,clientSecret:e.client_secret,type:"PAYMENT_INTENT"}:{id:e.id,clientSecret:e.client_secret,type:"SETUP_INTENT"}},d=function(e){return"requires_source_action"===e||"requires_action"===e},p=function(e){return"requires_source_action"===e.status||"requires_action"===e.status?e.next_action:null}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return c})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return u}));var r,a=n(5),o=n(4),i={alipay:"alipay",affirm:"affirm",afterpay_clearpay:"afterpay_clearpay",au_becs_debit:"au_becs_debit",acss_debit:"acss_debit",bacs_debit:"bacs_debit",bancontact:"bancontact",blik:"blik",boleto:"boleto",card:"card",customer_balance:"customer_balance",eps:"eps",fpx:"fpx",giropay:"giropay",grabpay:"grabpay",ideal:"ideal",klarna:"klarna",konbini:"konbini",nz_bank_account:"nz_bank_account",oxxo:"oxxo",p24:"p24",pay_by_bank:"pay_by_bank",paypal:"paypal",sepa_debit:"sepa_debit",sofort:"sofort",three_d_secure:"three_d_secure",upi:"upi",us_bank_account:"us_bank_account",wechat_pay:"wechat_pay",paynow:"paynow",pix:"pix",promptpay:"promptpay",qris:"qris",netbanking:"netbanking",id_bank_transfer:"id_bank_transfer",link:"link",apple_pay:"apple_pay",google_pay:"google_pay"},c=(r={},Object(a.a)(r,o.e.auBankAccount,i.au_becs_debit),Object(a.a)(r,o.e.card,i.card),Object(a.a)(r,o.e.cardNumber,i.card),Object(a.a)(r,o.e.cardExpiry,i.card),Object(a.a)(r,o.e.cardCvc,i.card),Object(a.a)(r,o.e.postalCode,i.card),Object(a.a)(r,o.e.iban,i.sepa_debit),Object(a.a)(r,o.e.idealBank,i.ideal),Object(a.a)(r,o.e.fpxBank,i.fpx),Object(a.a)(r,o.e.p24Bank,i.p24),Object(a.a)(r,o.e.netbankingBank,i.netbanking),Object(a.a)(r,o.e.epsBank,i.eps),r),s=function(e){return-1===o.m.indexOf(e)},u=function(e,t){return null!=t?t:s(e)?null:c[e]||null}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"d",(function(){return d})),n.d(t,"j",(function(){return p})),n.d(t,"b",(function(){return f})),n.d(t,"e",(function(){return u})),n.d(t,"n",(function(){return _})),n.d(t,"l",(function(){return b})),n.d(t,"k",(function(){return v})),n.d(t,"m",(function(){return O})),n.d(t,"c",(function(){return g})),n.d(t,"q",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"h",(function(){return P})),n.d(t,"i",(function(){return A})),n.d(t,"f",(function(){return I})),n.d(t,"p",(function(){return T})),n.d(t,"o",(function(){return N}));var r="1.2em",a="14px",o=function(e){var t=e.split(" ").map((function(e){return parseInt(e.trim(),10)}));return 1===t.length||2===t.length?2*t[0]:3===t.length||4===t.length?t[0]+t[2]:0},i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:r,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"0",i=o(n);if("string"==typeof e&&/^[0-9.]+px$/.test(e)){var c=parseFloat(e.toString().replace(/[^0-9.]/g,""));return"".concat(c+i,"px")}var s,u=parseFloat(e.toString().replace(/[^0-9.]/g,"")),l=parseFloat(a.replace(/[^0-9.]/g,"")),d=parseFloat(t.toString().replace(/[^0-9.]/g,""));if("string"==typeof t&&/^(\d+|\d*\.\d+)px$/.test(t))s=d;else if("string"==typeof t&&/^(\d+|\d*\.\d+)em$/.test(t))s=d*l;else if("string"==typeof t&&/^(\d+|\d*\.\d+)%$/.test(t))s=d/100*l;else{if("string"!=typeof t||!/^[\d.]+$/.test(t)&&!/^\d*\.(px|em|%)$/.test(t))return"100%";s=l}var p=u*s+i,f="".concat(p,"px");return/^[0-9.]+px$/.test(f)?f:"100%"},c=n(39),s=n(13),u=function(e,t){return e?window.getComputedStyle(e,t):null},l=function(){return Array.prototype.slice.call(document.querySelectorAll("a[href], area[href], input:not([disabled]),\n  select:not([disabled]), textarea:not([disabled]), button:not([disabled]),\n  object, embed, *[tabindex], *[contenteditable]")).filter((function(e){var t=e.getAttribute("tabindex"),n=!t||parseInt(t,10)>=0,r=e.getBoundingClientRect(),a=u(e),o=r.width>0&&r.height>0&&a&&"hidden"!==a.getPropertyValue("visibility");return n&&o}))},d=function(e,t){var n=l();return n[Object(s.b)(n,(function(t){return t===e||e.contains(t)}))+("previous"===t?-1:1)]},p=function(e,t){return e.then((function(){return Object(s.f)(t,(function(e){var t=e.element,n=e.tabIndex;""===n?t.removeAttribute("tabindex"):t.setAttribute("tabindex",n)}))}))},f=function(e){var t=[],n=Object(s.f)(document.querySelectorAll("*"),(function(n){var r=n.getAttribute("tabindex")||"";e!==n&&(n.tabIndex=-1),t.push({element:n,tabIndex:r})})),r=Object(c.d)((function(){p(n,t)}));return{lockedPromise:n,lockedElements:t,restoreFocus:r}},m=(n(15),n(20)),h=n(2),_=function(e,t){var n={},r={};e.className.split(/\s+/).forEach((function(e){e&&(n[e]=!0)})),t.forEach((function(e){var t=Object(m.a)(e,2),a=t[0],o=t[1];a.split(/\s+/).forEach((function(e){e&&(r[e]=r[e]||o,n[e]=r[e])}))})),e.className=Object.keys(n).filter((function(e){return n[e]})).join(" ")},b=function(e,t){e.style.cssText=Object.keys(t).map((function(e){return"".concat(e,": ").concat(t[e]," !important;")})).join(" ")},y={border:"none",margin:"0",padding:"0",width:"1px","min-width":"100%",overflow:"hidden",display:"block",visibility:"hidden",position:"fixed",height:"1px","pointer-events":"none","user-select":"none"},v=function(e){b(e,y)},O=function(e){try{return window.parent.frames[e]}catch(e){return null}},g=function(){if(!document.body)throw new h.b("Stripe.js requires that your page has a <body> element.");return document.body},j=function(e){return setTimeout(e,16)},w=function(e,t){return!!e.documentElement&&e.documentElement.contains(t)},k="isConnected"in window.Node.prototype?function(e,t){return t.isConnected&&t.ownerDocument===e}:w,E=function(e,t){return!w(e,t)&&k(e,t)},S=["button","checkbox","file","hidden","image","submit","radio","reset"],P=function(e){var t=e.tagName;if(e.isContentEditable||"TEXTAREA"===t)return!0;if("INPUT"!==t)return!1;var n=e.getAttribute("type");return-1===S.indexOf(n)},A=function(){var e=g(),t=e.style.overflow;e.style.overflow="hidden";var n={passive:!1},r=function(e){return e.preventDefault()},a=function(){};return window.addEventListener("touchmove",a,n),e.addEventListener("touchstart",a,n),e.addEventListener("touchmove",r,n),Object(c.d)((function(){e.style.overflow=t||"",window.removeEventListener("touchmove",a,n),e.removeEventListener("touchstart",a,n),e.removeEventListener("touchmove",r,n)}))},I=function(){var e=document.querySelectorAll("meta[name=viewport][content]"),t=e[e.length-1];return t&&t instanceof HTMLMetaElement?t.content:""},C=function(e){return I().match(e)},T=function(e){C("width=device-width")||e('Elements requires "width=device-width" be set in your page\'s viewport meta tag.\n       For more information: https://stripe.com/docs/js/appendix/viewport_meta_requirements')},N=function(e){C("minimum-scale=1")||e('The Financial Connections authentication flow requires "minimum-scale=1" to be set in your page\'s viewport meta tag.')}},function(e,t,n){"use strict";function r(){return(r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"j",(function(){return u})),n.d(t,"i",(function(){return l})),n.d(t,"f",(function(){return d})),n.d(t,"h",(function(){return p})),n.d(t,"g",(function(){return f})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return y}));n(35),n(34),n(28),n(36);n(20);var a=n(3),o=function(e,t){for(var n=0;n<e.length;n++)if(t(e[n]))return e[n]},i=function(e,t){for(var n=0;n<e.length;n++)if(t(e[n]))return n;return-1},c="[object Object]",s=function e(t,n){if("object"!=typeof t||"object"!=typeof n)return t===n;if(null===t||null===n)return t===n;var r=Array.isArray(t);if(r!==Array.isArray(n))return!1;var a=Object.prototype.toString.call(t)===c;if(a!==(Object.prototype.toString.call(n)===c))return!1;if(!a&&!r)return!1;var o=Object.keys(t),i=Object.keys(n);if(o.length!==i.length)return!1;for(var s={},u=0;u<o.length;u++)s[o[u]]=!0;for(var l=0;l<i.length;l++)s[i[l]]=!0;var d=Object.keys(s);if(d.length!==o.length)return!1;var p=t,f=n;return d.every((function(t){return e(p[t],f[t])}))},u=function(e){return Object.keys(e).map((function(t){return e[t]}))},l=function(e,t){for(var n={},r=0;r<t.length;r++)n[t[r]]=!0;for(var a=[],o=0;o<e.length;o++)n[e[o]]&&a.push(e[o]);return a},d=function(e,t){var n=0,r=function r(a){for(var o=Date.now();n<e.length&&Date.now()-o<50;)t(e[n]),n++;n===e.length?a():setTimeout((function(){return r(a)}))};return new a.a((function(e){return r(e)}))},p=function(e,t){for(var n={},r=0;r<t.length;r++)void 0!==e[t[r]]&&(n[t[r]]=e[t[r]]);return n},f=function(e,t){return function(e,t){for(var n={},r=Object.keys(e),a=0;a<r.length;a++)t(r[a],e[r[a]])&&(n[r[a]]=e[r[a]]);return n}(e,(function(e,n){return-1===t.indexOf(e)}))},m=function(e){return e&&"object"==typeof e&&(e.constructor===Array||e.constructor===Object)},h=function(e){return m(e)?Array.isArray(e)?e.slice(0,e.length):r({},e):e},_=function e(t){return function(){for(var n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];if(Array.isArray(r[0])&&t)return h(r[0]);var o=Array.isArray(r[0])?[]:{};return r.forEach((function(n){n&&Object.keys(n).forEach((function(r){var a=o[r],i=n[r],c=m(a)&&!(t&&Array.isArray(a));"object"==typeof i&&c?o[r]=e(t)(a,h(i)):void 0!==i?o[r]=m(i)?e(t)(i):h(i):void 0!==a&&(o[r]=a)}))})),o}},b=_(!1),y=_(!0)},function(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"j",(function(){return i})),n.d(t,"d",(function(){return s})),n.d(t,"c",(function(){return u})),n.d(t,"i",(function(){return l})),n.d(t,"b",(function(){return d})),n.d(t,"h",(function(){return p})),n.d(t,"e",(function(){return m})),n.d(t,"f",(function(){return h})),n.d(t,"g",(function(){return _}));var r=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a=function(e){var t={};return e.replace(/\+/g," ").split("&").forEach((function(e,n){var a,o=e.split("="),i=decodeURIComponent(o[0]),c=t,s=0,u=i.split("]["),l=u.length-1;if(/\[/.test(u[0])&&/\]$/.test(u[l])?(u[l]=u[l].replace(/\]$/,""),l=(u=u.shift().split("[").concat(u)).length-1):l=0,!(u.indexOf("__proto__")>=0))if(2===o.length)if(a=decodeURIComponent(o[1]),l)for(;s<=l;s++){if(i=""===u[s]?c.length:u[s],!r(c,i)&&c[i])return;c[i]=s<l?c[i]||(u[s+1]&&isNaN(u[s+1])?{}:[]):a,c=c[i]}else if(Array.isArray(t[i]))t[i].push(a);else if(void 0!==t[i]){if(!r(t,i))return;t[i]=[t[i],a]}else t[i]=a;else i&&(t[i]="")})),t},o=n(7),i=function e(t,n){var r=[];return Object.keys(t).forEach((function(a){var i=t[a],c=n?"".concat(n,"[").concat(a,"]"):a;if(i&&"object"==typeof i){var s=e(i,c);""!==s&&(r=[].concat(Object(o.a)(r),[s]))}else null!=i&&(r=[].concat(Object(o.a)(r),["".concat(c,"=").concat(encodeURIComponent(String(i)))]))})),r.join("&").replace(/%20/g,"+")},c=/^(http(s)?):\/\//,s=function(e){return c.test(e)},u=function(e){var t=e.match(c);return t&&t.length?t[1]:null},l=function(e){if(!s(e))return null;var t=document.createElement("a");t.href=e;var n=t.protocol,r=t.host,a=t.pathname,o=/:80$/,i=/:443$/;return"http:"===n&&o.test(r)?r=r.replace(o,""):"https:"===n&&i.test(r)&&(r=r.replace(i,"")),{host:r,protocol:n,origin:"".concat(n,"//").concat(r),path:a}},d=function(e){var t=l(e);return t?t.origin:null},p=function(e,t){if("/"===t[0]){var n=l(e);return n?"".concat(n.origin).concat(t):t}var r=e.replace(/\/[^/]*$/,"/");return"".concat(r).concat(t)},f=l("https://payments.stripe.com"),m=(f&&f.origin,function(e,t){var n=l(e),r=l(t);return!(!n||!r)&&n.origin===r.origin}),h=function(e){return m(e,"https://js.stripe.com/v3/")},_=function(e){return h(e)||function(e){var t=l(e),n=t?t.host:"";return"stripe.com"===n||!!n.match(/\.stripe\.(com|me)$/)}(e)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=function(e){return"".concat("https://js.stripe.com/v3/").concat(e||"")}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(32);function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Object(r.a)(e,t)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(24),a=n(37),o=n(41),i=n(21);function c(e,t){return!t||"object"!==Object(o.a)(t)&&"function"!=typeof t?Object(i.a)(e):t}function s(e){var t=Object(a.a)();return function(){var n,a=Object(r.a)(e);if(t){var o=Object(r.a)(this).constructor;n=Reflect.construct(a,arguments,o)}else n=a.apply(this,arguments);return c(this,n)}}},function(e,t,n){"use strict";n.d(t,"k",(function(){return u})),n.d(t,"l",(function(){return l})),n.d(t,"h",(function(){return d})),n.d(t,"i",(function(){return p})),n.d(t,"j",(function(){return f})),n.d(t,"m",(function(){return m})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return _})),n.d(t,"d",(function(){return b})),n.d(t,"f",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return O})),n.d(t,"e",(function(){return g}));var r=n(20),a=n(0),o=n(2),i=n(11),c=n(26),s=function(e){var t=e.split(/(?=[A-Z])/).join("-").toLowerCase();return"https://stripe.com/docs/stripe-js/reference#stripe-".concat(t)},u=function(e,t){return Object(a.H)(c.h,e,"stripe.".concat(t," intent secret")).value},l=function(e,t){return Object(a.H)(c.i,e,"stripe.".concat(t," intent secret")).value},d=function(e){if(!e||!e.payment_method||!e.payment_method.type||"string"!=typeof e.payment_method.type)return null;var t=e.payment_method.type;return i.b[t]||null},p=function(e,t){return Object(a.H)(c.c,t,e).value},f=function(e,t,n,r){if("valid"===Object(a.I)(a.g,n,t).type)throw new o.b("Do not pass an Element to stripe.".concat(t,"() directly.\n")+"For more information: ".concat(s(t)));var i=Object(a.H)(Object(c.d)(e,t),n,t).value,u=i.source,l=i.paymentMethodData,d=i.paymentMethodOptions,p=i.paymentMethod,f=i.otherParams;if(null!=u&&(null!=l||null!=p))throw new o.b("".concat(t,": Expected either source or payment_method, but not both."));if(l){if(l.element)return{mode:{tag:"paymentMethod-from-element",type:e,elementName:l.element._componentName,frameId:l.element._implementation._frame.id,data:l.data,options:d,intentSecret:r},otherParams:f};if(e)return{mode:{tag:"paymentMethod-from-data",type:e,data:l.data,options:d,intentSecret:r},otherParams:f}}else{if(p)return{mode:{tag:"paymentMethod",paymentMethod:p,options:d,intentSecret:r},otherParams:f};if(u)return{mode:{tag:"source",source:u,intentSecret:r},otherParams:f}}return{mode:{tag:"none",intentSecret:r},otherParams:f}},m=function(e,t){if("object"==typeof e&&null!==e&&void 0!==e.handleActions)throw new o.b("stripe.".concat(t," does not support a handleActions option. For more information, see ").concat(s(t)))},h=function(e,t){var n=e.split("#"),a=Object(r.a)(n,2),o=a[0],i=a[1],c=o.split("?"),s=Object(r.a)(c,2),u=s[0],l=s[1],d="?",p="payment_intent"===t.object?["payment_intent","payment_intent_client_secret","redirect_status"]:["setup_intent","setup_intent_client_secret","redirect_status"];(l||"").split("&").forEach((function(e,t){var n=e.split("="),a=Object(r.a)(n,1)[0];-1===p.indexOf(a)&&(d+="".concat("?"===d?"":"&").concat(e))}));var f="payment_intent"===t.object?"payment":"setup";d+="".concat("?"===d?"":"&").concat(f,"_intent=").concat(t.id),d+="&".concat(f,"_intent_client_secret=").concat(t.client_secret);var m=u+(d+="&redirect_status=succeeded");return i?"".concat(m,"#").concat(i):m},_={type:"validation_error",code:"incomplete_payment_details"},b={type:"instant_verification_error",code:"instant_verification"},y={type:"validation_error",code:"unexpected"},v={type:"validation_error",code:"civ_unexpected"},O={type:"validation_error",code:"payment_intent_authentication_failure"},g={type:"instant_verification_incomplete_error",code:"instant_verification_incomplete"}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(35);var a=n(28),o=n(36);function i(e,t){return Object(r.a)(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,a=!1,o=void 0;try{for(var i,c=e[Symbol.iterator]();!(r=(i=c.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){a=!0,o=e}finally{try{r||null==c.return||c.return()}finally{if(a)throw o}}return n}}(e,t)||Object(a.a)(e,t)||Object(o.a)()}},function(e,t,n){"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return o}));var r=n(8),a=function(e,t){var n=e.createLightboxFrame({type:r.a.LIGHTBOX_APP,options:t});return n.show(),n._on("nested-frame-loaded",(function(){n.fadeInBackdrop(),setTimeout((function(){n.action.openLightboxFrame()}),200)})),n},o=function(e){return e.action.closeLightboxFrame(),e.destroy()}},function(e,t,n){"use strict";function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function a(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"e",(function(){return d})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return f})),n.d(t,"i",(function(){return m})),n.d(t,"h",(function(){return h})),n.d(t,"a",(function(){return _})),n.d(t,"j",(function(){return b})),n.d(t,"f",(function(){return y})),n.d(t,"l",(function(){return v})),n.d(t,"c",(function(){return O})),n.d(t,"m",(function(){return g})),n.d(t,"b",(function(){return j})),n.d(t,"k",(function(){return w}));var r=function(e){return/Edge\//i.test(e)},a=function(e){return/Edg\//i.test(e)},o=function(e){return/(MSIE ([0-9]{1,}[.0-9]{0,})|Trident\/)/i.test(e)},i=function(e){return/SamsungBrowser/.test(e)},c=function(e){return/iPad|iPhone/i.test(e)&&!o(e)},s=function(e){return/^((?!chrome|android).)*safari/i.test(e)&&!i(e)},u=function(e){return/Android/i.test(e)&&!o(e)},l=window.navigator.userAgent,d=r(l),p=a(l),f=(/Edge\/((1[0-6]\.)|0\.)/i.test(l),o(l)),m=(function(e){/MSIE ([0-9]{1,}[.0-9]{0,})/i.test(e)}(l),c(l)),h=(function(e){/iPad/i.test(e)&&o(e)}(l),function(e){return c(e)||u(e)}(l)),_=u(l),b=(function(e){/Android 4\./i.test(e)&&!/Chrome/i.test(e)&&u(e)}(l),s(l)),y=(function(e){s(e)&&c(e)}(l),function(e){return/Firefox\//i.test(e)}(l)),v=(function(e){/Firefox\/(50|51|[0-4]?\d)([^\d]|$)/i.test(e)}(l),i(l)),O=function(e){return/Chrome\//i.test(e)}(l),g=(function(e){/Chrome\/(6[6-9]|[7-9]\d+|[1-9]\d{2,})/i.test(e)}(l),function(e){return/AppleWebKit/i.test(e)&&!/Chrome/i.test(e)&&!r(e)&&!o(e)}(l)),j=function(e){return/Chrome/i.test(e)&&!r(e)}(l),w=(function(e){/CriOS/i.test(e)}(l),b&&"download"in document.createElement("a"));!!window.navigator.brave&&window.navigator.brave.isBrave},function(e,t,n){"use strict";n.d(t,"g",(function(){return f})),n.d(t,"h",(function(){return m})),n.d(t,"i",(function(){return h})),n.d(t,"f",(function(){return _})),n.d(t,"e",(function(){return b})),n.d(t,"c",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return O})),n.d(t,"d",(function(){return g}));var r=n(1),a=n(7),o=n(41);function i(e){var t=function(e,t){if("object"!==Object(o.a)(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Object(o.a)(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Object(o.a)(t)?t:String(t)}var c=n(14),s=n(2),u=n(0),l=n(4),d=n(11),p=n(10),f=function(e,t){if("string"!=typeof e)return Object(u.m)("a client_secret string",e,t);var n=Object(p.d)(e);return null===n?Object(u.m)("a client secret of the form ${id}_secret_${secret}",e,t):Object(u.G)(n,[])},m=function(e,t){var n=f(e,t);return"error"===n.type?n:n.value.type===l.g.SETUP_INTENT?Object(u.j)(new s.b(Object(u.E)("a PaymentIntent client secret","a SetupIntent client secret",t))):Object(u.G)(n.value,[])},h=function(e,t){var n=f(e,t);return"error"===n.type?n:n.value.type===l.g.PAYMENT_INTENT?Object(u.j)(new s.b(Object(u.E)("a SetupIntent client secret","a PaymentIntent client secret",t))):Object(u.G)(n.value,[])},_=function(e,t){if(null===e)return Object(u.k)("object","null",t);if("object"!=typeof e)return Object(u.k)("object",typeof e,t);var n=e.client_secret,r=e.status,a=e.next_action,o=f(n,Object(u.i)(t,"client_secret"));if("error"===o.type)return o;if("string"!=typeof r)return Object(u.k)("string",typeof r,Object(u.i)(t,"status"));if(("requires_source_action"===r||"requires_action"===r)&&"object"!=typeof a)return Object(u.k)("object",typeof a,Object(u.i)(t,"next_action"));if("payment_intent"===e.object){var i=e;return Object(u.G)(i,[])}var c=e;return Object(u.G)(c,[])},b=function(e){return function(t,n){if("object"!=typeof t)return Object(u.k)("object",typeof t,n);if(null===t)return Object(u.k)("object","null",n);var r,o=t.type,l=Object(c.a)(t,["type"]);if(null===e){if("string"!=typeof o)return Object(u.k)("a string such as 'card', 'ideal', or 'sepa_debit'",typeof o,Object(u.i)(n,"type"));r=o}else{if(void 0!==o&&o!==e)return"string"!=typeof o?Object(u.k)("a string such as 'card', 'ideal', or 'sepa_debit'",typeof o,Object(u.i)(n,"type")):Object(u.k)('"'.concat(o,'"'),'"'.concat(e,'"'),Object(u.i)(n,"type"));r=e}var p=l[r],f=(l[r],Object(c.a)(l,[r].map(i)));if(-1!==["acss_debit","affirm","afterpay_clearpay","alipay","bancontact","customer_balance","eps","giropay","grabpay","klarna","konbini","oxxo","p24","paynow","paypal","pix","us_bank_account","wechat_pay","pay_by_bank","paynow","promptpay","qris"].indexOf(r)&&void 0===p&&(p={}),"object"!=typeof p)return Object(u.k)("an object or element",typeof t[r],Object(u.i)(n,r));if(null===p)return Object(u.k)("an object or element","null",Object(u.i)(n,r));var m=Object(u.c)(p);if(m){var h=m._componentName;if(d.a[h]!==r){var _=[].concat(Object(a.a)(n.path),[r]).join("."),b=n.label,y=new s.b("Invalid value for ".concat(b,": ").concat(_," was `").concat(h,"` Element, which cannot be used to create ").concat(r," PaymentMethods."));return Object(u.j)(y)}return Object(u.G)({type:r,element:m,data:f})}return Object(u.G)({type:r,element:null,data:l})}},y=Object(u.J)(Object(u.y)({handleActions:Object(u.J)(u.e,(function(){return!0}))}),(function(){return{handleActions:!0}})),v=function(e){return function(t,n){if("object"!=typeof t)return Object(u.k)("object",typeof t,n);if(null===t)return Object(u.k)("object","null",n);var r=t.billing_details,a=Object(c.a)(t,["billing_details"]);return Object(u.G)({paymentMethodData:{type:"".concat(e),billing_details:r},otherParams:a})}},O=function(e){return function(t,n){if("object"!=typeof t)return Object(u.k)("object",typeof t,n);if(null===t)return Object(u.k)("object","null",n);var a=t.clientSecret,o=t.params,i=Object(c.a)(t,["clientSecret","params"]),s=Object(u.I)(e,a,n.label,{path:["clientSecret"]});if("error"===s.type)return s;if("object"!=typeof o)return Object(u.k)("object",typeof o,Object(u.i)(n,"params"));if(null===o)return Object(u.k)("object","null",Object(u.i)(n,"params"));var l=o.payment_method_type,d=o.payment_method_data;return"string"!=typeof l?Object(u.k)("string",typeof l,Object(u.i)(Object(u.i)(n,"params"),"payment_method_type")):"object"!=typeof d&&void 0!==d?Object(u.k)("object",typeof d,Object(u.i)(Object(u.i)(n,"params"),"payment_method_data")):Object(u.G)({clientSecret:s.value,paymentMethodData:Object(r.a)({type:l},(null==d?void 0:d.billing_details)&&{billing_details:null==d?void 0:d.billing_details}),otherParams:i})}},g=function(e,t){return function(n,o){if(void 0===n)return Object(u.G)({paymentMethodData:null,paymentMethodOptions:null,source:null,paymentMethod:null,otherParams:{}});if("object"!=typeof n)return Object(u.k)("object",typeof n,o);if(null===n)return Object(u.k)("object","null",o);var i=n.source,d=n.source_data,p=n.payment_method_data,f=n.payment_method_options,m=n.payment_method,h=Object(c.a)(n,["source","source_data","payment_method_data","payment_method_options","payment_method"]);if(null!=d)throw new s.b("".concat(t,": Expected payment_method, or source, not source_data."));if(null!=p)throw new s.b("".concat(t,": Expected payment_method, or source, not payment_method_data."));if(null!=i&&null!=m)throw new s.b("".concat(t,": Expected either payment_method or source, but not both."));if(null===e&&null!=m&&"string"!=typeof m)throw new s.b("".concat(t,": Expected payment_method[type] to be set if payment_method is passed."));if(null!=i){if("string"!=typeof i)return Object(u.k)("string",typeof i,Object(u.i)(o,"source"));if("updatePaymentIntent"===t)throw new s.b("".concat(t,": Expected payment_method, not source to be passed."));return Object(u.G)({source:i,paymentMethodData:null,paymentMethodOptions:null,paymentMethod:null,otherParams:h})}if(null!=m&&"string"!=typeof m&&"object"!=typeof m)return Object(u.k)("string or object",typeof m,Object(u.i)(o,"payment_method"));var _,y=Object(u.I)((_=e,function(e,t){if(null==e)return Object(u.G)(null);if("object"!=typeof e)return Object(u.k)("object",typeof e,t);var n=e.card,a=Object(c.a)(e,["card"]);if(!n||"object"!=typeof n)return Object(u.G)(e);var o=n.cvc,i=Object(c.a)(n,["cvc"]);if(null==o)return Object(u.G)(e);var s=Object(u.c)(o),d=s?s._componentName:"";return l.e.cardCvc!==d?Object(u.k)("`".concat(l.e.cardCvc,"` Element"),d?"`".concat(d,"` Element"):typeof o,Object(u.i)(t,"".concat(_||"card",".cvc"))):Object(u.G)(Object(r.a)(Object(r.a)({},a),{},{card:Object(r.a)(Object(r.a)({},i),{},{cvc:s})}))}),f,t,{path:[].concat(Object(a.a)(o.path),["payment_method_options"])});if("error"===y.type)return y;if("string"==typeof m)return Object(u.G)({source:null,paymentMethodData:null,paymentMethodOptions:y.value,paymentMethod:m,otherParams:h});if("object"==typeof m&&null!==m){var v=Object(u.I)(b(e),m,t,{path:[].concat(Object(a.a)(o.path),["payment_method"])});if("error"===v.type)return v;var O=v.value;return Object(u.G)({source:null,paymentMethod:null,paymentMethodOptions:y.value,paymentMethodData:O,otherParams:h})}return Object(u.G)({source:null,paymentMethodData:null,paymentMethodOptions:null,paymentMethod:null,otherParams:h})}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(9),a=n(23),o=Date.now?function(){return Date.now()}:function(){return(new Date).getTime()},i=o(),c=window.performance&&window.performance.now?function(){return window.performance.now()}:function(){return o()-i},s=function(){function e(t){Object(r.a)(this,e),this.timestampValue=null!=t?t:c()}return Object(a.a)(e,[{key:"getAsPosixTime",value:function(){return o()-this.getElapsedTime()}},{key:"getElapsedTime",value:function(e){return Math.round((e?e.timestampValue:c())-this.timestampValue)}},{key:"valueOf",value:function(){return Math.round(this.timestampValue)}}],[{key:"fromPosixTime",value:function(t){return new e(t-o()+c())}}]),e}()},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(31);function a(e,t){if(e){if("string"==typeof e)return Object(r.a)(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Object(r.a)(e,t):void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"d",(function(){return p}));var r=n(2),a={live:"live",test:"test",unknown:"unknown"},o=function(e){return/^pk_test_/.test(e)?a.test:/^pk_live_/.test(e)?a.live:a.unknown},i=function(e){if(e===a.unknown)throw new r.b("It looks like you're using an older Stripe key. In order to use this API, you'll need to use a modern API key, which is prefixed with 'pk_live_' or 'pk_test_'.\n    You can roll your publishable key here: https://dashboard.stripe.com/account/apikeys")},c="publishable",s="secret",u="ephemeral",l="restricted",d="unknown",p=function(e){if(""===e)throw new r.b("Please call Stripe() with your publishable key. You used an empty string.");switch(function(e){switch(e.split("_",1)[0]){case"pk":return c;case"sk":return s;case"ek":return u;case"rk":return l;default:return d}}(e)){case s:throw new r.b("You should not use your secret key with Stripe.js.\n          Please pass a publishable key instead.");case u:throw new r.b("You should not use an ephemeral key with Stripe.js.\n          Please pass a publishable key instead.");case l:throw new r.b("You should not use a restricted key with Stripe.js.\n          Please pass a publishable key instead.")}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(24),a=n(32);var o=n(37);function i(e,t,n){return(i=Object(o.a)()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&Object(a.a)(o,n.prototype),o}).apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return(c=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,o)}function o(){return i(e,arguments,Object(r.a)(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Object(a.a)(o,e)})(e)}},function(e,t,n){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(e,t){return(r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"e",(function(){return u})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return d})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return f}));var r=n(0),a=n(4),o=n(3),i=n(10),c=n(19),s=function(e){switch(e.type){case"error":return{error:e.error};case"object":switch(e.object.object){case"payment_intent":return{paymentIntent:e.object};case"setup_intent":return{setupIntent:e.object};default:return Object(r.a)(e.object)}default:return Object(r.a)(e)}},u=function(e,t,n,r,o){return t===a.g.PAYMENT_INTENT?n.action.retrievePaymentIntent({hosted:false,intentSecret:e,locale:r,asErrorIfNotSucceeded:true,expandParam:o||[]}).then(s):n.action.retrieveSetupIntent({hosted:false,intentSecret:e,locale:r,asErrorIfNotSucceeded:true,expandParam:o||[]}).then(s)},l=function(e,t,n,r,o,i,c){return t===a.g.PAYMENT_INTENT?n.action.cancelPaymentIntentSource({intentSecret:e,locale:o,sourceId:r,sourceIntentId:i,publishableKey:c}).then(s):n.action.cancelSetupIntentSource({intentSecret:e,locale:o,sourceId:r,sourceIntentId:i,publishableKey:c}).then(s)},d=function(e){return(e.error?e.error.payment_intent||e.error.setup_intent:e.paymentIntent||e.setupIntent)||null},p=function(e,t,n,r,a,o){var i,c=!0,s=3,l=0;return function p(){l+=1,u(e,t,n,r,a).then((function(e){if(c){var t=d(e);if(null!==t)switch(s=3,t.status){case"requires_action":case"requires_source_action":return void(i=setTimeout(p,5e3));case"processing":return void(i=setTimeout(p,1e3));default:o(e,l)}else if(s>0){var n=500*Math.pow(2,3-s);i=setTimeout(p,n),s-=1}else o(e,l)}}))}(),function(){clearTimeout(i),c=!1}},f=function(e){var t=e.initialDelay,n=e.pollTimeGap,r=e.checkIntent,a=e.locale,u=e.controller,l=e.intent,d=e.expandParam,p=void 0===d?[]:d,f=e.shouldPoll,m=void 0===f?function(){return!0}:f,h="payment_intent"===l.object?{paymentIntent:l}:{setupIntent:l};return new o.a((function(e,o){setTimeout((function(){var t=setInterval((function(){if(!m())return e(h),void clearInterval(t);var n;(n={hosted:!1,intentSecret:Object(i.e)(l),locale:a,expandParam:p},"payment_intent"===l.object?u.action.retrievePaymentIntent(n):u.action.retrieveSetupIntent(n)).then((function(n){h=s(n),n.error?(u.action.localizeError(c.f).then((function(e){return{error:e}})).then(e),clearInterval(t)):r(n.object)&&(e(h),clearInterval(t))}))}),n)}),t-n)}))}},function(e,t,n){"use strict";function r(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(e){if(Array.isArray(e))return e}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"b",(function(){return s})),n.d(t,"d",(function(){return u})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return p}));var r,a,o,i=n(5),c=n(4),s=(r={},Object(i.a)(r,c.e.card,{unique:!0,conflict:[c.e.cardNumber,c.e.cardExpiry,c.e.cardCvc,c.e.postalCode],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.cardNumber,{unique:!0,conflict:[c.e.card],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.cardExpiry,{unique:!0,conflict:[c.e.card],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.cardCvc,{unique:!0,conflict:[c.e.card],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.postalCode,{unique:!0,conflict:[c.e.card],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.paymentRequestButton,{unique:!0,conflict:[],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.iban,{unique:!0,conflict:[],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.idealBank,{unique:!0,conflict:[],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.p24Bank,{unique:!0,conflict:[],beta:!1,implementation:"legacy"}),Object(i.a)(r,c.e.auBankAccount,{unique:!0,beta:!1,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.fpxBank,{unique:!0,beta:!1,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.netbankingBank,{unique:!0,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.issuingCardCopyButton,{unique:!1,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.issuingCardNumberDisplay,{unique:!1,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.issuingCardCvcDisplay,{unique:!1,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.issuingCardExpiryDisplay,{unique:!1,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.issuingCardPinDisplay,{unique:!1,beta:!0,conflict:[],implementation:"legacy"}),Object(i.a)(r,c.e.epsBank,{unique:!0,conflict:[],beta:!0,implementation:"legacy"}),Object(i.a)(r,c.e.affirmMessage,{unique:!1,conflict:[],beta:!0,implementation:"affirm_message"}),Object(i.a)(r,c.e.afterpayClearpayMessage,{unique:!1,conflict:[],beta:!1,implementation:"afterpay_message"}),Object(i.a)(r,c.e.linkAuthentication,{unique:!0,conflict:[],beta:!0,implementation:"frame"}),Object(i.a)(r,c.e.payment,{unique:!0,conflict:[],beta:!0,implementation:"frame"}),Object(i.a)(r,c.e.shippingAddress,{unique:!0,conflict:[],beta:!0,implementation:"frame"}),Object(i.a)(r,c.e.cart,{unique:!0,conflict:[],beta:!0,implementation:"cart"}),r),u="__PrivateStripeElement",l=["brand"],d=(a={},Object(i.a)(a,c.e.card,l),Object(i.a)(a,c.e.cardNumber,l),Object(i.a)(a,c.e.iban,["country","bankName"]),Object(i.a)(a,c.e.auBankAccount,["bankName","branchName"]),a),p=(o={},Object(i.a)(o,c.e.idealBank,{secondary:c.e.idealBankSecondary}),Object(i.a)(o,c.e.p24Bank,{secondary:c.e.p24BankSecondary}),Object(i.a)(o,c.e.fpxBank,{secondary:c.e.fpxBankSecondary}),Object(i.a)(o,c.e.netbankingBank,{secondary:c.e.netbankingBankSecondary}),Object(i.a)(o,c.e.epsBank,{secondary:c.e.epsBankSecondary}),o)},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return i})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return s}));var r=n(2),a=n(3),o=function(e){var t={},n={};return function(r){var a="_".concat(r);if("string"==typeof r&&void 0!==t[a])return t[a];if("number"==typeof r&&void 0!==n[a])return n[a];var o=e(r);return"string"==typeof r&&(t[a]=o),"number"==typeof r&&(n[a]=o),o}},i=function(e,t){var n=!1;return function(){if(n)throw new r.b(t);n=!0;try{return e.apply(void 0,arguments).then((function(e){return n=!1,e}),(function(e){throw n=!1,e}))}catch(e){throw n=!1,e}}},c=function(e){var t=e;return function(){t&&(t.apply(void 0,arguments),t=null)}},s=function(e,t){return e.reduce((function(e,n){return e.then((function(e){return"SATISFIED"===e.type?e:n().then((function(e){return t(e)?{type:"SATISFIED",value:e}:{type:"UNSATISFIED"}}))}))}),a.a.resolve({type:"UNSATISFIED"}))}},,function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return g})),n.d(t,"c",(function(){return w})),n.d(t,"b",(function(){return k}));var r=n(10),a=n(60),o=n(61),i=n(65),c=n(3),s=n(22),u=n(8),l=n(62),d=n(33),p=n(25),f=function(e){return"requires_action"!==e.status&&"requires_source_action"!==e.status},m=n(56),h=function(e){return"requires_action"!==e.status&&"requires_source_action"!==e.status},_=n(0),b=n(4),y=n(2),v=n(6),O=function(e){return["id_bank_account","id_bank_transfer"].indexOf(e.bankTransferType)>-1},g=function(e){switch(e.type){case"error":var t=e.error;if("payment_intent_unexpected_state"===t.code&&"object"==typeof t.payment_intent&&null!=t.payment_intent&&"string"==typeof t.payment_intent.status&&Object(r.f)(t.payment_intent.status)){var n=t.payment_intent;return{type:"object",locale:e.locale,object:n}}return e;case"object":return e;default:return Object(_.a)(e)}},j=function(e,t,_,g,j){var w=Object(a.a)(Object(r.c)(t)),k=Object(r.e)(t);if(!w)return c.a.resolve({paymentIntent:t});switch(w.type){case"cardimageverification-challenge":return n.e(7).then(n.bind(null,91)).then((function(n){return(0,n.performCardImageVerification)(w,t,e,_)}));case"captcha-challenge":return Object(l.a)(w,t,e,_);case"3ds1-modal":return Object(o.a)(w,k,b.g.PAYMENT_INTENT,e,_,j);case"3ds2-fingerprint":case"3ds2-challenge":return Object(i.a)(w,{intentSecret:k,intentType:b.g.PAYMENT_INTENT,controller:e,locale:_,hosted:g},j);case"redirect":return Object(m.a)(t,w.redirectUrl,e);case"blik_authorize":return function(e){var t=e.controller,n=e.intent,r=e.locale;return Object(d.d)({controller:t,initialDelay:8e3,pollTimeGap:5e3,intent:n,checkIntent:function(e){return"requires_action"!==e.status||"blik_authorize"!==e.next_action.type},locale:r})}({controller:e,intent:t,locale:_});case"boleto-display":if(void 0===w.hostedVoucherUrl)throw new y.b("Expect `next_action.boleto_display_details.hosted_voucher_url` of `PaymentIntent` to be not undefined. Please refer to \n\nhttps://stripe.com/docs/api/payment_intents/object#payment_intent_object-next_action-boleto_display_details-hosted_voucher_url");return function(e){var t=e.controller,n=e.url,r=e.intent,a=e.locale,o=Object(s.b)(t,{url:Object(u.g)(n),size:"600x700",locale:a,frameTitle:"boleto.voucher_frame_title",useLightboxHostedCloseButton:!1});return new c.a((function(e){o._on("request-close",(function(){Object(s.a)(o).then((function(){e({paymentIntent:r})}))}))}))}({controller:e,locale:_,url:w.hostedVoucherUrl,intent:t});case"konbini-display":if(void 0===w.hostedVoucherUrl)throw new y.b("Expected option `handleActions` to be `false`. The Konbini pilot does not handle the next actions for you automatically yet (e.g. displaying Konbini payment details). Please refer to the Stripe Konbini integration guide for more info: \n\nhttps://stripe.com/docs/payments/konbini");return function(e){var t=e.controller,n=e.url,r=e.intent,a=e.locale,o=Object(s.b)(t,{url:Object(u.g)(n),size:"600x900",locale:a,frameTitle:"konbini.voucher_frame_title",useLightboxHostedCloseButton:!1});return new c.a((function(e){o._on("request-close",(function(){Object(s.a)(o).then((function(){e({paymentIntent:r})}))}))}))}({controller:e,locale:_,url:w.hostedVoucherUrl,intent:t});case"oxxo-display":if(void 0===w.hostedVoucherUrl)throw new y.b("To handle the next actions automatically, set the API version to oxxo_beta=v2. Please refer to the Stripe OXXO integration guide for more info: \n\nhttps://stripe.com/docs/payments/oxxo");return function(e){var t=e.controller,n=e.url,r=e.intent,a=e.locale,o=Object(s.b)(t,{url:Object(u.g)(n),size:"600x700",locale:a,frameTitle:"oxxo.voucher_frame_title",useLightboxHostedCloseButton:!1});return new c.a((function(e){o._on("request-close",(function(){Object(s.a)(o).then((function(){e({paymentIntent:r})}))}))}))}({controller:e,locale:_,url:w.hostedVoucherUrl,intent:t});case"upi_await_notification":return function(e){var t=e.controller,n=e.intentSecret,r=e.intentType,a=e.locale;return new c.a((function(e){setTimeout((function o(){Object(d.e)(n,r,t,a).then((function(t){var n=Object(d.b)(t);if(null!==n)switch(n.status){case"requires_action":return void setTimeout(o,1e4);default:e(t)}}))}),5e3)}))}({controller:e,intentSecret:k,intentType:b.g.PAYMENT_INTENT,locale:_});case"wechat_pay_display_qr_code":return function(e){var t=e.controller,n=e.intent,a=e.locale,o=Object(r.c)(n);if(!o||"wechat_pay_display_qr_code"!==o.type)throw new Error("Expected next_action.wechat_pay_display_qr_code");var i=t.createLightboxFrame({type:u.a.WECHAT_PAY_INNER,options:{qrCodeData:o.wechat_pay_display_qr_code.data,qrCodeUrl:o.wechat_pay_display_qr_code.image_url_png,locale:a}}),l=!1;return new c.a((function(e,r){i._on("load",(function(){i.show(),i.fadeInBackdrop()})),i._once("request-close",(function(){Object(s.a)(i).then((function(){l=!0,e({paymentIntent:n})}))})),Object(d.d)({controller:t,initialDelay:5e3,pollTimeGap:2e3,intent:n,checkIntent:function(e){return"requires_action"!==e.status},shouldPoll:function(){return!l},locale:a}).then((function(t){t.error||i.destroy(!0).then((function(){e(t)}))}))}))}({controller:e,locale:_,intent:t});case"paynow_display_qr_code":return function(e){var t=e.controller,n=e.intent,a=e.intentType,o=e.intentSecret,i=e.locale,l=Object(r.c)(n);if(!l||"paynow_display_qr_code"!==l.type)throw new Error("Expected next_action.paynow_display_qr_code");var p=t.createLightboxFrame({type:u.a.PAYNOW_INNER,options:{qrCodeUrl:l.paynow_display_qr_code.image_url_png,qrCodeData:l.paynow_display_qr_code.data,locale:i}}),f=null;return new c.a((function(e,r){p._on("load",(function(){p.show(),p.fadeInBackdrop()})),p._once("request-close",(function(){Object(s.a)(p).then((function(){f&&clearTimeout(f),e({paymentIntent:n})}))})),p._on("complete",(function(t){Object(s.a)(p).then((function(){f&&clearTimeout(f),e(t)}))})),f=setTimeout((function n(){Object(d.e)(o,a,t,i).then((function(t){var r=Object(d.b)(t);if(null!==r)switch(r.status){case"requires_action":return void(f=setTimeout(n,2e3));default:p.destroy(!0).then((function(){"payment_intent"===r.object?e({paymentIntent:r}):e({setupIntent:r})}))}}))}),5e3)}))}({controller:e,locale:_,intent:t,intentSecret:k,intentType:b.g.PAYMENT_INTENT});case"pix_display_qr_code":if(void 0===w.hostedInstructionsUrl)throw new y.b("Expect `next_action.pix_display_qr_code.hosted_instructions_url` of `PaymentIntent` to be not undefined. Please refer to \n\nhttps://stripe.com/docs/api/payment_intents/object#payment_intent_object-next_action-pix_display_qr_code-hosted_instructions_url");return function(e){var t=e.controller,n=e.intent,r=e.intentSecret,a=e.intentType,o=e.locale,i=e.url,l=Object(s.b)(t,{url:Object(u.g)(i),size:"450x600",locale:o,frameTitle:"pix.instructions_frame_title",useLightboxHostedCloseButton:!1}),p=null;return new c.a((function(e,i){l._on("load",(function(){l.show(),l.fadeInBackdrop()})),l._once("request-close",(function(){Object(s.a)(l).then((function(){p&&clearTimeout(p),e({paymentIntent:n})}))})),l._on("complete",(function(t){Object(s.a)(l).then((function(){p&&clearTimeout(p),e(t)}))})),p=setTimeout((function n(){Object(d.e)(r,a,t,o).then((function(t){var r=Object(d.b)(t);if(r)switch(r.status){case"requires_action":return void(p=setTimeout(n,2e3));default:l.destroy(!0).then((function(){"payment_intent"===r.object?e({paymentIntent:r}):e({setupIntent:r})}))}}))}),5e3)}))}({controller:e,locale:_,url:w.hostedInstructionsUrl,intent:t,intentSecret:k,intentType:b.g.PAYMENT_INTENT});case"promptpay_display_qr_code":return function(e){var t,n=e.controller,r=e.intent,a=e.locale,o=e.url,i=Object(s.b)(n,{url:Object(u.g)(o),size:(t=p.h,t?"fullScreen":"400x600"),locale:a,frameTitle:"hosted_qr_code_instructions.promptpay.frame_title",useLightboxHostedCloseButton:!1}),l=!1;return new c.a((function(e){return i._on("load",(function(){i.show(),i.fadeInBackdrop()})),i._once("request-close",(function(){Object(s.a)(i).then((function(){l=!0,e({paymentIntent:r})}))})),i._on("complete",(function(t){Object(s.a)(i).then((function(){l=!0,e(t)}))})),Object(d.d)({controller:n,initialDelay:5e3,pollTimeGap:2e3,intent:r,checkIntent:f,shouldPoll:function(){return!l},locale:a}).then((function(t){t.error||l||i.destroy(!0).then((function(){e(t)}))}))}))}({controller:e,locale:_,intent:t,intentSecret:k,url:w.hostedInstructionsUrl,intentType:b.g.PAYMENT_INTENT});case"display_bank_transfer_instructions":return function(e,t){return!!O(e)&&(Object(v.d)(t||[],v.a.id_bank_transfer_beta_2)||Object(v.d)(t||[],v.a.customer_balance_beta_1))}(w,e._betas)?Object(m.a)(t,w.hostedInstructionsUrl,e):function(e){return!O(e)}(w)?function(e){var t=e.controller,n=e.url,r=e.intent,a=e.locale,o=Object(s.b)(t,{url:Object(u.g)(n),size:"600x700",locale:a,frameTitle:"display_bank_transfer_instructions.voucher_frame_title",useLightboxHostedCloseButton:!1});return new c.a((function(e){o._on("request-close",(function(){Object(s.a)(o).then((function(){e({paymentIntent:r})}))}))}))}({controller:e,url:w.hostedInstructionsUrl,intent:t,locale:_}):c.a.resolve({paymentIntent:t});case"qris_display_qr_code":return function(e){var t=e.controller,n=e.intent,r=e.locale,a=e.url,o=Object(s.b)(t,{url:Object(u.g)(a),size:p.h?"fullScreen":"400x600",locale:r,frameTitle:"hosted_qr_code_instructions.qris.frame_title",useLightboxHostedCloseButton:!1}),i=!1;return new c.a((function(e){return o._on("load",(function(){o.show(),o.fadeInBackdrop()})),o._once("request-close",(function(){Object(s.a)(o).then((function(){i=!0,e({paymentIntent:n})}))})),o._on("complete",(function(t){Object(s.a)(o).then((function(){i=!0,e(t)}))})),Object(d.d)({controller:t,initialDelay:5e3,pollTimeGap:2e3,intent:n,checkIntent:h,shouldPoll:function(){return!i},locale:r}).then((function(t){"error"in t&&t.error||i||o.destroy(!0).then((function(){e(t)}))}))}))}({controller:e,locale:_,intent:t,intentSecret:k,url:w.hostedInstructionsUrl,intentType:b.g.PAYMENT_INTENT});default:return c.a.resolve({paymentIntent:t})}},w=function e(t,n,r,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(b.i<i)throw new Error("max action recursion depth reached");return j(t,n,r,a,o||[]).then((function(n){if(n.setupIntent)throw new Error("Got unexpected SetupIntent response");if(n.paymentIntent&&null!=n.paymentIntent.next_action&&"use_stripe_sdk"===n.paymentIntent.next_action.type&&-1!==b.j.indexOf(n.paymentIntent.next_action.use_stripe_sdk.type)){var c=i;return e(t,n.paymentIntent,r,a,o,++c)}return n}))},k=function(e,t,n,a){return function(o){var i=g(o);switch(i.type){case"error":var s=i.error,u=s.payment_intent;return t&&u&&"payment_intent_unexpected_state"===s.code&&("succeeded"===u.status||"requires_capture"===u.status)?c.a.resolve({paymentIntent:u}):c.a.resolve(Object(r.g)(o));case"object":var l=i.object;return w(e,l,i.locale,n,a||[]);default:return Object(_.a)(i)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o}));var r=n(3),a=function(e){return new r.a((function(t,n){var r=setTimeout((function(){t({type:"error",error:{code:"redirect_error",message:"Failed to redirect to ".concat(e)},locale:"en"})}),6e4);window.addEventListener("pagehide",(function(){clearTimeout(r)})),window.top.location.href=e}))},o=function(e,t,n){e.report("redirect_error",{initiator:t,error:n.error})}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return u})),n.d(t,"a",(function(){return l})),n.d(t,"e",(function(){return d})),n.d(t,"b",(function(){return p}));var r,a=n(5),o=n(38),i=n(4),c=n(8),s="".concat(o.d,"-input"),u=("".concat(o.d,"-inputAfter"),"".concat(o.d,"-safariInput")),l="StripeElement",d=["ready","focus","blur","escape","change"],p=(r={},Object(a.a)(r,i.e.linkAuthentication,c.a.LINK_AUTHENTICATION_ELEMENT),Object(a.a)(r,i.e.payment,c.a.PAYMENT_ELEMENT),Object(a.a)(r,i.e.shippingAddress,c.a.SHIPPING_ADDRESS_ELEMENT),Object(a.a)(r,i.e.autocompleteSuggestions,c.a.AUTOCOMPLETE_SUGGESTIONS_ELEMENT),Object(a.a)(r,i.e.achBankSearchResults,c.a.ACH_BANK_SEARCH_RESULTS_ELEMENT),r)},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return o}));var r={bif:1,clp:1,djf:1,gnf:1,jpy:1,kmf:1,krw:1,mga:1,pyg:1,rwf:1,vnd:1,vuv:1,xaf:1,xof:1,xpf:1,bhd:1e3,jod:1e3,kwd:1e3,omr:1e3,tnd:1e3},a=function(e,t){var n=function(e){var t=r[e.toLowerCase()]||100;return{unitSize:1/t,fractionDigits:Math.ceil(Math.log(t)/Math.log(10))}}(t),a=n.unitSize,o=n.fractionDigits;return(e*a).toFixed(o)},o=["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bhd","bif","bmd","bnd","bob","brl","bsd","btn","bwp","byn","byr","bzd","cad","cdf","chf","clf","clp","cny","cop","crc","cuc","cup","cve","czk","djf","dkk","dop","dzd","egp","ern","etb","eur","fjd","fkp","gbp","gel","ghs","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","iqd","irr","isk","jmd","jod","jpy","kes","kgs","khr","kmf","kpw","krw","kwd","kyd","kzt","lak","lbp","lkr","lrd","lsl","ltl","lvl","lyd","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","omr","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sdg","sek","sgd","shp","skk","sll","sos","srd","ssp","std","svc","syp","szl","thb","tjs","tmt","tnd","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vef","vnd","vuv","wst","xaf","xag","xau","xcd","xdr","xof","xpf","yer","zar","zmk","zmw","btc","jep","eek","ghc","mtl","tmm","yen","zwd","zwl","zwn","zwr"]},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(20),a=function(){var e=[];return{addEventListener:function(t,n,r,a){t.addEventListener(n,r,a),e.push([t,n,r,a])},removeEventListener:function(t,n,a,o){t.removeEventListener(n,a,o),e=e.filter((function(e){return function(e,t){var n=Object(r.a)(e,4),a=n[0],o=n[1],i=n[2],c=n[3],s=Object(r.a)(t,4),u=s[0],l=s[1],d=s[2],p=s[3];return u!==a||l!==o||d!==i||!0===("object"==typeof c&&c?c.capture:c)!=(!0===("object"==typeof p&&p?p.capture:p))}([t,n,a,o],e)}))}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return p})),n.d(t,"d",(function(){return f})),n.d(t,"e",(function(){return m})),n.d(t,"f",(function(){return h})),n.d(t,"b",(function(){return _}));var r,a=n(7),o=n(5),i=n(4),c=n(0),s={VISA:"visa",MASTERCARD:"mastercard",AMEX:"amex",DISCOVER_NETWORK:"discover_global_network"},u=(r={},Object(o.a)(r,s.VISA,[i.a.VISA]),Object(o.a)(r,s.MASTERCARD,[i.a.MASTERCARD]),Object(o.a)(r,s.AMEX,[i.a.AMEX]),Object(o.a)(r,s.DISCOVER_NETWORK,[i.a.DISCOVER,i.a.DINERS,i.a.JCB,i.a.UNIONPAY,i.a.ELO]),Object.keys(s).map((function(e){return s[e]}))),l=c.u.apply(void 0,Object(a.a)(u)),d=Object(c.y)({email:Object(c.w)(Object(c.q)(c.B)),name:Object(c.w)(Object(c.q)(c.B)),phone:Object(c.w)(Object(c.q)(c.B)),address:Object(c.w)(Object(c.y)({city:Object(c.w)(Object(c.q)(c.B)),country:Object(c.w)(Object(c.q)(c.B)),line1:Object(c.w)(Object(c.q)(c.B)),line2:Object(c.w)(Object(c.q)(c.B)),postal_code:Object(c.w)(Object(c.q)(c.B)),state:Object(c.w)(Object(c.q)(c.B))}))}),p=Object(c.y)({billingDetails:Object(c.w)(d)}),f=Object(c.y)({billingDetails:Object(c.w)(Object(c.x)(Object(c.u)("never","auto"),Object(c.y)({name:Object(c.w)(Object(c.u)("never","auto")),phone:Object(c.w)(Object(c.u)("never","auto")),email:Object(c.w)(Object(c.u)("never","auto")),address:Object(c.w)(Object(c.x)(Object(c.u)("never","auto"),Object(c.y)({country:Object(c.w)(Object(c.u)("never","auto")),postalCode:Object(c.w)(Object(c.u)("never","auto")),state:Object(c.w)(Object(c.u)("never","auto")),city:Object(c.w)(Object(c.u)("never","auto")),line1:Object(c.w)(Object(c.u)("never","auto")),line2:Object(c.w)(Object(c.u)("never","auto"))})))})))}),m=Object(c.y)({bancontact:Object(c.w)(Object(c.u)("auto","always","never")),card:Object(c.w)(Object(c.u)("auto","always","never")),ideal:Object(c.w)(Object(c.u)("auto","always","never")),sepaDebit:Object(c.w)(Object(c.u)("auto","always","never")),sofort:Object(c.w)(Object(c.u)("auto","always","never")),auBecsDebit:Object(c.w)(Object(c.u)("auto","always","never")),usBankAccount:Object(c.w)(Object(c.u)("auto","always","never"))}),h=Object(c.y)({applePay:Object(c.w)(Object(c.u)("auto","never")),googlePay:Object(c.w)(Object(c.u)("auto","never"))}),_=Object(c.b)(l)},function(e,t,n){"use strict";var r=n(53);function a(){}var o=null,i={};function c(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._45=0,this._81=0,this._65=null,this._54=null,e!==a&&f(e,this)}function s(e,t){for(;3===e._81;)e=e._65;if(c._10&&c._10(e),0===e._81)return 0===e._45?(e._45=1,void(e._54=t)):1===e._45?(e._45=2,void(e._54=[e._54,t])):void e._54.push(t);!function(e,t){r((function(){var n=1===e._81?t.onFulfilled:t.onRejected;if(null!==n){var r=function(e,t){try{return e(t)}catch(e){return o=e,i}}(n,e._65);r===i?l(t.promise,o):u(t.promise,r)}else 1===e._81?u(t.promise,e._65):l(t.promise,e._65)}))}(e,t)}function u(e,t){if(t===e)return l(e,new TypeError("A promise cannot be resolved with itself."));if(t&&("object"==typeof t||"function"==typeof t)){var n=function(e){try{return e.then}catch(e){return o=e,i}}(t);if(n===i)return l(e,o);if(n===e.then&&t instanceof c)return e._81=3,e._65=t,void d(e);if("function"==typeof n)return void f(n.bind(t),e)}e._81=1,e._65=t,d(e)}function l(e,t){e._81=2,e._65=t,c._97&&c._97(e,t),d(e)}function d(e){if(1===e._45&&(s(e,e._54),e._54=null),2===e._45){for(var t=0;t<e._54.length;t++)s(e,e._54[t]);e._54=null}}function p(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function f(e,t){var n=!1,r=function(e,t,n){try{e(t,n)}catch(e){return o=e,i}}(e,(function(e){n||(n=!0,u(t,e))}),(function(e){n||(n=!0,l(t,e))}));n||r!==i||(n=!0,l(t,o))}e.exports=c,c._10=null,c._97=null,c._61=a,c.prototype.then=function(e,t){if(this.constructor!==c)return function(e,t,n){return new e.constructor((function(r,o){var i=new c(a);i.then(r,o),s(e,new p(t,n,i))}))}(this,e,t);var n=new c(a);return s(this,new p(e,t,n)),n}},function(e,t){var n,r,a=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function c(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var s,u=[],l=!1,d=-1;function p(){l&&s&&(l=!1,s.length?u=s.concat(u):d=-1,u.length&&f())}function f(){if(!l){var e=c(p);l=!0;for(var t=u.length;t;){for(s=u,u=[];++d<t;)s&&s[d].run();d=-1,t=u.length}s=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function m(e,t){this.fun=e,this.array=t}function h(){}a.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new m(e,t)),1!==u.length||l||c(f)},m.prototype.run=function(){this.fun.apply(null,this.array)},a.title="browser",a.browser=!0,a.env={},a.argv=[],a.version="",a.versions={},a.on=h,a.addListener=h,a.once=h,a.off=h,a.removeListener=h,a.removeAllListeners=h,a.emit=h,a.prependListener=h,a.prependOnceListener=h,a.listeners=function(e){return[]},a.binding=function(e){throw new Error("process.binding is not supported")},a.cwd=function(){return"/"},a.chdir=function(e){throw new Error("process.chdir is not supported")},a.umask=function(){return 0}},function(e,t,n){"use strict";var r=n(48);e.exports=r;var a=l(!0),o=l(!1),i=l(null),c=l(void 0),s=l(0),u=l("");function l(e){var t=new r(r._61);return t._81=1,t._65=e,t}r.resolve=function(e){if(e instanceof r)return e;if(null===e)return i;if(void 0===e)return c;if(!0===e)return a;if(!1===e)return o;if(0===e)return s;if(""===e)return u;if("object"==typeof e||"function"==typeof e)try{var t=e.then;if("function"==typeof t)return new r(t.bind(e))}catch(e){return new r((function(t,n){n(e)}))}return l(e)},r.all=function(e){var t=Array.prototype.slice.call(e);return new r((function(e,n){if(0===t.length)return e([]);var a=t.length;function o(i,c){if(c&&("object"==typeof c||"function"==typeof c)){if(c instanceof r&&c.then===r.prototype.then){for(;3===c._81;)c=c._65;return 1===c._81?o(i,c._65):(2===c._81&&n(c._65),void c.then((function(e){o(i,e)}),n))}var s=c.then;if("function"==typeof s)return void new r(s.bind(c)).then((function(e){o(i,e)}),n)}t[i]=c,0==--a&&e(t)}for(var i=0;i<t.length;i++)o(i,t[i])}))},r.reject=function(e){return new r((function(t,n){n(e)}))},r.race=function(e){return new r((function(t,n){e.forEach((function(e){r.resolve(e).then(t,n)}))}))},r.prototype.catch=function(e){return this.then(null,e)}},,function(e,t,n){"use strict";n.d(t,"d",(function(){return s})),n.d(t,"b",(function(){return l})),n.d(t,"c",(function(){return d})),n.d(t,"a",(function(){return p}));var r=n(58),a=n(47),o=n(10),i=n(0),c=n(2),s=function(e,t){if("string"!=typeof e)return Object(i.m)("a client_secret string",e,t);var n=Object(o.d)(e)||Object(r.b)(e);return null===n?Object(i.m)("a client secret of the form ${id}_secret_${secret}",e,t):Object(i.G)(n,[])},u=function(e,t){if("string"!=typeof e)return Object(i.m)("a client_secret string",e,t);var n=Object(r.b)(e);return null===n?Object(i.m)("a client secret of the form ${id}_secret_${secret}",e,t):Object(i.G)(n,[])},l=function(e,t){return Object(i.H)(u,e,"stripe.".concat(t," order secret")).value},d=function(e,t){if("string"!=typeof e)return Object(i.m)("a client_secret string",e,t);var n=Object(r.a)(e);return null===n?Object(i.m)("a client secret of the form ${id}_secret_${secret}",e,t):Object(i.G)(n,[])},p=function(){var e,t,n,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if((null==r||null===(e=r.allowedCardBrands)||void 0===e?void 0:e.length)&&(null==r||null===(t=r.disallowedCardBrands)||void 0===t?void 0:t.length))throw new c.b("You cannot specify both disallowedCardBrands and allowedCardBrands. Please specify only one of those parameters.");if((null==r||null===(n=r.disallowedCardBrands)||void 0===n?void 0:n.length)===a.a.length)throw new c.b("You cannot block all available card brands.")}},function(e,t,n){"use strict";(function(t){function n(e){a.length||(r(),!0),a[a.length]=e}e.exports=n;var r,a=[],o=0;function i(){for(;o<a.length;){var e=o;if(o+=1,a[e].call(),o>1024){for(var t=0,n=a.length-o;t<n;t++)a[t]=a[t+o];a.length-=o,o=0}}a.length=0,o=0,!1}var c,s,u,l=void 0!==t?t:self,d=l.MutationObserver||l.WebKitMutationObserver;function p(e){return function(){var t=setTimeout(r,0),n=setInterval(r,50);function r(){clearTimeout(t),clearInterval(n),e()}}}"function"==typeof d?(c=1,s=new d(i),u=document.createTextNode(""),s.observe(u,{characterData:!0}),r=function(){c=-c,u.data=c}):r=p(i),n.requestFlush=r,n.makeRequestCallFromTimer=p}).call(this,n(54))},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";var r=n(48);e.exports=r,r.prototype.finally=function(e){return this.then((function(t){return r.resolve(e()).then((function(){return t}))}),(function(t){return r.resolve(e()).then((function(){throw t}))}))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));var r=n(43),a=n(10),o=function(e,t,n){return Object(r.a)(t).then((function(t){return Object(r.b)(n,"next_action redirect",t),Object(a.g)(t,e)}))},i=function(e,t,n){return Object(r.a)(t).then((function(t){return Object(r.b)(n,"next_action redirect",t),Object(a.h)(t,e)}))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return a}));var r={margin:"0",padding:"0",border:"none",display:"block",background:"transparent",position:"relative",opacity:"1",clear:"both"},a={border:"none",display:"block",position:"absolute",height:"1px",top:"-1px",left:"0",padding:"0",margin:"0",width:"100%",opacity:"0",background:"transparent","pointer-events":"none","font-size":"16px"}},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return o}));var r=n(20),a=(n(0),n(10),function(e){var t=e.trim().match(/^((order)_[^_]+)_secret_[^-]+$/);if(t){var n=Object(r.a)(t,3),a=n[0],o=n[1];if("order"===n[2])return{id:o,clientSecret:a,type:"ORDER"}}return null}),o=function(e){var t=e.trim().match(/^((cart_session)_[^_]+)_secret_[^-]+$/);if(t){var n=Object(r.a)(t,3),a=n[0],o=n[1];if("cart_session"===n[2])return{id:o,clientSecret:a,type:"CART_SESSION"}}return null}},function(e,t,n){"use strict";n.d(t,"b",(function(){return h})),n.d(t,"a",(function(){return _}));var r=n(14),a=n(1),o=n(6),i=n(13),c=n(0),s=n(19),u=n(2),l={clientSecret:Object(c.w)(c.B),redirect:Object(c.w)(Object(c.u)("always","if_required")),confirmParams:Object(c.w)(c.t),handleActions:Object(c.w)(c.e)},d=Object(a.a)(Object(a.a)({},l),{},{element:Object(c.w)(c.t)}),p=Object(a.a)(Object(a.a)({},l),{},{elements:Object(c.w)(c.t)}),f={"stripe.confirmPayment()":{link:"https://stripe.com/docs/js/payment_intents/payment_method",action:"Payment"},"stripe.confirmSetup()":{link:"https://stripe.com/docs/js/setup_intents/payment_method",action:"Setup"}},m=function(e,t,n){var r=t.rawSecret,a=t.rawElement,s=t.rawElements,l=t.rawHandleActions,d=t.rawRedirect,p=t.validatedConfirmParams;if(Object(o.d)(e,o.a.payment_element_beta_1)){var m=Object(c.c)(a);if(!m)throw new u.b("Invalid value for ".concat(n,": `element` should be a Payment Element. You specified: ").concat(typeof a,"."));return{type:"elements",element:m}}if(function(e,t){var n=e.rawSecret,r=e.rawElements;if(n&&r)throw new u.b("".concat(t,": expected either `elements` or `clientSecret`, but not both."));if(!n&&!r)throw new u.b("".concat(t,": expected either `elements` or `clientSecret`, but got neither."))}({rawElements:s,rawSecret:r},n),d&&!1===l)throw new u.b("".concat(n,": `redirect` not applicable when `handleActions` is false."));if(r){if((null==p?void 0:p.payment_method)&&(null==p?void 0:p.payment_method_data))throw new u.b("".concat(n,": Expected either `payment_method` or `payment_method_data`, but not both."));return{type:"clientSecret",clientSecret:r}}var h=Object(c.d)(s);if(!h)throw new u.b("Invalid value for ".concat(n,": elements should be an Elements group. You specified: ").concat(typeof s,"."));var _=Object(i.a)(h._elements,(function(e){return"payment"===e._componentName}));if(!_)throw new u.b("Invalid value for ".concat(n,": elements should have a mounted Payment Element. ").concat(function(e,t){if(e&&f[t]){var n=f[t],r=n.link,a=n.action;return"It looks like you have other Elements on the page. Refer to ".concat(r," to confirm a ").concat(a," Intent by payment method.")}return""}(!!h._elements.length,n)));return{type:"elements",elements:h,element:_}},h=function(e){return Object(o.d)(e,o.a.payment_element_beta_1)?d:p},_=function(e,t,n,i,l,d){var p,f=function(e){var t=e.betas,n=e.rawUpdateData,r=e.errorMessageMethodName,a=e.controller,i=Object(c.H)(Object(c.y)(h(t)),n,r),s=i.value,l=s.element,d=void 0===l?void 0:l,p=s.elements,f=void 0===p?void 0:p,_=s.confirmParams,b=s.clientSecret,y=s.redirect,v=s.handleActions,O=i.warnings,g=Object(c.H)(Object(c.w)(Object(c.y)({return_url:Object(c.w)(c.B),payment_method:Object(c.w)(c.B),payment_method_data:Object(c.w)(c.t),payment_method_options:Object(c.w)(c.t),setup_future_usage:Object(c.p)("".concat(r,": do not pass setup_future_usage at confirm time. Instead, pass setup_future_usage when the PaymentIntent is created."))})),_,r,{path:["confirmParams"]}).value,j=m(t,{rawSecret:b,rawElement:d,rawElements:f,rawHandleActions:v,rawRedirect:y,validatedConfirmParams:g},r);if("clientSecret"===j.type&&!Object(o.d)(t,o.a.server_side_confirmation_beta_1))throw new u.b("".concat(r," with a `clientSecret` is not supported yet. Please use the Payment Element."));var w=y||"always",k=(null==g?void 0:g.return_url)||null;return O.forEach((function(e){return a.warn(e)})),{validatedRedirect:w,validatedReturnUrl:k,validatedParams:j,validatedConfirmParams:g,validatedHandleActions:!1!==v,rawConfirmParams:_}}({betas:n,rawUpdateData:i,controller:e,errorMessageMethodName:d}),_=f.validatedParams,b=f.validatedConfirmParams,y=f.validatedRedirect,v=f.validatedHandleActions,O=f.validatedReturnUrl,g=f.rawConfirmParams,j=null!=g?g:{},w=(j.payment_method,j.payment_method_data,j.payment_method_options,Object(r.a)(j,["payment_method","payment_method_data","payment_method_options"]));if(p="clientSecret"===_.type?function(e){var t,n=e.validatedParams,r=e.validatedConfirmParams,o=e.validatedHandleActions,i=e.otherParams,c=e.intentType,u=e.mids,l=null!=r?r:{},d=l.payment_method_data,p=l.payment_method,f=l.payment_method_options,m="payment"===c?Object(s.k)(n.clientSecret,"confirmPayment"):Object(s.l)(n.clientSecret,"confirmSetup"),h=Object(s.h)({payment_method:d}),_={};return"none"!==(t=d&&h?{intentSecret:m,tag:"paymentMethod-from-data",type:h,data:d,options:null!=f?f:{}}:p?{intentSecret:m,tag:"paymentMethod",paymentMethod:p,options:null!=f?f:{}}:{intentSecret:m,tag:"none"}).tag&&"paymentMethod"!==t.tag||(_={use_stripe_sdk:!0,mandate_data:{customer_acceptance:{type:"online",online:{infer_from_client:!0}}}}),{mids:u,mode:t,expectedType:h,otherParams:Object(a.a)(Object(a.a)({},_),i),options:{handleActions:o}}}({validatedParams:_,validatedConfirmParams:b,validatedHandleActions:v,otherParams:w,intentType:l,mids:t}):function(e){var t,n,r,a,o=e.validatedParams,i=e.validatedConfirmParams,c=e.validatedHandleActions,s=e.otherParams,u=e.mids;return{mode:{tag:"elements",groupId:null===(t=o.elements)||void 0===t?void 0:t._id,frameId:null===(n=o.element)||void 0===n?void 0:n._implementation._frame.id,data:null!==(r=null==i?void 0:i.payment_method_data)&&void 0!==r?r:{},options:null!==(a=null==i?void 0:i.payment_method_options)&&void 0!==a?a:{}},otherParams:s,expectedType:null,mids:u,options:{handleActions:c}}}({validatedParams:_,validatedConfirmParams:b,validatedHandleActions:v,otherParams:w,mids:t}),"if_required"===y)return{intentMutationRequest:p,redirect:y,returnUrl:null};if("always"===y&&O)return{intentMutationRequest:p,redirect:y,returnUrl:O};throw new u.b("".concat(d,": the `confirmParams.return_url` argument is required unless passing `redirect: 'if_required'`"))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=function(e){var t={skipFingerprint:!1,sandboxFingerprintFrame:!1,sandboxChallengeFrame:!1,recordFinalCres:!1};return-1!==e.indexOf("Y")&&(t.skipFingerprint=!0),-1!==e.indexOf("k")&&(t.sandboxFingerprintFrame=!0),-1!==e.indexOf("5")&&(t.sandboxChallengeFrame=!0),-1!==e.indexOf("f")&&(t.recordFinalCres=!0),t},a=function(e){return e?{amount:e.amount,instrument:{cardBrand:e.instrument.card_brand,cardName:e.instrument.card_name,cardLast4:e.instrument.card_last4},merchant:{name:e.merchant.name,origin:e.merchant.origin},credentials:e.credentials,authenticationChallenge:e.authentication_challenge,configuration:e.configuration,layout:e.layout}:null},o=function(e){return{american_express:"amex",visa:"visa",mastercard:"mastercard",discover:"discover",unionpay:"unionpay"}[e]||"unknown"},i=function(e){if(!e)return null;if("use_stripe_sdk"===e.type){var t=e.use_stripe_sdk;switch(t.type){case"intent_cardimageverification_challenge":return{type:"cardimageverification-challenge",civId:t.stripe_js.card_image_verification_id,civClientSecret:t.stripe_js.card_image_verification_client_secret,previousScanFailed:t.stripe_js.previous_scan_failed};case"intent_confirmation_challenge":return{type:"captcha-challenge",site_key:t.stripe_js.site_key,verification_url:t.stripe_js.verification_url};case"stripe_3ds2_fingerprint":return{type:"3ds2-fingerprint",threeDS2Source:t.three_d_secure_2_source,merchant:t.merchant,cardBrand:o(t.directory_server_name),transactionId:t.server_transaction_id,optimizations:r(t.three_ds_optimizations),methodUrl:t.three_ds_method_url,oneClickAuthn:a(t.one_click_authn),publishableKey:t.publishable_key,threeDS2Intent:t.three_d_secure_2_intent};case"stripe_3ds2_challenge":return{type:"3ds2-challenge",threeDS2Source:t.stripe_js.three_d_secure_2_source,cardBrand:o(t.stripe_js.directory_server_name),transactionId:t.stripe_js.server_transaction_id,optimizations:r(t.stripe_js.three_ds_optimizations),acsTransactionId:t.stripe_js.acs_transaction_id,acsUrl:t.stripe_js.acs_url,oneClickAuthn:a(t.stripe_js.one_click_authn),creq:t.stripe_js.creq};case"three_d_secure_redirect":return{type:"3ds1-modal",url:t.stripe_js,source:t.source}}}if("redirect_to_url"===e.type)return{type:"redirect",redirectUrl:e.redirect_to_url.url};if("alipay_handle_redirect"===e.type)return{type:"redirect",redirectUrl:e.alipay_handle_redirect.url};if("blik_authorize"===e.type)return{type:"blik_authorize"};if("boleto_display_details"===e.type)return{type:"boleto-display",hostedVoucherUrl:e.boleto_display_details.hosted_voucher_url};if("display_oxxo_details"===e.type)return{type:"oxxo-display",hostedVoucherUrl:e.display_oxxo_details.hosted_voucher_url};if("konbini_display_details"===e.type)return{type:"konbini-display",hostedVoucherUrl:e.konbini_display_details.hosted_voucher_url};if("oxxo_display_details"===e.type)return{type:"oxxo-display",hostedVoucherUrl:e.oxxo_display_details.hosted_voucher_url};if("upi_await_notification"===e.type)return{type:"upi_await_notification"};if("wechat_pay_display_qr_code"===e.type)return{type:"wechat_pay_display_qr_code",qrCodeUrl:e.wechat_pay_display_qr_code.image_url_png};if("paynow_display_qr_code"===e.type)return{type:"paynow_display_qr_code",qrCodeUrl:e.paynow_display_qr_code.image_url_png};if("pix_display_qr_code"===e.type)return{type:"pix_display_qr_code",hostedInstructionsUrl:e.pix_display_qr_code.hosted_instructions_url};if("promptpay_display_qr_code"===e.type)return{type:"promptpay_display_qr_code",qrCodeUrl:e.promptpay_display_qr_code.image_url_png,qrCodeData:e.promptpay_display_qr_code.data,hostedInstructionsUrl:e.promptpay_display_qr_code.hosted_instructions_url};if("display_bank_transfer_instructions"===e.type){var n,i=e.display_bank_transfer_instructions.hosted_instructions_url;if("id_bban"===e.display_bank_transfer_instructions.financial_addresses[0].type)i=null!==(n=i)&&void 0!==n?n:e.display_bank_transfer_instructions.financial_addresses[0].id_bban.hosted_instructions_url;return{type:"display_bank_transfer_instructions",hostedInstructionsUrl:i,bankTransferType:e.display_bank_transfer_instructions.type}}return"qris_display_qr_code"===e.type?{type:"qris_display_qr_code",hostedInstructionsUrl:e.qris_display_qr_code.hosted_instructions_url}:null}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var r=n(20),a=n(1),o=n(12),i=n(8),c=n(3),s=n(33),u=n(27),l=function(e,t,n,l,d,p){var f=Object(o.f)(),m=new u.a,h=function(e,t,n,r,o){return e.createLightboxFrame({type:i.a.AUTHORIZE_WITH_URL,options:Object(a.a)({url:t,locale:o,intentId:n},r?{source:r}:{})})}(l,e.url,t.id,e.source,d);return h.show(),l.report("authorize_with_url.loading",{viewport:f,intentId:t.id}),h._on("load",(function(){l.report("authorize_with_url.loaded",{loadDuration:m.getElapsedTime(),intentId:t.id}),h.fadeInBackdrop()})),h._on("challenge_complete",(function(){h.fadeOutBackdrop()})),new c.a((function(a,o){var i=e.source;i&&h._once("cancel",(function(){c.a.all([Object(s.a)(t,n,l,i,d),h.destroy()]).then((function(e){var t=Object(r.a)(e,1)[0];return a(t)}))})),h._once("authorize_with_url_done",(function(){var e=h.destroy();Object(s.c)(t,n,l,d,p,(function(n,r){e.then((function(){l.report("authorize_with_url.done",{shownDuration:m.getElapsedTime(),success:!("error"in n),intentId:t.id,iterations:r}),a(n)}))}))}))}))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(3),a=n(19),o=n(8),i=n(27),c=function(e){return e?"payment_intent"===e.object?e.last_payment_error:e.last_setup_error:null},s=function(e,t,n,s){return new r.a((function(r,u){var l=new i.a,d=n.createLightboxFrame({type:o.a.HCAPTCHA_APP,options:{intentId:t.id,clientSecret:t.client_secret,locale:s,sitekey:e.site_key,verifyUrl:e.verification_url,startTime:l.getAsPosixTime()}}),p=function(e){var t=a.f;return null!=e&&(t=e),n.action.localizeError(t).then((function(e){return{error:e}}))};n.report("intent_confirmation_challenge.start"),d._on("load",(function(){n.report("intent_confirmation_challenge.stripe_js_frame_loaded",{duration_since_start_ms:l.getElapsedTime()}),d.fadeInBackdrop()})),d.show(),d._on("request-cancel",(function(e){d.fadeOutBackdrop(),d.destroy(!0),n.report("intent_confirmation_challenge.cancel"),r(p(c(null==e?void 0:e.intent)))})),d._on("request-close",(function(e){d.fadeOutBackdrop(),d.destroy(!0);var t=null==e?void 0:e.intent;if(t){var o=c(t);o?/Captcha/.test(o.message||"")?(n.report("intent_confirmation_challenge.verification_failed"),r(p(o))):(n.report("intent_confirmation_challenge.success"),r(p(o))):(n.report("intent_confirmation_challenge.success"),function(e,t){"payment_intent"===t.object?e({paymentIntent:t}):e({setupIntent:t})}(r,t))}else n.report("intent_confirmation_challenge.verification_error"),r(p(a.f))}))}))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return o}));var r=n(6),a=[r.a.checkout_beta_2,r.a.checkout_beta_3,r.a.checkout_beta_4],o=[r.a.checkout_beta_2,r.a.checkout_beta_3,r.a.checkout_beta_4,r.a.checkout_beta_locales,r.a.checkout_beta_testcards]},,function(e,t,n){"use strict";n.d(t,"a",(function(){return F}));var r=n(20),a=n(3),o=n(0),i=n(27),c=n(1),s=n(14),u=n(8),l=function(e,t){var n=t.intentSecret,r=t.controller,o=t.locale,i=t.hosted,c=r.createLightboxFrame({type:u.a.STRIPE_3DS2_CHALLENGE,options:{intentId:n.id,hosted:i,locale:o}});r.report("3ds2.challenge_frame.loading",{intentId:n.id,hosted:i}),c._on("challenge_complete",(function(){c.fadeOutBackdrop()}));var s=function(e){return new a.a((function(t){e._on("load",(function(){return t(e)}))}))}(c);return s.then((function(){return r.report("3ds2.challenge_frame.loaded",{intentId:n.id,hosted:i})})),i&&(c.show(),c.action.show3DS2Spinner({cardBrand:e.cardBrand})),s},d=function(e,t,n){var r=n.oneClickAuthnDeviceSupport,o=n.challengeFrame;return new a.a((function(t,n){o.then((function(a){var o=function(){return n(new Error("User canceled"))};a._once("cancel",o),a.isVisible||(a.show(),a.fadeInBackdrop());e.type;var i=e.optimizations,l=(e.oneClickAuthn,Object(s.a)(e,["type","optimizations","oneClickAuthn"]));a.action.perform3DS2Challenge(Object(c.a)(Object(c.a)({},l),{},{shouldSandbox:i.sandboxChallengeFrame,recordFinalCres:i.recordFinalCres,oneClickAuthnDeviceSupport:r,oneClickWebauthnEnrollmentAppUrl:Object(u.d)("one-click-webauthn-enrollment-b0e378c9fcf4bae80351276e65907f86.html")})).then((function(){a._off("cancel",o),t()}))}))}))},p=n(33),f=n(5),m=function(e){if(!e||"object"!=typeof e||!e.type&&!e.code)return e;var t=function(t){return e[t]&&"string"==typeof e[t]?Object(f.a)({},"".concat(t,"_id"),e[t]):e[t]&&"object"==typeof e[t]&&"string"==typeof e[t].id?Object(f.a)({},"".concat(t,"_id"),e[t].id):null};return Object(c.a)(Object(c.a)(Object(c.a)(Object(c.a)({type:e.type,code:e.code,param:e.param},t("payment_intent")),t("setup_intent")),t("payment_method")),t("source"))},h=function(e,t,n){var r=t.intentSecret,a=t.intentType,o=t.controller,i=t.locale;return Object(p.e)(r,a,o,i,n)},_=function(e,t){var n=t.controller,r=t.intentSecret,a=t.intentType,o=t.locale;return Object(p.a)(r,a,n,e.threeDS2Source,o,e.threeDS2Intent,e.publishableKey)},b=function(e,t){var n=e.intentSecret,o=e.controller,i=e.hosted,s=t.intent,u=t.challengeFrame,l=t.startTimestamp;return a.a.all([s,u.then((function(e){return e.destroy()}))]).then((function(e){var t=Object(r.a)(e,1)[0];return o.report("3ds2.done",Object(c.a)({intentId:n.id,hosted:i,totalDuration:l.getElapsedTime()},t.error?{error:m(t.error),success:!1}:{success:!0})),t}))},y=function(e){var t=e.intentSecret,n=e.controller,r=e.hosted,o=e.locale,i=n.createHiddenFrame(u.a.STRIPE_3DS2_FINGERPRINT,{intentId:t.id,locale:o,hosted:r});n.report("3ds2.fingerprint_frame.loading",{hosted:r,intentId:t.id});var c=function(e){return new a.a((function(t){e._on("load",(function(){return t(e)}))}))}(i);return c.then((function(){n.report("3ds2.fingerprint_frame.loaded",{hosted:r,intentId:t.id})})),c},v=function(e,t){var n=t.intentSecret,r=t.controller,o=t.hosted;return e.optimizations.skipFingerprint?a.a.resolve({fingerprintAttempted:!1,fingerprintData:null}):""===e.methodUrl?(r.report("3ds2.fingerprint.no_method_url",{hosted:o,intentId:n.id}),a.a.resolve({fingerprintAttempted:!1,fingerprintData:null})):y(t).then((function(t){return t.action.perform3DS2Fingerprint({threeDS2Source:e.threeDS2Source,merchant:e.merchant,transactionId:e.transactionId,methodUrl:e.methodUrl,shouldSandbox:e.optimizations.sandboxFingerprintFrame}).then((function(e){return t.destroy(),e}))}))},O=n(25),g=function(){if(void 0===window.PublicKeyCredential||function(){if(!/CrOS/i.test(window.navigator.userAgent))return!1;var e=window.navigator.userAgent.match(/Chrome\/\d+\.\d+\.(\d+)\.(\d+)/)||[],t=Number(e[1]),n=Number(e[2]);return!(4389===t&&n>=82||4430===t&&n>=11||t>=4431)}()||function(){var e=/iPad|iPhone/i.test(window.navigator.userAgent),t=/^((?!chrome|android).)*safari/i.test(window.navigator.userAgent)&&!/SamsungBrowser/.test(window.navigator.userAgent);if(!e||t)return!1;var n=window.navigator.userAgent.match(/OS (\d+)_(\d+)(_\d+)? like Mac OS X/)||[],r=parseInt(n[1],10),a=parseInt(n[2],10);return!isNaN(r)&&!isNaN(a)&&(15===r&&a>=4||r>15)}())return a.a.resolve(!1);var e=window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),t=new a.a((function(e){return setTimeout((function(){return e(!1)}),500)}));return a.a.race([e,t]).catch((function(){return!1}))},j=function(){if(void 0===window.PaymentRequest)return a.a.resolve(!1);if(!/Chrome\/(9[5-9]|[1-9]\d\d)/.test(window.navigator.userAgent))return a.a.resolve(!1);try{var e=[{supportedMethods:"secure-payment-confirmation",data:{action:"authenticate",credentialIds:[new Uint8Array(1)],challenge:new Uint8Array(1),fallbackUrl:window.location,rpId:"stripe.com",payeeOrigin:"https://stripe.com",instrument:{displayName:"Mock ····1234",icon:'data:image/svg+xml;utf8,<svg width="28" height="18" xmlns="http://www.w3.org/2000/svg"></svg>'}}}];return new window.PaymentRequest(e,{total:{label:"Total",amount:{currency:"USD",value:"0"}}}).canMakePayment().catch((function(){return!1}))}catch(e){return a.a.resolve(!1)}},w="stripe-js-one-click-authn",k="W",E="S",S="SE/WA",P=function(e){return btoa(String.fromCharCode.apply(null,new Uint8Array(e))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},A=function(e){return atob(e.replace(/-/g,"+").replace(/_/g,"/"))},I=function(e){var t=A(e);return Uint8Array.from(t,(function(e){return e.charCodeAt(0)}))},C=(n(68),n(69),n(70),function(e){return"data:image/svg+xml,".concat(encodeURIComponent(e.replace(/\n/g,"").replace(/\s+/g," ")))}),T=function(e){switch(e){case"visa":return C('<svg width="28" height="18" viewBox="0 0 24 16" xmlns="http://www.w3.org/2000/svg">\n  <g fill-rule="nonzero" fill="none">\n    <rect\n      stroke-opacity=".2"\n      stroke="#000"\n      stroke-width=".5"\n      fill="#FFF"\n      x=".3"\n      y=".3"\n      width="23.5"\n      height="15.5"\n      rx="2"\n    />\n    <path\n      d="M2.8 6c-.5-.4-1.1-.6-1.8-.8h2.8c.3 0 .6 0 .7.4l.6 2.9.2.8L7 5.1h1.8L6 11.3H4.3L2.8 5.9Zm7.3 5.3H8.4l1-6.2h1.8L10 11.3Zm6.2-6L16 6.6H16a3 3 0 0 0-1.3-.3c-.7 0-1 .3-1 .5 0 .3.4.5 1 .8 1 .4 1.4 1 1.4 1.7 0 1.2-1.2 2-3 2-.7 0-1.4 0-1.8-.3l.2-1.3h.2c.6.3 1 .4 1.6.4.5 0 1-.2 1-.6 0-.3-.2-.5-.8-.8-.7-.3-1.5-.8-1.5-1.7 0-1.2 1.2-2 2.8-2 .7 0 1.2.1 1.6.3ZM18.5 9H20l-.4-1.8v-.5l-.3.6-.7 1.7Zm2.1-4 1.4 6.2h-1.6l-.2-1H18l-.3 1h-1.8l2.5-5.7c.2-.4.5-.5 1-.5h1.2Z"\n      fill="#1434CB"\n    />\n  </g>\n</svg>');case"amex":return C('<svg width="28" height="18" viewBox="0 0 24 16" xmlns="http://www.w3.org/2000/svg">\n  <g fill="none" fill-rule="evenodd">\n    <rect fill="#016fd0" height="16" rx="2" width="24" />\n    <path\n      d="M13.8 13.4V7.7h10.1v1.6l-1.2 1.2 1.2 1.3v1.6H22l-1-1.1-1 1.1z"\n      fill="#fffffe"\n    />\n    <path\n      d="M14.4 12.8V8.3h3.8v1h-2.5v.7h2.5v1h-2.5v.7h2.5v1zM18.2 12.8l2-2.3-2-2.2h1.6l1.3 1.4 1.3-1.4h1.5l-2 2.2 2 2.2h-1.6l-1.2-1.4-1.3 1.5z"\n      fill="#016fd0"\n    />\n    <path\n      d="M14.2 2.6h2.5l.8 2v-2h3l.6 1.5.5-1.5H24v5.7H11.7z"\n      fill="#fffffe"\n    />\n    <g fill="#016fd0">\n      <path d="m14.7 3.3-2 4.4h1.4l.4-.9h2l.3.9h1.4l-2-4.4zm.2 2.5.6-1.4.6 1.4zM18.2 7.7V3.3h2L21 6l1-2.7h1.8v4.4h-1.2v-3l-1 3h-1.2l-1-3v3z" />\n    </g>\n  </g>\n</svg>');case"mastercard":return C('<svg width="28" height="18" viewBox="0 0 24 16" xmlns="http://www.w3.org/2000/svg">\n  <g fill="none" fill-rule="evenodd">\n    <rect fill="#252525" height="16" rx="2" width="24" />\n    <circle cx="9" cy="8" fill="#eb001b" r="5" />\n    <circle cx="15" cy="8" fill="#f79e1b" r="5" />\n    <path d="M12 4a5 5 0 0 1 0 8 5 5 0 0 1 0-8z" fill="#ff5f00" />\n  </g>\n</svg>');case"unionpay":case"discover":case"jcb":case"diners":case"unknown":case"elo":return C('<svg width="28" height="18" xmlns="http://www.w3.org/2000/svg"></svg>');default:return Object(o.a)(e)}},N=n(10),M=function(e,t,n){var r=e.threeDS2Source,o=e.oneClickAuthn,i=t.controller,s=n.deviceSupport,u=n.startTimestamp;if(!o)return a.a.resolve(null);var l=o.credentials.filter((function(e){return e.type===N.a}));if(0===l.length)return i.report("one_click_authn.request_spc_authn.empty_credentials_list",{client_id:w,source:r,device_support:s}),a.a.resolve(null);try{var d=o.merchant.origin;if(!d)return i.report("one_click_authn.request_spc_authn.empty_merchant_origin",{client_id:w,source:r,device_support:s}),a.a.resolve(null);var p=new window.PaymentRequest(function(e,t,n){var r=n.authenticationChallenge,a=n.instrument,o=a.cardBrand,i=a.cardName,c=a.cardLast4,s=n.merchant;return[{supportedMethods:"secure-payment-confirmation",data:{action:"authenticate",rpId:"stripe.com",credentialIds:e.map((function(e){return I(e.id)})),challenge:I(r),timeout:6e4,fallbackUrl:window.location.toString(),instrument:{displayName:"".concat(i," ····").concat(c),icon:T(o)},payeeOrigin:t,payeeName:s.name}}]}(l,d,o),{total:{label:"Total",amount:o.amount}});return i.report("one_click_authn.request_spc_authn.prompted",{client_id:w,source:r,timeToComplete:u.getElapsedTime(),device_support:s}),p.show().then((function(e){var t;return e.complete("success"),i.report("one_click_authn.request_spc_authn.completed",{client_id:w,source:r,timeToComplete:u.getElapsedTime(),device_support:s}),{type:N.a,assertion:(t=e.details,{type:"public-key",id:t.id,raw_id:t.id,response:{authenticator_data:P(t.response.authenticatorData),client_data_json:P(t.response.clientDataJSON),signature:P(t.response.signature)}}),payment_data:{merchant_data:{merchant_origin:d,total:o.amount},network_data:o.authenticationChallenge}}})).catch((function(e){var t={AbortError:"request_aborted",InvalidStateError:"payment_already_shown",NotSupportedError:"payment_method_not_supported",SecurityError:"security_error"}[e.name]||"unexpected_error";return i.report("one_click_authn.request_spc_authn.error",{reason:t,client_id:w,source:r,timeToError:u.getElapsedTime(),device_support:s,error:Object(c.a)({name:e.name,message:e.message},e)}),null}))}catch(e){i.report("one_click_authn.request_spc_authn.error",{client_id:w,reason:"unexpected_error",source:r,timeToError:u.getElapsedTime(),device_support:s,error:Object(c.a)({name:e.name,message:e.message},e)})}return a.a.resolve(null)},R=function(e,t,n){var r=t.controller,o=n.deviceSupport,i=n.challengeFrame,c=n.startTimestamp,s=e.oneClickAuthn;if(!s)return a.a.resolve(null);var l=function(e){var t=e.spcEligible,n=e.configurationType;return t&&(n===E||n===S)}(o)?N.a:N.b,d=s.credentials.filter((function(e){return e.type===l}));return 0===d.length?(r.report("one_click_authn.request_webauthn_authn.empty_credentials_list",{client_id:w,source:e.threeDS2Source,device_support:o}),a.a.resolve(null)):new a.a((function(t,n){i.then((function(r){var a=function(){return n(new Error("User canceled"))};r._once("cancel",a),r.isVisible||(r.show(),r.fadeInBackdrop());var i={amount:s.amount,instrument:s.instrument,merchant:s.merchant,authenticationChallenge:s.authenticationChallenge,layout:s.layout,allowCredentials:d};return r.action.performOneClickWebauthnAuthentication({threeDS2Source:e.threeDS2Source,cardBrand:e.cardBrand,appUrl:Object(u.d)("one-click-webauthn-authentication-112decb7ef95cfbe08e7924e5e140074.html"),deviceSupport:o,payload:i,startPosixTime:c.getAsPosixTime()}).then((function(e){r._off("cancel",a),t(e)}))}))}))},x=function(e,t){var n=e.threeDS2Source,r=e.oneClickAuthn,a=t.controller;if(!r)return null;var o=O.j?"safari":O.f?"firefox":O.c?O.a?"chrome_android":"chrome":O.e||O.d?"edge":null;if(!o)return a.report("one_click_authn.configuration.error",{client_id:w,reason:"browser_not_found",source:n}),null;try{switch(new URLSearchParams(A(r.configuration)).get(o)){case k:return k;case E:return E;case S:return S;default:return null}}catch(e){return a.report("one_click_authn.configuration.error",{client_id:w,reason:"unexpected_error",source:n,error:Object(c.a)({name:e.name,message:e.message},e)}),null}},B=function(){try{return 0==="https://js.stripe.com/v3/".indexOf(window.top.location.origin)}catch(e){return!1}},L=function(){var e=document.featurePolicy;if(!e)return!1;try{return-1!==e.allowedFeatures().indexOf("publickey-credentials-get")}catch(e){return!1}},D=function(e,t){return a.a.all([j(),g()]).then((function(n){var a=Object(r.a)(n,2),o=a[0],i=a[1];return{sameOriginFrame:B(),spcEligible:o,webauthnEligible:i,publickeyCredentialsGetAllowed:L(),configurationType:x(e,t)}}))},q=function(e,t,n){var r=n.challengeFrame,a=n.startTimestamp;return D(e,t).then((function(n){return i=(o=n).webauthnEligible,c=o.configurationType,!i||c!==k&&c!==S?function(e){var t=e.spcEligible,n=e.configurationType;return t&&n===E}(n)?M(e,t,{deviceSupport:n,startTimestamp:a}).then((function(e){return{deviceSupport:n,authenticationAPIParam:e}})):{deviceSupport:n,authenticationAPIParam:null}:R(e,t,{deviceSupport:n,challengeFrame:r,startTimestamp:a}).then((function(e){return{deviceSupport:n,authenticationAPIParam:e}}));var o,i,c}))},F=function(e,t,n){var c=new i.a,s=l(e,t);switch(e.type){case"3ds2-challenge":return D(e,t).then((function(r){return d(e,0,{oneClickAuthnDeviceSupport:r,challengeFrame:s}).then((function(){return b(t,{intent:h(0,t,n),challengeFrame:s,startTimestamp:c})}),(function(){return b(t,{intent:_(e,t),challengeFrame:s,startTimestamp:c})}))}));case"3ds2-fingerprint":return a.a.all([v(e,t),q(e,t,{challengeFrame:s,startTimestamp:c})]).then((function(n){var o=Object(r.a)(n,2),i=o[0],c=o[1];return function(e,t,n){var r=n.fingerprintResult,a=n.oneClickAuthn,o=t.controller,i=t.hosted,c=t.intentSecret;return o.report("3ds2.authenticate",{hosted:i,intentId:c.id}),o.action.authenticate3DS2({threeDS2Source:e.threeDS2Source,outerWindowWidth:window.innerWidth,hosted:i,fingerprintResult:r,oneClickAuthnDeviceSupportAPIParam:{hosted:i,same_origin_frame:a.deviceSupport.sameOriginFrame,spc_eligible:a.deviceSupport.spcEligible,webauthn_eligible:a.deviceSupport.webauthnEligible,publickey_credentials_get_allowed:a.deviceSupport.publickeyCredentialsGetAllowed},oneClickAuthnAuthenticationAPIParam:a.authenticationAPIParam,publishableKey:e.publishableKey}).then((function(e){return"error"===e.type?o.report("3ds2.authenticate.error",{error:e.error,hosted:i,intentId:c.id}):o.report("3ds2.authenticate.success",{hosted:i,intentId:c.id}),e}))}(e,t,{fingerprintResult:i,oneClickAuthn:c}).then((function(n){return function(e,t,n){var r=n.authenticateResponse,o=n.oneClickAuthnDeviceSupport,i=n.challengeFrame,c=t.controller,s=t.hosted,u=t.intentSecret;if("error"===r.type)return a.a.resolve();var l=r.object,p=l.state,f=l.ares,m=l.creq;return"delegated"===p||null===f?a.a.resolve():"C"!==f.transStatus||null==m?(c.report("3ds2.frictionless",{hosted:s,intentId:u.id}),a.a.resolve()):d({type:"3ds2-challenge",threeDS2Source:e.threeDS2Source,cardBrand:e.cardBrand,transactionId:e.transactionId,acsUrl:f.acsURL,acsTransactionId:f.acsTransID,optimizations:e.optimizations,oneClickAuthn:e.oneClickAuthn,creq:m,publishableKey:e.publishableKey},0,{oneClickAuthnDeviceSupport:o,challengeFrame:i})}(e,t,{authenticateResponse:n,oneClickAuthnDeviceSupport:c.deviceSupport,challengeFrame:s})}))})).then((function(){return b(t,{intent:h(0,t,n),challengeFrame:s,startTimestamp:c})}),(function(){return b(t,{intent:_(e,t),challengeFrame:s,startTimestamp:c})}));default:return Object(o.a)(e)}}},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return o}));var r=n(0),a=n(16),o=function(t){switch(t){case"ADDRESS_AUTOCOMPLETE":return Object(a.a)("checkout-inner-address-autocomplete-bebe72253eeb9b8dffd8d048a7fc5eb8.html");case"CARD_ELEMENT":return Object(a.a)("elements-inner-card-b54aca11d9705c95df51bafbacac9139.html");case"CONTROLLER":return Object(a.a)("controller-0d71f6aea26d3bc048d4f2547af0cf23.html");case"METRICS_CONTROLLER":return Object(a.a)("m-outer-6262077c14f753400d607dc30e70f1af.html");case"PAYMENT_REQUEST_ELEMENT":return Object(a.a)("elements-inner-payment-request-bedc699b26f8949c2d098f7712a2b16f.html");case"PAYMENT_REQUEST_BROWSER":return Object(a.a)("payment-request-inner-browser-9b48e20e81239ad4a2323c4262a4cc9d.html");case"PAYMENT_REQUEST_GOOGLE_PAY":return Object(a.a)("payment-request-inner-google-pay-dc0bfcab75ba4e8c06d95765fcf29361.html");case"IBAN_ELEMENT":return Object(a.a)("elements-inner-iban-5db20e4bbf9834e974ee7a844535c31b.html");case"IDEAL_BANK_ELEMENT":return Object(a.a)("elements-inner-ideal-bank-5edcc0a4d48f6b51bc51e432a2de3192.html");case"P24_BANK_ELEMENT":return Object(a.a)("elements-inner-p24-bank-0faf4f1683d3b80060a8ddf116a54e23.html");case"AUTHORIZE_WITH_URL":return Object(a.a)("authorize-with-url-inner-e356f6f5a0ae1626de7ac0571c7f44b1.html");case"STRIPE_3DS2_CHALLENGE":return Object(a.a)("three-ds-2-challenge-26ba49a6542c78ba002e5f7c0c25647b.html");case"STRIPE_3DS2_FINGERPRINT":return Object(a.a)("three-ds-2-fingerprint-17d1291c86bacb9a59bf661cf94c7d3c.html");case"AU_BANK_ACCOUNT_ELEMENT":return Object(a.a)("elements-inner-au-bank-account-ccefe3871fbd3271c613c473a8a1fae3.html");case"FPX_BANK_ELEMENT":return Object(a.a)("elements-inner-fpx-bank-628c5a1199a61841b27ca95de45ec8bf.html");case"LIGHTBOX_APP":return Object(a.a)("lightbox-inner-d28485d0256a05386dbefca9f3634abf.html");case"ISSUING_CARD_NUMBER_DISPLAY_ELEMENT":return Object(a.a)("elements-inner-issuing-card-number-display-0b2f3a9b740c6dad18ea7b976ec9efa5.html");case"ISSUING_CARD_COPY_BUTTON_ELEMENT":return Object(a.a)("elements-inner-issuing-card-copy-button-70be48d6bfc4f6f71b777c76b0f9ceb1.html");case"ISSUING_CARD_CVC_DISPLAY_ELEMENT":return Object(a.a)("elements-inner-issuing-card-cvc-display-10a94e5ed04153df763a4365c95481d4.html");case"ISSUING_CARD_EXPIRY_DISPLAY_ELEMENT":return Object(a.a)("elements-inner-issuing-card-expiry-display-63e9ef233a798a95516ddf3149026051.html");case"ISSUING_CARD_PIN_DISPLAY_ELEMENT":return Object(a.a)("elements-inner-issuing-card-pin-display-8101e8d254b62bbdcb9f8f9fd1cbc9f6.html");case"EPS_BANK_ELEMENT":return Object(a.a)("elements-inner-eps-bank-e00f58994f40a34c021d28f946de891c.html");case"HCAPTCHA_APP":return Object(a.a)("hcaptcha-inner-ab097c8938601edcd00a6ccb0bc78c68.html");case"NETBANKING_BANK_ELEMENT":return Object(a.a)("elements-inner-netbanking-bank-593e5a5d16212176cf19e62d2862605e.html");case"AFFIRM_MESSAGE_ELEMENT":return Object(a.a)("elements-inner-affirm-message-75ec47ef2d77af26c63732e9c0499033.html");case"AFFIRM_MESSAGE_MODAL_ELEMENT":return Object(a.a)("elements-inner-affirm-message-modal-de0e69a427bacbda09eeb6ce6df18672.html");case"AFTERPAY_MESSAGE_MODAL_ELEMENT":return Object(a.a)("elements-inner-afterpay-message-modal-4ced4f904892477964979de90ad4ab60.html");case"INSTANT_DEBITS_APP":return Object(a.a)("instant-debits-app-4639be63fea30e0ee4cfb857506005da.html");case"LINK_AUTHENTICATION_ELEMENT":return Object(a.a)("elements-inner-authentication-ad661929290dc34e196308f0f05c7b1c.html");case"PAYMENT_ELEMENT":return Object(a.a)("elements-inner-payment-c61927b876fe950fd9bc18c7ec09c84a.html");case"LINKED_ACCOUNTS_INNER":return Object(a.a)("linked-accounts-inner-426f7ec862e2e4cad070ba813e1280b9.html");case"WECHAT_PAY_INNER":return Object(a.a)("wechat-pay-inner-c99528be9b946f045e464d98ebd01419.html");case"PAYNOW_INNER":return Object(a.a)("paynow-inner-58d147d490a8c2f94a072437fab3819a.html");case"PIX_INNER":return Object(a.a)(e.env.PIX_INNER_HTML_NAME);case"PROMPTPAY_INNER":return Object(a.a)(e.env.PROMPTPAY_INNER_HTML_NAME);case"SHIPPING_ADDRESS_ELEMENT":return Object(a.a)("elements-inner-shipping-address-f5115c9f7a580797ec225071ffd46e9b.html");case"LINK_AUTOFILL_MODAL":return Object(a.a)("link-autofill-modal-inner-0ff832b966ba80b7bf307cc7c0e1336a.html");case"GOOGLE_MAPS_APP":return Object(a.a)("google-maps-inner-961f0fc5abdc7099717a23884de273f6.html");case"AUTOCOMPLETE_SUGGESTIONS_ELEMENT":return Object(a.a)("elements-inner-autocomplete-suggestions-d9079ddf6611e7bea30800a66cf9d70f.html");case"ACH_BANK_SEARCH_RESULTS_ELEMENT":return Object(a.a)("elements-inner-ach-bank-search-results-5afd2b6fc97fe0373ad6a5bb1ff838bf.html");case"LINK_INFO_MODAL":return Object(a.a)("elements-inner-link-info-modal-1d956cd71290f3300cc952d8cf41f2c9.html");case"LOADER_UI_APP":return Object(a.a)("elements-inner-loader-ui-fffe4f738905b19a332ef79c95b528d7.html");case"CART_ELEMENT":return Object(a.a)("elements-inner-cart-bcb1da70255e5767f76b4d2a0f4b19bf.html");case"BACS_MANDATE_CONFIRMATION_APP":return Object(a.a)("bacs-mandate-confirmation-inner-cb7e6763e84b39bee786f69327492fa9.html");case"BACS_CONFIRMATION_INNER":return Object(a.a)(e.env.BACS_CONFIRMATION_INNER);case"LINK_LOGIN":return Object(a.a)("link-login-inner-f02c5eba95d563f4ab1cd31d7c0b389c.html");default:return Object(r.a)(t)}}}).call(this,n(49))},function(e,t){e.exports=function(e){var t=e.split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return(e<<5)-e+t&(e<<5)-e+t}),0).toString();return"_".concat(t.replace(/[-.]/g,"_"))}},function(e,t,n){e.exports=n.p+"fingerprinted/img/visa-0daded1e4b9a21ae5304a6794bb9e46a.svg"},function(e,t,n){e.exports=n.p+"fingerprinted/img/amex-3440dd14f9308959e71dfef65267235f.svg"},function(e,t,n){e.exports=n.p+"fingerprinted/img/mastercard-4868931ddf88ab0fc551d18a1a859ff7.svg"},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return u}));var r=n(1),a=n(14),o=n(73),i=n(43),c=n(13),s=function(t,n){var r=n;return Boolean(e.env.STRIPE_JS_COMPILE_DEVAPP)&&window.__STRIPE_CHECKOUT_URL_OVERRIDE__&&(r=n.replace(/^https?:\/\/[^/]+\//,window.__STRIPE_CHECKOUT_URL_OVERRIDE__)),Object(i.a)(r).then((function(e){return Object(i.b)(t,"redirectToCheckout",e),{error:e.error}}))},u=function(e,t,n,i,u){var l=Object(o.a)(t,i,u,e.keyMode());if(e.report("redirect_to_checkout.options",{betas:t,options:Object(c.h)(l,["mode","sessionId"]),globalLocale:i}),"session"===l.tag){var d=l.sessionId;return e.action.createPaymentPageWithSession({betas:t,mids:n(),sessionId:d}).then((function(t){if("error"===t.type)return{error:t.error};var n=t.object.url;return s(e,n)}))}var p=l,f=(p.tag,p.items),m=p.lineItems,h=p.mode,_=p.successUrl,b=p.cancelUrl,y=p.clientReferenceId,v=p.customerEmail,O=p.billingAddressCollection,g=p.submitType,j=p.allowIncompleteSubscriptions,w=p.shippingAddressCollection,k=Object(a.a)(p,["tag","items","lineItems","mode","successUrl","cancelUrl","clientReferenceId","customerEmail","billingAddressCollection","submitType","allowIncompleteSubscriptions","shippingAddressCollection"]),E=[];if(m&&f)throw new Error("Only one of items, lineItems can be passed in.");if(m){if(!h)throw new Error("Expected `mode`");E=m.map((function(e){if(e.price)return{type:"price",id:e.price,quantity:e.quantity};throw new Error("Unexpected item shape.")}))}else{if(!f)throw new Error("An items field must be passed in.");E=f.map((function(e){if("sku"in e)return{type:"sku",id:e.sku,quantity:e.quantity};if(e.plan)return{type:"plan",id:e.plan,quantity:e.quantity};throw new Error("Unexpected item shape.")}))}return e.action.createPaymentPage(Object(r.a)({betas:t,mids:n(),items:E,mode:h,success_url:_,cancel_url:b,client_reference_id:y,customer_email:v,billing_address_collection:O,submit_type:g,allow_incomplete_subscriptions:j,shipping_address_collection:w&&{allowed_countries:w.allowedCountries}},k)).then((function(t){if("error"===t.type)return{error:t.error};var n=t.object.url;return s(e,n)}))}}).call(this,n(49))},,function(e,t,n){"use strict";var r=n(14),a=n(1),o=n(7),i={bg:"bg",cs:"cs",da:"da",de:"de",el:"el",en:"en","en-GB":"en-GB",es:"es","es-419":"es-419",et:"et",fi:"fi",fil:"fil",fr:"fr","fr-CA":"fr-CA",hr:"hr",hu:"hu",id:"id",it:"it",ja:"ja",ko:"ko",lt:"lt",lv:"lv",ms:"ms",mt:"mt",nb:"nb",nl:"nl",pl:"pl",pt:"pt","pt-BR":"pt-BR",ro:"ro",ru:"ru",sk:"sk",sl:"sl",sv:"sv",th:"th",tr:"tr",vi:"vi",zh:"zh","zh-HK":"zh-HK","zh-TW":"zh-TW"},c={"pt-PT":"pt-PT"},s=Object.keys(i),u=Object.keys(c),l=n(63),d=n(0),p=n(6),f=n(2),m=n(15),h=n(13),_={sku:Object(d.w)(d.B),plan:Object(d.w)(d.B),clientReferenceId:Object(d.w)(d.B),locale:Object(d.w)(d.u.apply(void 0,["auto"].concat(Object(o.a)(s)))),customerEmail:Object(d.w)(d.B),billingAddressCollection:Object(d.w)(Object(d.u)("required","auto")),submitType:Object(d.w)(Object(d.u)("auto","pay","book","donate")),allowIncompleteSubscriptions:Object(d.w)(d.e),shippingAddressCollection:Object(d.w)(Object(d.h)({allowedCountries:Object(d.b)(d.B)}))},b=/cs_(test|live)_.+/,y=function(e,t){var n=Object(d.h)(Object(a.a)(Object(a.a)({},_),{},{items:Object(d.w)(Object(d.x)(Object(d.b)(Object(d.h)({type:Object(d.u)("plan"),quantity:Object(d.s)(0),id:d.B})),Object(d.b)(Object(d.h)({type:Object(d.u)("sku"),quantity:Object(d.s)(0),id:d.B})))),successUrl:d.B,cancelUrl:d.B})),o=Object(d.H)(n,t,"stripe.redirectToCheckout").value,i=o.sku,c=o.plan,s=o.items,u=Object(r.a)(o,["sku","plan","items"]),l=function(e,t,n){if(e&&t||(e||t)&&n)throw new f.b("stripe.redirectToCheckout: Expected only one of sku, plan, or items.");if("string"==typeof e)return[{sku:e,quantity:1}];if("string"==typeof t)return[{plan:t,quantity:1}];if(n)return n.map((function(e){return"sku"===e.type?{sku:e.id,quantity:e.quantity}:{plan:e.id,quantity:e.quantity}}));throw new f.b("stripe.redirectToCheckout: You must provide either sku, plan, or items.")}(i,c,s);return Object(a.a)({tag:"no-session",items:l},u)},v=function(e,t,n){var i=Object(d.h)(Object(a.a)(Object(a.a)({},_),{},{sessionId:Object(d.w)(d.B),successUrl:Object(d.w)(d.B),cancelUrl:Object(d.w)(d.B),mode:Object(d.w)(Object(d.u)("subscription","payment")),items:Object(d.w)(Object(d.x)(Object(d.b)(Object(d.h)({quantity:Object(d.s)(0),plan:d.B})),Object(d.b)(Object(d.h)({quantity:Object(d.s)(0),sku:d.B})))),lineItems:Object(d.w)(Object(d.b)(Object(d.h)({quantity:Object(d.s)(0),price:d.B})))},-1!==e.indexOf("checkout_beta_locales")?{locale:Object(d.w)(d.u.apply(void 0,["auto"].concat(Object(o.a)(s),Object(o.a)(u))))}:{})),c=Object(d.H)(i,t,"stripe.redirectToCheckout").value;if(c.sessionId){var l=c.sessionId;if(Object.keys(c).length>1)throw new f.b("stripe.redirectToCheckout: Do not provide other parameters when providing sessionId. Specify all parameters on your server when creating the CheckoutSession.");if(!/^cs_/.test(l))throw new f.b("stripe.redirectToCheckout: Invalid value for sessionId. You specified '".concat(l,"'."));if("live"===n&&/^cs_test_/.test(l))throw new f.b("stripe.redirectToCheckout: the provided sessionId is for a test mode Checkout Session, whereas Stripe.js was initialized with a live mode publishable key.");if("test"===n&&/^cs_live_/.test(l))throw new f.b("stripe.redirectToCheckout: the provided sessionId is for a live mode Checkout Session, whereas Stripe.js was initialized with a test mode publishable key.");return{tag:"session",sessionId:l}}c.sessionId,c.sku,c.plan;var p=c.items,m=c.lineItems,h=c.successUrl,b=c.cancelUrl,y=c.mode,v=Object(r.a)(c,["sessionId","sku","plan","items","lineItems","successUrl","cancelUrl","mode"]);if(!m&&!p)throw new f.b("stripe.redirectToCheckout: You must provide one of lineItems, items, or sessionId.");if(!h||!b)throw new f.b("stripe.redirectToCheckout: You must provide successUrl and cancelUrl.");return Object(a.a)({tag:"no-session",items:p,lineItems:m,successUrl:h,cancelUrl:b,mode:y},v)},O=function(e,t,n){var r=v(e,t,n);if("no-session"===r.tag){var a=r.successUrl,o=r.cancelUrl;if(!Object(m.d)(a))throw new f.b("stripe.redirectToCheckout: successUrl must start with either http:// or https://.");if(!Object(m.d)(o))throw new f.b("stripe.redirectToCheckout: cancelUrl must start with either http:// or https://.");return r}return r},g=function(e,t){return"session"===t.tag||null==e||t.locale||-1===["auto"].concat(Object(o.a)(s)).indexOf(e)?t:Object(a.a)(Object(a.a)({},t),{},{locale:e})},j=function(e,t,n){var r=Object(h.a)(l.b,(function(t){return Object(p.d)(e,t)}));if(t&&t.lineItems&&r)throw new f.b("Prices cannot be used with ".concat(r));if("string"==typeof t&&b.test(t))throw new f.b("stripe.redirectToCheckout: Checkout Session IDs must be passed in as an object with a key of `sessionId` and the Session ID as the value.");switch(r){case"checkout_beta_2":return y(0,t);case"checkout_beta_3":return v(e,t,n);case"checkout_beta_4":default:return O(e,t,n)}};t.a=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"unknown";return g(t,j(e,n,r))}},function(e,t,n){e.exports=n(87)},,,,,,,,,,,,,function(e,t,n){"use strict";n.r(t);var r,a,o,i,c,s=n(1),u=n(7),l=n(9),d=n(23),p=n(5),f=n(14),m=n(0),h="00".concat(Math.floor(1e3*Math.random())).slice(-3),_=0,b=function(e){return"".concat(e).concat(h).concat(_++)},y=function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return t?(parseInt(t,10)^16*Math.random()>>parseInt(t,10)/4).toString(16):"00000000-0000-4000-8000-000000000000".replace(/[08]/g,e)},v=n(12),O=n(25),g=n(15),j=n(6),w=n(13),k=n(2),E=n(3),S=function(e){var t=e.data,n=e.contentType,r=void 0===n?"application/x-www-form-urlencoded":n,a=e.method,o=e.url,i="";return t&&"application/x-www-form-urlencoded"===r?i=Object(g.j)(t):t&&"application/json"===r&&(i=JSON.stringify(t)),{requestUrl:"GET"===a&&i?"".concat(o,"?").concat(i):o,requestData:"GET"===a?"":i,contentType:r}},P=function(e){return new E.a((function(t,n){var r=e.method,a=e.headers,o=e.withCredentials,i=S(e),c=i.requestUrl,u=i.requestData,l=i.contentType,d=new XMLHttpRequest;o&&(d.withCredentials=o),d.open(r,c,!0),d.setRequestHeader("Accept","application/json"),d.setRequestHeader("Content-Type",l),d.json=function(){return new E.a((function(e,t){try{e(JSON.parse(d.responseText))}catch(e){t(new k.a(e,c))}}))},a&&Object.keys(a).forEach((function(e){var t=a[e];"string"==typeof t&&d.setRequestHeader(e,t)})),d.onreadystatechange=function(){4===d.readyState&&(d.onreadystatechange=function(){},0===d.status?o?n(new k.c(c)):I(Object(s.a)(Object(s.a)({},e),{},{withCredentials:!0})).then(t,n):t(d))};try{d.send(u)}catch(e){n(new k.a(e,c))}}))},A=function e(t){return new E.a((function(n,r){var a=t.method,o=t.headers,i=void 0===o?{}:o,c=t.keepalive,u=t.withCredentials,l=S(t),d=l.requestUrl,p=l.requestData,f={Accept:"application/json","Content-Type":l.contentType};i&&Object.keys(i).forEach((function(e){var t=i[e];"string"==typeof t&&(f[e]=t)})),window.fetch(d,{method:a,keepalive:c,headers:f,body:p||void 0,mode:"cors",credentials:u?"include":"omit"}).then((function(a){if(0===a.status){if(!u)return e(Object(s.a)(Object(s.a)({},t),{},{withCredentials:!0})).then(n,r);r(new k.c(d))}return a.text().then((function(e){n({responseURL:a.url,status:a.status,json:function(){return E.a.resolve(JSON.parse(e))},getResponseHeader:function(e){return a.headers.get(e)||""},responseText:e})}))})).catch((function(e){r(new k.a(e,d))}))}))},I=function(e){return"function"==typeof window.fetch?A(e):P(e)},C=n(4),T=function(e,t){var n=e.reduce((function(e,n){var r=function(e,t){var n=e.indexOf(":");if(-1===n)throw new k.b("Invalid css declaration in file from ".concat(t,': "').concat(e,'"'));var r=e.slice(0,n).trim(),a=C.c[r];if(!a)throw new k.b("Unsupported css property in file from ".concat(t,': "').concat(r,'"'));return{property:a,value:e.slice(n+1).trim()}}(n,t),a=r.property,o=r.value;return Object(s.a)(Object(s.a)({},e),{},Object(p.a)({},a,o))}),{});return["family","src"].forEach((function(e){if(!n[e])throw new k.b("Missing css property in file from ".concat(t,': "').concat(C.h[e],'"'))})),n},N=function(e){return I({url:e,method:"GET"}).then((function(e){return e.responseText})).then((function(t){return function(e,t){var n=e.match(/@font-face[ ]?{[^}]*}/g);if(!n)throw new k.b("No @font-face rules found in file from ".concat(t));return n}(t,e).map((function(t){var n,r=function(e,t){var n=e.replace(/\/\*.*\*\//g,"").trim(),r=(n.length&&/;$/.test(n)?n:"".concat(n,";")).match(/((([^;(]*\([^()]*\)[^;)]*)|[^;]+)+)(?=;)/g);if(!r)throw new k.b("Found @font-face rule containing no valid font-properties in file from ".concat(t));return r}((n=t.match(/@font-face[ ]?{([^}]*)}/))?n[1]:"",e);return T(r,e)}))}))},M=/https?:\/\/([^/]*)\/[^:]*/g,R=function(e,t,n,r){var a,o,i,c=e._isUserError||"IntegrationError"===e.name;throw t&&!c&&t.report("fatal.uncaught_error",{iframe:!1,name:e.name,element:"outer",message:e.message||e.description,fileName:e.fileName,lineNumber:e.lineNumber,columnNumber:e.columnNumber,stack:e.stack&&(a=e.stack,o=a.match(M),i=a,o&&o.forEach((function(e){-1===e.indexOf("https://js.stripe.com")&&(i=i.replace(e,"<external url>"))})),i.substring(0,1e3)),inPromise:n,apiMethodName:r}),e},x=function(e,t,n){return function(r){try{return e.call(this,r)}catch(e){return R(e,t||this&&this._controller,!1,n)}}},B=function(e,t,n){return function(r,a){try{return e.call(this,r,a)}catch(e){return R(e,t||this&&this._controller,!1,n)}}},L=function(e,t,n){return function(){var r=this;try{return e.call(this).catch((function(e){return R(e,t||r&&r._controller,!0,n)}))}catch(e){return R(e,t||this&&this._controller,!1,n)}}},D=function(e,t,n){return function(r){var a=this;try{return e.call(this,r).catch((function(e){return R(e,t||a&&a._controller,!0,n)}))}catch(e){return R(e,t||this&&this._controller,!1,n)}}},q=function(e,t,n){return function(r,a){var o=this;try{return e.call(this,r,a).catch((function(e){return R(e,t||o&&o._controller,!0,n)}))}catch(e){return R(e,t||this&&this._controller,!1,n)}}},F=function(e,t,n){return function(r,a,o){var i=this;try{return e.call(this,r,a,o).catch((function(e){return R(e,t||i&&i._controller,!0,n)}))}catch(e){return R(e,t||this&&this._controller,!1,n)}}},U=n(38),H=function(e,t){var n,r="string"==typeof(n=e)&&Object(w.a)(Object.keys(U.b),(function(e){return e===n}))||null;if(!r||!function(e,t){var n=j.b[e];return!n||Object(j.d)(t,n)}(r,t)){var a="string"==typeof e?e:typeof e;throw new k.b("A valid Element name must be provided. Valid Elements are:\n  ".concat(Object.keys(U.b).filter((function(e){return!U.b[e].beta})).join(", "),"; you passed: ").concat(a,"."))}},G=n(21),z=n(17),K=n(18),Y=function e(){var t=this;Object(l.a)(this,e),this._emit=function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];var o=t._callbacks[e]||[];return o.forEach((function(e){var t=e.fn;if(t._isUserCallback)try{t.apply(void 0,r)}catch(e){throw e._isUserError=!0,e}else t.apply(void 0,r)})),t},this._once=function(e,n){return t._on(e,(function r(){t._off(e,r),n.apply(void 0,arguments)}),n)},this._removeAllListeners=function(){return t._callbacks={},t},this._on=function(e,n,r){return t._callbacks[e]=t._callbacks[e]||[],t._callbacks[e].push({original:r,fn:n}),t},this._validateUserOn=function(e,t){},this._userOn=function(e,n){if("string"!=typeof e)throw new k.b("When adding an event listener, the first argument should be a string event name.");if("function"!=typeof n)throw new k.b("When adding an event listener, the second argument should be a function callback.");return t._validateUserOn(e,n),n._isUserCallback=!0,t._on(e,n)},this._hasRegisteredListener=function(e){return t._callbacks[e]&&t._callbacks[e].length>0},this._off=function(e,n){if(n){for(var r,a=t._callbacks[e],o=0;o<a.length;o++)if((r=a[o]).fn===n||r.original===n){a.splice(o,1);break}}else delete t._callbacks[e];return t},this._callbacks={};var n,r,a,o=B(this._userOn),i=B(this._off),c=B(this._once),s=x(this._hasRegisteredListener),u=x(this._removeAllListeners),d=(n=this._emit,function(){try{for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.call.apply(n,[this].concat(t))}catch(e){return R(e,r||this&&this._controller,!1,a)}});this.on=this.addListener=this.addEventListener=o,this.off=this.removeListener=this.removeEventListener=i,this.once=c,this.hasRegisteredListener=s,this.removeAllListeners=u,this.emit=d},W=n(39),V={applePay:"applePay",googlePay:"googlePay",browserCard:"browserCard"},J=function(e,t){return e.indexOf(t)>=0},X=Object.keys(V),$="40px",Q={success:"success",fail:"fail",invalid_shipping_address:"invalid_shipping_address"},Z={shipping:"shipping",delivery:"delivery",pickup:"pickup"},ee=Object(s.a)({success:"success"},{fail:"fail",invalid_payer_name:"invalid_payer_name",invalid_payer_email:"invalid_payer_email",invalid_payer_phone:"invalid_payer_phone",invalid_shipping_address:"invalid_shipping_address"}),te={merchantCapabilities:["supports3DS"],displayItems:[]},ne=Object(m.y)({amount:m.o,label:m.B,pending:Object(m.w)(m.e)}),re=Object(m.y)({amount:m.f,label:m.B,pending:Object(m.w)(m.e)}),ae=Object(m.y)({amount:m.f,label:m.B,pending:Object(m.w)(m.e),id:Object(m.J)(m.B,(function(){return b("shippingOption")})),detail:Object(m.J)(m.B,(function(){return""}))}),oe=Object(m.y)({major:m.r,minor:m.r}),ie=m.u.apply(void 0,Object(u.a)(Object.keys(Z))),ce=Object(m.y)({origin:m.B,name:m.B}),se=m.u.apply(void 0,Object(u.a)(X)),ue=Object(m.y)({displayItems:Object(m.w)(Object(m.b)(re)),shippingOptions:Object(m.w)(Object(m.F)("id")(Object(m.b)(ae))),wallets:Object(m.w)(Object(m.b)(se)),disableWallets:Object(m.w)(Object(m.b)(se)),blockedCardBrands:Object(m.w)(Object(m.b)(m.u.apply(void 0,Object(u.a)(C.b)))),total:ne,requestShipping:Object(m.w)(m.e),requestPayerName:Object(m.w)(m.e),requestPayerEmail:Object(m.w)(m.e),requestPayerPhone:Object(m.w)(m.e),shippingType:Object(m.w)(ie),currency:m.D,country:m.C,jcbEnabled:Object(m.w)(m.e),__billingDetailsEmailOverride:Object(m.w)(m.B),__minApplePayVersion:Object(m.w)(m.r),__minGooglePayVersion:Object(m.w)(oe),__merchantDetails:Object(m.w)(ce),__isCheckout:Object(m.w)(m.e),__betas:Object(m.w)(Object(m.b)(m.v.apply(void 0,Object(u.a)(j.c))))}),le=Object(m.h)({__merchantDetails:Object(m.w)(ce),country:Object(m.w)(m.C),currency:Object(m.w)(m.D),displayItems:Object(m.w)(Object(m.b)(re)),shippingOptions:Object(m.w)(Object(m.F)("id")(Object(m.b)(ae))),total:Object(m.w)(ne),blockedCardBrands:Object(m.w)(Object(m.b)(m.u.apply(void 0,Object(u.a)(C.b))))}),de=Object(m.y)({displayItems:Object(m.w)(Object(m.b)(re)),shippingOptions:Object(m.w)(Object(m.F)("id")(Object(m.b)(ae))),total:Object(m.w)(ne),status:function(e,t){return m.u.apply(void 0,Object(u.a)(Object.keys(Q)))(-1!==["invalid_payer_name","invalid_payer_email","invalid_payer_phone"].indexOf(e)?"fail":e,t)}}),pe=m.u.apply(void 0,Object(u.a)(Object.keys(ee))),fe=function(){return window.ApplePaySession?["APPLE_PAY"]:["GOOGLE_PAY","BROWSER"]},me=function(e){var t=[];return window.ApplePaySession?J(e,V.applePay)&&t.push("APPLE_PAY"):(J(e,V.googlePay)&&(t.push("GOOGLE_PAY"),O.a&&t.push("BROWSER")),J(e,V.browserCard)&&-1===t.indexOf("BROWSER")&&t.push("BROWSER")),t},he=function(){try{return window.location.origin===window.top.location.origin}catch(e){return!1}},_e=Object(W.b)((function(e){return window.ApplePaySession.canMakePaymentsWithActiveCard(e)})),be=function(){return E.a.resolve(window.ApplePaySession.canMakePayments())},ye=function(e){if(!window.ApplePaySession)return!1;try{return window.ApplePaySession.supportsVersion(e)}catch(e){return!1}},ve=(r={},Object(p.a)(r,C.a.VISA,"visa"),Object(p.a)(r,C.a.MASTERCARD,"masterCard"),Object(p.a)(r,C.a.AMEX,"amex"),Object(p.a)(r,C.a.DISCOVER,"discover"),Object(p.a)(r,C.a.JCB,"jcb"),Object(p.a)(r,C.a.UNIONPAY,"chinaUnionPay"),Object(p.a)(r,C.a.DINERS,null),Object(p.a)(r,"MAESTRO","maestro"),r),Oe=(a={},Object(p.a)(a,C.a.VISA,"VISA"),Object(p.a)(a,C.a.MASTERCARD,"MASTERCARD"),Object(p.a)(a,C.a.AMEX,"AMEX"),Object(p.a)(a,C.a.DISCOVER,"DISCOVER"),Object(p.a)(a,C.a.JCB,"JCB"),Object(p.a)(a,C.a.DINERS,null),["AT","AU","BE","CA","CH","DE","DK","EE","ES","FI","FR","GB","GR","HK","IE","IT","JP","LT","LU","LV","MX","NL","NO","NZ","PL","PT","SE","SG","US"]),ge=function(e,t,n){var r=[];return-1!==Oe.indexOf(e)&&r.push(C.a.AMEX),("US"===e||t)&&r.push.apply(r,[C.a.DISCOVER,C.a.DINERS,C.a.JCB]),r.push.apply(r,[C.a.MASTERCARD,C.a.VISA]),r.filter((function(e){return-1===n.indexOf(e)}))},je=n(45),we=function(e,t){return{amount:Object(je.b)(e.amount,t.currency),label:e.label,type:e.pending?"pending":"final"}},ke=function(e,t){return new window.ApplePayError(e,t)},Ee=function(e){return function(t){return t[e]&&"string"==typeof t[e]?t[e].toUpperCase():null}},Se=(o={},Object(p.a)(o,ee.success,0),Object(p.a)(o,ee.fail,1),Object(p.a)(o,ee.invalid_payer_name,2),Object(p.a)(o,ee.invalid_shipping_address,3),Object(p.a)(o,ee.invalid_payer_phone,4),Object(p.a)(o,ee.invalid_payer_email,4),o),Pe=(i={},Object(p.a)(i,ee.success,(function(){return null})),Object(p.a)(i,ee.fail,(function(){return null})),Object(p.a)(i,ee.invalid_payer_name,(function(){return ke("billingContactInvalid","name")})),Object(p.a)(i,ee.invalid_shipping_address,(function(){return ke("shippingContactInvalid","postalAddress")})),Object(p.a)(i,ee.invalid_payer_phone,(function(){return ke("shippingContactInvalid","phoneNumber")})),Object(p.a)(i,ee.invalid_payer_email,(function(){return ke("shippingContactInvalid","emailAddress")})),i),Ae=(c={},Object(p.a)(c,Z.pickup,"storePickup"),Object(p.a)(c,Z.shipping,"shipping"),Object(p.a)(c,Z.delivery,"delivery"),c),Ie={total:function(e){return we(e.total,e)},lineItems:function(e){return e.displayItems?e.displayItems.map((function(t){return we(t,e)})):[]},shippingMethods:function(e){return e.shippingOptions?e.shippingOptions.map((function(t){return function(e,t){return{amount:Object(je.b)(e.amount,t.currency),label:e.label,detail:e.detail,identifier:e.id}}(t,e)})):[]},applicationData:function(e){return e.applicationData||null}},Ce={shippingType:function(e){var t=e.shippingType;if(!t)return null;var n=Ae[t];if(void 0!==n)return n;throw new k.b("Invalid value for shippingType: ".concat(t))},requiredBillingContactFields:function(e){return e.requestPayerName?["postalAddress"]:null},requiredShippingContactFields:function(e){var t=[];return e.requestShipping&&t.push("postalAddress"),e.requestPayerEmail&&t.push("email"),e.requestPayerPhone&&t.push("phone"),t.length?t:null},countryCode:Ee("country"),currencyCode:Ee("currency"),merchantCapabilities:function(e){var t=e.merchantCapabilities||te.merchantCapabilities;return e.__betas&&Object(j.d)(e.__betas,"cup_apple_pay_beta_1")&&t.push("supportsEMV"),t},supportedNetworks:function(e){var t,n,r,a=(t=e.country,n=e.jcbEnabled||!1,r=e.blockedCardBrands||[],ge(t,n,r).reduce((function(e,t){var n=ve[t];return n&&e.push(n),e}),[]));return ye(4)&&-1===(e.blockedCardBrands||[]).indexOf("mastercard")&&a.push("maestro"),e.__betas&&Object(j.d)(e.__betas,"cup_apple_pay_beta_1")&&-1===(e.blockedCardBrands||[]).indexOf("unionpay")&&a.push("chinaUnionPay"),a}},Te={status:function(e){var t=Se[e.status];return ye(3)&&t>1?1:t},error:function(e){return ye(3)?Pe[e.status]():null}},Ne=Object(s.a)(Object(s.a)({},Ie),Ce),Me=Object(s.a)(Object(s.a)({},Ie),Te),Re=function(e){return Object.keys(Me).reduce((function(t,n){var r=(0,Me[n])(e);return null!==r?Object(s.a)(Object(s.a)({},t),{},Object(p.a)({},n,r)):t}),{})},xe=function(e){return"string"==typeof e?e:null},Be=function(e){return e?xe(e.phoneNumber):null},Le=function(e){return e?xe(e.emailAddress):null},De=function(e){return e?[e.givenName,e.familyName].filter((function(e){return e&&"string"==typeof e})).join(" "):null},qe=function(e){var t=e.addressLines,n=e.countryCode,r=e.postalCode,a=e.administrativeArea,o=e.locality,i=e.phoneNumber,c=xe(n);return{addressLine:Array.isArray(t)?t.reduce((function(e,t){return"string"==typeof t?[].concat(Object(u.a)(e),[t]):e}),[]):[],country:c?c.toUpperCase():"",postalCode:xe(r)||"",recipient:De(e)||"",region:xe(a)||"",city:xe(o)||"",phone:xe(i)||"",sortingCode:"",dependentLocality:"",organization:""}},Fe=function(e,t){var n=e.identifier,r=e.label;return t.filter((function(e){return e.id===n&&e.label===r}))[0]},Ue=function(e,t){var n=e.shippingContact,r=e.shippingMethod,a=e.billingContact;return{shippingOption:r&&t.shippingOptions&&t.shippingOptions.length?Fe(r,t.shippingOptions):null,shippingAddress:n?qe(n):null,payerEmail:Le(n),payerPhone:Be(n),payerName:De(a),walletName:"applePay",methodName:"apple-pay"}},He=n(29),Ge={austria:"AT",sterreich:"AT",csterreich:"AT",au:"AU",australia:"AU",belgium:"BE",br:"BR",brasil:"BR",brazil:"BR",ca:"CA",canada:"CA",ch:"CH",schweiz:"CH",switzerland:"CH",china:"CN",czechrepublic:"CZ",de:"DE",deutschland:"DE",germany:"DE",danmark:"DK",denmark:"DK",es:"ES",espaa:"ES",spain:"ES",finland:"FI",suomi:"FI",fr:"FR",hk:"HK",hongkong:"HK",england:"GB",gb:"GB",uk:"GB",unitedkingdom:"GB",scotland:"GB",wales:"GB",it:"IT",italy:"IT",italia:"IT",japan:"JP",lietuva:"LT",luxembourg:"LU",netherlands:"NL",nederland:"NL",norway:"NO",poland:"PL",polska:"PL",russia:"RU",saudiarabia:"SA",se:"SE",sweden:"SE",sverige:"SE",singapore:"SG",us:"US",usa:"US",unitedstatesofamerica:"US",unitedstates:"US",estadosunidos:"US"},ze=function(e,t){return e&&"object"==typeof e?t(e):null},Ke=function(){function e(t){var n=this;Object(l.a)(this,e),this._onEvent=function(){},this.setEventHandler=function(e){n._onEvent=e},this.canMakePayment=function(e){var t=e.skipEnrollmentChecks;return function(e,t,n,r){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2,o=arguments.length>5?arguments[5]:void 0,i=Math.max(2,a);if(window.ApplePaySession){if(he()){if(window.ApplePaySession.supportsVersion(i)){var c="merchant.".concat((t?[e,t]:[e]).join("."),".stripe");return o?be():_e(c).then((function(a){if(r("pr.apple_pay.can_make_payment_native_response",{available:a}),n&&!a&&window.console){var o=t?"or stripeAccount parameter (".concat(t,") "):"";window.console.warn("Either you do not have a card saved to your Wallet or the current domain (".concat(e,") ").concat(o,"is not registered for Apple Pay. Visit https://dashboard.stripe.com/account/apple_pay to register this domain."))}return a}))}return n&&window.console&&window.console.warn("This version of Safari does not support ApplePay JS version ".concat(i,".")),E.a.resolve(!1)}return E.a.resolve(!1)}return E.a.resolve(!1)}(window.location.hostname,n._authentication.accountId,Object(He.c)(n._authentication.apiKey)===He.a.test,n._report,n._minimumVersion,t)},this.update=function(e){n._initialPaymentRequest=Object(w.e)(n._paymentRequestOptions,e),n._initializeSessionState()},this.show=function(){var e,t,r;n._initializeSessionState();try{e=new window.ApplePaySession(n._minimumVersion,(t=n._paymentRequestOptions,r=Object(s.a)(Object(s.a)({},te),t),Object.keys(Ne).reduce((function(e,t){var n=(0,Ne[t])(r);return null!==n?Object(s.a)(Object(s.a)({},e),{},Object(p.a)({},t,n)):e}),{})))}catch(e){throw"Must create a new ApplePaySession from a user gesture handler."===e.message?new k.b("show() must be called from a user gesture handler (such as a click handler, after the user clicks a button)."):e}n._privateSession=e,n._setupSession(e,n._usesButtonElement()),e.begin(),n._isShowing=!0},this.abort=function(){n._privateSession&&n._privateSession.abort()},this._warn=function(e){},this._report=function(e,t){n._controller.report(e,Object(s.a)(Object(s.a)({},t),{},{backingLibrary:"APPLE_PAY",usesButtonElement:n._usesButtonElement()}))},this._validateMerchant=function(e,t){return function(r){n._controller.action.createApplePaySession({data:{validation_url:r.validationURL,domain_name:window.location.hostname,display_name:n._paymentRequestOptions.total.label},usesButtonElement:t}).then((function(t){if(n._isShowing)switch(t.type){case"object":e.completeMerchantValidation(JSON.parse(t.object.session));break;case"error":n._handleValidationError(e)(t.error);break;default:Object(m.a)(t)}}),n._handleValidationError(e))}},this._handleValidationError=function(e){return function(t){n._report("error.pr.apple_pay.session_creation_failed",{error:t}),e.abort();var r=t.message;"string"==typeof r&&n._controller.warn(r)}},this._paymentAuthorized=function(e){return function(t){var r=t.payment,a=n._usesButtonElement()?C.e.paymentRequestButton:null;n._controller.action.tokenizeWithData({type:"apple_pay",elementName:a,tokenData:Object(s.a)(Object(s.a)({},r),{},{billingContact:ze(r.billingContact,n._normalizeContact)}),mids:n._mids}).then((function(t){if("error"===t.type)e.completePayment(window.ApplePaySession.STATUS_FAILURE),n._report("error.pr.create_token_failed",{error:t.error});else{var a=ze(r.shippingContact,n._normalizeContact),o=ze(r.billingContact,n._normalizeContact);a&&n._paymentRequestOptions.requestShipping&&!a.countryCode&&e.completePayment(window.ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS);var i=Ue({shippingContact:a,billingContact:o},n._paymentRequestOptions);n._onToken(e)(Object(s.a)(Object(s.a)({},i),{},{shippingOption:n._privateShippingOption,token:t.object}))}}))}},this._normalizeContact=function(e){if(e.country&&"string"==typeof e.country){var t,r=e.country.toLowerCase().replace(/[^a-z]+/g,"");return e.countryCode?"string"==typeof e.countryCode&&(t=e.countryCode.toUpperCase()):(t=Ge[r])||n._report("warn.pr.apple_pay.missing_country_code",{country:e.country}),Object(s.a)(Object(s.a)({},e),{},{countryCode:t})}return e},this._onToken=function(e){return function(t){n._onEvent({type:"paymentresponse",payload:Object(s.a)(Object(s.a)({},t),{},{complete:x(n._completePayment(e))})})}},this._completePayment=function(e){return function(t){n._paymentRequestOptions=Object(w.e)(n._paymentRequestOptions,{status:t});var r=Re(n._paymentRequestOptions),a=r.status,o=r.error;n._isShowing&&(o?e.completePayment({status:a,errors:[o]}):e.completePayment(a)),(0===a||1===a&&null==o)&&(n._isShowing=!1,n._onEvent&&n._onEvent({type:"close"}))}},this._shippingContactSelected=function(e){return function(t){n._onEvent({type:"shippingaddresschange",payload:{shippingAddress:qe(n._normalizeContact(t.shippingContact)),updateWith:x(n._completeShippingContactSelection(e))}})}},this._completeShippingContactSelection=function(e){return function(t){var r;n._paymentRequestOptions=Object(w.e)(n._paymentRequestOptions,t),(null===(r=n._paymentRequestOptions.shippingOptions)||void 0===r?void 0:r.length)&&(n._privateShippingOption=n._paymentRequestOptions.shippingOptions[0]);var a=Re(n._paymentRequestOptions),o=a.status,i=a.shippingMethods,c=a.total,s=a.lineItems;e.completeShippingContactSelection(o,i,c,s)}},this._shippingMethodSelected=function(e){return function(t){if(n._paymentRequestOptions.shippingOptions){var r=Fe(t.shippingMethod,n._paymentRequestOptions.shippingOptions);n._privateShippingOption=r,n._onEvent({type:"shippingoptionchange",payload:{shippingOption:r,updateWith:x(n._completeShippingMethodSelection(e))}})}}},this._completeShippingMethodSelection=function(e){return function(t){n._paymentRequestOptions=Object(w.e)(n._paymentRequestOptions,t);var r=Re(n._paymentRequestOptions),a=r.status,o=r.total,i=r.lineItems;e.completeShippingMethodSelection(a,o,i)}};var r=t.controller,a=t.authentication,o=t.mids,i=t.options,c=t.usesButtonElement,u=t.listenerRegistry;this._controller=r,this._authentication=a,this._mids=o,this._minimumVersion=i.__minApplePayVersion||2,this._usesButtonElement=c,this._listenerRegistry=u,this._initialPaymentRequest=i,this._isShowing=!1,this._initializeSessionState()}return Object(d.a)(e,[{key:"_initializeSessionState",value:function(){var e=btoa(this._authentication.accountId?"".concat(this._authentication.apiKey,":").concat(this._authentication.accountId):this._authentication.apiKey);this._paymentRequestOptions=Object(s.a)(Object(s.a)(Object(s.a)({},te),this._initialPaymentRequest),{},{status:ee.success,applicationData:e}),this._privateSession=null,this._privateShippingOption=null;var t=this._paymentRequestOptions.shippingOptions;(null==t?void 0:t.length)&&(this._privateShippingOption=t[0])}},{key:"_setupSession",value:function(e,t){var n=this;this._listenerRegistry.addEventListener(e,"validatemerchant",x(this._validateMerchant(e,t))),this._listenerRegistry.addEventListener(e,"paymentauthorized",x(this._paymentAuthorized(e))),this._listenerRegistry.addEventListener(e,"cancel",x((function(){n._isShowing=!1,n._onEvent({type:"cancel"}),n._onEvent({type:"close"})}))),this._listenerRegistry.addEventListener(e,"shippingcontactselected",x(this._shippingContactSelected(e))),this._listenerRegistry.addEventListener(e,"shippingmethodselected",x(this._shippingMethodSelected(e)))}}]),e}(),Ye=n(8),We={display:"block",position:"fixed","z-index":"2147483647",background:"rgba(40,40,40,0)",transition:"background 400ms ease","will-change":"background",top:"0",left:"0",right:"0",bottom:"0",margin:"0",padding:"0"},Ve=Object(s.a)(Object(s.a)({},We),{},{background:"rgba(40,40,40,0.75)"}),Je=function e(t){var n=this,r=t.lockScrolling,a=t.lockFocus,o=t.lockFocusOn,i=t.listenerRegistry;Object(l.a)(this,e),this.domElement=document.createElement("div"),this._runOnHide=[],this.mount=function(){var e=Object(v.c)();n.domElement.style.display="none",e.contains(n.domElement)||e.insertBefore(n.domElement,e.firstChild)},this.show=function(){if(Object(v.l)(n.domElement,We),n._lockScrolling){var e=Object(v.i)();n._runOnHide.push(e)}if(n._lockFocus){var t=Object(v.b)(n._lockFocusOn).restoreFocus;n._runOnHide.push(t)}},this.fadeIn=function(){setTimeout((function(){Object(v.l)(n.domElement,Ve)}))},this.fadeOut=function(){return new E.a((function(e){Object(v.l)(n.domElement,We),setTimeout(e,500),n._listenerRegistry.addEventListener(n.domElement,"transitionend",e)})).then((function(){for(n.domElement.style.display="none";n._runOnHide.length;)n._runOnHide.pop()()}))},this.unmount=function(){Object(v.c)().removeChild(n.domElement)},this._lockScrolling=!!r,this._lockFocus=!!a,this._lockFocusOn=o||null,this._listenerRegistry=i},Xe=null,$e=function(e){return null!==Xe?E.a.resolve(Xe):e().then((function(e){return Xe=e}))};var Qe,Ze=function(e){return!(!O.m&&!O.b)&&(!O.d&&(!(!e.isCheckout&&!window.PaymentRequest)&&!(!e.isCheckout&&O.a)))},et=function e(t){var n=this;Object(l.a)(this,e),this._mids=null,this._frame=null,this._initFrame=function(e){var t=n._controller.createHiddenFrame(Ye.a.PAYMENT_REQUEST_GOOGLE_PAY,{authentication:n._authentication,mids:n._mids,origin:n._origin});t.send({action:"stripe-pr-initialize",payload:{data:e}}),n._initFrameEventHandlers(t),n._frame=t},this._initFrameEventHandlers=function(e){e._on("pr-cancel",(function(){n._onEvent({type:"cancel"})})),e._on("pr-close",(function(){n._backdrop.fadeOut().then((function(){n._backdrop.unmount()})),n._onEvent({type:"close"})})),e._on("pr-error",(function(e){n._onEvent({type:"error",payload:{errorMessage:e.errorMessage,errorCode:e.errorCode}})})),e._on("pr-callback",(function(t){var r=t.event,a=t.options,o=t.nonce;switch(r){case"paymentresponse":n._handlePaymentResponse(e,a,o);break;case"shippingaddresschange":n._handleShippingAddressChange(e,a,o);break;case"shippingoptionchange":n._handleShippingOptionChange(e,a,o);break;default:throw new Error("Unexpected event name: ".concat(r))}}))},this._handlePaymentResponse=function(e,t,r){n._onEvent({type:"paymentresponse",payload:Object(s.a)(Object(s.a)({},t),{},{complete:function(t){e.send({action:"stripe-pr-callback-complete",payload:{nonce:r,data:{status:t}}})}})})},this._handleShippingAddressChange=function(e,t,r){n._onEvent({type:"shippingaddresschange",payload:Object(s.a)(Object(s.a)({},t),{},{updateWith:function(t){e.send({action:"stripe-pr-callback-complete",payload:{nonce:r,data:t}})}})})},this._handleShippingOptionChange=function(e,t,r){n._onEvent({type:"shippingoptionchange",payload:Object(s.a)(Object(s.a)({},t),{},{updateWith:function(t){e.send({action:"stripe-pr-callback-complete",payload:{nonce:r,data:t}})}})})},this.setEventHandler=function(e){n._onEvent=e},this.canMakePayment=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{skipEnrollmentChecks:!1},t=e.skipEnrollmentChecks;if(!Ze({isCheckout:n._isCheckout}))return E.a.resolve(!1);if(!n._frame)throw new Error("Frame not initialized.");var r=n._frame;return $e((function(){return r.action.checkCanMakePayment({skipEnrollmentChecks:t}).then((function(e){return!0===e.available}))}))},this.show=function(){n._frame&&(n._frame.send({delegate:"payment",action:"stripe-pr-show",payload:{data:{usesButtonElement:n._usesButtonElement()}}}),n._backdrop.mount(),n._backdrop.show(),n._backdrop.fadeIn())},this.update=function(e){n._frame&&n._frame.send({action:"stripe-pr-update",payload:{data:e}})},this.abort=function(){n._frame&&n._frame.send({action:"stripe-pr-abort",payload:{}})},this._controller=t.controller,this._authentication=t.authentication,this._mids=t.mids,this._origin=t.origin,this._usesButtonElement=t.usesButtonElement,this._backdrop=new Je({lockScrolling:!1,lockFocus:!0,lockFocusOn:null,listenerRegistry:t.listenerRegistry}),this._isCheckout=!!t.options.__isCheckout,Ze({isCheckout:this._isCheckout})&&this._controller&&(this._controller.action.fetchLocale({locale:"auto"}),this._initFrame(t.options))},tt=function(){if(!window.PaymentRequest)return null;if(/CriOS\/59/.test(navigator.userAgent))return null;if(/.*\(.*; wv\).*Chrome\/(?:53|54)\.\d.*/g.test(navigator.userAgent))return null;if(O.l)return null;var e=window.PaymentRequest;return e.prototype.canMakePayment||(e.prototype.canMakePayment=function(){return E.a.resolve(!1)}),e}(),nt=null,rt=function e(t){var n=this;Object(l.a)(this,e),this._onEvent=function(){},this.setEventHandler=function(e){n._onEvent=e},this.canMakePayment=function(e){var t=e.skipEnrollmentChecks;return function(e,t,n){return null!==nt?E.a.resolve(nt):tt&&e?e.action.checkCanMakePayment({skipEnrollmentChecks:n}).then((function(e){var t=e.available;return nt=!0===t})):E.a.resolve(!1)}(n._prFrame,(Object(He.c)(n._authentication.apiKey),He.a.test),t)},this.update=function(e){var t=n._prFrame;t&&t.send({action:"stripe-pr-update",payload:{data:e}})},this.show=function(){if(!n._prFrame)throw new k.b("Payment Request is not available in this browser.");n._prFrame.send({delegate:"payment",action:"stripe-pr-show",payload:{data:{usesButtonElement:n._usesButtonElement()}}})},this.abort=function(){n._prFrame&&n._prFrame.send({action:"stripe-pr-abort",payload:{}})},this._setupPrFrame=function(e,t){e.send({action:"stripe-pr-initialize",payload:{data:t}}),e._on("pr-cancel",(function(){n._onEvent({type:"cancel"})})),e._on("pr-close",(function(){n._onEvent({type:"close"})})),e._on("pr-error",(function(e){n._onEvent({type:"error",payload:{errorMessage:e.message||"",errorCode:e.code||""}})})),e._on("pr-callback",(function(t){var r=t.event,a=t.nonce,o=t.options;switch(r){case"token":n._onEvent({type:"paymentresponse",payload:Object(s.a)(Object(s.a)({},o),{},{complete:function(t){e.send({action:"stripe-pr-callback-complete",payload:{data:{status:t},nonce:a}})}})});break;case"shippingaddresschange":n._onEvent({type:"shippingaddresschange",payload:{shippingAddress:o.shippingAddress,updateWith:function(t){e.send({action:"stripe-pr-callback-complete",payload:{nonce:a,data:t}})}}});break;case"shippingoptionchange":n._onEvent({type:"shippingoptionchange",payload:{shippingOption:o.shippingOption,updateWith:function(t){e.send({action:"stripe-pr-callback-complete",payload:{nonce:a,data:t}})}}});break;default:throw new Error("Unexpected event from PaymentRequest inner: ".concat(r))}}))};var r=t.authentication,a=t.controller,o=t.mids,i=t.origin,c=t.usesButtonElement,u=t.options;if(this._authentication=r,this._controller=a,this._usesButtonElement=c,tt&&"https:"===window.location.protocol){this._controller.action.fetchLocale({locale:"auto"});var d=this._controller.createHiddenFrame(Ye.a.PAYMENT_REQUEST_BROWSER,{authentication:r,mids:o,origin:i});this._setupPrFrame(d,u),this._prFrame=d}else this._prFrame=null},at=n(27),ot=!1,it=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e){var r;Object(l.a)(this,n),(r=t.call(this))._usedByButtonElement=null,r._showCalledByButtonElement=!1,r._isShowing=!1,r._backingLibraries={APPLE_PAY:null,GOOGLE_PAY:null,BROWSER:null},r._activeBackingLibraryName=null,r._buttonTypeName=null,r._activeBackingLibrary=null,r._canMakePaymentAvailability={APPLE_PAY:null,GOOGLE_PAY:null,BROWSER:null},r._canMakePaymentResolved=!1,r._validateUserOn=function(e,t){"string"==typeof e&&("source"===e&&r._hasRegisteredListener("paymentmethod")||"paymentmethod"===e&&r._hasRegisteredListener("source"))&&(r._report("pr.double_callback_registration"),r._controller.warn("Do not register event listeners for both `source` or `paymentmethod`. Only one of them will succeed."))},r._report=function(e,t){r._controller.report(e,Object(s.a)(Object(s.a)({},t),{},{activeBackingLibrary:r._activeBackingLibraryName,usesButtonElement:r._usedByButtonElement||!1}))},r._warn=function(e){r._controller.warn(e)},r._registerElement=function(){r._usedByButtonElement=!0},r._elementShow=function(){r._showCalledByButtonElement=!0,r.show()},r._initBackingLibraries=function(e){r._queryStrategy.forEach((function(t){var n={controller:r._controller,authentication:r._authentication,mids:r._mids,origin:window.location.origin,options:e,usesButtonElement:function(){return!0===r._usedByButtonElement},listenerRegistry:r._listenerRegistry};switch(t){case"APPLE_PAY":r._backingLibraries.APPLE_PAY=new Ke(n),r._backingLibraries.APPLE_PAY.setEventHandler(r._handleInternalEvent);break;case"GOOGLE_PAY":r._backingLibraries.GOOGLE_PAY=new et(n),r._backingLibraries.GOOGLE_PAY.setEventHandler(r._handleInternalEvent);break;case"BROWSER":r._backingLibraries.BROWSER=new rt(n),r._backingLibraries.BROWSER.setEventHandler(r._handleInternalEvent);break;default:Object(m.a)(t)}}))},r._handleInternalEvent=function(e){switch(e.type){case"paymentresponse":r._emitPaymentResponse(e.payload);break;case"error":r._report("error.pr.internal_error",{error:e.payload});break;case"close":r._isShowing=!1;break;default:r._emitExternalEvent(e)}},r._emitExternalEvent=function(e){switch(e.type){case"cancel":r._emit("cancel");break;case"shippingoptionchange":case"shippingaddresschange":var t=e.type,n=e.payload,a=null,o=!1,i=!1,c=function(c){if(i&&o)return r._report("pr.update_with_called_after_timeout",{event:t}),void r._controller.warn("Call to updateWith() was ignored because it has already timed out. Please ensure that updateWith is called within 30 seconds.");if(o)return r._report("pr.update_with_double_call",{event:t}),void r._controller.warn("Call to updateWith() was ignored because it has already been called. Do not call updateWith more than once.");a&&clearTimeout(a),o=!0,r._report("pr.update_with",{event:t});var s=Object(m.H)(de,c||{},"".concat(t," callback")),u=s.value;s.warnings.forEach((function(e){return r._controller.warn(e)}));var l=u,d=!1;if(r._initialOptions.__isCheckout&&"APPLE_PAY"===r._activeBackingLibraryName&&u.shippingOptions&&1===u.shippingOptions.length&&0===u.shippingOptions[0].amount){u.shippingOptions;l=Object(f.a)(u,["shippingOptions"]),d=!0}var p=u.shippingOptions||r._initialOptions.shippingOptions;if(!(d||"shippingaddresschange"!==e.type||u.status!==ee.success||p&&p.length))throw new k.b("When requesting shipping information, you must specify shippingOptions once a shipping address is selected.\nEither provide shippingOptions in stripe.paymentRequest(...) or listen for the shippingaddresschange event and provide shippingOptions to the updateWith callback there.");n.updateWith(l)};r._hasRegisteredListener(e.type)?(a=setTimeout((function(){i=!0,r._report("pr.update_with_timed_out",{event:t}),r._controller.warn('Timed out waiting for a call to updateWith(). If you listen to "'.concat(e.type,'" events, then you must call event.updateWith in the "').concat(e.type,'" handler within 30 seconds.')),c({status:"fail"})}),29900),r._emit(t,Object(s.a)(Object(s.a)({},n),{},{updateWith:c}))):c({status:"success"});break;case"token":case"source":case"paymentmethod":var u=e.type,l=e.payload,d=null,p=!1,h=!1,_=function(e){if(p&&h)return r._report("pr.complete_called_after_timeout"),void r._controller.warn("Call to complete() was ignored because it has already timed out. Please ensure that complete is called within 30 seconds.");if(h)return r._report("pr.complete_double_call"),void r._controller.warn("Call to complete() was ignored because it has already been called. Do not call complete more than once.");d&&clearTimeout(d),h=!0;var t=Object(m.H)(pe,e,"status for PaymentRequest completion"),n=t.value;t.warnings.forEach((function(e){return r._controller.warn(e)})),l.complete(n)};d=setTimeout((function(){p=!0,r._report("pr.complete_timed_out"),r._controller.warn('Timed out waiting for a call to complete(). Once you have processed the payment in the "'.concat(e.type,'" handler, you must call event.complete within 30 seconds.')),_("fail")}),29900),r._emit(u,Object(s.a)(Object(s.a)({},l),{},{complete:_}));break;default:Object(m.a)(e)}},r._maybeEmitPaymentResponse=function(e){r._isShowing&&r._emitExternalEvent(e)},r._emitPaymentResponse=function(e){r._report("pr.payment_authorized");var t=e.token,n=Object(f.a)(e,["token"]),a=n.payerEmail,o=n.payerPhone,i=n.complete,c=r._showCalledByButtonElement?C.e.paymentRequestButton:null;r._hasRegisteredListener("token")&&r._maybeEmitPaymentResponse({type:"token",payload:e}),r._hasRegisteredListener("paymentmethod")?r._controller.action.createPaymentMethodWithData({elementName:c,type:"card",paymentMethodData:{card:{token:t.id},billing_details:{email:r._initialOptions.__billingDetailsEmailOverride||a,phone:o}},mids:null}).then((function(e){"error"===e.type?e.error.code&&"email_invalid"===e.error.code?i("invalid_payer_email"):(r._report("fatal.pr.token_to_payment_method_failed",{error:e.error,token:t.id}),i("fail")):r._maybeEmitPaymentResponse({type:"paymentmethod",payload:Object(s.a)(Object(s.a)({},n),{},{paymentMethod:e.object})})})):r._hasRegisteredListener("source")&&r._controller.action.createSourceWithData({elementName:c,type:"card",sourceData:{token:t.id,owner:{email:r._initialOptions.__billingDetailsEmailOverride||a,phone:o}},mids:null}).then((function(e){"error"===e.type?e.error.code&&"email_invalid"===e.error.code?i("invalid_payer_email"):(r._report("fatal.pr.token_to_source_failed",{error:e.error,token:t.id}),i("fail")):r._maybeEmitPaymentResponse({type:"source",payload:Object(s.a)(Object(s.a)({},n),{},{source:e.object})})}))},r._canMakePaymentForBackingLibrary=function(e,t){var n=r._backingLibraries[e];if(!n)throw new Error("Unexpectedly calling canMakePayment on uninitialized backing library.");return E.a.race([new E.a((function(e){return setTimeout(e,1e4)})).then((function(){return!1})),n.canMakePayment({skipEnrollmentChecks:t}).then((function(e){return!!e}))]).then((function(t){return r._canMakePaymentAvailability=Object(s.a)(Object(s.a)({},r._canMakePaymentAvailability),{},Object(p.a)({},e,t)),{backingLibraryName:e,available:t}}))},r._isGooglePayOnAndroid=function(){var e=r._initialOptions.wallets,t=e&&-1===e.indexOf("googlePay");return O.a&&!t},r._constructCanMakePaymentResponse=function(){var e=r._isGooglePayOnAndroid()&&!!r._canMakePaymentAvailability.BROWSER;return{applePay:!!r._canMakePaymentAvailability.APPLE_PAY,googlePay:!!r._canMakePaymentAvailability.GOOGLE_PAY||e}},r.canMakePayment=x((function(e){var t=Boolean(null==e?void 0:e.skipEnrollmentChecks);if(r._report("pr.can_make_payment"),r._canMakePaymentResolved){var n=null!==r._activeBackingLibrary?r._constructCanMakePaymentResponse():null;return r._report("pr.can_make_payment_response",{response:n,cached:!0}),E.a.resolve(n)}if("https:"!==window.location.protocol)return ot||(r._controller.warn("If you are testing Apple Pay or Google Pay, you must serve this page over HTTPS as it will not work over HTTP. Please read https://stripe.com/docs/stripe-js/elements/payment-request-button#html-js-prerequisites for more details."),ot=!0),r._canMakePaymentResolved=!0,E.a.resolve(null);var a=r._queryStrategy.map((function(e){return function(){return r._canMakePaymentForBackingLibrary(e,!!r._initialOptions.__isCheckout&&t)}})),o=new at.a;return Object(W.c)(a,(function(e){var t=e.backingLibraryName,n=e.available;return n&&(r._activeBackingLibraryName=t,r._activeBackingLibrary=r._backingLibraries[t],r._buttonTypeName=r._activeBackingLibraryName,r._isGooglePayOnAndroid()&&(r._buttonTypeName="GOOGLE_PAY")),n})).then((function(e){var t=new at.a;r._canMakePaymentResolved=!0;var n=null;return"SATISFIED"===e.type&&(n=r._constructCanMakePaymentResponse()),r._report("pr.can_make_payment_response",{response:n,cached:!1,duration:o.getElapsedTime(t)}),n}))})),r.update=x((function(e){if(r._isShowing)throw r._report("pr.update_called_while_showing"),new k.b("You cannot update Payment Request options while the payment sheet is showing.");var t=Object(m.H)(le,e,"PaymentRequest update()"),n=t.value,a=t.warnings;r._report("pr.update"),a.forEach((function(e){return r._warn(e)})),Object(w.j)(r._backingLibraries).forEach((function(e){e&&e.update(n)}))})),r.show=x((function(){if(r._usedByButtonElement&&!r._showCalledByButtonElement&&(r._report("pr.show_called_with_button"),r._warn("Do not call show() yourself if you are using the paymentRequestButton Element. The Element handles showing the payment sheet.")),!r._canMakePaymentResolved)throw r._report("pr.show_called_before_can_make_payment"),new k.b("You must first check the Payment Request API's availability using paymentRequest.canMakePayment() before calling show().");if(!r._activeBackingLibrary)throw r._report("pr.show_called_with_can_make_payment_false"),new k.b("Payment Request is not available in this browser.");var e=r._activeBackingLibrary;r._report("pr.show",{listeners:Object.keys(r._callbacks).sort()}),r._isShowing=!0,e.show()})),r.abort=x((function(){if(r._activeBackingLibrary){var e=r._activeBackingLibrary;r._report("pr.abort"),e.abort()}})),r.isShowing=function(){return r._isShowing},r._controller=e.controller,r._authentication=e.authentication,r._mids=e.mids,r._listenerRegistry=e.listenerRegistry;var a=Object(m.H)(ue,e.rawOptions||{},"paymentRequest()"),o=a.value,i=a.warnings;if(r._report("pr.options",{options:Object(w.h)(o,["country","currency","jcbEnabled","requestPayerEmail","requestPayerName","requestPayerPhone","requestShipping","disableWallets","wallets","blockedCardBrands"])}),i.forEach((function(e){return r._warn(e)})),o.__billingDetailsEmailOverride&&o.requestPayerEmail)throw new k.b("When providing `__billingDetailsEmailOverride`, `requestPayerEmail` has to be `false` so that the customer is not prompted for their email in the payment sheet.");var c=o.disableWallets,u=c?X.filter((function(e){return-1===c.indexOf(e)})):o.wallets;return r._queryStrategy=u?me(u):e.queryStrategyOverride||fe(),r._report("pr.query_strategy",{queryStrategy:r._queryStrategy}),r._initialOptions=Object(s.a)(Object(s.a)({},o),{},{__betas:e.betas,wallets:u}),r._initBackingLibraries(r._initialOptions),r}return n}(Y),ct={base:Object(m.w)(m.t),complete:Object(m.w)(m.t),empty:Object(m.w)(m.t),invalid:Object(m.w)(m.t),paymentRequestButton:Object(m.w)(m.t)},st={classes:Object(m.w)(Object(m.y)({base:Object(m.w)(m.B),complete:Object(m.w)(m.B),empty:Object(m.w)(m.B),focus:Object(m.w)(m.B),invalid:Object(m.w)(m.B),webkitAutofill:Object(m.w)(m.B)})),hidePostalCode:Object(m.w)(m.e),hideIcon:Object(m.w)(m.e),showIcon:Object(m.w)(m.e),style:Object(m.w)(Object(m.y)(ct)),iconStyle:Object(m.w)(Object(m.u)("solid","default")),value:Object(m.w)(Object(m.x)(m.B,m.t)),__privateCvcOptional:Object(m.w)(m.e),__privateValue:Object(m.w)(Object(m.x)(m.B,m.t)),__privateEmitIbanValue:Object(m.w)(m.e),error:Object(m.w)(Object(m.y)({type:m.B,code:Object(m.w)(m.B),decline_code:Object(m.w)(m.B),param:Object(m.w)(m.B)})),locale:Object(m.n)("elements()"),fonts:Object(m.n)("elements()"),placeholder:Object(m.w)(m.B),disabled:Object(m.w)(m.e),placeholderCountry:Object(m.w)(m.B),paymentRequest:Object(m.w)(Object(m.l)(it,"stripe.paymentRequest(...)")),supportedCountries:Object(m.w)(Object(m.b)(m.B)),accountHolderType:Object(m.w)(Object(m.u)("individual","company")),issuingCard:Object(m.w)(m.B),toCopy:Object(m.w)(Object(m.u)("number","cvc","expiry","pin"))},ut=Object(m.y)(st),lt=(Qe={},Object(p.a)(Qe,C.e.card,Ye.a.CARD_ELEMENT),Object(p.a)(Qe,C.e.cardNumber,Ye.a.CARD_ELEMENT),Object(p.a)(Qe,C.e.cardExpiry,Ye.a.CARD_ELEMENT),Object(p.a)(Qe,C.e.cardCvc,Ye.a.CARD_ELEMENT),Object(p.a)(Qe,C.e.postalCode,Ye.a.CARD_ELEMENT),Object(p.a)(Qe,C.e.paymentRequestButton,Ye.a.PAYMENT_REQUEST_ELEMENT),Object(p.a)(Qe,C.e.iban,Ye.a.IBAN_ELEMENT),Object(p.a)(Qe,C.e.idealBank,Ye.a.IDEAL_BANK_ELEMENT),Object(p.a)(Qe,C.e.p24Bank,Ye.a.P24_BANK_ELEMENT),Object(p.a)(Qe,C.e.auBankAccount,Ye.a.AU_BANK_ACCOUNT_ELEMENT),Object(p.a)(Qe,C.e.fpxBank,Ye.a.FPX_BANK_ELEMENT),Object(p.a)(Qe,C.e.issuingCardNumberDisplay,Ye.a.ISSUING_CARD_NUMBER_DISPLAY_ELEMENT),Object(p.a)(Qe,C.e.issuingCardCopyButton,Ye.a.ISSUING_CARD_COPY_BUTTON_ELEMENT),Object(p.a)(Qe,C.e.issuingCardCvcDisplay,Ye.a.ISSUING_CARD_CVC_DISPLAY_ELEMENT),Object(p.a)(Qe,C.e.issuingCardExpiryDisplay,Ye.a.ISSUING_CARD_EXPIRY_DISPLAY_ELEMENT),Object(p.a)(Qe,C.e.issuingCardPinDisplay,Ye.a.ISSUING_CARD_PIN_DISPLAY_ELEMENT),Object(p.a)(Qe,C.e.epsBank,Ye.a.EPS_BANK_ELEMENT),Object(p.a)(Qe,C.e.netbankingBank,Ye.a.NETBANKING_BANK_ELEMENT),Object(p.a)(Qe,C.e.afterpayClearpayMessageModal,Ye.a.AFTERPAY_MESSAGE_MODAL_ELEMENT),Object(p.a)(Qe,C.e.autocompleteSuggestions,Ye.a.AUTOCOMPLETE_SUGGESTIONS_ELEMENT),Object(p.a)(Qe,C.e.achBankSearchResults,Ye.a.ACH_BANK_SEARCH_RESULTS_ELEMENT),Qe),dt=function(e){var t=Object(v.e)(e,null);return!!t&&"rtl"===t.getPropertyValue("direction")},pt=n(44),ft=n(57),mt=function(e){var t=document.createElement("input");return t.className=e,t.setAttribute("aria-hidden","true"),t.setAttribute("aria-label"," "),t.setAttribute("autocomplete","false"),t.maxLength=1,t.disabled=!0,Object(v.l)(t,ft.b),t},ht={margin:"0",padding:"0",border:"none",display:"block",background:"transparent",position:"relative",opacity:"1"},_t=function(e){var t=e.name,n=e.value,r=e.expiresIn,a=e.path,o=e.domain,i=e.protocol,c=e.sameSite,s=void 0===c?"Lax":c,u=new Date,l=r||31536e6;u.setTime(u.getTime()+l);var d=a||"/",p=(n||"").replace(/[^!#-+\--:<-[\]-~]/g,encodeURIComponent),f="".concat(encodeURIComponent(t),"=").concat(p,";expires=").concat(u.toGMTString(),";path=").concat(d,";SameSite=").concat(s);return o&&(f+=";domain=".concat(o)),"https:"===i&&(f+=";secure"),document.cookie=f,f},bt=function(e){var t=Object(w.a)(document.cookie.split("; "),(function(t){var n=t.indexOf("=");try{return decodeURIComponent(t.substr(0,n))===e}catch(e){return!1}}));if(!t)return null;var n=t.indexOf("=");try{return decodeURIComponent(t.substr(n+1))}catch(e){return null}},yt=n(67),vt=n.n(yt),Ot=C.n.replace(/\/$/,"");var gt="_1776170249",jt="__1104211103",wt=function(e){var t,n=(t={},Object(p.a)(t,gt,!0),Object(p.a)(t,jt,!1),t);try{var r=Object(g.a)(e.slice(e.indexOf("?")+1));Object.keys(r).forEach((function(e){var t=vt()(e),a=r[e];switch(t){case gt:"false"===a&&(n[t]=!1);break;case jt:"true"===a&&(n[t]=!0)}}))}catch(e){}return n}(function(e){try{if(e.currentScript)return e.currentScript.src;var t=e.querySelectorAll('script[src^="'.concat(Ot,'"]')),n=Object(w.a)(t,(function(e){var t=(e.getAttribute("src")||"").split("?")[0];return new RegExp("^".concat(Ot,"/?$")).test(t)}));return n&&n.getAttribute("src")||""}catch(e){return""}}(document)),kt=wt._1776170249,Et=wt.__1104211103,St=n(46),Pt=n(24);function At(e,t,n){return(At="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=Object(Pt.a)(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}})(e,t,n||e)}var It,Ct=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e){var r,a=e.type,o=e.controllerId,i=e.listenerRegistry,c=e.betas,s=e.appParams;return Object(l.a)(this,n),(r=t.call(this))._sendFAReq=function(e){var t=b(e.tag);return new E.a((function(n,a){r._requests[t]={resolve:n,reject:a},r._send({message:{action:"stripe-frame-action",payload:{nonce:t,faReq:e}},type:"outer",frameId:r.id,controllerId:r._controllerId})}))},r.action={perform3DS2Challenge:function(e){return r._sendFAReq({tag:"PERFORM_3DS2_CHALLENGE",value:e})},perform3DS2Fingerprint:function(e){return r._sendFAReq({tag:"PERFORM_3DS2_FINGERPRINT",value:e})},performOneClickWebauthnAuthentication:function(e){return r._sendFAReq({tag:"PERFORM_ONE_CLICK_WEBAUTHN_AUTHENTICATION",value:e})},show3DS2Spinner:function(e){return r._sendFAReq({tag:"SHOW_3DS2_SPINNER",value:e})},checkCanMakePayment:function(e){return r._sendFAReq({tag:"CHECK_CAN_MAKE_PAYMENT",value:e})},closeLightboxFrame:function(e){return r._sendFAReq({tag:"CLOSE_LIGHTBOX_FRAME",value:e})},openLightboxFrame:function(e){return r._sendFAReq({tag:"OPEN_LIGHTBOX_FRAME",value:e})},setFocusTarget:function(e){return r._sendFAReq({tag:"SET_FOCUS_TARGET",value:e})}},r.type=a,r.loaded=!1,r._controllerId=o,r._persistentMessages=[],r._queuedMessages=[],r._requests={},r._listenerRegistry=i,r.id=r._generateId(),r._iframe=r._createIFrame(a,c,s),r._on("load",(function(){r.loaded=!0,r._ensureMounted(),r.loaded&&(r._persistentMessages.forEach((function(e){return r._send(e)})),r._queuedMessages.forEach((function(e){return r._send(e)})),r._queuedMessages=[])})),r._on("title",(function(e){var t=e.title;r._iframe.setAttribute("title",t)})),r}return Object(d.a)(n,[{key:"_generateId",value:function(){return b("__privateStripeFrame")}},{key:"send",value:function(e){this._send({message:e,type:"outer",frameId:this.id,controllerId:this._controllerId})}},{key:"sendPersistent",value:function(e){this._ensureMounted();var t={message:e,type:"outer",frameId:this.id,controllerId:this._controllerId};this._persistentMessages=[].concat(Object(u.a)(this._persistentMessages),[t]),this.loaded&&Object(Ye.f)(t)}},{key:"resolve",value:function(e,t){this._requests[e]&&this._requests[e].resolve(t)}},{key:"reject",value:function(e,t){this._requests[e]&&this._requests[e].reject(t)}},{key:"_send",value:function(e){this._ensureMounted(),this.loaded?Object(Ye.f)(e):this._queuedMessages=[].concat(Object(u.a)(this._queuedMessages),[e])}},{key:"appendTo",value:function(e){this._emit("mount",{anchor:e}),e.appendChild(this._iframe)}},{key:"prependTo",value:function(e,t){this._emit("mount",{anchor:e,parent:t}),t.insertBefore(this._iframe,e)}},{key:"unmount",value:function(){this.loaded=!1,this._emit("unload")}},{key:"destroy",value:function(){this.unmount();var e=this._iframe.parentElement;e&&e.removeChild(this._iframe),this._emit("destroy")}},{key:"_ensureMounted",value:function(){this._isMounted()||this.unmount()}},{key:"_isMounted",value:function(){return!!document.body&&document.body.contains(this._iframe)}},{key:"_createIFrame",value:function(e,t,n){var r=window.location.href.toString(),a="string"==typeof n?n:Object(g.j)(Object(s.a)(Object(s.a)({},n||{}),{},{referrer:r,controllerId:this._controllerId})),o=document.createElement("iframe");o.setAttribute("name",this.id);var i=Object(Ye.b)(e);return Object.keys(i).forEach((function(e){o.setAttribute(e,i[e])})),(null==n?void 0:n.allowCamera)&&o.setAttribute("allow","camera"),o.src="".concat(Object(Ye.c)(e)).concat(a?"#":"").concat(a),o}}]),n}(Y),Tt=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e){var r;if(Object(l.a)(this,n),(r=t.call(this,e)).autoload=e.autoload||!1,"complete"===document.readyState)r._ensureMounted();else{var a=r._ensureMounted.bind(Object(G.a)(r));r._listenerRegistry.addEventListener(document,"DOMContentLoaded",a),r._listenerRegistry.addEventListener(window,"load",a),setTimeout(a,5e3)}return r}return Object(d.a)(n,[{key:"_ensureMounted",value:function(){At(Object(Pt.a)(n.prototype),"_ensureMounted",this).call(this),this._isMounted()||this._autoMount()}},{key:"_autoMount",value:function(){var e=document.body;if(e){var t=document.querySelector("#stripe-hidden-frames-container")||e;this.appendTo(t)}else if("complete"===document.readyState||"interactive"===document.readyState)throw new k.b("Stripe.js requires that your page has a <body> element.");this.autoload&&(this.loaded=!0)}},{key:"_createIFrame",value:function(e,t,r){var a=At(Object(Pt.a)(n.prototype),"_createIFrame",this).call(this,e,t,r);return a.setAttribute("aria-hidden","true"),a.setAttribute("tabIndex","-1"),Object(v.k)(a),a}}]),n}(Ct),Nt=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(d.a)(n,[{key:"_generateId",value:function(){return this._controllerId}}]),n}(Tt),Mt="__privateStripeMetricsController",Rt="merchant",xt="session",Bt="NA",Lt=function(e){return 42===e.length},Dt=function(e,t,n){return n?!e||!Lt(e)&&Lt(t)?t:e:y()},qt=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Object(l.a)(this,e),this._controllerFrame=null,this._latencies=[],this._handleMessage=function(e){return function(n){var r=n.data,a=n.origin;if(Object(g.g)(a)&&"string"==typeof r)try{var o=JSON.parse(r),i=o.originatingScript,c=o.payload;if("m2"===i){var s=c.guid,u=c.muid,l=c.sid;t._guid=s,t._muid=t._getID(Rt,u),t._sid=t._getID(xt,l),e()}}catch(e){}}},n.checkoutIds){var r=n.checkoutIds,a=r.muid,o=r.sid;this._guid=Bt,this._muid=a,this._sid=o,this._doNotPersist="NA"!==a&&"NA"!==o}else this._guid=Bt,this._muid=this._getID(Rt),this._sid=this._getID(xt),this._doNotPersist=!1;this._listenerRegistry=Object(St.a)(),this._idsPromise=new E.a((function(e){t._establishMessageChannel(e)})),this._id=b(Mt),kt&&(this._controllerFrame=new Nt({type:Ye.a.METRICS_CONTROLLER,controllerId:this._id,listenerRegistry:this._listenerRegistry,autoload:!0,appParams:this._buildFrameQueryString()}),this._startIntervalCheck(),setTimeout(this._testLatency.bind(this),2e3+500*Math.random()))}return Object(d.a)(e,[{key:"ids",value:function(){return{guid:this._guid,muid:this._muid,sid:this._sid}}},{key:"idsPromise",value:function(){var e=this;return this._idsPromise.then((function(){return e.ids()}))}},{key:"_establishMessageChannel",value:function(e){if(!kt)return this._guid=y(),void e();this._listenerRegistry.addEventListener(window,"message",this._handleMessage(e))}},{key:"_startIntervalCheck",value:function(){var e=this,t=window.location.href;setInterval((function(){var n=window.location.href;n!==t&&(e.send((function(e){return{action:"ping",payload:{sid:e.sid,muid:e.muid,title:document.title,referrer:document.referrer,url:document.location.href,version:6}}})),t=n)}),5e3)}},{key:"report",value:function(e,t){this.send((function(n){return{action:"track",payload:{sid:n.sid,muid:n.muid,url:document.location.href,source:e,data:t,version:6}}}))}},{key:"send",value:function(e){var t=this;this._idsPromise.then((function(){try{t._controllerFrame&&t._controllerFrame.send(e(t.ids()))}catch(e){}}))}},{key:"_testLatency",value:function(){var e=this,t=new Date;this._listenerRegistry.addEventListener(document,"mousemove",(function n(){try{var r=new Date;e._latencies.push(r-t),e._latencies.length>=10&&(e.report("mouse-timings-10",e._latencies),e._listenerRegistry.removeEventListener(document,"mousemove",n)),t=r}catch(e){}}))}},{key:"_extractMetaReferrerPolicy",value:function(){var e=document.querySelector("meta[name=referrer]");return null!=e&&e instanceof HTMLMetaElement?e.content.toLowerCase():null}},{key:"_extractUrl",value:function(e){var t=document.location.href;switch(e){case"origin":case"strict-origin":case"origin-when-cross-origin":case"strict-origin-when-cross-origin":return document.location.origin;case"unsafe-url":return t.split("#")[0];default:return t}}},{key:"_buildFrameQueryString",value:function(){var e=this._extractMetaReferrerPolicy(),t=this._extractUrl(e),n={url:t,title:document.title,referrer:document.referrer,muid:this._muid,sid:this._sid,version:6,preview:Object(g.g)(t)};return null!=e&&(n.metaReferrerPolicy=e),Object.keys(n).map((function(e){return null!=n[e]?"".concat(e,"=").concat(encodeURIComponent(n[e].toString())):null})).join("&")}},{key:"_getID",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Bt;switch(e){case Rt:if(this._doNotPersist)return Dt(this._muid,t,kt);try{var n="__stripe_mid",r=Dt(bt(n),t,kt);return Lt(r)&&_t({name:n,value:r,domain:".".concat(document.location.hostname),protocol:document.location.protocol,sameSite:"Strict"}),r}catch(e){return Bt}case xt:if(this._doNotPersist)return Dt(this._sid,t,kt);try{var a="__stripe_sid",o=Dt(bt(a),t,kt);return Lt(o)&&_t({name:a,value:o,domain:".".concat(document.location.hostname),protocol:document.location.protocol,sameSite:"Strict",expiresIn:18e5}),o}catch(e){return Bt}default:throw new Error("Invalid ID type specified: ".concat(e))}}}]),e}(),Ft=null,Ut=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Ft=new qt(e)},Ht=!1,Gt=function(){var e=Ft;e&&(Ht||(Ht=!0,e.send((function(e){return{action:"ping",payload:{v2:2,sid:e.sid,muid:e.muid,title:document.title,referrer:document.referrer,url:document.location.href,version:6}}})),e.send((function(t){return{action:"track",payload:{sid:t.sid,muid:t.muid,url:document.location.href,source:"mouse-timings-10-v2",data:e._latencies,version:6}}}))))},zt=["test_id"],Kt=function(e){switch(e.type){case"object":return zt.push(e.object.id),{issuingCard:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},Yt=function(e){switch(e.type){case"object":return{nonce:e.object.public_nonce};case"error":return{error:e.error};default:return Object(m.a)(e)}},Wt={base:"StripeElement",focus:"StripeElement--focus",invalid:"StripeElement--invalid",complete:"StripeElement--complete",empty:"StripeElement--empty",webkitAutofill:"StripeElement--webkit-autofill"},Vt="#faffbd",Jt=function(e){return parseFloat(e.toFixed(1))},Xt=function(e){return/^\d+(\.\d*)?px$/.test(e)},$t=function(){function e(t){var n=this;Object(l.a)(this,e),this.focus=function(){if(n._isIssuingDisplayElement())throw new k.b("Cannot call focus() on an ".concat(n._componentName," Element."));document.activeElement&&document.activeElement.blur&&document.activeElement.blur(),n._fakeInput.focus()},this._formSubmit=function(){for(var e=n._component.parentElement;e&&"FORM"!==e.nodeName;)e=e.parentElement;if(e){var t=document.createEvent("Event");t.initEvent("submit",!0,!0),e.dispatchEvent(t)}};var r=t.options,a=t.component,o=t.listenerRegistry,i=t.elementTimings,c=t.emitEvent,s=t.getParent,u=t.hasRegisteredListener,d=Object(w.g)(r,["loader"]),p=d.controller,f=d.componentName,h=d.publicOptions;this._componentName=f,this._component=a,this._controller=p,this._listenerRegistry=o,this._emitEvent=c,this._getParent=s,this._hasRegisteredListener=u;var _=Object(m.H)(ut,h||{},"create()"),b=_.value;_.warnings.forEach((function(e){return n._controller.warn(e)}));var y,v=b.paymentRequest,O=b.classes,g=b.issuingCard,j="paymentRequestButton"===this._componentName;if(j){if(!v)throw new k.b("You must pass in a stripe.paymentRequest object in order to use this Element.");this._paymentRequest=v,this._paymentRequest._registerElement()}if(this._isIssuingDisplayElement()){if(!g)throw new Error("You must pass in an ID to the issuingCard option in order to use this Element.");if(y=g,-1===zt.indexOf(y))throw new Error("Issuing card ".concat(g," has not been retrieved."))}this._createElement(d,b,i),this._classes=Wt,this._computeCustomClasses(O||{}),this._lastBackgroundColor="",this._focused=!1,this._empty=!j,this._invalid=!1,this._complete=!1,this._autofilled=!1,this._lastSubmittedAt=null}return Object(d.a)(e,[{key:"update",value:function(e){var t=this,n=Object(m.H)(ut,e||{},"element.update()"),r=n.value;if(n.warnings.forEach((function(e){return t._controller.warn(e)})),r){var a=r.classes,o=Object(f.a)(r,["classes"]);a&&(this._removeClasses(),this._computeCustomClasses(a),this._updateClasses()),this._updateFrameHeight(r),Object.keys(o).length&&(this._frame.update(o),this._secondaryFrame&&this._secondaryFrame.update(o))}}},{key:"blur",value:function(){if(this._isIssuingDisplayElement())throw new k.b("Cannot call blur() on an ".concat(this._componentName," Element."));this._frame.blur(),this._fakeInput.blur()}},{key:"clear",value:function(){this._frame.clear()}},{key:"unmount",value:function(){var e=this._getParent(),t=this._label;e&&(this._listenerRegistry.removeEventListener(e,"click",this.focus),this._removeClasses()),t&&(this._listenerRegistry.removeEventListener(t,"click",this.focus),this._label=null),this._secondaryFrame&&(this._secondaryFrame.unmount(),this._listenerRegistry.removeEventListener(window,"click",this._handleOutsideClick)),this._fakeInput.disabled=!0,this._frame.unmount()}},{key:"mount",value:function(){if(Object(v.g)(document,this._component)){this._controller.report("user_error.shadow_dom_mount",{element:this._componentName});var e=function(){throw new k.b("Elements cannot be mounted in a ShadowRoot. Please mount in the Light DOM.")};"test"===this._controller.keyMode()?e():setTimeout(e,0)}if(this._paymentRequest){if(!this._paymentRequest._canMakePaymentResolved)throw new k.b("For the paymentRequestButton Element, you must first check availability using paymentRequest.canMakePayment() before mounting the Element.");if(!this._paymentRequest._activeBackingLibraryName)throw new k.b("The paymentRequestButton Element is not available in the current environment.")}this._mountTimestamp=new at.a,this._findPossibleLabel(),this._updateClasses()}},{key:"_isIssuingDisplayElement",value:function(){return"issuingCardNumberDisplay"===this._componentName||"issuingCardCvcDisplay"===this._componentName||"issuingCardExpiryDisplay"===this._componentName||"issuingCardPinDisplay"===this._componentName}},{key:"_updateClasses",value:function(){var e=this._getParent();e&&Object(v.n)(e,[[this._classes.base,!0],[this._classes.empty,this._empty],[this._classes.focus,this._focused],[this._classes.invalid,this._invalid],[this._classes.complete,this._complete],[this._classes.webkitAutofill,this._autofilled]])}},{key:"_removeClasses",value:function(){var e=this._getParent();e&&Object(v.n)(e,[[this._classes.base,!1],[this._classes.empty,!1],[this._classes.focus,!1],[this._classes.invalid,!1],[this._classes.complete,!1],[this._classes.webkitAutofill,!1]])}},{key:"_findPossibleLabel",value:function(){var e=this._getParent();if(e){var t,n=e.getAttribute("id");if(n&&(t=document.querySelector("label[for='".concat(n,"']"))),t)this._listenerRegistry.addEventListener(e,"click",this.focus);else for(t=t||e.parentElement;t&&"LABEL"!==t.nodeName;)t=t.parentElement;t?(this._label=t,this._listenerRegistry.addEventListener(t,"click",this.focus)):this._listenerRegistry.addEventListener(e,"click",this.focus)}}},{key:"_computeCustomClasses",value:function(e){var t={};return Object.keys(e).forEach((function(n){if(!Wt[n])throw new k.b("".concat(n," is not a customizable class name.\nYou can customize: ").concat(Object.keys(Wt).join(", ")));var r=e[n]||Wt[n];t[n]=r.replace(/\./g," ")})),this._classes=Object(s.a)(Object(s.a)({},this._classes),t),this}},{key:"_setupEvents",value:function(e,t,n){var r=this,a=e.stripeJsLoadTimestamp,o=(e.stripeCreateTimestamp,e.groupCreateTimestamp),i=e.createTimestamp,c=0,s=0,l={stripeJsLoad:a.getAsPosixTime(),stripeCreate:i.getAsPosixTime(),groupCreate:o.getAsPosixTime(),create:i.getAsPosixTime()};if(this._frame._on("load",(function(e){var t=e.source;c++;var n=r._getParent(),a=dt(n),o=r._paymentRequest?r._paymentRequest._buttonTypeName:null;r._mountTimestamp&&(l.mount=r._mountTimestamp.getAsPosixTime()),r._frame.send({action:"stripe-user-mount",payload:{timestamps:l,loadCount:c,matchFrame:t===r._frame._iframe.contentWindow,rtl:a,paymentRequestButtonType:o}})})),this._secondaryFrame){var d=this._secondaryFrame;d._on("load",(function(e){var t=e.source;s++,r._mountTimestamp&&(l.mount=r._mountTimestamp.getAsPosixTime()),d.send({action:"stripe-user-mount",payload:{timestamps:l,loadCount:s,matchFrame:t===d._iframe.contentWindow,rtl:!1,paymentRequestButtonType:null}})}))}this._frame._on("redirectfocus",(function(e){var t=e.focusDirection,n=Object(v.d)(r._component,t);n&&n.focus()})),this._frame._on("focus",(function(){r._focused=!0,r._updateClasses()})),this._frame._on("blur",(function(){r._focused=!1,r._updateClasses(),r._lastSubmittedAt&&"paymentRequestButton"===r._componentName&&(r._controller.report("payment_request_button.sheet_visible",{latency:r._lastSubmittedAt.getElapsedTime()}),r._lastSubmittedAt=null)})),this._frame._on("submit",(function(){if("paymentRequestButton"===r._componentName){r._lastSubmittedAt=new at.a;var e=!1,t=!1;Gt(),r._emitEvent("click",{preventDefault:function(){r._controller.report("payment_request_button.default_prevented"),e&&r._controller.warn("event.preventDefault() was called after the payment sheet was shown. Make sure to call it synchronously when handling the `click` event."),t=!0}}),!t&&r._paymentRequest&&(r._paymentRequest._elementShow(),e=!0)}else r._emitEvent("submit"),r._formSubmit()})),["ready","focus","blur","escape","click"].forEach((function(e){r._frame._on(e,(function(){r._emitEvent(e)}))})),this._frame._on("change",(function(e){Gt();var t={},n=U.a[r._componentName]||[];["error","value","empty","complete"].concat(Object(u.a)(n)).forEach((function(n){return t[n]=e[n]})),r._emitEvent("change",t),r._empty=t.empty,r._invalid=!!t.error,r._complete=t.complete,r._updateClasses()})),this._frame._on("__privateIntegrationError",(function(e){var t=e.message;r._emitEvent("__privateIntegrationError",{message:t})})),this._frame._on("networkschange-start",(function(){Object(j.d)(t,j.a.networks_change_1)&&r._hasRegisteredListener("networkschange")&&r._controller.action.isCardMetadataRequired({groupId:n.groupId}).then((function(e){return e&&r._emitNetworksChangeEvent(null,!0),r._controller.action.retrieveCardNetworks({groupId:n.groupId})})).then((function(e){e&&r._emitNetworksChangeEvent(e,!1)}))})),this._frame._on("dimensions",(function(e){var t=r._getParent();if(t){var n=Object(v.e)(t,null);if(n){var a=parseFloat(n.getPropertyValue("height")),o=e.height;if("border-box"===n.getPropertyValue("box-sizing")){var i=parseFloat(n.getPropertyValue("padding-top")),c=parseFloat(n.getPropertyValue("padding-bottom"));a=a-parseFloat(n.getPropertyValue("border-top"))-parseFloat(n.getPropertyValue("border-bottom"))-i-c}var s=Jt(a),u=Jt(o);0!==a&&s<u&&r._controller.report("wrapper_height_mismatch",{height:u,outer_height:s});var l=r._component.getBoundingClientRect().height,d=Jt(l);0!==l&&0!==o&&d!==u&&(r._frame.updateStyle({height:"".concat(o,"px")}),r._controller.report("iframe_height_update",{height:u,calculated_height:d}))}}})),this._frame._on("autofill",(function(){var e=r._getParent();if(e){var t=e.style.backgroundColor,n=t===Vt||"rgb(250, 255, 189)"===t;r._lastBackgroundColor=n?r._lastBackgroundColor:t,e.style.backgroundColor=Vt,r._autofilled=!0,r._updateClasses()}})),this._frame._on("autofill-cleared",(function(){var e=r._getParent();r._autofilled=!1,e&&(e.style.backgroundColor=r._lastBackgroundColor),r._updateClasses()})),this._frame._on("update-outer-style",(function(e){Object.keys(e).forEach((function(t){r._component.style.setProperty(t,e[t])}))}))}},{key:"_emitNetworksChangeEvent",value:function(e,t){this._emitEvent("networkschange",{networks:e,loading:t})}},{key:"_handleOutsideClick",value:function(){this._secondaryFrame&&this._secondaryFrame.send({action:"stripe-outside-click",payload:{}})}},{key:"_updateFrameHeight",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.style;if("paymentRequestButton"===this._componentName){var r=n&&n.paymentRequestButton||{},a=r.height,o="string"==typeof a?a:void 0;(t||o)&&(this._frame.updateStyle({height:o||this._lastHeight||$,minHeight:"auto"}),this._lastHeight=o||this._lastHeight)}else{var i=n&&n.base||{},c=i.lineHeight,s=i.fontSize,u=i.padding,l="string"!=typeof c||isNaN(parseFloat(c))?void 0:c,d="string"==typeof s?s:void 0,p="string"==typeof u?u:void 0;if(d&&!Xt(d)&&this._controller.warn("The fontSize style you specified (".concat(d,") is not in px. We do not recommend using relative css units, as they will be calculated relative to our iframe's styles rather than your site's.")),t||l||d){var f=-1===C.l.indexOf(this._componentName)?void 0:p||this._lastPadding,m=Object(v.a)(l||this._lastHeight,d||this._lastFontSize,f);this._frame.updateStyle({height:m}),this._lastFontSize=d||this._lastFontSize,this._lastHeight=l||this._lastHeight,this._lastPadding=f}}}},{key:"_createElement",value:function(e,t,n){var r=this,a=(e.controller,e.publicOptions,e.componentName),o=e.groupId,i=Object(f.a)(e,["controller","publicOptions","componentName","groupId"]),c=(t.classes,t.paymentRequest,Object(f.a)(t,["classes","paymentRequest"])),u=this._component,l=mt(pt.c);Object(v.l)(u,ht);var d=dt(document.body),p=lt[a],m=Object(s.a)(Object(s.a)(Object(s.a)({},i),c),{},{rtl:d}),h=this._controller.createElementFrame(p,a,o,m);if(h._on("load",(function(){l.disabled=!1})),this._listenerRegistry.addEventListener(l,"focus",(function(){h.focus()})),h.appendTo(u),U.c[a]){var _=U.c[a].secondary,b=this._controller.createSecondaryElementFrame(p,_,a,o,m);b&&b.on&&b.on("height-change",(function(e){b.updateStyle({height:"".concat(e.height,"px")})})),this._secondaryFrame=b,b.appendTo(u),this._listenerRegistry.addEventListener(window,"click",(function(){return r._handleOutsideClick()}))}if(u.appendChild(l),O.i&&a!==C.e.paymentRequestButton){var y=function(){var e=mt(pt.d);return e.setAttribute("tabindex","-1"),e}();u.appendChild(y)}this._frame=h,this._fakeInput=l,this._setupEvents(n,e.betas,e),this._updateFrameHeight(t,!0)}}]),e}(),Qt=n(20),Zt={amount:m.r,currency:Object(m.u)("USD"),logoColor:Object(m.w)(Object(m.u)("primary","black","white")),fontColor:Object(m.w)(m.B),fontSize:Object(m.w)(m.B),textAlign:Object(m.w)(m.B),stripeMerchantId:Object(m.w)(m.B)},en=Object(m.y)(Zt),tn=function(e){var t=!1;window.Promise||(t=!0,window.Promise=E.a);var n=e();return t&&window.Promise===E.a&&delete window.Promise,n},nn=function(){return tn((function(){return n.e(3).then(n.bind(null,95))}))},rn=function(e){var t,r=e.options,a=Object(f.a)(e,["options"]),o=e.emitEvent,i=e.listenerRegistry,c=r.controller,l=r.componentName,d=r.publicOptions,p=r.groupId,h=new at.a,_=function(e){var t=Object(m.H)(en,e||{},"create()"),n=t.value,r=t.warnings;if(!Math.floor(n.amount)===n.amount)throw new k.b("'Amount' must be a whole integer number that represents the lowest denomination (cents).");return r.forEach((function(e){return c.warn(e)})),n},b=_(d),y=function(e,n){return e.apply(void 0,[t].concat(Object(u.a)(n)))},v=[],O=function(e){return function(){for(var n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];t?y(e,r):v.push([e,r])}},g=function(){};E.a.all([tn((function(){return n.e(2).then(n.bind(null,90))})),nn()]).then((function(e){var n=Object(Qt.a)(e,2),r=n[0],o=n[1],u=r.default;g=o.unmountModal;var d=Object(s.a)(Object(s.a)({},a),{},{options:{groupId:p,controller:c,componentName:l,publicOptions:b},mountModal:function(e){return o.mountModal({controller:c,listenerRegistry:i,url:e})}});t=u(d),c.report("affirm_message.loaded",{load_time:h.getElapsedTime(),currency:b.currency}),function(){for(;v.length;){var e=v.shift(),t=Object(Qt.a)(e,2),n=t[0],r=t[1];y(n,r)}}()}),(function(e){c.report("affirm_message.import_error",{error:e})}));var j=function(e){return function(){throw new k.b(e)}};return{mount:O((function(e){e.mount(b),o("mounted")})),unmount:O((function(e){g(),e.unmount()})),update:O((function(e,t){var n=Object(w.d)(b,t);b=_(n),e.update(b)})),focus:j("Focus is not supported by affirmMessage."),blur:j("Blur is not supported by affirmMessage."),clear:j("Clear is not supported by affirmMessage.")}},an={amount:m.r,currency:Object(m.u)("USD","AUD","CAD","GBP","NZD","EUR"),badgeTheme:Object(m.w)(Object(m.u)("black-on-mint","black-on-white","mint-on-black","white-on-black")),introText:Object(m.w)(Object(m.u)("In","in","Or","or","Pay","pay","Pay in","pay in")),isEligible:Object(m.w)(m.e),isCartEligible:Object(m.w)(m.e),lockupTheme:Object(m.w)(Object(m.u)("black","white","mint")),logoType:Object(m.w)(Object(m.u)("badge","lockup")),max:Object(m.w)(m.r),min:Object(m.w)(m.r),modalLinkStyle:Object(m.w)(Object(m.u)("circled-info-icon","more-info-text","learn-more-text")),modalTheme:Object(m.w)(Object(m.u)("mint","white")),showInterestFree:Object(m.w)(m.e),showLowerLimit:Object(m.w)(m.e),showUpperLimit:Object(m.w)(m.e),showWith:Object(m.w)(m.e)},on=Object(m.y)(an),cn=function(){return tn((function(){return n.e(5).then(n.bind(null,96))}))},sn=function(e){var t,r=e.emitEvent,a=e.options,o=a.controller,i=a.locale,c=a.publicOptions,s=new at.a,l=function(e){var t=Object(m.H)(on,e||{},"create()"),n=t.value;return t.warnings.forEach((function(e){return o.warn(e)})),n},d=l(c),p=function(e,n){return e.apply(void 0,[t].concat(Object(u.a)(n)))},f=[],h=function(e){return function(){for(var n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];t?p(e,r):f.push([e,r])}},_=function(){};E.a.all([tn((function(){return n.e(4).then(n.bind(null,93))})),cn()]).then((function(n){var a=Object(Qt.a)(n,2),c=a[0],u=a[1],l=c.default;_=u.unmountModal;var m=e.component,h=e.listenerRegistry;t=l({component:m,mountModal:function(e,t){return u.mountModal({controller:o,listenerRegistry:h,locale:e,modalTheme:t})},locale:i,listenerRegistry:h}),o.report("afterpay_message.loaded",{load_time:s.getElapsedTime(),locale:i,currency:d.currency}),function(){for(;f.length;){var e=f.shift(),t=Object(Qt.a)(e,2),n=t[0],r=t[1];p(n,r)}}(),r("ready")}),(function(e){o.report("afterpay_message.import_error",{error:e})}));var b=function(e){return function(){throw new k.b(e)}};return{mount:h((function(e){e.mount(d)})),unmount:h((function(e){_(),e.unmount()})),update:h((function(e,t){var n=Object(w.d)(d,t);d=l(n),e.update(d)})),focus:b("Focus is not supported by afterpayClearpayMessage."),blur:b("Blur is not supported by afterpayClearpayMessage."),clear:b("Clear is not supported by afterpayClearpayMessage.")}},un=n(26),ln=n(47),dn=n(52),pn=Object(m.y)({phone:Object(m.w)(Object(m.u)("auto","always","never"))}),fn=Object(m.y)({required:Object(m.u)("auto","always","never")}),mn=Object(m.y)({phone:Object(m.w)(fn)}),hn={locale:Object(m.n)("elements()"),fonts:Object(m.n)("elements()"),defaultValues:Object(m.w)(Object(m.y)({email:m.B}))},_n=Object(m.y)(hn),bn={locale:Object(m.n)("elements()"),fonts:Object(m.n)("elements()"),business:Object(m.w)(Object(m.y)({name:m.B})),paymentMethodOrder:Object(m.w)(Object(m.b)(m.B)),fields:Object(m.w)(ln.d),readOnly:Object(m.w)(m.e),terms:Object(m.w)(ln.e),wallets:Object(m.w)(ln.f),defaultValues:Object(m.w)(ln.c)},yn=Object.freeze({line1:Object(m.w)(Object(m.q)(m.B)),line2:Object(m.w)(Object(m.q)(m.B)),city:Object(m.w)(Object(m.q)(m.B)),state:Object(m.w)(Object(m.q)(m.B)),country:m.B,postal_code:Object(m.w)(Object(m.q)(m.B))}),vn=Object.freeze({name:Object(m.w)(Object(m.q)(m.B)),address:Object(m.w)(Object(m.y)(yn))}),On=Object.freeze({locale:Object(m.n)("elements()"),fonts:Object(m.n)("elements()"),allowedCountries:Object(m.w)(Object(m.b)(m.B)),blockPoBox:Object(m.w)(m.e),defaultValues:Object(m.w)(Object(m.y)(vn)),disableAutocomplete:Object(m.w)(m.e),fields:Object(m.w)(pn),validation:Object(m.w)(mn)}),gn=Object(m.y)(On),jn=function(e,t,n,r,a){switch(e){case"linkAuthentication":var o=Object(m.H)(_n,t,n),i=o.value;i.locale,i.fonts;return{value:Object(f.a)(i,["locale","fonts"]),warnings:o.warnings};case"payment":var c=Object(m.H)(function(e,t){var n=Object(s.a)({},bn);return Object(j.d)(t,j.a.payment_element_beta_1)&&(n=Object(s.a)(Object(s.a)({},n),{},{appearance:Object(m.w)(m.t),clientSecret:un.g}),e&&(n=Object(s.a)(Object(s.a)({},n),{},{clientSecret:Object(m.w)(un.g)}))),Object(j.d)(t,j.a.blocked_card_brands_beta_1)&&!e&&(n.allowedCardBrands=Object(m.w)(ln.b),n.disallowedCardBrands=Object(m.w)(ln.b)),Object(m.y)(n)}(r,a),t,n),u=c.value,l=(u.locale,u.fonts,u.clientSecret),d=void 0===l?void 0:l,p=Object(f.a)(u,["locale","fonts","clientSecret"]),h=c.warnings;return Object(j.d)(a,j.a.blocked_card_brands_beta_1)&&Object(dn.a)(t),{value:Object(s.a)({parsedIntentSecret:d},p),warnings:h};case"shippingAddress":var _=Object(m.H)(gn,t,n),b=_.value;b.locale,b.fonts;return{value:Object(f.a)(b,["locale","fonts"]),warnings:_.warnings};case"autocompleteSuggestions":case"achBankSearchResults":return{value:Object.freeze({}),warnings:[]};default:return Object(m.a)(e)}},wn=function(e,t){switch(e){case"linkAuthentication":case"payment":case"shippingAddress":return Object(s.a)({height:"2px",margin:"-4px",width:"calc(100% + 8px)"},t?{opacity:"0",transition:"opacity 0.4s ease 0.1s"}:null);case"autocompleteSuggestions":case"achBankSearchResults":return{height:"2px",margin:"-4px",width:"calc(100% + 8px)"};default:return Object(m.a)(e)}},kn=function(e){var t=e.wallet,n=e.options;if(n.controller.keyMode()===He.a.unknown)return!1;var r=!n.publicOptions.hasOwnProperty("wallets")||"never"!==n.publicOptions.wallets[t],a=Object(j.d)(n.betas,"payment_element_beta_1")&&!Object(j.d)(n.betas,"payment_element_apple_pay_beta_1");return r&&!a},En=function(e){var t=e.elementFrame,n=e.component,r=e.componentName,a=e.listenerRegistry,o=e.loaderEnabled,i=function(e){var t=e[r];if(!t)return null;var n=function(e){var t=[],n=function e(n){var r=document.createElement("div");return Object(v.l)(r,n.style),n.isShimmerNode&&t.push(r),Array.isArray(n.children)&&n.children.forEach((function(t){return r.appendChild(e(t))})),r}(e);return n.className="__PrivateStripeElementLoader",{loaderComponent:n,shimmerNodes:t}}(t),a=n.loaderComponent,o=n.shimmerNodes;return Object(s.a)({loaderComponent:a},function(e){var t,n,r=3e3,a=function(){clearTimeout(t),clearTimeout(n)};return{startAnimation:function(){a();var o=function(t){Object(v.q)((function(){e.forEach((function(e){e.style.transition="start"===t?"transform ".concat(r,"ms ease"):"",e.style.transform="start"===t?"translateX(200%)":"translateX(-100%)"}))}))};!function e(){o("start"),n=setTimeout((function(){return o("stop")}),r),t=setTimeout(e,3500)}()},stopAnimation:a}}(o))},c=new E.a((function(e){var t=It;t&&o?(t._emit("get-element-loader-ui",{}),t._on("element-loader-ui-callback",(function(t){var n=t.message.elementLoaderUi;e(i(n))}))):e(null)})),u=function(e){return function(){c.then((function(t){t&&e(t)}))}},l=function(e){e.height&&(n.style.height=e.height)};return{show:u((function(e){var r=e.loaderComponent,a=e.startAnimation;r.style.opacity="1",t.updateStyle({opacity:"0"}),n.style.height=r.style.height,n.appendChild(r),a(),t._on("set_styles",l)})),hide:u((function(e){var r=e.loaderComponent,o=e.stopAnimation,i=Object(W.d)((function(){t._off("set_styles",l),n.style.height="",o(),n.contains(r)&&n.removeChild(r)}));a.addEventListener(r,"transitionend",i),setTimeout(i,600),r.style.opacity="0",t.updateStyle({opacity:"1"})})),unmount:u((function(e){var r=e.loaderComponent,a=e.stopAnimation;r.style.opacity="0",t.updateStyle({opacity:"1"}),t._off("set_styles",l),n.style.height="",a(),n.contains(r)&&n.removeChild(r)}))}},Sn="close",Pn="complete",An=(Object(m.A)("bcsess_"),function(e,t){return new E.a((function(n){var r;try{r=t.createLightboxFrame({type:Ye.a.LINKED_ACCOUNTS_INNER,options:e})}catch(e){return n({error:{message:e.message}})}return r.show(),r.fadeInBackdrop(),r._on(Sn,(function(){r.fadeOutBackdrop()})),r._on(Pn,(function(e){r.destroy(!0).then((function(){n(function(e){switch(e.linkAccountSessionCompleteResponse.type){case"object":var t=e.linkedAccounts,n=e.linkAccountSessionCompleteResponse,r=e.consumer,a=n.object,o=a.id,i=a.filters,c=a.permissions,s=a.payment_account,u=a.bank_account_token,l=a.return_url,d={id:o,linkedAccounts:t};return u&&(d.bankAccountToken=u),s&&!u&&(d.paymentAccount=s),i&&(d.filters=i),c&&(d.permissions=c),l&&(d.returnUrl=l),{linkAccountSession:d,consumer:r};case"error":return{error:{message:e.linkAccountSessionCompleteResponse.error.message||"stripe.collectFinancialConnectionsAccounts: an unknown error occurred.",type:e.linkAccountSessionCompleteResponse.error.type,code:e.linkAccountSessionCompleteResponse.error.code}};default:return Object(m.a)(e.linkAccountSessionCompleteResponse)}}(e))}))})),null}))}),In=function(e,t){return new E.a((function(n){var r;try{r=t.createLightboxFrame({type:Ye.a.LINKED_ACCOUNTS_INNER,options:e})}catch(e){return n({error:{message:e.message}})}return r.show(),r.fadeInBackdrop(),r._on(Sn,(function(){r.fadeOutBackdrop()})),r._on(Pn,(function(e){r.destroy(!0).then((function(){n(function(e){switch(e.linkAccountSessionCompleteResponse.type){case"object":var t=e.linkedAccounts,n=e.linkAccountSessionCompleteResponse,r=e.consumer,a=n.object,o=a.id,i=a.filters,c=a.permissions,s=a.return_url,u={id:o,accounts:t};return i&&(u.filters=i),c&&(u.permissions=c),s&&(u.return_url=s),{financialConnectionsSession:u,consumer:r};case"error":return{error:{message:e.linkAccountSessionCompleteResponse.error.message||"stripe.collectFinancialConnectionsAccounts: an unknown error occurred.",type:e.linkAccountSessionCompleteResponse.error.type,code:e.linkAccountSessionCompleteResponse.error.code}};default:return Object(m.a)(e.linkAccountSessionCompleteResponse)}}(e))}))})),null}))},Cn=function(e){var t=e.linkAccountSessionCreatorClientSecret,n=e.linkAccountSessionCreatorType,r=e.linkAccountSessionCreatorId,a=e.controller,o=e.consumerSessionSecret,i=e.linkAccountSessionCreationParams,c=e.consumerPublishableKey,s=e.checkoutPriceAmount,u=e.email,l=e.linkMobilePhone,d=e.linkMobilePhoneCountry,p=e.useContinueButtonOnSuccess;Object(v.o)(a.warn);var f=a._stripeAccount,m=a._apiVersion,h=a._apiKey;return"link_payment_intent"===n&&c&&(h=c,f=null,m=null),An({clientSecret:t,linkAccountSessionCreatorType:n,linkAccountSessionCreatorId:r,linkAccountSessionCreationParams:i,apiKey:h,consumerPublishableKey:c,consumerSessionSecret:o,stripeAccount:f,stripeVersion:m,checkoutPriceAmount:s,email:u,linkMobilePhone:l,linkMobilePhoneCountry:d,useContinueButtonOnSuccess:p},a)},Tn=function(e,t){return function(e){var t=e.linkAccountSessionCreatorClientSecret,n=e.linkAccountSessionCreatorType,r=e.linkAccountSessionCreatorId,a=e.controller,o=e.consumerSessionSecret,i=e.linkAccountSessionCreationParams,c=e.consumerPublishableKey,s=e.checkoutPriceAmount,u=e.email,l=e.linkMobilePhone,d=e.linkMobilePhoneCountry;Object(v.o)(a.warn);var p=a._stripeAccount,f=a._apiVersion,m=a._apiKey;return"link_payment_intent"===n&&c&&(m=c,p=null,f=null),In({clientSecret:t,linkAccountSessionCreatorType:n,linkAccountSessionCreatorId:r,linkAccountSessionCreationParams:i,apiKey:m,consumerPublishableKey:c,consumerSessionSecret:o,stripeAccount:p,stripeVersion:f,checkoutPriceAmount:s,email:u,linkMobilePhone:l,linkMobilePhoneCountry:d,useContinueButtonOnSuccess:!1},a)}({linkAccountSessionCreatorClientSecret:t.clientSecret,linkAccountSessionCreatorType:"link_account_session",controller:e,consumerPublishableKey:null,checkoutPriceAmount:{amount:null,currency:null},email:null,linkMobilePhone:null,linkMobilePhoneCountry:null,useContinueButtonOnSuccess:!1}).then((function(e){return"error"in e?e:{financialConnectionsSession:e.financialConnectionsSession}}))},Nn=function(e,t,n,r){return Cn({linkAccountSessionCreatorClientSecret:e,linkAccountSessionCreatorType:"payment_intent",linkAccountSessionCreatorId:t,controller:n,linkAccountSessionCreationParams:{payment_method_data:r},consumerPublishableKey:null,checkoutPriceAmount:{amount:null,currency:null},email:null,linkMobilePhone:null,linkMobilePhoneCountry:null,useContinueButtonOnSuccess:!1})},Mn=function(e,t,n,r){return Cn({linkAccountSessionCreatorClientSecret:e,linkAccountSessionCreatorType:"setup_intent",linkAccountSessionCreatorId:t,controller:n,linkAccountSessionCreationParams:{payment_method_data:r},consumerPublishableKey:null,checkoutPriceAmount:{amount:null,currency:null},email:null,linkMobilePhone:null,linkMobilePhoneCountry:null,useContinueButtonOnSuccess:!1})},Rn={country:"US",currency:"usd",total:{amount:0,label:""},requestPayerName:!0,requestPayerEmail:!1,requestPayerPhone:!1},xn=function(e,t,n,r){var a="applePay"===r?"googlePay":"applePay",o=new it({controller:e.controller,authentication:{apiKey:e.controller._apiKey,accountId:e.controller._stripeAccount||null},mids:e.mids,rawOptions:Object(s.a)(Object(s.a)({},Rn),{},{disableWallets:["browserCard",a]}),betas:e.betas,queryStrategyOverride:null,listenerRegistry:t});o._on("token",(function(t){e.controller.action.completeWalletConfirm({type:"token",token:t.token.id}).then((function(){t.complete("success")})).catch((function(){t.complete("unexpected failure")}))})),o._on("cancel",(function(){e.controller.action.completeWalletConfirm({type:"cancelled"})}));var i=o.canMakePayment().then((function(e){e&&e[r]&&(n.send({action:"should-list-wallet",payload:{wallet:r}}),n._on("show-wallet",(function(e){(function(e){return e.replace(/_./g,(function(e){return e[1].toUpperCase()}))})(e)===r&&o.show()})))}));return{pr:o,canMakePaymentPromise:i}},Bn=n(19),Ln={PAYMENT_INTENT:"payment_intent",SETUP_INTENT:"setup_intent"},Dn=function(e,t,n,r,a){(function(e){var t=e.linkAccountSessionCreatorClientSecret,n=e.linkAccountSessionCreatorType,r=e.createdBy,a=e.controller,o=e.attachRequired,i=e.institution,c=e.data,s=e.manualEntryOnly,u=e.searchSession;return Cn({linkAccountSessionCreatorClientSecret:t,linkAccountSessionCreatorType:n,linkAccountSessionCreatorId:r,controller:a,linkAccountSessionCreationParams:{attach_required:o,initial_institution:i,payment_method_data:c,manual_entry_only:s,search_session:u},consumerPublishableKey:null,checkoutPriceAmount:{amount:null,currency:null},email:null,linkMobilePhone:null,linkMobilePhoneCountry:null,useContinueButtonOnSuccess:!0})})({linkAccountSessionCreatorClientSecret:r.clientSecret,linkAccountSessionCreatorType:Ln[r.type],createdBy:r.id,controller:e.controller,attachRequired:!1,institution:t,data:{type:"us_bank_account"},searchSession:a,manualEntryOnly:n}).then((function(t){if("error"in t)e.controller.action.completeLinkAccountSessionElements({groupId:e.groupId,error:Bn.d});else if(t.linkAccountSession.paymentAccount){var n=t.linkAccountSession.paymentAccount;switch(n.object){case"financial_connections.account":case"linked_account":var r=n;e.controller.action.completeLinkAccountSessionElements({groupId:e.groupId,bankAccount:{sessionId:t.linkAccountSession.id,displayName:r.display_name,bankName:r.institution_name,last4:r.last4||"",type:"instant"}});break;case void 0:var a=n;e.controller.action.completeLinkAccountSessionElements({groupId:e.groupId,bankAccount:{sessionId:t.linkAccountSession.id,displayName:"Bank account",bankName:a.bank_name,last4:a.last4,type:"manual"}});break;default:Object(m.a)(n)}}else e.controller.action.completeLinkAccountSessionElements({groupId:e.groupId,error:Bn.e})}))},qn=function(e){var t=e.options,n=e.institutionId,r=e.manualEntryOnly,a=e.parsedClientSecret,o=e.searchSession;Dn(t,n,r,a,o)},Fn=function(e,t){var n=e.createHiddenFrame(Ye.a.GOOGLE_MAPS_APP,{apiKey:"AIzaSyCab6eIMNih34mQb3XI_QWXagmF2_rvQAg"});return n._on("get-google-maps-predictions",(function(e){!function(e,t){n.send({action:"get-google-maps-predictions",payload:{data:{search:e,countryRestrictions:t}}})}(e.search,e.countryRestrictions)})),n._on("get-google-maps-details",(function(e){!function(e){n.send({action:"get-google-maps-details",payload:{data:{placeId:e}}})}(e.placeId)})),n._on("google-maps-callback",(function(e){var n=e.event,r=e.message;switch(n){case"gotPredictions":!function(e){t.send({action:"google-maps-predictions",payload:{data:e}})}(r);break;case"gotDetails":!function(e){t.send({action:"google-maps-details",payload:{data:e}})}(r)}})),n},Un=function(e){e.parsedIntentSecret,e.appearance;return Object(f.a)(e,["parsedIntentSecret","appearance"])},Hn=function(e){var t=e.controller,n=e.componentName,r=e.groupId,a=e.fonts,o=e.wait,i=e.publicOptions,c=e.controllingElement,s=e.mountedInternal,u={fonts:a,wait:o,rtl:dt(document.body),publicOptions:Un(i),controllingElement:c,mountedInternal:s},l=pt.b[n];return t.createElementFrame(l,n,r,u)},Gn=function(e){var t=e.props,n=e.componentName,r=e.controllingElement,a=e.ariaHidden,o=t.component,i=t.elementTimings,c=t.getParent,u=t.options,l=Hn(Object(s.a)(Object(s.a)({},u),{},{componentName:n,controllingElement:r}));l.appendTo(o),l.updateStyle(Object(s.a)(Object(s.a)({},wn(n,!1)),{},{position:"absolute",zIndex:"1"})),l._iframe.setAttribute("aria-hidden",a),l._on("load",(function(){l.send({action:"stripe-user-mount",payload:{timestamps:{stripeJsLoad:i.stripeJsLoadTimestamp.getAsPosixTime(),stripeCreate:i.stripeCreateTimestamp.getAsPosixTime(),groupCreate:i.groupCreateTimestamp.getAsPosixTime(),create:i.createTimestamp.getAsPosixTime(),mount:(new at.a).getAsPosixTime()},rtl:dt(c())}})})),l._on("set_styles",(function(e){l.updateStyle(e)})),"achBankSearchResults"===n&&l._on("us-bank-account-v2-launch",(function(e){return qn(Object(s.a)({options:u},e))}))},zn=function(e){var t=e.controller,n=e.locale,r=e.isDarkMode,a=e.businessName,o=e.financialIncentive,i=t.createLightboxFrame({type:Ye.a.LINK_INFO_MODAL,options:{locale:n,isDarkMode:r,businessName:a,financialIncentive:o}});i.show(),i.fadeInBackdrop();i._on("close",(function(){i.fadeOutBackdrop(),i.destroy(!0)}))},Kn=function(e){var t=e.component,n=e.listenerRegistry,r=e.elementTimings,a=e.getParent,o=e.emitEvent,i=e.options,c=e.selfDestruct,u=null,l=[],d=Hn(i),p=-1!==["auto","always"].indexOf(i.loader)&&-1!==["linkAuthentication","payment","shippingAddress"].indexOf(i.componentName),f=En({controller:i.controller,elementFrame:d,component:t,componentName:i.componentName,listenerRegistry:n,loaderEnabled:p});if(d._on("load-error",(function(e){o("loaderror",{error:e}),c()})),"shippingAddress"===i.componentName&&d._on("setup-google-maps-autocomplete",(function(){!function(e,t){var n=Fn(e,t);t._on("get-google-maps-predictions",(function(e){n._emit("get-google-maps-predictions",e)})),t._on("get-google-maps-details",(function(e){n._emit("get-google-maps-details",e)}))}(i.controller,d),Gn({props:e,componentName:"autocompleteSuggestions",controllingElement:"shippingAddressElement"})})),"payment"===i.componentName){var m;if(i.publicOptions.parsedIntentSecret)i.controller.action.setupStoreForElementsGroup({clientSecret:i.publicOptions.parsedIntentSecret,customerOptions:null,locale:i.locale,groupId:i.groupId,appearance:null!==(m=i.publicOptions.appearance)&&void 0!==m?m:i.appearance});var h=null,_=function(){return cn().then((function(e){var t=e.mountModal,n=e.unmountModal;return l.push((function(){n()})),t}))};d._on("setup-afterpay-modal",(function(){h||(h=_())})),d._on("mount-afterpay-modal",(function(e){var t=e.locale,r=e.modalTheme;h||(h=_()),h.then((function(e){e({controller:i.controller,listenerRegistry:n,locale:t,modalTheme:r})}))}));var b=null,y=function(){return nn().then((function(e){var t=e.mountModal,n=e.unmountModal;return l.push((function(){n()})),t}))};d._on("setup-affirm-modal",(function(){b||(b=y())})),d._on("affirm-modal-open",(function(e){var t=e.link;b||(b=y()),b.then((function(e){e({controller:i.controller,listenerRegistry:n,url:t})}))})),d._on("setup-us-bank-account",(function(){Gn({props:e,componentName:"achBankSearchResults",controllingElement:"paymentElement",ariaHidden:"true"})}));var O=null;!O&&kn({wallet:"applePay",options:i})&&(O=xn(i,n,d,"applePay")),d._on("update-apple-pay",(function(e){var t;null===(t=O)||void 0===t||t.pr.update(e)}));var g=null;if(!g&&kn({wallet:"googlePay",options:i})&&(g=xn(i,n,d,"googlePay")),d._on("update-google-pay",(function(e){var t;null===(t=g)||void 0===t||t.pr.update(e)})),g||O){var j,w,k=i.groupId;i.controller.action.fetchingWallets({groupId:k,isComplete:!1}),E.a.all([null===(j=g)||void 0===j?void 0:j.canMakePaymentPromise,null===(w=O)||void 0===w?void 0:w.canMakePaymentPromise]).then((function(){i.controller.action.fetchingWallets({groupId:k,isComplete:!0})}))}d._on("link-launch",(function(e){var t=e.institutionId,n=e.parsedClientSecret,r=e.consumerClientSecret,a=e.consumerPublishableKey,o=e.checkoutPriceAmount,c=e.email,s=e.linkMobilePhone,u=e.linkMobilePhoneCountry;(function(e,t,n,r,a,o,i,c,s,u){return Cn({linkAccountSessionCreatorClientSecret:t,linkAccountSessionCreatorType:"link_payment_intent",linkAccountSessionCreatorId:n,controller:r,linkAccountSessionCreationParams:{initial_institution:e},consumerSessionSecret:a,consumerPublishableKey:o,checkoutPriceAmount:i,email:c,linkMobilePhone:s,linkMobilePhoneCountry:u,useContinueButtonOnSuccess:!1})})(t,n.clientSecret,n.id,i.controller,null!=r?r:void 0,a,o,c,s,u).then((function(e){e.error||(null!=e.consumer?i.controller.action.loginWithConsumerInfo({consumerInfo:e.consumer,groupId:i.groupId}):e.linkAccountSession.paymentAccount&&i.controller.action.createBankPaymentDetails({bankAccount:e.linkAccountSession.paymentAccount.id,groupId:i.groupId}))}))})),d._on("us-bank-account-v2-launch",(function(e){qn(Object(s.a)({options:i},e))}))}d._on("mount-link-info-modal",(function(e){zn(Object(s.a)({controller:i.controller},e))})),Object(v.l)(t,Object(s.a)(Object(s.a)({},ft.a),{},{margin:"-4px 0",transition:"height .35s ease"})),d.appendTo(t),d.updateStyle(wn(i.componentName,p)),d._on("load",(function(){d.send({action:"stripe-user-mount",payload:{timestamps:{stripeJsLoad:r.stripeJsLoadTimestamp.getAsPosixTime(),stripeCreate:r.stripeCreateTimestamp.getAsPosixTime(),groupCreate:r.groupCreateTimestamp.getAsPosixTime(),create:r.createTimestamp.getAsPosixTime(),mount:u?u.getAsPosixTime():0},rtl:dt(a())}})})),pt.e.forEach((function(e){d._on(e,(function(t){return o(e,t)}))})),d._on("set_styles",(function(e){d.updateStyle(e)})),d._on("redirectfocus",(function(e){var n,r=e.focusDirection;null===(n=Object(v.d)(t,r))||void 0===n||n.focus()})),d._on("submit",(function(){o("submit");var e=t.closest("form");if(e){var n=['button[type="submit"]','input[type="submit"]','input[type="image"]'].map((function(t){return e.querySelector(t)})).filter((function(e){return!!e}))[0];n&&n.click()}}));p&&d._on("ready",(function(){f.hide()}));return{update:function(e){e.appearance&&i.controller.action.updateElementsOptions({locale:void 0,appearance:e.appearance,groupId:i.groupId}),d.update(e)},focus:function(){document.activeElement&&document.activeElement.blur&&document.activeElement.blur(),d.focus(),d.send({action:"stripe-user-focus",payload:{}})},blur:function(){d.blur()},clear:function(){d.clear()},mount:function(){u=new at.a;var e=a();e&&(p&&(f.show(),l.push(f.unmount)),Object(v.n)(e,[[pt.a,!0]]),l.push((function(){Object(v.n)(e,[[pt.a,!1]])})))},unmount:function(){for(;l.length;)l.pop()();d.unmount()},collapse:function(){d.collapse()},_frame:d}},Yn=function(e){var t=e.options,n=Object(f.a)(e,["options"]),r=t.controller,a=t.componentName,o=t.publicOptions,i=Object(f.a)(t,["controller","componentName","publicOptions"]),c=function(e){switch(e){case"linkAuthentication":case"payment":case"shippingAddress":case"autocompleteSuggestions":case"achBankSearchResults":return e;default:throw new Error("Unexpected element type for implementation")}}(a),u=jn(c,o||{},"elements.create('".concat(c,"')"),!1,t.betas);u.warnings.forEach((function(e){return r.warn(e)}));var l=["payment","linkAuthentication"].indexOf(a)>-1,d="payment"===t.componentName&&(u.value.parsedIntentSecret||null);if(l&&!t.clientSecret&&!d)throw new k.b("In order to create a ".concat(t.componentName,' element, you must pass a valid PaymentIntent or SetupIntent client secret when creating the Elements group.\n\n  e.g. stripe.elements({clientSecret: "{{CLIENT_SECRET}}"})'));var p=Kn(Object(s.a)(Object(s.a)({},n),{},{options:Object(s.a)(Object(s.a)({},i),{},{controller:r,componentName:c,publicOptions:u.value})})),m=p.update,h=Object(f.a)(p,["update"]);return Object(s.a)({update:function(e){var n=jn(c,e||{},"".concat(c,".update()"),!0,t.betas);n.warnings.forEach((function(e){return r.warn(e)})),m(n.value)}},h)},Wn=Object.freeze({header:Object(m.w)(Object(m.y)({text:Object(m.w)(m.B)})),showOnAdd:Object(m.w)(Object(m.u)("auto","never"))}),Vn=Object.freeze(Object(s.a)({clientSecret:dn.c,descriptor:Object(m.w)(Object(m.u)("cart","bag","basket"))},Wn)),Jn=(Object.freeze(Object(s.a)({},Object(w.g)(Vn,["clientSecret"]))),Object.freeze({price:Object(m.w)(m.B),product:Object(m.w)(m.B),quantity:Object(m.w)(m.r)})),Xn=(Object.freeze(Object(s.a)(Object(s.a)({},Jn),{},{quantity:m.r,outerRequestId:m.r})),["ready","change","checkout"]),$n="StripeElement",Qn={margin:"0",padding:"0",border:"none",display:"block",background:"transparent",position:"relative",opacity:"1"},Zn={visibility:"hidden",position:"fixed",top:"0px",left:"100%",width:"100%",height:"100%","pointer-events":"none","max-width":"none","max-height":"none","min-width":"none","min-height":"none"},er={visibility:"visible",position:"fixed",top:"0px",left:"0px","z-index":"99999",width:"100%",height:"100%","pointer-events":"all","max-width":"none","max-height":"none","min-width":"none","min-height":"none"},tr=function(e){var t=e.component,n=e.getParent,r=e.emitEvent,a=e.options,o=e.selfDestruct,i={mounted:!1,frameReady:!1,visible:!1,showStarted:!1,releasePageScroll:null,restoreFocus:null,runOnUnmount:[],addRequestIdCounter:0};Object(v.l)(t,Qn);var c=function(e){var t=e.controller,n=e.componentName,r=e.groupId,a={fonts:e.fonts,wait:e.wait,rtl:!1,publicOptions:e.publicOptions,controllingElement:e.controllingElement};return t.createElementFrame(Ye.a.CART_ELEMENT,n,r,a)}(a);c.updateStyle(Zn),c.appendTo(t);var u=function(e){return function(t){i.mounted&&i.frameReady&&e(t)}},l=u((function(){i.visible||(i.visible=!0,c.updateStyle(er),c.show(),i.releasePageScroll=Object(v.i)(),(i.restoreFocus?i.restoreFocus():E.a.resolve()).then((function(){var e=Object(v.b)(c._iframe),t=e.lockedPromise,n=e.lockedElements;i.restoreFocus=function(){return Object(v.j)(t,n)}})))})),d=u((function(){i.visible&&(c.hide(),i.showStarted||(b(),y()))})),p=u((function(e){c.cancelCheckout(e)})),f=function(e){return function(){throw new k.b(e)}},m=f("focus() is not supported by the cart Element."),h=f("blur() is not supported by the cart Element."),_=f("clear() is not supported by the cart Element.");c._on("load-error",(function(e){null==r||r("loaderror",{error:e}),null==o||o()})),c._on("ready",(function(){i.frameReady=!0})),Xn.forEach((function(e){c._on(e,(function(t){return null==r?void 0:r(e,t)}))})),c._on("lineitemclick",(function(e){var t=e.url,n=!1;r("lineitemclick",{preventDefault:function(){n=!0},url:t}),n||(window.location.href=t)})),c._on("show-start",(function(){i.visible&&(i.showStarted=!0)}));var b=function(){var e,t;null===(e=i.releasePageScroll)||void 0===e||e.call(i),i.releasePageScroll=null,null===(t=i.restoreFocus)||void 0===t||t.call(i).then((function(){i.restoreFocus=null})),i.showStarted=!1,i.visible=!1},y=function(){i.visible||c.updateStyle(Zn)};return c._on("hide-start",b),c._on("hide-complete",y),c._on("show",l),{update:function(e){c.update(e)},focus:m,blur:h,clear:_,mount:function(){i.mounted=!0;var e=n();e&&(Object(v.n)(e,[[$n,!0]]),i.runOnUnmount.push((function(){Object(v.n)(e,[[$n,!1]])})));var t=function(){p()};window.addEventListener("beforeunload",t),i.runOnUnmount.push((function(){return window.removeEventListener("beforeunload",t)}));var r=function(e){"Escape"===e.code&&d()};window.addEventListener("keydown",r),i.runOnUnmount.push((function(){return window.removeEventListener("keydown",r)}))},unmount:function(){for(var e,t;i.runOnUnmount.length;){var n;null===(n=i.runOnUnmount.pop())||void 0===n||n()}null===(e=i.releasePageScroll)||void 0===e||e.call(i),null===(t=i.restoreFocus)||void 0===t||t.call(i),i.mounted=!1,i.releasePageScroll=null,i.restoreFocus=null,c.unmount()},show:l,hide:d,addLineItem:function(e){if(!i.frameReady||!i.mounted)return E.a.resolve({clientError:"initializing"});var t=++i.addRequestIdCounter;return c.addLineItem(Object(s.a)(Object(s.a)({},e),{},{quantity:e.quantity||1,outerRequestId:t})),new E.a((function(e){c._on("add-line-item-response",(function n(r){var a=r.outerRequestId,o=r.error;a===t&&(c._off("add-line-item-response",n),e(o?{error:o}:{}))}))}))},cancelCheckout:p,_frame:c}},nr=function(e){var t=e.options,n=Object(f.a)(e,["options"]),r=t.controller,a=t.publicOptions,o=(t.componentName,Object(f.a)(t,["controller","publicOptions","componentName"]));if(r.keyMode()===He.a.unknown)throw new k.b("It looks like you're using an older Stripe key. The Cart Element is only available for use with a modern API key, which is prefixed with 'pk_live_' or 'pk_test_'.\n      You can roll your publishable key here: https://dashboard.stripe.com/account/apikeys");var i,c,u,l=(i=a||{},c="elements.create('cart', options)",Object(m.H)(Object(m.y)(Vn),i,c,u?{authenticatedOrigin:u}:null)),d=l.value,p=d.clientSecret,h=Object(f.a)(d,["clientSecret"]);l.warnings.forEach((function(e){return r.warn(e)}));var _={},b=function(e,t){return e.forEach((function(e){return r.warn(e)})),E.a.resolve({clientError:t})},y=tr(Object(s.a)(Object(s.a)({},n),{},{options:Object(s.a)(Object(s.a)({},o),{},{componentName:"cart",controller:r,publicOptions:h})})),v=y.update,O=y.cancelCheckout,g=y.addLineItem,j=Object(f.a)(y,["update","cancelCheckout","addLineItem"]);return r.action.fetchCartSession({clientSecret:p,groupId:t.groupId}).catch((function(t){e.emitEvent("loaderror",{error:t}),e.selfDestruct()})),Object(s.a)(Object(s.a)({},j),{},{update:function(e){var t=function(e,t,n){return Object(m.H)(Object(m.y)(Wn),e,t,n?{authenticatedOrigin:n}:null)}(e||{},"cart.update()"),n=t.value;t.warnings.forEach((function(e){return r.warn(e)})),v(n)},addLineItem:function(e){var t=function(e,t){var n=Object(m.H)(Object(m.y)(Jn),e,"cart.addLineItem()",t?{authenticatedOrigin:t}:null);return{value:n.value,warnings:n.warnings}}(e||{}),n=t.value,r=t.warnings,a=n.product||n.price;if(a){if(function(e){var t=Date.now(),n=_[e],r=void 0!==n&&t-n<200;return r||(_[e]=t),r}(a))return r.push("addLineItem() cannot be consecutively called within ".concat(200," milliseconds for the same price or product.")),b(r,"throttled")}else r.push("addLineItem() must be provided either a product or price.");return r.length?b(r,"integration"):g(n)},cancelCheckout:function(e){var t="string"==typeof e,n=t?e:"";t||r.warn("Expected a string passed to cancelCheckout(), but received ".concat(typeof e,".")),O(n)}})},rr=function(e,t){var n=function(e){if(!U.b[e])throw new Error("Unexpected Element type: ".concat(e,"."));return U.b[e].implementation}(e);switch(n){case"legacy":return new $t(t);case"affirm_message":return rn(t);case"afterpay_message":return sn(t);case"frame":return Yn(t);case"cart":return nr(t);default:return Object(m.a)(n,"Unexpected implementation type: ".concat(n,"."))}},ar=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object(w.h)(e,["business","fields","paymentMethodOrder","readOnly","terms","wallets","allowedCardBrands","disallowedCardBrands","accountHolderType","disabled","hideIcon","hidePostalCode","iconStyle","placeholderCountry","rtl","showIcon","supportedCountries","betas","componentName","groupId","locale","loader"])},or=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e,r,a){var o;Object(l.a)(this,n),(o=t.call(this)).mount=x((function(e){var t;if(o._checkDestroyed(),!e)throw new k.b("Missing argument. Make sure to call mount() with a valid DOM element or selector.");if("string"==typeof e){var n=document.querySelectorAll(e);if(n.length>1&&o._controller.warn("The selector you specified (".concat(e,") applies to ").concat(n.length," DOM elements that are currently on the page.\nThe Stripe Element will be mounted to the first one.")),!n.length)throw new k.b("The selector you specified (".concat(e,") applies to no DOM elements that are currently on the page.\nMake sure the element exists on the page before calling mount()."));t=n[0]}else{if(!e.appendChild)throw new k.b("Invalid DOM element. Make sure to call mount() with a valid DOM element or selector.");t=e}if("INPUT"===t.nodeName)throw new k.b("Stripe Elements must be mounted in a DOM element that\ncan contain child nodes. `input` elements are not permitted to have child\nnodes. Try using a `div` element instead.");t.children.length&&t!==document.body&&o._controller.warn("This Element will be mounted to a DOM element that contains child nodes."),o._mountToParent(t)})),o.update=x((function(e){return o._controller.report("update",{options:ar(e),element:o._componentName}),o._checkDestroyed(),o._implementation.update(e),Object(G.a)(o)})),o.focus=x((function(e){return o._checkDestroyed(),e&&e.preventDefault(),o._implementation.focus(),Object(G.a)(o)})),o.blur=x((function(){return o._checkDestroyed(),o._implementation.blur(),Object(G.a)(o)})),o.clear=x((function(){return o._checkDestroyed(),o._implementation.clear(),Object(G.a)(o)})),o.collapse=x((function(){if(o._checkDestroyed(),!o._implementation.collapse)throw new k.b("Collapse is not supported by the ".concat(o._componentName," Element."));return o._implementation.collapse(),Object(G.a)(o)})),o.show=x((function(){if(o._checkDestroyed(),!o._implementation.show)throw new k.b("show() is not supported by the ".concat(o._componentName," Element."));return o._implementation.show(),Object(G.a)(o)})),o.hide=x((function(){if(o._checkDestroyed(),!o._implementation.hide)throw new k.b("hide() is not supported by the ".concat(o._componentName," Element."));return o._implementation.hide(),Object(G.a)(o)})),o.addLineItem=x((function(e){if(o._checkDestroyed(),o._implementation.addLineItem)return o._implementation.addLineItem(e);throw new k.b("addLineItem() is not supported by the ".concat(o._componentName," Element."))})),o.cancelCheckout=x((function(e){if(o._checkDestroyed(),!o._implementation.cancelCheckout)throw new k.b("cancelCheckout() is not supported by the ".concat(o._componentName," Element."));return o._implementation.cancelCheckout(e),Object(G.a)(o)})),o.unmount=x((function(){return o._checkDestroyed(),o._unmount(),Object(G.a)(o)})),o.destroy=x((function(){return o._checkDestroyed(),o.unmount(),o._destroyed=!0,o._emitEvent("destroy"),Object(G.a)(o)})),o._getParent=function(){return o._parent},o._emitEvent=function(e,t){return"loaderror"!==e||o._hasRegisteredListener("loaderror")||o._controller.keyMode()!==He.a.test||console.error("Unhandled ".concat(o._componentName," Element loaderror"),t),o._emit(e,Object(s.a)({elementType:o._componentName},t))};var i=e.controller,c=e.componentName,u=e.groupId,d=e.locale,p=e.betas,f=e.mids;o._controller=i,o._componentName=c,o._destroyed=!1,o._mids=f;var m=document.createElement("div");return m.className=U.d,o._component=m,i.report("create",{options:ar(Object(s.a)({componentName:c,groupId:u,locale:d,betas:p},e.publicOptions)),element:c}),o._implementation=rr(o._componentName,{options:e,component:m,listenerRegistry:r,elementTimings:a,emitEvent:o._emitEvent,getParent:o._getParent,hasRegisteredListener:o._hasRegisteredListener,selfDestruct:function(){o.destroy()}}),o}return Object(d.a)(n,[{key:"_checkDestroyed",value:function(){if(this._destroyed)throw new k.b("This Element has already been destroyed. Please create a new one.")}},{key:"_isMounted",value:function(){return!!document.body&&document.body.contains(this._component)}},{key:"_unmount",value:function(){var e=this._component.parentElement;e&&e.removeChild(this._component),this._implementation.unmount(),this._parent=null}},{key:"_mountToParent",value:function(e){var t=this._component.parentElement,n=this._isMounted();if(e===t){if(n)return;this.unmount(),this._mountTo(e)}else if(t){if(n)throw new k.b("This Element is already mounted. Use `unmount()` to unmount the Element before re-mounting.");this.unmount(),this._mountTo(e)}else this._mountTo(e)}},{key:"_mountTo",value:function(e){for(this._parent=e;e.firstChild&&e!==document.body;)e.removeChild(e.firstChild);e.appendChild(this._component),this._controller.report("mount",{element:this._componentName}),this._implementation.mount()}}]),n}(Y),ir=function(e,t){e._controller.report("legacy_private_property_used",{prop:t,componentName:e._componentName})};["_autofilled","_classes","_complete","_empty","_fakeInput","_focused","_frame","_invalid","_lastBackgroundColor","_lastFontSize","_lastHeight","_lastPadding","_lastSubmittedAt","_listenerRegistry","_paymentRequest"].forEach((function(e){Object.defineProperty(or.prototype,e,{enumerable:!1,get:function(){return ir(this,e),this._implementation[e]}})}));["_formSubmit","_isIssuingDisplayElement"].forEach((function(e){Object.defineProperty(or.prototype,e,{enumerable:!1,writable:!1,value:function(){return ir(this,e),this._implementation[e]()}})}));var cr=or,sr=Object(m.y)({locale:Object(m.w)(m.B),appearance:Object(m.w)(m.t)}),ur=function e(t,n,r,a,o,i){var c=this;Object(l.a)(this,e),this.getElement=x((function(e){var t,n=(null!=(t=e)&&t.__elementType&&"string"==typeof t.__elementType&&"function"==typeof t?t.__elementType:null)||e;return H(n,c._betas),Object(w.a)(c._elements,(function(e){return e._componentName===n}))||null})),this.update=x((function(e){var t=Object(m.H)(sr,e||{},"elements.update()"),n=t.value;t.warnings.forEach((function(e){return c._controller.warn(e)}));var r=n.locale,a=n.appearance,o=void 0===a?void 0:a,i=Object(j.f)(r,c._betas);i&&c._controller.action.fetchLocale({locale:i}),(o||i)&&c._controller.action.updateElementsOptions({locale:i,appearance:o,groupId:c._id})})),this.create=B((function(e,t){var n=new at.a;!function(e,t,n){if(H(e,n),U.b[e].unique&&-1!==t.indexOf(e))throw new k.b("Can only create one Element of type ".concat(e,"."));var r=U.b[e].conflict,a=Object(w.i)(t,r);if(a.length){var o=a[0];throw new k.b("Cannot create an Element of type ".concat(e," after an Element of type ").concat(o," has already been created."))}}(e,c._elements.map((function(e){return e._componentName})),c._betas);var r=Object(s.a)(Object(s.a)(Object(s.a)({},t),c._commonOptions),{},{componentName:e,groupId:c._id}),a=(r.paymentRequest,Object(f.a)(r,["paymentRequest"])),o=(O.e||O.g)&&Object(g.j)(a).length>2e3,i=!!c._pendingFonts||o,l=new cr(Object(s.a)(Object(s.a)({publicOptions:t},c._commonOptions),{},{componentName:e,groupId:c._id,fonts:o?null:c._commonOptions.fonts,controller:c._controller,wait:i,mids:c._mids}),c._listenerRegistry,Object(s.a)(Object(s.a)({},c._timings),{},{createTimestamp:n}));return c._elements=[].concat(Object(u.a)(c._elements),[l]),l._on("destroy",(function(){c._elements=c._elements.filter((function(t){return t._componentName!==e}))})),o&&l._implementation.update({fonts:c._commonOptions.fonts}),l})),this.fetchUpdates=L((function(){if(c._commonOptions.clientSecret)return c._controller.action.fetchUpdates({clientSecret:c._commonOptions.clientSecret,customerOptions:c._customerOptions,locale:c._commonOptions.locale,groupId:c._id}).then((function(e){if("error"===(null==e?void 0:e.type)){var t=e.error,n=t.message,r=t.extra_fields;return(null==r?void 0:r.status)?{error:{message:n,status:r.status}}:{error:{message:n}}}return{}}));throw new k.b('In order to call fetchUpdates, you must pass a valid PaymentIntent or SetupIntent client secret when creating the Elements group.\n\n  e.g. stripe.elements({clientSecret: "{{CLIENT_SECRET}}"})')}));var d=new at.a,p=Object(m.H)(function(e){var t={locale:Object(m.w)(m.B),fonts:Object(m.w)(Object(m.b)(m.t)),appearance:Object(m.w)(m.t),clientSecret:Object(m.w)(dn.d),loader:Object(m.w)(Object(m.u)("auto","always","never"))};return Object(j.d)(e,j.a.elements_customers_beta_1)?Object(m.y)(Object(s.a)(Object(s.a)({},t),{},{customerOptions:Object(m.w)(Object(m.y)({customer:m.B,ephemeralKey:m.B}))})):Object(m.y)(t)}(a),i||{},"elements()"),h=p.value;p.warnings.forEach((function(e){return t.warn(e)})),Object(v.p)(t.warn),t.report("elements",{options:h}),h.loader||(Object(j.d)(a,j.a.link_beta_3)?h.loader="auto":h.loader="never");var _=h.fonts,y=void 0===_?[]:_,E=h.locale,S=h.customerOptions,P=void 0===S?null:S,A=Object(f.a)(h,["fonts","locale","customerOptions"]);this._customerOptions=P;var I=h.appearance?h.appearance:{};this._elements=[],this._id=b("elements"),this._timings=Object(s.a)(Object(s.a)({},r),{},{groupCreateTimestamp:d}),this._controller=t,this._betas=a,this._listenerRegistry=n,this._mids=o;var C=Object(j.f)(E,a);this._controller.action.fetchLocale({locale:C||"auto"});var T=y.filter((function(e){return!e.cssSrc||"string"!=typeof e.cssSrc})).map((function(e){return Object(s.a)(Object(s.a)({},e),{},{__resolveFontRelativeTo:window.location.href})})),M=y.map((function(e){return e.cssSrc})).reduce((function(e,t){return"string"==typeof t?[].concat(Object(u.a)(e),[t]):e}),[]).map((function(e){return Object(g.d)(e)?e:Object(g.h)(window.location.href,e)}));(this._pendingFonts=M.length,Object(j.d)(a,j.a.payment_element_beta_1)&&!A.clientSecret||t.action.setupStoreForElementsGroup({clientSecret:A.clientSecret,customerOptions:P,locale:E,appearance:I,groupId:this._id}),this._commonOptions=Object(s.a)(Object(s.a)({},A),{},{betas:a,appearance:I,locale:C,fonts:T}),M.forEach((function(e){if("string"==typeof e){var t=new at.a;N(e).then((function(n){c._controller.report("font.loaded",{load_time:t.getElapsedTime(),font_count:n.length,css_src:e});var r=n.map((function(t){return Object(s.a)(Object(s.a)({},t),{},{__resolveFontRelativeTo:e})}));c._controller.action.updateCSSFonts({fonts:r,groupId:c._id}),c._commonOptions=Object(s.a)(Object(s.a)({},c._commonOptions),{},{fonts:[].concat(Object(u.a)(c._commonOptions.fonts?c._commonOptions.fonts:[]),Object(u.a)(r))})})).catch((function(n){c._controller.report("error.font.not_loaded",{load_time:t.getElapsedTime(),message:n&&n.message&&n.message,css_src:e}),c._controller.warn("Failed to load CSS file at ".concat(e,"."))}))}})),"never"!==h.loader)&&function(e){return It||((It=e.createHiddenFrame(Ye.a.LOADER_UI_APP,{}))._on("generate-loader-ui",(function(e){It.send({action:"generate-loader-ui",payload:{data:e}})})),It._on("get-element-loader-ui",(function(e){It.send({action:"get-element-loader-ui",payload:{}})})),It)}(t)._emit("generate-loader-ui",{rawAppearanceConfig:I});return this},lr=function(e,t,n,r,a,o,i){return new it({controller:e,authentication:t,mids:n,rawOptions:r,betas:a,queryStrategyOverride:o,listenerRegistry:i})},dr=Object(m.y)({name:Object(m.u)("react-stripe-js","stripe-js","react-stripe-elements"),version:Object(m.q)(m.B),startTime:Object(m.w)(m.r)}),pr=Object(m.h)({name:Object(m.z)(1,30),partner_id:Object(m.w)(Object(m.A)("pp_partner_")),version:Object(m.w)(Object(m.z)(5,15)),url:Object(m.w)(Object(m.z)(4,60))}),fr=n(11),mr={border:"none",margin:"0",padding:"0",width:"1px","min-width":"100%",overflow:"hidden",display:"block","user-select":"none",transform:"translate(0)","color-scheme":"only light"},hr=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e){var r;return Object(l.a)(this,n),r=t.call(this,e),O.j&&r._listenerRegistry.addEventListener(document,"transitionstart",(function(e){switch(e.propertyName){case"opacity":case"transform":case"visibility":var t=e.target;r._isMounted()&&t.contains(r._iframe)&&r._forceRepaint()}}),{passive:!0}),r}return Object(d.a)(n,[{key:"update",value:function(e){this.send({action:"stripe-user-update",payload:e})}},{key:"updateStyle",value:function(e){var t=this;Object.keys(e).forEach((function(n){t._iframe.style[n]=e[n]}))}},{key:"focus",value:function(){this.loaded&&(O.j?this._iframe.focus():this.send({action:"stripe-user-focus",payload:{}}))}},{key:"blur",value:function(){this.loaded&&(this._iframe.contentWindow.blur(),this._iframe.blur(),document.activeElement===this._iframe&&(window.focus(),document.activeElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()))}},{key:"clear",value:function(){this.send({action:"stripe-user-clear",payload:{}})}},{key:"collapse",value:function(){this.send({action:"stripe-user-collapse",payload:{}})}},{key:"show",value:function(){this.send({action:"stripe-user-show",payload:{}})}},{key:"hide",value:function(){this.send({action:"stripe-user-hide",payload:{}})}},{key:"addLineItem",value:function(e){this.send({action:"stripe-user-add-line-item",payload:e})}},{key:"cancelCheckout",value:function(e){this.send({action:"stripe-user-cancel-checkout",payload:{errorMessage:e}})}},{key:"_createIFrame",value:function(e,t,r){var a=At(Object(Pt.a)(n.prototype),"_createIFrame",this).call(this,e,t,r);return a.setAttribute("title","Secure payment input frame"),Object(v.l)(a,mr),a}},{key:"_forceRepaint",value:function(){var e=this._iframe,t=e.style.display;e.style.display="none";var n=e.offsetHeight;return e.style.display=t,n}}]),n}(Ct),_r={position:"absolute",left:"0",top:"0",height:"100%",width:"100%"},br=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(e){var r,a,o,i=e.type,c=e.controllerId,s=e.listenerRegistry,u=e.options;return Object(l.a)(this,n),(o=t.call(this,{type:i,controllerId:c,listenerRegistry:s,appParams:u}))._autoMount=function(){o.appendTo(o._backdrop.domElement),o._backdrop.mount()},o.show=function(){o._backdrop.show(),Object(v.l)(o._iframe,_r),o.isVisible=!0},o.fadeInBackdrop=function(){o._backdrop.fadeIn()},o._backdropFadeoutPromise=null,o.fadeOutBackdrop=function(){return o._backdropFadeoutPromise||(o._backdropFadeoutPromise=o._backdrop.fadeOut()),o._backdropFadeoutPromise.then((function(){o._backdropFadeoutPromise=null}))},o.destroy=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=o.fadeOutBackdrop().then((function(){o._backdrop.unmount(),e||At((r=Object(G.a)(o),Object(Pt.a)(n.prototype)),"destroy",r).call(r)}));return e&&At((a=Object(G.a)(o),Object(Pt.a)(n.prototype)),"destroy",a).call(a),o.isVisible=!1,t},o._backdrop=new Je({lockScrolling:!0,lockFocus:!0,lockFocusOn:o._iframe,listenerRegistry:s}),o._autoMount(),o.isVisible=!1,o}return n}(Ct),yr={display:"block",position:"absolute","z-index":"1000",width:"1px","min-width":"100%",margin:"2px 0 0 0",padding:"0",border:"none",overflow:"hidden"},vr=function(e){Object(z.a)(n,e);var t=Object(K.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(d.a)(n,[{key:"updateStyle",value:function(e){var t=this;Object.keys(e).forEach((function(n){t._iframe.style[n]=e[n]}))}},{key:"update",value:function(e){this.send({action:"stripe-user-update",payload:e})}},{key:"_createIFrame",value:function(e,t,r){var a=At(Object(Pt.a)(n.prototype),"_createIFrame",this).call(this,e,t,r&&"object"==typeof r?Object(s.a)(Object(s.a)({},r),{},{isSecondaryFrame:!0}):r);return Object(v.l)(a,yr),a.style.height="0",a}}]),n}(Ct),Or=!1,gr=function(e){Or||"null"===(null!=e?e:window.origin)&&(Or=!0,console.error("Stripe.js requires 'allow-same-origin' if sandboxed."))},jr=n(22),wr={attachLinkAccountSessionForPayment:null,attachLinkAccountSessionForSetup:null,authenticate3DS2:null,cancelCardImageVerificationChallenge:null,cancelPaymentIntentSource:null,cancelSetupIntentSource:null,completeLinkAccountSessionElements:null,completeWalletConfirm:null,confirmPaymentIntent:null,confirmReturnIntent:null,confirmSetupIntent:null,createAcssDebitSession:null,createApplePaySession:null,createBankPaymentDetails:null,createConsumerPaymentDetails:null,createEphemeralKeyNonce:null,createPaymentMethodWithData:null,createPaymentMethodWithElement:null,createPaymentPage:null,createPaymentPageWithSession:null,createRadarSession:null,createSourceWithData:null,createSourceWithElement:null,fetchingWallets:null,fetchLocale:null,fetchUpdates:null,localizeError:null,loginWithConsumerInfo:null,lookupLocale:null,refreshPaymentIntent:null,refreshSetupIntent:null,retrieveIssuingCard:null,retrieveIssuingCardWithoutNonce:null,retrieveOrder:null,retrievePaymentIntent:null,retrieveSetupIntent:null,retrieveSource:null,fetchCartSession:null,setupStoreForElementsGroup:null,submitOrder:null,tokenizeCvcUpdate:null,tokenizeWithData:null,tokenizeWithElement:null,updateCSSFonts:null,updateElementsOptions:null,updateOrder:null,updatePaymentIntent:null,verifyCardImageVerificationChallenge:null,verifyMicrodepositsForPayment:null,verifyMicrodepositsForSetup:null,retrieveCardNetworks:null,isCardMetadataRequired:null},kr=function(){function e(){var t=this;Object(l.a)(this,e),this._state="pending",this._state="pending",this.promise=new E.a((function(e,n){t._resolve=e,t._reject=n})),this.promise.then((function(){t._state="resolved"}),(function(){t._state="rejected"}))}return Object(d.a)(e,[{key:"resolve",value:function(e){this._resolve(e)}},{key:"reject",value:function(e){this._reject(e)}},{key:"isResolved",value:function(){return"resolved"===this._state}},{key:"isRejected",value:function(){return"rejected"===this._state}},{key:"isPending",value:function(){return"pending"===this._state}}]),e}(),Er=!1,Sr={},Pr=function(e,t){return document.activeElement===e._iframe||e._iframe.parentElement&&document.activeElement===t},Ar=function(e){return"object"==typeof e&&null!==e&&"IntegrationError"===e.name?new k.b("string"==typeof e.message?e.message:""):e},Ir=function(){function e(t){var n=this;Object(l.a)(this,e),this._sendCaReq=function(e,t){var r=b(e),a=new kr;return n._requests[r]=a,n._controllerFrame.send({action:"stripe-controller-action-request",payload:{nonce:r,actionName:e,request:t}}),a.promise},this.keyMode=function(){return Object(He.c)(n._apiKey)},this.action=Object.keys(wr).reduce((function(e,t){return Object(s.a)(Object(s.a)({},e),{},Object(p.a)({},t,(function(e){return n._sendCaReq(t,e)})))}),{}),this.createElementFrame=function(e,t,r,a){var o=n._betas,i=new hr({type:e,betas:o,controllerId:n._id,listenerRegistry:n._listenerRegistry,appParams:Object(s.a)(Object(s.a)({},a),{},{componentName:t,keyMode:Object(He.c)(n._apiKey),apiKey:n._apiKey})});return n._setupFrame(i,e,r)},this.createSecondaryElementFrame=function(e,t,r,a,o){var i=n._betas,c=new vr({type:e,betas:i,controllerId:n._id,listenerRegistry:n._listenerRegistry,appParams:Object(s.a)(Object(s.a)({},o),{},{componentName:t,primaryElementType:r,keyMode:Object(He.c)(n._apiKey)})});return n._setupFrame(c,e,a)},this.createHiddenFrame=function(e,t){var r=new Tt({type:e,betas:n._betas,controllerId:n._id,listenerRegistry:n._listenerRegistry,appParams:t});return n._setupFrame(r,e)},this.getCredentials=function(){return{publishableKey:n._apiKey,stripeAccount:n._stripeAccount,apiVersion:n._apiVersion}},this.createLightboxFrame=function(e){var t=e.type,r=e.options,a=new br({type:t,controllerId:n._id,listenerRegistry:n._listenerRegistry,options:Object(s.a)(Object(s.a)({},r),{},{betas:n._betas})}),o="LINK_AUTOFILL_MODAL"===e.type?e.groupId:null;return n._setupFrame(a,t,o)},this._setupFrame=function(e,t,r){return n._frames[e.id]=e,n._controllerFrame.sendPersistent({action:"stripe-user-createframe",payload:{newFrameId:e.id,frameType:t,groupId:r}}),e._on("unload",(function(){n._controllerFrame.sendPersistent({action:"stripe-frame-unload",payload:{unloadedFrameId:e.id}})})),e._on("destroy",(function(){delete n._frames[e.id],n._controllerFrame.sendPersistent({action:"stripe-frame-destroy",payload:{destroyedFrameId:e.id}})})),e._on("load",(function(){n._controllerFrame.sendPersistent({action:"stripe-frame-load",payload:{loadedFrameId:e.id}}),n._controllerFrame.loaded&&e.send({action:"stripe-controller-load",payload:{}})})),e},this.report=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};n._controllerFrame.send({action:"stripe-controller-report",payload:{event:e,data:t}})},this.warn=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];n._controllerFrame.send({action:"stripe-controller-warn",payload:{args:t}})},this.controllerFor=function(){return"outer"},this._setupPostMessage=function(){n._listenerRegistry.addEventListener(window,"message",(function(e){var t=e.data,r=e.origin,a=e.source,o=Object(Ye.e)(t);o&&(Object(g.e)(C.k,r)?n._handleMessage(o,a):gr(r))}))},this._nodeIsKnownElement=function(e){return e&&"IFRAME"===e.nodeName&&!!n._frames[e.getAttribute("name")||""]},this._handleMessage=function(e,t){var r=e.controllerId,a=e.frameId,o=e.message,i=n._frames[a];if(r===n._id)switch(o.action){case"stripe-frame-event":var c=o.payload.event,u=o.payload.data;if(i){if(O.i){var l=i._iframe.parentElement,d=l&&l.querySelector(".".concat(pt.c));if("focus"===c&&!Er&&d&&!Pr(i,d)&&!Sr[a]){d.focus(),Er=!0,Sr[a]=!0,setTimeout((function(){Sr[a]=!1}),1e3);break}if("blur"===c&&Er){Er=!1;break}"blur"===c&&O.k&&setTimeout((function(){var e=document.activeElement;if(e&&!Pr(i,d)&&!Object(v.h)(e)&&!n._nodeIsKnownElement(e)){var t=l&&l.querySelector(".".concat(pt.d));if(t){var r=t;r.disabled=!1,r.focus(),r.blur(),r.disabled=!0}e.focus()}}),400)}"load"===c&&(u=Object(s.a)(Object(s.a)({},u),{},{source:t})),i._emit(c,u)}break;case"stripe-frame-action-response":i&&i.resolve(o.payload.nonce,o.payload.faRes);break;case"stripe-frame-action-error":i&&i.reject(o.payload.nonce,Ar(o.payload.faErr));break;case"stripe-frame-error":throw new k.b(o.payload.message);case"stripe-integration-error":i&&i._emit("__privateIntegrationError",{message:o.payload.message});break;case"stripe-controller-load":n._controllerFrame._emit("load",{source:t}),n._loadCount++,Object.keys(n._frames).forEach((function(e){return n._frames[e].send({action:"stripe-controller-load",payload:{}})}));var p=n._createTimestamp.getAsPosixTime(),f={stripeJsLoad:n._stripeJsLoadTimestamp.getAsPosixTime(),stripeCreate:p,create:p};n._mountTimestamp&&(f.mount=n._mountTimestamp.getAsPosixTime()),n._controllerFrame.send({action:"stripe-user-mount",payload:{timestamps:f,loadCount:n._loadCount,matchFrame:t===n._controllerFrame._iframe.contentWindow,rtl:!1,paymentRequestButtonType:null}});break;case"stripe-controller-action-response":n._requests[o.payload.nonce]&&n._requests[o.payload.nonce].resolve(o.payload.response);break;case"stripe-controller-action-error":n._requests[o.payload.nonce]&&n._requests[o.payload.nonce].reject(Ar(o.payload.error));break;case"stripe-api-call":Gt();break;case"show-wallet":var m=n._frames[o.payload.frameId];m&&m._emit("show-wallet",o.payload.wallet);break;case"show-bacs-mandate-confirmation":var h=n.createLightboxFrame({type:Ye.a.BACS_MANDATE_CONFIRMATION_APP,options:{locale:n._locale||"en"}});h._on("load",(function(){h.show(),h.fadeInBackdrop()})),h._once("request-close",(function(){Object(jr.a)(h).then((function(){}))}))}};var r=t.listenerRegistry,a=t.stripeJsLoadTimestamp,o=t.stripeCreateTimestamp,i=t.onFirstLoad,c=t.betas,u=Object(f.a)(t,["listenerRegistry","stripeJsLoadTimestamp","stripeCreateTimestamp","onFirstLoad","betas"]),d=u.apiKey,m=u.apiVersion,h=u.stripeAccount,_=u.stripeJsId,y=u.locale;this._id=b("__privateStripeController"),this._stripeJsId=_,this._apiKey=d,this._apiVersion=m,this._stripeAccount=h,this._listenerRegistry=r,this._betas=c,this._locale=y,this._controllerFrame=new Nt({type:Ye.a.CONTROLLER,betas:c,controllerId:this._id,listenerRegistry:r,appParams:Object(s.a)(Object(s.a)({},u),{},{betas:c,stripeJsLoadTime:a.getAsPosixTime()})}),this._stripeJsLoadTimestamp=a,this._createTimestamp=o,this._loadCount=0;var j=function(e){var t=e.anchor;n._mountTimestamp=new at.a,t!==document.body&&n.report("controller.mount.custom_container")};this._controllerFrame._isMounted()?j({anchor:this._controllerFrame._iframe.parentElement}):this._controllerFrame._once("mount",j),i&&this._controllerFrame._once("load",i),this._frames={},this._requests={},this._setupPostMessage(),this._handleMessage=B(this._handleMessage,this),this.action.fetchLocale({locale:y||"auto"})}return Object(d.a)(e,[{key:"registerWrapper",value:function(e){this._controllerFrame.send({action:"stripe-wrapper-register",payload:{stripeWrapperLibrary:e}})}},{key:"registerAppInfo",value:function(e){this._controllerFrame.send({action:"stripe-app-info-register",payload:{wrapperLibrary:e}})}}]),e}(),Cr=["elements","createToken","createPaymentMethod"],Tr=["elements","createSource","createToken","createPaymentMethod"],Nr=function(){function e(t){var n=this;Object(l.a)(this,e),this._gets=[],this._didDetect=!1,this._onDetection=function(e){n._didDetect=!0,t(e)},window.Stripe&&window.Stripe.__cachedInstances&&this._onDetection("react-stripe-elements")}return Object(d.a)(e,[{key:"got",value:function(e){this._didDetect||("elements"===e?this._gets=["elements"]:this._gets.push(e),this._checkForWrapper())}},{key:"called",value:function(e){this._didDetect||(this._gets=this._gets.filter((function(t){return t!==e})))}},{key:"_checkForWrapper",value:function(){Object(w.c)(this._gets,Cr)?this._onDetection("react-stripe-js"):Object(w.c)(this._gets,Tr)&&this._onDetection("react-stripe-elements")}}]),e}(),Mr=function(e){if(!e||"object"!=typeof e)return null;var t=e.type;return{type:"string"==typeof t?t:null,data:Object(f.a)(e,["type"])}},Rr=function(e){switch(e.type){case"object":return{source:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},xr={source:Object(m.y)({id:Object(m.A)("src_"),client_secret:Object(m.A)("src_client_secret_")})},Br=Object(m.y)(xr),Lr=function(e){switch(e.type){case"object":return{paymentMethod:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},Dr=function(e,t,n,r,a){if("string"==typeof n)return function(e,t,n,r,a){var o=Object(m.c)(r),i=Mr(o?a:r),c=i||{type:null,data:{}},s=c.type,u=c.data;if(s&&n!==s)return E.a.reject(new k.b("The type supplied in payment_method_data is not consistent."));if(o){var l=o._implementation._frame.id,d=o._componentName;return e.action.createPaymentMethodWithElement({frameId:l,elementName:d,type:n,paymentMethodData:u,mids:t}).then(Lr)}return i?e.action.createPaymentMethodWithData({elementName:null,type:n,paymentMethodData:u,mids:t}).then(Lr):E.a.reject(new k.b("Please provide either an Element or PaymentMethod creation parameters to createPaymentMethod."))}(e,t,n,r,a);try{var o=(d=n,Object(m.H)(Object(un.e)(null),d,"createPaymentMethod").value),i=o.element,c=o.type,s=o.data;if(i){var u=i._implementation._frame.id,l=i._componentName;return e.action.createPaymentMethodWithElement({frameId:u,elementName:l,type:c,paymentMethodData:s,mids:t}).then(Lr)}return e.action.createPaymentMethodWithData({elementName:null,type:c,paymentMethodData:s,mids:t}).then(Lr)}catch(e){return E.a.reject(e)}var d},qr=n(43),Fr=n(10),Ur=n(42),Hr=n(59),Gr={clientSecret:Object(m.w)(m.B),params:Object(m.w)(m.t),elements:Object(m.w)(m.t)},zr=function(e,t){var n=e.rawSecret,r=e.rawElements,a=e.validatedUpdateParams;if(function(e,t){var n=e.rawSecret,r=e.rawElements;if(n&&r)throw new k.b("".concat(t,": expected either `elements` or `clientSecret`, but not both."));if(!n&&!r)throw new k.b("".concat(t,": expected either `elements` or `clientSecret`, but got neither."))}({rawSecret:n,rawElements:r},t),n){if((null==a?void 0:a.payment_method)&&(null==a?void 0:a.payment_method_data))throw new k.b("".concat(t,": Expected either `payment_method` or `payment_method_data`, but not both."));return{type:"clientSecret",clientSecret:n}}var o=Object(m.d)(r);if(!o)throw new k.b("Invalid value for ".concat(t,": elements should be an Elements group. You specified: ").concat(typeof r,"."));return{type:"elements",elements:o}},Kr=function(e,t,n,r,a){var o,i,c=function(e){var t=e.rawUpdateData,n=e.controller,r=e.errorMessageMethodName,a=Object(m.H)(Object(m.y)(Gr),t,r),o=a.value,i=o.elements,c=void 0===i?void 0:i,s=o.params,u=o.clientSecret,l=a.warnings,d=Object(m.H)(Object(m.w)(Object(m.y)({payment_method:Object(m.w)(m.B),payment_method_data:Object(m.w)(m.t),payment_method_options:Object(m.w)(m.t),setup_future_usage:Object(m.w)(m.e)})),s,r,{path:["params"]}).value,p=zr({rawSecret:u,rawElements:c,validatedUpdateParams:d},r);return l.forEach((function(e){return n.warn(e)})),{validatedUpdateParams:d,rawUpdateParams:s,validatedParams:p}}({rawUpdateData:n,controller:e,errorMessageMethodName:a}),u=c.validatedParams,l=c.validatedUpdateParams,d=c.rawUpdateParams,p=null!=d?d:{},h=(p.payment_method,p.payment_method_data,p.payment_method_options,Object(f.a)(p,["payment_method","payment_method_data","payment_method_options"]));return"elements"===u.type?{mode:{tag:"elements",groupId:u.elements._id,data:null!==(o=null==l?void 0:l.payment_method_data)&&void 0!==o?o:{},options:null!==(i=null==l?void 0:l.payment_method_options)&&void 0!==i?i:{}},otherParams:h,expectedType:null,mids:t,options:null}:function(e){var t,n=e.validatedParams,r=e.validatedConfirmParams,a=e.otherParams,o=e.intentType,i=e.mids,c=null!=r?r:{},u=c.payment_method_data,l=c.payment_method,d=c.payment_method_options,p="payment"===o?Object(Bn.k)(n.clientSecret,"confirmPayment"):Object(Bn.l)(n.clientSecret,"confirmSetup"),f=Object(Bn.h)({payment_method:u}),m={};return"paymentMethod"===(t=u&&f?{intentSecret:p,tag:"paymentMethod-from-data",type:f,data:u,options:null!=d?d:{}}:l?{intentSecret:p,tag:"paymentMethod",paymentMethod:l,options:null!=d?d:{}}:{intentSecret:p,tag:"none"}).tag&&(m={mandate_data:{customer_acceptance:{type:"online",online:{infer_from_client:!0}}}}),{mids:i,mode:t,expectedType:f,otherParams:Object(s.a)(Object(s.a)({},m),a),options:{handleActions:!1}}}({validatedParams:u,validatedConfirmParams:l,otherParams:h,intentType:r,mids:t})},Yr=function(e,t){return function(n,r,a,o,i){var c=Object(Bn.k)(a,e),u=Object(Bn.j)(t,e,o,c),l=Object(Bn.i)(e,i),d="none"===u.mode.tag,p=n.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:t,options:l,mids:r}));return l.handleActions?p.then(Object(Ur.b)(n,d,!1,u.otherParams.expand)):p.then(Fr.g)}},Wr=Yr("confirmAcssDebitPayment",fr.b.acss_debit),Vr=Yr("confirmAffirmPayment",fr.b.affirm),Jr=Yr("confirmAfterpayClearpayPayment",fr.b.afterpay_clearpay),Xr=Yr("confirmAuBecsDebitPayment",fr.b.au_becs_debit),$r=Yr("confirmBacsDebitPayment",fr.b.bacs_debit),Qr=Yr("confirmBancontactPayment",fr.b.bancontact),Zr=Yr("confirmBoletoPayment",fr.b.boleto),ea=Yr("confirmCardPayment",fr.b.card),ta=Yr("confirmEpsPayment",fr.b.eps),na=Yr("confirmFpxPayment",fr.b.fpx),ra=Yr("confirmGiropayPayment",fr.b.giropay),aa=Yr("confirmGrabPayPayment",fr.b.grabpay),oa=Yr("confirmIdealPayment",fr.b.ideal),ia=Yr("confirmKlarnaPayment",fr.b.klarna),ca=Yr("confirmKonbiniPayment",fr.b.konbini),sa=Yr("confirmOxxoPayment",fr.b.oxxo),ua=Yr("confirmAlipayPayment",fr.b.alipay),la=Yr("confirmP24Payment",fr.b.p24),da=Yr("confirmPayByBankPayment",fr.b.pay_by_bank),pa=Yr("confirmPayPalPayment",fr.b.paypal),fa=Yr("confirmSepaDebitPayment",fr.b.sepa_debit),ma=Yr("confirmSofortPayment",fr.b.sofort),ha=Yr("confirmIdBankTransferPayment",fr.b.id_bank_transfer),_a=Yr("confirmUpiPayment",fr.b.upi),ba=Yr("confirmUsBankAccountPayment",fr.b.us_bank_account),ya=Yr("confirmNzBankAccountPayment",fr.b.nz_bank_account),va=Yr("confirmBlikPayment",fr.b.blik),Oa=function(e,t,n,r,a){return Yr("confirmCustomerBalancePayment",fr.b.customer_balance)(e,t,n,r,a)},ga=function(e,t,n,r,a){if(a&&!0===a.handleActions)throw new k.b("Expected option `handleActions` to be `false`.");var o=Object(s.a)(Object(s.a)({},r),{},{payment_method:Object(s.a)({},r&&r.payment_method||{}),payment_method_options:Object(s.a)(Object(s.a)({},r&&r.payment_method_options||{}),{},{wechat_pay:Object(s.a)(Object(s.a)({},r&&r.payment_method_options&&r.payment_method_options.wechat_pay||{}),{},{client:"web"})})});return Yr("confirmWechatPayPayment",fr.b.wechat_pay)(e,t,n,o,a)},ja=function(e,t,n,r,a){if(!r||!r.payment_method_options||!r.payment_method_options.wechat_pay||"web"!==r.payment_method_options.wechat_pay.client&&"mobile_web"!==r.payment_method_options.wechat_pay.client)throw new k.b("Expected client value `web` or `mobile_web` in payment_method_options.");var o={};"string"==typeof r.payment_method&&(o=r.payment_method),"object"==typeof r.payment_method&&(o=Object(s.a)({},r.payment_method||{}));var i=Object(s.a)(Object(s.a)({},r),{},{payment_method:o,payment_method_options:Object(s.a)(Object(s.a)({},r&&r.payment_method_options||{}),{},{wechat_pay:Object(s.a)({},r&&r.payment_method_options&&r.payment_method_options.wechat_pay||{})})});return Yr("confirmWechatPayPayment",fr.b.wechat_pay)(e,t,n,i,a)},wa=Yr("confirmPayNowPayment",fr.b.paynow),ka=Yr("confirmPixPayment",fr.b.pix),Ea=Yr("confirmPromptPayPayment",fr.b.promptpay),Sa=Yr("confirmQrisPayment",fr.b.qris),Pa=Yr("confirmNetbankingPayment",fr.b.netbanking),Aa=function(e,t,n,r){var a=Object(Bn.k)(n,"updatePaymentIntent"),o=Object(Bn.h)(r),i=Object(Bn.j)(o,"updatePaymentIntent",r,a);return e.action.updatePaymentIntent(Object(s.a)(Object(s.a)({},i),{},{expectedType:o,mids:t,options:null})).then(Fr.g)},Ia=function(e,t,n){var r=Object(Bn.k)(t,"verifyMicrodepositsForPayment"),a=Object(m.H)(m.t,n,"stripe.verifyMicrodepositsForPayment");return e.action.verifyMicrodepositsForPayment({intentSecret:r,data:a.value}).then(Fr.g)},Ca=function(e,t,n){var r=Object(Bn.k)(t,"collectUsBankAccountForPayment"),a=Object(m.H)(Object(un.b)("us_bank_account"),n,"stripe.collectUsBankAccountForPayment").value,o=a.paymentMethodData,i=a.otherParams;return Nn(r.clientSecret,r.id,e,o).then((function(t){return t.error?e.action.localizeError(t.error).then((function(e){return E.a.resolve({error:e})})):t.linkAccountSession.paymentAccount?e.action.attachLinkAccountSessionForPayment({intentSecret:r,linkAccountSessionId:t.linkAccountSession.id,expandParam:i.expand}).then((function(e){return Object(Fr.g)(e)})):e.action.retrievePaymentIntent({intentSecret:r,hosted:!1}).then(Fr.g)}))},Ta=function(e,t){var n=Object(m.H)(Object(un.a)(un.h),t,"stripe.collectBankAccountForPayment").value,r=n.clientSecret,a=n.paymentMethodData,o=n.otherParams;return Nn(r.clientSecret,r.id,e,a).then((function(t){return t.error?e.action.localizeError(t.error).then((function(e){return E.a.resolve({error:e})})):t.linkAccountSession.paymentAccount?e.action.attachLinkAccountSessionForPayment({intentSecret:r,linkAccountSessionId:t.linkAccountSession.id,expandParam:o.expand}).then((function(e){return Object(Fr.g)(e)})):e.action.retrievePaymentIntent({intentSecret:r,hosted:!1}).then(Fr.g)}))},Na=function(e,t){var n=Object(Bn.k)(e,"handleCardAction");return t.action.retrievePaymentIntent({intentSecret:n,hosted:!1}).then((function(e){var n=Object(Ur.a)(e);switch(n.type){case"error":return E.a.resolve(Object(Fr.g)(e));case"object":var r=n.object;if(Object(Fr.f)(r.status)){if("manual"!==r.confirmation_method)throw new k.b("handleCardAction: The PaymentIntent supplied does not require manual server-side confirmation. Please use confirmCardPayment instead to complete the payment.");return Object(Ur.c)(t,r,n.locale,!1)}throw new k.b("handleCardAction: The PaymentIntent supplied is not in the requires_action state.");default:return Object(m.a)(n)}}))},Ma=Bn.m,Ra=function(e){var t=e.mode;return!("paymentMethod-from-data"===t.tag&&t.data.acss_debit)},xa=function(e){return null!==e&&"object"==typeof e&&!0===e.skipMandate},Ba=function(e){return null!==e&&"object"==typeof e&&!!e.shouldCreatePaymentMethod},La=function(e){var t=e.controller,n=e.shouldCreatePaymentMethod,r=e.intentSecret,a=e.mode,o=e.confirmIntentData;return t.action.createAcssDebitSession({intentSecret:r,shouldCreatePaymentMethod:n,confirmIntentData:o,mode:a}).then((function(e){if("error"===e.type)return{type:"error",error:e.error};var n=Object(jr.b)(t,{url:Object(Ye.g)(e.object.url),size:"400x600",locale:e.locale,frameTitle:"acss.dialog_frame_title",useLightboxHostedCloseButton:!1});return new E.a((function(e){n._on("request-close",(function(){Object(jr.a)(n).then((function(){return t.action.localizeError(Bn.c)})).then((function(t){e({type:"error",error:t})}))})),n._on("session-complete",(function(t){var r=t.paymentMethod;Object(jr.a)(n).then((function(){e({type:"success",paymentMethod:r})}))}))}))}))},Da=function(e,t,n,r,a){var o="confirmAcssDebitPayment",i=fr.b.acss_debit,c=Object(Bn.k)(n,o),u=Object(Bn.j)(i,o,r,c),l=Ba(a);return Ma(a,o),xa(a)||!Ra(u)?e.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:i,options:{handleActions:!1},mids:t})).then(Fr.g):La({controller:e,shouldCreatePaymentMethod:l,intentSecret:c,mode:"payment",confirmIntentData:u}).then((function(n){switch(n.type){case"error":return{error:n.error};case"success":return e.action.confirmPaymentIntent({mode:{tag:"paymentMethod",paymentMethod:n.paymentMethod,options:u.mode.options||{},intentSecret:c},otherParams:u.otherParams,expectedType:i,options:{handleActions:!1},mids:t}).then(Fr.g);default:return Object(m.a)(n.type)}}))},qa=function(e,t,n,r,a){var o="confirmAcssDebitSetup",i=fr.b.acss_debit,c=Object(Bn.l)(n,o),u=Object(Bn.j)(i,o,r,c),l=Ba(a);return Ma(a,o),xa(a)||!Ra(u)?e.action.confirmSetupIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:i,options:{handleActions:!1},mids:t})).then(Fr.h):La({controller:e,shouldCreatePaymentMethod:l,intentSecret:c,mode:"setup",confirmIntentData:u}).then((function(n){switch(n.type){case"error":return{error:n.error};case"success":return e.action.confirmSetupIntent({mode:{tag:"paymentMethod",paymentMethod:n.paymentMethod,options:u.mode.options||{},intentSecret:c},otherParams:u.otherParams,expectedType:i,options:{handleActions:!1},mids:t}).then(Fr.h);default:return Object(m.a)(n.type)}}))},Fa={type:"validation_error",code:"errors.code.unexpected"},Ua={type:"validation_error",code:"errors.code.incomplete_payment_details"},Ha=function(e,t,n,r,a){var o="confirmInstantDebitsPilotPayment",i=Object(Bn.k)(n,o),c=Object(Bn.i)(o,a),u=Object(Bn.j)(null,o,r,i),l=e.createLightboxFrame({type:Ye.a.INSTANT_DEBITS_APP,options:{intentId:i.id,clientSecret:i.clientSecret,apiKey:e._apiKey,returnOnConfirm:!1===c.handleActions}});return l.show(),l.fadeInBackdrop(),new E.a((function(n){var r=function(e){l.fadeOutBackdrop().then((function(){n(e)}))};l._once("cancel",(function(){l.fadeOutBackdrop(),e.action.localizeError(Ua).then((function(e){r({error:e})}))})),l._on("instant-debits-fetch-payment-intent",(function(){e.action.retrievePaymentIntent({intentSecret:i,hosted:!1}).then((function(t){if(t.object){var a=t.object;l.send({action:"stripe-instant-debits-received-payment-intent",payload:{paymentIntent:a}}),!1===c.handleActions&&setTimeout((function(){l.fadeOutBackdrop(),r(Object(Fr.g)(t))}),2e3)}else{var o=t.error;e.action.localizeError(o).then((function(e){n({error:e})}))}}))})),l._on("instant-debits-attempt-payment",(function(n){e.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},u),{},{mode:{tag:"none",intentSecret:i},expectedType:null,options:c,mids:t})).then((function(t){t.object?(l.send({action:"stripe-instant-debits-successful-payment-intent",payload:{paymentIntent:t.object}}),setTimeout((function(){r(Object(Fr.g)(t))}),2e3)):e.action.localizeError(t.error).then((function(e){r({error:e})}))}))})),l._on("instant-debits-flow-error",(function(t){e.action.localizeError(Fa).then((function(e){r({error:e})}))}))}))},Ga=n(60),za=n(61),Ka=n(65),Ya=n(62),Wa=n(56),Va=function(e,t,n,r,a){var o=Object(Ga.a)(Object(Fr.c)(t)),i=Object(Fr.e)(t);if(!o)return E.a.resolve({setupIntent:t});switch(o.type){case"captcha-challenge":return Object(Ya.a)(o,t,e,n);case"3ds1-modal":return Object(za.a)(o,i,C.g.SETUP_INTENT,e,n,a);case"3ds2-fingerprint":case"3ds2-challenge":return Object(Ka.a)(o,{intentSecret:i,intentType:C.g.SETUP_INTENT,controller:e,locale:n,hosted:r},a);case"redirect":return Object(Wa.b)(t,o.redirectUrl,e);default:return E.a.resolve({setupIntent:t})}},Ja=function e(t,n,r,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(C.i<i)throw new Error("max action recursion depth reached");return Va(t,n,r,a,o||[]).then((function(n){if(n.paymentIntent)throw new Error("Got unexpected PaymentIntent response");if(n.setupIntent&&null!=n.setupIntent.next_action&&"use_stripe_sdk"===n.setupIntent.next_action.type&&-1!==C.j.indexOf(n.setupIntent.next_action.use_stripe_sdk.type)){var c=i;return e(t,n.setupIntent,r,a,o,++c)}return n}))},Xa=function(e,t,n,r){return function(a){switch(a.type){case"error":var o=a.error,i=o.setup_intent;return t&&i&&"succeeded"===i.status?E.a.resolve({setupIntent:i}):E.a.resolve({error:o});case"object":var c=a.object;return Ja(e,c,a.locale,n,r);default:return Object(m.a)(a)}}},$a=function(e,t){var n=Object(m.H)(Object(m.y)({clientSecret:un.g}),t,"stripe.handleNextAction").value.clientSecret;return"SETUP_INTENT"===n.type?function(e,t){return e.action.retrieveSetupIntent({intentSecret:t,hosted:!1}).then((function(t){switch(t.type){case"error":return E.a.resolve(Object(Fr.h)(t));case"object":var n=t.object;if(Object(Fr.f)(n.status))return Ja(e,n,t.locale,!1);throw new k.b("handleNextAction: The SetupIntent supplied is not in the requires_action state.");default:return Object(m.a)(t)}}))}(e,n):function(e,t){return e.action.retrievePaymentIntent({intentSecret:t,hosted:!1}).then((function(t){switch(t.type){case"error":return E.a.resolve(Object(Fr.g)(t));case"object":var n=t.object;if(Object(Fr.f)(n.status))return Object(Ur.c)(e,n,t.locale,!1);throw new k.b("handleNextAction: The PaymentIntent supplied is not in the requires_action state.");default:return Object(m.a)(t)}}))}(e,n)},Qa=function(e,t){if(null==e)return Object(m.G)(null);var n=e.type,r=Object(f.a)(e,["type"]),a=Object(m.J)(m.B,(function(){return null}))(n,Object(m.i)(t,"type"));return"error"===a.type?a:Object(m.G)({type:a.value,data:r})},Za=function(e,t,n,r){if(null===e){if(null===t){var a=r?"source_data":"payment_method_data";throw new k.b("".concat(n,": you must additionally specify the type of payment method to create within ").concat(a,"."))}return t}if(null===t)return e;if(t!==e)throw new k.b("".concat(n,": you specified `type: ").concat(t,"`, but ").concat(n," will create a ").concat(e," payment method."));return e},eo=function(e){return function(t,n){if("object"==typeof t&&null!==t){var r=t.source,a=t.source_data,o=t.payment_method,i=t.payment_method_data,c=Object(f.a)(t,["source","source_data","payment_method","payment_method_data"]);if(null!=r&&"string"!=typeof r)return Object(m.k)("string",typeof r,Object(m.i)(n,"source"));if(null!=o&&"string"!=typeof o)return Object(m.k)("string",typeof o,Object(m.i)(n,"payment_method"));if(null!=a&&"object"!=typeof a)return Object(m.k)("object",typeof a,Object(m.i)(n,"source_data"));if(null!=i&&"object"!=typeof i)return Object(m.k)("object",typeof i,Object(m.i)(n,"payment_method_data"));var u=Qa(a,Object(m.i)(n,"source_data"));if("error"===u.type)return u;var l=u.value,d=Qa(i,Object(m.i)(n,"payment_method_data"));if("error"===d.type)return d;var p=d.value;return Object(m.G)({sourceData:l,source:null==r?null:r,paymentMethodData:p,paymentMethod:null==o?null:o,otherParams:Object(s.a)(Object(s.a)({},e),c)})}return null===t?Object(m.k)("object","null",n):Object(m.k)("object",typeof t,n)}},to=function(e){return function(t,n){if(void 0===t)return Object(m.G)({sourceData:null,paymentMethodData:null,source:null,paymentMethod:null,otherParams:{}});if("object"!=typeof t)return Object(m.k)("object",typeof t,n);if(null===t)return Object(m.k)("object","null",n);if(e){if(!t.payment_intent){var r=Object(m.H)(Object(m.y)({return_url:Object(m.w)(m.B),expand:Object(m.w)(Object(m.b)(m.B)),shipping:Object(m.w)(Object(m.h)({name:m.B,address:Object(m.h)({line1:Object(m.w)(m.B),line2:Object(m.w)(m.B),city:Object(m.w)(m.B),state:Object(m.w)(m.B),postal_code:Object(m.w)(m.B),country:Object(m.w)(m.B)})}))}),t,"validate otherParams").value,a=Object(s.a)(Object(s.a)({},t),r);return Object(m.G)({sourceData:null,paymentMethodData:null,source:null,paymentMethod:null,otherParams:a})}var o=t.payment_intent,i=Object(f.a)(t,["payment_intent"]);return eo(i)(o,Object(m.i)(n,"payment_intent"))}return t.payment_intent?Object(m.j)(new k.b("The payment_intent parameter has been removed. To fix, move everything nested under the payment_intent parameter to the top-level object.")):eo({})(t,n)}},no=function(e,t,n,r,a){return function(o,i){var c=function(e,t,n,r,a,o,i){var c=Object(m.I)(m.g,a,r);if("error"===c.type)return null;var u=c.value,l=Object(m.H)(to(t),o,r).value,d=l.sourceData,p=l.source,f=l.paymentMethodData,h=l.paymentMethod,_=l.otherParams;if(!e&&d)throw new k.b("".concat(r,": Expected payment_method_data, not source_data."));if(null!=p)throw new k.b("When calling ".concat(r," on an Element, you can't pass in a pre-existing source ID, as a source will be created using the Element."));if(null!=h)throw new k.b("When calling ".concat(r," on an Element, you can't pass in a pre-existing PaymentMethod ID, as a PaymentMethod will be created using the Element."));var b=u._componentName,y=u._implementation._frame.id,v=d||f||{type:null,data:{}},O=v.type,g=v.data,j=Object(fr.d)(b,O),w=e&&!f,E={elementName:b,frameId:y,type:Za(n,j,r,w),data:g};return w?{mode:Object(s.a)({tag:"source-from-element",intentSecret:i},E),otherParams:_}:{mode:Object(s.a)({tag:"paymentMethod-from-element",options:null,intentSecret:i},E),otherParams:_}}(e,t,n,r,o,i,a);if(c)return c;var u=function(e,t,n,r,a,o,i){var c=Object(m.H)(to(t),a,r).value,s=c.sourceData,u=c.source,l=c.paymentMethodData,d=c.paymentMethod,p=c.otherParams;if(!e&&s)throw new k.b("".concat(r,": Expected payment_method, source, or payment_method_data, not source_data."));if(null!==u&&null!==s)throw new k.b("".concat(r,": Expected either source or source_data, but not both."));if(null!==d&&null!==l)throw new k.b("".concat(r,": Expected either payment_method or payment_method_data, but not both."));if(null!==d&&null!==u)throw new k.b("".concat(r,": Expected either payment_method or source, but not both."));if(s||l){var f=s||l||{},h=f.type,_=f.data,b=e&&!l,y=Za(n,h,r,b);return b?{mode:{tag:"source-from-data",intentSecret:i,type:y,data:_},otherParams:p}:{mode:{tag:"paymentMethod-from-data",type:y,data:_,intentSecret:i,options:null},otherParams:p}}return null!==u?{mode:{tag:"source",intentSecret:i,source:u},otherParams:p}:null!==d?{mode:{tag:"paymentMethod",paymentMethod:d,intentSecret:i,options:null},otherParams:p}:{mode:{tag:"none",intentSecret:i},otherParams:p}}(e,t,n,r,o,0,a);if(u)return u;throw new k.b("Expected: stripe.".concat(r,"(intentSecret, element[, data]) or stripe.").concat(r,"(intentSecret[, data]). Please see the docs for more usage examples https://stripe.com/docs/payments/dynamic-authentication"))}},ro=function(e,t,n,r,a,o){var i=Object(m.H)(un.h,r,"stripe.confirmPaymentIntent intent secret").value,c=no(e,!1,null,"confirmPaymentIntent",i)(a,o);return t.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},c),{},{expectedType:null,options:{handleActions:!1},mids:n})).then(Fr.g)},ao=function(e,t,n,r,a,o,i){var c=Object(m.H)(un.h,a,"stripe.handleCardPayment intent secret").value,u=fr.b.card,l=no(e,r,u,"handleCardPayment",c)(o,i),d=!o&&!i;return t.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},l),{},{expectedType:u,options:{handleActions:!0},mids:n})).then(Object(Ur.b)(t,d,!1))},oo=function(e,t,n,r,a,o){var i=Object(m.H)(un.h,r,"stripe.handleSepaDebitPayment intent secret").value,c=fr.b.sepa_debit,u=no(!1,n,c,"handleSepaDebitPayment",i)(a,o),l=!a&&!o;return e.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:c,options:{handleActions:!0},mids:t})).then(Object(Ur.b)(e,l,!1))},io=function(e,t,n,r,a,o,i){var c=Object(m.H)(un.h,a,"stripe.handleIdealPayment intent secret").value,u=fr.b.ideal,l=no(e,r,u,"handleIdealPayment",c)(o,i),d=!o&&!i;return t.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},l),{},{expectedType:u,options:{handleActions:!0},mids:n})).then(Object(Ur.b)(t,d,!1))},co=function(e,t,n,r,a,o){var i=Object(m.H)(un.h,r,"stripe.handleFpxPayment intent secret").value,c=fr.b.fpx,u=no(!1,n,c,"handleFpxPayment",i)(a,o),l=!a&&!o;return e.action.confirmPaymentIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:c,options:{handleActions:!0},mids:t})).then(Object(Ur.b)(e,l,!1))},so=function(e){switch(e.type){case"object":return{returnIntent:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},uo=function(e,t,n){return e.action.confirmReturnIntent({returnIntentId:t,data:n}).then(so)},lo=function(e,t){return function(n,r,a,o,i){var c=Object(Bn.l)(a,e),u=Object(Bn.j)(t,e,o,c),l=Object(Bn.i)(e,i),d="none"===u.mode.tag,p=n.action.confirmSetupIntent(Object(s.a)(Object(s.a)({},u),{},{expectedType:t,options:l,mids:r}));return l.handleActions?p.then(Xa(n,d,!1,u.otherParams.expand)):p.then(Fr.h)}},po=lo("confirmAcssDebitSetup",fr.b.acss_debit),fo=lo("confirmAfterpayClearpaySetup",fr.b.afterpay_clearpay),mo=lo("confirmCardSetup",fr.b.card),ho=lo("confirmSepaDebitSetup",fr.b.sepa_debit),_o=lo("confirmAuBecsDebitSetup",fr.b.au_becs_debit),bo=lo("confirmBacsDebitSetup",fr.b.bacs_debit),yo=lo("confirmIdealSetup",fr.b.ideal),vo=lo("confirmAlipaySetup",fr.b.alipay),Oo=lo("confirmSofortSetup",fr.b.sofort),go=lo("confirmBancontactSetup",fr.b.bancontact),jo=lo("confirmIdBankTransferSetup",fr.b.id_bank_transfer),wo=lo("confirmPayPalSetup",fr.b.paypal),ko=lo("confirmUsBankAccountSetup",fr.b.us_bank_account),Eo=lo("confirmNzBankAccountSetup",fr.b.nz_bank_account),So=function(e,t,n){var r=Object(Bn.l)(t,"verifyMicrodepositsForSetup"),a=Object(m.H)(m.t,n,"stripe.verifyMicrodepositsForSetup");return e.action.verifyMicrodepositsForSetup({intentSecret:r,data:a.value}).then(Fr.h)},Po=function(e,t,n){var r=Object(Bn.l)(t,"collectUsBankAccountForSetup"),a=Object(m.H)(Object(un.b)("us_bank_account"),n,"stripe.collectUsBankAccountForSetup").value,o=a.paymentMethodData,i=a.otherParams;return Mn(r.clientSecret,r.id,e,o).then((function(t){return t.error?e.action.localizeError(t.error).then((function(e){return E.a.resolve({error:e})})):t.linkAccountSession.paymentAccount?e.action.attachLinkAccountSessionForSetup({intentSecret:r,linkAccountSessionId:t.linkAccountSession.id,expandParam:i.expand}).then((function(e){return Object(Fr.h)(e)})):e.action.retrieveSetupIntent({intentSecret:r,hosted:!1}).then(Fr.h)}))},Ao=function(e,t){var n=Object(m.H)(Object(un.a)(un.i),t,"stripe.collectBankAccountForSetup").value,r=n.clientSecret,a=n.paymentMethodData,o=n.otherParams;return Mn(r.clientSecret,r.id,e,a).then((function(t){return t.error?e.action.localizeError(t.error).then((function(e){return E.a.resolve({error:e})})):t.linkAccountSession.paymentAccount?e.action.attachLinkAccountSessionForSetup({intentSecret:r,linkAccountSessionId:t.linkAccountSession.id,expandParam:o.expand}).then((function(e){return Object(Fr.h)(e)})):e.action.retrieveSetupIntent({intentSecret:r,hosted:!1}).then(Fr.h)}))},Io=function(e,t,n,r,a){var o=Object(m.H)(un.i,n,"stripe.handleCardSetup intent secret").value,i=fr.b.card,c=no(!1,!1,i,"handleCardSetup",o)(r,a),u=!r&&!a;return e.action.confirmSetupIntent(Object(s.a)(Object(s.a)({},c),{},{expectedType:i,options:{handleActions:!0},mids:t})).then(Xa(e,u,!1,c.otherParams.expand))},Co=function(e,t,n,r,a){var o=Object(m.H)(un.i,n,"stripe.handleSepaDebitSetup intent secret").value,i=fr.b.sepa_debit,c=no(!1,!1,i,"handleSepaDebitSetup",o)(r,a),u=!r&&!a;return e.action.confirmSetupIntent(Object(s.a)(Object(s.a)({},c),{},{expectedType:i,options:{handleActions:!0},mids:t})).then(Xa(e,u,!1))},To=function(e,t,n,r,a){var o=Object(m.H)(un.i,n,"stripe.confirmSetupIntent intent secret").value,i=no(!1,!1,null,"confirmSetupIntent",o)(r,a);return e.action.confirmSetupIntent(Object(s.a)(Object(s.a)({},i),{},{otherParams:Object(s.a)({},i.otherParams),expectedType:null,options:{handleActions:!1},mids:t})).then(Fr.h)},No=function(e,t){var n=function(e){if("string"==typeof e){var t=e.trim().match(/^((vi|vs)_[0-9a-zA-Z]+)_secret_(.+)$/);if(!t)throw new k.b("stripe.verifyIdentity: Could not parse client secret.");return{identityClientSecret:t[0],id:t[1],token:t[3]}}throw new k.b("stripe.verifyIdentity: Could not parse client secret.")}(e),r=n.id;return function(e){var t=e.controller,n=e.url,r=(e.id,e.locale),a=void 0===r?"en-US":r,o=Object(jr.b)(t,{url:Object(Ye.g)(n),size:"1100x800",frameTitle:"identity.verification_frame_title",locale:a,useLightboxHostedCloseButton:!0,allowCamera:!0,appType:"identity"});return new E.a((function(e){var t={type:"user_action",code:"session_cancelled"};o._on("identity-frame-close",(function(){Object(jr.a)(o).then((function(){e({error:t})}))})),o._on("identity-frame-error",(function(e){var n=e.type,r=e.code;t={type:n,code:r}})),o._on("identity-frame-session-complete",(function(){t=null})),o._on("request-close",(function(n){Object(jr.a)(o).then((function(){e({error:t})}))}))}))}({controller:t,url:function(e){return"".concat(C.f,"start/").concat(e)}(n.token),id:r})},Mo=["number","cvc","pin.number"],Ro=function(e,t){if("string"!=typeof e)return Object(m.m)("an Issuing card ID of the form ic_xxx",e,t);var n,r=(n=e.trim().match(/ic_[a-zA-Z0-9_]+$/))?n[0]:null;return null===r?Object(m.m)("an Issuing card ID of the form ic_xxx",e,t):Object(m.G)(r,[])},xo=function(e,t){return Object(m.H)(Ro,e,"stripe.".concat(t," cardId")).value},Bo=function(e,t){if("string"!=typeof e)return Object(m.m)("an ephemeral key secret of the form ek_xxx",e,t);var n,r=(n=e.trim().match(/ek_[a-zA-Z0-9_]+$/))?n[0]:null;return null===r?Object(m.m)("an ephemeral key secret of the form ek_xxx",e,t):Object(m.G)(r,[])},Lo=function(e,t){return"string"!=typeof e?Object(m.m)("a string",e,t):Mo.indexOf(e)<0?Object(m.m)("any of ".concat(Mo.join(", ")),e,t):Object(m.G)(e,[])},Do=function(e,t){return Object(m.H)(Bo,e,"stripe.".concat(t," ephemeral key secret")).value},qo=function(e,t){if("string"!=typeof e)return Object(m.m)("an ephemeral key nonce of the form ephkn_xxx",e,t);var n,r=(n=e.trim().match(/ephkn_[a-zA-Z0-9_]+$/))?n[0]:null;return null===r?Object(m.m)("an ephemeral key nonce of the form ephkn_xxx",e,t):Object(m.G)(r,[])},Fo=function(e){if("object"==typeof e&&e&&e.ephemeralKeySecret&&e.nonce){var t,n=Do(e.ephemeralKeySecret,"retrieveIssuingCard"),r=(a=e.nonce,o="retrieveIssuingCard",Object(m.H)(qo,a,"stripe.".concat(o," ephemeral key nonce")).value);return Array.isArray(e.expand)&&(t=e.expand.map((function(e){return function(e,t){return Object(m.H)(Lo,e,"stripe.".concat(t," expand param")).value}(e,"retrieveIssuingCard")}))),{ephemeralKeySecret:n,publicNonce:r,expand:t}}throw new k.b("When retrieving an Issuing card, you must specify an ephemeral key secret and an ephemeral key nonce in the options argument of stripe.retrieveIssuingCard.");var a,o},Uo=function(e,t){var n=function(e){if("object"==typeof e&&e&&e.issuingCard)return{issuingCard:xo(e.issuingCard,"createEphemeralKeyNonce")};throw new k.b("When creating an ephemeral key nonce, you must specify an Issuing card ID in the options argument of stripe.createEphemeralKeyNonce.")}(e);return t.action.createEphemeralKeyNonce({cardId:n.issuingCard}).then(Yt)},Ho=n(63),Go=n(71),zo=function(e){switch(e.type){case"object":return{token:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},Ko=function(e){return"object"==typeof e&&null!==e?e:{}},Yo=function(e){switch(e.type){case"object":return{radarSession:e.object};case"error":return{error:e.error};default:return Object(m.a)(e)}},Wo="securitypolicyviolation",Vo=window,Jo=/^require-trusted-types-for/,Xo="LOAD_ERROR",$o="REPORT_ONLY",Qo="BLOCKED",Zo=new at.a,ei=document?document.readyState:"unknown",ti=!1;switch(ei){case"loading":ti=!0;break;case"interactive":try{var ni=function(){ti=!0};setTimeout((function(){document.removeEventListener("DOMContentLoaded",ni)}),0),document.addEventListener("DOMContentLoaded",ni)}catch(e){}}var ri,ai=!1,oi=function e(t,r,a,o){if(!ai||o){ai=!0;var i=o||new at.a;if("complete"===document.readyState){var c=null,u=null,l=null,d=null,f=null;if(window.performance){if(window.performance.timing){var m=window.performance.timing,h=m.fetchStart;c=m.domLoading-h,u=m.domInteractive-h,l=m.domComplete-h,d=at.a.fromPosixTime(h).getElapsedTime(Zo)}if(window.performance.getEntriesByType){var _=window.performance.getEntriesByType("resource"),b="https://js.stripe.com/v3/".replace(/\/$/,"");f=_.reduce((function(e,t){if(0===t.name.indexOf(b)){var n=t.name.match(/\/([^/#?]*)\/?(?:$|[#?])/);if(n&&n[1]){var r=n[1].replace(/-[0-9a-f]{32}\./,".");return"v3"===r&&(r="stripe.js"),Object(s.a)(Object(s.a)({},e),{},Object(p.a)({},r,{transfer_size:t.transferSize,duration:Math.round(t.duration)}))}}return e}),{})}}t.report("timings",{element:t.controllerFor(),dom_loading:c,dom_interactive:u,dom_complete:l,since_fetch:d,load_count:1,load_before_dom_content_loaded:ti,load_ready_state:ei,first_create_ready_state:r,first_mount_readyState:a,until_first_create:Zo.getElapsedTime(t._createTimestamp),until_first_mount:t._mountTimestamp?Zo.getElapsedTime(t._mountTimestamp):null,until_first_load:Zo.getElapsedTime(i),resource_timings:f}),setTimeout((function(){new E.a((function(e){if(Vo.trustedTypes&&Vo.Promise){var t,r=!1,a=function(e){(Jo.test(e.effectiveDirective)||Jo.test(e.violatedDirective))&&(Object(g.f)(e.blockedURI)||Object(g.f)(e.sourceFile))&&(r=!0)},o=function(){return r?Qo:Xo};Vo.addEventListener(Wo,a);try{t=n.e(13).then(n.bind(null,92)).then((function(e){return(e.loaded&&r?$o:"ALLOWED")||Xo}),o)}catch(e){t=new E.a((function(e){return setTimeout(e,0)})).then(o)}t.then((function(){Vo.removeEventListener(Wo,a)})),e(t)}else e("NOT_SUPPORTED")})).then((function(e){t.report("trusted_types_check",{result:e}),function(e){switch(e){case $o:case Qo:return!0}return!1}(e)&&t.warn("We noticed that you are using Trusted Types. Nothing has broken, but we plan to add dynamic loading to parts of Stripe.js. Please allow scripts from 'https://js.stripe.com' in your default Trusted Types policy. For more information: https://stripe.com/docs/security/guide#content-security-policy")}))}),5e3)}else window.addEventListener("load",(function(){try{e(t,r,a,i)}catch(e){}}))}},ii=Object(m.y)({apiKey:m.B,stripeAccount:Object(m.w)(m.B),locale:Object(m.w)(m.B),apiVersion:Object(m.w)(m.B),__privateApiUrl:Object(m.w)(m.B),__checkout:Object(m.w)(Object(m.y)({mids:Object(m.y)({muid:m.B,sid:m.B})})),__dashboard:Object(m.w)(m.t),__hosted3DS:Object(m.w)(m.e),canCreateRadarSession:Object(m.w)(m.e),betas:Object(m.w)(Object(m.b)(m.B))}),ci=function(e){return"You have an in-flight ".concat(e,"! Please be sure to disable your form submit button when ").concat(e," is called.")},si=function(e){return function(){throw new k.b("You cannot call `stripe.".concat(e,"` without supplying an appropriate beta flag when initializing Stripe.js."))}},ui=function(e){return function(){throw new k.b("You cannot call `stripe.".concat(e,"` without supplying an Issuing beta flag when initializing Stripe.js."))}},li=function(){function e(t,n){var r=this;Object(l.a)(this,e),this._listenerRegistry=Object(St.a)(),this.elements=x((function(e){return new ur(r._controller,r._listenerRegistry,{stripeJsLoadTimestamp:Zo,stripeCreateTimestamp:r._controller._createTimestamp},r._betas,r._mids(),Object(s.a)(Object(s.a)({},r._locale?{locale:r._locale}:{}),e))}),void 0,"elements"),this.createToken=q((function(e,t){var n=r._mids();return"cvc_update"===e?function(e,t,n){var r=Object(m.c)(t);if(r&&"cardCvc"===r._componentName){var a=r._implementation._frame.id;return e.action.tokenizeCvcUpdate({frameId:a,mids:n}).then(zo)}throw new k.b("You must provide a `cardCvc` Element to create a `cvc_update` token.")}(r._controller,t,n):function(e,t){return function(n,r){var a=Object(m.c)(n);if(a){var o=a._implementation._frame.id,i=a._componentName,c=Ko(r);return e.action.tokenizeWithElement({frameId:o,elementName:i,tokenData:c,mids:t}).then(zo)}if("string"==typeof n){var s=n,u=Ko(r);return e.action.tokenizeWithData({elementName:null,type:s,tokenData:u,mids:t}).then(zo)}throw new k.b("You must provide a Stripe Element or a valid token type to create a Token.")}}(r._controller,n)(e,t)}),void 0,"createToken"),this.createSource=q((function(e,t){var n=Object(m.c)(e),a=Mr(n?t:e),o=a||{type:null,data:{}},i=o.type,c=o.data;if(n){var s=n._implementation._frame.id,u=n._componentName;return!a&&Object(fr.c)(u)?E.a.reject(new k.b("Please provide Source creation parameters to createSource.")):r._controller.action.createSourceWithElement({frameId:s,elementName:u,type:i,sourceData:c,mids:r._mids()}).then(Rr)}return a?i?r._controller.action.createSourceWithData({elementName:null,type:i,sourceData:c,mids:r._mids()}).then(Rr):E.a.reject(new k.b("Please provide a source type to createSource.")):E.a.reject(new k.b("Please provide either an Element or Source creation parameters to createSource."))}),void 0,"createSource"),this.retrieveSource=D((function(e){var t=Object(m.H)(Br,{source:e},"retrieveSource"),n=t.value;return t.warnings.forEach((function(e){return r._controller.warn(e)})),r._controller.action.retrieveSource(n).then(Rr)}),void 0,"retrieveSource"),this.paymentRequest=B((function(e,t){Object(He.b)(r._keyMode);var n=r._isCheckout&&t?t:null;return lr(r._controller,{apiKey:r._apiKey,accountId:r._stripeAccount},r._mids(),e,r._betas,n,r._listenerRegistry)}),void 0,"paymentRequest");var a=new at.a,o=Object(m.H)(ii,t||{},"Stripe()"),i=o.value,c=o.warnings,u=i.apiKey,d=i.stripeAccount,p=i.apiVersion,f=i.locale,h=i.__dashboard,_=i.__privateApiUrl,b=i.__checkout,y=i.__hosted3DS,v=i.canCreateRadarSession,O=i.betas,g=Object(j.e)(O||null),w=g.validBetas,S=g.betaWarning;S&&c.push(S),Object(He.d)(u),(null==b?void 0:b.mids)&&(e._ec=Ut({checkoutIds:b.mids})),this._apiKey=u.trim(),this._keyMode=Object(He.c)(this._apiKey),this._betas=w,this._locale=Object(j.f)(f,this._betas)||null,this._stripeAccount=d||null,this._isCheckout=!!b;var P=h?"".concat(C.d):void 0;this._attachControllerGetter(p,_,P,d,a),c.forEach((function(e){return r._controller.warn(e)})),gr(),this._ensureHTTPOnlyLinkCookie(),this._ensureHTTPS(),this._ensureStripeHosted(n),this._attachPaymentIntentMethods(this._betas,!!y),this._attachLegacyPaymentIntentMethods(this._betas),this._attachCheckoutMethods(this._betas),this._attachPrivateMethodsForCheckout(this._isCheckout),this._attachPrivateMethodsForConsumer(Et),this._attachCreateRadarSession(v||!1),this._attachGetters(),this._attachIssuingCardMethods(this._betas),this._attachIdentityMethods(this._betas),this._attachLinkedAccountsMethods(this._betas),this._attachAppInfo()}return Object(d.a)(e,[{key:"_attachCreateRadarSession",value:function(e){var t=this;e&&(this.createRadarSession=L((function(){return t._midsPromise().then((function(e){return n=t._controller,r=e,n.action.createRadarSession({mids:r}).then(Yo);var n,r}))})))}},{key:"_attachPaymentIntentMethods",value:function(e,t){var r,a,o,i=this,c=function(){return i._mids()};this.createPaymentMethod=(r=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Dr.apply(void 0,[i._controller,c()].concat(t))},a=void 0,o="createPaymentMethod",function(e,t,n){try{return r.call(this,e,t,n)}catch(e){return R(e,a||this&&this._controller,!1,o)}}),this._createPaymentMethod=this.createPaymentMethod,this.retrievePaymentIntent=D((function(e){return function(e,t){var n=Object(Bn.k)(e,"retrievePaymentIntent");return t.action.retrievePaymentIntent({intentSecret:n,hosted:!1}).then(Fr.g)}(e,i._controller)}),void 0,"retrievePaymentIntent"),this.retrieveSetupIntent=D((function(e){return function(e,t){var n=Object(Bn.l)(e,"retrieveSetupIntent");return t.action.retrieveSetupIntent({intentSecret:n,hosted:!1}).then(Fr.h)}(e,i._controller)}),void 0,"retrieveSetupIntent"),this.updatePaymentIntent=si("updatePaymentIntent"),Object(j.d)(this._betas,j.a.line_items_beta_1)||Object(j.d)(this._betas,j.a.tax_product_beta_1)?this.updatePaymentIntent=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Aa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"updatePaymentIntent"):Object(j.d)(this._betas,j.a.server_side_confirmation_beta_1)&&(this.updatePaymentIntent=D((function(e){return function(e,t,n){var r=Kr(e,t,n,"payment","stripe.updatePaymentIntent()");return e.action.updatePaymentIntent(r).then(Fr.g)}(i._controller,c(),e)}),void 0,"updatePaymentIntent"));var s=Object(W.a)(Na,ci("handleCardAction"));this.handleCardAction=D((function(e){return s(e,i._controller)}),void 0,"handleCardAction");var u=Object(W.a)($a,ci("handleNextAction"));this.handleNextAction=D((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return u.apply(void 0,[i._controller].concat(t))}),void 0,"handleNextAction");var l=Object(W.a)(ea,ci("confirmCardPayment"));this.confirmCardPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return l.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmCardPayment");var d=Object(W.a)(mo,ci("confirmCardSetup"));this.confirmCardSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return d.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmCardSetup"),this.confirmIdealPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return oa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmIdealPayment"),this.confirmSepaDebitPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return fa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmSepaDebitPayment"),this.confirmSepaDebitSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ho.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmSepaDebitSetup"),this.confirmFpxPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return na.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmFpxPayment"),this.confirmAlipayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ua.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAlipayPayment"),this.confirmAlipaySetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return vo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAlipaySetup"),this.confirmAuBecsDebitPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Xr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAuBecsDebitPayment"),this.confirmAuBecsDebitSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return _o.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAuBecsDebitSetup"),this.confirmBacsDebitPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return $r.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBacsDebitPayment"),this.confirmBacsDebitSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return bo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBacsDebitSetup"),this.confirmBancontactPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Qr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBancontactPayment"),this.confirmBoletoPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Zr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBoletoPayment"),this.confirmEpsPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ta.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmEpsPayment"),this.confirmGiropayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ra.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmGiropayPayment"),this.confirmOxxoPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return sa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmOxxoPayment"),this.confirmP24Payment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return la.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmP24Payment"),this.confirmSofortPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ma.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmSofortPayment"),this.confirmIdealSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return yo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmIdealSetup"),this.confirmSofortSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Oo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmSofortSetup"),this.confirmBancontactSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return go.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBancontactSetup"),this.confirmGrabPayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return aa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmGrabPayPayment"),this.confirmAffirmPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Vr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAffirmPayment"),this.confirmAfterpayClearpayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Jr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAfterpayClearpayPayment"),this.verifyMicrodepositsForPayment=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ia.apply(void 0,[i._controller].concat(t))}),void 0,"verifyMicrodepositsForPayment"),this.verifyMicrodepositsForSetup=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return So.apply(void 0,[i._controller].concat(t))}),void 0,"verifyMicrodepositsForSetup"),this.confirmPayment=D((function(e){return function(e,t,n,r){var a=Object(Hr.a)(e,t,n,r,"payment","stripe.confirmPayment()"),o=a.intentMutationRequest,i=e.action.confirmPaymentIntent(o);return Object(j.d)(n,j.a.server_side_confirmation_beta_1)&&null!==o.options&&!o.options.handleActions?i.then(Fr.g):i.then(Object(Ur.b)(e,!1,!1,o.otherParams.expand)).then((function(t){return t.error||"always"!==a.redirect?t:Object(qr.a)(Object(Bn.g)(a.returnUrl,t.paymentIntent)).then((function(n){return Object(qr.b)(e,"confirmPayment redirect",n),Object(Fr.g)(n,t.paymentIntent)}))}))}(i._controller,c(),i._betas,e)}),void 0,"confirmPayment"),this.confirmSetup=D((function(e){return function(e,t,n,r){var a=Object(Hr.a)(e,t,n,r,"setup","stripe.confirmSetup()"),o=a.intentMutationRequest,i=e.action.confirmSetupIntent(o);return Object(j.d)(n,j.a.server_side_confirmation_beta_1)&&null!==o.options&&!o.options.handleActions?i.then(Fr.h):i.then(Xa(e,!1,!1,o.otherParams.expand)).then((function(t){return t.error||"always"!==a.redirect?t:Object(qr.a)(Object(Bn.g)(a.returnUrl,t.setupIntent)).then((function(n){return Object(qr.b)(e,"confirmSetup redirect",n),Object(Fr.h)(n,t.setupIntent)}))}))}(i._controller,c(),i._betas,e)}),void 0,"confirmSetup"),this.confirmKlarnaPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ia.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmKlarnaPayment"),Object(j.d)(this._betas,j.a.process_order_beta_1)&&(this.processOrder=D((function(e){return n.e(6).then(n.bind(null,94)).then((function(t){return(0,t.processOrder)(i._controller,c(),i._betas,e)}))}),void 0,"processOrder")),Object(j.d)(this._betas,j.a.process_order_beta_1)&&(this.retrieveOrder=D((function(e){return n.e(6).then(n.bind(null,94)).then((function(t){return(0,t.retrieveOrder)(e,i._controller)}))}),void 0,"retrieveOrder")),Object(j.d)(this._betas,j.a.update_order_beta_1)&&(this.updateOrder=D((function(e){return n.e(6).then(n.bind(null,94)).then((function(t){return(0,t.updateOrder)(i._controller,e)}))}),void 0,"updateOrder")),this.collectBankAccountForPayment=D((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ta.apply(void 0,[i._controller].concat(t))}),void 0,"collectBankAccountForPayment"),this.collectBankAccountForSetup=D((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ao.apply(void 0,[i._controller].concat(t))}),void 0,"collectBankAccountForSetup"),Object(j.d)(this._betas,j.a.us_bank_account_beta_2)&&(this.collectUsBankAccountForPayment=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ca.apply(void 0,[i._controller].concat(t))}),void 0,"collectUsBankAccountForPayment"),this.collectUsBankAccountForSetup=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Po.apply(void 0,[i._controller].concat(t))}),void 0,"collectUsBankAccountForSetup")),Object(j.d)(this._betas,j.a.acss_debit_beta_1)?(this.confirmAcssDebitPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Wr.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAcssDebitPayment"),this.confirmAcssDebitSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return po.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAcssDebitSetup")):(this.confirmAcssDebitPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Da.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAcssDebitPayment"),this.confirmAcssDebitSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return qa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAcssDebitSetup")),this.confirmAfterpayClearpaySetup=si("confirmAfterpayClearpaySetup"),Object(j.d)(this._betas,j.a.afterpay_clearpay_setup_intents_beta)&&(this.confirmAfterpayClearpaySetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return fo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmAfterpayClearpaySetup")),this.confirmBlikPayment=si("confirmBlikPayment"),Object(j.d)(this._betas,j.a.blik_beta_1)&&(this.confirmBlikPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return va.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmBlikPayment")),this.confirmCustomerBalancePayment=si("confirmCustomerBalancePayment"),Object(j.d)(this._betas,j.a.customer_balance_beta_1)&&(this.confirmCustomerBalancePayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Oa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmCustomerBalancePayment")),Object(j.d)(this._betas,j.a.return_intents_beta_1)&&(this.confirmReturnIntent=q((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return uo.apply(void 0,[i._controller].concat(t))}),void 0,"confirmReturnIntent")),this.confirmKonbiniPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ca.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmKonbiniPayment"),Object(j.d)(this._betas,j.a.oxxo_pm_beta_1)&&(this.confirmOxxoPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return sa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmOxxoPayment")),this.confirmWechatPayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ja.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmWechatPayPayment"),Object(j.d)(this._betas,j.a.wechat_pay_pm_beta_1)&&(this.confirmWechatPayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ga.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmWechatPayPayment")),this.confirmPayByBankPayment=si("confirmPayByBankPayment"),Object(j.d)(this._betas,j.a.pay_by_bank_beta_1)&&(this.confirmPayByBankPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return da.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPayByBankPayment")),this.confirmPayNowPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return wa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPayNowPayPayment"),this.confirmPixPayment=si("confirmPixPayment"),Object(j.d)(this._betas,[j.a.pix_beta_1,j.a.pix_beta_2])&&(this.confirmPixPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ka.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPixPayment")),this.confirmPromptPayPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ea.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPromptPayPayment"),this.confirmPayPalPayment=si("confirmPayPalPayment"),Object(j.d)(this._betas,j.a.paypal_pm_beta_1)&&(this.confirmPayPalPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return pa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPayPalPayment")),Object(j.d)(this._betas,j.a.paypal_pm_beta_1)&&(this.confirmPayPalSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return wo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmPayPalSetup")),this.confirmQrisPayment=si("confirmQrisPayment"),Object(j.d)(this._betas,j.a.qris_beta_1)&&(this.confirmQrisPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Sa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmQrisPayment")),this.confirmUpiPayment=si("confirmUpiPayment"),Object(j.d)(this._betas,j.a.upi_beta_1)&&(this.confirmUpiPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return _a.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmUpiPayment")),this.confirmUsBankAccountPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ba.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmUsBankAccountPayment"),this.confirmUsBankAccountSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ko.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmUsBankAccountSetup"),Object(j.d)(this._betas,j.a.nz_bank_account_beta_1)&&(this.confirmNzBankAccountPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ya.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmNzBankAccountPayment"),this.confirmNzBankAccountSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Eo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmNzBankAccountSetup")),this.confirmNetbankingPayment=si("confirmNetbankingPayment"),Object(j.d)(this._betas,j.a.netbanking_beta_1)&&(this.confirmNetbankingPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Pa.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmNetbankingPayment")),this.confirmInstantDebitsPilotPayment=si("confirmInstantDebitsPilotPayment"),Object(j.d)(this._betas,j.a.instant_debits_beta_1)&&(this.confirmInstantDebitsPilotPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ha.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmInstantDebitsPilotPayment")),this.linkAutofillModal=si("linkAutofillModal"),Object(j.d)(this._betas,j.a.link_autofill_modal_beta_1)&&(this.linkAutofillModal=x((function(e){return function(e,t,n){var r=function(e){throw new k.b("stripe.linkAutofill.".concat(e," can only be called when the user is logged-in."))},a=!1,o=!1,i=e.createLightboxFrame({type:Ye.a.LINK_AUTOFILL_MODAL,options:{apiKey:e._apiKey,stripeAccount:e._stripeAccount,locale:n||""},groupId:t._id}),c=function(){a=!0,i.show(),i.fadeInBackdrop()},s=function(){a=!1,i.fadeOutBackdrop()};i._on("open",(function(){c()})),i._on("cancel",(function(){s()}));var u=[];i._on("link-autofill-modal-authenticated",(function(e){o=!0,u.forEach((function(t){t({value:{email:e.emailAddress}})}))}));var l=[];return i._on("link-autofill-modal-autofill-info",(function(e){s(),l.forEach((function(t){t({empty:!e.info.hasPaymentDetails,value:{shippingAddress:e.info.shippingAddress,billingAddress:e.info.billingAddress}})}))})),{on:function(t,n){if("function"!=typeof n)throw new k.b("stripe.linkAutofill.on: Expected the handler to be a function.");switch(t){case"authenticated":u.push(x(n,e,"authenticationHandler"));break;case"autofill":l.push(x(n,e,"autofillHandler"));break;default:throw new k.b("stripe.linkAutofill.on: Expected either 'authenticated' or 'autofill' as an event name.")}},launch:function(e){var t=e.email;i.send({action:"stripe-link-autofill-modal-email-attempt",payload:{email:t}})},show:function(){o||r("show"),a||c()},logout:function(){if(o||r("logout"),a)throw new k.b("stripe.linkAutofill.logout can only be called when the modal is closed. Did you call it from outside a click event?");o=!1,i.send({action:"stripe-link-autofill-modal-logout",payload:{}})}}}(i._controller,e,i._locale)}),void 0,"linkAutofillModal")),this.confirmIdBankTransferPayment=si("confirmIdBankTransferPayment"),this.confirmIdBankTransferSetup=si("confirmIdBankTransferSetup"),(Object(j.d)(this._betas,j.a.id_bank_transfer_beta_1)||Object(j.d)(this._betas,j.a.id_bank_transfer_beta_2))&&(this.confirmIdBankTransferPayment=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return ha.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmIdBankTransferPayment"),this.confirmIdBankTransferSetup=F((function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return jo.apply(void 0,[i._controller,c()].concat(t))}),void 0,"confirmIdBankTransferSetup")),t&&(this.handleHosted3DS2Payment=D((function(e){return function(e,t){var n=Object(Bn.k)(e,"handleHosted3DS2Setup [internal]");return t.action.retrievePaymentIntent({intentSecret:n,hosted:!0}).then(Object(Ur.b)(t,!1,!0))}(e,i._controller)})),this.handleHosted3DS2Setup=D((function(e){return function(e,t){var n=Object(Bn.l)(e,"handleHosted3DS2Setup [internal]");return t.action.retrieveSetupIntent({intentSecret:n,hosted:!0}).then(Xa(t,!1,!0))}(e,i._controller)})))}},{key:"_attachLegacyPaymentIntentMethods",value:function(e){var t=this,n=Object(j.d)(this._betas,j.a.payment_intent_beta_1)||Object(j.d)(this._betas,j.a.payment_intent_beta_2),r=function(){return t._mids()},a=F((function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return ro.apply(void 0,[!0,t._controller,r()].concat(n))}),void 0,"confirmPaymentIntent"),o=F((function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return ro.apply(void 0,[!1,t._controller,r()].concat(n))}),void 0,"confirmPaymentIntent"),i=Object(W.a)(ao,ci("handleCardPayment")),c=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return i.apply(void 0,[!0,t._controller,r(),n].concat(a))}),void 0,"handleCardPayment"),s=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return i.apply(void 0,[!1,t._controller,r(),n].concat(a))}),void 0,"handleCardPayment"),u=Object(W.a)(Io,ci("handleCardSetup")),l=F((function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return u.apply(void 0,[t._controller,r()].concat(n))}),void 0,"handleCardSetup"),d=F((function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return To.apply(void 0,[t._controller,r()].concat(n))}),void 0,"confirmSetupIntent"),p=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return oo.apply(void 0,[t._controller,r(),n].concat(a))}),void 0,"handleSepaDebitPayment"),f=F((function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return Co.apply(void 0,[t._controller,r()].concat(n))}),void 0,"handleSepaDebitSetup"),m=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return io.apply(void 0,[!0,t._controller,r(),n].concat(a))}),void 0,"handleIdealPayment"),h=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return io.apply(void 0,[!1,t._controller,r(),n].concat(a))}),void 0,"handleIdealPayment"),_=F((function(){for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return co.apply(void 0,[t._controller,r(),n].concat(a))}),void 0,"handleFpxPayment");this.handleCardPayment=s,this.confirmPaymentIntent=o,this.handleCardSetup=l,this.confirmSetupIntent=d,this.fulfillPaymentIntent=si("fulfillPaymentIntent"),this.handleSepaDebitPayment=si("handleSepaDebitPayment"),this.handleSepaDebitSetup=si("handleSepaDebitSetup"),this.handleIdealPayment=si("handleIdealPayment"),this.handleFpxPayment=si("handleFpxPayment"),Object(j.d)(this._betas,j.a.payment_intent_beta_1)?this.fulfillPaymentIntent=c:(Object(j.d)(this._betas,j.a.payment_intent_beta_3)||Object(j.d)(this._betas,j.a.payment_intent_beta_2))&&(this.handleCardPayment=c),Object(j.d)(this._betas,j.a.payment_intent_beta_3)&&(this.confirmPaymentIntent=a,this.handleIdealPayment=m,this.handleSepaDebitPayment=p),Object(j.d)(this._betas,j.a.fpx_bank_beta_1)&&(this.handleFpxPayment=_),Object(j.d)(this._betas,j.a.ideal_pm_beta_1)&&(this.handleIdealPayment=h),Object(j.d)(this._betas,j.a.sepa_pm_beta_1)&&(this.handleSepaDebitPayment=p,this.handleSepaDebitSetup=f)}},{key:"_attachPrivateMethodsForCheckout",value:function(e){var t=this;e&&(this.sendInteractionEvent=Gt,this.tryNextAction=q((function(e){var n=Object(m.H)(un.f,e,"Payment Intent").value;return"payment_intent"===n.object?Object(Ur.c)(t._controller,n,"auto",!1):Ja(t._controller,n,"auto",!1)})))}},{key:"_attachCheckoutMethods",value:function(e){var t=this,n=function(){return t._mids()},r=e.reduce((function(e,t){var n=Object(w.a)(Ho.a,(function(e){return e===t}));return n?[].concat(Object(u.a)(e),[n]):e}),[]);this.redirectToCheckout=function(e){return Object(Go.a)(t._controller,r,n,t._locale,e)}}},{key:"_attachPrivateMethodsForConsumer",value:function(e){var t=this;e&&(this.__createConsumerPaymentDetails=q((function(e,n){var r,a={};if(!n.email)return E.a.reject(new k.b("You must pass email"));if(!e)return E.a.reject(new k.b("You must pass a clientSecret"));if(n.cardElement){if(!n.billing_details||!n.billing_details.country_code)return E.a.reject(new k.b("You must pass in billing_details.country_code if you are using the Card Element"));var o=Object(m.c)(n.cardElement);if(!o)return E.a.reject(new k.b("Card Element is invalid"));var i=o._implementation._frame.id,c=o._componentName;if("card"!==c&&"cardNumber"!==c)return E.a.reject(new k.b("Please provide a Card Element to __createConsumerPaymentDetails"));a={frameId:i,elementName:c,billingDetails:n.billing_details,requestSurface:n.request_surface}}else if(n.elements){var s;a={elementsId:null==n||null===(s=n.elements)||void 0===s?void 0:s._id,billingDetails:(null==n?void 0:n.billing_details)||{},requestSurface:null==n?void 0:n.request_surface}}return a.elementsId?t._controller.action.createConsumerPaymentDetails({email:n.email,clientSecret:e,billingDetails:a.billingDetails,isDefault:!!n.is_default,requestSurface:n.request_surface,elementsId:a.elementsId}):a.frameId&&a.elementName&&(null==n||null===(r=n.billing_details)||void 0===r?void 0:r.country_code)?t._controller.action.createConsumerPaymentDetails({email:n.email,clientSecret:e,billingDetails:a.billingDetails,isDefault:!!n.is_default,requestSurface:n.request_surface,frameId:a.frameId,elementName:a.elementName}):E.a.reject(new k.b("Please provide either an Elements or Card Element creation parameters to __createConsumerPaymentDetails."))}),void 0,"__createConsumerPaymentDetails"))}},{key:"_attachGetters",value:function(){var e=this,t=new Nr((function(t){e._registerWrapper({name:t,version:null})}));["elements","createToken","createSource","createPaymentMethod"].forEach((function(n){if(e.hasOwnProperty(n)){var r=e[n],a=function(){t.called(n);for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return r.apply(this,a)};Object.defineProperty(e,n,{enumerable:!0,get:function(){return t.got(n),a}})}}))}},{key:"_attachIssuingCardMethods",value:function(e){var t=this;this.retrieveIssuingCard=ui("retrieveIssuingCard"),this.createEphemeralKeyNonce=ui("createEphemeralKeyNonce"),Object(j.d)(this._betas,j.a.issuing_elements_1)?this.retrieveIssuingCard=q((function(e,n){return function(e,t,n){var r=xo(e,"retrieveIssuingCard"),a=Do(t,"retrieveIssuingCard");return n.action.retrieveIssuingCardWithoutNonce({cardId:r,ephemeralKeySecret:a}).then(Kt)}(e,n,t._controller)})):Object(j.d)(this._betas,j.a.issuing_elements_2)&&(this.retrieveIssuingCard=q((function(e,n){return function(e,t,n){var r=xo(e,"retrieveIssuingCard"),a=Fo(t);return n.action.retrieveIssuingCard({cardId:r,ephemeralKeySecret:a.ephemeralKeySecret,publicNonce:a.publicNonce,expand:a.expand}).then(Kt)}(e,n,t._controller)})),this.createEphemeralKeyNonce=D((function(e){return Uo(e,t._controller)})))}},{key:"_attachIdentityMethods",value:function(e){var t=this;this.verifyIdentity=D((function(e){return No(e,t._controller)}))}},{key:"_attachControllerGetter",value:function(t,n,r,a,o){var i,c=this,u=[],l=document.readyState;Object.defineProperties(this,{_registerWrapper:{enumerable:!1,configurable:!0,writable:!1,value:function(e){u.push(e)}},_controller:{enumerable:!0,configurable:!0,get:function(){return function(){if(i)return i;var d=document.readyState;return i=new Ir(Object(s.a)({apiKey:c._apiKey,apiVersion:c._injectBetaHeader(t),__privateApiUrl:n,__privatePaymentUserAgentSuffix:r,stripeAccount:a,betas:c._betas,stripeJsId:e.stripeJsId,stripeJsLoadTimestamp:Zo,stripeCreateTimestamp:o,onFirstLoad:function(){try{oi(i,l,d)}catch(e){}},listenerRegistry:c._listenerRegistry},c._locale?{locale:c._locale}:{})),Object.defineProperties(c,{_registerWrapper:{value:di,writable:!1,enumerable:!1,configurable:!0},_controller:{value:i,writable:!0,enumerable:!0,configurable:!0}}),u.forEach((function(e){return c._registerWrapper(e)})),u.splice(0),i}()}}})}},{key:"_attachLinkedAccountsMethods",value:function(e){var t=this;this.collectFinancialConnectionsAccounts=D((function(e){return Tn(t._controller,e)})),this.collectBankAccountToken=D((function(e){return function(e,t){return Cn({linkAccountSessionCreatorClientSecret:t.clientSecret,linkAccountSessionCreatorType:"link_account_session",controller:e,consumerPublishableKey:null,checkoutPriceAmount:{amount:null,currency:null},email:null,linkMobilePhone:null,linkMobilePhoneCountry:null,useContinueButtonOnSuccess:!1}).then((function(e){if("error"in e)return e;var t=e.linkAccountSession,n=t.linkedAccounts,r=Object(f.a)(t,["linkedAccounts"]);return{token:e.linkAccountSession.bankAccountToken,linkAccountSession:e.linkAccountSession,financialConnectionsSession:Object(s.a)(Object(s.a)({},r),{},{accounts:n})}}))}(t._controller,e)}))}},{key:"_attachAppInfo",value:function(){var e=this;this.registerAppInfo=x((function(t){var n=Object(m.I)(pr,t,"WrapperLibrary");"error"!==n.type?e._controller.registerAppInfo(n.value):e._controller.warn("Failed to register your library: ".concat(n.error.message))}))}},{key:"_injectBetaHeader",value:function(e){return e}},{key:"_ensureHTTPS",value:function(){var e=window.location.protocol,t=-1!==["localhost","127.0.0.1","0.0.0.0"].indexOf(window.location.hostname),n=!0===window.isSecureContext&&!t||-1!==["https:","file:","ionic:","httpsionic:","chrome-extension:","moz-extension:"].indexOf(e),r=this._keyMode===He.a.live,a="Live Stripe.js integrations must use HTTPS. For more information: https://stripe.com/docs/security/guide#tls";if(!n){if(r&&!t)throw this._controller.report("user_error.non_https_error",{protocol:e}),new k.b(a);!r||t?window.console&&console.warn("You may test your Stripe.js integration over HTTP. However, live Stripe.js integrations must use HTTPS."):window.console&&console.warn(a)}}},{key:"_ensureHTTPOnlyLinkCookie",value:function(){if(!(this._keyMode===He.a.live)&&bt("stripe.link.persistent_token"))throw new k.b("`stripe.link.persistent_token` must be set as an httpOnly cookie. For more information https://stripe.com/docs/payments/link/accept-a-payment?platform=web#merchant-domain-cookie")}},{key:"_ensureStripeHosted",value:function(e){if(!e)throw this._controller.report("user_error.self_hosted"),new k.b("Stripe.js must be loaded from js.stripe.com. For more information https://stripe.com/docs/stripe-js/reference#including-stripejs")}},{key:"_mids",value:function(){return e._ec?e._ec.ids():null}},{key:"_midsPromise",value:function(){return e._ec?e._ec.idsPromise():E.a.resolve(this._mids())}}]),e}();li.version=3,li.stripeJsId=y(),li._ec=(ri=new RegExp("".concat(document.location.protocol,"//").concat(document.location.host)),"https://checkout.stripe.com/".match(ri)?null:Ut());var di=function(e){var t=Object(m.I)(dr,e,"StripeWrapperLibrary");if("error"!==t.type){var n=t.value,r=n.name,a=n.version,o=n.startTime;this._controller.registerWrapper({name:r,version:a,startTime:o})}else this._controller.report("register_wrapper.error",{error:t.error.message})},pi=li,fi=function(){if(document.currentScript){var e=Object(g.i)(document.currentScript.src);return!e||Object(g.g)(e.origin)}return!0}(),mi=function(e,t){return new pi(Object(s.a)({apiKey:e},t&&"object"==typeof t?t:{}),fi)};mi.version=pi.version,window.Stripe&&2===window.Stripe.version&&!window.Stripe.StripeV3?window.Stripe.StripeV3=mi:window.Stripe?window.console&&console.warn("It looks like Stripe.js was loaded more than one time. Please only load it once per page."):window.Stripe=mi;t.default=mi}]);
diff --git a/public/js/sw.js b/public/js/sw.js
new file mode 100644
index 0000000..c25d4b3
--- /dev/null
+++ b/public/js/sw.js
@@ -0,0 +1,75 @@
+const addResourcesToCache = async (resources) => {
+  const cache = await caches.open('v0');
+  await cache.addAll(resources);
+};
+
+const putInCache = async (request, response) => {
+  const cache = await caches.open('v0');
+  await cache.put(request, response);
+};
+
+const cacheFirst = async ({ request, preloadResponsePromise, fallbackUrl }) => {
+  // First try to get the resource from the cache
+  const responseFromCache = await caches.match(request);
+  if (responseFromCache) {
+    return responseFromCache;
+  }
+
+  // Next try to use (and cache) the preloaded response, if it's there
+  const preloadResponse = await preloadResponsePromise;
+  if (preloadResponse) {
+    putInCache(request, preloadResponse.clone());
+    return preloadResponse;
+  }
+
+  // Next try to get the resource from the network
+  try {
+    const responseFromNetwork = await fetch(request);
+    putInCache(request, responseFromNetwork.clone());
+    return responseFromNetwork;
+  } catch (_error) {
+    const fallbackResponse = await caches.match(fallbackUrl);
+    if (fallbackResponse) {
+      return fallbackResponse;
+    }
+
+    return new Response('Network error happened', {
+      status: 408,
+      headers: { 'Content-Type': 'text/plain' },
+    });
+  }
+};
+
+const enableNavigationPreload = async () => {
+  if (self.registration.navigationPreload) {
+    await self.registration.navigationPreload.enable();
+  }
+};
+
+self.addEventListener('activate', (event) => {
+  event.waitUntil(enableNavigationPreload());
+});
+
+self.addEventListener('install', (event) => {
+  event.waitUntil(
+    addResourcesToCache([
+      '/',
+      '/public/css/style.css',
+      '/public/manifest.json',
+      '/public/js/script.js',
+      '/public/js/userbase.js',
+      '/public/js/stripe.js',
+      '/public/js/sweetalert.js',
+    ]),
+  );
+});
+
+self.addEventListener('fetch', (event) => {
+  event.respondWith(
+    cacheFirst({
+      request: event.request,
+      preloadResponsePromise: event.preloadResponse,
+      fallbackUrl: '/',
+    }),
+  );
+});
diff --git a/public/js/sweetalert.js b/public/js/sweetalert.js
new file mode 100644
index 0000000..cb7f489
--- /dev/null
+++ b/public/js/sweetalert.js
@@ -0,0 +1,2 @@
+!function (e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = e || self).Sweetalert2 = t() }(this, function () { "use strict"; const D = "SweetAlert2:", q = e => e.charAt(0).toUpperCase() + e.slice(1), i = e => Array.prototype.slice.call(e), a = e => { console.warn("".concat(D, " ").concat("object" == typeof e ? e.join(" ") : e)) }, l = e => { console.error("".concat(D, " ").concat(e)) }, V = [], N = (e, t) => { e = '"'.concat(e, '" is deprecated and will be removed in the next major release. Please use "').concat(t, '" instead.'), V.includes(e) || (V.push(e), a(e)) }, R = e => "function" == typeof e ? e() : e, F = e => e && "function" == typeof e.toPromise, u = e => F(e) ? e.toPromise() : Promise.resolve(e), U = e => e && Promise.resolve(e) === e; const r = { title: "", titleText: "", text: "", html: "", footer: "", icon: void 0, iconColor: void 0, iconHtml: void 0, template: void 0, toast: !1, showClass: { popup: "swal2-show", backdrop: "swal2-backdrop-show", icon: "swal2-icon-show" }, hideClass: { popup: "swal2-hide", backdrop: "swal2-backdrop-hide", icon: "swal2-icon-hide" }, customClass: {}, target: "body", color: void 0, backdrop: !0, heightAuto: !0, allowOutsideClick: !0, allowEscapeKey: !0, allowEnterKey: !0, stopKeydownPropagation: !0, keydownListenerCapture: !1, showConfirmButton: !0, showDenyButton: !1, showCancelButton: !1, preConfirm: void 0, preDeny: void 0, confirmButtonText: "OK", confirmButtonAriaLabel: "", confirmButtonColor: void 0, denyButtonText: "No", denyButtonAriaLabel: "", denyButtonColor: void 0, cancelButtonText: "Cancel", cancelButtonAriaLabel: "", cancelButtonColor: void 0, buttonsStyling: !0, reverseButtons: !1, focusConfirm: !0, focusDeny: !1, focusCancel: !1, returnFocus: !0, showCloseButton: !1, closeButtonHtml: "&times;", closeButtonAriaLabel: "Close this dialog", loaderHtml: "", showLoaderOnConfirm: !1, showLoaderOnDeny: !1, imageUrl: void 0, imageWidth: void 0, imageHeight: void 0, imageAlt: "", timer: void 0, timerProgressBar: !1, width: void 0, padding: void 0, background: void 0, input: void 0, inputPlaceholder: "", inputLabel: "", inputValue: "", inputOptions: {}, inputAutoTrim: !0, inputAttributes: {}, inputValidator: void 0, returnInputValueOnDeny: !1, validationMessage: void 0, grow: !1, position: "center", progressSteps: [], currentProgressStep: void 0, progressStepsDistance: void 0, willOpen: void 0, didOpen: void 0, didRender: void 0, willClose: void 0, didClose: void 0, didDestroy: void 0, scrollbarPadding: !0 }, W = ["allowEscapeKey", "allowOutsideClick", "background", "buttonsStyling", "cancelButtonAriaLabel", "cancelButtonColor", "cancelButtonText", "closeButtonAriaLabel", "closeButtonHtml", "color", "confirmButtonAriaLabel", "confirmButtonColor", "confirmButtonText", "currentProgressStep", "customClass", "denyButtonAriaLabel", "denyButtonColor", "denyButtonText", "didClose", "didDestroy", "footer", "hideClass", "html", "icon", "iconColor", "iconHtml", "imageAlt", "imageHeight", "imageUrl", "imageWidth", "preConfirm", "preDeny", "progressSteps", "returnFocus", "reverseButtons", "showCancelButton", "showCloseButton", "showConfirmButton", "showDenyButton", "text", "title", "titleText", "willClose"], z = {}, K = ["allowOutsideClick", "allowEnterKey", "backdrop", "focusConfirm", "focusDeny", "focusCancel", "returnFocus", "heightAuto", "keydownListenerCapture"], _ = e => Object.prototype.hasOwnProperty.call(r, e), Y = e => -1 !== W.indexOf(e), Z = e => z[e], X = e => { !e.backdrop && e.allowOutsideClick && a('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); for (const n in e) t = n, _(t) || a('Unknown parameter "'.concat(t, '"')), e.toast && (t = n, K.includes(t) && a('The parameter "'.concat(t, '" is incompatible with toasts'))), t = n, Z(t) && N(t, Z(t)); var t }; var e = e => { const t = {}; for (const n in e) t[e[n]] = "swal2-" + e[n]; return t }; const p = e(["container", "shown", "height-auto", "iosfix", "popup", "modal", "no-backdrop", "no-transition", "toast", "toast-shown", "show", "hide", "close", "title", "html-container", "actions", "confirm", "deny", "cancel", "default-outline", "footer", "icon", "icon-content", "image", "input", "file", "range", "select", "radio", "checkbox", "label", "textarea", "inputerror", "input-label", "validation-message", "progress-steps", "active-progress-step", "progress-step", "progress-step-line", "loader", "loading", "styled", "top", "top-start", "top-end", "top-left", "top-right", "center", "center-start", "center-end", "center-left", "center-right", "bottom", "bottom-start", "bottom-end", "bottom-left", "bottom-right", "grow-row", "grow-column", "grow-fullscreen", "rtl", "timer-progress-bar", "timer-progress-bar-container", "scrollbar-measure", "icon-success", "icon-warning", "icon-info", "icon-question", "icon-error", "no-war"]), o = e(["success", "warning", "info", "question", "error"]), m = () => document.body.querySelector(".".concat(p.container)), $ = e => { const t = m(); return t ? t.querySelector(e) : null }, t = e => $(".".concat(e)), g = () => t(p.popup), J = () => t(p.icon), G = () => t(p.title), Q = () => t(p["html-container"]), ee = () => t(p.image), te = () => t(p["progress-steps"]), ne = () => t(p["validation-message"]), h = () => $(".".concat(p.actions, " .").concat(p.confirm)), f = () => $(".".concat(p.actions, " .").concat(p.deny)); const d = () => $(".".concat(p.loader)), b = () => $(".".concat(p.actions, " .").concat(p.cancel)), oe = () => t(p.actions), ie = () => t(p.footer), ae = () => t(p["timer-progress-bar"]), re = () => t(p.close), se = () => { const e = i(g().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort((e, t) => { e = parseInt(e.getAttribute("tabindex")), t = parseInt(t.getAttribute("tabindex")); return t < e ? 1 : e < t ? -1 : 0 }); var t = i(g().querySelectorAll('\n  a[href],\n  area[href],\n  input:not([disabled]),\n  select:not([disabled]),\n  textarea:not([disabled]),\n  button:not([disabled]),\n  iframe,\n  object,\n  embed,\n  [tabindex="0"],\n  [contenteditable],\n  audio[controls],\n  video[controls],\n  summary\n')).filter(e => "-1" !== e.getAttribute("tabindex")); return (t => { const n = []; for (let e = 0; e < t.length; e++)-1 === n.indexOf(t[e]) && n.push(t[e]); return n })(e.concat(t)).filter(e => B(e)) }, ce = () => s(document.body, p.shown) && !s(document.body, p["toast-shown"]) && !s(document.body, p["no-backdrop"]), le = () => g() && s(g(), p.toast); function ue(e) { var t = 1 < arguments.length && void 0 !== arguments[1] && arguments[1]; const n = ae(); B(n) && (t && (n.style.transition = "none", n.style.width = "100%"), setTimeout(() => { n.style.transition = "width ".concat(e / 1e3, "s linear"), n.style.width = "0%" }, 10)) } const n = { previousBodyPadding: null }, v = (t, e) => { if (t.textContent = "", e) { const n = new DOMParser, o = n.parseFromString(e, "text/html"); i(o.querySelector("head").childNodes).forEach(e => { t.appendChild(e) }), i(o.querySelector("body").childNodes).forEach(e => { t.appendChild(e) }) } }, s = (t, e) => { if (!e) return !1; var n = e.split(/\s+/); for (let e = 0; e < n.length; e++)if (!t.classList.contains(n[e])) return !1; return !0 }, de = (t, n) => { i(t.classList).forEach(e => { Object.values(p).includes(e) || Object.values(o).includes(e) || Object.values(n.showClass).includes(e) || t.classList.remove(e) }) }, y = (e, t, n) => { if (de(e, t), t.customClass && t.customClass[n]) { if ("string" != typeof t.customClass[n] && !t.customClass[n].forEach) return a("Invalid type of customClass.".concat(n, '! Expected string or iterable object, got "').concat(typeof t.customClass[n], '"')); w(e, t.customClass[n]) } }, pe = (e, t) => { if (!t) return null; switch (t) { case "select": case "textarea": case "file": return e.querySelector(".".concat(p.popup, " > .").concat(p[t])); case "checkbox": return e.querySelector(".".concat(p.popup, " > .").concat(p.checkbox, " input")); case "radio": return e.querySelector(".".concat(p.popup, " > .").concat(p.radio, " input:checked")) || e.querySelector(".".concat(p.popup, " > .").concat(p.radio, " input:first-child")); case "range": return e.querySelector(".".concat(p.popup, " > .").concat(p.range, " input")); default: return e.querySelector(".".concat(p.popup, " > .").concat(p.input)) } }, me = e => { var t; e.focus(), "file" !== e.type && (t = e.value, e.value = "", e.value = t) }, ge = (e, t, n) => { e && t && (t = "string" == typeof t ? t.split(/\s+/).filter(Boolean) : t).forEach(t => { Array.isArray(e) ? e.forEach(e => { n ? e.classList.add(t) : e.classList.remove(t) }) : n ? e.classList.add(t) : e.classList.remove(t) }) }, w = (e, t) => { ge(e, t, !0) }, C = (e, t) => { ge(e, t, !1) }, A = (e, t) => { var n = i(e.childNodes); for (let e = 0; e < n.length; e++)if (s(n[e], t)) return n[e] }, c = (e, t, n) => { (n = n === "".concat(parseInt(n)) ? parseInt(n) : n) || 0 === parseInt(n) ? e.style[t] = "number" == typeof n ? "".concat(n, "px") : n : e.style.removeProperty(t) }, k = function (e) { e.style.display = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : "flex" }, P = e => { e.style.display = "none" }, he = (e, t, n, o) => { const i = e.querySelector(t); i && (i.style[n] = o) }, fe = function (e, t) { var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : "flex"; t ? k(e, n) : P(e) }, B = e => !(!e || !(e.offsetWidth || e.offsetHeight || e.getClientRects().length)), be = () => !B(h()) && !B(f()) && !B(b()), ve = e => !!(e.scrollHeight > e.clientHeight), ye = e => { const t = window.getComputedStyle(e); var e = parseFloat(t.getPropertyValue("animation-duration") || "0"), n = parseFloat(t.getPropertyValue("transition-duration") || "0"); return 0 < e || 0 < n }, we = () => "undefined" == typeof window || "undefined" == typeof document, Ce = 100, x = {}, Ae = () => { x.previousActiveElement instanceof HTMLElement ? (x.previousActiveElement.focus(), x.previousActiveElement = null) : document.body && document.body.focus() }, ke = o => new Promise(e => { if (!o) return e(); var t = window.scrollX, n = window.scrollY; x.restoreFocusTimeout = setTimeout(() => { Ae(), e() }, Ce), window.scrollTo(t, n) }), Pe = '\n <div aria-labelledby="'.concat(p.title, '" aria-describedby="').concat(p["html-container"], '" class="').concat(p.popup, '" tabindex="-1">\n   <button type="button" class="').concat(p.close, '"></button>\n   <ul class="').concat(p["progress-steps"], '"></ul>\n   <div class="').concat(p.icon, '"></div>\n   <img class="').concat(p.image, '" />\n   <h2 class="').concat(p.title, '" id="').concat(p.title, '"></h2>\n   <div class="').concat(p["html-container"], '" id="').concat(p["html-container"], '"></div>\n   <input class="').concat(p.input, '" />\n   <input type="file" class="').concat(p.file, '" />\n   <div class="').concat(p.range, '">\n     <input type="range" />\n     <output></output>\n   </div>\n   <select class="').concat(p.select, '"></select>\n   <div class="').concat(p.radio, '"></div>\n   <label for="').concat(p.checkbox, '" class="').concat(p.checkbox, '">\n     <input type="checkbox" />\n     <span class="').concat(p.label, '"></span>\n   </label>\n   <textarea class="').concat(p.textarea, '"></textarea>\n   <div class="').concat(p["validation-message"], '" id="').concat(p["validation-message"], '"></div>\n   <div class="').concat(p.actions, '">\n     <div class="').concat(p.loader, '"></div>\n     <button type="button" class="').concat(p.confirm, '"></button>\n     <button type="button" class="').concat(p.deny, '"></button>\n     <button type="button" class="').concat(p.cancel, '"></button>\n   </div>\n   <div class="').concat(p.footer, '"></div>\n   <div class="').concat(p["timer-progress-bar-container"], '">\n     <div class="').concat(p["timer-progress-bar"], '"></div>\n   </div>\n </div>\n').replace(/(^|\n)\s*/g, ""), Be = () => { const e = m(); return !!e && (e.remove(), C([document.documentElement, document.body], [p["no-backdrop"], p["toast-shown"], p["has-column"]]), !0) }, E = () => { x.currentInstance.resetValidationMessage() }, xe = () => { const e = g(), t = A(e, p.input), n = A(e, p.file), o = e.querySelector(".".concat(p.range, " input")), i = e.querySelector(".".concat(p.range, " output")), a = A(e, p.select), r = e.querySelector(".".concat(p.checkbox, " input")), s = A(e, p.textarea); t.oninput = E, n.onchange = E, a.onchange = E, r.onchange = E, s.oninput = E, o.oninput = () => { E(), i.value = o.value }, o.onchange = () => { E(), i.value = o.value } }, Ee = e => "string" == typeof e ? document.querySelector(e) : e, Te = e => { const t = g(); t.setAttribute("role", e.toast ? "alert" : "dialog"), t.setAttribute("aria-live", e.toast ? "polite" : "assertive"), e.toast || t.setAttribute("aria-modal", "true") }, Se = e => { "rtl" === window.getComputedStyle(e).direction && w(m(), p.rtl) }, Le = (e, t) => { if (e instanceof HTMLElement) t.appendChild(e); else if ("object" == typeof e) { var n = e, o = t; if (n.jquery) Oe(o, n); else v(o, n.toString()) } else e && v(t, e) }, Oe = (t, n) => { if (t.textContent = "", 0 in n) for (let e = 0; e in n; e++)t.appendChild(n[e].cloneNode(!0)); else t.appendChild(n.cloneNode(!0)) }, je = (() => { if (we()) return !1; var e = document.createElement("div"), t = { WebkitAnimation: "webkitAnimationEnd", animation: "animationend" }; for (const n in t) if (Object.prototype.hasOwnProperty.call(t, n) && void 0 !== e.style[n]) return t[n]; return !1 })(), Me = (e, t) => { var n, o, i, a, r, s = oe(), c = d(); (t.showConfirmButton || t.showDenyButton || t.showCancelButton ? k : P)(s), y(s, t, "actions"), s = s, n = c, o = t, i = h(), a = f(), r = b(), He(i, "confirm", o), He(a, "deny", o), He(r, "cancel", o), function (e, t, n, o) { if (!o.buttonsStyling) return C([e, t, n], p.styled); w([e, t, n], p.styled), o.confirmButtonColor && (e.style.backgroundColor = o.confirmButtonColor, w(e, p["default-outline"])); o.denyButtonColor && (t.style.backgroundColor = o.denyButtonColor, w(t, p["default-outline"])); o.cancelButtonColor && (n.style.backgroundColor = o.cancelButtonColor, w(n, p["default-outline"])) }(i, a, r, o), o.reverseButtons && (o.toast ? (s.insertBefore(r, i), s.insertBefore(a, i)) : (s.insertBefore(r, n), s.insertBefore(a, n), s.insertBefore(i, n))), v(c, t.loaderHtml), y(c, t, "loader") }; function He(e, t, n) { fe(e, n["show".concat(q(t), "Button")], "inline-block"), v(e, n["".concat(t, "ButtonText")]), e.setAttribute("aria-label", n["".concat(t, "ButtonAriaLabel")]), e.className = p[t], y(e, n, "".concat(t, "Button")), w(e, n["".concat(t, "ButtonClass")]) } const Ie = (e, t) => { var n, o, i = m(); i && (o = i, "string" == typeof (n = t.backdrop) ? o.style.background = n : n || w([document.documentElement, document.body], p["no-backdrop"]), o = i, (n = t.position) in p ? w(o, p[n]) : (a('The "position" parameter is not valid, defaulting to "center"'), w(o, p.center)), n = i, (o = t.grow) && "string" == typeof o && (o = "grow-".concat(o)) in p && w(n, p[o]), y(i, t, "container")) }; var T = { awaitingPromise: new WeakMap, promise: new WeakMap, innerParams: new WeakMap, domCache: new WeakMap }; const De = ["input", "file", "range", "select", "radio", "checkbox", "textarea"], qe = (e, r) => { const s = g(); var t, e = T.innerParams.get(e); const c = !e || r.input !== e.input; De.forEach(e => { const t = A(s, p[e]); { var n = e, o = r.inputAttributes; const i = pe(g(), n); if (i) { Ve(i); for (const a in o) i.setAttribute(a, o[a]) } } t.className = p[e], c && P(t) }), r.input && (c && (e => { if (!S[e.input]) return l('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'.concat(e.input, '"')); const t = Fe(e.input), n = S[e.input](t, e); k(t), setTimeout(() => { me(n) }) })(r), e = r, t = Fe(e.input), "object" == typeof e.customClass && w(t, e.customClass.input)) }, Ve = t => { for (let e = 0; e < t.attributes.length; e++) { var n = t.attributes[e].name;["type", "value", "style"].includes(n) || t.removeAttribute(n) } }, Ne = (e, t) => { e.placeholder && !t.inputPlaceholder || (e.placeholder = t.inputPlaceholder) }, Re = (e, t, n) => { if (n.inputLabel) { e.id = p.input; const i = document.createElement("label"); var o = p["input-label"]; i.setAttribute("for", e.id), i.className = o, "object" == typeof n.customClass && w(i, n.customClass.inputLabel), i.innerText = n.inputLabel, t.insertAdjacentElement("beforebegin", i) } }, Fe = e => A(g(), p[e] || p.input), Ue = (e, t) => { ["string", "number"].includes(typeof t) ? e.value = "".concat(t) : U(t) || a('Unexpected type of inputValue! Expected "string", "number" or "Promise", got "'.concat(typeof t, '"')) }, S = {}, We = (S.text = S.email = S.password = S.number = S.tel = S.url = (e, t) => (Ue(e, t.inputValue), Re(e, e, t), Ne(e, t), e.type = t.input, e), S.file = (e, t) => (Re(e, e, t), Ne(e, t), e), S.range = (e, t) => { const n = e.querySelector("input"); var o = e.querySelector("output"); return Ue(n, t.inputValue), n.type = t.input, Ue(o, t.inputValue), Re(n, e, t), e }, S.select = (e, t) => { if (e.textContent = "", t.inputPlaceholder) { const n = document.createElement("option"); v(n, t.inputPlaceholder), n.value = "", n.disabled = !0, n.selected = !0, e.appendChild(n) } return Re(e, e, t), e }, S.radio = e => (e.textContent = "", e), S.checkbox = (e, t) => { const n = pe(g(), "checkbox"); n.value = "1", n.id = p.checkbox, n.checked = Boolean(t.inputValue); e = e.querySelector("span"); return v(e, t.inputPlaceholder), n }, S.textarea = (n, e) => { Ue(n, e.inputValue), Ne(n, e), Re(n, n, e); return setTimeout(() => { if ("MutationObserver" in window) { const t = parseInt(window.getComputedStyle(g()).width); new MutationObserver(() => { var e = n.offsetWidth + (e = n, parseInt(window.getComputedStyle(e).marginLeft) + parseInt(window.getComputedStyle(e).marginRight)); e > t ? g().style.width = "".concat(e, "px") : g().style.width = null }).observe(n, { attributes: !0, attributeFilter: ["style"] }) } }), n }, (e, t) => { const n = Q(); y(n, t, "htmlContainer"), t.html ? (Le(t.html, n), k(n, "block")) : t.text ? (n.textContent = t.text, k(n, "block")) : P(n), qe(e, t) }), ze = (e, t) => { var n = ie(); fe(n, t.footer), t.footer && Le(t.footer, n), y(n, t, "footer") }, Ke = (e, t) => { const n = re(); v(n, t.closeButtonHtml), y(n, t, "closeButton"), fe(n, t.showCloseButton), n.setAttribute("aria-label", t.closeButtonAriaLabel) }, _e = (e, t) => { var e = T.innerParams.get(e), n = J(); if (e && t.icon === e.icon) return Je(n, t), void Ye(n, t); if (t.icon || t.iconHtml) { if (t.icon && -1 === Object.keys(o).indexOf(t.icon)) return l('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(t.icon, '"')), void P(n); k(n), Je(n, t), Ye(n, t), w(n, t.showClass.icon) } else P(n) }, Ye = (e, t) => { for (const n in o) t.icon !== n && C(e, o[n]); w(e, o[t.icon]), Ge(e, t), Ze(), y(e, t, "icon") }, Ze = () => { const e = g(); var t = window.getComputedStyle(e).getPropertyValue("background-color"); const n = e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix"); for (let e = 0; e < n.length; e++)n[e].style.backgroundColor = t }, Xe = '\n  <div class="swal2-success-circular-line-left"></div>\n  <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n  <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n  <div class="swal2-success-circular-line-right"></div>\n', $e = '\n  <span class="swal2-x-mark">\n    <span class="swal2-x-mark-line-left"></span>\n    <span class="swal2-x-mark-line-right"></span>\n  </span>\n', Je = (e, t) => { let n = e.innerHTML, o; var i; t.iconHtml ? o = Qe(t.iconHtml) : "success" === t.icon ? (o = Xe, n = n.replace(/ style=".*?"/g, "")) : o = "error" === t.icon ? $e : (i = { question: "?", warning: "!", info: "i" }, Qe(i[t.icon])), n.trim() !== o.trim() && v(e, o) }, Ge = (e, t) => { if (t.iconColor) { e.style.color = t.iconColor, e.style.borderColor = t.iconColor; for (const n of [".swal2-success-line-tip", ".swal2-success-line-long", ".swal2-x-mark-line-left", ".swal2-x-mark-line-right"]) he(e, n, "backgroundColor", t.iconColor); he(e, ".swal2-success-ring", "borderColor", t.iconColor) } }, Qe = e => '<div class="'.concat(p["icon-content"], '">').concat(e, "</div>"), et = (e, t) => { const n = ee(); if (!t.imageUrl) return P(n); k(n, ""), n.setAttribute("src", t.imageUrl), n.setAttribute("alt", t.imageAlt), c(n, "width", t.imageWidth), c(n, "height", t.imageHeight), n.className = p.image, y(n, t, "image") }, tt = (e, n) => { const o = te(); if (!n.progressSteps || 0 === n.progressSteps.length) return P(o); k(o), o.textContent = "", n.currentProgressStep >= n.progressSteps.length && a("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"), n.progressSteps.forEach((e, t) => { var e = (e => { const t = document.createElement("li"); return w(t, p["progress-step"]), v(t, e), t })(e); o.appendChild(e), t === n.currentProgressStep && w(e, p["active-progress-step"]), t !== n.progressSteps.length - 1 && (e = (e => { const t = document.createElement("li"); if (w(t, p["progress-step-line"]), e.progressStepsDistance) c(t, "width", e.progressStepsDistance); return t })(n), o.appendChild(e)) }) }, nt = (e, t) => { const n = G(); fe(n, t.title || t.titleText, "block"), t.title && Le(t.title, n), t.titleText && (n.innerText = t.titleText), y(n, t, "title") }, ot = (e, t) => { var n = m(); const o = g(); t.toast ? (c(n, "width", t.width), o.style.width = "100%", o.insertBefore(d(), J())) : c(o, "width", t.width), c(o, "padding", t.padding), t.color && (o.style.color = t.color), t.background && (o.style.background = t.background), P(ne()); n = o; (n.className = "".concat(p.popup, " ").concat(B(n) ? t.showClass.popup : ""), t.toast) ? (w([document.documentElement, document.body], p["toast-shown"]), w(n, p.toast)) : w(n, p.modal); y(n, t, "popup"), "string" == typeof t.customClass && w(n, t.customClass); t.icon && w(n, p["icon-".concat(t.icon)]) }, it = (e, t) => { ot(e, t), Ie(e, t), tt(e, t), _e(e, t), et(e, t), nt(e, t), Ke(e, t), We(e, t), Me(e, t), ze(e, t), "function" == typeof t.didRender && t.didRender(g()) }, L = Object.freeze({ cancel: "cancel", backdrop: "backdrop", close: "close", esc: "esc", timer: "timer" }), at = () => { const e = i(document.body.children); e.forEach(e => { e === m() || e.contains(m()) || (e.hasAttribute("aria-hidden") && e.setAttribute("data-previous-aria-hidden", e.getAttribute("aria-hidden")), e.setAttribute("aria-hidden", "true")) }) }, rt = () => { const e = i(document.body.children); e.forEach(e => { e.hasAttribute("data-previous-aria-hidden") ? (e.setAttribute("aria-hidden", e.getAttribute("data-previous-aria-hidden")), e.removeAttribute("data-previous-aria-hidden")) : e.removeAttribute("aria-hidden") }) }, st = ["swal-title", "swal-html", "swal-footer"], ct = e => { const n = {}; return i(e.querySelectorAll("swal-param")).forEach(e => { O(e, ["name", "value"]); var t = e.getAttribute("name"), e = e.getAttribute("value"); "boolean" == typeof r[t] && "false" === e && (n[t] = !1), "object" == typeof r[t] && (n[t] = JSON.parse(e)) }), n }, lt = e => { const n = {}; return i(e.querySelectorAll("swal-button")).forEach(e => { O(e, ["type", "color", "aria-label"]); var t = e.getAttribute("type"); n["".concat(t, "ButtonText")] = e.innerHTML, n["show".concat(q(t), "Button")] = !0, e.hasAttribute("color") && (n["".concat(t, "ButtonColor")] = e.getAttribute("color")), e.hasAttribute("aria-label") && (n["".concat(t, "ButtonAriaLabel")] = e.getAttribute("aria-label")) }), n }, ut = e => { const t = {}, n = e.querySelector("swal-image"); return n && (O(n, ["src", "width", "height", "alt"]), n.hasAttribute("src") && (t.imageUrl = n.getAttribute("src")), n.hasAttribute("width") && (t.imageWidth = n.getAttribute("width")), n.hasAttribute("height") && (t.imageHeight = n.getAttribute("height")), n.hasAttribute("alt") && (t.imageAlt = n.getAttribute("alt"))), t }, dt = e => { const t = {}, n = e.querySelector("swal-icon"); return n && (O(n, ["type", "color"]), n.hasAttribute("type") && (t.icon = n.getAttribute("type")), n.hasAttribute("color") && (t.iconColor = n.getAttribute("color")), t.iconHtml = n.innerHTML), t }, pt = e => { const n = {}, t = e.querySelector("swal-input"); t && (O(t, ["type", "label", "placeholder", "value"]), n.input = t.getAttribute("type") || "text", t.hasAttribute("label") && (n.inputLabel = t.getAttribute("label")), t.hasAttribute("placeholder") && (n.inputPlaceholder = t.getAttribute("placeholder")), t.hasAttribute("value") && (n.inputValue = t.getAttribute("value"))); e = e.querySelectorAll("swal-input-option"); return e.length && (n.inputOptions = {}, i(e).forEach(e => { O(e, ["value"]); var t = e.getAttribute("value"), e = e.innerHTML; n.inputOptions[t] = e })), n }, mt = (e, t) => { const n = {}; for (const o in t) { const i = t[o], a = e.querySelector(i); a && (O(a, []), n[i.replace(/^swal-/, "")] = a.innerHTML.trim()) } return n }, gt = e => { const t = st.concat(["swal-param", "swal-button", "swal-image", "swal-icon", "swal-input", "swal-input-option"]); i(e.children).forEach(e => { e = e.tagName.toLowerCase(); -1 === t.indexOf(e) && a("Unrecognized element <".concat(e, ">")) }) }, O = (t, n) => { i(t.attributes).forEach(e => { -1 === n.indexOf(e.name) && a(['Unrecognized attribute "'.concat(e.name, '" on <').concat(t.tagName.toLowerCase(), ">."), "".concat(n.length ? "Allowed attributes are: ".concat(n.join(", ")) : "To set the value, use HTML within the element.")]) }) }; var ht = { email: (e, t) => /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(e) ? Promise.resolve() : Promise.resolve(t || "Invalid email address"), url: (e, t) => /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e) ? Promise.resolve() : Promise.resolve(t || "Invalid URL") }; function ft(e) { (t = e).inputValidator || Object.keys(ht).forEach(e => { t.input === e && (t.inputValidator = ht[e]) }), e.showLoaderOnConfirm && !e.preConfirm && a("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"), (n = e).target && ("string" != typeof n.target || document.querySelector(n.target)) && ("string" == typeof n.target || n.target.appendChild) || (a('Target parameter is not valid, defaulting to "body"'), n.target = "body"), "string" == typeof e.title && (e.title = e.title.split("\n").join("<br />")); var t, n = e, e = Be(); if (we()) l("SweetAlert2 requires document to initialize"); else { const o = document.createElement("div"), i = (o.className = p.container, e && w(o, p["no-transition"]), v(o, Pe), Ee(n.target)); i.appendChild(o), Te(n), Se(i), xe() } } class bt { constructor(e, t) { this.callback = e, this.remaining = t, this.running = !1, this.start() } start() { return this.running || (this.running = !0, this.started = new Date, this.id = setTimeout(this.callback, this.remaining)), this.remaining } stop() { return this.running && (this.running = !1, clearTimeout(this.id), this.remaining -= (new Date).getTime() - this.started.getTime()), this.remaining } increase(e) { var t = this.running; return t && this.stop(), this.remaining += e, t && this.start(), this.remaining } getTimerLeft() { return this.running && (this.stop(), this.start()), this.remaining } isRunning() { return this.running } } const vt = () => { null === n.previousBodyPadding && document.body.scrollHeight > window.innerHeight && (n.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")), document.body.style.paddingRight = "".concat(n.previousBodyPadding + (() => { const e = document.createElement("div"); e.className = p["scrollbar-measure"], document.body.appendChild(e); var t = e.getBoundingClientRect().width - e.clientWidth; return document.body.removeChild(e), t })(), "px")) }, yt = () => { null !== n.previousBodyPadding && (document.body.style.paddingRight = "".concat(n.previousBodyPadding, "px"), n.previousBodyPadding = null) }, wt = () => { if ((/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream || "MacIntel" === navigator.platform && 1 < navigator.maxTouchPoints) && !s(document.body, p.iosfix)) { var e, t = document.body.scrollTop; document.body.style.top = "".concat(-1 * t, "px"), w(document.body, p.iosfix); { const n = m(); let t; n.ontouchstart = e => { t = Ct(e) }, n.ontouchmove = e => { t && (e.preventDefault(), e.stopPropagation()) } } { const o = navigator.userAgent, i = !!o.match(/iPad/i) || !!o.match(/iPhone/i), a = !!o.match(/WebKit/i), r = i && a && !o.match(/CriOS/i); r && (e = 44, g().scrollHeight > window.innerHeight - 44 && (m().style.paddingBottom = "".concat(44, "px"))) } } }, Ct = e => { var t, n = e.target, o = m(); return !((t = e).touches && t.touches.length && "stylus" === t.touches[0].touchType || (t = e).touches && 1 < t.touches.length) && (n === o || !(ve(o) || "INPUT" === n.tagName || "TEXTAREA" === n.tagName || ve(Q()) && Q().contains(n))) }, At = () => { var e; s(document.body, p.iosfix) && (e = parseInt(document.body.style.top, 10), C(document.body, p.iosfix), document.body.style.top = "", document.body.scrollTop = -1 * e) }, kt = 10, Pt = e => { const t = g(); if (e.target === t) { const n = m(); t.removeEventListener(je, Pt), n.style.overflowY = "auto" } }, Bt = (e, t) => { je && ye(t) ? (e.style.overflowY = "hidden", t.addEventListener(je, Pt)) : e.style.overflowY = "auto" }, xt = (e, t, n) => { wt(), t && "hidden" !== n && vt(), setTimeout(() => { e.scrollTop = 0 }) }, Et = (e, t, n) => { w(e, n.showClass.backdrop), t.style.setProperty("opacity", "0", "important"), k(t, "grid"), setTimeout(() => { w(t, n.showClass.popup), t.style.removeProperty("opacity") }, kt), w([document.documentElement, document.body], p.shown), n.heightAuto && n.backdrop && !n.toast && w([document.documentElement, document.body], p["height-auto"]) }, j = e => { let t = g(); t || new kn, t = g(); var n = d(); if (le()) P(J()); else { var o = t; const i = oe(), a = d(); !e && B(h()) && (e = h()); k(i), e && (P(e), a.setAttribute("data-button-to-replace", e.className)); a.parentNode.insertBefore(a, e), w([o, i], p.loading) } k(n), t.setAttribute("data-loading", "true"), t.setAttribute("aria-busy", "true"), t.focus() }, Tt = (t, n) => { const o = g(), i = e => Lt[n.input](o, Ot(e), n); F(n.inputOptions) || U(n.inputOptions) ? (j(h()), u(n.inputOptions).then(e => { t.hideLoading(), i(e) })) : "object" == typeof n.inputOptions ? i(n.inputOptions) : l("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(typeof n.inputOptions)) }, St = (t, n) => { const o = t.getInput(); P(o), u(n.inputValue).then(e => { o.value = "number" === n.input ? parseFloat(e) || 0 : "".concat(e), k(o), o.focus(), t.hideLoading() }).catch(e => { l("Error in inputValue promise: ".concat(e)), o.value = "", k(o), o.focus(), t.hideLoading() }) }, Lt = { select: (e, t, i) => { const a = A(e, p.select), r = (e, t, n) => { const o = document.createElement("option"); o.value = n, v(o, t), o.selected = jt(n, i.inputValue), e.appendChild(o) }; t.forEach(e => { var t = e[0]; const n = e[1]; if (Array.isArray(n)) { const o = document.createElement("optgroup"); o.label = t, o.disabled = !1, a.appendChild(o), n.forEach(e => r(o, e[1], e[0])) } else r(a, n, t) }), a.focus() }, radio: (e, t, a) => { const r = A(e, p.radio), n = (t.forEach(e => { var t = e[0], e = e[1]; const n = document.createElement("input"), o = document.createElement("label"), i = (n.type = "radio", n.name = p.radio, n.value = t, jt(t, a.inputValue) && (n.checked = !0), document.createElement("span")); v(i, e), i.className = p.label, o.appendChild(n), o.appendChild(i), r.appendChild(o) }), r.querySelectorAll("input")); n.length && n[0].focus() } }, Ot = n => { const o = []; return "undefined" != typeof Map && n instanceof Map ? n.forEach((e, t) => { let n = e; "object" == typeof n && (n = Ot(n)), o.push([t, n]) }) : Object.keys(n).forEach(e => { let t = n[e]; "object" == typeof t && (t = Ot(t)), o.push([e, t]) }), o }, jt = (e, t) => t && t.toString() === e.toString(); function Mt() { var e, t = T.innerParams.get(this); if (t) { const n = T.domCache.get(this); P(n.loader), le() ? t.icon && k(J()) : (t = n, (e = t.popup.getElementsByClassName(t.loader.getAttribute("data-button-to-replace"))).length ? k(e[0], "inline-block") : be() && P(t.actions)), C([n.popup, n.actions], p.loading), n.popup.removeAttribute("aria-busy"), n.popup.removeAttribute("data-loading"), n.confirmButton.disabled = !1, n.denyButton.disabled = !1, n.cancelButton.disabled = !1 } } var Ht = { swalPromiseResolve: new WeakMap, swalPromiseReject: new WeakMap }; const It = () => h() && h().click(); const Dt = e => { e.keydownTarget && e.keydownHandlerAdded && (e.keydownTarget.removeEventListener("keydown", e.keydownHandler, { capture: e.keydownListenerCapture }), e.keydownHandlerAdded = !1) }, qt = (e, t, n) => { const o = se(); if (o.length) return (t += n) === o.length ? t = 0 : -1 === t && (t = o.length - 1), o[t].focus(); g().focus() }, Vt = ["ArrowRight", "ArrowDown"], Nt = ["ArrowLeft", "ArrowUp"], Rt = (e, n, t) => { var o = T.innerParams.get(e); if (o && (!n.isComposing && 229 !== n.keyCode)) if (o.stopKeydownPropagation && n.stopPropagation(), "Enter" === n.key) e = e, s = n, i = o, R(i.allowEnterKey) && s.target && e.getInput() && s.target instanceof HTMLElement && s.target.outerHTML === e.getInput().outerHTML && (["textarea", "file"].includes(i.input) || (It(), s.preventDefault())); else if ("Tab" === n.key) { e = n; var i = o; var a = e.target, r = se(); let t = -1; for (let e = 0; e < r.length; e++)if (a === r[e]) { t = e; break } e.shiftKey ? qt(i, t, -1) : qt(i, t, 1); e.stopPropagation(), e.preventDefault() } else if ([...Vt, ...Nt].includes(n.key)) { var s = n.key; const l = h(), u = f(), d = b(); if (!(document.activeElement instanceof HTMLElement) || [l, u, d].includes(document.activeElement)) { var c = Vt.includes(s) ? "nextElementSibling" : "previousElementSibling"; let t = document.activeElement; for (let e = 0; e < oe().children.length; e++) { if (!(t = t[c])) return; if (t instanceof HTMLButtonElement && B(t)) break } t instanceof HTMLButtonElement && t.focus() } } else if ("Escape" === n.key) { e = n, n = o, o = t; if (R(n.allowEscapeKey)) { e.preventDefault(); o(L.esc) } } }; function Ft(e, t, n, o) { le() ? Kt(e, o) : (ke(n).then(() => Kt(e, o)), Dt(x)), /^((?!chrome|android).)*safari/i.test(navigator.userAgent) ? (t.setAttribute("style", "display:none !important"), t.removeAttribute("class"), t.innerHTML = "") : t.remove(), ce() && (yt(), At(), rt()), C([document.documentElement, document.body], [p.shown, p["height-auto"], p["no-backdrop"], p["toast-shown"]]) } function Ut(e) { e = void 0 !== (n = e) ? Object.assign({ isConfirmed: !1, isDenied: !1, isDismissed: !1 }, n) : { isConfirmed: !1, isDenied: !1, isDismissed: !0 }; const t = Ht.swalPromiseResolve.get(this); var n = (e => { const t = g(); if (!t) return false; const n = T.innerParams.get(e); if (!n || s(t, n.hideClass.popup)) return false; C(t, n.showClass.popup), w(t, n.hideClass.popup); const o = m(); return C(o, n.showClass.backdrop), w(o, n.hideClass.backdrop), zt(e, t, n), true })(this); this.isAwaitingPromise() ? e.isDismissed || (Wt(this), t(e)) : n && t(e) } const Wt = e => { e.isAwaitingPromise() && (T.awaitingPromise.delete(e), T.innerParams.get(e) || e._destroy()) }, zt = (e, t, n) => { var o, i, a, r = m(), s = je && ye(t); "function" == typeof n.willClose && n.willClose(t), s ? (s = e, o = t, t = r, i = n.returnFocus, a = n.didClose, x.swalCloseEventFinishedCallback = Ft.bind(null, s, t, i, a), o.addEventListener(je, function (e) { e.target === o && (x.swalCloseEventFinishedCallback(), delete x.swalCloseEventFinishedCallback) })) : Ft(e, r, n.returnFocus, n.didClose) }, Kt = (e, t) => { setTimeout(() => { "function" == typeof t && t.bind(e.params)(), e._destroy() }) }; function _t(e, t, n) { const o = T.domCache.get(e); t.forEach(e => { o[e].disabled = n }) } function Yt(e, t) { if (!e) return !1; if ("radio" === e.type) { const n = e.parentNode.parentNode, o = n.querySelectorAll("input"); for (let e = 0; e < o.length; e++)o[e].disabled = t } else e.disabled = t } const Zt = e => { e.isAwaitingPromise() ? (Xt(T, e), T.awaitingPromise.set(e, !0)) : (Xt(Ht, e), Xt(T, e)) }, Xt = (e, t) => { for (const n in e) e[n].delete(t) }; e = Object.freeze({ hideLoading: Mt, disableLoading: Mt, getInput: function (e) { var t = T.innerParams.get(e || this); return (e = T.domCache.get(e || this)) ? pe(e.popup, t.input) : null }, close: Ut, isAwaitingPromise: function () { return !!T.awaitingPromise.get(this) }, rejectPromise: function (e) { const t = Ht.swalPromiseReject.get(this); Wt(this), t && t(e) }, handleAwaitingPromise: Wt, closePopup: Ut, closeModal: Ut, closeToast: Ut, enableButtons: function () { _t(this, ["confirmButton", "denyButton", "cancelButton"], !1) }, disableButtons: function () { _t(this, ["confirmButton", "denyButton", "cancelButton"], !0) }, enableInput: function () { return Yt(this.getInput(), !1) }, disableInput: function () { return Yt(this.getInput(), !0) }, showValidationMessage: function (e) { const t = T.domCache.get(this); var n = T.innerParams.get(this); v(t.validationMessage, e), t.validationMessage.className = p["validation-message"], n.customClass && n.customClass.validationMessage && w(t.validationMessage, n.customClass.validationMessage), k(t.validationMessage); const o = this.getInput(); o && (o.setAttribute("aria-invalid", !0), o.setAttribute("aria-describedby", p["validation-message"]), me(o), w(o, p.inputerror)) }, resetValidationMessage: function () { var e = T.domCache.get(this); e.validationMessage && P(e.validationMessage); const t = this.getInput(); t && (t.removeAttribute("aria-invalid"), t.removeAttribute("aria-describedby"), C(t, p.inputerror)) }, getProgressSteps: function () { return T.domCache.get(this).progressSteps }, update: function (e) { var t = g(), n = T.innerParams.get(this); if (!t || s(t, n.hideClass.popup)) return a("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup."); t = (t => { const n = {}; return Object.keys(t).forEach(e => { if (Y(e)) n[e] = t[e]; else a("Invalid parameter to update: ".concat(e)) }), n })(e), n = Object.assign({}, n, t), it(this, n), T.innerParams.set(this, n), Object.defineProperties(this, { params: { value: Object.assign({}, this.params, e), writable: !1, enumerable: !0 } }) }, _destroy: function () { var e = T.domCache.get(this); const t = T.innerParams.get(this); t ? (e.popup && x.swalCloseEventFinishedCallback && (x.swalCloseEventFinishedCallback(), delete x.swalCloseEventFinishedCallback), "function" == typeof t.didDestroy && t.didDestroy(), e = this, Zt(e), delete e.params, delete x.keydownHandler, delete x.keydownTarget, delete x.currentInstance) : Zt(this) } }); const $t = (e, t) => { var n = T.innerParams.get(e); if (!n.input) return l('The "input" parameter is needed to be set when using returnInputValueOn'.concat(q(t))); var o = ((e, t) => { const n = e.getInput(); if (!n) return null; switch (t.input) { case "checkbox": return n.checked ? 1 : 0; case "radio": return (o = n).checked ? o.value : null; case "file": return (o = n).files.length ? null !== o.getAttribute("multiple") ? o.files : o.files[0] : null; default: return t.inputAutoTrim ? n.value.trim() : n.value }var o })(e, n); if (n.inputValidator) { var i = e; var a = o; var r = t; const s = T.innerParams.get(i), c = (i.disableInput(), Promise.resolve().then(() => u(s.inputValidator(a, s.validationMessage)))); c.then(e => { i.enableButtons(), i.enableInput(), e ? i.showValidationMessage(e) : ("deny" === r ? Jt : en)(i, a) }) } else e.getInput().checkValidity() ? ("deny" === t ? Jt : en)(e, o) : (e.enableButtons(), e.showValidationMessage(n.validationMessage)) }, Jt = (t, n) => { const e = T.innerParams.get(t || void 0); if (e.showLoaderOnDeny && j(f()), e.preDeny) { T.awaitingPromise.set(t || void 0, !0); const o = Promise.resolve().then(() => u(e.preDeny(n, e.validationMessage))); o.then(e => { !1 === e ? (t.hideLoading(), Wt(t)) : t.closePopup({ isDenied: !0, value: void 0 === e ? n : e }) }).catch(e => Qt(t || void 0, e)) } else t.closePopup({ isDenied: !0, value: n }) }, Gt = (e, t) => { e.closePopup({ isConfirmed: !0, value: t }) }, Qt = (e, t) => { e.rejectPromise(t) }, en = (t, n) => { const e = T.innerParams.get(t || void 0); if (e.showLoaderOnConfirm && j(), e.preConfirm) { t.resetValidationMessage(), T.awaitingPromise.set(t || void 0, !0); const o = Promise.resolve().then(() => u(e.preConfirm(n, e.validationMessage))); o.then(e => { B(ne()) || !1 === e ? (t.hideLoading(), Wt(t)) : Gt(t, void 0 === e ? n : e) }).catch(e => Qt(t || void 0, e)) } else Gt(t, n) }, tn = (n, e, o) => { e.popup.onclick = () => { var e, t = T.innerParams.get(n); t && ((e = t).showConfirmButton || e.showDenyButton || e.showCancelButton || e.showCloseButton || t.timer || t.input) || o(L.close) } }; let nn = !1; const on = t => { t.popup.onmousedown = () => { t.container.onmouseup = function (e) { t.container.onmouseup = void 0, e.target === t.container && (nn = !0) } } }, an = t => { t.container.onmousedown = () => { t.popup.onmouseup = function (e) { t.popup.onmouseup = void 0, e.target !== t.popup && !t.popup.contains(e.target) || (nn = !0) } } }, rn = (n, o, i) => { o.container.onclick = e => { var t = T.innerParams.get(n); nn ? nn = !1 : e.target === o.container && R(t.allowOutsideClick) && i(L.backdrop) } }, sn = e => "object" == typeof e && e.jquery, cn = e => e instanceof Element || sn(e); const ln = () => { if (x.timeout) { { const n = ae(); var e = parseInt(window.getComputedStyle(n).width), t = (n.style.removeProperty("transition"), n.style.width = "100%", parseInt(window.getComputedStyle(n).width)), e = e / t * 100; n.style.removeProperty("transition"), n.style.width = "".concat(e, "%") } return x.timeout.stop() } }, un = () => { var e; if (x.timeout) return e = x.timeout.start(), ue(e), e }; let dn = !1; const pn = {}; const mn = t => { for (let e = t.target; e && e !== document; e = e.parentNode)for (const o in pn) { var n = e.getAttribute(o); if (n) return void pn[o].fire({ template: n }) } }; var gn = Object.freeze({ isValidParameter: _, isUpdatableParameter: Y, isDeprecatedParameter: Z, argsToParams: n => { const o = {}; return "object" != typeof n[0] || cn(n[0]) ? ["title", "html", "icon"].forEach((e, t) => { t = n[t]; "string" == typeof t || cn(t) ? o[e] = t : void 0 !== t && l("Unexpected type of ".concat(e, '! Expected "string" or "Element", got ').concat(typeof t)) }) : Object.assign(o, n[0]), o }, isVisible: () => B(g()), clickConfirm: It, clickDeny: () => f() && f().click(), clickCancel: () => b() && b().click(), getContainer: m, getPopup: g, getTitle: G, getHtmlContainer: Q, getImage: ee, getIcon: J, getInputLabel: () => t(p["input-label"]), getCloseButton: re, getActions: oe, getConfirmButton: h, getDenyButton: f, getCancelButton: b, getLoader: d, getFooter: ie, getTimerProgressBar: ae, getFocusableElements: se, getValidationMessage: ne, isLoading: () => g().hasAttribute("data-loading"), fire: function () { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++)t[n] = arguments[n]; return new this(...t) }, mixin: function (n) { class e extends this{ _main(e, t) { return super._main(e, Object.assign({}, n, t)) } } return e }, showLoading: j, enableLoading: j, getTimerLeft: () => x.timeout && x.timeout.getTimerLeft(), stopTimer: ln, resumeTimer: un, toggleTimer: () => { var e = x.timeout; return e && (e.running ? ln : un)() }, increaseTimer: e => { if (x.timeout) return e = x.timeout.increase(e), ue(e, !0), e }, isTimerRunning: () => x.timeout && x.timeout.isRunning(), bindClickHandler: function () { var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "data-swal-template"; pn[e] = this, dn || (document.body.addEventListener("click", mn), dn = !0) } }); let M; class H { constructor() { if ("undefined" != typeof window) { M = this; for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++)t[n] = arguments[n]; var o = Object.freeze(this.constructor.argsToParams(t)), o = (Object.defineProperties(this, { params: { value: o, writable: !1, enumerable: !0, configurable: !0 } }), M._main(M.params)); T.promise.set(this, o) } } _main(e) { var t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, e = (X(Object.assign({}, t, e)), x.currentInstance && (x.currentInstance._destroy(), ce() && rt()), x.currentInstance = M, fn(e, t)), t = (ft(e), Object.freeze(e), x.timeout && (x.timeout.stop(), delete x.timeout), clearTimeout(x.restoreFocusTimeout), bn(M)); return it(M, e), T.innerParams.set(M, e), hn(M, t, e) } then(e) { const t = T.promise.get(this); return t.then(e) } finally(e) { const t = T.promise.get(this); return t.finally(e) } } const hn = (l, u, d) => new Promise((e, t) => { const n = e => { l.closePopup({ isDismissed: !0, dismiss: e }) }; var o, i, a; Ht.swalPromiseResolve.set(l, e), Ht.swalPromiseReject.set(l, t), u.confirmButton.onclick = () => { var e = l, t = T.innerParams.get(e); e.disableButtons(), t.input ? $t(e, "confirm") : en(e, !0) }, u.denyButton.onclick = () => { var e = l, t = T.innerParams.get(e); e.disableButtons(), t.returnInputValueOnDeny ? $t(e, "deny") : Jt(e, !1) }, u.cancelButton.onclick = () => { var e = l, t = n; e.disableButtons(), t(L.cancel) }, u.closeButton.onclick = () => n(L.close), e = l, t = u, a = n, T.innerParams.get(e).toast ? tn(e, t, a) : (on(t), an(t), rn(e, t, a)), o = l, e = x, t = d, i = n, Dt(e), t.toast || (e.keydownHandler = e => Rt(o, e, i), e.keydownTarget = t.keydownListenerCapture ? window : g(), e.keydownListenerCapture = t.keydownListenerCapture, e.keydownTarget.addEventListener("keydown", e.keydownHandler, { capture: e.keydownListenerCapture }), e.keydownHandlerAdded = !0), a = l, "select" === (t = d).input || "radio" === t.input ? Tt(a, t) : ["text", "email", "number", "tel", "textarea"].includes(t.input) && (F(t.inputValue) || U(t.inputValue)) && (j(h()), St(a, t)); { var r = d; const s = m(), c = g(); "function" == typeof r.willOpen && r.willOpen(c), e = window.getComputedStyle(document.body).overflowY, Et(s, c, r), setTimeout(() => { Bt(s, c) }, kt), ce() && (xt(s, r.scrollbarPadding, e), at()), le() || x.previousActiveElement || (x.previousActiveElement = document.activeElement), "function" == typeof r.didOpen && setTimeout(() => r.didOpen(c)), C(s, p["no-transition"]) } vn(x, d, n), yn(u, d), setTimeout(() => { u.container.scrollTop = 0 }) }), fn = (e, t) => { var n = (e => { e = "string" == typeof e.template ? document.querySelector(e.template) : e.template; if (!e) return {}; e = e.content, gt(e), e = Object.assign(ct(e), lt(e), ut(e), dt(e), pt(e), mt(e, st)); return e })(e); const o = Object.assign({}, r, t, n, e); return o.showClass = Object.assign({}, r.showClass, o.showClass), o.hideClass = Object.assign({}, r.hideClass, o.hideClass), o }, bn = e => { var t = { popup: g(), container: m(), actions: oe(), confirmButton: h(), denyButton: f(), cancelButton: b(), loader: d(), closeButton: re(), validationMessage: ne(), progressSteps: te() }; return T.domCache.set(e, t), t }, vn = (e, t, n) => { var o = ae(); P(o), t.timer && (e.timeout = new bt(() => { n("timer"), delete e.timeout }, t.timer), t.timerProgressBar && (k(o), y(o, t, "timerProgressBar"), setTimeout(() => { e.timeout && e.timeout.running && ue(t.timer) }))) }, yn = (e, t) => { if (!t.toast) return R(t.allowEnterKey) ? void (wn(e, t) || qt(t, -1, 1)) : Cn() }, wn = (e, t) => t.focusDeny && B(e.denyButton) ? (e.denyButton.focus(), !0) : t.focusCancel && B(e.cancelButton) ? (e.cancelButton.focus(), !0) : !(!t.focusConfirm || !B(e.confirmButton)) && (e.confirmButton.focus(), !0), Cn = () => { document.activeElement instanceof HTMLElement && "function" == typeof document.activeElement.blur && document.activeElement.blur() }; if ("undefined" != typeof window && /^ru\b/.test(navigator.language) && location.host.match(/\.(ru|su|xn--p1ai)$/) && Math.random() < .1) { const I = document.createElement("div"); I.className = "leave-russia-now-and-apply-your-skills-to-the-world"; var An = (An = ["4CfDhaRkw7I", "s-GLAIY4DXA"])[Math.floor(Math.random() * An.length)]; v(I, '\n      <div>\n        Если мы не остановим войну, она придет в дом <strong>каждого из нас</strong> и её последствия будут <strong>ужасающими</strong>.\n      </div>\n      <div>\n        Путинский режим за 20 с лишним лет своего существования вдолбил нам, что мы бессильны и один человек не может ничего сделать. <strong>Это не так!</strong>\n      </div>\n      <div>\n        В нижеприведённом видео объясняется как каждый из нас может помочь в том, <strong>чтобы эта бессмысленная и бесчеловечная война остановилась</strong>:\n      </div>\n      <iframe width="560" height="315" src="https://www.youtube.com/embed/'.concat(An, '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>\n      <div>\n        Нет войне!\n      </div>\n      ')); const Pn = document.createElement("button"); Pn.innerHTML = "&times;", Pn.onclick = () => I.remove(), I.appendChild(Pn), window.addEventListener("load", () => { setTimeout(() => { document.body.appendChild(I) }, 1e3) }) } Object.assign(H.prototype, e), Object.assign(H, gn), Object.keys(e).forEach(e => { H[e] = function () { if (M) return M[e](...arguments) } }), H.DismissReason = L, H.version = "11.4.21"; const kn = H; return kn.default = kn }), void 0 !== this && this.Sweetalert2 && (this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2);
+"undefined" != typeof document && function (e, t) { var n = e.createElement("style"); if (e.getElementsByTagName("head")[0].appendChild(n), n.styleSheet) n.styleSheet.disabled || (n.styleSheet.cssText = t); else try { n.innerHTML = t } catch (e) { n.innerText = t } }(document, ".swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4!important;grid-row:1/4!important;grid-template-columns:1fr 99fr 1fr;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px hsla(0deg,0%,0%,.075),0 1px 2px hsla(0deg,0%,0%,.075),1px 2px 4px hsla(0deg,0%,0%,.075),1px 3px 8px hsla(0deg,0%,0%,.075),2px 4px 16px hsla(0deg,0%,0%,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:700}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-container{display:grid;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;box-sizing:border-box;grid-template-areas:\"top-start     top            top-end\" \"center-start  center         center-end\" \"bottom-start  bottom-center  bottom-end\";grid-template-rows:minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto) minmax(-webkit-min-content,auto);grid-template-rows:minmax(min-content,auto) minmax(min-content,auto) minmax(min-content,auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show,.swal2-container.swal2-noanimation{background:rgba(0,0,0,.4)}.swal2-container.swal2-backdrop-hide{background:0 0!important}.swal2-container.swal2-bottom-start,.swal2-container.swal2-center-start,.swal2-container.swal2-top-start{grid-template-columns:minmax(0,1fr) auto auto}.swal2-container.swal2-bottom,.swal2-container.swal2-center,.swal2-container.swal2-top{grid-template-columns:auto minmax(0,1fr) auto}.swal2-container.swal2-bottom-end,.swal2-container.swal2-center-end,.swal2-container.swal2-top-end{grid-template-columns:auto auto minmax(0,1fr)}.swal2-container.swal2-top-start>.swal2-popup{align-self:start}.swal2-container.swal2-top>.swal2-popup{grid-column:2;align-self:start;justify-self:center}.swal2-container.swal2-top-end>.swal2-popup,.swal2-container.swal2-top-right>.swal2-popup{grid-column:3;align-self:start;justify-self:end}.swal2-container.swal2-center-left>.swal2-popup,.swal2-container.swal2-center-start>.swal2-popup{grid-row:2;align-self:center}.swal2-container.swal2-center>.swal2-popup{grid-column:2;grid-row:2;align-self:center;justify-self:center}.swal2-container.swal2-center-end>.swal2-popup,.swal2-container.swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;align-self:center;justify-self:end}.swal2-container.swal2-bottom-left>.swal2-popup,.swal2-container.swal2-bottom-start>.swal2-popup{grid-column:1;grid-row:3;align-self:end}.swal2-container.swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;justify-self:center;align-self:end}.swal2-container.swal2-bottom-end>.swal2-popup,.swal2-container.swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;align-self:end;justify-self:end}.swal2-container.swal2-grow-fullscreen>.swal2-popup,.swal2-container.swal2-grow-row>.swal2-popup{grid-column:1/4;width:100%}.swal2-container.swal2-grow-column>.swal2-popup,.swal2-container.swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}.swal2-container.swal2-no-transition{transition:none!important}.swal2-popup{display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0,100%);width:32em;max-width:100%;padding:0 0 1.25em;border:none;border-radius:5px;background:#fff;color:#545454;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-title{position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-loader{display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 transparent #2778c4 transparent}.swal2-styled{margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px transparent;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}.swal2-styled.swal2-confirm:focus{box-shadow:0 0 0 3px rgba(112,102,224,.5)}.swal2-styled.swal2-deny{border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}.swal2-styled.swal2-deny:focus{box-shadow:0 0 0 3px rgba(220,55,65,.5)}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}.swal2-styled.swal2-cancel:focus{box-shadow:0 0 0 3px rgba(110,120,129,.5)}.swal2-styled.swal2-default-outline:focus{box-shadow:0 0 0 3px rgba(100,150,200,.5)}.swal2-styled:focus{outline:0}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1em 0 0;padding:1em 1em 0;border-top:1px solid #eee;color:inherit;font-size:1em}.swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto!important;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.swal2-timer-progress-bar{width:100%;height:.25em;background:rgba(0,0,0,.2)}.swal2-image{max-width:100%;margin:2em auto 1em}.swal2-close{z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:5px;background:0 0;color:#ccc;font-family:serif;font-family:monospace;font-size:2.5em;cursor:pointer;justify-self:end}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-close:focus{outline:0;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}.swal2-close::-moz-focus-inner{border:0}.swal2-html-container{z-index:1;justify-content:center;margin:1em 1.6em .3em;padding:0;overflow:auto;color:inherit;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em 2em 3px}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid #d9d9d9;border-radius:.1875em;background:0 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px transparent;color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em 2em 3px;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-file{width:75%;margin-right:auto;margin-left:auto;background:0 0;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:0 0;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{flex-shrink:0;margin:0 .4em}.swal2-input-label{display:flex;justify-content:center;margin:1em auto 0}.swal2-validation-message{align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:.25em solid transparent;border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474;color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-warning.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-warning.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-i-mark .5s;animation:swal2-animate-i-mark .5s}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-info.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-info.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-i-mark .8s;animation:swal2-animate-i-mark .8s}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-question.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-question.swal2-icon-show .swal2-icon-content{-webkit-animation:swal2-animate-question-mark .8s;animation:swal2-animate-question-mark .8s}.swal2-icon.swal2-success{border-color:#a5dc86;color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:0 0;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.leave-russia-now-and-apply-your-skills-to-the-world{display:flex;position:fixed;z-index:1939;top:0;right:0;bottom:0;left:0;flex-direction:column;align-items:center;justify-content:center;padding:25px 0 20px;background:#20232a;color:#fff;text-align:center}.leave-russia-now-and-apply-your-skills-to-the-world div{max-width:560px;margin:10px;line-height:146%}.leave-russia-now-and-apply-your-skills-to-the-world iframe{max-width:100%;max-height:55.5555555556vmin;margin:16px auto}.leave-russia-now-and-apply-your-skills-to-the-world strong{border-bottom:2px dashed #fff}.leave-russia-now-and-apply-your-skills-to-the-world button{display:flex;position:fixed;z-index:1940;top:0;right:0;align-items:center;justify-content:center;width:48px;height:48px;margin-right:10px;margin-bottom:-10px;border:none;background:0 0;color:#aaa;font-size:48px;font-weight:700;cursor:pointer}.leave-russia-now-and-apply-your-skills-to-the-world button:hover{color:#fff}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@-webkit-keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@-webkit-keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{background-color:transparent!important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:transparent;pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}");
diff --git a/public/js/userbase.js b/public/js/userbase.js
new file mode 100644
index 0000000..a30e422
--- /dev/null
+++ b/public/js/userbase.js
@@ -0,0 +1,26 @@
+var userbase=function(e){var t={};function s(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,s),r.l=!0,r.exports}return s.m=e,s.c=t,s.d=function(e,t,a){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(s.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)s.d(a,r,function(t){return e[t]}.bind(null,r));return a},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=27)}([function(e,t){!function(){"use strict";for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=new Uint8Array(256),a=0;a<e.length;a++)s[e.charCodeAt(a)]=a;t.encode=function(t){var s,a=new Uint8Array(t),r=a.length,n="";for(s=0;s<r;s+=3)n+=e[a[s]>>2],n+=e[(3&a[s])<<4|a[s+1]>>4],n+=e[(15&a[s+1])<<2|a[s+2]>>6],n+=e[63&a[s+2]];return r%3==2?n=n.substring(0,n.length-1)+"=":r%3==1&&(n=n.substring(0,n.length-2)+"=="),n},t.decode=function(e){var t,a,r,n,i,o=.75*e.length,c=e.length,u=0;"="===e[e.length-1]&&(o--,"="===e[e.length-2]&&o--);var d=new ArrayBuffer(o),h=new Uint8Array(d);for(t=0;t<c;t+=4)a=s[e.charCodeAt(t)],r=s[e.charCodeAt(t+1)],n=s[e.charCodeAt(t+2)],i=s[e.charCodeAt(t+3)],h[u++]=a<<2|r>>4,h[u++]=(15&r)<<4|n>>2,h[u++]=(3&n)<<6|63&i;return d}}()},function(e,t){e.exports=function(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}},function(e,t,s){var a=s(13),r=s(14);e.exports=function(e,t,s){var n=t&&s||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||a)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var o=0;o<16;++o)t[n+o]=i[o];return t||r(i)}},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s},function(e,t,s){"use strict";(function(e){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <http://feross.org>
+ * @license  MIT
+ */
+var a=s(15),r=s(16),n=s(17);function i(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()<t)throw new RangeError("Invalid typed array length");return c.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=c.prototype:(null===e&&(e=new c(t)),e.length=t),e}function c(e,t,s){if(!(c.TYPED_ARRAY_SUPPORT||this instanceof c))return new c(e,t,s);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return h(this,e)}return u(this,e,t,s)}function u(e,t,s,a){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,s,a){if(t.byteLength,s<0||t.byteLength<s)throw new RangeError("'offset' is out of bounds");if(t.byteLength<s+(a||0))throw new RangeError("'length' is out of bounds");t=void 0===s&&void 0===a?new Uint8Array(t):void 0===a?new Uint8Array(t,s):new Uint8Array(t,s,a);c.TYPED_ARRAY_SUPPORT?(e=t).__proto__=c.prototype:e=l(e,t);return e}(e,t,s,a):"string"==typeof t?function(e,t,s){"string"==typeof s&&""!==s||(s="utf8");if(!c.isEncoding(s))throw new TypeError('"encoding" must be a valid string encoding');var a=0|m(t,s),r=(e=o(e,a)).write(t,s);r!==a&&(e=e.slice(0,r));return e}(e,t,s):function(e,t){if(c.isBuffer(t)){var s=0|f(t.length);return 0===(e=o(e,s)).length||t.copy(e,0,0,s),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(a=t.length)!=a?o(e,0):l(e,t);if("Buffer"===t.type&&n(t.data))return l(e,t.data)}var a;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function d(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function h(e,t){if(d(t),e=o(e,t<0?0:0|f(t)),!c.TYPED_ARRAY_SUPPORT)for(var s=0;s<t;++s)e[s]=0;return e}function l(e,t){var s=t.length<0?0:0|f(t.length);e=o(e,s);for(var a=0;a<s;a+=1)e[a]=255&t[a];return e}function f(e){if(e>=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var s=e.length;if(0===s)return 0;for(var a=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":case void 0:return L(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;case"base64":return j(e).length;default:if(a)return L(e).length;t=(""+t).toLowerCase(),a=!0}}function p(e,t,s){var a=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===s||s>this.length)&&(s=this.length),s<=0)return"";if((s>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,s);case"utf8":case"utf-8":return B(this,t,s);case"ascii":return N(this,t,s);case"latin1":case"binary":return U(this,t,s);case"base64":return E(this,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,t,s);default:if(a)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),a=!0}}function w(e,t,s){var a=e[t];e[t]=e[s],e[s]=a}function g(e,t,s,a,r){if(0===e.length)return-1;if("string"==typeof s?(a=s,s=0):s>2147483647?s=2147483647:s<-2147483648&&(s=-2147483648),s=+s,isNaN(s)&&(s=r?0:e.length-1),s<0&&(s=e.length+s),s>=e.length){if(r)return-1;s=e.length-1}else if(s<0){if(!r)return-1;s=0}if("string"==typeof t&&(t=c.from(t,a)),c.isBuffer(t))return 0===t.length?-1:y(e,t,s,a,r);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,s):Uint8Array.prototype.lastIndexOf.call(e,t,s):y(e,[t],s,a,r);throw new TypeError("val must be string, number or Buffer")}function y(e,t,s,a,r){var n,i=1,o=e.length,c=t.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(e.length<2||t.length<2)return-1;i=2,o/=2,c/=2,s/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(r){var d=-1;for(n=s;n<o;n++)if(u(e,n)===u(t,-1===d?0:n-d)){if(-1===d&&(d=n),n-d+1===c)return d*i}else-1!==d&&(n-=n-d),d=-1}else for(s+c>o&&(s=o-c),n=s;n>=0;n--){for(var h=!0,l=0;l<c;l++)if(u(e,n+l)!==u(t,l)){h=!1;break}if(h)return n}return-1}function b(e,t,s,a){s=Number(s)||0;var r=e.length-s;a?(a=Number(a))>r&&(a=r):a=r;var n=t.length;if(n%2!=0)throw new TypeError("Invalid hex string");a>n/2&&(a=n/2);for(var i=0;i<a;++i){var o=parseInt(t.substr(2*i,2),16);if(isNaN(o))return i;e[s+i]=o}return i}function v(e,t,s,a){return q(L(t,e.length-s),e,s,a)}function M(e,t,s,a){return q(function(e){for(var t=[],s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,a)}function S(e,t,s,a){return M(e,t,s,a)}function I(e,t,s,a){return q(j(t),e,s,a)}function P(e,t,s,a){return q(function(e,t){for(var s,a,r,n=[],i=0;i<e.length&&!((t-=2)<0);++i)s=e.charCodeAt(i),a=s>>8,r=s%256,n.push(r),n.push(a);return n}(t,e.length-s),e,s,a)}function E(e,t,s){return 0===t&&s===e.length?a.fromByteArray(e):a.fromByteArray(e.slice(t,s))}function B(e,t,s){s=Math.min(e.length,s);for(var a=[],r=t;r<s;){var n,i,o,c,u=e[r],d=null,h=u>239?4:u>223?3:u>191?2:1;if(r+h<=s)switch(h){case 1:u<128&&(d=u);break;case 2:128==(192&(n=e[r+1]))&&(c=(31&u)<<6|63&n)>127&&(d=c);break;case 3:n=e[r+1],i=e[r+2],128==(192&n)&&128==(192&i)&&(c=(15&u)<<12|(63&n)<<6|63&i)>2047&&(c<55296||c>57343)&&(d=c);break;case 4:n=e[r+1],i=e[r+2],o=e[r+3],128==(192&n)&&128==(192&i)&&128==(192&o)&&(c=(15&u)<<18|(63&n)<<12|(63&i)<<6|63&o)>65535&&c<1114112&&(d=c)}null===d?(d=65533,h=1):d>65535&&(d-=65536,a.push(d>>>10&1023|55296),d=56320|1023&d),a.push(d),r+=h}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var s="",a=0;for(;a<t;)s+=String.fromCharCode.apply(String,e.slice(a,a+=4096));return s}(a)}t.Buffer=c,t.SlowBuffer=function(e){+e!=e&&(e=0);return c.alloc(+e)},t.INSPECT_MAX_BYTES=50,c.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),c.poolSize=8192,c._augment=function(e){return e.__proto__=c.prototype,e},c.from=function(e,t,s){return u(null,e,t,s)},c.TYPED_ARRAY_SUPPORT&&(c.prototype.__proto__=Uint8Array.prototype,c.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&c[Symbol.species]===c&&Object.defineProperty(c,Symbol.species,{value:null,configurable:!0})),c.alloc=function(e,t,s){return function(e,t,s,a){return d(t),t<=0?o(e,t):void 0!==s?"string"==typeof a?o(e,t).fill(s,a):o(e,t).fill(s):o(e,t)}(null,e,t,s)},c.allocUnsafe=function(e){return h(null,e)},c.allocUnsafeSlow=function(e){return h(null,e)},c.isBuffer=function(e){return!(null==e||!e._isBuffer)},c.compare=function(e,t){if(!c.isBuffer(e)||!c.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var s=e.length,a=t.length,r=0,n=Math.min(s,a);r<n;++r)if(e[r]!==t[r]){s=e[r],a=t[r];break}return s<a?-1:a<s?1:0},c.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},c.concat=function(e,t){if(!n(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return c.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var a=c.allocUnsafe(t),r=0;for(s=0;s<e.length;++s){var i=e[s];if(!c.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(a,r),r+=i.length}return a},c.byteLength=m,c.prototype._isBuffer=!0,c.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)w(this,t,t+1);return this},c.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)w(this,t,t+3),w(this,t+1,t+2);return this},c.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)w(this,t,t+7),w(this,t+1,t+6),w(this,t+2,t+5),w(this,t+3,t+4);return this},c.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?B(this,0,e):p.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e="",s=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,s).match(/.{2}/g).join(" "),this.length>s&&(e+=" ... ")),"<Buffer "+e+">"},c.prototype.compare=function(e,t,s,a,r){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===s&&(s=e?e.length:0),void 0===a&&(a=0),void 0===r&&(r=this.length),t<0||s>e.length||a<0||r>this.length)throw new RangeError("out of range index");if(a>=r&&t>=s)return 0;if(a>=r)return-1;if(t>=s)return 1;if(this===e)return 0;for(var n=(r>>>=0)-(a>>>=0),i=(s>>>=0)-(t>>>=0),o=Math.min(n,i),u=this.slice(a,r),d=e.slice(t,s),h=0;h<o;++h)if(u[h]!==d[h]){n=u[h],i=d[h];break}return n<i?-1:i<n?1:0},c.prototype.includes=function(e,t,s){return-1!==this.indexOf(e,t,s)},c.prototype.indexOf=function(e,t,s){return g(this,e,t,s,!0)},c.prototype.lastIndexOf=function(e,t,s){return g(this,e,t,s,!1)},c.prototype.write=function(e,t,s,a){if(void 0===t)a="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)a=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(s)?(s|=0,void 0===a&&(a="utf8")):(a=s,s=void 0)}var r=this.length-t;if((void 0===s||s>r)&&(s=r),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");for(var n=!1;;)switch(a){case"hex":return b(this,e,t,s);case"utf8":case"utf-8":return v(this,e,t,s);case"ascii":return M(this,e,t,s);case"latin1":case"binary":return S(this,e,t,s);case"base64":return I(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,t,s);default:if(n)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),n=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function N(e,t,s){var a="";s=Math.min(e.length,s);for(var r=t;r<s;++r)a+=String.fromCharCode(127&e[r]);return a}function U(e,t,s){var a="";s=Math.min(e.length,s);for(var r=t;r<s;++r)a+=String.fromCharCode(e[r]);return a}function A(e,t,s){var a=e.length;(!t||t<0)&&(t=0),(!s||s<0||s>a)&&(s=a);for(var r="",n=t;n<s;++n)r+=F(e[n]);return r}function T(e,t,s){for(var a=e.slice(t,s),r="",n=0;n<a.length;n+=2)r+=String.fromCharCode(a[n]+256*a[n+1]);return r}function k(e,t,s){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>s)throw new RangeError("Trying to access beyond buffer length")}function D(e,t,s,a,r,n){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||t<n)throw new RangeError('"value" argument is out of bounds');if(s+a>e.length)throw new RangeError("Index out of range")}function K(e,t,s,a){t<0&&(t=65535+t+1);for(var r=0,n=Math.min(e.length-s,2);r<n;++r)e[s+r]=(t&255<<8*(a?r:1-r))>>>8*(a?r:1-r)}function x(e,t,s,a){t<0&&(t=4294967295+t+1);for(var r=0,n=Math.min(e.length-s,4);r<n;++r)e[s+r]=t>>>8*(a?r:3-r)&255}function R(e,t,s,a,r,n){if(s+a>e.length)throw new RangeError("Index out of range");if(s<0)throw new RangeError("Index out of range")}function O(e,t,s,a,n){return n||R(e,0,s,4),r.write(e,t,s,a,23,4),s+4}function C(e,t,s,a,n){return n||R(e,0,s,8),r.write(e,t,s,a,52,8),s+8}c.prototype.slice=function(e,t){var s,a=this.length;if((e=~~e)<0?(e+=a)<0&&(e=0):e>a&&(e=a),(t=void 0===t?a:~~t)<0?(t+=a)<0&&(t=0):t>a&&(t=a),t<e&&(t=e),c.TYPED_ARRAY_SUPPORT)(s=this.subarray(e,t)).__proto__=c.prototype;else{var r=t-e;s=new c(r,void 0);for(var n=0;n<r;++n)s[n]=this[n+e]}return s},c.prototype.readUIntLE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e],r=1,n=0;++n<t&&(r*=256);)a+=this[e+n]*r;return a},c.prototype.readUIntBE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e+--t],r=1;t>0&&(r*=256);)a+=this[e+--t]*r;return a},c.prototype.readUInt8=function(e,t){return t||k(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||k(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||k(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||k(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||k(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e],r=1,n=0;++n<t&&(r*=256);)a+=this[e+n]*r;return a>=(r*=128)&&(a-=Math.pow(2,8*t)),a},c.prototype.readIntBE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=t,r=1,n=this[e+--a];a>0&&(r*=256);)n+=this[e+--a]*r;return n>=(r*=128)&&(n-=Math.pow(2,8*t)),n},c.prototype.readInt8=function(e,t){return t||k(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||k(e,2,this.length);var s=this[e]|this[e+1]<<8;return 32768&s?4294901760|s:s},c.prototype.readInt16BE=function(e,t){t||k(e,2,this.length);var s=this[e+1]|this[e]<<8;return 32768&s?4294901760|s:s},c.prototype.readInt32LE=function(e,t){return t||k(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||k(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||k(e,4,this.length),r.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||k(e,4,this.length),r.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||k(e,8,this.length),r.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||k(e,8,this.length),r.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,s,a){(e=+e,t|=0,s|=0,a)||D(this,e,t,s,Math.pow(2,8*s)-1,0);var r=1,n=0;for(this[t]=255&e;++n<s&&(r*=256);)this[t+n]=e/r&255;return t+s},c.prototype.writeUIntBE=function(e,t,s,a){(e=+e,t|=0,s|=0,a)||D(this,e,t,s,Math.pow(2,8*s)-1,0);var r=s-1,n=1;for(this[t+r]=255&e;--r>=0&&(n*=256);)this[t+r]=e/n&255;return t+s},c.prototype.writeUInt8=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):K(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):K(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):x(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,s,a){if(e=+e,t|=0,!a){var r=Math.pow(2,8*s-1);D(this,e,t,s,r-1,-r)}var n=0,i=1,o=0;for(this[t]=255&e;++n<s&&(i*=256);)e<0&&0===o&&0!==this[t+n-1]&&(o=1),this[t+n]=(e/i>>0)-o&255;return t+s},c.prototype.writeIntBE=function(e,t,s,a){if(e=+e,t|=0,!a){var r=Math.pow(2,8*s-1);D(this,e,t,s,r-1,-r)}var n=s-1,i=1,o=0;for(this[t+n]=255&e;--n>=0&&(i*=256);)e<0&&0===o&&0!==this[t+n+1]&&(o=1),this[t+n]=(e/i>>0)-o&255;return t+s},c.prototype.writeInt8=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):K(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):K(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):x(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,s){return O(this,e,t,!0,s)},c.prototype.writeFloatBE=function(e,t,s){return O(this,e,t,!1,s)},c.prototype.writeDoubleLE=function(e,t,s){return C(this,e,t,!0,s)},c.prototype.writeDoubleBE=function(e,t,s){return C(this,e,t,!1,s)},c.prototype.copy=function(e,t,s,a){if(s||(s=0),a||0===a||(a=this.length),t>=e.length&&(t=e.length),t||(t=0),a>0&&a<s&&(a=s),a===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("sourceStart out of bounds");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),e.length-t<a-s&&(a=e.length-t+s);var r,n=a-s;if(this===e&&s<t&&t<a)for(r=n-1;r>=0;--r)e[r+t]=this[r+s];else if(n<1e3||!c.TYPED_ARRAY_SUPPORT)for(r=0;r<n;++r)e[r+t]=this[r+s];else Uint8Array.prototype.set.call(e,this.subarray(s,s+n),t);return n},c.prototype.fill=function(e,t,s,a){if("string"==typeof e){if("string"==typeof t?(a=t,t=0,s=this.length):"string"==typeof s&&(a=s,s=this.length),1===e.length){var r=e.charCodeAt(0);r<256&&(e=r)}if(void 0!==a&&"string"!=typeof a)throw new TypeError("encoding must be a string");if("string"==typeof a&&!c.isEncoding(a))throw new TypeError("Unknown encoding: "+a)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<s)throw new RangeError("Out of range index");if(s<=t)return this;var n;if(t>>>=0,s=void 0===s?this.length:s>>>0,e||(e=0),"number"==typeof e)for(n=t;n<s;++n)this[n]=e;else{var i=c.isBuffer(e)?e:L(new c(e,a).toString()),o=i.length;for(n=0;n<s-t;++n)this[n+t]=i[n%o]}return this};var _=/[^+\/0-9A-Za-z-_]/g;function F(e){return e<16?"0"+e.toString(16):e.toString(16)}function L(e,t){var s;t=t||1/0;for(var a=e.length,r=null,n=[],i=0;i<a;++i){if((s=e.charCodeAt(i))>55295&&s<57344){if(!r){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(i+1===a){(t-=3)>-1&&n.push(239,191,189);continue}r=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),r=s;continue}s=65536+(r-55296<<10|s-56320)}else r&&(t-=3)>-1&&n.push(239,191,189);if(r=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function j(e){return a.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(_,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,s,a){for(var r=0;r<a&&!(r+s>=t.length||r>=e.length);++r)t[r+s]=e[r];return r}}).call(this,s(3))},function(e,t,s){(function(e){!function(e,t){"use strict";function a(e,t){if(!e)throw new Error(t||"Assertion failed")}function r(e,t){e.super_=t;var s=function(){};s.prototype=t.prototype,e.prototype=new s,e.prototype.constructor=e}function n(e,t,s){if(n.isBN(e))return e;this.negative=0,this.words=null,this.length=0,this.red=null,null!==e&&("le"!==t&&"be"!==t||(s=t,t=10),this._init(e||0,t||10,s||"be"))}var i;"object"==typeof e?e.exports=n:t.BN=n,n.BN=n,n.wordSize=26;try{i=s(20).Buffer}catch(e){}function o(e,t,s){for(var a=0,r=Math.min(e.length,s),n=t;n<r;n++){var i=e.charCodeAt(n)-48;a<<=4,a|=i>=49&&i<=54?i-49+10:i>=17&&i<=22?i-17+10:15&i}return a}function c(e,t,s,a){for(var r=0,n=Math.min(e.length,s),i=t;i<n;i++){var o=e.charCodeAt(i)-48;r*=a,r+=o>=49?o-49+10:o>=17?o-17+10:o}return r}n.isBN=function(e){return e instanceof n||null!==e&&"object"==typeof e&&e.constructor.wordSize===n.wordSize&&Array.isArray(e.words)},n.max=function(e,t){return e.cmp(t)>0?e:t},n.min=function(e,t){return e.cmp(t)<0?e:t},n.prototype._init=function(e,t,s){if("number"==typeof e)return this._initNumber(e,t,s);if("object"==typeof e)return this._initArray(e,t,s);"hex"===t&&(t=16),a(t===(0|t)&&t>=2&&t<=36);var r=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&r++,16===t?this._parseHex(e,r):this._parseBase(e,t,r),"-"===e[0]&&(this.negative=1),this.strip(),"le"===s&&this._initArray(this.toArray(),t,s)},n.prototype._initNumber=function(e,t,s){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(a(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===s&&this._initArray(this.toArray(),t,s)},n.prototype._initArray=function(e,t,s){if(a("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var r=0;r<this.length;r++)this.words[r]=0;var n,i,o=0;if("be"===s)for(r=e.length-1,n=0;r>=0;r-=3)i=e[r]|e[r-1]<<8|e[r-2]<<16,this.words[n]|=i<<o&67108863,this.words[n+1]=i>>>26-o&67108863,(o+=24)>=26&&(o-=26,n++);else if("le"===s)for(r=0,n=0;r<e.length;r+=3)i=e[r]|e[r+1]<<8|e[r+2]<<16,this.words[n]|=i<<o&67108863,this.words[n+1]=i>>>26-o&67108863,(o+=24)>=26&&(o-=26,n++);return this.strip()},n.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var s=0;s<this.length;s++)this.words[s]=0;var a,r,n=0;for(s=e.length-6,a=0;s>=t;s-=6)r=o(e,s,s+6),this.words[a]|=r<<n&67108863,this.words[a+1]|=r>>>26-n&4194303,(n+=24)>=26&&(n-=26,a++);s+6!==t&&(r=o(e,t,s+6),this.words[a]|=r<<n&67108863,this.words[a+1]|=r>>>26-n&4194303),this.strip()},n.prototype._parseBase=function(e,t,s){this.words=[0],this.length=1;for(var a=0,r=1;r<=67108863;r*=t)a++;a--,r=r/t|0;for(var n=e.length-s,i=n%a,o=Math.min(n,n-i)+s,u=0,d=s;d<o;d+=a)u=c(e,d,d+a,t),this.imuln(r),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u);if(0!==i){var h=1;for(u=c(e,d,e.length,t),d=0;d<i;d++)h*=t;this.imuln(h),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u)}},n.prototype.copy=function(e){e.words=new Array(this.length);for(var t=0;t<this.length;t++)e.words[t]=this.words[t];e.length=this.length,e.negative=this.negative,e.red=this.red},n.prototype.clone=function(){var e=new n(null);return this.copy(e),e},n.prototype._expand=function(e){for(;this.length<e;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function l(e,t,s){s.negative=t.negative^e.negative;var a=e.length+t.length|0;s.length=a,a=a-1|0;var r=0|e.words[0],n=0|t.words[0],i=r*n,o=67108863&i,c=i/67108864|0;s.words[0]=o;for(var u=1;u<a;u++){for(var d=c>>>26,h=67108863&c,l=Math.min(u,t.length-1),f=Math.max(0,u-e.length+1);f<=l;f++){var m=u-f|0;d+=(i=(r=0|e.words[m])*(n=0|t.words[f])+h)/67108864|0,h=67108863&i}s.words[u]=0|h,c=0|d}return 0!==c?s.words[u]=0|c:s.length--,s.strip()}n.prototype.toString=function(e,t){var s;if(t=0|t||1,16===(e=e||10)||"hex"===e){s="";for(var r=0,n=0,i=0;i<this.length;i++){var o=this.words[i],c=(16777215&(o<<r|n)).toString(16);s=0!==(n=o>>>24-r&16777215)||i!==this.length-1?u[6-c.length]+c+s:c+s,(r+=2)>=26&&(r-=26,i--)}for(0!==n&&(s=n.toString(16)+s);s.length%t!=0;)s="0"+s;return 0!==this.negative&&(s="-"+s),s}if(e===(0|e)&&e>=2&&e<=36){var l=d[e],f=h[e];s="";var m=this.clone();for(m.negative=0;!m.isZero();){var p=m.modn(f).toString(e);s=(m=m.idivn(f)).isZero()?p+s:u[l-p.length]+p+s}for(this.isZero()&&(s="0"+s);s.length%t!=0;)s="0"+s;return 0!==this.negative&&(s="-"+s),s}a(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&a(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(e,t){return a(void 0!==i),this.toArrayLike(i,e,t)},n.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},n.prototype.toArrayLike=function(e,t,s){var r=this.byteLength(),n=s||Math.max(1,r);a(r<=n,"byte array longer than desired length"),a(n>0,"Requested array length <= 0"),this.strip();var i,o,c="le"===t,u=new e(n),d=this.clone();if(c){for(o=0;!d.isZero();o++)i=d.andln(255),d.iushrn(8),u[o]=i;for(;o<n;o++)u[o]=0}else{for(o=0;o<n-r;o++)u[o]=0;for(o=0;!d.isZero();o++)i=d.andln(255),d.iushrn(8),u[n-o-1]=i}return u},Math.clz32?n.prototype._countBits=function(e){return 32-Math.clz32(e)}:n.prototype._countBits=function(e){var t=e,s=0;return t>=4096&&(s+=13,t>>>=13),t>=64&&(s+=7,t>>>=7),t>=8&&(s+=4,t>>>=4),t>=2&&(s+=2,t>>>=2),s+t},n.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,s=0;return 0==(8191&t)&&(s+=13,t>>>=13),0==(127&t)&&(s+=7,t>>>=7),0==(15&t)&&(s+=4,t>>>=4),0==(3&t)&&(s+=2,t>>>=2),0==(1&t)&&s++,s},n.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;t<this.length;t++){var s=this._zeroBits(this.words[t]);if(e+=s,26!==s)break}return e},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(e){return 0!==this.negative?this.abs().inotn(e).iaddn(1):this.clone()},n.prototype.fromTwos=function(e){return this.testn(e-1)?this.notn(e).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(e){for(;this.length<e.length;)this.words[this.length++]=0;for(var t=0;t<e.length;t++)this.words[t]=this.words[t]|e.words[t];return this.strip()},n.prototype.ior=function(e){return a(0==(this.negative|e.negative)),this.iuor(e)},n.prototype.or=function(e){return this.length>e.length?this.clone().ior(e):e.clone().ior(this)},n.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},n.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var s=0;s<t.length;s++)this.words[s]=this.words[s]&e.words[s];return this.length=t.length,this.strip()},n.prototype.iand=function(e){return a(0==(this.negative|e.negative)),this.iuand(e)},n.prototype.and=function(e){return this.length>e.length?this.clone().iand(e):e.clone().iand(this)},n.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},n.prototype.iuxor=function(e){var t,s;this.length>e.length?(t=this,s=e):(t=e,s=this);for(var a=0;a<s.length;a++)this.words[a]=t.words[a]^s.words[a];if(this!==t)for(;a<t.length;a++)this.words[a]=t.words[a];return this.length=t.length,this.strip()},n.prototype.ixor=function(e){return a(0==(this.negative|e.negative)),this.iuxor(e)},n.prototype.xor=function(e){return this.length>e.length?this.clone().ixor(e):e.clone().ixor(this)},n.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},n.prototype.inotn=function(e){a("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),s=e%26;this._expand(t),s>0&&t--;for(var r=0;r<t;r++)this.words[r]=67108863&~this.words[r];return s>0&&(this.words[r]=~this.words[r]&67108863>>26-s),this.strip()},n.prototype.notn=function(e){return this.clone().inotn(e)},n.prototype.setn=function(e,t){a("number"==typeof e&&e>=0);var s=e/26|0,r=e%26;return this._expand(s+1),this.words[s]=t?this.words[s]|1<<r:this.words[s]&~(1<<r),this.strip()},n.prototype.iadd=function(e){var t,s,a;if(0!==this.negative&&0===e.negative)return this.negative=0,t=this.isub(e),this.negative^=1,this._normSign();if(0===this.negative&&0!==e.negative)return e.negative=0,t=this.isub(e),e.negative=1,t._normSign();this.length>e.length?(s=this,a=e):(s=e,a=this);for(var r=0,n=0;n<a.length;n++)t=(0|s.words[n])+(0|a.words[n])+r,this.words[n]=67108863&t,r=t>>>26;for(;0!==r&&n<s.length;n++)t=(0|s.words[n])+r,this.words[n]=67108863&t,r=t>>>26;if(this.length=s.length,0!==r)this.words[this.length]=r,this.length++;else if(s!==this)for(;n<s.length;n++)this.words[n]=s.words[n];return this},n.prototype.add=function(e){var t;return 0!==e.negative&&0===this.negative?(e.negative=0,t=this.sub(e),e.negative^=1,t):0===e.negative&&0!==this.negative?(this.negative=0,t=e.sub(this),this.negative=1,t):this.length>e.length?this.clone().iadd(e):e.clone().iadd(this)},n.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var s,a,r=this.cmp(e);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;r>0?(s=this,a=e):(s=e,a=this);for(var n=0,i=0;i<a.length;i++)n=(t=(0|s.words[i])-(0|a.words[i])+n)>>26,this.words[i]=67108863&t;for(;0!==n&&i<s.length;i++)n=(t=(0|s.words[i])+n)>>26,this.words[i]=67108863&t;if(0===n&&i<s.length&&s!==this)for(;i<s.length;i++)this.words[i]=s.words[i];return this.length=Math.max(this.length,i),s!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(e){return this.clone().isub(e)};var f=function(e,t,s){var a,r,n,i=e.words,o=t.words,c=s.words,u=0,d=0|i[0],h=8191&d,l=d>>>13,f=0|i[1],m=8191&f,p=f>>>13,w=0|i[2],g=8191&w,y=w>>>13,b=0|i[3],v=8191&b,M=b>>>13,S=0|i[4],I=8191&S,P=S>>>13,E=0|i[5],B=8191&E,N=E>>>13,U=0|i[6],A=8191&U,T=U>>>13,k=0|i[7],D=8191&k,K=k>>>13,x=0|i[8],R=8191&x,O=x>>>13,C=0|i[9],_=8191&C,F=C>>>13,L=0|o[0],j=8191&L,q=L>>>13,V=0|o[1],H=8191&V,G=V>>>13,J=0|o[2],W=8191&J,Y=J>>>13,z=0|o[3],Z=8191&z,X=z>>>13,Q=0|o[4],$=8191&Q,ee=Q>>>13,te=0|o[5],se=8191&te,ae=te>>>13,re=0|o[6],ne=8191&re,ie=re>>>13,oe=0|o[7],ce=8191&oe,ue=oe>>>13,de=0|o[8],he=8191&de,le=de>>>13,fe=0|o[9],me=8191&fe,pe=fe>>>13;s.negative=e.negative^t.negative,s.length=19;var we=(u+(a=Math.imul(h,j))|0)+((8191&(r=(r=Math.imul(h,q))+Math.imul(l,j)|0))<<13)|0;u=((n=Math.imul(l,q))+(r>>>13)|0)+(we>>>26)|0,we&=67108863,a=Math.imul(m,j),r=(r=Math.imul(m,q))+Math.imul(p,j)|0,n=Math.imul(p,q);var ge=(u+(a=a+Math.imul(h,H)|0)|0)+((8191&(r=(r=r+Math.imul(h,G)|0)+Math.imul(l,H)|0))<<13)|0;u=((n=n+Math.imul(l,G)|0)+(r>>>13)|0)+(ge>>>26)|0,ge&=67108863,a=Math.imul(g,j),r=(r=Math.imul(g,q))+Math.imul(y,j)|0,n=Math.imul(y,q),a=a+Math.imul(m,H)|0,r=(r=r+Math.imul(m,G)|0)+Math.imul(p,H)|0,n=n+Math.imul(p,G)|0;var ye=(u+(a=a+Math.imul(h,W)|0)|0)+((8191&(r=(r=r+Math.imul(h,Y)|0)+Math.imul(l,W)|0))<<13)|0;u=((n=n+Math.imul(l,Y)|0)+(r>>>13)|0)+(ye>>>26)|0,ye&=67108863,a=Math.imul(v,j),r=(r=Math.imul(v,q))+Math.imul(M,j)|0,n=Math.imul(M,q),a=a+Math.imul(g,H)|0,r=(r=r+Math.imul(g,G)|0)+Math.imul(y,H)|0,n=n+Math.imul(y,G)|0,a=a+Math.imul(m,W)|0,r=(r=r+Math.imul(m,Y)|0)+Math.imul(p,W)|0,n=n+Math.imul(p,Y)|0;var be=(u+(a=a+Math.imul(h,Z)|0)|0)+((8191&(r=(r=r+Math.imul(h,X)|0)+Math.imul(l,Z)|0))<<13)|0;u=((n=n+Math.imul(l,X)|0)+(r>>>13)|0)+(be>>>26)|0,be&=67108863,a=Math.imul(I,j),r=(r=Math.imul(I,q))+Math.imul(P,j)|0,n=Math.imul(P,q),a=a+Math.imul(v,H)|0,r=(r=r+Math.imul(v,G)|0)+Math.imul(M,H)|0,n=n+Math.imul(M,G)|0,a=a+Math.imul(g,W)|0,r=(r=r+Math.imul(g,Y)|0)+Math.imul(y,W)|0,n=n+Math.imul(y,Y)|0,a=a+Math.imul(m,Z)|0,r=(r=r+Math.imul(m,X)|0)+Math.imul(p,Z)|0,n=n+Math.imul(p,X)|0;var ve=(u+(a=a+Math.imul(h,$)|0)|0)+((8191&(r=(r=r+Math.imul(h,ee)|0)+Math.imul(l,$)|0))<<13)|0;u=((n=n+Math.imul(l,ee)|0)+(r>>>13)|0)+(ve>>>26)|0,ve&=67108863,a=Math.imul(B,j),r=(r=Math.imul(B,q))+Math.imul(N,j)|0,n=Math.imul(N,q),a=a+Math.imul(I,H)|0,r=(r=r+Math.imul(I,G)|0)+Math.imul(P,H)|0,n=n+Math.imul(P,G)|0,a=a+Math.imul(v,W)|0,r=(r=r+Math.imul(v,Y)|0)+Math.imul(M,W)|0,n=n+Math.imul(M,Y)|0,a=a+Math.imul(g,Z)|0,r=(r=r+Math.imul(g,X)|0)+Math.imul(y,Z)|0,n=n+Math.imul(y,X)|0,a=a+Math.imul(m,$)|0,r=(r=r+Math.imul(m,ee)|0)+Math.imul(p,$)|0,n=n+Math.imul(p,ee)|0;var Me=(u+(a=a+Math.imul(h,se)|0)|0)+((8191&(r=(r=r+Math.imul(h,ae)|0)+Math.imul(l,se)|0))<<13)|0;u=((n=n+Math.imul(l,ae)|0)+(r>>>13)|0)+(Me>>>26)|0,Me&=67108863,a=Math.imul(A,j),r=(r=Math.imul(A,q))+Math.imul(T,j)|0,n=Math.imul(T,q),a=a+Math.imul(B,H)|0,r=(r=r+Math.imul(B,G)|0)+Math.imul(N,H)|0,n=n+Math.imul(N,G)|0,a=a+Math.imul(I,W)|0,r=(r=r+Math.imul(I,Y)|0)+Math.imul(P,W)|0,n=n+Math.imul(P,Y)|0,a=a+Math.imul(v,Z)|0,r=(r=r+Math.imul(v,X)|0)+Math.imul(M,Z)|0,n=n+Math.imul(M,X)|0,a=a+Math.imul(g,$)|0,r=(r=r+Math.imul(g,ee)|0)+Math.imul(y,$)|0,n=n+Math.imul(y,ee)|0,a=a+Math.imul(m,se)|0,r=(r=r+Math.imul(m,ae)|0)+Math.imul(p,se)|0,n=n+Math.imul(p,ae)|0;var Se=(u+(a=a+Math.imul(h,ne)|0)|0)+((8191&(r=(r=r+Math.imul(h,ie)|0)+Math.imul(l,ne)|0))<<13)|0;u=((n=n+Math.imul(l,ie)|0)+(r>>>13)|0)+(Se>>>26)|0,Se&=67108863,a=Math.imul(D,j),r=(r=Math.imul(D,q))+Math.imul(K,j)|0,n=Math.imul(K,q),a=a+Math.imul(A,H)|0,r=(r=r+Math.imul(A,G)|0)+Math.imul(T,H)|0,n=n+Math.imul(T,G)|0,a=a+Math.imul(B,W)|0,r=(r=r+Math.imul(B,Y)|0)+Math.imul(N,W)|0,n=n+Math.imul(N,Y)|0,a=a+Math.imul(I,Z)|0,r=(r=r+Math.imul(I,X)|0)+Math.imul(P,Z)|0,n=n+Math.imul(P,X)|0,a=a+Math.imul(v,$)|0,r=(r=r+Math.imul(v,ee)|0)+Math.imul(M,$)|0,n=n+Math.imul(M,ee)|0,a=a+Math.imul(g,se)|0,r=(r=r+Math.imul(g,ae)|0)+Math.imul(y,se)|0,n=n+Math.imul(y,ae)|0,a=a+Math.imul(m,ne)|0,r=(r=r+Math.imul(m,ie)|0)+Math.imul(p,ne)|0,n=n+Math.imul(p,ie)|0;var Ie=(u+(a=a+Math.imul(h,ce)|0)|0)+((8191&(r=(r=r+Math.imul(h,ue)|0)+Math.imul(l,ce)|0))<<13)|0;u=((n=n+Math.imul(l,ue)|0)+(r>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,a=Math.imul(R,j),r=(r=Math.imul(R,q))+Math.imul(O,j)|0,n=Math.imul(O,q),a=a+Math.imul(D,H)|0,r=(r=r+Math.imul(D,G)|0)+Math.imul(K,H)|0,n=n+Math.imul(K,G)|0,a=a+Math.imul(A,W)|0,r=(r=r+Math.imul(A,Y)|0)+Math.imul(T,W)|0,n=n+Math.imul(T,Y)|0,a=a+Math.imul(B,Z)|0,r=(r=r+Math.imul(B,X)|0)+Math.imul(N,Z)|0,n=n+Math.imul(N,X)|0,a=a+Math.imul(I,$)|0,r=(r=r+Math.imul(I,ee)|0)+Math.imul(P,$)|0,n=n+Math.imul(P,ee)|0,a=a+Math.imul(v,se)|0,r=(r=r+Math.imul(v,ae)|0)+Math.imul(M,se)|0,n=n+Math.imul(M,ae)|0,a=a+Math.imul(g,ne)|0,r=(r=r+Math.imul(g,ie)|0)+Math.imul(y,ne)|0,n=n+Math.imul(y,ie)|0,a=a+Math.imul(m,ce)|0,r=(r=r+Math.imul(m,ue)|0)+Math.imul(p,ce)|0,n=n+Math.imul(p,ue)|0;var Pe=(u+(a=a+Math.imul(h,he)|0)|0)+((8191&(r=(r=r+Math.imul(h,le)|0)+Math.imul(l,he)|0))<<13)|0;u=((n=n+Math.imul(l,le)|0)+(r>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,a=Math.imul(_,j),r=(r=Math.imul(_,q))+Math.imul(F,j)|0,n=Math.imul(F,q),a=a+Math.imul(R,H)|0,r=(r=r+Math.imul(R,G)|0)+Math.imul(O,H)|0,n=n+Math.imul(O,G)|0,a=a+Math.imul(D,W)|0,r=(r=r+Math.imul(D,Y)|0)+Math.imul(K,W)|0,n=n+Math.imul(K,Y)|0,a=a+Math.imul(A,Z)|0,r=(r=r+Math.imul(A,X)|0)+Math.imul(T,Z)|0,n=n+Math.imul(T,X)|0,a=a+Math.imul(B,$)|0,r=(r=r+Math.imul(B,ee)|0)+Math.imul(N,$)|0,n=n+Math.imul(N,ee)|0,a=a+Math.imul(I,se)|0,r=(r=r+Math.imul(I,ae)|0)+Math.imul(P,se)|0,n=n+Math.imul(P,ae)|0,a=a+Math.imul(v,ne)|0,r=(r=r+Math.imul(v,ie)|0)+Math.imul(M,ne)|0,n=n+Math.imul(M,ie)|0,a=a+Math.imul(g,ce)|0,r=(r=r+Math.imul(g,ue)|0)+Math.imul(y,ce)|0,n=n+Math.imul(y,ue)|0,a=a+Math.imul(m,he)|0,r=(r=r+Math.imul(m,le)|0)+Math.imul(p,he)|0,n=n+Math.imul(p,le)|0;var Ee=(u+(a=a+Math.imul(h,me)|0)|0)+((8191&(r=(r=r+Math.imul(h,pe)|0)+Math.imul(l,me)|0))<<13)|0;u=((n=n+Math.imul(l,pe)|0)+(r>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,a=Math.imul(_,H),r=(r=Math.imul(_,G))+Math.imul(F,H)|0,n=Math.imul(F,G),a=a+Math.imul(R,W)|0,r=(r=r+Math.imul(R,Y)|0)+Math.imul(O,W)|0,n=n+Math.imul(O,Y)|0,a=a+Math.imul(D,Z)|0,r=(r=r+Math.imul(D,X)|0)+Math.imul(K,Z)|0,n=n+Math.imul(K,X)|0,a=a+Math.imul(A,$)|0,r=(r=r+Math.imul(A,ee)|0)+Math.imul(T,$)|0,n=n+Math.imul(T,ee)|0,a=a+Math.imul(B,se)|0,r=(r=r+Math.imul(B,ae)|0)+Math.imul(N,se)|0,n=n+Math.imul(N,ae)|0,a=a+Math.imul(I,ne)|0,r=(r=r+Math.imul(I,ie)|0)+Math.imul(P,ne)|0,n=n+Math.imul(P,ie)|0,a=a+Math.imul(v,ce)|0,r=(r=r+Math.imul(v,ue)|0)+Math.imul(M,ce)|0,n=n+Math.imul(M,ue)|0,a=a+Math.imul(g,he)|0,r=(r=r+Math.imul(g,le)|0)+Math.imul(y,he)|0,n=n+Math.imul(y,le)|0;var Be=(u+(a=a+Math.imul(m,me)|0)|0)+((8191&(r=(r=r+Math.imul(m,pe)|0)+Math.imul(p,me)|0))<<13)|0;u=((n=n+Math.imul(p,pe)|0)+(r>>>13)|0)+(Be>>>26)|0,Be&=67108863,a=Math.imul(_,W),r=(r=Math.imul(_,Y))+Math.imul(F,W)|0,n=Math.imul(F,Y),a=a+Math.imul(R,Z)|0,r=(r=r+Math.imul(R,X)|0)+Math.imul(O,Z)|0,n=n+Math.imul(O,X)|0,a=a+Math.imul(D,$)|0,r=(r=r+Math.imul(D,ee)|0)+Math.imul(K,$)|0,n=n+Math.imul(K,ee)|0,a=a+Math.imul(A,se)|0,r=(r=r+Math.imul(A,ae)|0)+Math.imul(T,se)|0,n=n+Math.imul(T,ae)|0,a=a+Math.imul(B,ne)|0,r=(r=r+Math.imul(B,ie)|0)+Math.imul(N,ne)|0,n=n+Math.imul(N,ie)|0,a=a+Math.imul(I,ce)|0,r=(r=r+Math.imul(I,ue)|0)+Math.imul(P,ce)|0,n=n+Math.imul(P,ue)|0,a=a+Math.imul(v,he)|0,r=(r=r+Math.imul(v,le)|0)+Math.imul(M,he)|0,n=n+Math.imul(M,le)|0;var Ne=(u+(a=a+Math.imul(g,me)|0)|0)+((8191&(r=(r=r+Math.imul(g,pe)|0)+Math.imul(y,me)|0))<<13)|0;u=((n=n+Math.imul(y,pe)|0)+(r>>>13)|0)+(Ne>>>26)|0,Ne&=67108863,a=Math.imul(_,Z),r=(r=Math.imul(_,X))+Math.imul(F,Z)|0,n=Math.imul(F,X),a=a+Math.imul(R,$)|0,r=(r=r+Math.imul(R,ee)|0)+Math.imul(O,$)|0,n=n+Math.imul(O,ee)|0,a=a+Math.imul(D,se)|0,r=(r=r+Math.imul(D,ae)|0)+Math.imul(K,se)|0,n=n+Math.imul(K,ae)|0,a=a+Math.imul(A,ne)|0,r=(r=r+Math.imul(A,ie)|0)+Math.imul(T,ne)|0,n=n+Math.imul(T,ie)|0,a=a+Math.imul(B,ce)|0,r=(r=r+Math.imul(B,ue)|0)+Math.imul(N,ce)|0,n=n+Math.imul(N,ue)|0,a=a+Math.imul(I,he)|0,r=(r=r+Math.imul(I,le)|0)+Math.imul(P,he)|0,n=n+Math.imul(P,le)|0;var Ue=(u+(a=a+Math.imul(v,me)|0)|0)+((8191&(r=(r=r+Math.imul(v,pe)|0)+Math.imul(M,me)|0))<<13)|0;u=((n=n+Math.imul(M,pe)|0)+(r>>>13)|0)+(Ue>>>26)|0,Ue&=67108863,a=Math.imul(_,$),r=(r=Math.imul(_,ee))+Math.imul(F,$)|0,n=Math.imul(F,ee),a=a+Math.imul(R,se)|0,r=(r=r+Math.imul(R,ae)|0)+Math.imul(O,se)|0,n=n+Math.imul(O,ae)|0,a=a+Math.imul(D,ne)|0,r=(r=r+Math.imul(D,ie)|0)+Math.imul(K,ne)|0,n=n+Math.imul(K,ie)|0,a=a+Math.imul(A,ce)|0,r=(r=r+Math.imul(A,ue)|0)+Math.imul(T,ce)|0,n=n+Math.imul(T,ue)|0,a=a+Math.imul(B,he)|0,r=(r=r+Math.imul(B,le)|0)+Math.imul(N,he)|0,n=n+Math.imul(N,le)|0;var Ae=(u+(a=a+Math.imul(I,me)|0)|0)+((8191&(r=(r=r+Math.imul(I,pe)|0)+Math.imul(P,me)|0))<<13)|0;u=((n=n+Math.imul(P,pe)|0)+(r>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,a=Math.imul(_,se),r=(r=Math.imul(_,ae))+Math.imul(F,se)|0,n=Math.imul(F,ae),a=a+Math.imul(R,ne)|0,r=(r=r+Math.imul(R,ie)|0)+Math.imul(O,ne)|0,n=n+Math.imul(O,ie)|0,a=a+Math.imul(D,ce)|0,r=(r=r+Math.imul(D,ue)|0)+Math.imul(K,ce)|0,n=n+Math.imul(K,ue)|0,a=a+Math.imul(A,he)|0,r=(r=r+Math.imul(A,le)|0)+Math.imul(T,he)|0,n=n+Math.imul(T,le)|0;var Te=(u+(a=a+Math.imul(B,me)|0)|0)+((8191&(r=(r=r+Math.imul(B,pe)|0)+Math.imul(N,me)|0))<<13)|0;u=((n=n+Math.imul(N,pe)|0)+(r>>>13)|0)+(Te>>>26)|0,Te&=67108863,a=Math.imul(_,ne),r=(r=Math.imul(_,ie))+Math.imul(F,ne)|0,n=Math.imul(F,ie),a=a+Math.imul(R,ce)|0,r=(r=r+Math.imul(R,ue)|0)+Math.imul(O,ce)|0,n=n+Math.imul(O,ue)|0,a=a+Math.imul(D,he)|0,r=(r=r+Math.imul(D,le)|0)+Math.imul(K,he)|0,n=n+Math.imul(K,le)|0;var ke=(u+(a=a+Math.imul(A,me)|0)|0)+((8191&(r=(r=r+Math.imul(A,pe)|0)+Math.imul(T,me)|0))<<13)|0;u=((n=n+Math.imul(T,pe)|0)+(r>>>13)|0)+(ke>>>26)|0,ke&=67108863,a=Math.imul(_,ce),r=(r=Math.imul(_,ue))+Math.imul(F,ce)|0,n=Math.imul(F,ue),a=a+Math.imul(R,he)|0,r=(r=r+Math.imul(R,le)|0)+Math.imul(O,he)|0,n=n+Math.imul(O,le)|0;var De=(u+(a=a+Math.imul(D,me)|0)|0)+((8191&(r=(r=r+Math.imul(D,pe)|0)+Math.imul(K,me)|0))<<13)|0;u=((n=n+Math.imul(K,pe)|0)+(r>>>13)|0)+(De>>>26)|0,De&=67108863,a=Math.imul(_,he),r=(r=Math.imul(_,le))+Math.imul(F,he)|0,n=Math.imul(F,le);var Ke=(u+(a=a+Math.imul(R,me)|0)|0)+((8191&(r=(r=r+Math.imul(R,pe)|0)+Math.imul(O,me)|0))<<13)|0;u=((n=n+Math.imul(O,pe)|0)+(r>>>13)|0)+(Ke>>>26)|0,Ke&=67108863;var xe=(u+(a=Math.imul(_,me))|0)+((8191&(r=(r=Math.imul(_,pe))+Math.imul(F,me)|0))<<13)|0;return u=((n=Math.imul(F,pe))+(r>>>13)|0)+(xe>>>26)|0,xe&=67108863,c[0]=we,c[1]=ge,c[2]=ye,c[3]=be,c[4]=ve,c[5]=Me,c[6]=Se,c[7]=Ie,c[8]=Pe,c[9]=Ee,c[10]=Be,c[11]=Ne,c[12]=Ue,c[13]=Ae,c[14]=Te,c[15]=ke,c[16]=De,c[17]=Ke,c[18]=xe,0!==u&&(c[19]=u,s.length++),s};function m(e,t,s){return(new p).mulp(e,t,s)}function p(e,t){this.x=e,this.y=t}Math.imul||(f=l),n.prototype.mulTo=function(e,t){var s=this.length+e.length;return 10===this.length&&10===e.length?f(this,e,t):s<63?l(this,e,t):s<1024?function(e,t,s){s.negative=t.negative^e.negative,s.length=e.length+t.length;for(var a=0,r=0,n=0;n<s.length-1;n++){var i=r;r=0;for(var o=67108863&a,c=Math.min(n,t.length-1),u=Math.max(0,n-e.length+1);u<=c;u++){var d=n-u,h=(0|e.words[d])*(0|t.words[u]),l=67108863&h;o=67108863&(l=l+o|0),r+=(i=(i=i+(h/67108864|0)|0)+(l>>>26)|0)>>>26,i&=67108863}s.words[n]=o,a=i,i=r}return 0!==a?s.words[n]=a:s.length--,s.strip()}(this,e,t):m(this,e,t)},p.prototype.makeRBT=function(e){for(var t=new Array(e),s=n.prototype._countBits(e)-1,a=0;a<e;a++)t[a]=this.revBin(a,s,e);return t},p.prototype.revBin=function(e,t,s){if(0===e||e===s-1)return e;for(var a=0,r=0;r<t;r++)a|=(1&e)<<t-r-1,e>>=1;return a},p.prototype.permute=function(e,t,s,a,r,n){for(var i=0;i<n;i++)a[i]=t[e[i]],r[i]=s[e[i]]},p.prototype.transform=function(e,t,s,a,r,n){this.permute(n,e,t,s,a,r);for(var i=1;i<r;i<<=1)for(var o=i<<1,c=Math.cos(2*Math.PI/o),u=Math.sin(2*Math.PI/o),d=0;d<r;d+=o)for(var h=c,l=u,f=0;f<i;f++){var m=s[d+f],p=a[d+f],w=s[d+f+i],g=a[d+f+i],y=h*w-l*g;g=h*g+l*w,w=y,s[d+f]=m+w,a[d+f]=p+g,s[d+f+i]=m-w,a[d+f+i]=p-g,f!==o&&(y=c*h-u*l,l=c*l+u*h,h=y)}},p.prototype.guessLen13b=function(e,t){var s=1|Math.max(t,e),a=1&s,r=0;for(s=s/2|0;s;s>>>=1)r++;return 1<<r+1+a},p.prototype.conjugate=function(e,t,s){if(!(s<=1))for(var a=0;a<s/2;a++){var r=e[a];e[a]=e[s-a-1],e[s-a-1]=r,r=t[a],t[a]=-t[s-a-1],t[s-a-1]=-r}},p.prototype.normalize13b=function(e,t){for(var s=0,a=0;a<t/2;a++){var r=8192*Math.round(e[2*a+1]/t)+Math.round(e[2*a]/t)+s;e[a]=67108863&r,s=r<67108864?0:r/67108864|0}return e},p.prototype.convert13b=function(e,t,s,r){for(var n=0,i=0;i<t;i++)n+=0|e[i],s[2*i]=8191&n,n>>>=13,s[2*i+1]=8191&n,n>>>=13;for(i=2*t;i<r;++i)s[i]=0;a(0===n),a(0==(-8192&n))},p.prototype.stub=function(e){for(var t=new Array(e),s=0;s<e;s++)t[s]=0;return t},p.prototype.mulp=function(e,t,s){var a=2*this.guessLen13b(e.length,t.length),r=this.makeRBT(a),n=this.stub(a),i=new Array(a),o=new Array(a),c=new Array(a),u=new Array(a),d=new Array(a),h=new Array(a),l=s.words;l.length=a,this.convert13b(e.words,e.length,i,a),this.convert13b(t.words,t.length,u,a),this.transform(i,n,o,c,a,r),this.transform(u,n,d,h,a,r);for(var f=0;f<a;f++){var m=o[f]*d[f]-c[f]*h[f];c[f]=o[f]*h[f]+c[f]*d[f],o[f]=m}return this.conjugate(o,c,a),this.transform(o,c,l,n,a,r),this.conjugate(l,n,a),this.normalize13b(l,a),s.negative=e.negative^t.negative,s.length=e.length+t.length,s.strip()},n.prototype.mul=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),this.mulTo(e,t)},n.prototype.mulf=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),m(this,e,t)},n.prototype.imul=function(e){return this.clone().mulTo(e,this)},n.prototype.imuln=function(e){a("number"==typeof e),a(e<67108864);for(var t=0,s=0;s<this.length;s++){var r=(0|this.words[s])*e,n=(67108863&r)+(67108863&t);t>>=26,t+=r/67108864|0,t+=n>>>26,this.words[s]=67108863&n}return 0!==t&&(this.words[s]=t,this.length++),this},n.prototype.muln=function(e){return this.clone().imuln(e)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),s=0;s<t.length;s++){var a=s/26|0,r=s%26;t[s]=(e.words[a]&1<<r)>>>r}return t}(e);if(0===t.length)return new n(1);for(var s=this,a=0;a<t.length&&0===t[a];a++,s=s.sqr());if(++a<t.length)for(var r=s.sqr();a<t.length;a++,r=r.sqr())0!==t[a]&&(s=s.mul(r));return s},n.prototype.iushln=function(e){a("number"==typeof e&&e>=0);var t,s=e%26,r=(e-s)/26,n=67108863>>>26-s<<26-s;if(0!==s){var i=0;for(t=0;t<this.length;t++){var o=this.words[t]&n,c=(0|this.words[t])-o<<s;this.words[t]=c|i,i=o>>>26-s}i&&(this.words[t]=i,this.length++)}if(0!==r){for(t=this.length-1;t>=0;t--)this.words[t+r]=this.words[t];for(t=0;t<r;t++)this.words[t]=0;this.length+=r}return this.strip()},n.prototype.ishln=function(e){return a(0===this.negative),this.iushln(e)},n.prototype.iushrn=function(e,t,s){var r;a("number"==typeof e&&e>=0),r=t?(t-t%26)/26:0;var n=e%26,i=Math.min((e-n)/26,this.length),o=67108863^67108863>>>n<<n,c=s;if(r-=i,r=Math.max(0,r),c){for(var u=0;u<i;u++)c.words[u]=this.words[u];c.length=i}if(0===i);else if(this.length>i)for(this.length-=i,u=0;u<this.length;u++)this.words[u]=this.words[u+i];else this.words[0]=0,this.length=1;var d=0;for(u=this.length-1;u>=0&&(0!==d||u>=r);u--){var h=0|this.words[u];this.words[u]=d<<26-n|h>>>n,d=h&o}return c&&0!==d&&(c.words[c.length++]=d),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(e,t,s){return a(0===this.negative),this.iushrn(e,t,s)},n.prototype.shln=function(e){return this.clone().ishln(e)},n.prototype.ushln=function(e){return this.clone().iushln(e)},n.prototype.shrn=function(e){return this.clone().ishrn(e)},n.prototype.ushrn=function(e){return this.clone().iushrn(e)},n.prototype.testn=function(e){a("number"==typeof e&&e>=0);var t=e%26,s=(e-t)/26,r=1<<t;return!(this.length<=s)&&!!(this.words[s]&r)},n.prototype.imaskn=function(e){a("number"==typeof e&&e>=0);var t=e%26,s=(e-t)/26;if(a(0===this.negative,"imaskn works only with positive numbers"),this.length<=s)return this;if(0!==t&&s++,this.length=Math.min(s,this.length),0!==t){var r=67108863^67108863>>>t<<t;this.words[this.length-1]&=r}return this.strip()},n.prototype.maskn=function(e){return this.clone().imaskn(e)},n.prototype.iaddn=function(e){return a("number"==typeof e),a(e<67108864),e<0?this.isubn(-e):0!==this.negative?1===this.length&&(0|this.words[0])<e?(this.words[0]=e-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(e),this.negative=1,this):this._iaddn(e)},n.prototype._iaddn=function(e){this.words[0]+=e;for(var t=0;t<this.length&&this.words[t]>=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},n.prototype.isubn=function(e){if(a("number"==typeof e),a(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t<this.length&&this.words[t]<0;t++)this.words[t]+=67108864,this.words[t+1]-=1;return this.strip()},n.prototype.addn=function(e){return this.clone().iaddn(e)},n.prototype.subn=function(e){return this.clone().isubn(e)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(e,t,s){var r,n,i=e.length+s;this._expand(i);var o=0;for(r=0;r<e.length;r++){n=(0|this.words[r+s])+o;var c=(0|e.words[r])*t;o=((n-=67108863&c)>>26)-(c/67108864|0),this.words[r+s]=67108863&n}for(;r<this.length-s;r++)o=(n=(0|this.words[r+s])+o)>>26,this.words[r+s]=67108863&n;if(0===o)return this.strip();for(a(-1===o),o=0,r=0;r<this.length;r++)o=(n=-(0|this.words[r])+o)>>26,this.words[r]=67108863&n;return this.negative=1,this.strip()},n.prototype._wordDiv=function(e,t){var s=(this.length,e.length),a=this.clone(),r=e,i=0|r.words[r.length-1];0!==(s=26-this._countBits(i))&&(r=r.ushln(s),a.iushln(s),i=0|r.words[r.length-1]);var o,c=a.length-r.length;if("mod"!==t){(o=new n(null)).length=c+1,o.words=new Array(o.length);for(var u=0;u<o.length;u++)o.words[u]=0}var d=a.clone()._ishlnsubmul(r,1,c);0===d.negative&&(a=d,o&&(o.words[c]=1));for(var h=c-1;h>=0;h--){var l=67108864*(0|a.words[r.length+h])+(0|a.words[r.length+h-1]);for(l=Math.min(l/i|0,67108863),a._ishlnsubmul(r,l,h);0!==a.negative;)l--,a.negative=0,a._ishlnsubmul(r,1,h),a.isZero()||(a.negative^=1);o&&(o.words[h]=l)}return o&&o.strip(),a.strip(),"div"!==t&&0!==s&&a.iushrn(s),{div:o||null,mod:a}},n.prototype.divmod=function(e,t,s){return a(!e.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===e.negative?(o=this.neg().divmod(e,t),"mod"!==t&&(r=o.div.neg()),"div"!==t&&(i=o.mod.neg(),s&&0!==i.negative&&i.iadd(e)),{div:r,mod:i}):0===this.negative&&0!==e.negative?(o=this.divmod(e.neg(),t),"mod"!==t&&(r=o.div.neg()),{div:r,mod:o.mod}):0!=(this.negative&e.negative)?(o=this.neg().divmod(e.neg(),t),"div"!==t&&(i=o.mod.neg(),s&&0!==i.negative&&i.isub(e)),{div:o.div,mod:i}):e.length>this.length||this.cmp(e)<0?{div:new n(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new n(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new n(this.modn(e.words[0]))}:this._wordDiv(e,t);var r,i,o},n.prototype.div=function(e){return this.divmod(e,"div",!1).div},n.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},n.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},n.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var s=0!==t.div.negative?t.mod.isub(e):t.mod,a=e.ushrn(1),r=e.andln(1),n=s.cmp(a);return n<0||1===r&&0===n?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},n.prototype.modn=function(e){a(e<=67108863);for(var t=(1<<26)%e,s=0,r=this.length-1;r>=0;r--)s=(t*s+(0|this.words[r]))%e;return s},n.prototype.idivn=function(e){a(e<=67108863);for(var t=0,s=this.length-1;s>=0;s--){var r=(0|this.words[s])+67108864*t;this.words[s]=r/e|0,t=r%e}return this.strip()},n.prototype.divn=function(e){return this.clone().idivn(e)},n.prototype.egcd=function(e){a(0===e.negative),a(!e.isZero());var t=this,s=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var r=new n(1),i=new n(0),o=new n(0),c=new n(1),u=0;t.isEven()&&s.isEven();)t.iushrn(1),s.iushrn(1),++u;for(var d=s.clone(),h=t.clone();!t.isZero();){for(var l=0,f=1;0==(t.words[0]&f)&&l<26;++l,f<<=1);if(l>0)for(t.iushrn(l);l-- >0;)(r.isOdd()||i.isOdd())&&(r.iadd(d),i.isub(h)),r.iushrn(1),i.iushrn(1);for(var m=0,p=1;0==(s.words[0]&p)&&m<26;++m,p<<=1);if(m>0)for(s.iushrn(m);m-- >0;)(o.isOdd()||c.isOdd())&&(o.iadd(d),c.isub(h)),o.iushrn(1),c.iushrn(1);t.cmp(s)>=0?(t.isub(s),r.isub(o),i.isub(c)):(s.isub(t),o.isub(r),c.isub(i))}return{a:o,b:c,gcd:s.iushln(u)}},n.prototype._invmp=function(e){a(0===e.negative),a(!e.isZero());var t=this,s=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var r,i=new n(1),o=new n(0),c=s.clone();t.cmpn(1)>0&&s.cmpn(1)>0;){for(var u=0,d=1;0==(t.words[0]&d)&&u<26;++u,d<<=1);if(u>0)for(t.iushrn(u);u-- >0;)i.isOdd()&&i.iadd(c),i.iushrn(1);for(var h=0,l=1;0==(s.words[0]&l)&&h<26;++h,l<<=1);if(h>0)for(s.iushrn(h);h-- >0;)o.isOdd()&&o.iadd(c),o.iushrn(1);t.cmp(s)>=0?(t.isub(s),i.isub(o)):(s.isub(t),o.isub(i))}return(r=0===t.cmpn(1)?i:o).cmpn(0)<0&&r.iadd(e),r},n.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),s=e.clone();t.negative=0,s.negative=0;for(var a=0;t.isEven()&&s.isEven();a++)t.iushrn(1),s.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;s.isEven();)s.iushrn(1);var r=t.cmp(s);if(r<0){var n=t;t=s,s=n}else if(0===r||0===s.cmpn(1))break;t.isub(s)}return s.iushln(a)},n.prototype.invm=function(e){return this.egcd(e).a.umod(e)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(e){return this.words[0]&e},n.prototype.bincn=function(e){a("number"==typeof e);var t=e%26,s=(e-t)/26,r=1<<t;if(this.length<=s)return this._expand(s+1),this.words[s]|=r,this;for(var n=r,i=s;0!==n&&i<this.length;i++){var o=0|this.words[i];n=(o+=n)>>>26,o&=67108863,this.words[i]=o}return 0!==n&&(this.words[i]=n,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(e){var t,s=e<0;if(0!==this.negative&&!s)return-1;if(0===this.negative&&s)return 1;if(this.strip(),this.length>1)t=1;else{s&&(e=-e),a(e<=67108863,"Number is too big");var r=0|this.words[0];t=r===e?0:r<e?-1:1}return 0!==this.negative?0|-t:t},n.prototype.cmp=function(e){if(0!==this.negative&&0===e.negative)return-1;if(0===this.negative&&0!==e.negative)return 1;var t=this.ucmp(e);return 0!==this.negative?0|-t:t},n.prototype.ucmp=function(e){if(this.length>e.length)return 1;if(this.length<e.length)return-1;for(var t=0,s=this.length-1;s>=0;s--){var a=0|this.words[s],r=0|e.words[s];if(a!==r){a<r?t=-1:a>r&&(t=1);break}}return t},n.prototype.gtn=function(e){return 1===this.cmpn(e)},n.prototype.gt=function(e){return 1===this.cmp(e)},n.prototype.gten=function(e){return this.cmpn(e)>=0},n.prototype.gte=function(e){return this.cmp(e)>=0},n.prototype.ltn=function(e){return-1===this.cmpn(e)},n.prototype.lt=function(e){return-1===this.cmp(e)},n.prototype.lten=function(e){return this.cmpn(e)<=0},n.prototype.lte=function(e){return this.cmp(e)<=0},n.prototype.eqn=function(e){return 0===this.cmpn(e)},n.prototype.eq=function(e){return 0===this.cmp(e)},n.red=function(e){return new S(e)},n.prototype.toRed=function(e){return a(!this.red,"Already a number in reduction context"),a(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},n.prototype.fromRed=function(){return a(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(e){return this.red=e,this},n.prototype.forceRed=function(e){return a(!this.red,"Already a number in reduction context"),this._forceRed(e)},n.prototype.redAdd=function(e){return a(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},n.prototype.redIAdd=function(e){return a(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},n.prototype.redSub=function(e){return a(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},n.prototype.redISub=function(e){return a(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},n.prototype.redShl=function(e){return a(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},n.prototype.redMul=function(e){return a(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},n.prototype.redIMul=function(e){return a(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},n.prototype.redSqr=function(){return a(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return a(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return a(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return a(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return a(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(e){return a(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var w={k256:null,p224:null,p192:null,p25519:null};function g(e,t){this.name=e,this.p=new n(t,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function y(){g.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){g.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){g.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){g.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function S(e){if("string"==typeof e){var t=n._prime(e);this.m=t.p,this.prime=t}else a(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function I(e){S.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var e=new n(null);return e.words=new Array(Math.ceil(this.n/13)),e},g.prototype.ireduce=function(e){var t,s=e;do{this.split(s,this.tmp),t=(s=(s=this.imulK(s)).iadd(this.tmp)).bitLength()}while(t>this.n);var a=t<this.n?-1:s.ucmp(this.p);return 0===a?(s.words[0]=0,s.length=1):a>0?s.isub(this.p):void 0!==s.strip?s.strip():s._strip(),s},g.prototype.split=function(e,t){e.iushrn(this.n,0,t)},g.prototype.imulK=function(e){return e.imul(this.k)},r(y,g),y.prototype.split=function(e,t){for(var s=Math.min(e.length,9),a=0;a<s;a++)t.words[a]=e.words[a];if(t.length=s,e.length<=9)return e.words[0]=0,void(e.length=1);var r=e.words[9];for(t.words[t.length++]=4194303&r,a=10;a<e.length;a++){var n=0|e.words[a];e.words[a-10]=(4194303&n)<<4|r>>>22,r=n}r>>>=22,e.words[a-10]=r,0===r&&e.length>10?e.length-=10:e.length-=9},y.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,s=0;s<e.length;s++){var a=0|e.words[s];t+=977*a,e.words[s]=67108863&t,t=64*a+(t/67108864|0)}return 0===e.words[e.length-1]&&(e.length--,0===e.words[e.length-1]&&e.length--),e},r(b,g),r(v,g),r(M,g),M.prototype.imulK=function(e){for(var t=0,s=0;s<e.length;s++){var a=19*(0|e.words[s])+t,r=67108863&a;a>>>=26,e.words[s]=r,t=a}return 0!==t&&(e.words[e.length++]=t),e},n._prime=function(e){if(w[e])return w[e];var t;if("k256"===e)t=new y;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new M}return w[e]=t,t},S.prototype._verify1=function(e){a(0===e.negative,"red works only with positives"),a(e.red,"red works only with red numbers")},S.prototype._verify2=function(e,t){a(0==(e.negative|t.negative),"red works only with positives"),a(e.red&&e.red===t.red,"red works only with red numbers")},S.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},S.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},S.prototype.add=function(e,t){this._verify2(e,t);var s=e.add(t);return s.cmp(this.m)>=0&&s.isub(this.m),s._forceRed(this)},S.prototype.iadd=function(e,t){this._verify2(e,t);var s=e.iadd(t);return s.cmp(this.m)>=0&&s.isub(this.m),s},S.prototype.sub=function(e,t){this._verify2(e,t);var s=e.sub(t);return s.cmpn(0)<0&&s.iadd(this.m),s._forceRed(this)},S.prototype.isub=function(e,t){this._verify2(e,t);var s=e.isub(t);return s.cmpn(0)<0&&s.iadd(this.m),s},S.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},S.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},S.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},S.prototype.isqr=function(e){return this.imul(e,e.clone())},S.prototype.sqr=function(e){return this.mul(e,e)},S.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(a(t%2==1),3===t){var s=this.m.add(new n(1)).iushrn(2);return this.pow(e,s)}for(var r=this.m.subn(1),i=0;!r.isZero()&&0===r.andln(1);)i++,r.iushrn(1);a(!r.isZero());var o=new n(1).toRed(this),c=o.redNeg(),u=this.m.subn(1).iushrn(1),d=this.m.bitLength();for(d=new n(2*d*d).toRed(this);0!==this.pow(d,u).cmp(c);)d.redIAdd(c);for(var h=this.pow(d,r),l=this.pow(e,r.addn(1).iushrn(1)),f=this.pow(e,r),m=i;0!==f.cmp(o);){for(var p=f,w=0;0!==p.cmp(o);w++)p=p.redSqr();a(w<m);var g=this.pow(h,new n(1).iushln(m-w-1));l=l.redMul(g),h=g.redSqr(),f=f.redMul(h),m=w}return l},S.prototype.invm=function(e){var t=e._invmp(this.m);return 0!==t.negative?(t.negative=0,this.imod(t).redNeg()):this.imod(t)},S.prototype.pow=function(e,t){if(t.isZero())return new n(1).toRed(this);if(0===t.cmpn(1))return e.clone();var s=new Array(16);s[0]=new n(1).toRed(this),s[1]=e;for(var a=2;a<s.length;a++)s[a]=this.mul(s[a-1],e);var r=s[0],i=0,o=0,c=t.bitLength()%26;for(0===c&&(c=26),a=t.length-1;a>=0;a--){for(var u=t.words[a],d=c-1;d>=0;d--){var h=u>>d&1;r!==s[0]&&(r=this.sqr(r)),0!==h||0!==i?(i<<=1,i|=h,(4===++o||0===a&&0===d)&&(r=this.mul(r,s[i]),o=0,i=0)):o=0}c=26}return r},S.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},S.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},n.mont=function(e){return new I(e)},r(I,S),I.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},I.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},I.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var s=e.imul(t),a=s.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),r=s.isub(a).iushrn(this.shift),n=r;return r.cmp(this.m)>=0?n=r.isub(this.m):r.cmpn(0)<0&&(n=r.iadd(this.m)),n._forceRed(this)},I.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new n(0)._forceRed(this);var s=e.mul(t),a=s.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),r=s.isub(a).iushrn(this.shift),i=r;return r.cmp(this.m)>=0?i=r.isub(this.m):r.cmpn(0)<0&&(i=r.iadd(this.m)),i._forceRed(this)},I.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,s(19)(e))},function(e,t,s){var a=s(7);e.exports=y,y.simpleSieve=w,y.fermatTest=g;var r=s(5),n=new r(24),i=new(s(9)),o=new r(1),c=new r(2),u=new r(5),d=(new r(16),new r(8),new r(10)),h=new r(3),l=(new r(7),new r(11)),f=new r(4),m=(new r(12),null);function p(){if(null!==m)return m;var e=[];e[0]=2;for(var t=1,s=3;s<1048576;s+=2){for(var a=Math.ceil(Math.sqrt(s)),r=0;r<t&&e[r]<=a&&s%e[r]!=0;r++);t!==r&&e[r]<=a||(e[t++]=s)}return m=e,e}function w(e){for(var t=p(),s=0;s<t.length;s++)if(0===e.modn(t[s]))return 0===e.cmpn(t[s]);return!0}function g(e){var t=r.mont(e);return 0===c.toRed(t).redPow(e.subn(1)).fromRed().cmpn(1)}function y(e,t){if(e<16)return new r(2===t||5===t?[140,123]:[140,39]);var s,m;for(t=new r(t);;){for(s=new r(a(Math.ceil(e/8)));s.bitLength()>e;)s.ishrn(1);if(s.isEven()&&s.iadd(o),s.testn(1)||s.iadd(c),t.cmp(c)){if(!t.cmp(u))for(;s.mod(d).cmp(h);)s.iadd(f)}else for(;s.mod(n).cmp(l);)s.iadd(f);if(w(m=s.shrn(1))&&w(s)&&g(m)&&g(s)&&i.test(m)&&i.test(s))return s}}},function(e,t,s){"use strict";(function(t,a){var r=s(18).Buffer,n=t.crypto||t.msCrypto;n&&n.getRandomValues?e.exports=function(e,t){if(e>4294967295)throw new RangeError("requested too many random bytes");var s=r.allocUnsafe(e);if(e>0)if(e>65536)for(var i=0;i<e;i+=65536)n.getRandomValues(s.slice(i,i+65536));else n.getRandomValues(s);if("function"==typeof t)return a.nextTick((function(){t(null,s)}));return s}:e.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}).call(this,s(3),s(8))},function(e,t){var s,a,r=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function o(e){if(s===setTimeout)return setTimeout(e,0);if((s===n||!s)&&setTimeout)return s=setTimeout,setTimeout(e,0);try{return s(e,0)}catch(t){try{return s.call(null,e,0)}catch(t){return s.call(this,e,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:n}catch(e){s=n}try{a="function"==typeof clearTimeout?clearTimeout:i}catch(e){a=i}}();var c,u=[],d=!1,h=-1;function l(){d&&c&&(d=!1,c.length?u=c.concat(u):h=-1,u.length&&f())}function f(){if(!d){var e=o(l);d=!0;for(var t=u.length;t;){for(c=u,u=[];++h<t;)c&&c[h].run();h=-1,t=u.length}c=null,d=!1,function(e){if(a===clearTimeout)return clearTimeout(e);if((a===i||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(e);try{a(e)}catch(t){try{return a.call(null,e)}catch(t){return a.call(this,e)}}}(e)}}function m(e,t){this.fun=e,this.array=t}function p(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var s=1;s<arguments.length;s++)t[s-1]=arguments[s];u.push(new m(e,t)),1!==u.length||d||o(f)},m.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=p,r.addListener=p,r.once=p,r.off=p,r.removeListener=p,r.removeAllListeners=p,r.emit=p,r.prependListener=p,r.prependOnceListener=p,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},function(e,t,s){var a=s(5),r=s(21);function n(e){this.rand=e||new r.Rand}e.exports=n,n.create=function(e){return new n(e)},n.prototype._randbelow=function(e){var t=e.bitLength(),s=Math.ceil(t/8);do{var r=new a(this.rand.generate(s))}while(r.cmp(e)>=0);return r},n.prototype._randrange=function(e,t){var s=t.sub(e);return e.add(this._randbelow(s))},n.prototype.test=function(e,t,s){var r=e.bitLength(),n=a.mont(e),i=new a(1).toRed(n);t||(t=Math.max(1,r/48|0));for(var o=e.subn(1),c=0;!o.testn(c);c++);for(var u=e.shrn(c),d=o.toRed(n);t>0;t--){var h=this._randrange(new a(2),o);s&&s(h);var l=h.toRed(n).redPow(u);if(0!==l.cmp(i)&&0!==l.cmp(d)){for(var f=1;f<c;f++){if(0===(l=l.redSqr()).cmp(i))return!1;if(0===l.cmp(d))break}if(f===c)return!1}}return!0},n.prototype.getDivisor=function(e,t){var s=e.bitLength(),r=a.mont(e),n=new a(1).toRed(r);t||(t=Math.max(1,s/48|0));for(var i=e.subn(1),o=0;!i.testn(o);o++);for(var c=e.shrn(o),u=i.toRed(r);t>0;t--){var d=this._randrange(new a(2),i),h=e.gcd(d);if(0!==h.cmpn(1))return h;var l=d.toRed(r).redPow(c);if(0!==l.cmp(n)&&0!==l.cmp(u)){for(var f=1;f<o;f++){if(0===(l=l.redSqr()).cmp(n))return l.fromRed().subn(1).gcd(e);if(0===l.cmp(u))break}if(f===o)return(l=l.redSqr()).fromRed().subn(1).gcd(e)}}return!1}},function(e,t,s){(function(e){var a=s(6),r=s(23),n=s(24);var i={binary:!0,hex:!0,base64:!0};t.DiffieHellmanGroup=t.createDiffieHellmanGroup=t.getDiffieHellman=function(t){var s=new e(r[t].prime,"hex"),a=new e(r[t].gen,"hex");return new n(s,a)},t.createDiffieHellman=t.DiffieHellman=function t(s,r,o,c){return e.isBuffer(r)||void 0===i[r]?t(s,"binary",r,o):(r=r||"binary",c=c||"binary",o=o||new e([2]),e.isBuffer(o)||(o=new e(o,c)),"number"==typeof s?new n(a(s,o),o,!0):(e.isBuffer(s)||(s=new e(s,r)),new n(s,o,!0)))}}).call(this,s(4).Buffer)},function(e,t,s){"use strict";(function(t){!function(s){function a(e){const t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);let s=1779033703,a=3144134277,r=1013904242,n=2773480762,i=1359893119,o=2600822924,c=528734635,u=1541459225;const d=new Uint32Array(64);function h(e){let h=0,l=e.length;for(;l>=64;){let f,m,p,w,g,y=s,b=a,v=r,M=n,S=i,I=o,P=c,E=u;for(m=0;m<16;m++)p=h+4*m,d[m]=(255&e[p])<<24|(255&e[p+1])<<16|(255&e[p+2])<<8|255&e[p+3];for(m=16;m<64;m++)f=d[m-2],w=(f>>>17|f<<15)^(f>>>19|f<<13)^f>>>10,f=d[m-15],g=(f>>>7|f<<25)^(f>>>18|f<<14)^f>>>3,d[m]=(w+d[m-7]|0)+(g+d[m-16]|0)|0;for(m=0;m<64;m++)w=(((S>>>6|S<<26)^(S>>>11|S<<21)^(S>>>25|S<<7))+(S&I^~S&P)|0)+(E+(t[m]+d[m]|0)|0)|0,g=((y>>>2|y<<30)^(y>>>13|y<<19)^(y>>>22|y<<10))+(y&b^y&v^b&v)|0,E=P,P=I,I=S,S=M+w|0,M=v,v=b,b=y,y=w+g|0;s=s+y|0,a=a+b|0,r=r+v|0,n=n+M|0,i=i+S|0,o=o+I|0,c=c+P|0,u=u+E|0,h+=64,l-=64}}h(e);let l,f=e.length%64,m=e.length/536870912|0,p=e.length<<3,w=f<56?56:120,g=e.slice(e.length-f,e.length);for(g.push(128),l=f+1;l<w;l++)g.push(0);return g.push(m>>>24&255),g.push(m>>>16&255),g.push(m>>>8&255),g.push(m>>>0&255),g.push(p>>>24&255),g.push(p>>>16&255),g.push(p>>>8&255),g.push(p>>>0&255),h(g),[s>>>24&255,s>>>16&255,s>>>8&255,s>>>0&255,a>>>24&255,a>>>16&255,a>>>8&255,a>>>0&255,r>>>24&255,r>>>16&255,r>>>8&255,r>>>0&255,n>>>24&255,n>>>16&255,n>>>8&255,n>>>0&255,i>>>24&255,i>>>16&255,i>>>8&255,i>>>0&255,o>>>24&255,o>>>16&255,o>>>8&255,o>>>0&255,c>>>24&255,c>>>16&255,c>>>8&255,c>>>0&255,u>>>24&255,u>>>16&255,u>>>8&255,u>>>0&255]}function r(e,t,s){e=e.length<=64?e:a(e);const r=64+t.length+4,n=new Array(r),i=new Array(64);let o,c=[];for(o=0;o<64;o++)n[o]=54;for(o=0;o<e.length;o++)n[o]^=e[o];for(o=0;o<t.length;o++)n[64+o]=t[o];for(o=r-4;o<r;o++)n[o]=0;for(o=0;o<64;o++)i[o]=92;for(o=0;o<e.length;o++)i[o]^=e[o];function u(){for(let e=r-1;e>=r-4;e--){if(n[e]++,n[e]<=255)return;n[e]=0}}for(;s>=32;)u(),c=c.concat(a(i.concat(a(n)))),s-=32;return s>0&&(u(),c=c.concat(a(i.concat(a(n))).slice(0,s))),c}function n(e,t,s,a,r){let n;for(u(e,16*(2*s-1),r,0,16),n=0;n<2*s;n++)c(e,16*n,r,16),o(r,a),u(r,0,e,t+16*n,16);for(n=0;n<s;n++)u(e,t+2*n*16,e,16*n,16);for(n=0;n<s;n++)u(e,t+16*(2*n+1),e,16*(n+s),16)}function i(e,t){return e<<t|e>>>32-t}function o(e,t){u(e,0,t,0,16);for(let e=8;e>0;e-=2)t[4]^=i(t[0]+t[12],7),t[8]^=i(t[4]+t[0],9),t[12]^=i(t[8]+t[4],13),t[0]^=i(t[12]+t[8],18),t[9]^=i(t[5]+t[1],7),t[13]^=i(t[9]+t[5],9),t[1]^=i(t[13]+t[9],13),t[5]^=i(t[1]+t[13],18),t[14]^=i(t[10]+t[6],7),t[2]^=i(t[14]+t[10],9),t[6]^=i(t[2]+t[14],13),t[10]^=i(t[6]+t[2],18),t[3]^=i(t[15]+t[11],7),t[7]^=i(t[3]+t[15],9),t[11]^=i(t[7]+t[3],13),t[15]^=i(t[11]+t[7],18),t[1]^=i(t[0]+t[3],7),t[2]^=i(t[1]+t[0],9),t[3]^=i(t[2]+t[1],13),t[0]^=i(t[3]+t[2],18),t[6]^=i(t[5]+t[4],7),t[7]^=i(t[6]+t[5],9),t[4]^=i(t[7]+t[6],13),t[5]^=i(t[4]+t[7],18),t[11]^=i(t[10]+t[9],7),t[8]^=i(t[11]+t[10],9),t[9]^=i(t[8]+t[11],13),t[10]^=i(t[9]+t[8],18),t[12]^=i(t[15]+t[14],7),t[13]^=i(t[12]+t[15],9),t[14]^=i(t[13]+t[12],13),t[15]^=i(t[14]+t[13],18);for(let s=0;s<16;++s)e[s]+=t[s]}function c(e,t,s,a){for(let r=0;r<a;r++)s[r]^=e[t+r]}function u(e,t,s,a,r){for(;r--;)s[a++]=e[t++]}function d(e){if(!e||"number"!=typeof e.length)return!1;for(let t=0;t<e.length;t++){const s=e[t];if("number"!=typeof s||s%1||s<0||s>=256)return!1}return!0}function h(e,t){if("number"!=typeof e||e%1)throw new Error("invalid "+t);return e}function l(e,s,a,i,o,l,f){if(a=h(a,"N"),i=h(i,"r"),o=h(o,"p"),l=h(l,"dkLen"),0===a||0!=(a&a-1))throw new Error("N must be power of 2");if(a>2147483647/128/i)throw new Error("N too large");if(i>2147483647/128/o)throw new Error("r too large");if(!d(e))throw new Error("password must be an array or buffer");if(e=Array.prototype.slice.call(e),!d(s))throw new Error("salt must be an array or buffer");s=Array.prototype.slice.call(s);let m=r(e,s,128*o*i);const p=new Uint32Array(32*o*i);for(let e=0;e<p.length;e++){const t=4*e;p[e]=(255&m[t+3])<<24|(255&m[t+2])<<16|(255&m[t+1])<<8|(255&m[t+0])<<0}const w=new Uint32Array(64*i),g=new Uint32Array(32*i*a),y=32*i,b=new Uint32Array(16),v=new Uint32Array(16),M=o*a*2;let S,I,P=0,E=null,B=!1,N=0,U=0;const A=f?parseInt(1e3/i):4294967295,T=void 0!==t?t:setTimeout,k=function(){if(B)return f(new Error("cancelled"),P/M);let t;switch(N){case 0:I=32*U*i,u(p,I,w,0,y),N=1,S=0;case 1:t=a-S,t>A&&(t=A);for(let e=0;e<t;e++)u(w,0,g,(S+e)*y,y),n(w,y,i,b,v);if(S+=t,P+=t,f){const e=parseInt(1e3*P/M);if(e!==E){if(B=f(null,P/M),B)break;E=e}}if(S<a)break;S=0,N=2;case 2:t=a-S,t>A&&(t=A);for(let e=0;e<t;e++){const e=w[16*(2*i-1)]&a-1;c(g,e*y,w,y),n(w,y,i,b,v)}if(S+=t,P+=t,f){const e=parseInt(1e3*P/M);if(e!==E){if(B=f(null,P/M),B)break;E=e}}if(S<a)break;if(u(w,0,p,I,y),U++,U<o){N=0;break}m=[];for(let e=0;e<p.length;e++)m.push(p[e]>>0&255),m.push(p[e]>>8&255),m.push(p[e]>>16&255),m.push(p[e]>>24&255);const s=r(e,m,l);return f&&f(null,1,s),s}f&&T(k)};if(!f)for(;;){const e=k();if(null!=e)return e}k()}const f={scrypt:function(e,t,s,a,r,n,i){return new Promise((function(o,c){let u=0;i&&i(0),l(e,t,s,a,r,n,(function(e,t,s){if(e)c(e);else if(s)i&&1!==u&&i(1),o(new Uint8Array(s));else if(i&&t!==u)return u=t,i(t)}))}))},syncScrypt:function(e,t,s,a,r,n){return new Uint8Array(l(e,t,s,a,r,n))}};e.exports=f}()}).call(this,s(25).setImmediate)},function(e,t,s){var a,r=function(){var e,t,s=((t=(e={constructor:function(e,t){this.array=[],this.compare=t||a;for(var s=e.length,r=0;r<s;)this.insert(e[r++])},insert:function(e){for(var t,s,a=this.array,r=this.compare,n=a.length-1,i=0,o=-1;n>=i;)if((s=r(a[t=(n+i)/2>>>0],e))<0)i=t+1;else{if(!(s>0)){o=t;break}n=t-1}for(-1===o&&(o=n),o++,n=a.length-1;o<n&&0===r(e,a[o]);)o++;for(t=a.length,a.push(e);t>o;)a[t]=a[--t];return a[o]=e,this},search:function(e){for(var t,s,a=this.array,r=this.compare,n=a.length-1,i=0;n>=i;)if((s=r(a[t=(n+i)/2>>>0],e))<0)i=t+1;else{if(!(s>0))return t;n=t-1}return-1},remove:function(e){var t=this.search(e);return t>=0&&this.array.splice(t,1),this}}).constructor).prototype=e,t);return s.comparing=function(e,t){return new s(t,(function(t,s){return a(t[e],s[e])}))},s;function a(e,t){return e<t?-1:e>t?1:0}}();e.exports=r,void 0===(a=function(){return r}.call(t,s,t,e))||(e.exports=a)},function(e,t){var s="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(s){var a=new Uint8Array(16);e.exports=function(){return s(a),a}}else{var r=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}},function(e,t){for(var s=[],a=0;a<256;++a)s[a]=(a+256).toString(16).substr(1);e.exports=function(e,t){var a=t||0,r=s;return[r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]]].join("")}},function(e,t,s){"use strict";t.byteLength=function(e){var t=u(e),s=t[0],a=t[1];return 3*(s+a)/4-a},t.toByteArray=function(e){var t,s,a=u(e),i=a[0],o=a[1],c=new n(function(e,t,s){return 3*(t+s)/4-s}(0,i,o)),d=0,h=o>0?i-4:i;for(s=0;s<h;s+=4)t=r[e.charCodeAt(s)]<<18|r[e.charCodeAt(s+1)]<<12|r[e.charCodeAt(s+2)]<<6|r[e.charCodeAt(s+3)],c[d++]=t>>16&255,c[d++]=t>>8&255,c[d++]=255&t;2===o&&(t=r[e.charCodeAt(s)]<<2|r[e.charCodeAt(s+1)]>>4,c[d++]=255&t);1===o&&(t=r[e.charCodeAt(s)]<<10|r[e.charCodeAt(s+1)]<<4|r[e.charCodeAt(s+2)]>>2,c[d++]=t>>8&255,c[d++]=255&t);return c},t.fromByteArray=function(e){for(var t,s=e.length,r=s%3,n=[],i=0,o=s-r;i<o;i+=16383)n.push(d(e,i,i+16383>o?o:i+16383));1===r?(t=e[s-1],n.push(a[t>>2]+a[t<<4&63]+"==")):2===r&&(t=(e[s-2]<<8)+e[s-1],n.push(a[t>>10]+a[t>>4&63]+a[t<<2&63]+"="));return n.join("")};for(var a=[],r=[],n="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,c=i.length;o<c;++o)a[o]=i[o],r[i.charCodeAt(o)]=o;function u(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}function d(e,t,s){for(var r,n,i=[],o=t;o<s;o+=3)r=(e[o]<<16&16711680)+(e[o+1]<<8&65280)+(255&e[o+2]),i.push(a[(n=r)>>18&63]+a[n>>12&63]+a[n>>6&63]+a[63&n]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},function(e,t){
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+t.read=function(e,t,s,a,r){var n,i,o=8*r-a-1,c=(1<<o)-1,u=c>>1,d=-7,h=s?r-1:0,l=s?-1:1,f=e[t+h];for(h+=l,n=f&(1<<-d)-1,f>>=-d,d+=o;d>0;n=256*n+e[t+h],h+=l,d-=8);for(i=n&(1<<-d)-1,n>>=-d,d+=a;d>0;i=256*i+e[t+h],h+=l,d-=8);if(0===n)n=1-u;else{if(n===c)return i?NaN:1/0*(f?-1:1);i+=Math.pow(2,a),n-=u}return(f?-1:1)*i*Math.pow(2,n-a)},t.write=function(e,t,s,a,r,n){var i,o,c,u=8*n-r-1,d=(1<<u)-1,h=d>>1,l=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=a?0:n-1,m=a?1:-1,p=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,i=d):(i=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-i))<1&&(i--,c*=2),(t+=i+h>=1?l/c:l*Math.pow(2,1-h))*c>=2&&(i++,c/=2),i+h>=d?(o=0,i=d):i+h>=1?(o=(t*c-1)*Math.pow(2,r),i+=h):(o=t*Math.pow(2,h-1)*Math.pow(2,r),i=0));r>=8;e[s+f]=255&o,f+=m,o/=256,r-=8);for(i=i<<r|o,u+=r;u>0;e[s+f]=255&i,f+=m,i/=256,u-=8);e[s+f-m]|=128*p}},function(e,t){var s={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==s.call(e)}},function(e,t,s){
+/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
+var a=s(4),r=a.Buffer;function n(e,t){for(var s in e)t[s]=e[s]}function i(e,t,s){return r(e,t,s)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?e.exports=a:(n(a,t),t.Buffer=i),i.prototype=Object.create(r.prototype),n(r,i),i.from=function(e,t,s){if("number"==typeof e)throw new TypeError("Argument must not be a number");return r(e,t,s)},i.alloc=function(e,t,s){if("number"!=typeof e)throw new TypeError("Argument must be a number");var a=r(e);return void 0!==t?"string"==typeof s?a.fill(t,s):a.fill(t):a.fill(0),a},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return a.SlowBuffer(e)}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){},function(e,t,s){var a;function r(e){this.rand=e}if(e.exports=function(e){return a||(a=new r(null)),a.generate(e)},e.exports.Rand=r,r.prototype.generate=function(e){return this._rand(e)},r.prototype._rand=function(e){if(this.rand.getBytes)return this.rand.getBytes(e);for(var t=new Uint8Array(e),s=0;s<t.length;s++)t[s]=this.rand.getByte();return t},"object"==typeof self)self.crypto&&self.crypto.getRandomValues?r.prototype._rand=function(e){var t=new Uint8Array(e);return self.crypto.getRandomValues(t),t}:self.msCrypto&&self.msCrypto.getRandomValues?r.prototype._rand=function(e){var t=new Uint8Array(e);return self.msCrypto.getRandomValues(t),t}:"object"==typeof window&&(r.prototype._rand=function(){throw new Error("Not implemented yet")});else try{var n=s(22);if("function"!=typeof n.randomBytes)throw new Error("Not supported");r.prototype._rand=function(e){return n.randomBytes(e)}}catch(e){}},function(e,t){},function(e){e.exports=JSON.parse('{"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}')},function(e,t,s){(function(t){var a=s(5),r=new(s(9)),n=new a(24),i=new a(11),o=new a(10),c=new a(3),u=new a(7),d=s(6),h=s(7);function l(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this._pub=new a(e),this}function f(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this._priv=new a(e),this}e.exports=p;var m={};function p(e,t,s){this.setGenerator(t),this.__prime=new a(e),this._prime=a.mont(this.__prime),this._primeLen=e.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,s?(this.setPublicKey=l,this.setPrivateKey=f):this._primeCode=8}function w(e,s){var a=new t(e.toArray());return s?a.toString(s):a}Object.defineProperty(p.prototype,"verifyError",{enumerable:!0,get:function(){return"number"!=typeof this._primeCode&&(this._primeCode=function(e,t){var s=t.toString("hex"),a=[s,e.toString(16)].join("_");if(a in m)return m[a];var h,l=0;if(e.isEven()||!d.simpleSieve||!d.fermatTest(e)||!r.test(e))return l+=1,l+="02"===s||"05"===s?8:4,m[a]=l,l;switch(r.test(e.shrn(1))||(l+=2),s){case"02":e.mod(n).cmp(i)&&(l+=8);break;case"05":(h=e.mod(o)).cmp(c)&&h.cmp(u)&&(l+=8);break;default:l+=4}return m[a]=l,l}(this.__prime,this.__gen)),this._primeCode}}),p.prototype.generateKeys=function(){return this._priv||(this._priv=new a(h(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},p.prototype.computeSecret=function(e){var s=(e=(e=new a(e)).toRed(this._prime)).redPow(this._priv).fromRed(),r=new t(s.toArray()),n=this.getPrime();if(r.length<n.length){var i=new t(n.length-r.length);i.fill(0),r=t.concat([i,r])}return r},p.prototype.getPublicKey=function(e){return w(this._pub,e)},p.prototype.getPrivateKey=function(e){return w(this._priv,e)},p.prototype.getPrime=function(e){return w(this.__prime,e)},p.prototype.getGenerator=function(e){return w(this._gen,e)},p.prototype.setGenerator=function(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this.__gen=e,this._gen=new a(e),this}}).call(this,s(4).Buffer)},function(e,t,s){(function(e){var a=void 0!==e&&e||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function n(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new n(r.call(setTimeout,a,arguments),clearTimeout)},t.setInterval=function(){return new n(r.call(setInterval,a,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},n.prototype.unref=n.prototype.ref=function(){},n.prototype.close=function(){this._clearFn.call(a,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},s(26),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,s(3))},function(e,t,s){(function(e,t){!function(e,s){"use strict";if(!e.setImmediate){var a,r,n,i,o,c=1,u={},d=!1,h=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,"[object process]"==={}.toString.call(e.process)?a=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,s=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=s,t}}()?e.MessageChannel?((n=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(e){n.port2.postMessage(e)}):h&&"onreadystatechange"in h.createElement("script")?(r=h.documentElement,a=function(e){var t=h.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t)}):a=function(e){setTimeout(m,0,e)}:(i="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(i)&&m(+t.data.slice(i.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(t){e.postMessage(i+t,"*")}),l.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),s=0;s<t.length;s++)t[s]=arguments[s+1];var r={callback:e,args:t};return u[c]=r,a(c),c++},l.clearImmediate=f}function f(e){delete u[e]}function m(e){if(d)setTimeout(m,0,e);else{var t=u[e];if(t){d=!0;try{!function(e){var t=e.callback,s=e.args;switch(s.length){case 0:t();break;case 1:t(s[0]);break;case 2:t(s[0],s[1]);break;case 3:t(s[0],s[1],s[2]);break;default:t.apply(void 0,s)}}(t)}finally{f(e),d=!1}}}}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,s(3),s(8))},function(e,t,s){"use strict";s.r(t);var a=s(1),r=s.n(a),n=s(0),i=s.n(n),o=200,c=400,u=401,d=402,h=403,l=404,f=409,m=429,p=500,w=503,g=504,y=1012,b=3e3,v=3001;class M extends Error{constructor(...e){super(...e),this.name="UsernameAlreadyExists",this.message="Username already exists.",this.status=f}}class S extends Error{constructor(...e){super(...e),this.name="UsernameMissing",this.message="Username missing.",this.status=c}}class I extends Error{constructor(...e){super(...e),this.name="UsernameCannotBeBlank",this.message="Username cannot be blank.",this.status=c}}class P extends Error{constructor(e,...t){super(e,...t),this.name="UsernameTooLong",this.message="Username too long. Must be a max of ".concat(e," characters."),this.status=c}}class E extends Error{constructor(...e){super(...e),this.name="UsernameMustBeString",this.message="Username must be a string.",this.status=c}}class B extends Error{constructor(...e){super(...e),this.name="PasswordMissing",this.message="Password missing.",this.status=c}}class N extends Error{constructor(...e){super(...e),this.name="PasswordCannotBeBlank",this.message="Password cannot be blank.",this.status=c}}class U extends Error{constructor(e,...t){super(e,...t),this.name="PasswordTooShort",this.message="Password too short. Must be a minimum of ".concat(e," characters."),this.status=c}}class A extends Error{constructor(e,...t){super(e,...t),this.name="PasswordTooLong",this.message="Password too long. Must be a max of ".concat(e," characters."),this.status=c}}class T extends Error{constructor(...e){super(...e),this.name="PasswordMustBeString",this.message="Password must be a string.",this.status=c}}class k extends Error{constructor(e,...t){super(e,...t),this.name="PasswordAttemptLimitExceeded",this.message="Password attempt limit exceeded. Must wait ".concat(e," to attempt to use password again."),this.status=u}}class D extends Error{constructor(...e){super(...e),this.name="UsernameOrPasswordMismatch",this.message="Username or password mismatch.",this.status=u}}class K extends Error{constructor(...e){super(...e),this.name="SessionLengthMustBeNumber",this.message="Session length must be a number.",this.status=c}}class x extends Error{constructor(e,...t){super(e,...t),this.name="SessionLengthTooShort",this.message="Session length cannot be shorter than ".concat(e,"."),this.status=c}}class R extends Error{constructor(e,...t){super(e,...t),this.name="SessionLengthTooLong",this.message="Session length cannot be longer than ".concat(e,"."),this.status=c}}class O extends Error{constructor(...e){super(...e),this.name="AllowServerSideEncryptionMustBeBoolean",this.message="Allow server-side encryption value must be a boolean.",this.status=c}}class C extends Error{constructor(e,...t){super(...t),this.name="UserAlreadySignedIn",this.message="Already signed in.",this.status=c,this.username=e}}class _ extends Error{constructor(...e){super(...e),this.name="UserPendingDeletion",this.message="User is pending deletion.",this.status=h}}class F extends Error{constructor(...e){super(...e),this.name="AppIdNotValid",this.message="App ID not valid.",this.status=u}}class L extends Error{constructor(e,...t){super(e,...t),this.name="DomainNotWhitelisted",this.message="Domain not whitelisted. Whitelist the domain ".concat(e?"'".concat(e,"' "):"","in your admin panel."),this.status=u}}class j extends Error{constructor(...e){super(...e),this.name="UserNotSignedIn",this.message="Not signed in.",this.status=c}}class q extends Error{constructor(e,...t){super(e,...t),e&&(this.username=e),this.name="UserNotFound",this.message="User not found.",this.status=l}}class V extends Error{constructor(...e){super(...e),this.name="UserEmailNotFound",this.message="User does not have an email saved.",this.status=l}}class H extends Error{constructor(...e){super(...e),this.name="UserMustChangePassword",this.message="Must change password first.",this.status=h}}class G extends Error{constructor(...e){super(...e),this.name="EmailNotValid",this.message="Email not valid.",this.status=c}}class J extends Error{constructor(...e){super(...e),this.name="ProfileMustBeObject",this.message="Profile must be a flat JSON object.",this.status=c}}class W extends Error{constructor(...e){super(...e),this.name="ProfileCannotBeEmpty",this.message="Profile cannot be empty.",this.status=c}}class Y extends Error{constructor(e,...t){super(e,...t),this.name="ProfileHasTooManyKeys",this.message="Profile has too many keys. Must have a max of ".concat(e," keys."),this.status=c}}class z extends Error{constructor(e,t,...s){super(e,t,...s),this.name="ProfileKeyTooLong",this.message="Profile key too long. Must be a max of ".concat(e," characters."),this.status=c,this.key=t}}class Z extends Error{constructor(e,t,...s){super(e,t,...s),this.name="ProfileValueMustBeString",this.message="Profile value must be a string.",this.status=c,this.key=e,this.value=t}}class X extends Error{constructor(e,...t){super(e,...t),this.name="ProfileValueCannotBeBlank",this.message="Profile value cannot be blank.",this.status=c,this.key=e}}class Q extends Error{constructor(e,t,s,...a){super(e,t,s,...a),this.name="ProfileValueTooLong",this.message="Profile value too long. Must be a max of ".concat(e," characters."),this.status=c,this.key=t,this.value=s}}class $ extends Error{constructor(e,...t){super(e,...t),this.name="RememberMeValueNotValid",this.message="Remember me value must be one of ".concat(JSON.stringify(Object.keys(e)),"."),this.status=c}}class ee extends Error{constructor(...e){super(...e),this.name="ParamsMissing",this.message="Parameters expected are missing.",this.status=c}}class te extends Error{constructor(...e){super(...e),this.name="TrialExceededLimit",this.message="Trial exceeded limit of users.",this.status=d}}class se extends Error{constructor(...e){super(...e),this.name="CurrentPasswordMissing",this.message="Current password missing.",this.status=c}}class ae extends Error{constructor(...e){super(...e),this.name="CurrentPasswordIncorrect",this.message="Current password is incorrect.",this.status=u}}class re extends Error{constructor(e,...t){super(e,...t),this.name="KeyNotFound",this.message=e,this.status=l}}class ne extends Error{constructor(...e){super(...e),this.name="DeleteEndToEndEncryptedDataMustBeBoolean",this.message="Delete end-to-end encrypted data value must be a boolean.",this.status=c}}var ie={UsernameAlreadyExists:M,UsernameMissing:S,UsernameCannotBeBlank:I,UsernameTooLong:P,UsernameMustBeString:E,PasswordMissing:B,PasswordCannotBeBlank:N,PasswordTooShort:U,PasswordTooLong:A,PasswordMustBeString:T,PasswordAttemptLimitExceeded:k,UsernameOrPasswordMismatch:D,SessionLengthMustBeNumber:K,SessionLengthTooShort:x,SessionLengthTooLong:R,AllowServerSideEncryptionMustBeBoolean:O,UserAlreadySignedIn:C,UserPendingDeletion:_,AppIdNotValid:F,DomainNotWhitelisted:L,UserNotSignedIn:j,UserNotFound:q,UserEmailNotFound:V,UserMustChangePassword:H,EmailNotValid:G,ProfileMustBeObject:J,ProfileCannotBeEmpty:W,ProfileHasTooManyKeys:Y,ProfileKeyTooLong:z,ProfileValueMustBeString:Z,ProfileValueCannotBeBlank:X,ProfileValueTooLong:Q,RememberMeValueNotValid:$,ParamsMissing:ee,TrialExceededLimit:te,CurrentPasswordMissing:se,CurrentPasswordIncorrect:ae,KeyNotFound:re,DeleteEndToEndEncryptedDataMustBeBoolean:ne};class oe extends Error{constructor(...e){super(...e),this.name="DatabaseNameMissing",this.message="Database name missing.",this.status=c}}class ce extends Error{constructor(...e){super(...e),this.name="DatabaseNameCannotBeBlank",this.message="Database name cannot be blank.",this.status=c}}class ue extends Error{constructor(...e){super(...e),this.name="DatabaseNameMustBeString",this.message="Database name must be a string.",this.status=c}}class de extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseNameTooLong",this.message="Database name cannot be more than ".concat(e," characters."),this.status=c}}class he extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseNameRestricted",this.message="Database name '".concat(e,"' is restricted. It is used internally by userbase-js."),this.status=h}}class le extends Error{constructor(...e){super(...e),this.name="DatabaseAlreadyOpening",this.message="Already attempting to open database.",this.status=c}}class fe extends Error{constructor(...e){super(...e),this.name="ChangeHandlerMissing",this.message="Change handler missing.",this.status=c}}class me extends Error{constructor(...e){super(...e),this.name="ChangeHandlerMustBeFunction",this.message="Change handler must be a function.",this.status=c}}class pe extends Error{constructor(e,...t){super(e,...t),this.name="EncryptionModeNotValid",this.message="Encryption mode must be one of ".concat(JSON.stringify(Object.keys(e)),"."),this.status=c}}class we extends Error{constructor(...e){super(...e),this.name="ServerSideEncryptionNotEnabledInClient",this.message="Server-side encryption must be enabled in the client to use it. To enable it, set allowServerSideEncryption to true in init().",this.status=h}}class ge extends Error{constructor(...e){super(...e),this.name="DatabaseNotOpen",this.message="Database is not open.",this.status=c}}class ye extends Error{constructor(...e){super(...e),this.name="DatabaseNotFound",this.message="Database not found. Find available databases using getDatabases().",this.status=l}}class be extends Error{constructor(...e){super(...e),this.name="DatabaseIsReadOnly",this.message="Database is read only. Must have permission to write to database.",this.status=h}}class ve extends Error{constructor(...e){super(...e),this.name="DatabaseIdMustBeString",this.message="Database id must be a string.",this.status=c}}class Me extends Error{constructor(...e){super(...e),this.name="DatabaseIdCannotBeBlank",this.message="Database id cannot be blank.",this.status=c}}class Se extends Error{constructor(...e){super(...e),this.name="DatabaseIdNotAllowed",this.message="Database id not allowed. Cannot provide both databaseName and databaseId, can only provide one.",this.status=c}}class Ie extends Error{constructor(...e){super(...e),this.name="DatabaseIdNotAllowedForOwnDatabase",this.message="Tried to open the user's own database using its databaseId rather than its databaseName. The databaseId should only be used to open databases shared from other users.",this.status=h}}class Pe extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseIdInvalidLength",this.message="Database id invalid length. Must be ".concat(e," characters."),this.status=c}}class Ee extends Error{constructor(...e){super(...e),this.name="ShareTokenInvalid",this.message="Share token invalid.",this.status=c}}class Be extends Error{constructor(...e){super(...e),this.name="ShareTokenNotFound",this.message="Share token not found. Perhaps the database owner has generated a new share token.",this.status=l}}class Ne extends Error{constructor(e,...t){super(e,...t),this.name="ShareTokenNotAllowed",this.message="Share token not allowed.",this.status=c}}class Ue extends Error{constructor(...e){super(...e),this.name="ShareTokenNotAllowedForOwnDatabase",this.message="Tried to open the user's own database using its shareToken rather than its databaseName. The shareToken should only be used to open databases shared from other users.",this.status=h}}class Ae extends Error{constructor(...e){super(...e),this.name="ReadOnlyMustBeBoolean",this.message="Read only value must be a boolean.",this.status=c}}class Te extends Error{constructor(...e){super(...e),this.name="ReadOnlyParamNotAllowed",this.message="Read only parameter not allowed when revoking access to a database.",this.status=c}}class ke extends Error{constructor(e,...t){super(e,...t),this.name="ResharingAllowedParamNotAllowed",this.message="Resharing allowed parameter not allowed ".concat(e,"."),this.status=c}}class De extends Error{constructor(...e){super(...e),this.name="ResharingAllowedMustBeBoolean",this.message="Resharing allowed value must be a boolean.",this.status=c}}class Ke extends Error{constructor(e,...t){super(e,...t),this.name="ResharingNotAllowed",this.message="Resharing not allowed. ".concat(e,"."),this.status=h}}class xe extends Error{constructor(...e){super(...e),this.name="ResharingWithWriteAccessNotAllowed",this.message="Resharing with write access not allowed. Must have permission to write to the database to reshare the database with write access another user.",this.status=h}}class Re extends Error{constructor(...e){super(...e),this.name="SharingWithSelfNotAllowed",this.message="Sharing database with self is not allowed. Must share database with another user.",this.status=c}}class Oe extends Error{constructor(...e){super(...e),this.name="ModifyingOwnPermissionsNotAllowed",this.message="Modifying own database permissions not allowed. Must modify another user's permissions.",this.status=c}}class Ce extends Error{constructor(...e){super(...e),this.name="ModifyingOwnerPermissionsNotAllowed",this.message="Modifying the owner of a database's permissions is not allowed.",this.status=h}}class _e extends Error{constructor(...e){super(...e),this.name="ModifyingPermissionsNotAllowed",this.message="Modifying another user's permissions is not allowed. Must have permission to reshare the database with another user.",this.status=h}}class Fe extends Error{constructor(...e){super(...e),this.name="GrantingWriteAccessNotAllowed",this.message="Granting write access not allowed. Must have permission to write to the database to grant write access to another user.",this.status=h}}class Le extends Error{constructor(...e){super(...e),this.name="RequireVerifiedMustBeBoolean",this.message="Require verified value must be a boolean.",this.status=c}}class je extends Error{constructor(...e){super(...e),this.name="RequireVerifiedParamNotNecessary",this.message="Require verified parameter not necessary when sharing database without a username.",this.status=c}}class qe extends Error{constructor(...e){super(...e),this.name="RevokeMustBeBoolean",this.message="Revoke value must be a boolean.",this.status=c}}class Ve extends Error{constructor(...e){super(...e),this.name="ItemMissing",this.message="Item missing.",this.status=c}}class He extends Error{constructor(...e){super(...e),this.name="ItemInvalid",this.message="Item must be serializable to JSON.",this.status=c}}class Ge extends Error{constructor(e,...t){super(e,...t),this.name="ItemTooLarge",this.message="Item must be less than ".concat(e," KB."),this.status=c}}class Je extends Error{constructor(...e){super(...e),this.name="ItemIdMustBeString",this.message="Item id must be a string.",this.status=c}}class We extends Error{constructor(e,...t){super(e,...t),this.name="ItemIdTooLong",this.message="Item id cannot be more than ".concat(e," characters."),this.status=c}}class Ye extends Error{constructor(...e){super(...e),this.name="ItemIdMissing",this.message="Item id missing.",this.status=c}}class ze extends Error{constructor(...e){super(...e),this.name="ItemIdCannotBeBlank",this.message="Item id cannot be blank.",this.status=c}}class Ze extends Error{constructor(...e){super(...e),this.name="ItemAlreadyExists",this.message="Item with the same id already exists.",this.status=f}}class Xe extends Error{constructor(...e){super(...e),this.name="ItemDoesNotExist",this.message="Item with the provided id does not exist.",this.status=l}}class Qe extends Error{constructor(...e){super(...e),this.name="ItemUpdateConflict",this.message="Item update conflict.",this.status=f}}class $e extends Error{constructor(...e){super(...e),this.name="FileMissing",this.message="File missing.",this.status=c}}class et extends Error{constructor(...e){super(...e),this.name="FileMustBeFile",this.message="File must be a file.",this.status=c}}class tt extends Error{constructor(...e){super(...e),this.name="FileCannotBeEmpty",this.message="File cannot be empty.",this.status=c}}class st extends Error{constructor(...e){super(...e),this.name="FileUploadConflict",this.message="File upload conflict.",this.status=f}}class at extends Error{constructor(...e){super(...e),this.name="FileNotFound",this.message="File not found.",this.status=l}}class rt extends Error{constructor(...e){super(...e),this.name="FileIdMissing",this.message="File id missing.",this.status=c}}class nt extends Error{constructor(...e){super(...e),this.name="FileIdMustBeString",this.message="File id must be a string.",this.status=c}}class it extends Error{constructor(...e){super(...e),this.name="FileIdCannotBeBlank",this.message="File id cannot be blank.",this.status=c}}class ot extends Error{constructor(e,...t){super(e,...t),this.name="FileIdTooLong",this.message="File id cannot be more than ".concat(e," characters."),this.status=c}}class ct extends Error{constructor(...e){super(...e),this.name="RangeMustBeObject",this.message="Range param provided must be object.",this.status=c}}class ut extends Error{constructor(...e){super(...e),this.name="RangeMissingStart",this.message="Range param missing start.",this.status=c}}class dt extends Error{constructor(...e){super(...e),this.name="RangeMissingEnd",this.message="Range param missing end.",this.status=c}}class ht extends Error{constructor(...e){super(...e),this.name="RangeStartMustBeNumber",this.message="Range start provided must be a number.",this.status=c}}class lt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeNumber",this.message="Range end provided must be a number.",this.status=c}}class ft extends Error{constructor(...e){super(...e),this.name="RangeStartMustBeGreaterThanZero",this.message="Range start provided must be greater than 0.",this.status=c}}class mt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeGreaterThanRangeStart",this.message="Range end provided must be greater than range start.",this.status=c}}class pt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeLessThanFileSize",this.message="Range end provided must be less than file size.",this.status=c}}class wt extends Error{constructor(...e){super(...e),this.name="OperationsMissing",this.message="Operations missing.",this.status=c}}class gt extends Error{constructor(...e){super(...e),this.name="OperationsMustBeArray",this.message="Operations provided must be an array.",this.status=c}}class yt extends Error{constructor(e,...t){super(e,...t),this.name="CommandNotRecognized",this.message="Command '".concat(e,"' not recognized."),this.status=c}}class bt extends Error{constructor(...e){super(...e),this.name="OperationsConflict",this.message="Operations conflict. Only allowed 1 operation per item.",this.status=f}}class vt extends Error{constructor(e,...t){super(e,...t),this.name="OperationsExceedLimit",this.message="Operations exceed limit. Only allowed ".concat(e," operations."),this.status=c}}class Mt extends Error{constructor(...e){super(...e),this.name="UserNotVerified",this.message="User not verified. Either verify user before sharing database, or set requireVerified to false.",this.status=h}}class St extends Error{constructor(...e){super(...e),this.name="UserMustBeReverified",this.message="User must be reverified.",this.status=h}}class It extends Error{constructor(...e){super(...e),this.name="UserUnableToReceiveDatabase",this.message="User unable to receive database. User must sign in with an updated userbase-js client to be able to receive database.",this.status=h}}class Pt extends Error{constructor(...e){super(...e),this.name="VerificationMessageMissing",this.message="Verification message missing.",this.status=c}}class Et extends Error{constructor(...e){super(...e),this.name="VerificationMessageCannotBeBlank",this.message="Verification message cannot be blank.",this.status=c}}class Bt extends Error{constructor(...e){super(...e),this.name="VerificationMessageMustBeString",this.message="Verification message must be a string.",this.status=c}}class Nt extends Error{constructor(e,...t){super(e,...t),this.name="VerificationMessageInvalid",this.message="Verification message invalid.",this.status=c}}class Ut extends Error{constructor(e,...t){super(e,...t),this.name="VerifyingSelfNotAllowed",this.message="Verifying self not allowed. Can only verify other users.",this.status=c}}class At extends Error{constructor(...e){super(...e),this.name="ProgressHandlerMustBeFunction",this.message="Progress handler must be a function.",this.status=c}}class Tt extends Error{constructor(e,...t){super(e,...t),this.name="TransactionUnauthorized",this.message="Calling '".concat(e,"' on this item is unauthorized."),this.status=h}}class kt extends Error{constructor(e,...t){super(e,...t),this.name="WriteAccessParamNotAllowed",this.message="Write access parameter not allowed. Only the item creator or database owner can change an item's write access settings.",this.status=h}}var Dt={DatabaseNameMissing:oe,DatabaseNameCannotBeBlank:ce,DatabaseNameMustBeString:ue,DatabaseNameTooLong:de,DatabaseNameRestricted:he,DatabaseNotFound:ye,DatabaseIsReadOnly:be,DatabaseAlreadyOpening:le,DatabaseIdMustBeString:ve,DatabaseIdCannotBeBlank:Me,DatabaseIdNotAllowed:Se,DatabaseIdNotAllowedForOwnDatabase:Ie,DatabaseIdInvalidLength:Pe,ShareTokenInvalid:Ee,ShareTokenNotFound:Be,ShareTokenNotAllowed:Ne,ShareTokenNotAllowedForOwnDatabase:Ue,ReadOnlyMustBeBoolean:Ae,ReadOnlyParamNotAllowed:Te,ResharingAllowedMustBeBoolean:De,ResharingNotAllowed:Ke,ResharingWithWriteAccessNotAllowed:xe,ResharingAllowedParamNotAllowed:ke,SharingWithSelfNotAllowed:Re,ModifyingOwnPermissionsNotAllowed:Oe,ModifyingOwnerPermissionsNotAllowed:Ce,ModifyingPermissionsNotAllowed:_e,GrantingWriteAccessNotAllowed:Fe,RequireVerifiedMustBeBoolean:Le,RequireVerifiedParamNotNecessary:je,RevokeMustBeBoolean:qe,ChangeHandlerMissing:fe,ChangeHandlerMustBeFunction:me,EncryptionModeNotValid:pe,ServerSideEncryptionNotEnabledInClient:we,DatabaseNotOpen:ge,ItemMissing:Ve,ItemInvalid:He,ItemTooLarge:Ge,ItemIdMustBeString:Je,ItemIdTooLong:We,ItemIdMissing:Ye,ItemIdCannotBeBlank:ze,ItemAlreadyExists:Ze,ItemDoesNotExist:Xe,ItemUpdateConflict:Qe,FileMissing:$e,FileMustBeFile:et,FileCannotBeEmpty:tt,FileUploadConflict:st,FileNotFound:at,FileIdMissing:rt,FileIdMustBeString:nt,FileIdCannotBeBlank:it,FileIdTooLong:ot,RangeMustBeObject:ct,RangeMissingStart:ut,RangeMissingEnd:dt,RangeStartMustBeNumber:ht,RangeEndMustBeNumber:lt,RangeStartMustBeGreaterThanZero:ft,RangeEndMustBeGreaterThanRangeStart:mt,RangeEndMustBeLessThanFileSize:pt,OperationsMissing:wt,OperationsMustBeArray:gt,OperationsConflict:bt,OperationsExceedLimit:vt,CommandNotRecognized:yt,UserNotVerified:Mt,UserMustBeReverified:St,UserUnableToReceiveDatabase:It,VerificationMessageMissing:Pt,VerificationMessageMustBeString:Bt,VerificationMessageCannotBeBlank:Et,VerificationMessageInvalid:Nt,VerifyingSelfNotAllowed:Ut,ProgressHandlerMustBeFunction:At,TransactionUnauthorized:Tt,WriteAccessParamNotAllowed:kt};class Kt extends Error{constructor(e,...t){super(e,...t),this.name="AppIdAlreadySet",this.message="Application ID already set.",this.status=f,this.appId=e}}class xt extends Error{constructor(...e){super(...e),this.name="AppIdMustBeString",this.message="Application ID must be a string.",this.status=c}}class Rt extends Error{constructor(...e){super(...e),this.name="AppIdMissing",this.message="Application ID missing.",this.status=c}}class Ot extends Error{constructor(...e){super(...e),this.name="AppIdCannotBeBlank",this.message="Application ID cannot be blank.",this.status=c}}class Ct extends Error{constructor(...e){super(...e),this.name="WebCryptoUnavailable",this.message="The WebCrypto API is unavailable. Please make sure your website uses https.",this.status=c}}class _t extends Error{constructor(...e){super(...e),this.name="UpdateUserHandlerMustBeFunction",this.message="Update user handler must be a function.",this.status=c}}var Ft={AppIdAlreadySet:Kt,AppIdMustBeString:xt,AppIdMissing:Rt,AppIdCannotBeBlank:Ot,WebCryptoUnavailable:Ct,UpdateUserHandlerMustBeFunction:_t};class Lt extends Error{constructor(...e){super(...e),this.name="SuccessUrlMissing",this.message="Success url missing to let Stripe know where to redirect users on successful payment.",this.status=c}}class jt extends Error{constructor(...e){super(...e),this.name="SuccessUrlMustBeString",this.message="Success url must be a string.",this.status=c}}class qt extends Error{constructor(e,...t){super(e,...t),this.name="SuccessUrlInvalid",this.message=e?"Success url must start with http or https.":"Success url invalid.",this.status=c}}class Vt extends Error{constructor(...e){super(...e),this.name="CancelUrlMissing",this.message="Cancel url missing to let Stripe know where to redirect users on canceled payment.",this.status=c}}class Ht extends Error{constructor(...e){super(...e),this.name="CancelUrlMustBeString",this.message="Cancel url must be a string.",this.status=c}}class Gt extends Error{constructor(e,...t){super(e,...t),this.name="CancelUrlInvalid",this.message=e?"Cancel url must start with http or https.":"Cancel url invalid.",this.status=c}}class Jt extends Error{constructor(...e){super(...e),this.name="StripeLibraryMissing",this.message="Stripe.js library missing. Be sure to include the script in your html file (https://stripe.com/docs/stripe-js#setup).",this.status=c}}class Wt extends Error{constructor(...e){super(...e),this.name="PaymentsDisabled",this.message="Payments on this app are disabled. Enable payments in the admin panel.",this.status=h}}class Yt extends Error{constructor(...e){super(...e),this.name="PriceIdOrPlanIdAllowed",this.message="Only one of priceId or planId allowed.",this.status=c}}class zt extends Error{constructor(...e){super(...e),this.name="PriceIdOrPlanIdMissing",this.message="Please provide a priceId or planId. You can create a product in the Stripe dashboard and find its priceId there.",this.status=c}}class Zt extends Error{constructor(...e){super(...e),this.name="SubscriptionPlanAlreadyPurchased",this.message="Subscription plan already purchased. Cancel subscription to purchase another.",this.status=f}}class Xt extends Error{constructor(...e){super(...e),this.name="StripeAccountNotConnected",this.message="Stripe account not connected. Connect a Stripe account in the admin panel.",this.status=h}}class Qt extends Error{constructor(...e){super(...e),this.name="SubscriptionNotFound",this.message="Subscription not found. User must purchase a subscription.",this.status=d}}class $t extends Error{constructor(e,...t){super(...t),this.name="SubscriptionInactive",this.message="The user's subscription is inactive.",this.subscriptionStatus=e,this.status=d}}class es extends Error{constructor(...e){super(...e),this.name="SubscriptionNotPurchased",this.message="Subscription not purchased. User must purchase a subscription.",this.status=d}}class ts extends Error{constructor(...e){super(...e),this.name="SubscriptionAlreadyCanceled",this.message="Subscription already canceled. User must purchase a new subscription.",this.status=c}}class ss extends Error{constructor(...e){super(...e),this.name="TrialExpired",this.message="Trial expired. User must purchase a subscription.",this.status=d}}class as extends Error{constructor(e,...t){super(e,...t);const{status:s,type:a,message:r}=e;this.name="StripeError",this.message=r,this.type=a,this.status=s}}var rs={SuccessUrlMissing:Lt,SuccessUrlMustBeString:jt,SuccessUrlInvalid:qt,CancelUrlMissing:Vt,CancelUrlMustBeString:Ht,CancelUrlInvalid:Gt,StripeJsLibraryMissing:Jt,PaymentsDisabled:Wt,PriceIdOrPlanIdAllowed:Yt,PriceIdOrPlanIdMissing:zt,SubscriptionPlanAlreadyPurchased:Zt,StripeAccountNotConnected:Xt,SubscriptionNotFound:Qt,SubscriptionInactive:$t,SubscriptionNotPurchased:es,SubscriptionAlreadyCanceled:ts,TrialExpired:ss,StripeError:as};function ns(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function is(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?ns(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):ns(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}class os extends Error{constructor(...e){super(...e),this.name="AppIdNotSet",this.message="App ID not set yet. Make sure to configure app ID.",this.status=c}}class cs extends Error{constructor(...e){super(...e),this.name="ServiceUnavailable",this.message="Service unavailable.",this.status=w}}class us extends Error{constructor(...e){super(...e),this.name="ParamsMustBeObject",this.message="Parameters passed to function must be placed inside an object.",this.status=c}}class ds extends Error{constructor(e,...t){super(e,...t);const s=Math.floor(e/1e3);this.name="TooManyRequests",this.message="Too many requests in a row. Please try again in ".concat(s," second").concat(1!==s?"s":"","."),this.status=m}}var hs=is(is(is(is(is({},ie),Dt),Ft),rs),{},{AppIdNotSet:os,InternalServerError:class extends cs{constructor(...e){super(...e),this.status=p}},ServiceUnavailable:cs,Timeout:class extends cs{constructor(...e){super(...e),this.status=g}},Reconnecting:class extends cs{constructor(...e){super(...e),this.message="Reconnecting."}},UnknownServiceUnavailable:class extends cs{constructor(e,...t){super(e,...t),console.error("Userbase error. Please report this to support@userbase.com.\n\n",e)}},ParamsMustBeObject:us,TooManyRequests:ds});let ls=null,fs=null,ms=!1;var ps="2.8.0",ws=()=>{if(!ls)throw new hs.AppIdNotSet;return ls},gs=()=>fs,ys=()=>window._userbaseEndpoint||"https://v1.userbase.com/v1",bs=({appId:e,updateUserHandler:t,allowServerSideEncryption:s})=>{if(ls&&ls!==e)throw new hs.AppIdAlreadySet(ls);ls=e,fs=t,ms=s},vs=e=>e?window._USERBASE_STRIPE_PRODUCTION_PUBLISHABLE_KEY||"pk_live_jI6lbsAIQlu2u4uTkDXFrSEW":window._USERBASE_STRIPE_TEST_PUBLISHABLE_KEY||"pk_test_rYANrLdNfdJXJ2d808wW4pqY",Ms=()=>ms;class Ss extends Error{constructor(e,t,s,...a){super(e,t,s,...a),this.response={data:e,status:t,statusText:s},this.message="Request failed with status code "+t}}class Is extends Error{constructor(e,...t){super(e,...t),this.message="timeout of ".concat(e,"ms exceeded")}}const Ps=(e,t,s,a=1e4)=>{e.timeout=a,e.onload=()=>((e,t,s)=>{let a;try{a=JSON.parse(e.response)}catch(t){a=e.response}e.status>=200&&e.status<300?t(a):s(new Ss(a,e.status,e.statusText))})(e,t,s),e.onerror=()=>s(new hs.ServiceUnavailable),e.ontimeout=()=>s(new Is(a))};var Es=(e,t,s,a,r,n,i,o,c)=>new Promise((u,d)=>{const h=new XMLHttpRequest,l="".concat(ys(),"/api/auth/sign-up?appId=").concat(ws(),"&userbaseJsVersion=").concat(ps),f=JSON.stringify({username:e,passwordToken:t,ecKeyData:s,passwordSalts:a,keySalts:r,email:n,profile:i,passwordBasedBackup:o,sessionLength:c});h.open("POST",l),h.setRequestHeader("Content-Type","application/json"),h.send(f),Ps(h,u,d)}),Bs=e=>new Promise((t,s)=>{const a=new XMLHttpRequest,r="".concat(ys(),"/api/auth/get-password-salts?appId=").concat(ws(),"&username=").concat(encodeURIComponent(e),"&userbaseJsVersion=").concat(ps);a.open("GET",r),a.send(),Ps(a,t,s)}),Ns=async(e,t,s)=>new Promise((a,r)=>{const n=new XMLHttpRequest,i="".concat(ys(),"/api/auth/sign-in?appId=").concat(ws(),"&userbaseJsVersion=").concat(ps),o=JSON.stringify({username:e,passwordToken:t,sessionLength:s});n.open("POST",i),n.setRequestHeader("Content-Type","application/json"),n.send(o),Ps(n,a,r)}),Us=(e,t)=>new Promise((s,a)=>{const r=new XMLHttpRequest,n="".concat(ys(),"/api/auth/sign-in-with-session?appId=").concat(ws(),"&sessionId=").concat(e,"&userbaseJsVersion=").concat(ps),i=JSON.stringify({sessionLength:t});r.open("POST",n),r.setRequestHeader("Content-Type","application/json"),r.send(i),Ps(r,s,a)}),As=async()=>new Promise((e,t)=>{const s=new XMLHttpRequest,a="".concat(ys(),"/api/auth/server-public-key?&userbaseJsVersion=").concat(ps);s.open("GET",a),s.responseType="arraybuffer",s.send(),Ps(s,e,t)}),Ts=e=>new Promise((t,s)=>{const a=new XMLHttpRequest,r="".concat(ys(),"/api/public-key?appId=").concat(ws(),"&username=").concat(encodeURIComponent(e),"&userbaseJsVersion=").concat(ps);a.open("GET",r),a.send(),Ps(a,t,s)}),ks=s(2),Ds=s.n(ks);function Ks(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function xs(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Ks(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Ks(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const Rs=e=>(...t)=>{try{return e(...t)}catch(e){console.warn("Error accessing browser storage. Defaulting to memory.\n\n",e)}},Os=(e,t)=>"userbaseSeed.".concat(e,".").concat(t),Cs=Rs((e,t,s,a,r,n)=>{const i={username:t,signedIn:s,sessionId:a,creationDate:r,expirationDate:n},o=JSON.stringify(i);"local"===e?localStorage.setItem("userbaseCurrentSession",o):"session"===e&&sessionStorage.setItem("userbaseCurrentSession",o)});var _s={signInSession:(e,t,s,a,r)=>{Cs(e,t,!0,s,a,r)},signOutSession:(e,t)=>{Cs(e,t,!1)},getCurrentSession:Rs(()=>{const e=sessionStorage.getItem("userbaseCurrentSession");if(e){if(!JSON.parse(e).signedIn){const e=localStorage.getItem("userbaseCurrentSession");if(e){const t=JSON.parse(e);if(t.signedIn)return xs(xs({},t),{},{rememberMe:"local"})}}return xs(xs({},JSON.parse(e)),{},{rememberMe:"session"})}const t=localStorage.getItem("userbaseCurrentSession");return t&&xs(xs({},JSON.parse(t)),{},{rememberMe:"local"})}),saveSeedString:Rs((e,t,s,a)=>{"local"===e?localStorage.setItem(Os(t,s),a):"session"===e&&sessionStorage.setItem(Os(t,s),a)}),removeSeedString:Rs((e,t)=>{const s=Os(e,t);sessionStorage.removeItem(s),localStorage.removeItem(s)}),getSeedString:Rs((e,t)=>{const s=Os(e,t);return sessionStorage.getItem(s)||localStorage.getItem(s)}),removeCurrentSession:Rs(()=>{sessionStorage.removeItem("userbaseCurrentSession"),localStorage.removeItem("userbaseCurrentSession")})};const Fs=(e,t)=>{const s=t?new Uint8Array(e):new Uint16Array(e),a=s.length;let r="",n=10240;for(var i=0;i<a;i+=n){i+n>a&&(n=a-i);const e=s.subarray(i,i+n);r+=String.fromCharCode.apply(null,e)}return r},Ls=(e,t=!1)=>{let s=new ArrayBuffer(e.length*(t?1:2)),a=t?new Uint8Array(s):new Uint16Array(s);for(let t=0,s=e.length;t<s;t++)a[t]=e.charCodeAt(t);return s},js=(e,t)=>{const s=new Uint8Array(e.byteLength+t.byteLength);return s.set(new Uint8Array(e),0),s.set(new Uint8Array(t),e.byteLength),s.buffer},qs=async e=>await window.crypto.subtle.digest({name:"SHA-256"},e);var Vs={BYTE_SIZE:32,HASH_ALGORITHM_NAME:"SHA-256",hash:qs,hashBase64String:async e=>{const t=i.a.decode(e),s=await qs(t);return i.a.encode(s)},hashString:async e=>{const t=Ls(e),s=await qs(t);return i.a.encode(s)}};const Hs=["deriveKey","deriveBits"],Gs=async e=>await window.crypto.subtle.importKey("raw",e,{name:"HKDF"},!1,Hs),Js=Vs.BYTE_SIZE,Ws=(e,t)=>({name:"HKDF",info:Ls(e),hash:Vs.HASH_ALGORITHM_NAME,salt:t});var Ys={importHkdfKeyFromString:async e=>{const t=Ls(e);return await Gs(t)},importHkdfKey:Gs,generateSalt:()=>window.crypto.getRandomValues(new Uint8Array(Js)),getParams:Ws,getPasswordToken:async(e,t)=>{const s=await window.crypto.subtle.deriveBits(Ws("password-token",t),e,256);return i.a.encode(s)}};const zs=["encrypt","decrypt"],Zs=()=>"undefined"!=typeof window?window:self,Xs=()=>({name:"AES-GCM",length:256}),Qs=e=>({name:"AES-GCM",tagLength:128,iv:e}),$s=()=>window.crypto.getRandomValues(new Uint8Array(12)),ea=e=>{const t=e.byteLength-12;return{ciphertextArrayBuffer:e.slice(0,t),iv:e.slice(t)}},ta=async()=>await window.crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,zs),sa=async e=>await Zs().crypto.subtle.importKey("raw",e,{name:"AES-GCM"},!0,zs),aa=async e=>await Zs().crypto.subtle.exportKey("raw",e),ra=async(e,t)=>{const s=$s(),a=await Zs().crypto.subtle.encrypt(Qs(s),e,t);return js(a,s)},na=async(e,t)=>{const s=Ls(t),a=await ra(e,s);return i.a.encode(a)},ia=async(e,t)=>{const{ciphertextArrayBuffer:s,iv:a}=ea(t);return await Zs().crypto.subtle.decrypt(Qs(a),e,s)},oa=async(e,t)=>{const s=i.a.decode(t),a=await ia(e,s);return Fs(a)};var ca={getEncryptionKeyParams:Xs,getCiphertextParams:Qs,generateIv:$s,sliceEncryptedArrayBuffer:ea,importKeyFromMaster:async(e,t,s="encryption")=>await window.crypto.subtle.deriveKey(Ys.getParams(s,t),e,{name:"AES-GCM",length:256},!0,zs),generateKey:ta,getKeyStringFromKey:async e=>{const t=await window.crypto.subtle.exportKey("raw",e);return i.a.encode(t)},getKeyFromKeyString:async e=>{const t=i.a.decode(e);return await sa(t)},getRawKeyFromKey:aa,getKeyFromRawKey:sa,encrypt:ra,encryptJson:async(e,t)=>{const s=JSON.stringify(t);return await na(e,s)},encryptString:na,decrypt:ia,decryptJson:async(e,t)=>{const s=await oa(e,t);return JSON.parse(s)},decryptString:oa,getPasswordBasedEncryptionKey:async(e,t)=>await window.crypto.subtle.deriveKey(Ys.getParams("password-based-encryption",t),e,{name:"AES-GCM",length:256},!1,zs),generateAndEncryptKeyEncryptionKey:async e=>{const t=await ta(),s=await aa(t);return[t,await ra(e,s)]},RAW_KEY_TYPE:"raw",KEY_WILL_BE_USED_TO:zs},ua=s(10),da=s.n(ua);const ha=["encrypt"],la=(e=>{if(e.length%2!=0)throw new Error("Hex string must be even length");const t=e.length/2,s=[];for(let a=0;a<t;a++){const t=2*a,r=e.substring(t,t+2),n=parseInt(r,16);s.push(n)}return new Uint8Array(s)})("ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"),fa=[2];let ma=null;const pa=e=>((e,t)=>(e.setPrivateKey(t),e.generateKeys(),e))(da.a.createDiffieHellman(la,fa),e),wa=async(e,t)=>{const s=pa(e).computeSecret(t),a=await Vs.hash(s);return await ca.getKeyFromRawKey(a)};var ga={getPublicKey:e=>pa(e).getPublicKey(),getSharedKey:wa,getSharedKeyWithServer:async e=>await wa(e,new Uint8Array(await(async()=>ma||(ma=await As(),ma))())),importKeyFromMaster:async(e,t)=>{const s=await window.crypto.subtle.deriveKey(Ys.getParams("diffie-hellman",t),e,ca.getEncryptionKeyParams(),!0,ha);return await ca.getRawKeyFromKey(s)}};const ya=["sign","verify"],ba=["sign"],va=["verify"],Ma={name:"ECDSA",namedCurve:"P-256"},Sa={name:"ECDSA",hash:{name:Vs.HASH_ALGORITHM_NAME}},Ia=async e=>await window.crypto.subtle.exportKey("spki",e),Pa=async e=>{const t=await Ia(e);return i.a.encode(t)},Ea=async(e,t)=>await ca.importKeyFromMaster(e,t,"ecdsa-key-encryption-key"),Ba=async(e,t)=>await window.crypto.subtle.sign(Sa,e,t),Na=async(e,t,s)=>await window.crypto.subtle.verify(Sa,e,t,s);var Ua={generateEcdsaKeyData:async e=>{const t=await(async()=>await window.crypto.subtle.generateKey(Ma,!0,ya))(),s=Ys.generateSalt(),a=await Ea(e,s),r=await(async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);return Ls(JSON.stringify(t))})(t.privateKey),n=await ca.encrypt(a,r);return{ecdsaPrivateKey:t.privateKey,ecdsaPublicKey:await Pa(t.publicKey),encryptedEcdsaPrivateKey:i.a.encode(n),ecdsaKeyEncryptionKeySalt:i.a.encode(s)}},importEcdsaKeyEncryptionKeyFromMaster:Ea,getPrivateKeyFromRawPrivateKey:async e=>{const t=JSON.parse(Fs(e));return await window.crypto.subtle.importKey("jwk",t,Ma,!0,ba)},getPublicKeyFromRawPublicKey:async e=>await window.crypto.subtle.importKey("spki",e,Ma,!0,va),getRawPublicKeyFromPublicKey:Ia,getPublicKeyStringFromPublicKey:Pa,getPublicKeyFromPrivateKey:async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);delete t.d,t.key_ops=va;return await window.crypto.subtle.importKey("jwk",t,Ma,!0,va)},sign:Ba,signString:async(e,t)=>{const s=Ls(t),a=await Ba(e,s);return i.a.encode(a)},verify:Na,verifyString:async(e,t,s)=>{const a=Ls(s),r=i.a.decode(t);return await Na(e,r,a)}};const Aa=["deriveKey","deriveBits"],Ta={name:"ECDH",namedCurve:"P-256"},ka=async()=>await window.crypto.subtle.generateKey(Ta,!0,Aa),Da=async e=>await window.crypto.subtle.exportKey("spki",e),Ka=async(e,t)=>await ca.importKeyFromMaster(e,t,"ecdh-key-encryption-key");var xa={generateKeyPair:ka,generateEcdhKeyData:async(e,t)=>{const s=await ka(),a=Ys.generateSalt(),r=await Ka(e,a),n=await(async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);return Ls(JSON.stringify(t))})(s.privateKey),o=await ca.encrypt(r,n),c=await Da(s.publicKey),u=await Ua.sign(t,c);return{ecdhPrivateKey:s.privateKey,ecdhPublicKey:i.a.encode(c),encryptedEcdhPrivateKey:i.a.encode(o),signedEcdhPublicKey:i.a.encode(u),ecdhKeyEncryptionKeySalt:i.a.encode(a)}},importEcdhKeyEncryptionKeyFromMaster:Ka,getPrivateKeyFromRawPrivateKey:async e=>{const t=JSON.parse(Fs(e));return await window.crypto.subtle.importKey("jwk",t,Ta,!0,Aa)},getRawPublicKeyFromPublicKey:Da,getPublicKeyFromRawPublicKey:async e=>await window.crypto.subtle.importKey("spki",e,Ta,!0,[]),computeSharedKeyEncryptionKey:async(e,t)=>await window.crypto.subtle.deriveKey({name:"ECDH",namedCurve:"P-256",public:e},t,ca.getEncryptionKeyParams(),!1,ca.KEY_WILL_BE_USED_TO)};const Ra=["sign"],Oa=["sign","verify"],Ca=async(e,t)=>await window.crypto.subtle.sign({name:"HMAC"},e,t);var _a={importKeyFromMaster:async(e,t)=>await window.crypto.subtle.deriveKey(Ys.getParams("authentication",t),e,{name:"HMAC",hash:{name:Vs.HASH_ALGORITHM_NAME},length:512},!1,Ra),importKeyFromRawBits:async e=>await window.crypto.subtle.importKey("raw",e,{name:"HMAC",hash:{name:Vs.HASH_ALGORITHM_NAME},length:256},!1,Oa),sign:Ca,signString:async(e,t)=>{const s=await Ca(e,Ls(t));return i.a.encode(s)}},Fa=s(11),La=s.n(Fa);var ja={generateSeed:()=>window.crypto.getRandomValues(new Uint8Array(32)),aesGcm:ca,diffieHellman:ga,ecdsa:Ua,ecdh:xa,sha256:Vs,hmac:_a,hkdf:Ys,scrypt:{generateSalt:()=>window.crypto.getRandomValues(new Uint8Array(16)),hash:async(e,t,s=La.a.scrypt)=>{const a=new Uint8Array(Ls(e)),r=await s(a,t,16384,8,1,32);return i.a.encode(r)}}};const qa=e=>e.split(":")[0],Va=e=>{const t=(e=>"http://"===e.substring(0,"http://".length)?e.substring("http://".length):"https://"===e.substring(0,"https://".length)?e.substring("https://".length):e)(e);return("https"===qa(e)?"wss://":"ws://")+t},Ha=e=>2*e.length,Ga=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function Ja(){let e=[],t=0;this.getLength=()=>e.length-t,this.isEmpty=()=>0===e.length,this.enqueue=t=>(e.push(t),this.getLength()),this.dequeue=()=>{const s=e[t];return t+=1,2*t>e.length&&(e=e.slice(t),t=0),s},this.peek=()=>e[t]}const Wa=()=>{const e=URL.createObjectURL(new Blob(["(",function(){self.onmessage=function(e){const{compress:t,decompress:s,data:a}=e.data,r=function(){function e(e,t){if(!r[e]){r[e]={};for(var s=0;s<e.length;s++)r[e][e.charAt(s)]=s}return r[e][t]}var t=String.fromCharCode,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",r={},n={compressToBase64:function(e){if(null==e)return"";var t=n._compress(e,6,(function(e){return s.charAt(e)}));switch(t.length%4){default:case 0:return t;case 1:return t+"===";case 2:return t+"==";case 3:return t+"="}},decompressFromBase64:function(t){return null==t?"":""==t?null:n._decompress(t.length,32,(function(a){return e(s,t.charAt(a))}))},compressToUTF16:function(e){return null==e?"":n._compress(e,15,(function(e){return t(e+32)}))+" "},decompressFromUTF16:function(e){return null==e?"":""==e?null:n._decompress(e.length,16384,(function(t){return e.charCodeAt(t)-32}))},compressToUint8Array:function(e){for(var t=n.compress(e),s=new Uint8Array(2*t.length),a=0,r=t.length;r>a;a++){var i=t.charCodeAt(a);s[2*a]=i>>>8,s[2*a+1]=i%256}return s},decompressFromUint8Array:function(e){if(null==e)return n.decompress(e);for(var s=new Array(e.length/2),a=0,r=s.length;r>a;a++)s[a]=256*e[2*a]+e[2*a+1];var i=[];return s.forEach((function(e){i.push(t(e))})),n.decompress(i.join(""))},compressToEncodedURIComponent:function(e){return null==e?"":n._compress(e,6,(function(e){return a.charAt(e)}))},decompressFromEncodedURIComponent:function(t){return null==t?"":""==t?null:(t=t.replace(/ /g,"+"),n._decompress(t.length,32,(function(s){return e(a,t.charAt(s))})))},compress:function(e){return n._compress(e,16,(function(e){return t(e)}))},_compress:function(e,t,s){if(null==e)return"";var a,r,n,i={},o={},c="",u="",d="",h=2,l=3,f=2,m=[],p=0,w=0;for(n=0;n<e.length;n+=1)if(c=e.charAt(n),Object.prototype.hasOwnProperty.call(i,c)||(i[c]=l++,o[c]=!0),u=d+c,Object.prototype.hasOwnProperty.call(i,u))d=u;else{if(Object.prototype.hasOwnProperty.call(o,d)){if(d.charCodeAt(0)<256){for(a=0;f>a;a++)p<<=1,w==t-1?(w=0,m.push(s(p)),p=0):w++;for(r=d.charCodeAt(0),a=0;8>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}else{for(r=1,a=0;f>a;a++)p=p<<1|r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r=0;for(r=d.charCodeAt(0),a=0;16>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}0==--h&&(h=Math.pow(2,f),f++),delete o[d]}else for(r=i[d],a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;0==--h&&(h=Math.pow(2,f),f++),i[u]=l++,d=String(c)}if(""!==d){if(Object.prototype.hasOwnProperty.call(o,d)){if(d.charCodeAt(0)<256){for(a=0;f>a;a++)p<<=1,w==t-1?(w=0,m.push(s(p)),p=0):w++;for(r=d.charCodeAt(0),a=0;8>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}else{for(r=1,a=0;f>a;a++)p=p<<1|r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r=0;for(r=d.charCodeAt(0),a=0;16>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}0==--h&&(h=Math.pow(2,f),f++),delete o[d]}else for(r=i[d],a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;0==--h&&(h=Math.pow(2,f),f++)}for(r=2,a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;for(;;){if(p<<=1,w==t-1){m.push(s(p));break}w++}return m.join("")},decompress:function(e){return null==e?"":""==e?null:n._decompress(e.length,32768,(function(t){return e.charCodeAt(t)}))},_decompress:function(e,s,a){var r,n,i,o,c,u,d,h=[],l=4,f=4,m=3,p="",w=[],g={val:a(0),position:s,index:1};for(r=0;3>r;r+=1)h[r]=r;for(i=0,c=Math.pow(2,2),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;switch(i){case 0:for(i=0,c=Math.pow(2,8),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;d=t(i);break;case 1:for(i=0,c=Math.pow(2,16),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;d=t(i);break;case 2:return""}for(h[3]=d,n=d,w.push(d);;){if(g.index>e)return"";for(i=0,c=Math.pow(2,m),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;switch(d=i){case 0:for(i=0,c=Math.pow(2,8),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;h[f++]=t(i),d=f-1,l--;break;case 1:for(i=0,c=Math.pow(2,16),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;h[f++]=t(i),d=f-1,l--;break;case 2:return w.join("")}if(0==l&&(l=Math.pow(2,m),m++),h[d])p=h[d];else{if(d!==f)return null;p=n+n.charAt(0)}w.push(p),h[f++]=n+p.charAt(0),n=p,0==--l&&(l=Math.pow(2,m),m++)}}};return n}();t?postMessage(r.compress(a)):s&&postMessage(r.decompress(a))}}.toString(),")()"],{type:"application/javascript"})),t=new Worker(e);return URL.revokeObjectURL(e),t},Ya=async e=>{const t=Wa();return new Promise(s=>{t.onmessage=e=>{s(e.data),t.terminate()},t.postMessage({compress:!0,data:e})})},za=async e=>{const t=Wa();return new Promise(s=>{t.onmessage=e=>{s(e.data),t.terminate()},t.postMessage({decompress:!0,data:e})})},Za=async(e,t,s,a,r,n)=>new Promise((i,o)=>{const c=new XMLHttpRequest,u="".concat(ys(),"/api/bundle-chunk?userbaseJsVersion=").concat(ps,"&")+"userId=".concat(e,"&")+"databaseId=".concat(t,"&")+"seqNo=".concat(s,"&")+"bundleId=".concat(a,"&")+"chunkNumber=".concat(r);c.open("POST",u),c.send(new Uint8Array(n)),Ps(c,i,o,3e4)});function Xa(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function Qa(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Xa(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Xa(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const $a=Ds()();class er extends Error{constructor(e,t,...s){super(...s),this.name="RequestFailed: ".concat(e),this.message=t.message,this.status=t.status||"timeout"===t.message&&g,this.response=t.status&&t}}class tr extends Error{constructor(e,t,s,...a){super(...a),this.name="WebSocket error",this.message=e,this.username=t,this.e=s}}var sr=new class{constructor(){this.init()}init(e,t,s,a,r,n,i,o){this.pingTimeout&&clearTimeout(this.pingTimeout);for(const e of Object.keys(this))delete this[e];this.ws=null,this.connected=!1,this.resolveConnection=e,this.rejectConnection=t,this.connectionResolved=!1,this.session={username:s&&s.username,sessionId:s&&s.sessionId,creationDate:s&&s.creationDate,expirationDate:s&&s.expirationDate,userId:s&&s.userId,authToken:s&&s.authToken},this.seedString=a,this.changePassword=n,this.keys={init:!1,salts:{}},this.userData={stripeData:{}},this.rememberMe=r,this.requests={},this.state=i||{dbNameToHash:{},databases:{},databasesByDbId:{},shareTokenIdToDbId:{}},this.encryptionMode=o}connect(e,t=null,s,a,r,n){if(this.connected)throw new tr("Web Socket already connected",this.session.username);return new Promise((i,c)=>{let u=!1;const d=setTimeout(()=>{this.connected||this.reconnecting||(u=!0,c(new tr("timeout")))},1e4),h="".concat(Va(ys()),"/api?appId=").concat(ws(),"&sessionId=").concat(e.sessionId,"&clientId=").concat($a,"&userbaseJsVersion=").concat(ps),l=new WebSocket(h);l.onopen=async()=>{u||clearTimeout(d)},l.onmessage=async r=>{if(!u)try{const u=JSON.parse(r.data);switch(u.route){case"Ping":{this.heartbeat();const e="Pong";this.ws.send(JSON.stringify({action:e}));break}case"Connection":{const{encryptionMode:o}=u;if(this.init(i,c,e,t,s,a,n,o),this.ws=l,this.heartbeat(),this.connected=!0,t){const{keySalts:e,validationMessage:t,ecKeyData:s,encryptedValidationMessage:a}=u;this.keys.salts=e,this.validationMessage=t,this.ecKeyData=s,a&&(this.encryptedValidationMessage=new Uint8Array(a.data));try{await this.setKeys(this.seedString);const e=await this.validateKey();this.userData=e}catch(r){throw r&&"OperationError"===r.name||r instanceof DOMException?new Error("Invalid seed"):r}this.keys.init=!0}this.resolveConnection(),this.connectionResolved=!0;break}case"ApplyTransactions":{const e=u.dbId,t=u.dbNameHash,s=u.isOwner?this.state.databases[t]:this.state.databasesByDbId[e];if(!s)throw new Error("Missing database");s.applyTransactionsQueue.isEmpty()?s.applyTransactionsQueue.enqueue(null):await new Promise(e=>{const t=e;s.applyTransactionsQueue.enqueue(t)});if((u.dbNameHash&&(u.dbKey||u.plaintextDbKey)||u.shareTokenEncryptedDbKey)&&(!s.dbKeyString||!s.dbKey)){const e=u.plaintextDbKey||(u.dbKey?await ja.aesGcm.decryptString(this.keys.encryptionKey,u.dbKey):await s.decryptShareTokenEncryptedDbKey(u.shareTokenEncryptedDbKey,u.shareTokenEncryptionKeySalt));s.dbKeyString=e,s.dbKey=await ja.aesGcm.getKeyFromKeyString(e)}if(!s.dbKey)throw new Error("Missing db key");if(u.writers){s.attributionEnabled=!0;for(const{userId:e,username:t}of u.writers)s.usernamesByUserId.set(e,t)}if(u.waitForFullBundle){s.finishedWaitingForBundle||await new Promise(e=>s.finishedWaitingForBundle=e);try{const e=await this.rebuildBundle(s,u.bundleSeqNo,u.encryptedBundleEncryptionKey);await s.applyBundle(e,u.bundleSeqNo)}catch(r){throw window.alert("Oops! Something went wrong. Please contact the site administrator with this issue (".concat(e,").\n\n")+r),r}}const a=u.transactionLog;if(await s.applyTransactions(a,u.ownerId,e,t),u.buildBundle&&this.buildBundle(s),s.applyTransactionsQueue.dequeue(),!s.applyTransactionsQueue.isEmpty()){s.applyTransactionsQueue.peek()()}break}case"DownloadBundleChunk":{const{dbId:e,dbNameHash:t,isOwner:s,bundleSeqNo:a,isFirstChunk:r,isLastChunk:n,chunk:i}=u,o=s?this.state.databases[t]:this.state.databasesByDbId[e];if(!o)throw new Error("Missing database");r&&(o.bundleChunks[a]=[]),o.bundleChunks[a].push(i),n&&(o.finishedWaitingForBundle?o.finishedWaitingForBundle():o.finishedWaitingForBundle=!0);break}case"UpdatedUser":this.handleUpdateUser(u.updatedUser);break;case"SignOut":case"UpdateUser":case"DeleteUser":case"CreateDatabase":case"OpenDatabase":case"OpenDatabaseByDatabaseId":case"GetDatabases":case"GetDatabaseUsers":case"Insert":case"Update":case"Delete":case"BatchTransaction":case"InitBundleUpload":case"CompleteBundleUpload":case"GenerateFileId":case"UploadFileChunk":case"CompleteFileUpload":case"GetChunk":case"ValidateKey":case"GetPasswordSalts":case"PurchaseSubscription":case"CancelSubscription":case"ResumeSubscription":case"UpdatePaymentMethod":case"ShareDatabase":case"ShareDatabaseToken":case"AuthenticateShareToken":case"SaveDatabase":case"ModifyDatabasePermissions":case"VerifyUser":{const e=u.requestId;if(!e)return console.warn("Missing request id");const t=this.requests[e];if(!t)return console.warn("Request ".concat(e," no longer exists!"));if(!t.promiseResolve||!t.promiseReject)return;const s=u.response;return s&&s.status===o?t.promiseResolve(s):t.promiseReject(s)}default:console.log("Received unknown message from backend:"+JSON.stringify(u))}}catch(r){this.connectionResolved?console.warn("Error handling message: ",r):(this.close(),c(new tr(r.message,e.username,r)))}},l.onclose=async o=>{if(u)return;const d=o.code===y,h=o.code===b;if(d||h||!o.wasClean){const o=d&&!r?0:r?r+1e3:1e3;this.reconnecting=!0,await this.reconnect(i,c,e,this.seedString||t,s,a,o,!this.reconnected&&n)}else o.code===v?c(new tr("Web Socket already connected",e.username,o)):this.init()},l.onerror=()=>{}})}async reconnect(e,t,s,a,r,n,i,o){try{const t=Math.min(i,3e4);console.log("Connection to server lost. Attempting to reconnect in ".concat(t/1e3," second").concat(1e3!==t?"s":"","..."));const c=[],u=[];e(await new Promise((e,d)=>setTimeout(async()=>{try{const t=o||{dbNameToHash:Qa({},this.state.dbNameToHash),databases:Qa({},this.state.databases),databasesByDbId:Qa({},this.state.databasesByDbId),shareTokenIdToDbId:Qa({},this.state.shareTokenIdToDbId)};for(const e in t.databases)t.databases[e].init=!1,t.databases[e].finishedWaitingForBundle=!1,c.push(e);for(const e in t.databasesByDbId)t.databasesByDbId[e].init=!1,t.databasesByDbId[e].finishedWaitingForBundle=!1,u.push(e);this.init(),this.reconnecting=!0;const d=await this.connect(s,a,r,n,i,t);this.reconnected=!0,o||(await this.reopenDatabases(c,u,1e3),console.log("Reconnected!")),e(d)}catch(e){d(e)}},t)))}catch(e){t(e)}}async reopenDatabases(e,t,s){try{const s=[];for(const t of e){const e=this.state.databases[t];if(!e.init){const a="OpenDatabase",r={dbNameHash:t,reopenAtSeqNo:e.lastSeqNo};s.push(this.request(a,r))}}for(const e of t){const t=this.state.databasesByDbId[e];if(!t.init){const a=t.shareTokenHkdfKey,r=a?await this.authenticateShareToken(t.shareTokenId,a):{},n="OpenDatabaseByDatabaseId",i=Qa({databaseId:e,reopenAtSeqNo:t.lastSeqNo},r);s.push(this.request(n,i))}}await Promise.all(s)}catch(a){await new Promise(a=>setTimeout(async()=>{await this.reopenDatabases(e,t,s+1e3),a()},Math.min(s,3e4)))}}heartbeat(){clearTimeout(this.pingTimeout);this.pingTimeout=setTimeout(()=>{this.ws&&this.ws.close(b)},33e3)}close(e){this.ws?this.ws.close(e):this.init()}async signOut(){const e=this.session.username,t=this.connectionResolved,s=this.rejectConnection;try{_s.signOutSession(this.rememberMe,e);const a=this.session.sessionId;if(this.reconnecting)throw new hs.Reconnecting;const r="SignOut",n={sessionId:a};await this.request(r,n),this.close(),!t&&s&&s(new tr("Canceled",e))}catch(a){throw!t&&s&&s(new tr("Canceled",e)),a}}async setKeys(e){if(this.keys.init)return;if(!e)throw new tr("Missing seed",this.session.username);if(!this.keys.salts)throw new tr("Missing salts",this.session.username);this.seedString||(this.seedString=e);const t=i.a.decode(e),s=await ja.hkdf.importHkdfKey(t),a=this.keys.salts;if(this.keys.encryptionKey=await ja.aesGcm.importKeyFromMaster(s,i.a.decode(a.encryptionKeySalt)),this.keys.hmacKey=await ja.hmac.importKeyFromMaster(s,i.a.decode(a.hmacKeySalt)),a.ecdsaKeyEncryptionKeySalt){const e=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(s,i.a.decode(a.ecdsaKeyEncryptionKeySalt)),t=i.a.decode(this.ecKeyData.encryptedEcdsaPrivateKey),r=await ja.aesGcm.decrypt(e,t);this.keys.ecdsaPrivateKey=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(r);const n=await ja.ecdh.importEcdhKeyEncryptionKeyFromMaster(s,i.a.decode(a.ecdhKeyEncryptionKeySalt)),o=i.a.decode(this.ecKeyData.encryptedEcdhPrivateKey),c=await ja.aesGcm.decrypt(n,o);this.keys.ecdhPrivateKey=await ja.ecdh.getPrivateKeyFromRawPrivateKey(c)}else a.dhKeySalt&&(this.keys.dhPrivateKey=await ja.diffieHellman.importKeyFromMaster(s,i.a.decode(a.dhKeySalt)));if(a.dhKeySalt||a.ecdsaKeyWrapperSalt){const e=await ja.ecdsa.generateEcdsaKeyData(s),t=await ja.ecdh.generateEcdhKeyData(s,e.ecdsaPrivateKey);this.keys.ecdsaPrivateKey=e.ecdsaPrivateKey,this.keys.ecdhPrivateKey=t.ecdhPrivateKey,delete e.ecdsaPrivateKey,delete t.ecdhPrivateKey,this.newEcKeyData={ecdsaKeyData:e,ecdhKeyData:t}}}async validateKey(){let e;if(this.keys.ecdsaPrivateKey&&!this.keys.dhPrivateKey)e=await ja.ecdsa.sign(this.keys.ecdsaPrivateKey,i.a.decode(this.validationMessage));else if(this.keys.dhPrivateKey){const t=await ja.diffieHellman.getSharedKeyWithServer(this.keys.dhPrivateKey);e=await ja.aesGcm.decrypt(t,this.encryptedValidationMessage),delete this.keys.dhPrivateKey}const t={validationMessage:i.a.encode(e),ecKeyData:this.newEcKeyData};return(await this.request("ValidateKey",t)).data}async request(e,t){const s=Ds()();this.requests[s]={};const a=this.watch(s);this.ws.send(JSON.stringify({requestId:s,action:e,params:t}));try{return await a}catch(t){throw t.status===m?new hs.TooManyRequests(t.data.retryDelay):new er(e,t)}}async watch(e){const t=await new Promise((t,s)=>{this.requests[e].promiseResolve=t,this.requests[e].promiseReject=s,setTimeout(()=>{s(new Error("timeout"))},3e4)});return delete this.requests[e],t}async rebuildBundle(e,t,s){const a=[];for(let s=0;s<e.bundleChunks[t].length;s++){const r=e.bundleChunks[t][s],n=Ls(r);a.push(n)}const r=(e=>{const t=e.map(e=>e.byteLength),s=t.reduce((e,t)=>e+t),a=new Uint8Array(s);let r=0;for(let s=0;s<e.length;s++)a.set(new Uint8Array(e[s]),r),r+=t[s];return{buffer:a.buffer,byteLengths:t}})(a).buffer,{encrypted:n,plaintextMetadata:o}=JSON.parse(Fs(r)),c=await ja.aesGcm.decrypt(e.dbKey,i.a.decode(s)),u=await ja.aesGcm.getKeyFromRawKey(c),d=await ja.aesGcm.decrypt(u,Ls(n)),h=Fs(d),[l,f]=await Promise.all([za(h),za(o)]),m=Qa(Qa({},JSON.parse(l)),JSON.parse(f));return delete e.bundleChunks[t],m}async uploadBundle(e,t,s,a,r){let n=0,i=0,o=[];for(;n<r.byteLength;){const c=r.slice(n,n+524288);if(o.push(Za(e,t,s,a,i,c)),10===o.length){try{await Promise.all(o)}catch(e){return 0}o=[]}i+=1,n+=524288}try{await Promise.all(o)}catch(e){return 0}return i}async initBundleUpload(e,t,s){const a={dbId:e,seqNo:t};let r;try{r=await this.request("InitBundleUpload",a)}catch(e){return{}}const{bundleId:n}=r.data,[o,c]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(s);return{bundleId:n,bundleEncryptionKey:o,encryptedBundleEncryptionKey:i.a.encode(c)}}orderedItems(e,t){const s=[];for(let a=0;a<t.array.length;a++){const r=t.array[a].itemId;s.push(e[r])}return s}prepareBundle(e){const{items:t,itemsIndex:s,itemsPlaintextMetadata:a}=e;return{encrypted:JSON.stringify({items:this.orderedItems(t,s),itemsIndex:s.array}),plaintextMetadata:JSON.stringify({itemsPlaintextMetadata:this.orderedItems(a,s)})}}async buildBundle(e){const t=e.dbId,s=e.lastSeqNo,a=e.dbKey,r=this.session.userId;if(e.bundledAtSeqNo&&e.bundledAtSeqNo>=s)return;e.bundledAtSeqNo=s;const n=this.prepareBundle(e),i=e.attributionEnabled?[...e.usernamesByUserId.keys()].join(","):void 0,{bundleId:o,bundleEncryptionKey:c,encryptedBundleEncryptionKey:u}=await this.initBundleUpload(t,s,a);if(!o)return;const[d,h]=await Promise.all([Ya(n.encrypted),Ya(n.plaintextMetadata)]),l=Ls(d),f=await ja.aesGcm.encrypt(c,l);n.encrypted=Fs(f),n.plaintextMetadata=h;const m=Ls(JSON.stringify(n)),p=await this.uploadBundle(r,t,s,o,m);if(!p)return;const w={dbId:t,seqNo:s,bundleId:o,writers:i,numChunks:p,encryptedBundleEncryptionKey:u};try{await this.request("CompleteBundleUpload",w)}catch(e){return}}buildUserResult({username:e,userId:t,authToken:s,email:a,profile:r,protectedProfile:n,usedTempPassword:i,changePassword:o,passwordChanged:c,userData:u}){const d={username:e,userId:t,authToken:s};if(a&&(d.email=a),r&&(d.profile=r),n&&(d.protectedProfile=n),i&&(d.usedTempPassword=i),o&&(d.changePassword=o),c&&(d.passwordChanged=c),u){const{creationDate:e,stripeData:t}=u;if(e&&(d.creationDate=e),t){const{paymentsMode:e,subscriptionStatus:s,cancelSubscriptionAt:a,subscriptionPlanId:r,trialExpirationDate:n}=t;e&&(d.paymentsMode=e),s&&(d.subscriptionStatus=s),a&&(d.cancelSubscriptionAt=a),r&&(d.subscriptionPlanId=r),n&&(d.trialExpirationDate=n)}}return d}handleUpdateUser(e){if(this.session&&this.session.userId===e.userId){this.session.username=e.username,this.userData=e.userData;const t=gs();t&&t({user:this.buildUserResult(Qa({authToken:this.session.authToken},e))})}}async rotateKeys(e,t){const{keySalts:s,ecKeyData:a}=t,{ecdsaKeyData:r,ecdhKeyData:n}=a;s.ecdsaKeyEncryptionKeySalt=r.ecdsaKeyEncryptionKeySalt,s.ecdhKeyEncryptionKeySalt=n.ecdhKeyEncryptionKeySalt,this.keys.salts=s,this.ecKeyData=Qa(Qa({},r),n),await this.setKeys(e),this.keys.init=!0}async authenticateShareToken(e,t){const s={shareTokenId:e};let a;try{a=await this.request("AuthenticateShareToken",s)}catch(e){if(e.response&&"ShareTokenNotFound"===e.response.data)throw new hs.ShareTokenNotFound;throw e}const{databaseId:r,shareTokenAuthKeyData:n,validationMessage:o}=a.data;let c;try{const e=i.a.decode(n.shareTokenEcdsaKeyEncryptionKeySalt),s=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(t,e),a=i.a.decode(n.shareTokenEncryptedEcdsaPrivateKey),r=await ja.aesGcm.decrypt(s,a);c=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(r)}catch(e){throw new hs.ShareTokenInvalid}const u=await ja.ecdsa.sign(c,i.a.decode(o));return{databaseId:r,validationMessage:o,signedValidationMessage:i.a.encode(u)}}};function ar(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function rr(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?ar(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):ar(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const nr={local:!0,session:!0,none:!0},ir="Device not recognized. This temporary password can only be used to sign in from a device you've signed in from before.",or="Device not recognized. Forgot password only works from a device you've signed in from before.",cr=e=>{if(e.response){if("Domain not whitelisted"===e.response.data)throw new hs.DomainNotWhitelisted(window.location.origin);if("App ID not valid"===e.response.data)throw new hs.AppIdNotValid;if("UserNotFound"===e.response.data)throw new hs.UserNotFound;if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout},ur=async(e,t,s,a)=>{try{await sr.connect(e,t,s,a)}catch(e){if(cr(e),"Web Socket already connected"===e.message)throw new hs.UserAlreadySignedIn(e.username);throw e}},dr=e=>{if(e.response&&"UsernameTooLong"===e.response.data.error)throw new hs.UsernameTooLong(e.response.data.maxLen);if(e.response&&"PasswordAttemptLimitExceeded"===e.response.data.error)throw new hs.PasswordAttemptLimitExceeded(e.response.data.delay)},hr=e=>{if(e.response&&e.response.data){const t=e.response.data;switch(t.error){case"SessionLengthTooShort":throw new hs.SessionLengthTooShort(t.minLen);case"SessionLengthTooLong":throw new hs.SessionLengthTooLong(t.maxLen)}}},lr=(e,t)=>{if(cr(e),dr(e),e.response){const s=e.response.data;switch(s){case"UsernameAlreadyExists":throw new hs.UsernameAlreadyExists(t);case"TrialExceededLimit":throw new hs.TrialExceededLimit;case"CurrentPasswordIncorrect":throw new hs.CurrentPasswordIncorrect}switch(s.error){case"EmailNotValid":throw new hs.EmailNotValid;case"ProfileMustBeObject":throw new hs.ProfileMustBeObject;case"ProfileKeyTooLong":throw new hs.ProfileKeyTooLong(s.maxLen,s.key);case"ProfileValueMustBeString":throw new hs.ProfileValueMustBeString(s.key,s.value);case"ProfileValueCannotBeBlank":throw new hs.ProfileValueCannotBeBlank(s.key);case"ProfileValueTooLong":throw new hs.ProfileValueTooLong(s.maxLen,s.key,s.value);case"ProfileHasTooManyKeys":throw new hs.ProfileHasTooManyKeys(s.maxKeys);case"ProfileCannotBeEmpty":throw new hs.ProfileCannotBeEmpty}}throw e},fr=e=>e&&60*e*60*1e3,mr=e=>{if("string"!=typeof e)throw new hs.UsernameMustBeString;if(0===e.length)throw new hs.UsernameCannotBeBlank},pr=e=>{if("string"!=typeof e)throw new hs.PasswordMustBeString;if(0===e.length)throw new hs.PasswordCannotBeBlank;if(e.length<6)throw new hs.PasswordTooShort(6);if(e.length>1e3)throw new hs.PasswordTooLong(1e3)},wr=e=>{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"username"))throw new hs.UsernameMissing;if(!Ga(e,"password"))throw new hs.PasswordMissing;if(mr(e.username),pr(e.password),Ga(e,"rememberMe")&&!nr[e.rememberMe])throw new hs.RememberMeValueNotValid(nr);if(Ga(e,"sessionLength")&&"number"!=typeof e.sessionLength)throw new hs.SessionLengthMustBeNumber},gr=async(e,t,s)=>{const a=ja.scrypt.generateSalt(),r=await ja.scrypt.hash(e,a,s),n=await ja.hkdf.importHkdfKeyFromString(r),o=ja.hkdf.generateSalt(),c=await ja.hkdf.getPasswordToken(n,o),u=ja.hkdf.generateSalt(),d=await ja.aesGcm.getPasswordBasedEncryptionKey(n,u),h=await ja.aesGcm.encrypt(d,t);return{passwordToken:c,passwordSalts:{passwordSalt:i.a.encode(a),passwordTokenSalt:i.a.encode(o)},passwordBasedBackup:{passwordBasedEncryptionKeySalt:i.a.encode(u),passwordEncryptedSeed:i.a.encode(h)}}},yr=async e=>{const t=await ja.hkdf.importHkdfKey(e),s=ja.hkdf.generateSalt(),a=ja.hkdf.generateSalt(),r={encryptionKeySalt:i.a.encode(s),hmacKeySalt:i.a.encode(a)},n=await ja.ecdsa.generateEcdsaKeyData(t),o=await ja.ecdh.generateEcdhKeyData(t,n.ecdsaPrivateKey);delete n.ecdsaPrivateKey,delete o.ecdhPrivateKey;return{ecKeyData:{ecdsaKeyData:n,ecdhKeyData:o},keySalts:r}},br=e=>{if("object"!=typeof e)throw new hs.ProfileMustBeObject;let t=!1;for(const s in e){t=!0;const a=e[s];if("string"!=typeof a)throw new hs.ProfileValueMustBeString(s,a);if(!a)throw new hs.ProfileValueCannotBeBlank(s)}if(!t)throw new hs.ProfileCannotBeEmpty},vr=async()=>{try{const e="GetPasswordSalts";return(await sr.request(e)).data}catch(e){throw cr(e),e}},Mr=async(e,t,s)=>{const{passwordSalt:a,passwordTokenSalt:r}=t,n=await ja.scrypt.hash(e,new Uint8Array(i.a.decode(a)),s),o=await ja.hkdf.importHkdfKeyFromString(n);return{passwordHkdfKey:o,passwordToken:await ja.hkdf.getPasswordToken(o,i.a.decode(r))}},Sr=async(e,t)=>{let s;try{const a=_s.getCurrentSession();if(!a)return{};const{signedIn:r,sessionId:n,creationDate:i,expirationDate:o,rememberMe:c}=a;s=a.username;const u=_s.getSeedString(e,s);if(!r||!u||new Date>new Date(o))return{lastUsedUsername:s};let d;try{d=await Us(n,t)}catch(e){if(cr(e),hr(e),e.response&&"Session invalid"===e.response.data)return{lastUsedUsername:s};throw e}const{userId:h,authToken:l,username:f,email:m,profile:p,protectedProfile:w}=d;if(f!==s&&(_s.saveSeedString(c,e,f,u),_s.removeSeedString(e,s)),_s.signInSession(c,f,n,i,d.expirationDate),sr.connectionResolved){if(sr.session.sessionId===n)return{user:sr.buildUserResult({username:f,userId:h,authToken:sr.session.authToken,email:m,profile:p,protectedProfile:w,userData:sr.userData})};throw new hs.UserAlreadySignedIn(sr.session.username)}const g=rr(rr({},a),{},{username:f,userId:h,authToken:l});return await ur(g,u,c),{user:sr.buildUserResult({username:f,userId:h,authToken:l,email:m,profile:p,protectedProfile:w,userData:sr.userData})}}catch(e){if("Invalid seed"===e.message)return{lastUsedUsername:s};throw cr(e),e}},Ir=async(e,t)=>{const s=_s.getSeedString(e,t);if(!s)throw new hs.KeyNotFound(or);const a=i.a.decode(s);return await ja.hkdf.importHkdfKey(a)};var Pr={signUp:async e=>{try{(e=>{if(wr(e),e.profile&&br(e.profile),e.email&&"string"!=typeof e.email)throw new hs.EmailNotValid})(e);const{password:t,profile:s,passwordHashAlgo:a,rememberMe:r="session"}=e,n=e.username.toLowerCase(),o=e.email&&e.email.toLowerCase(),c=ws(),u=await ja.generateSeed(),d=fr(e.sessionLength),{sessionId:h,creationDate:l,expirationDate:f,userId:m,authToken:p}=await(async(e,t,s,a,r,n,i)=>{const{passwordToken:o,passwordSalts:c,passwordBasedBackup:u}=await gr(t,s,a),{ecKeyData:d,keySalts:h}=await yr(s);try{return await Es(e,o,d,c,h,r,n,u,i)}catch(t){hr(t),lr(t,e)}})(n,t,u,a,o,s,d),w={username:n,userId:m,sessionId:h,creationDate:l,expirationDate:f,authToken:p},g=i.a.encode(u);return _s.saveSeedString(r,c,n,g),_s.signInSession(r,n,h,l,f),await ur(w,g,r),sr.buildUserResult({username:n,userId:m,authToken:p,email:o,profile:s,userData:sr.userData})}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameAlreadyExists":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"UsernameTooLong":case"PasswordMissing":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"PasswordMustBeString":case"EmailNotValid":case"ProfileMustBeObject":case"ProfileCannotBeEmpty":case"ProfileHasTooManyKeys":case"ProfileKeyTooLong":case"ProfileValueMustBeString":case"ProfileValueCannotBeBlank":case"ProfileValueTooLong":case"RememberMeValueNotValid":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"TrialExceededLimit":case"AppIdNotSet":case"AppIdNotValid":case"DomainNotWhitelisted":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},signOut:async()=>{try{if(!sr.session.username)throw new hs.UserNotSignedIn;try{await sr.signOut()}catch(e){throw cr(e),e}}catch(e){switch(e.name){case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},signIn:async e=>{try{wr(e);const t=e.username.toLowerCase(),{password:s,passwordHashAlgo:a,rememberMe:r="session"}=e,n=ws(),o=await(async e=>{try{return await Bs(e)}catch(e){if(cr(e),dr(e),e.response&&"User not found"===e.response.data)throw new hs.UsernameOrPasswordMismatch;throw e}})(t),{passwordHkdfKey:c,passwordToken:u}=await Mr(s,o,a),d=fr(e.sessionLength),h=await(async(e,t,s)=>{try{return await Ns(e,t,s)}catch(e){if(cr(e),dr(e),hr(e),e.response&&"Invalid password"===e.response.data)throw new hs.UsernameOrPasswordMismatch;if(e.response&&"User pending deletion"===e.response.data)throw new hs.UserPendingDeletion;throw e}})(t,u,d),{userId:l,email:f,profile:m,passwordBasedBackup:p,protectedProfile:w,usedTempPassword:g,changePassword:y}=h,b=rr(rr({},h.session),{},{username:t,userId:l});let v;if(!y){const e=_s.getSeedString(n,t);let s;if(!e&&g)throw new hs.KeyNotFound(ir);g||(s=await(async(e,t)=>{const{passwordBasedEncryptionKeySalt:s,passwordEncryptedSeed:a}=t,r=await ja.aesGcm.getPasswordBasedEncryptionKey(e,i.a.decode(s)),n=await ja.aesGcm.decrypt(r,i.a.decode(a));return i.a.encode(n)})(c,p),_s.saveSeedString(r,n,t,s)),v=s||e}_s.signInSession(r,t,b.sessionId,b.creationDate,b.expirationDate);try{await ur(b,v,r,y)}catch(e){if(g&&"Invalid seed"===e.message)throw new hs.KeyNotFound(ir);throw e}return sr.buildUserResult({username:t,userId:l,authToken:b.authToken,email:f,profile:m,protectedProfile:w,usedTempPassword:g,changePassword:y,userData:sr.userData})}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameOrPasswordMismatch":case"UserPendingDeletion":case"UsernameCannotBeBlank":case"UsernameTooLong":case"UsernameMustBeString":case"PasswordMissing":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"PasswordMustBeString":case"PasswordAttemptLimitExceeded":case"RememberMeValueNotValid":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"KeyNotFound":case"AppIdNotSet":case"AppIdNotValid":case"DomainNotWhitelisted":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},init:async e=>{try{if(!window.crypto.subtle)throw new hs.WebCryptoUnavailable;if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"appId"))throw new hs.AppIdMissing;if("string"!=typeof e.appId)throw new hs.AppIdMustBeString;if(0===e.appId.length)throw new hs.AppIdCannotBeBlank;if(Ga(e,"updateUserHandler")&&"function"!=typeof e.updateUserHandler)throw new hs.UpdateUserHandlerMustBeFunction;if(Ga(e,"sessionLength")&&"number"!=typeof e.sessionLength)throw new hs.SessionLengthMustBeNumber;if(Ga(e,"allowServerSideEncryption")&&"boolean"!=typeof e.allowServerSideEncryption)throw new hs.AllowServerSideEncryptionMustBeBoolean;bs(e);return await Sr(e.appId,fr(e.sessionLength))}catch(e){switch(e.name){case"WebCryptoUnavailable":case"ParamsMustBeObject":case"AppIdMissing":case"AppIdAlreadySet":case"AppIdMustBeString":case"AppIdCannotBeBlank":case"AppIdNotValid":case"DomainNotWhitelisted":case"UpdateUserHandlerMustBeFunction":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"AllowServerSideEncryptionMustBeBoolean":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},updateUser:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if((e=>{if(!(Ga(e,"username")||Ga(e,"newPassword")||Ga(e,"email")||Ga(e,"profile")))throw new hs.ParamsMissing;const{username:t,currentPassword:s,newPassword:a,email:r,profile:n}=e;if(Ga(e,"username")&&mr(t),Ga(e,"newPassword")){if(!Ga(e,"currentPassword"))throw new hs.CurrentPasswordMissing;pr(s),pr(a)}if(r&&"string"!=typeof r)throw new hs.EmailNotValid;n&&br(n)})(e),sr.reconnecting)throw new hs.Reconnecting;if(!sr.connectionResolved)throw new hs.UserNotSignedIn;const t=sr.session.userId,s=e.newPassword&&!sr.keys.init&&sr.changePassword&&await ja.generateSeed(),a="UpdateUser",r=await(async(e,t)=>{if(e.username&&(e.username=e.username.toLowerCase()),e.newPassword){const[s,a,r]=await Promise.all([vr(),gr(e.newPassword,t||i.a.decode(sr.seedString)),t&&yr(t)]),{passwordToken:n}=await Mr(e.currentPassword,s,e.passwordHashAlgo);e.currentPasswordToken=n,delete e.currentPassword,e.passwordToken=a.passwordToken,e.passwordSalts=a.passwordSalts,e.passwordBasedBackup=a.passwordBasedBackup,delete e.newPassword,r&&(e.newKeyData=r)}return e.email?e.email=e.email.toLowerCase():Ga(e,"email")&&(e.email=!1),!e.profile&&Ga(e,"profile")&&(e.profile=!1),e})(rr({},e),s);if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.connectionResolved)throw new hs.UserNotSignedIn;if(!sr.session||t!==sr.session.userId)throw new hs.ServiceUnavailable;try{r.username&&_s.saveSeedString(sr.rememberMe,ws(),r.username,sr.seedString);const e=(await sr.request(a,r)).data.updatedUser;if(sr.handleUpdateUser(e),s&&sr.session&&t===sr.session.userId){const t=i.a.encode(s);await sr.rotateKeys(t,r.newKeyData),_s.saveSeedString(sr.rememberMe,ws(),e.username,t);const{sessionId:a,creationDate:n,expirationDate:o}=sr.session;_s.signInSession(sr.rememberMe,e.username,a,n,o)}}catch(e){lr(e,r.username)}}catch(e){switch(e.name){case"ParamsMustBeObject":case"ParamsMissing":case"UsernameAlreadyExists":case"UsernameMustBeString":case"UsernameCannotBeBlank":case"UsernameTooLong":case"CurrentPasswordMissing":case"CurrentPasswordIncorrect":case"PasswordAttemptLimitExceeded":case"PasswordMustBeString":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"EmailNotValid":case"ProfileMustBeObject":case"ProfileCannotBeEmpty":case"ProfileHasTooManyKeys":case"ProfileKeyTooLong":case"ProfileValueMustBeString":case"ProfileValueCannotBeBlank":case"ProfileValueTooLong":case"AppIdNotSet":case"AppIdNotValid":case"UserNotFound":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},deleteUser:async()=>{try{(()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init)throw new hs.UserNotSignedIn})();const e=sr.session.username;_s.removeSeedString(ws(),e),_s.removeCurrentSession();try{const e="DeleteUser";await sr.request(e)}catch(e){throw cr(e),e}sr.close()}catch(e){switch(e.name){case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},forgotPassword:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Ga(e,"deleteEndToEndEncryptedData")&&"boolean"!=typeof e.deleteEndToEndEncryptedData)throw new hs.DeleteEndToEndEncryptedDataMustBeBoolean;if(!Ga(e,"username"))throw new hs.UsernameMissing;mr(e.username);const t=e.username.toLowerCase(),s=ws(),a="".concat(Va(ys()),"/api/auth/forgot-password?appId=").concat(s,"&username=").concat(encodeURIComponent(t),"&userbaseJsVersion=").concat(ps),r=new WebSocket(a+(Ga(e,"deleteEndToEndEncryptedData")?"&deleteEndToEndEncryptedData=".concat(e.deleteEndToEndEncryptedData):""));await new Promise((e,a)=>{setTimeout(()=>a(new hs.Timeout),15e3),r.onerror=()=>a(new hs.ServiceUnavailable),r.onmessage=async n=>{try{const o=JSON.parse(n.data);switch(o.route){case"ReceiveEncryptedToken":{const e=await Ir(s,t),a=new Uint8Array(o.encryptedForgotPasswordToken.data),n=await ja.diffieHellman.importKeyFromMaster(e,i.a.decode(o.dhKeySalt)),c=await ja.diffieHellman.getSharedKeyWithServer(n);let u;try{u=i.a.encode(await ja.aesGcm.decrypt(c,a))}catch(e){throw new hs.KeyNotFound(or)}r.send(JSON.stringify({action:"ForgotPassword",params:{forgotPasswordToken:u}}));break}case"ReceiveToken":{const e=await Ir(s,t),{ecdsaKeyEncryptionKeySalt:a,encryptedEcdsaPrivateKey:n,forgotPasswordToken:c}=o,u=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(e,i.a.decode(a));let d;try{const e=await ja.aesGcm.decrypt(u,i.a.decode(n));d=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(e)}catch(e){throw new hs.KeyNotFound(or)}const h=i.a.encode(await ja.ecdsa.sign(d,i.a.decode(c)));r.send(JSON.stringify({action:"ForgotPassword",params:{signedForgotPasswordToken:h}}));break}case"SuccessfullyForgotPassword":e();break;case"Error":{const e=o.data;switch(e.name){case"UsernameTooLong":throw new hs.UsernameTooLong(e.maxLen);case"AppIdNotValid":throw new hs.AppIdNotValid;case"UserNotFound":throw new hs.UserNotFound;case"UserEmailNotFound":throw new hs.UserEmailNotFound;default:throw o.status===p?new hs.ServiceUnavailable:new hs.UnknownServiceUnavailable(e)}}case"Ping":break;default:a(new Error("Received unknown message from userbase-server: ".concat(n.data)))}}catch(n){a(n)}}}),r.close()}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameMustBeString":case"UsernameCannotBeBlank":case"UsernameTooLong":case"AppIdNotSet":case"AppIdNotValid":case"KeyNotFound":case"UserNotFound":case"UserEmailNotFound":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}},Er=s(12),Br=s.n(Er);function Nr(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function Ur(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Nr(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Nr(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const Ar={"end-to-end":!0,"server-side":!0},Tr=()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init||!Ar[sr.encryptionMode])throw new hs.UserNotSignedIn},kr=e=>{if(e.response){if("UserNotFound"===e.response.data)throw new hs.UserNotFound;if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout};class Dr{constructor(e){this.startSeqNo=e,this.txSeqNo=null,this.transactions={},this.promiseResolve=null,this.promiseReject=null,this.index=null}getStartSeqNo(){return this.startSeqNo}getIndex(){return this.index}setIndex(e){this.index=e}async getResult(e){this.txSeqNo=e;const t=new Promise((e,t)=>{this.promiseResolve=e,this.promiseReject=t,setTimeout(()=>{t(new Error("timeout"))},3e4)});return this.verifyPromise(),t}verifyPromise(){(this.txSeqNo||0==this.txSeqNo)&&this.promiseResolve&&this.promiseReject&&this.transactions[this.txSeqNo]&&("Success"==this.transactions[this.txSeqNo]?this.promiseResolve():this.promiseReject(this.transactions[this.txSeqNo]))}addTransaction(e,t){this.transactions[e.seqNo]||(this.transactions[e.seqNo]=t,this.verifyPromise())}}class Kr{constructor(e,t,s,a){this.onChange=xr(e),this.items={},this.itemsPlaintextMetadata={},this.fileIds={};this.itemsIndex=new Br.a([],(e,t)=>e.seqNo<t.seqNo||e.seqNo===t.seqNo&&e.operationIndex<t.operationIndex?-1:e.seqNo>t.seqNo||e.seqNo===t.seqNo&&e.operationIndex>t.operationIndex?1:0),this.unverifiedTransactions=[],this.lastSeqNo=0,this.init=!1,this.dbKey=null,this.receivedMessage=t,this.usernamesByUserId=new Map,this.attributionEnabled=!1,this.shareTokenId=s,this.shareTokenHkdfKey=a,this.applyTransactionsQueue=new Ja,this.bundleChunks={}}async applyTransactions(e,t,s,a){for(let s=0;s<e.length;s++){const a=e[s],r=a.seqNo;if(r!==this.lastSeqNo+1){console.warn("Client attempted to apply transaction with seq no ".concat(r," when last seq no is ").concat(this.lastSeqNo));continue}const n=await this.applyTransaction(this.dbKey,a,t);this.lastSeqNo=r;for(let t=0;t<this.unverifiedTransactions.length;t++)!this.unverifiedTransactions[t]||r<this.unverifiedTransactions[t].getStartSeqNo()||this.unverifiedTransactions[t].addTransaction(e[s],n);this.init&&"Success"===n&&this.onChange(this.getItems())}this.init||(this.init=!0,this.dbId=s,this.dbNameHash=a,this.onChange(this.getItems()),this.receivedMessage())}async applyBundle(e,t){if(0===this.lastSeqNo){for(let t=0;t<e.itemsIndex.length;t++){const s=e.itemsIndex[t],a=e.itemsIndex[t].itemId,r=e.items[t],n=e.itemsPlaintextMetadata[t];r.file&&r.file.fileEncryptionKeyString&&(r.file.fileEncryptionKey=await ja.aesGcm.getKeyFromKeyString(r.file.fileEncryptionKeyString),this.fileIds[r.file.fileId]=a),this.items[a]=r,this.itemsPlaintextMetadata[a]=n,this.itemsIndex.insert(s)}this.lastSeqNo=t}else console.warn("Client attempted to apply bundle when last seq no is ".concat(this.lastSeqNo))}async applyTransaction(e,t,s){const a=t.seqNo,r=t.command;switch(r){case"Insert":try{const s=await ja.aesGcm.decryptJson(e,t.record),r=s.id,n=s.item,i=this.attributionFromTransaction(t),o=t.writeAccess;return this.validateInsert(r),this.applyInsert(r,a,n,i,o)}catch(e){return e}case"Update":try{const a=await ja.aesGcm.decryptJson(e,t.record),r=a.id,n=a.item,i=this.attributionFromTransaction(t),o=a.__v,c=t.writeAccess;return this.validateUpdate(r,o,i,s,c,"updateItem"),this.applyUpdate(r,n,o,i,c)}catch(e){return e}case"Delete":try{const a=await ja.aesGcm.decryptJson(e,t.record),r=a.id,n=this.attributionFromTransaction(t),i=a.__v;return this.validateUpdateOrDelete(r,i,n,s,"deleteItem"),this.applyDelete(r)}catch(e){return e}case"BatchTransaction":try{const r=t.operations,n=this.attributionFromTransaction(t),i=[];for(const t of r)i.push(t.record&&ja.aesGcm.decryptJson(e,t.record));const o=await Promise.all(i);return this.validateBatchTransaction(r,o,n,s),this.applyBatchTransaction(a,r,o,n)}catch(e){return e}case"UploadFile":try{const a=await ja.aesGcm.decrypt(e,i.a.decode(t.fileEncryptionKey)),r=await ja.aesGcm.getKeyFromRawKey(a),n=await ja.aesGcm.getKeyStringFromKey(r),o=await ja.aesGcm.decryptJson(r,t.fileMetadata),c=o.itemId,u=o.__v,{fileName:d,fileSize:h,fileType:l}=o,f=t.fileId,m=this.attributionFromTransaction(t);return this.validateUploadFile(c,u,m,s,"uploadFile"),this.applyUploadFile(c,m,u,r,n,d,f,h,l)}catch(e){return e}case"Rollback":return;default:return void console.warn("Unknown command: ".concat(r))}}attributionFromTransaction(e){if(this.attributionEnabled)return{timestamp:e.timestamp,userId:e.userId}}validateInsert(e){if(this.items[e])throw new hs.ItemAlreadyExists}validateUpdate(e,t,s,a,r,n){this.validateUpdateOrDelete(e,t,s,a,n);const{createdBy:i}=this.itemsPlaintextMetadata[e];if(r||!1===r){if(!i)return;const e=i.userId,t=s.userId;if(e!==t&&t!==a)throw new hs.WriteAccessParamNotAllowed}}validateUpdateOrDelete(e,t,s,a,r){if(!this.items[e])throw new hs.ItemDoesNotExist;if(t<=this.getItemVersionNumber(e))throw new hs.ItemUpdateConflict;this.validateAccessPermissions(e,s,a,r)}validateUploadFile(e,t,s,a,r){if(!this.items[e])throw new hs.ItemDoesNotExist;if(t<=this.getFileVersionNumber(e))throw new hs.FileUploadConflict;this.validateAccessPermissions(e,s,a,r)}validateAccessPermissions(e,t,s,a){const{createdBy:r,writeAccess:n}=this.itemsPlaintextMetadata[e];if(r&&t&&n){const e=r.userId,i=t.userId;let o=!1;const{onlyCreator:c,users:u}=n;if(i===s||i===e)o=!0;else if(!c&&u)for(const{userId:e}of u)if(o=i===e,o)break;if(!o)throw new hs.TransactionUnauthorized(a)}}itemExists(e){return Ga(this.items,e)}applyInsert(e,t,s,a,r,n){const i={seqNo:t};if("number"==typeof n&&(i.operationIndex=n),this.items[e]=Ur(Ur({},i),{},{record:s,__v:0}),this.itemsPlaintextMetadata[e]={createdBy:a,writeAccess:r},this.itemsIndex.insert(Ur(Ur({},i),{},{itemId:e})),r&&r.users)for(const{userId:e,username:t}of r.users)this.usernamesByUserId.set(e,t);return"Success"}applyUpdate(e,t,s,a,r){if(this.items[e].record=t,this.items[e].__v=s,this.itemsPlaintextMetadata[e].updatedBy=a,!1===r)delete this.itemsPlaintextMetadata[e].writeAccess;else if(r&&(this.itemsPlaintextMetadata[e].writeAccess=r,r.users))for(const{userId:e,username:t}of r.users)this.usernamesByUserId.set(e,t);return"Success"}applyUploadFile(e,t,s,a,r,n,i,o,c){const u=this.items[e].file;return u&&delete this.fileIds[u.fileId],this.items[e].file={fileName:n,fileId:i,fileSize:o,fileType:c,fileEncryptionKey:a,fileEncryptionKeyString:r,__v:s},this.itemsPlaintextMetadata[e].fileUploadedBy=t,this.fileIds[i]=e,"Success"}applyDelete(e){return this.itemsIndex.remove(this.items[e]),delete this.items[e],delete this.itemsPlaintextMetadata[e],"Success"}validateBatchTransaction(e,t,s,a){const r={};for(let n=0;n<e.length;n++){const i=e[n],{command:o,writeAccess:c}=i,u=t[n].id,d=t[n].__v;if(r[u])throw new hs.OperationsConflict;switch(r[u]=!0,o){case"Insert":this.validateInsert(u);break;case"Update":this.validateUpdate(u,d,s,a,c,o);break;case"Delete":this.validateUpdateOrDelete(u,d,s,a,o)}}}applyBatchTransaction(e,t,s,a){for(let r=0;r<t.length;r++){const n=t[r],i=s[r].id,o=s[r].item,c=s[r].__v,u=n.writeAccess;switch(n.command){case"Insert":this.applyInsert(i,e,o,a,u,r);break;case"Update":this.applyUpdate(i,o,c,a,u);break;case"Delete":this.applyDelete(i,c)}}return"Success"}registerUnverifiedTransaction(){const e=new Dr(this.lastSeqNo),t=this.unverifiedTransactions.push(e);return e.setIndex(t-1),e}unregisterUnverifiedTransaction(e){delete this.unverifiedTransactions[e.getIndex()]}getItems(){const e=[];for(let t=0;t<this.itemsIndex.array.length;t++){const s=this.itemsIndex.array[t].itemId,a={itemId:s,item:this.items[s].record};if(this.items[s].file){const{fileId:e,fileName:t,fileSize:r}=this.items[s].file;a.fileId=e,a.fileName=t,a.fileSize=r}for(const e of["createdBy","updatedBy","fileUploadedBy"])if(this.itemsPlaintextMetadata[s][e]){const{timestamp:t,userId:r}=this.itemsPlaintextMetadata[s][e],n={timestamp:t},i=this.usernamesByUserId.get(r);null==i?n.userDeleted=!0:n.username=i,a[e]=n}if(this.itemsPlaintextMetadata[s].writeAccess){const{onlyCreator:e,users:t}=this.itemsPlaintextMetadata[s].writeAccess,r={};if(e&&(r.onlyCreator=e),t){r.users=[];for(const{userId:e}of t){const t=this.usernamesByUserId.get(e);t&&r.users.push({username:t})}}a.writeAccess=r}e.push(a)}return e}getItemVersionNumber(e){return this.items[e].__v}getFileVersionNumber(e){return this.items[e].file&&this.items[e].file.__v}async decryptShareTokenEncryptedDbKey(e,t){const s=await ja.aesGcm.importKeyFromMaster(this.shareTokenHkdfKey,i.a.decode(t));return await ja.aesGcm.decryptString(s,e)}}const xr=e=>t=>{try{e(t)}catch(e){console.error("There was an error in your changeHandler.\n\n",e)}},Rr=(e,t,s)=>{e.onChange=xr(t);const a=e.receivedMessage;return e.receivedMessage=()=>{a(),s()},!!e.init&&(e.onChange(e.getItems()),e.receivedMessage(),!0)},Or=e=>{const t=e.slice(0,36),s=Fs(t,!0);if(!s||36!==s.length)throw new hs.ShareTokenInvalid;return s},Cr=async(e,t,s)=>{let a,r;try{a=(e=>{const t=i.a.decode(e);return{shareTokenId:Or(t),shareTokenSeed:t.slice(36)}})(e),r=await ja.hkdf.importHkdfKey(a.shareTokenSeed)}catch(e){throw new hs.ShareTokenInvalid}const{shareTokenId:n}=a,{databaseId:o,validationMessage:c,signedValidationMessage:u}=await sr.authenticateShareToken(n,r);sr.state.shareTokenIdToDbId[n]=o,await _r(o,t,s,n,r,c,u)},_r=async(e,t,s,a,r,n,i)=>{const o=sr.state.databasesByDbId[e];if(o){if(Rr(o,t,s))return}else sr.state.databasesByDbId[e]=new Kr(t,s,a,r);const c={databaseId:e,validationMessage:n,signedValidationMessage:i};await sr.request("OpenDatabaseByDatabaseId",c)},Fr=async(e,t)=>{try{let s,a;const r=new Promise((e,t)=>{s=e,a=setTimeout(()=>t(new Error("timeout")),3e4)}),{dbNameHash:n,newDatabaseParams:i,databaseId:o,shareToken:c}=t;try{n?await(async(e,t,s,a)=>{const r=sr.state.databases[e];if(r){if(Rr(r,s,a))return}else sr.state.databases[e]=new Kr(s,a);const n={dbNameHash:e,newDatabaseParams:t};await sr.request("OpenDatabase",n)})(n,i,e,s):o?await _r(o,e,s):c&&await Cr(c,e,s),await r}catch(e){if(clearTimeout(a),e.response&&e.response.data){const t=e.response.data;if("Database already creating"===t)throw new hs.DatabaseAlreadyOpening;if("Database is owned by user"===t){if(o)throw new hs.DatabaseIdNotAllowedForOwnDatabase;if(c)throw new hs.ShareTokenNotAllowedForOwnDatabase}else if("Database key not found"===t||"Database not found"===t)throw new hs.DatabaseNotFound;switch(t.name){case"SubscriptionNotFound":throw new hs.SubscriptionNotFound;case"SubscriptionInactive":throw new hs.SubscriptionInactive(t.subscriptionStatus);case"TrialExpired":throw new hs.TrialExpired}}throw e}}catch(e){throw kr(e),e}},Lr=e=>{if("server-side"===e&&!Ms())throw new hs.ServerSideEncryptionNotEnabledInClient},jr=e=>{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Ga(e,"databaseName")){if((e=>{if("string"!=typeof e)throw new hs.DatabaseNameMustBeString;if(0===e.length)throw new hs.DatabaseNameCannotBeBlank;if(e.length>100)throw new hs.DatabaseNameTooLong(100)})(e.databaseName),Ga(e,"databaseId"))throw new hs.DatabaseIdNotAllowed;if(Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;if(!e.allowVerifiedUsersDatabase&&"__userbase_verified_users"===e.databaseName)throw new hs.DatabaseNameRestricted("__userbase_verified_users")}else if(Ga(e,"databaseId")){if((e=>{if("string"!=typeof e)throw new hs.DatabaseIdMustBeString;if(0===e.length)throw new hs.DatabaseIdCannotBeBlank;if(36!==e.length)throw new hs.DatabaseIdInvalidLength(36)})(e.databaseId),Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed}else{if(!Ga(e,"shareToken"))throw new hs.DatabaseNameMissing;if("string"!=typeof e.shareToken)throw new hs.ShareTokenInvalid}if(Ga(e,"encryptionMode")&&!Ar[e.encryptionMode])throw new hs.EncryptionModeNotValid(Ar);Tr()},qr=async e=>{try{if(jr(e),!Ga(e,"changeHandler"))throw new hs.ChangeHandlerMissing;const{databaseName:t,databaseId:s,shareToken:a,changeHandler:r,encryptionMode:n=sr.encryptionMode}=e;if("function"!=typeof r)throw new hs.ChangeHandlerMustBeFunction;if(Lr(n),t){const e="server-side"===n?t:sr.state.dbNameToHash[t]||await ja.hmac.signString(sr.keys.hmacKey,t);"end-to-end"===n&&(sr.state.dbNameToHash[t]=e);const s={dbNameHash:e,newDatabaseParams:await(async(e,t)=>{const s=Ds()(),a=await ja.aesGcm.generateKey(),r=await ja.aesGcm.getKeyStringFromKey(a),[n,i]=await Promise.all([ja.aesGcm.encryptString(sr.keys.encryptionKey,r),ja.aesGcm.encryptString(a,e)]),o={dbId:s,encryptedDbKey:n,encryptedDbName:i,attribution:!0};return"server-side"===t&&(o.plaintextDbKey=r),o.fingerprint=await ln(),o})(t,n)};await Fr(r,s)}else if(s){const e={databaseId:s};await Fr(r,e)}else{const e={shareToken:a};await Fr(r,e)}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseAlreadyOpening":case"DatabaseNameMustBeString":case"DatabaseNameMissing":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"DatabaseIdNotAllowedForOwnDatabase":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"ShareTokenNotFound":case"ShareTokenNotAllowedForOwnDatabase":case"DatabaseNotFound":case"ChangeHandlerMissing":case"ChangeHandlerMustBeFunction":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"SubscriptionNotFound":case"SubscriptionInactive":case"TrialExpired":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Vr=(e,t,s,a="end-to-end")=>{Lr(a);const r=s&&Or(i.a.decode(s)),n="server-side"===a?e:sr.state.dbNameToHash[e],o=e?sr.state.databases[n]:sr.state.databasesByDbId[t||sr.state.shareTokenIdToDbId[r]];if(!o||!o.init)throw new hs.DatabaseNotOpen;return o},Hr=async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Insert",a=await Gr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemAlreadyExists":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Gr=async(e,t)=>{if(!Ga(t,"item"))throw new hs.ItemMissing;const{item:s,itemId:a,writeAccess:r}=t;if(Ga(t,"itemId")){if("string"!=typeof a)throw new hs.ItemIdMustBeString;if(0===a.length)throw new hs.ItemIdCannotBeBlank;if(a.length>100)throw new hs.ItemIdTooLong(100)}const n=JSON.stringify(s);if(!n)throw new hs.ItemInvalid;if(Ha(n)>10240)throw new hs.ItemTooLarge(10);const i=a||Ds()(),o={id:i,item:s};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,i),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,o),writeAccess:r}},Jr=async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Update",a=await Wr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemDoesNotExist":case"ItemUpdateConflict":case"WriteAccessParamNotAllowed":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Wr=async(e,t)=>{if(!Ga(t,"item"))throw new hs.ItemMissing;if(!Ga(t,"itemId"))throw new hs.ItemIdMissing;!t.writeAccess&&Ga(t,"writeAccess")&&(t.writeAccess=!1);const{item:s,itemId:a,writeAccess:r}=t;if("string"!=typeof a)throw new hs.ItemIdMustBeString;if(0===a.length)throw new hs.ItemIdCannotBeBlank;if(a.length>100)throw new hs.ItemIdTooLong(100);if(!e.itemExists(a))throw new hs.ItemDoesNotExist;const n=JSON.stringify(s);if(!n)throw new hs.ItemInvalid;if(Ha(n)>10240)throw new hs.ItemTooLarge(10);const i={id:a,item:s,__v:e.getItemVersionNumber(a)+1};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,a),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,i),writeAccess:r}},Yr=async(e,t)=>{if(!Ga(t,"itemId"))throw new hs.ItemIdMissing;const{itemId:s}=t;if("string"!=typeof s)throw new hs.ItemIdMustBeString;if(0===s.length)throw new hs.ItemIdCannotBeBlank;if(s.length>100)throw new hs.ItemIdTooLong(100);if(!e.itemExists(s))throw new hs.ItemDoesNotExist;const a={id:s,__v:e.getItemVersionNumber(s)+1};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,s),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,a)}},zr=async(e,t,s)=>{try{const a=e.registerUnverifiedTransaction(),r=Ur(Ur({},s),{},{dbId:e.dbId,dbNameHash:e.dbNameHash}),n=(await sr.request(t,r)).data.sequenceNo;return await a.getResult(n),e.unregisterUnverifiedTransaction(a),n}catch(e){if(kr(e),e.response){if("DatabaseIsReadOnly"===e.response.data.name)throw new hs.DatabaseIsReadOnly;if("UserNotFound"===e.response.data.message)throw new hs.UserNotFound(e.response.data.username)}throw e}},Zr=async(e,t,s,a,r,n,i,o)=>{const c=await(async e=>{const t=new FileReader;return new Promise((s,a)=>{t.onload=e=>{e.target.error?a(e.target.error):s(e.target.result)},t.readAsArrayBuffer(e)})})(t),[u,d]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(r),h=await ja.aesGcm.encrypt(u,c),l={dbId:s,chunkNumber:n,fileId:a,chunk:Fs(new Uint8Array(h)),chunkEncryptionKey:Fs(new Uint8Array(d))},f=(async(e,t,s,a)=>{await e,t.bytesTransferred+=a,s&&s(Ur({},t))})(sr.request("UploadFileChunk",l),i,o,t.size);e.push(f),10===e.length&&(await Promise.all(e),e.length=0)},Xr=async(e,t,s,a)=>{try{const r="GetChunk",n={dbId:e,fileId:t,chunkNumber:s},i=(await sr.request(r,n)).data,o=new Uint8Array(new Uint16Array(Ls(i.chunk))).buffer,c=new Uint8Array(new Uint16Array(Ls(i.chunkEncryptionKey))).buffer,u=await ja.aesGcm.decrypt(a,c),d=await ja.aesGcm.getKeyFromRawKey(u);return await ja.aesGcm.decrypt(d,o)}catch(e){throw kr(e),e}},Qr=async(e,t,s)=>{const{username:a,senderUsername:r,verificationValues:n}=s,{sentSignature:o,receivedSignature:c,senderEcdsaPublicKey:u}=n,d=t[a]&&t[a].record.fingerprint,h=i.a.decode(u),l=t[r]&&t[r].record.fingerprint||await hn(h),f=await ja.ecdsa.getPublicKeyFromRawPublicKey(h),m=await rn(e,d),p=await ja.ecdsa.verifyString(f,o,m),w=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(n.recipientEcdsaPublicKey)),g=await rn(e,l),y=await ja.ecdsa.verifyString(w,c,g);return p&&y},$r=async(e,t,s,a,r)=>{const{mySentSignature:n,myReceivedSignature:o}=r,c=await rn(e,t),u=await ja.ecdsa.verifyString(a,o,c);if(!u)return u;const d=await rn(e,s),h=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(r.mySenderEcdsaPublicKey));return await ja.ecdsa.verifyString(h,n,d)&&u},en=async(e,t,s,a,r)=>{const{sentSignature:n,receivedSignature:o}=r,c=await rn(e,t),u=await ja.ecdsa.verifyString(a,n,c);if(!u)return u;const d=await rn(e,s),h=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(r.recipientEcdsaPublicKey)),l=await ja.ecdsa.verifyString(h,o,d);return u&&l},tn=async(e,t,s,a,r)=>{const n=await ja.ecdsa.getPublicKeyFromPrivateKey(sr.keys.ecdsaPrivateKey),i=await ln();for(let o=0;o<t.length;o++){const c=t[o],{username:u,isOwner:d,senderUsername:h,verificationValues:l}=c;try{const a=s[u]&&s[u].record.fingerprint,f=l.isChild,m=r===u;if(a)if(f)t[o].verified=await en(e,a,i,n,l);else if(m){const r=await $r(e,a,i,n,l);if(r&&h){const a=await Qr(e,s,c);t[o].verified=a}else t[o].verified=r}else if(d)t[o].verified=d;else{const a=await Qr(e,s,c);t[o].verified=a}}catch(e){}delete t[o].senderUsername,d||(l&&l.isChild?t[o].receivedFromUsername=a:h&&(t[o].receivedFromUsername=h)),delete t[o].verificationValues}return t},sn=async(e,t,s,a,r)=>{const{databaseId:n,databaseNameHash:o,isOwner:c,readOnly:u,resharingAllowed:d,senderUsername:h}=e;let l,f;if(e.encryptedDbKey||e.plaintextDbKey){const s=e.plaintextDbKey||await ja.aesGcm.decryptString(t,e.encryptedDbKey);if(l=await ja.aesGcm.getKeyFromKeyString(s),f=await ja.aesGcm.decryptString(l,e.databaseName),c&&"__userbase_verified_users"===f)return null}else{if(e.wrappedDbKey)return null;{let a;try{const{ephemeralPublicKey:t,signedEphemeralPublicKey:r,sharedEncryptedDbKey:n}=e;a=i.a.decode(e.senderEcdsaPublicKey);const o=await ja.ecdsa.getPublicKeyFromRawPublicKey(a);if(!await ja.ecdsa.verify(o,i.a.decode(r),i.a.decode(t)))throw new hs.ServiceUnavailable;const c=await ja.ecdh.getPublicKeyFromRawPublicKey(i.a.decode(t)),u=await ja.ecdh.computeSharedKeyEncryptionKey(c,s),d=await ja.aesGcm.decryptString(u,n);l=await ja.aesGcm.getKeyFromKeyString(d),f=await ja.aesGcm.decryptString(l,e.databaseName)}catch(e){return null}const r=await hn(a),n=await nn(l,r),c=await ja.aesGcm.getKeyStringFromKey(l),u="SaveDatabase",d={databaseNameHash:o,encryptedDbKey:await ja.aesGcm.encryptString(t,c),receivedSignature:n};sr.request(u,d)}}const m={databaseName:f,databaseId:n,isOwner:c,readOnly:u,resharingAllowed:d,encryptionMode:e.plaintextDbKey?"server-side":"end-to-end"},p=await(async(e,t,s,a,r,n)=>{const i=[],o={databaseId:e,databaseNameHash:t};let c=await sr.request("GetDatabaseUsers",o);for(i.push(...await tn(s,c.data.users,a,r,n));c.data.nextPageTokenLessThanUserId||c.data.nextPageTokenMoreThanUserId;)o.nextPageTokenLessThanUserId=c.data.nextPageTokenLessThanUserId,o.nextPageTokenMoreThanUserId=c.data.nextPageTokenMoreThanUserId,c=await sr.request("GetDatabaseUsers",o),i.push(...await tn(s,c.data.users,a,r,n));return i})(n,o,l,a,r,h);return c||(e=>{for(let t=0;t<e.length;t++){if(e[t].isOwner)return!0}return!1})(p)?(m.users=p,!c&&h&&(m.receivedFromUsername=h),m):null},an=async(e,t,s="end-to-end")=>{let a;Lr(s);try{a=Vr(e,t,null,s)}catch(r){const n="GetDatabases",i=e?{dbNameHash:"server-side"===s?e:await ja.hmac.signString(sr.keys.hmacKey,e)}:{databaseId:t},o=(await sr.request(n,i)).data.databases;if(!o||!o.length)throw new hs.DatabaseNotFound;a=o[0],a.dbNameHash=a.databaseNameHash,a.dbId=a.databaseId}return a},rn=async(e,t)=>{const s=await ja.aesGcm.getRawKeyFromKey(e),a=await ja.sha256.hash(s),r=await ja.hmac.importKeyFromRawBits(a);return await ja.hmac.signString(r,t)},nn=async(e,t)=>{const s=await rn(e,t);return await ja.ecdsa.signString(sr.keys.ecdsaPrivateKey,s)},on=async e=>{let t;return e.dbKey?t=await ja.aesGcm.getKeyStringFromKey(e.dbKey):(t=e.plaintextDbKey||await ja.aesGcm.decryptString(sr.keys.encryptionKey,e.encryptedDbKey),e.dbKey=await ja.aesGcm.getKeyFromKeyString(t)),t},cn=async(e,t,s,a,r)=>{const{databaseName:n,databaseId:o}=e,c=e.username.toLowerCase();try{const[e,u,d]=await Promise.all([Ts(c),a&&fn(),an(n,o,r)]);if(!e.ecdhPublicKey||!e.ecdsaPublicKey)throw new hs.UserUnableToReceiveDatabase;const h=i.a.decode(e.ecdsaPublicKey),l=await hn(h);a&&await(async(e,t,s)=>{let a,r;const n=Object.keys(s);for(let i=0;i<n.length;i++){const o=n[i],c=s[o].record.fingerprint;if(e===o&&t===c){a=c;break}c===t&&(r=!0)}if(!a&&r)throw new hs.UserMustBeReverified;if(!a)throw new hs.UserNotVerified})(c,l,u);const f=await ja.ecdsa.getPublicKeyFromRawPublicKey(h),{signedEcdhPublicKey:m,ecdhPublicKey:p}=e;if(!await ja.ecdsa.verify(f,i.a.decode(m),i.a.decode(p)))throw new hs.ServiceUnavailable;const w=await ja.ecdh.getPublicKeyFromRawPublicKey(i.a.decode(e.ecdhPublicKey)),g=await ja.ecdh.generateKeyPair(),y=await ja.ecdh.getRawPublicKeyFromPublicKey(g.publicKey),b=await ja.ecdsa.sign(sr.keys.ecdsaPrivateKey,y),v=await ja.ecdh.computeSharedKeyEncryptionKey(w,g.privateKey),M=await on(d),S=await ja.aesGcm.encryptString(v,M),I="ShareDatabase",P={databaseId:d.dbId,databaseNameHash:d.dbNameHash,username:c,readOnly:t,resharingAllowed:s,sharedEncryptedDbKey:S,ephemeralPublicKey:i.a.encode(y),signedEphemeralPublicKey:i.a.encode(b),sentSignature:await nn(d.dbKey,l),recipientEcdsaPublicKey:e.ecdsaPublicKey};await sr.request(I,P)}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"SharingWithSelfNotAllowed":throw new hs.SharingWithSelfNotAllowed;case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"ResharingNotAllowed":throw new hs.ResharingNotAllowed("Must have permission to reshare the database with another user");case"ResharingWithWriteAccessNotAllowed":throw new hs.ResharingWithWriteAccessNotAllowed;case"UserNotFound":throw new hs.UserNotFound;case"DatabaseAlreadyShared":return}throw e}},un=e=>{if("string"!=typeof e)throw new hs.UsernameMustBeString;if(0===e.length)throw new hs.UsernameCannotBeBlank},dn=e=>{if(Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;if(Ga(e,"username")&&un(e.username),Ga(e,"readOnly")&&"boolean"!=typeof e.readOnly)throw new hs.ReadOnlyMustBeBoolean;if(Ga(e,"resharingAllowed")&&"boolean"!=typeof e.resharingAllowed)throw new hs.ResharingAllowedMustBeBoolean;if(Ga(e,"requireVerified")&&"boolean"!=typeof e.requireVerified)throw new hs.RequireVerifiedMustBeBoolean},hn=async e=>{const t=await ja.sha256.hash(e);return i.a.encode(t)},ln=async()=>{const e=await ja.ecdsa.getPublicKeyFromPrivateKey(sr.keys.ecdsaPrivateKey),t=await ja.ecdsa.getRawPublicKeyFromPublicKey(e);return await hn(t)},fn=async()=>{await qr({databaseName:"__userbase_verified_users",changeHandler:()=>{},allowVerifiedUsersDatabase:!0,encryptionMode:"end-to-end"});const e=sr.state.dbNameToHash.__userbase_verified_users;return sr.state.databases[e].items};var mn={openDatabase:qr,getDatabases:async e=>{try{void 0!==e&&jr(e),Tr();const{encryptionKey:t,ecdhPrivateKey:s}=sr.keys,a=sr.session.username;if(e&&Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;const r=e&&e.encryptionMode||sr.encryptionMode;Lr(r);try{const n=[],i="GetDatabases",o=e&&{databaseId:e.databaseId,dbNameHash:"server-side"===r?e.databaseName:e.databaseName&&await ja.hmac.signString(sr.keys.hmacKey,e.databaseName)};let[c,u]=await Promise.all([sr.request(i,o),fn()]),d=await Promise.all(c.data.databases.map(e=>sn(e,t,s,u,a)));for(n.push(...d);c.data.nextPageToken;){const e={nextPageToken:c.data.nextPageToken};c=await sr.request(i,e),d=await Promise.all(c.data.databases.map(e=>sn(e,t,s,u,a))),n.push(...d)}return{databases:n.filter(e=>null!==e)}}catch(e){throw kr(e),e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},insertItem:Hr,updateItem:Jr,deleteItem:async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Delete",a=await Yr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemDoesNotExist":case"ItemUpdateConflict":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},putTransaction:async e=>{try{if(jr(e),!Ga(e,"operations"))throw new hs.OperationsMissing;const{databaseName:t,databaseId:s,shareToken:a,operations:r,encryptionMode:n=sr.encryptionMode}=e;if(!Array.isArray(r))throw new hs.OperationsMustBeArray;const i=Vr(t,s,a,n),o="BatchTransaction",c=await Promise.all(r.map(e=>{const t=e.command;switch(t){case"Insert":return Gr(i,e);case"Update":return Wr(i,e);case"Delete":return Yr(i,e);default:throw new hs.CommandNotRecognized(t)}})),u=await Promise.all(c),d={operations:r.map((e,t)=>Ur({command:e.command},u[t]))};try{await zr(i,o,d)}catch(e){if(e.response&&"OperationsExceedLimit"===e.response.data.error)throw new hs.OperationsExceedLimit(e.response.data.limit);throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"OperationsMissing":case"OperationsMustBeArray":case"OperationsConflict":case"OperationsExceedLimit":case"CommandNotRecognized":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemAlreadyExists":case"ItemDoesNotExist":case"ItemUpdateConflict":case"WriteAccessParamNotAllowed":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},uploadFile:async e=>{try{(e=>{if(jr(e),Ga(e,"progressHandler")&&"function"!=typeof e.progressHandler)throw new hs.ProgressHandlerMustBeFunction})(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),{dbId:s}=t;try{const{itemKey:a,fileMetadata:r}=await(async(e,t)=>{if(!Ga(e,"itemId"))throw new hs.ItemIdMissing;if(!Ga(e,"file"))throw new hs.FileMissing;const{itemId:s,file:a}=e;if("string"!=typeof s)throw new hs.ItemIdMustBeString;if(0===s.length)throw new hs.ItemIdCannotBeBlank;if(s.length>100)throw new hs.ItemIdTooLong(100);if(!t.itemExists(s))throw new hs.ItemDoesNotExist;if(!(a instanceof File))throw new hs.FileMustBeFile;if(0===a.size)throw new hs.FileCannotBeEmpty;const r=await ja.hmac.signString(sr.keys.hmacKey,s),n=t.getFileVersionNumber(s);return{itemKey:r,fileMetadata:{itemId:s,__v:void 0===n?0:n+1,fileName:a.name,fileSize:a.size,fileType:a.type}}})(e,t),[n,o]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(t.dbKey),c=await ja.aesGcm.encryptJson(n,r),{data:{fileId:u}}=await sr.request("GenerateFileId",{dbId:t.dbId}),d=e.file;let h=0,l=0,f=[];const m={bytesTransferred:0};for(;h<d.size;){const t=d.slice(h,h+524288);await Zr(f,t,s,u,n,l,m,e.progressHandler),l+=1,h+=524288}await Promise.all(f),await(async(e,t,s,a,r)=>{const n={dbId:e.dbId,fileId:t,itemKey:s,fileMetadata:a,fileEncryptionKey:i.a.encode(r)};await zr(e,"CompleteFileUpload",n)})(t,u,a,c,o)}catch(e){if(kr(e),e.response&&"DatabaseIsReadOnly"===e.response.data)throw new hs.DatabaseIsReadOnly;throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemDoesNotExist":case"TransactionUnauthorized":case"FileMustBeFile":case"FileCannotBeEmpty":case"FileMissing":case"FileUploadConflict":case"ProgressHandlerMustBeFunction":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},getFile:async e=>{try{(e=>{if(jr(e),!Ga(e,"fileId"))throw new hs.FileIdMissing;const{fileId:t,range:s}=e;if("string"!=typeof t)throw new hs.FileIdMustBeString;if(0===t.length)throw new hs.FileIdCannotBeBlank;if(t.length>100)throw new hs.FileIdTooLong(100);if(Ga(e,"range")){if("object"!=typeof s)throw new hs.RangeMustBeObject;if(!Ga(s,"start"))throw new hs.RangeMissingStart;if(!Ga(s,"end"))throw new hs.RangeMissingEnd;const{start:e,end:t}=s;if("number"!=typeof e)throw new hs.RangeStartMustBeNumber;if("number"!=typeof t)throw new hs.RangeEndMustBeNumber;if(e<0)throw new hs.RangeStartMustBeGreaterThanZero;if(t<=e)throw new hs.RangeEndMustBeGreaterThanRangeStart}})(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),{dbId:s}=t,{fileId:a,range:r}=e,n=t.fileIds[a],i=t.items[n];if(!i||!i.file)throw new hs.FileNotFound;const{file:{fileName:o,fileSize:c,fileType:u,fileEncryptionKey:d}}=i;if(r&&r.end>c)throw new hs.RangeEndMustBeLessThanFileSize;const h=r?await(async(e,t,s,a)=>{const{start:r,end:n}=a,i=[],o=Math.floor(r/524288),c=Math.floor(n/524288)-(n%524288==0?1:0);let u=o;for(;u<=c;){let a=await Xr(e,t,u,s);u===o&&u===c&&n%524288?a=a.slice(r%524288,n%524288):u===o?a=a.slice(r%524288):u===c&&n%524288&&(a=a.slice(0,n%524288)),i.push(a),u+=1}return i})(s,a,d,r):await(async(e,t,s,a)=>{const r=[];let n=0;const i=a<524288?0:Math.floor(a/524288)-(a%524288==0?1:0);for(;n<=i;){const a=await Xr(e,t,n,s);r.push(a),n+=1}return r})(s,a,d,c);return{file:new File(h,o,{type:u})}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"FileIdMissing":case"FileIdMustBeString":case"FileIdCannotBeBlank":case"FileIdTooLong":case"FileNotFound":case"RangeMustBeObject":case"RangeMissingStart":case"RangeMissingEnd":case"RangeStartMustBeNumber":case"RangeEndMustBeNumber":case"RangeStartMustBeGreaterThanZero":case"RangeEndMustBeGreaterThanRangeStart":case"RangeEndMustBeLessThanFileSize":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},shareDatabase:async e=>{try{jr(e),dn(e);const t=!Ga(e,"readOnly")||e.readOnly,s=!!Ga(e,"resharingAllowed")&&e.resharingAllowed,a=!Ga(e,"requireVerified")||e.requireVerified,r=e.encryptionMode||sr.encryptionMode;Lr(r);let n={};return Ga(e,"username")?await cn(e,t,s,a,r):n.shareToken=await(async(e,t,s)=>{try{const{databaseName:a,databaseId:r}=e;if(Ga(e,"requireVerified"))throw new hs.RequireVerifiedParamNotNecessary;if(Ga(e,"resharingAllowed"))throw new hs.ResharingAllowedParamNotAllowed("when retrieving a share token");const n=ja.generateSeed(),o=await ja.hkdf.importHkdfKey(n),c=ja.hkdf.generateSalt(),u=await ja.aesGcm.importKeyFromMaster(o,c),d=await an(a,r,s),h=await on(d),l=await ja.aesGcm.encryptString(u,h),{ecdsaPublicKey:f,encryptedEcdsaPrivateKey:m,ecdsaKeyEncryptionKeySalt:p}=await ja.ecdsa.generateEcdsaKeyData(o),w="ShareDatabaseToken",g={databaseId:d.dbId,databaseNameHash:d.dbNameHash,readOnly:t,keyData:{shareTokenEncryptedDbKey:l,shareTokenEncryptionKeySalt:i.a.encode(c),shareTokenPublicKey:f,shareTokenEncryptedEcdsaPrivateKey:m,shareTokenEcdsaKeyEncryptionKeySalt:p}},y=await sr.request(w,g),{shareTokenId:b}=y.data,v=Ls(b,!0);return i.a.encode(js(v,n))}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"ResharingNotAllowed":throw new hs.ResharingNotAllowed("Only the owner can generate a share token")}throw e}})(e,t,r),n}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"DatabaseNotFound":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"ReadOnlyMustBeBoolean":case"ResharingAllowedMustBeBoolean":case"ResharingNotAllowed":case"ResharingWithWriteAccessNotAllowed":case"ResharingAllowedParamNotAllowed":case"RequireVerifiedMustBeBoolean":case"RequireVerifiedParamNotNecessary":case"SharingWithSelfNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"UserUnableToReceiveDatabase":case"UserNotFound":case"UserNotVerified":case"UserMustBeReverified":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},modifyDatabasePermissions:async e=>{try{if(jr(e),dn(e),!Ga(e,"username"))throw new hs.UsernameMissing;if(Ga(e,"revoke")){if("boolean"!=typeof e.revoke)throw new hs.RevokeMustBeBoolean;if(e.revoke){if(Ga(e,"readOnly"))throw new hs.ReadOnlyParamNotAllowed;if(Ga(e,"resharingAllowed"))throw new hs.ResharingAllowedParamNotAllowed("when revoking access to a database")}}else if(!Ga(e,"readOnly")&&!Ga(e,"resharingAllowed"))throw new hs.ParamsMissing;const{databaseName:t,databaseId:s,readOnly:a,resharingAllowed:r,revoke:n,encryptionMode:i=sr.encryptionMode}=e,o=e.username.toLowerCase();try{const e=await an(t,s,i),c="ModifyDatabasePermissions",u={databaseId:e.dbId,databaseNameHash:e.dbNameHash,username:o,readOnly:a,resharingAllowed:r,revoke:n};await sr.request(c,u)}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"SharingWithSelfNotAllowed":throw new hs.ModifyingOwnPermissionsNotAllowed;case"ModifyingOwnerPermissionsNotAllowed":throw new hs.ModifyingOwnerPermissionsNotAllowed;case"ResharingNotAllowed":throw new hs.ModifyingPermissionsNotAllowed;case"ResharingWithWriteAccessNotAllowed":throw new hs.GrantingWriteAccessNotAllowed;case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"UserNotFound":throw new hs.UserNotFound}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"ParamsMissing":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"DatabaseNotFound":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UsernameMissing":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"ReadOnlyMustBeBoolean":case"ReadOnlyParamNotAllowed":case"ResharingAllowedMustBeBoolean":case"ResharingAllowedParamNotAllowed":case"RevokeMustBeBoolean":case"ModifyingOwnPermissionsNotAllowed":case"ModifyingOwnerPermissionsNotAllowed":case"ModifyingPermissionsNotAllowed":case"GrantingWriteAccessNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},getVerificationMessage:async()=>{try{Tr();const e=sr.session.username,t=await ln();return{verificationMessage:((e,t)=>btoa(JSON.stringify({username:e,fingerprint:t})))(e,t)}}catch(e){switch(e.name){case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},verifyUser:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Tr(),!Ga(e,"verificationMessage"))throw new hs.VerificationMessageMissing;const{verificationMessage:t}=e;if("string"!=typeof t)throw new hs.VerificationMessageMustBeString;if(0===t.length)throw new hs.VerificationMessageCannotBeBlank;const{username:s,fingerprint:a}=(e=>{try{const{username:t,fingerprint:s}=JSON.parse(atob(e));if(un(t),!s)throw new hs.VerificationMessageInvalid;return{username:t,fingerprint:s}}catch(e){throw new hs.VerificationMessageInvalid}})(t);if(s===sr.session.username||a===await ln())throw new hs.VerifyingSelfNotAllowed;await fn();const r="__userbase_verified_users",n=!0,i=s,o={fingerprint:a};try{await Hr({databaseName:r,itemId:i,item:o,allowVerifiedUsersDatabase:n})}catch(e){if("ItemAlreadyExists"!==e.name)throw e;await Jr({databaseName:r,itemId:i,item:o,allowVerifiedUsersDatabase:n})}}catch(e){switch(e.name){case"ParamsMustBeObject":case"VerificationMessageMissing":case"VerificationMessageMustBeString":case"VerificationMessageCannotBeBlank":case"VerificationMessageInvalid":case"VerifyingSelfNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}};const pn=()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init)throw new hs.UserNotSignedIn},wn=e=>{if(e.response){if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout},gn=e=>{pn();const t=sr.userData.stripeData;if(!t.stripeAccountId)throw new hs.StripeAccountNotConnected;if("disabled"===t.paymentsMode)throw new hs.PaymentsDisabled;if(!Ga(window,"Stripe"))throw new hs.StripeJsLibraryMissing;if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"successUrl"))throw new hs.SuccessUrlMissing;if("string"!=typeof e.successUrl)throw new hs.SuccessUrlMustBeString;const s=qa(e.successUrl);if("http"!==s&&"https"!==s){const e=!0;throw new hs.SuccessUrlInvalid(e)}if(!Ga(e,"cancelUrl"))throw new hs.CancelUrlMissing;if("string"!=typeof e.cancelUrl)throw new hs.CancelUrlMustBeString;const a=qa(e.cancelUrl);if("http"!==a&&"https"!==a){const e=!0;throw new hs.CancelUrlInvalid(e)}},yn=()=>{pn();const e=sr.userData.stripeData;if(!e.stripeAccountId)throw new hs.StripeAccountNotConnected;if("disabled"===e.paymentsMode)throw new hs.PaymentsDisabled;if("canceled"===e.subscriptionStatus)throw new hs.SubscriptionAlreadyCanceled};var bn={purchaseSubscription:async e=>{try{const t=sr.userData.stripeData;if(!t.cancelSubscriptionAt&&t.subscriptionStatus&&"canceled"!==t.subscriptionStatus)throw new hs.SubscriptionPlanAlreadyPurchased;gn(e);try{const s="PurchaseSubscription",a=(await sr.request(s,e)).data,r=vs("prod"===t.paymentsMode),n=await window.Stripe(r,{stripeAccount:t.stripeAccountId}).redirectToCheckout({sessionId:a});if(n.error)throw n.error}catch(e){if(wn(e),e.response)switch(e.response.data){case"PriceIdOrPlanIdAllowed":throw new hs.PriceIdOrPlanIdAllowed;case"PriceIdOrPlanIdMissing":throw new hs.PriceIdOrPlanIdMissing;case"SubscriptionPlanAlreadyPurchased":throw new hs.SubscriptionPlanAlreadyPurchased;case"SuccessUrlInvalid":throw new hs.SuccessUrlInvalid;case"CancelUrlInvalid":throw new hs.CancelUrlInvalid;default:if(e.response.data&&"StripeError"===e.response.data.name)throw new hs.StripeError(e.response.data)}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"SuccessUrlMissing":case"SuccessUrlMustBeString":case"SuccessUrlInvalid":case"CancelUrlMissing":case"CancelUrlMustBeString":case"CancelUrlInvalid":case"StripeError":case"StripeJsLibraryMissing":case"PriceIdOrPlanIdAllowed":case"PriceIdOrPlanIdMissing":case"SubscriptionPlanAlreadyPurchased":case"StripeAccountNotConnected":case"PaymentsDisabled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},cancelSubscription:async()=>{try{yn();try{const e="CancelSubscription",t=(await sr.request(e)).data;return sr.userData.stripeData.cancelSubscriptionAt=t,{cancelSubscriptionAt:t}}catch(e){if(wn(e),e.response&&"SubscriptionNotFound"===e.response.data)throw new hs.SubscriptionNotFound;throw e}}catch(e){switch(e.name){case"SubscriptionNotFound":case"StripeAccountNotConnected":case"PaymentsDisabled":case"SubscriptionAlreadyCanceled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},resumeSubscription:async()=>{try{yn();try{const e="ResumeSubscription";await sr.request(e),delete sr.userData.stripeData.cancelSubscriptionAt}catch(e){if(wn(e),e.response&&"SubscriptionNotFound"===e.response.data)throw new hs.SubscriptionNotFound;throw e}}catch(e){switch(e.name){case"SubscriptionNotFound":case"StripeAccountNotConnected":case"PaymentsDisabled":case"SubscriptionAlreadyCanceled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},updatePaymentMethod:async e=>{try{gn(e);const t=sr.userData.stripeData;if(!t.subscriptionStatus)throw new hs.SubscriptionNotPurchased;try{const s="UpdatePaymentMethod",a=(await sr.request(s,e)).data,r=vs("prod"===t.paymentsMode),n=await window.Stripe(r,{stripeAccount:t.stripeAccountId}).redirectToCheckout({sessionId:a});if(n.error)throw n.error}catch(e){if(wn(e),e.response){if("SuccessUrlInvalid"===e.response.data)throw new hs.SuccessUrlInvalid;if("CancelUrlInvalid"===e.response.data)throw new hs.CancelUrlInvalid}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"SuccessUrlMissing":case"SuccessUrlMustBeString":case"SuccessUrlInvalid":case"CancelUrlMissing":case"CancelUrlMustBeString":case"CancelUrlInvalid":case"StripeJsLibraryMissing":case"SubscriptionNotPurchased":case"StripeAccountNotConnected":case"PaymentsDisabled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}};t.default={init:Pr.init,signUp:Pr.signUp,signIn:Pr.signIn,signOut:Pr.signOut,updateUser:Pr.updateUser,deleteUser:Pr.deleteUser,forgotPassword:Pr.forgotPassword,openDatabase:mn.openDatabase,insertItem:mn.insertItem,updateItem:mn.updateItem,deleteItem:mn.deleteItem,putTransaction:mn.putTransaction,uploadFile:mn.uploadFile,getFile:mn.getFile,getDatabases:mn.getDatabases,shareDatabase:mn.shareDatabase,modifyDatabasePermissions:mn.modifyDatabasePermissions,getVerificationMessage:mn.getVerificationMessage,verifyUser:mn.verifyUser,purchaseSubscription:bn.purchaseSubscription,cancelSubscription:bn.cancelSubscription,resumeSubscription:bn.resumeSubscription,updatePaymentMethod:bn.updatePaymentMethod}}]).default;
+//# sourceMappingURL=userbase.js.map
+var userbase=function(e){var t={};function s(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,s),r.l=!0,r.exports}return s.m=e,s.c=t,s.d=function(e,t,a){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(s.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)s.d(a,r,function(t){return e[t]}.bind(null,r));return a},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=27)}([function(e,t){!function(){"use strict";for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=new Uint8Array(256),a=0;a<e.length;a++)s[e.charCodeAt(a)]=a;t.encode=function(t){var s,a=new Uint8Array(t),r=a.length,n="";for(s=0;s<r;s+=3)n+=e[a[s]>>2],n+=e[(3&a[s])<<4|a[s+1]>>4],n+=e[(15&a[s+1])<<2|a[s+2]>>6],n+=e[63&a[s+2]];return r%3==2?n=n.substring(0,n.length-1)+"=":r%3==1&&(n=n.substring(0,n.length-2)+"=="),n},t.decode=function(e){var t,a,r,n,i,o=.75*e.length,c=e.length,u=0;"="===e[e.length-1]&&(o--,"="===e[e.length-2]&&o--);var d=new ArrayBuffer(o),h=new Uint8Array(d);for(t=0;t<c;t+=4)a=s[e.charCodeAt(t)],r=s[e.charCodeAt(t+1)],n=s[e.charCodeAt(t+2)],i=s[e.charCodeAt(t+3)],h[u++]=a<<2|r>>4,h[u++]=(15&r)<<4|n>>2,h[u++]=(3&n)<<6|63&i;return d}}()},function(e,t){e.exports=function(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}},function(e,t,s){var a=s(13),r=s(14);e.exports=function(e,t,s){var n=t&&s||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||a)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var o=0;o<16;++o)t[n+o]=i[o];return t||r(i)}},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s},function(e,t,s){"use strict";(function(e){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <http://feross.org>
+ * @license  MIT
+ */
+var a=s(15),r=s(16),n=s(17);function i(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()<t)throw new RangeError("Invalid typed array length");return c.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=c.prototype:(null===e&&(e=new c(t)),e.length=t),e}function c(e,t,s){if(!(c.TYPED_ARRAY_SUPPORT||this instanceof c))return new c(e,t,s);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return h(this,e)}return u(this,e,t,s)}function u(e,t,s,a){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,s,a){if(t.byteLength,s<0||t.byteLength<s)throw new RangeError("'offset' is out of bounds");if(t.byteLength<s+(a||0))throw new RangeError("'length' is out of bounds");t=void 0===s&&void 0===a?new Uint8Array(t):void 0===a?new Uint8Array(t,s):new Uint8Array(t,s,a);c.TYPED_ARRAY_SUPPORT?(e=t).__proto__=c.prototype:e=l(e,t);return e}(e,t,s,a):"string"==typeof t?function(e,t,s){"string"==typeof s&&""!==s||(s="utf8");if(!c.isEncoding(s))throw new TypeError('"encoding" must be a valid string encoding');var a=0|m(t,s),r=(e=o(e,a)).write(t,s);r!==a&&(e=e.slice(0,r));return e}(e,t,s):function(e,t){if(c.isBuffer(t)){var s=0|f(t.length);return 0===(e=o(e,s)).length||t.copy(e,0,0,s),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(a=t.length)!=a?o(e,0):l(e,t);if("Buffer"===t.type&&n(t.data))return l(e,t.data)}var a;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function d(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function h(e,t){if(d(t),e=o(e,t<0?0:0|f(t)),!c.TYPED_ARRAY_SUPPORT)for(var s=0;s<t;++s)e[s]=0;return e}function l(e,t){var s=t.length<0?0:0|f(t.length);e=o(e,s);for(var a=0;a<s;a+=1)e[a]=255&t[a];return e}function f(e){if(e>=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var s=e.length;if(0===s)return 0;for(var a=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":case void 0:return L(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;case"base64":return j(e).length;default:if(a)return L(e).length;t=(""+t).toLowerCase(),a=!0}}function p(e,t,s){var a=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===s||s>this.length)&&(s=this.length),s<=0)return"";if((s>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,s);case"utf8":case"utf-8":return B(this,t,s);case"ascii":return N(this,t,s);case"latin1":case"binary":return U(this,t,s);case"base64":return E(this,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,t,s);default:if(a)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),a=!0}}function w(e,t,s){var a=e[t];e[t]=e[s],e[s]=a}function g(e,t,s,a,r){if(0===e.length)return-1;if("string"==typeof s?(a=s,s=0):s>2147483647?s=2147483647:s<-2147483648&&(s=-2147483648),s=+s,isNaN(s)&&(s=r?0:e.length-1),s<0&&(s=e.length+s),s>=e.length){if(r)return-1;s=e.length-1}else if(s<0){if(!r)return-1;s=0}if("string"==typeof t&&(t=c.from(t,a)),c.isBuffer(t))return 0===t.length?-1:y(e,t,s,a,r);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,s):Uint8Array.prototype.lastIndexOf.call(e,t,s):y(e,[t],s,a,r);throw new TypeError("val must be string, number or Buffer")}function y(e,t,s,a,r){var n,i=1,o=e.length,c=t.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(e.length<2||t.length<2)return-1;i=2,o/=2,c/=2,s/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(r){var d=-1;for(n=s;n<o;n++)if(u(e,n)===u(t,-1===d?0:n-d)){if(-1===d&&(d=n),n-d+1===c)return d*i}else-1!==d&&(n-=n-d),d=-1}else for(s+c>o&&(s=o-c),n=s;n>=0;n--){for(var h=!0,l=0;l<c;l++)if(u(e,n+l)!==u(t,l)){h=!1;break}if(h)return n}return-1}function b(e,t,s,a){s=Number(s)||0;var r=e.length-s;a?(a=Number(a))>r&&(a=r):a=r;var n=t.length;if(n%2!=0)throw new TypeError("Invalid hex string");a>n/2&&(a=n/2);for(var i=0;i<a;++i){var o=parseInt(t.substr(2*i,2),16);if(isNaN(o))return i;e[s+i]=o}return i}function v(e,t,s,a){return q(L(t,e.length-s),e,s,a)}function M(e,t,s,a){return q(function(e){for(var t=[],s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,a)}function S(e,t,s,a){return M(e,t,s,a)}function I(e,t,s,a){return q(j(t),e,s,a)}function P(e,t,s,a){return q(function(e,t){for(var s,a,r,n=[],i=0;i<e.length&&!((t-=2)<0);++i)s=e.charCodeAt(i),a=s>>8,r=s%256,n.push(r),n.push(a);return n}(t,e.length-s),e,s,a)}function E(e,t,s){return 0===t&&s===e.length?a.fromByteArray(e):a.fromByteArray(e.slice(t,s))}function B(e,t,s){s=Math.min(e.length,s);for(var a=[],r=t;r<s;){var n,i,o,c,u=e[r],d=null,h=u>239?4:u>223?3:u>191?2:1;if(r+h<=s)switch(h){case 1:u<128&&(d=u);break;case 2:128==(192&(n=e[r+1]))&&(c=(31&u)<<6|63&n)>127&&(d=c);break;case 3:n=e[r+1],i=e[r+2],128==(192&n)&&128==(192&i)&&(c=(15&u)<<12|(63&n)<<6|63&i)>2047&&(c<55296||c>57343)&&(d=c);break;case 4:n=e[r+1],i=e[r+2],o=e[r+3],128==(192&n)&&128==(192&i)&&128==(192&o)&&(c=(15&u)<<18|(63&n)<<12|(63&i)<<6|63&o)>65535&&c<1114112&&(d=c)}null===d?(d=65533,h=1):d>65535&&(d-=65536,a.push(d>>>10&1023|55296),d=56320|1023&d),a.push(d),r+=h}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var s="",a=0;for(;a<t;)s+=String.fromCharCode.apply(String,e.slice(a,a+=4096));return s}(a)}t.Buffer=c,t.SlowBuffer=function(e){+e!=e&&(e=0);return c.alloc(+e)},t.INSPECT_MAX_BYTES=50,c.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),c.poolSize=8192,c._augment=function(e){return e.__proto__=c.prototype,e},c.from=function(e,t,s){return u(null,e,t,s)},c.TYPED_ARRAY_SUPPORT&&(c.prototype.__proto__=Uint8Array.prototype,c.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&c[Symbol.species]===c&&Object.defineProperty(c,Symbol.species,{value:null,configurable:!0})),c.alloc=function(e,t,s){return function(e,t,s,a){return d(t),t<=0?o(e,t):void 0!==s?"string"==typeof a?o(e,t).fill(s,a):o(e,t).fill(s):o(e,t)}(null,e,t,s)},c.allocUnsafe=function(e){return h(null,e)},c.allocUnsafeSlow=function(e){return h(null,e)},c.isBuffer=function(e){return!(null==e||!e._isBuffer)},c.compare=function(e,t){if(!c.isBuffer(e)||!c.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var s=e.length,a=t.length,r=0,n=Math.min(s,a);r<n;++r)if(e[r]!==t[r]){s=e[r],a=t[r];break}return s<a?-1:a<s?1:0},c.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},c.concat=function(e,t){if(!n(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return c.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var a=c.allocUnsafe(t),r=0;for(s=0;s<e.length;++s){var i=e[s];if(!c.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(a,r),r+=i.length}return a},c.byteLength=m,c.prototype._isBuffer=!0,c.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)w(this,t,t+1);return this},c.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)w(this,t,t+3),w(this,t+1,t+2);return this},c.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)w(this,t,t+7),w(this,t+1,t+6),w(this,t+2,t+5),w(this,t+3,t+4);return this},c.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?B(this,0,e):p.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e="",s=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,s).match(/.{2}/g).join(" "),this.length>s&&(e+=" ... ")),"<Buffer "+e+">"},c.prototype.compare=function(e,t,s,a,r){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===s&&(s=e?e.length:0),void 0===a&&(a=0),void 0===r&&(r=this.length),t<0||s>e.length||a<0||r>this.length)throw new RangeError("out of range index");if(a>=r&&t>=s)return 0;if(a>=r)return-1;if(t>=s)return 1;if(this===e)return 0;for(var n=(r>>>=0)-(a>>>=0),i=(s>>>=0)-(t>>>=0),o=Math.min(n,i),u=this.slice(a,r),d=e.slice(t,s),h=0;h<o;++h)if(u[h]!==d[h]){n=u[h],i=d[h];break}return n<i?-1:i<n?1:0},c.prototype.includes=function(e,t,s){return-1!==this.indexOf(e,t,s)},c.prototype.indexOf=function(e,t,s){return g(this,e,t,s,!0)},c.prototype.lastIndexOf=function(e,t,s){return g(this,e,t,s,!1)},c.prototype.write=function(e,t,s,a){if(void 0===t)a="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)a=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(s)?(s|=0,void 0===a&&(a="utf8")):(a=s,s=void 0)}var r=this.length-t;if((void 0===s||s>r)&&(s=r),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");for(var n=!1;;)switch(a){case"hex":return b(this,e,t,s);case"utf8":case"utf-8":return v(this,e,t,s);case"ascii":return M(this,e,t,s);case"latin1":case"binary":return S(this,e,t,s);case"base64":return I(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,t,s);default:if(n)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),n=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function N(e,t,s){var a="";s=Math.min(e.length,s);for(var r=t;r<s;++r)a+=String.fromCharCode(127&e[r]);return a}function U(e,t,s){var a="";s=Math.min(e.length,s);for(var r=t;r<s;++r)a+=String.fromCharCode(e[r]);return a}function A(e,t,s){var a=e.length;(!t||t<0)&&(t=0),(!s||s<0||s>a)&&(s=a);for(var r="",n=t;n<s;++n)r+=F(e[n]);return r}function T(e,t,s){for(var a=e.slice(t,s),r="",n=0;n<a.length;n+=2)r+=String.fromCharCode(a[n]+256*a[n+1]);return r}function k(e,t,s){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>s)throw new RangeError("Trying to access beyond buffer length")}function D(e,t,s,a,r,n){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||t<n)throw new RangeError('"value" argument is out of bounds');if(s+a>e.length)throw new RangeError("Index out of range")}function K(e,t,s,a){t<0&&(t=65535+t+1);for(var r=0,n=Math.min(e.length-s,2);r<n;++r)e[s+r]=(t&255<<8*(a?r:1-r))>>>8*(a?r:1-r)}function x(e,t,s,a){t<0&&(t=4294967295+t+1);for(var r=0,n=Math.min(e.length-s,4);r<n;++r)e[s+r]=t>>>8*(a?r:3-r)&255}function R(e,t,s,a,r,n){if(s+a>e.length)throw new RangeError("Index out of range");if(s<0)throw new RangeError("Index out of range")}function O(e,t,s,a,n){return n||R(e,0,s,4),r.write(e,t,s,a,23,4),s+4}function C(e,t,s,a,n){return n||R(e,0,s,8),r.write(e,t,s,a,52,8),s+8}c.prototype.slice=function(e,t){var s,a=this.length;if((e=~~e)<0?(e+=a)<0&&(e=0):e>a&&(e=a),(t=void 0===t?a:~~t)<0?(t+=a)<0&&(t=0):t>a&&(t=a),t<e&&(t=e),c.TYPED_ARRAY_SUPPORT)(s=this.subarray(e,t)).__proto__=c.prototype;else{var r=t-e;s=new c(r,void 0);for(var n=0;n<r;++n)s[n]=this[n+e]}return s},c.prototype.readUIntLE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e],r=1,n=0;++n<t&&(r*=256);)a+=this[e+n]*r;return a},c.prototype.readUIntBE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e+--t],r=1;t>0&&(r*=256);)a+=this[e+--t]*r;return a},c.prototype.readUInt8=function(e,t){return t||k(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||k(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||k(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||k(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||k(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=this[e],r=1,n=0;++n<t&&(r*=256);)a+=this[e+n]*r;return a>=(r*=128)&&(a-=Math.pow(2,8*t)),a},c.prototype.readIntBE=function(e,t,s){e|=0,t|=0,s||k(e,t,this.length);for(var a=t,r=1,n=this[e+--a];a>0&&(r*=256);)n+=this[e+--a]*r;return n>=(r*=128)&&(n-=Math.pow(2,8*t)),n},c.prototype.readInt8=function(e,t){return t||k(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||k(e,2,this.length);var s=this[e]|this[e+1]<<8;return 32768&s?4294901760|s:s},c.prototype.readInt16BE=function(e,t){t||k(e,2,this.length);var s=this[e+1]|this[e]<<8;return 32768&s?4294901760|s:s},c.prototype.readInt32LE=function(e,t){return t||k(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||k(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||k(e,4,this.length),r.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||k(e,4,this.length),r.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||k(e,8,this.length),r.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||k(e,8,this.length),r.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,s,a){(e=+e,t|=0,s|=0,a)||D(this,e,t,s,Math.pow(2,8*s)-1,0);var r=1,n=0;for(this[t]=255&e;++n<s&&(r*=256);)this[t+n]=e/r&255;return t+s},c.prototype.writeUIntBE=function(e,t,s,a){(e=+e,t|=0,s|=0,a)||D(this,e,t,s,Math.pow(2,8*s)-1,0);var r=s-1,n=1;for(this[t+r]=255&e;--r>=0&&(n*=256);)this[t+r]=e/n&255;return t+s},c.prototype.writeUInt8=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):K(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):K(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):x(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,s,a){if(e=+e,t|=0,!a){var r=Math.pow(2,8*s-1);D(this,e,t,s,r-1,-r)}var n=0,i=1,o=0;for(this[t]=255&e;++n<s&&(i*=256);)e<0&&0===o&&0!==this[t+n-1]&&(o=1),this[t+n]=(e/i>>0)-o&255;return t+s},c.prototype.writeIntBE=function(e,t,s,a){if(e=+e,t|=0,!a){var r=Math.pow(2,8*s-1);D(this,e,t,s,r-1,-r)}var n=s-1,i=1,o=0;for(this[t+n]=255&e;--n>=0&&(i*=256);)e<0&&0===o&&0!==this[t+n+1]&&(o=1),this[t+n]=(e/i>>0)-o&255;return t+s},c.prototype.writeInt8=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):K(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):K(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):x(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,s){return e=+e,t|=0,s||D(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):x(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,s){return O(this,e,t,!0,s)},c.prototype.writeFloatBE=function(e,t,s){return O(this,e,t,!1,s)},c.prototype.writeDoubleLE=function(e,t,s){return C(this,e,t,!0,s)},c.prototype.writeDoubleBE=function(e,t,s){return C(this,e,t,!1,s)},c.prototype.copy=function(e,t,s,a){if(s||(s=0),a||0===a||(a=this.length),t>=e.length&&(t=e.length),t||(t=0),a>0&&a<s&&(a=s),a===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("sourceStart out of bounds");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),e.length-t<a-s&&(a=e.length-t+s);var r,n=a-s;if(this===e&&s<t&&t<a)for(r=n-1;r>=0;--r)e[r+t]=this[r+s];else if(n<1e3||!c.TYPED_ARRAY_SUPPORT)for(r=0;r<n;++r)e[r+t]=this[r+s];else Uint8Array.prototype.set.call(e,this.subarray(s,s+n),t);return n},c.prototype.fill=function(e,t,s,a){if("string"==typeof e){if("string"==typeof t?(a=t,t=0,s=this.length):"string"==typeof s&&(a=s,s=this.length),1===e.length){var r=e.charCodeAt(0);r<256&&(e=r)}if(void 0!==a&&"string"!=typeof a)throw new TypeError("encoding must be a string");if("string"==typeof a&&!c.isEncoding(a))throw new TypeError("Unknown encoding: "+a)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<s)throw new RangeError("Out of range index");if(s<=t)return this;var n;if(t>>>=0,s=void 0===s?this.length:s>>>0,e||(e=0),"number"==typeof e)for(n=t;n<s;++n)this[n]=e;else{var i=c.isBuffer(e)?e:L(new c(e,a).toString()),o=i.length;for(n=0;n<s-t;++n)this[n+t]=i[n%o]}return this};var _=/[^+\/0-9A-Za-z-_]/g;function F(e){return e<16?"0"+e.toString(16):e.toString(16)}function L(e,t){var s;t=t||1/0;for(var a=e.length,r=null,n=[],i=0;i<a;++i){if((s=e.charCodeAt(i))>55295&&s<57344){if(!r){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(i+1===a){(t-=3)>-1&&n.push(239,191,189);continue}r=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),r=s;continue}s=65536+(r-55296<<10|s-56320)}else r&&(t-=3)>-1&&n.push(239,191,189);if(r=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function j(e){return a.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(_,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,s,a){for(var r=0;r<a&&!(r+s>=t.length||r>=e.length);++r)t[r+s]=e[r];return r}}).call(this,s(3))},function(e,t,s){(function(e){!function(e,t){"use strict";function a(e,t){if(!e)throw new Error(t||"Assertion failed")}function r(e,t){e.super_=t;var s=function(){};s.prototype=t.prototype,e.prototype=new s,e.prototype.constructor=e}function n(e,t,s){if(n.isBN(e))return e;this.negative=0,this.words=null,this.length=0,this.red=null,null!==e&&("le"!==t&&"be"!==t||(s=t,t=10),this._init(e||0,t||10,s||"be"))}var i;"object"==typeof e?e.exports=n:t.BN=n,n.BN=n,n.wordSize=26;try{i=s(20).Buffer}catch(e){}function o(e,t,s){for(var a=0,r=Math.min(e.length,s),n=t;n<r;n++){var i=e.charCodeAt(n)-48;a<<=4,a|=i>=49&&i<=54?i-49+10:i>=17&&i<=22?i-17+10:15&i}return a}function c(e,t,s,a){for(var r=0,n=Math.min(e.length,s),i=t;i<n;i++){var o=e.charCodeAt(i)-48;r*=a,r+=o>=49?o-49+10:o>=17?o-17+10:o}return r}n.isBN=function(e){return e instanceof n||null!==e&&"object"==typeof e&&e.constructor.wordSize===n.wordSize&&Array.isArray(e.words)},n.max=function(e,t){return e.cmp(t)>0?e:t},n.min=function(e,t){return e.cmp(t)<0?e:t},n.prototype._init=function(e,t,s){if("number"==typeof e)return this._initNumber(e,t,s);if("object"==typeof e)return this._initArray(e,t,s);"hex"===t&&(t=16),a(t===(0|t)&&t>=2&&t<=36);var r=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&r++,16===t?this._parseHex(e,r):this._parseBase(e,t,r),"-"===e[0]&&(this.negative=1),this.strip(),"le"===s&&this._initArray(this.toArray(),t,s)},n.prototype._initNumber=function(e,t,s){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(a(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===s&&this._initArray(this.toArray(),t,s)},n.prototype._initArray=function(e,t,s){if(a("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var r=0;r<this.length;r++)this.words[r]=0;var n,i,o=0;if("be"===s)for(r=e.length-1,n=0;r>=0;r-=3)i=e[r]|e[r-1]<<8|e[r-2]<<16,this.words[n]|=i<<o&67108863,this.words[n+1]=i>>>26-o&67108863,(o+=24)>=26&&(o-=26,n++);else if("le"===s)for(r=0,n=0;r<e.length;r+=3)i=e[r]|e[r+1]<<8|e[r+2]<<16,this.words[n]|=i<<o&67108863,this.words[n+1]=i>>>26-o&67108863,(o+=24)>=26&&(o-=26,n++);return this.strip()},n.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var s=0;s<this.length;s++)this.words[s]=0;var a,r,n=0;for(s=e.length-6,a=0;s>=t;s-=6)r=o(e,s,s+6),this.words[a]|=r<<n&67108863,this.words[a+1]|=r>>>26-n&4194303,(n+=24)>=26&&(n-=26,a++);s+6!==t&&(r=o(e,t,s+6),this.words[a]|=r<<n&67108863,this.words[a+1]|=r>>>26-n&4194303),this.strip()},n.prototype._parseBase=function(e,t,s){this.words=[0],this.length=1;for(var a=0,r=1;r<=67108863;r*=t)a++;a--,r=r/t|0;for(var n=e.length-s,i=n%a,o=Math.min(n,n-i)+s,u=0,d=s;d<o;d+=a)u=c(e,d,d+a,t),this.imuln(r),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u);if(0!==i){var h=1;for(u=c(e,d,e.length,t),d=0;d<i;d++)h*=t;this.imuln(h),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u)}},n.prototype.copy=function(e){e.words=new Array(this.length);for(var t=0;t<this.length;t++)e.words[t]=this.words[t];e.length=this.length,e.negative=this.negative,e.red=this.red},n.prototype.clone=function(){var e=new n(null);return this.copy(e),e},n.prototype._expand=function(e){for(;this.length<e;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function l(e,t,s){s.negative=t.negative^e.negative;var a=e.length+t.length|0;s.length=a,a=a-1|0;var r=0|e.words[0],n=0|t.words[0],i=r*n,o=67108863&i,c=i/67108864|0;s.words[0]=o;for(var u=1;u<a;u++){for(var d=c>>>26,h=67108863&c,l=Math.min(u,t.length-1),f=Math.max(0,u-e.length+1);f<=l;f++){var m=u-f|0;d+=(i=(r=0|e.words[m])*(n=0|t.words[f])+h)/67108864|0,h=67108863&i}s.words[u]=0|h,c=0|d}return 0!==c?s.words[u]=0|c:s.length--,s.strip()}n.prototype.toString=function(e,t){var s;if(t=0|t||1,16===(e=e||10)||"hex"===e){s="";for(var r=0,n=0,i=0;i<this.length;i++){var o=this.words[i],c=(16777215&(o<<r|n)).toString(16);s=0!==(n=o>>>24-r&16777215)||i!==this.length-1?u[6-c.length]+c+s:c+s,(r+=2)>=26&&(r-=26,i--)}for(0!==n&&(s=n.toString(16)+s);s.length%t!=0;)s="0"+s;return 0!==this.negative&&(s="-"+s),s}if(e===(0|e)&&e>=2&&e<=36){var l=d[e],f=h[e];s="";var m=this.clone();for(m.negative=0;!m.isZero();){var p=m.modn(f).toString(e);s=(m=m.idivn(f)).isZero()?p+s:u[l-p.length]+p+s}for(this.isZero()&&(s="0"+s);s.length%t!=0;)s="0"+s;return 0!==this.negative&&(s="-"+s),s}a(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&a(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(e,t){return a(void 0!==i),this.toArrayLike(i,e,t)},n.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},n.prototype.toArrayLike=function(e,t,s){var r=this.byteLength(),n=s||Math.max(1,r);a(r<=n,"byte array longer than desired length"),a(n>0,"Requested array length <= 0"),this.strip();var i,o,c="le"===t,u=new e(n),d=this.clone();if(c){for(o=0;!d.isZero();o++)i=d.andln(255),d.iushrn(8),u[o]=i;for(;o<n;o++)u[o]=0}else{for(o=0;o<n-r;o++)u[o]=0;for(o=0;!d.isZero();o++)i=d.andln(255),d.iushrn(8),u[n-o-1]=i}return u},Math.clz32?n.prototype._countBits=function(e){return 32-Math.clz32(e)}:n.prototype._countBits=function(e){var t=e,s=0;return t>=4096&&(s+=13,t>>>=13),t>=64&&(s+=7,t>>>=7),t>=8&&(s+=4,t>>>=4),t>=2&&(s+=2,t>>>=2),s+t},n.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,s=0;return 0==(8191&t)&&(s+=13,t>>>=13),0==(127&t)&&(s+=7,t>>>=7),0==(15&t)&&(s+=4,t>>>=4),0==(3&t)&&(s+=2,t>>>=2),0==(1&t)&&s++,s},n.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;t<this.length;t++){var s=this._zeroBits(this.words[t]);if(e+=s,26!==s)break}return e},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(e){return 0!==this.negative?this.abs().inotn(e).iaddn(1):this.clone()},n.prototype.fromTwos=function(e){return this.testn(e-1)?this.notn(e).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(e){for(;this.length<e.length;)this.words[this.length++]=0;for(var t=0;t<e.length;t++)this.words[t]=this.words[t]|e.words[t];return this.strip()},n.prototype.ior=function(e){return a(0==(this.negative|e.negative)),this.iuor(e)},n.prototype.or=function(e){return this.length>e.length?this.clone().ior(e):e.clone().ior(this)},n.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},n.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var s=0;s<t.length;s++)this.words[s]=this.words[s]&e.words[s];return this.length=t.length,this.strip()},n.prototype.iand=function(e){return a(0==(this.negative|e.negative)),this.iuand(e)},n.prototype.and=function(e){return this.length>e.length?this.clone().iand(e):e.clone().iand(this)},n.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},n.prototype.iuxor=function(e){var t,s;this.length>e.length?(t=this,s=e):(t=e,s=this);for(var a=0;a<s.length;a++)this.words[a]=t.words[a]^s.words[a];if(this!==t)for(;a<t.length;a++)this.words[a]=t.words[a];return this.length=t.length,this.strip()},n.prototype.ixor=function(e){return a(0==(this.negative|e.negative)),this.iuxor(e)},n.prototype.xor=function(e){return this.length>e.length?this.clone().ixor(e):e.clone().ixor(this)},n.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},n.prototype.inotn=function(e){a("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),s=e%26;this._expand(t),s>0&&t--;for(var r=0;r<t;r++)this.words[r]=67108863&~this.words[r];return s>0&&(this.words[r]=~this.words[r]&67108863>>26-s),this.strip()},n.prototype.notn=function(e){return this.clone().inotn(e)},n.prototype.setn=function(e,t){a("number"==typeof e&&e>=0);var s=e/26|0,r=e%26;return this._expand(s+1),this.words[s]=t?this.words[s]|1<<r:this.words[s]&~(1<<r),this.strip()},n.prototype.iadd=function(e){var t,s,a;if(0!==this.negative&&0===e.negative)return this.negative=0,t=this.isub(e),this.negative^=1,this._normSign();if(0===this.negative&&0!==e.negative)return e.negative=0,t=this.isub(e),e.negative=1,t._normSign();this.length>e.length?(s=this,a=e):(s=e,a=this);for(var r=0,n=0;n<a.length;n++)t=(0|s.words[n])+(0|a.words[n])+r,this.words[n]=67108863&t,r=t>>>26;for(;0!==r&&n<s.length;n++)t=(0|s.words[n])+r,this.words[n]=67108863&t,r=t>>>26;if(this.length=s.length,0!==r)this.words[this.length]=r,this.length++;else if(s!==this)for(;n<s.length;n++)this.words[n]=s.words[n];return this},n.prototype.add=function(e){var t;return 0!==e.negative&&0===this.negative?(e.negative=0,t=this.sub(e),e.negative^=1,t):0===e.negative&&0!==this.negative?(this.negative=0,t=e.sub(this),this.negative=1,t):this.length>e.length?this.clone().iadd(e):e.clone().iadd(this)},n.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var s,a,r=this.cmp(e);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;r>0?(s=this,a=e):(s=e,a=this);for(var n=0,i=0;i<a.length;i++)n=(t=(0|s.words[i])-(0|a.words[i])+n)>>26,this.words[i]=67108863&t;for(;0!==n&&i<s.length;i++)n=(t=(0|s.words[i])+n)>>26,this.words[i]=67108863&t;if(0===n&&i<s.length&&s!==this)for(;i<s.length;i++)this.words[i]=s.words[i];return this.length=Math.max(this.length,i),s!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(e){return this.clone().isub(e)};var f=function(e,t,s){var a,r,n,i=e.words,o=t.words,c=s.words,u=0,d=0|i[0],h=8191&d,l=d>>>13,f=0|i[1],m=8191&f,p=f>>>13,w=0|i[2],g=8191&w,y=w>>>13,b=0|i[3],v=8191&b,M=b>>>13,S=0|i[4],I=8191&S,P=S>>>13,E=0|i[5],B=8191&E,N=E>>>13,U=0|i[6],A=8191&U,T=U>>>13,k=0|i[7],D=8191&k,K=k>>>13,x=0|i[8],R=8191&x,O=x>>>13,C=0|i[9],_=8191&C,F=C>>>13,L=0|o[0],j=8191&L,q=L>>>13,V=0|o[1],H=8191&V,G=V>>>13,J=0|o[2],W=8191&J,Y=J>>>13,z=0|o[3],Z=8191&z,X=z>>>13,Q=0|o[4],$=8191&Q,ee=Q>>>13,te=0|o[5],se=8191&te,ae=te>>>13,re=0|o[6],ne=8191&re,ie=re>>>13,oe=0|o[7],ce=8191&oe,ue=oe>>>13,de=0|o[8],he=8191&de,le=de>>>13,fe=0|o[9],me=8191&fe,pe=fe>>>13;s.negative=e.negative^t.negative,s.length=19;var we=(u+(a=Math.imul(h,j))|0)+((8191&(r=(r=Math.imul(h,q))+Math.imul(l,j)|0))<<13)|0;u=((n=Math.imul(l,q))+(r>>>13)|0)+(we>>>26)|0,we&=67108863,a=Math.imul(m,j),r=(r=Math.imul(m,q))+Math.imul(p,j)|0,n=Math.imul(p,q);var ge=(u+(a=a+Math.imul(h,H)|0)|0)+((8191&(r=(r=r+Math.imul(h,G)|0)+Math.imul(l,H)|0))<<13)|0;u=((n=n+Math.imul(l,G)|0)+(r>>>13)|0)+(ge>>>26)|0,ge&=67108863,a=Math.imul(g,j),r=(r=Math.imul(g,q))+Math.imul(y,j)|0,n=Math.imul(y,q),a=a+Math.imul(m,H)|0,r=(r=r+Math.imul(m,G)|0)+Math.imul(p,H)|0,n=n+Math.imul(p,G)|0;var ye=(u+(a=a+Math.imul(h,W)|0)|0)+((8191&(r=(r=r+Math.imul(h,Y)|0)+Math.imul(l,W)|0))<<13)|0;u=((n=n+Math.imul(l,Y)|0)+(r>>>13)|0)+(ye>>>26)|0,ye&=67108863,a=Math.imul(v,j),r=(r=Math.imul(v,q))+Math.imul(M,j)|0,n=Math.imul(M,q),a=a+Math.imul(g,H)|0,r=(r=r+Math.imul(g,G)|0)+Math.imul(y,H)|0,n=n+Math.imul(y,G)|0,a=a+Math.imul(m,W)|0,r=(r=r+Math.imul(m,Y)|0)+Math.imul(p,W)|0,n=n+Math.imul(p,Y)|0;var be=(u+(a=a+Math.imul(h,Z)|0)|0)+((8191&(r=(r=r+Math.imul(h,X)|0)+Math.imul(l,Z)|0))<<13)|0;u=((n=n+Math.imul(l,X)|0)+(r>>>13)|0)+(be>>>26)|0,be&=67108863,a=Math.imul(I,j),r=(r=Math.imul(I,q))+Math.imul(P,j)|0,n=Math.imul(P,q),a=a+Math.imul(v,H)|0,r=(r=r+Math.imul(v,G)|0)+Math.imul(M,H)|0,n=n+Math.imul(M,G)|0,a=a+Math.imul(g,W)|0,r=(r=r+Math.imul(g,Y)|0)+Math.imul(y,W)|0,n=n+Math.imul(y,Y)|0,a=a+Math.imul(m,Z)|0,r=(r=r+Math.imul(m,X)|0)+Math.imul(p,Z)|0,n=n+Math.imul(p,X)|0;var ve=(u+(a=a+Math.imul(h,$)|0)|0)+((8191&(r=(r=r+Math.imul(h,ee)|0)+Math.imul(l,$)|0))<<13)|0;u=((n=n+Math.imul(l,ee)|0)+(r>>>13)|0)+(ve>>>26)|0,ve&=67108863,a=Math.imul(B,j),r=(r=Math.imul(B,q))+Math.imul(N,j)|0,n=Math.imul(N,q),a=a+Math.imul(I,H)|0,r=(r=r+Math.imul(I,G)|0)+Math.imul(P,H)|0,n=n+Math.imul(P,G)|0,a=a+Math.imul(v,W)|0,r=(r=r+Math.imul(v,Y)|0)+Math.imul(M,W)|0,n=n+Math.imul(M,Y)|0,a=a+Math.imul(g,Z)|0,r=(r=r+Math.imul(g,X)|0)+Math.imul(y,Z)|0,n=n+Math.imul(y,X)|0,a=a+Math.imul(m,$)|0,r=(r=r+Math.imul(m,ee)|0)+Math.imul(p,$)|0,n=n+Math.imul(p,ee)|0;var Me=(u+(a=a+Math.imul(h,se)|0)|0)+((8191&(r=(r=r+Math.imul(h,ae)|0)+Math.imul(l,se)|0))<<13)|0;u=((n=n+Math.imul(l,ae)|0)+(r>>>13)|0)+(Me>>>26)|0,Me&=67108863,a=Math.imul(A,j),r=(r=Math.imul(A,q))+Math.imul(T,j)|0,n=Math.imul(T,q),a=a+Math.imul(B,H)|0,r=(r=r+Math.imul(B,G)|0)+Math.imul(N,H)|0,n=n+Math.imul(N,G)|0,a=a+Math.imul(I,W)|0,r=(r=r+Math.imul(I,Y)|0)+Math.imul(P,W)|0,n=n+Math.imul(P,Y)|0,a=a+Math.imul(v,Z)|0,r=(r=r+Math.imul(v,X)|0)+Math.imul(M,Z)|0,n=n+Math.imul(M,X)|0,a=a+Math.imul(g,$)|0,r=(r=r+Math.imul(g,ee)|0)+Math.imul(y,$)|0,n=n+Math.imul(y,ee)|0,a=a+Math.imul(m,se)|0,r=(r=r+Math.imul(m,ae)|0)+Math.imul(p,se)|0,n=n+Math.imul(p,ae)|0;var Se=(u+(a=a+Math.imul(h,ne)|0)|0)+((8191&(r=(r=r+Math.imul(h,ie)|0)+Math.imul(l,ne)|0))<<13)|0;u=((n=n+Math.imul(l,ie)|0)+(r>>>13)|0)+(Se>>>26)|0,Se&=67108863,a=Math.imul(D,j),r=(r=Math.imul(D,q))+Math.imul(K,j)|0,n=Math.imul(K,q),a=a+Math.imul(A,H)|0,r=(r=r+Math.imul(A,G)|0)+Math.imul(T,H)|0,n=n+Math.imul(T,G)|0,a=a+Math.imul(B,W)|0,r=(r=r+Math.imul(B,Y)|0)+Math.imul(N,W)|0,n=n+Math.imul(N,Y)|0,a=a+Math.imul(I,Z)|0,r=(r=r+Math.imul(I,X)|0)+Math.imul(P,Z)|0,n=n+Math.imul(P,X)|0,a=a+Math.imul(v,$)|0,r=(r=r+Math.imul(v,ee)|0)+Math.imul(M,$)|0,n=n+Math.imul(M,ee)|0,a=a+Math.imul(g,se)|0,r=(r=r+Math.imul(g,ae)|0)+Math.imul(y,se)|0,n=n+Math.imul(y,ae)|0,a=a+Math.imul(m,ne)|0,r=(r=r+Math.imul(m,ie)|0)+Math.imul(p,ne)|0,n=n+Math.imul(p,ie)|0;var Ie=(u+(a=a+Math.imul(h,ce)|0)|0)+((8191&(r=(r=r+Math.imul(h,ue)|0)+Math.imul(l,ce)|0))<<13)|0;u=((n=n+Math.imul(l,ue)|0)+(r>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,a=Math.imul(R,j),r=(r=Math.imul(R,q))+Math.imul(O,j)|0,n=Math.imul(O,q),a=a+Math.imul(D,H)|0,r=(r=r+Math.imul(D,G)|0)+Math.imul(K,H)|0,n=n+Math.imul(K,G)|0,a=a+Math.imul(A,W)|0,r=(r=r+Math.imul(A,Y)|0)+Math.imul(T,W)|0,n=n+Math.imul(T,Y)|0,a=a+Math.imul(B,Z)|0,r=(r=r+Math.imul(B,X)|0)+Math.imul(N,Z)|0,n=n+Math.imul(N,X)|0,a=a+Math.imul(I,$)|0,r=(r=r+Math.imul(I,ee)|0)+Math.imul(P,$)|0,n=n+Math.imul(P,ee)|0,a=a+Math.imul(v,se)|0,r=(r=r+Math.imul(v,ae)|0)+Math.imul(M,se)|0,n=n+Math.imul(M,ae)|0,a=a+Math.imul(g,ne)|0,r=(r=r+Math.imul(g,ie)|0)+Math.imul(y,ne)|0,n=n+Math.imul(y,ie)|0,a=a+Math.imul(m,ce)|0,r=(r=r+Math.imul(m,ue)|0)+Math.imul(p,ce)|0,n=n+Math.imul(p,ue)|0;var Pe=(u+(a=a+Math.imul(h,he)|0)|0)+((8191&(r=(r=r+Math.imul(h,le)|0)+Math.imul(l,he)|0))<<13)|0;u=((n=n+Math.imul(l,le)|0)+(r>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,a=Math.imul(_,j),r=(r=Math.imul(_,q))+Math.imul(F,j)|0,n=Math.imul(F,q),a=a+Math.imul(R,H)|0,r=(r=r+Math.imul(R,G)|0)+Math.imul(O,H)|0,n=n+Math.imul(O,G)|0,a=a+Math.imul(D,W)|0,r=(r=r+Math.imul(D,Y)|0)+Math.imul(K,W)|0,n=n+Math.imul(K,Y)|0,a=a+Math.imul(A,Z)|0,r=(r=r+Math.imul(A,X)|0)+Math.imul(T,Z)|0,n=n+Math.imul(T,X)|0,a=a+Math.imul(B,$)|0,r=(r=r+Math.imul(B,ee)|0)+Math.imul(N,$)|0,n=n+Math.imul(N,ee)|0,a=a+Math.imul(I,se)|0,r=(r=r+Math.imul(I,ae)|0)+Math.imul(P,se)|0,n=n+Math.imul(P,ae)|0,a=a+Math.imul(v,ne)|0,r=(r=r+Math.imul(v,ie)|0)+Math.imul(M,ne)|0,n=n+Math.imul(M,ie)|0,a=a+Math.imul(g,ce)|0,r=(r=r+Math.imul(g,ue)|0)+Math.imul(y,ce)|0,n=n+Math.imul(y,ue)|0,a=a+Math.imul(m,he)|0,r=(r=r+Math.imul(m,le)|0)+Math.imul(p,he)|0,n=n+Math.imul(p,le)|0;var Ee=(u+(a=a+Math.imul(h,me)|0)|0)+((8191&(r=(r=r+Math.imul(h,pe)|0)+Math.imul(l,me)|0))<<13)|0;u=((n=n+Math.imul(l,pe)|0)+(r>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,a=Math.imul(_,H),r=(r=Math.imul(_,G))+Math.imul(F,H)|0,n=Math.imul(F,G),a=a+Math.imul(R,W)|0,r=(r=r+Math.imul(R,Y)|0)+Math.imul(O,W)|0,n=n+Math.imul(O,Y)|0,a=a+Math.imul(D,Z)|0,r=(r=r+Math.imul(D,X)|0)+Math.imul(K,Z)|0,n=n+Math.imul(K,X)|0,a=a+Math.imul(A,$)|0,r=(r=r+Math.imul(A,ee)|0)+Math.imul(T,$)|0,n=n+Math.imul(T,ee)|0,a=a+Math.imul(B,se)|0,r=(r=r+Math.imul(B,ae)|0)+Math.imul(N,se)|0,n=n+Math.imul(N,ae)|0,a=a+Math.imul(I,ne)|0,r=(r=r+Math.imul(I,ie)|0)+Math.imul(P,ne)|0,n=n+Math.imul(P,ie)|0,a=a+Math.imul(v,ce)|0,r=(r=r+Math.imul(v,ue)|0)+Math.imul(M,ce)|0,n=n+Math.imul(M,ue)|0,a=a+Math.imul(g,he)|0,r=(r=r+Math.imul(g,le)|0)+Math.imul(y,he)|0,n=n+Math.imul(y,le)|0;var Be=(u+(a=a+Math.imul(m,me)|0)|0)+((8191&(r=(r=r+Math.imul(m,pe)|0)+Math.imul(p,me)|0))<<13)|0;u=((n=n+Math.imul(p,pe)|0)+(r>>>13)|0)+(Be>>>26)|0,Be&=67108863,a=Math.imul(_,W),r=(r=Math.imul(_,Y))+Math.imul(F,W)|0,n=Math.imul(F,Y),a=a+Math.imul(R,Z)|0,r=(r=r+Math.imul(R,X)|0)+Math.imul(O,Z)|0,n=n+Math.imul(O,X)|0,a=a+Math.imul(D,$)|0,r=(r=r+Math.imul(D,ee)|0)+Math.imul(K,$)|0,n=n+Math.imul(K,ee)|0,a=a+Math.imul(A,se)|0,r=(r=r+Math.imul(A,ae)|0)+Math.imul(T,se)|0,n=n+Math.imul(T,ae)|0,a=a+Math.imul(B,ne)|0,r=(r=r+Math.imul(B,ie)|0)+Math.imul(N,ne)|0,n=n+Math.imul(N,ie)|0,a=a+Math.imul(I,ce)|0,r=(r=r+Math.imul(I,ue)|0)+Math.imul(P,ce)|0,n=n+Math.imul(P,ue)|0,a=a+Math.imul(v,he)|0,r=(r=r+Math.imul(v,le)|0)+Math.imul(M,he)|0,n=n+Math.imul(M,le)|0;var Ne=(u+(a=a+Math.imul(g,me)|0)|0)+((8191&(r=(r=r+Math.imul(g,pe)|0)+Math.imul(y,me)|0))<<13)|0;u=((n=n+Math.imul(y,pe)|0)+(r>>>13)|0)+(Ne>>>26)|0,Ne&=67108863,a=Math.imul(_,Z),r=(r=Math.imul(_,X))+Math.imul(F,Z)|0,n=Math.imul(F,X),a=a+Math.imul(R,$)|0,r=(r=r+Math.imul(R,ee)|0)+Math.imul(O,$)|0,n=n+Math.imul(O,ee)|0,a=a+Math.imul(D,se)|0,r=(r=r+Math.imul(D,ae)|0)+Math.imul(K,se)|0,n=n+Math.imul(K,ae)|0,a=a+Math.imul(A,ne)|0,r=(r=r+Math.imul(A,ie)|0)+Math.imul(T,ne)|0,n=n+Math.imul(T,ie)|0,a=a+Math.imul(B,ce)|0,r=(r=r+Math.imul(B,ue)|0)+Math.imul(N,ce)|0,n=n+Math.imul(N,ue)|0,a=a+Math.imul(I,he)|0,r=(r=r+Math.imul(I,le)|0)+Math.imul(P,he)|0,n=n+Math.imul(P,le)|0;var Ue=(u+(a=a+Math.imul(v,me)|0)|0)+((8191&(r=(r=r+Math.imul(v,pe)|0)+Math.imul(M,me)|0))<<13)|0;u=((n=n+Math.imul(M,pe)|0)+(r>>>13)|0)+(Ue>>>26)|0,Ue&=67108863,a=Math.imul(_,$),r=(r=Math.imul(_,ee))+Math.imul(F,$)|0,n=Math.imul(F,ee),a=a+Math.imul(R,se)|0,r=(r=r+Math.imul(R,ae)|0)+Math.imul(O,se)|0,n=n+Math.imul(O,ae)|0,a=a+Math.imul(D,ne)|0,r=(r=r+Math.imul(D,ie)|0)+Math.imul(K,ne)|0,n=n+Math.imul(K,ie)|0,a=a+Math.imul(A,ce)|0,r=(r=r+Math.imul(A,ue)|0)+Math.imul(T,ce)|0,n=n+Math.imul(T,ue)|0,a=a+Math.imul(B,he)|0,r=(r=r+Math.imul(B,le)|0)+Math.imul(N,he)|0,n=n+Math.imul(N,le)|0;var Ae=(u+(a=a+Math.imul(I,me)|0)|0)+((8191&(r=(r=r+Math.imul(I,pe)|0)+Math.imul(P,me)|0))<<13)|0;u=((n=n+Math.imul(P,pe)|0)+(r>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,a=Math.imul(_,se),r=(r=Math.imul(_,ae))+Math.imul(F,se)|0,n=Math.imul(F,ae),a=a+Math.imul(R,ne)|0,r=(r=r+Math.imul(R,ie)|0)+Math.imul(O,ne)|0,n=n+Math.imul(O,ie)|0,a=a+Math.imul(D,ce)|0,r=(r=r+Math.imul(D,ue)|0)+Math.imul(K,ce)|0,n=n+Math.imul(K,ue)|0,a=a+Math.imul(A,he)|0,r=(r=r+Math.imul(A,le)|0)+Math.imul(T,he)|0,n=n+Math.imul(T,le)|0;var Te=(u+(a=a+Math.imul(B,me)|0)|0)+((8191&(r=(r=r+Math.imul(B,pe)|0)+Math.imul(N,me)|0))<<13)|0;u=((n=n+Math.imul(N,pe)|0)+(r>>>13)|0)+(Te>>>26)|0,Te&=67108863,a=Math.imul(_,ne),r=(r=Math.imul(_,ie))+Math.imul(F,ne)|0,n=Math.imul(F,ie),a=a+Math.imul(R,ce)|0,r=(r=r+Math.imul(R,ue)|0)+Math.imul(O,ce)|0,n=n+Math.imul(O,ue)|0,a=a+Math.imul(D,he)|0,r=(r=r+Math.imul(D,le)|0)+Math.imul(K,he)|0,n=n+Math.imul(K,le)|0;var ke=(u+(a=a+Math.imul(A,me)|0)|0)+((8191&(r=(r=r+Math.imul(A,pe)|0)+Math.imul(T,me)|0))<<13)|0;u=((n=n+Math.imul(T,pe)|0)+(r>>>13)|0)+(ke>>>26)|0,ke&=67108863,a=Math.imul(_,ce),r=(r=Math.imul(_,ue))+Math.imul(F,ce)|0,n=Math.imul(F,ue),a=a+Math.imul(R,he)|0,r=(r=r+Math.imul(R,le)|0)+Math.imul(O,he)|0,n=n+Math.imul(O,le)|0;var De=(u+(a=a+Math.imul(D,me)|0)|0)+((8191&(r=(r=r+Math.imul(D,pe)|0)+Math.imul(K,me)|0))<<13)|0;u=((n=n+Math.imul(K,pe)|0)+(r>>>13)|0)+(De>>>26)|0,De&=67108863,a=Math.imul(_,he),r=(r=Math.imul(_,le))+Math.imul(F,he)|0,n=Math.imul(F,le);var Ke=(u+(a=a+Math.imul(R,me)|0)|0)+((8191&(r=(r=r+Math.imul(R,pe)|0)+Math.imul(O,me)|0))<<13)|0;u=((n=n+Math.imul(O,pe)|0)+(r>>>13)|0)+(Ke>>>26)|0,Ke&=67108863;var xe=(u+(a=Math.imul(_,me))|0)+((8191&(r=(r=Math.imul(_,pe))+Math.imul(F,me)|0))<<13)|0;return u=((n=Math.imul(F,pe))+(r>>>13)|0)+(xe>>>26)|0,xe&=67108863,c[0]=we,c[1]=ge,c[2]=ye,c[3]=be,c[4]=ve,c[5]=Me,c[6]=Se,c[7]=Ie,c[8]=Pe,c[9]=Ee,c[10]=Be,c[11]=Ne,c[12]=Ue,c[13]=Ae,c[14]=Te,c[15]=ke,c[16]=De,c[17]=Ke,c[18]=xe,0!==u&&(c[19]=u,s.length++),s};function m(e,t,s){return(new p).mulp(e,t,s)}function p(e,t){this.x=e,this.y=t}Math.imul||(f=l),n.prototype.mulTo=function(e,t){var s=this.length+e.length;return 10===this.length&&10===e.length?f(this,e,t):s<63?l(this,e,t):s<1024?function(e,t,s){s.negative=t.negative^e.negative,s.length=e.length+t.length;for(var a=0,r=0,n=0;n<s.length-1;n++){var i=r;r=0;for(var o=67108863&a,c=Math.min(n,t.length-1),u=Math.max(0,n-e.length+1);u<=c;u++){var d=n-u,h=(0|e.words[d])*(0|t.words[u]),l=67108863&h;o=67108863&(l=l+o|0),r+=(i=(i=i+(h/67108864|0)|0)+(l>>>26)|0)>>>26,i&=67108863}s.words[n]=o,a=i,i=r}return 0!==a?s.words[n]=a:s.length--,s.strip()}(this,e,t):m(this,e,t)},p.prototype.makeRBT=function(e){for(var t=new Array(e),s=n.prototype._countBits(e)-1,a=0;a<e;a++)t[a]=this.revBin(a,s,e);return t},p.prototype.revBin=function(e,t,s){if(0===e||e===s-1)return e;for(var a=0,r=0;r<t;r++)a|=(1&e)<<t-r-1,e>>=1;return a},p.prototype.permute=function(e,t,s,a,r,n){for(var i=0;i<n;i++)a[i]=t[e[i]],r[i]=s[e[i]]},p.prototype.transform=function(e,t,s,a,r,n){this.permute(n,e,t,s,a,r);for(var i=1;i<r;i<<=1)for(var o=i<<1,c=Math.cos(2*Math.PI/o),u=Math.sin(2*Math.PI/o),d=0;d<r;d+=o)for(var h=c,l=u,f=0;f<i;f++){var m=s[d+f],p=a[d+f],w=s[d+f+i],g=a[d+f+i],y=h*w-l*g;g=h*g+l*w,w=y,s[d+f]=m+w,a[d+f]=p+g,s[d+f+i]=m-w,a[d+f+i]=p-g,f!==o&&(y=c*h-u*l,l=c*l+u*h,h=y)}},p.prototype.guessLen13b=function(e,t){var s=1|Math.max(t,e),a=1&s,r=0;for(s=s/2|0;s;s>>>=1)r++;return 1<<r+1+a},p.prototype.conjugate=function(e,t,s){if(!(s<=1))for(var a=0;a<s/2;a++){var r=e[a];e[a]=e[s-a-1],e[s-a-1]=r,r=t[a],t[a]=-t[s-a-1],t[s-a-1]=-r}},p.prototype.normalize13b=function(e,t){for(var s=0,a=0;a<t/2;a++){var r=8192*Math.round(e[2*a+1]/t)+Math.round(e[2*a]/t)+s;e[a]=67108863&r,s=r<67108864?0:r/67108864|0}return e},p.prototype.convert13b=function(e,t,s,r){for(var n=0,i=0;i<t;i++)n+=0|e[i],s[2*i]=8191&n,n>>>=13,s[2*i+1]=8191&n,n>>>=13;for(i=2*t;i<r;++i)s[i]=0;a(0===n),a(0==(-8192&n))},p.prototype.stub=function(e){for(var t=new Array(e),s=0;s<e;s++)t[s]=0;return t},p.prototype.mulp=function(e,t,s){var a=2*this.guessLen13b(e.length,t.length),r=this.makeRBT(a),n=this.stub(a),i=new Array(a),o=new Array(a),c=new Array(a),u=new Array(a),d=new Array(a),h=new Array(a),l=s.words;l.length=a,this.convert13b(e.words,e.length,i,a),this.convert13b(t.words,t.length,u,a),this.transform(i,n,o,c,a,r),this.transform(u,n,d,h,a,r);for(var f=0;f<a;f++){var m=o[f]*d[f]-c[f]*h[f];c[f]=o[f]*h[f]+c[f]*d[f],o[f]=m}return this.conjugate(o,c,a),this.transform(o,c,l,n,a,r),this.conjugate(l,n,a),this.normalize13b(l,a),s.negative=e.negative^t.negative,s.length=e.length+t.length,s.strip()},n.prototype.mul=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),this.mulTo(e,t)},n.prototype.mulf=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),m(this,e,t)},n.prototype.imul=function(e){return this.clone().mulTo(e,this)},n.prototype.imuln=function(e){a("number"==typeof e),a(e<67108864);for(var t=0,s=0;s<this.length;s++){var r=(0|this.words[s])*e,n=(67108863&r)+(67108863&t);t>>=26,t+=r/67108864|0,t+=n>>>26,this.words[s]=67108863&n}return 0!==t&&(this.words[s]=t,this.length++),this},n.prototype.muln=function(e){return this.clone().imuln(e)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),s=0;s<t.length;s++){var a=s/26|0,r=s%26;t[s]=(e.words[a]&1<<r)>>>r}return t}(e);if(0===t.length)return new n(1);for(var s=this,a=0;a<t.length&&0===t[a];a++,s=s.sqr());if(++a<t.length)for(var r=s.sqr();a<t.length;a++,r=r.sqr())0!==t[a]&&(s=s.mul(r));return s},n.prototype.iushln=function(e){a("number"==typeof e&&e>=0);var t,s=e%26,r=(e-s)/26,n=67108863>>>26-s<<26-s;if(0!==s){var i=0;for(t=0;t<this.length;t++){var o=this.words[t]&n,c=(0|this.words[t])-o<<s;this.words[t]=c|i,i=o>>>26-s}i&&(this.words[t]=i,this.length++)}if(0!==r){for(t=this.length-1;t>=0;t--)this.words[t+r]=this.words[t];for(t=0;t<r;t++)this.words[t]=0;this.length+=r}return this.strip()},n.prototype.ishln=function(e){return a(0===this.negative),this.iushln(e)},n.prototype.iushrn=function(e,t,s){var r;a("number"==typeof e&&e>=0),r=t?(t-t%26)/26:0;var n=e%26,i=Math.min((e-n)/26,this.length),o=67108863^67108863>>>n<<n,c=s;if(r-=i,r=Math.max(0,r),c){for(var u=0;u<i;u++)c.words[u]=this.words[u];c.length=i}if(0===i);else if(this.length>i)for(this.length-=i,u=0;u<this.length;u++)this.words[u]=this.words[u+i];else this.words[0]=0,this.length=1;var d=0;for(u=this.length-1;u>=0&&(0!==d||u>=r);u--){var h=0|this.words[u];this.words[u]=d<<26-n|h>>>n,d=h&o}return c&&0!==d&&(c.words[c.length++]=d),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(e,t,s){return a(0===this.negative),this.iushrn(e,t,s)},n.prototype.shln=function(e){return this.clone().ishln(e)},n.prototype.ushln=function(e){return this.clone().iushln(e)},n.prototype.shrn=function(e){return this.clone().ishrn(e)},n.prototype.ushrn=function(e){return this.clone().iushrn(e)},n.prototype.testn=function(e){a("number"==typeof e&&e>=0);var t=e%26,s=(e-t)/26,r=1<<t;return!(this.length<=s)&&!!(this.words[s]&r)},n.prototype.imaskn=function(e){a("number"==typeof e&&e>=0);var t=e%26,s=(e-t)/26;if(a(0===this.negative,"imaskn works only with positive numbers"),this.length<=s)return this;if(0!==t&&s++,this.length=Math.min(s,this.length),0!==t){var r=67108863^67108863>>>t<<t;this.words[this.length-1]&=r}return this.strip()},n.prototype.maskn=function(e){return this.clone().imaskn(e)},n.prototype.iaddn=function(e){return a("number"==typeof e),a(e<67108864),e<0?this.isubn(-e):0!==this.negative?1===this.length&&(0|this.words[0])<e?(this.words[0]=e-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(e),this.negative=1,this):this._iaddn(e)},n.prototype._iaddn=function(e){this.words[0]+=e;for(var t=0;t<this.length&&this.words[t]>=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},n.prototype.isubn=function(e){if(a("number"==typeof e),a(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t<this.length&&this.words[t]<0;t++)this.words[t]+=67108864,this.words[t+1]-=1;return this.strip()},n.prototype.addn=function(e){return this.clone().iaddn(e)},n.prototype.subn=function(e){return this.clone().isubn(e)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(e,t,s){var r,n,i=e.length+s;this._expand(i);var o=0;for(r=0;r<e.length;r++){n=(0|this.words[r+s])+o;var c=(0|e.words[r])*t;o=((n-=67108863&c)>>26)-(c/67108864|0),this.words[r+s]=67108863&n}for(;r<this.length-s;r++)o=(n=(0|this.words[r+s])+o)>>26,this.words[r+s]=67108863&n;if(0===o)return this.strip();for(a(-1===o),o=0,r=0;r<this.length;r++)o=(n=-(0|this.words[r])+o)>>26,this.words[r]=67108863&n;return this.negative=1,this.strip()},n.prototype._wordDiv=function(e,t){var s=(this.length,e.length),a=this.clone(),r=e,i=0|r.words[r.length-1];0!==(s=26-this._countBits(i))&&(r=r.ushln(s),a.iushln(s),i=0|r.words[r.length-1]);var o,c=a.length-r.length;if("mod"!==t){(o=new n(null)).length=c+1,o.words=new Array(o.length);for(var u=0;u<o.length;u++)o.words[u]=0}var d=a.clone()._ishlnsubmul(r,1,c);0===d.negative&&(a=d,o&&(o.words[c]=1));for(var h=c-1;h>=0;h--){var l=67108864*(0|a.words[r.length+h])+(0|a.words[r.length+h-1]);for(l=Math.min(l/i|0,67108863),a._ishlnsubmul(r,l,h);0!==a.negative;)l--,a.negative=0,a._ishlnsubmul(r,1,h),a.isZero()||(a.negative^=1);o&&(o.words[h]=l)}return o&&o.strip(),a.strip(),"div"!==t&&0!==s&&a.iushrn(s),{div:o||null,mod:a}},n.prototype.divmod=function(e,t,s){return a(!e.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===e.negative?(o=this.neg().divmod(e,t),"mod"!==t&&(r=o.div.neg()),"div"!==t&&(i=o.mod.neg(),s&&0!==i.negative&&i.iadd(e)),{div:r,mod:i}):0===this.negative&&0!==e.negative?(o=this.divmod(e.neg(),t),"mod"!==t&&(r=o.div.neg()),{div:r,mod:o.mod}):0!=(this.negative&e.negative)?(o=this.neg().divmod(e.neg(),t),"div"!==t&&(i=o.mod.neg(),s&&0!==i.negative&&i.isub(e)),{div:o.div,mod:i}):e.length>this.length||this.cmp(e)<0?{div:new n(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new n(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new n(this.modn(e.words[0]))}:this._wordDiv(e,t);var r,i,o},n.prototype.div=function(e){return this.divmod(e,"div",!1).div},n.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},n.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},n.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var s=0!==t.div.negative?t.mod.isub(e):t.mod,a=e.ushrn(1),r=e.andln(1),n=s.cmp(a);return n<0||1===r&&0===n?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},n.prototype.modn=function(e){a(e<=67108863);for(var t=(1<<26)%e,s=0,r=this.length-1;r>=0;r--)s=(t*s+(0|this.words[r]))%e;return s},n.prototype.idivn=function(e){a(e<=67108863);for(var t=0,s=this.length-1;s>=0;s--){var r=(0|this.words[s])+67108864*t;this.words[s]=r/e|0,t=r%e}return this.strip()},n.prototype.divn=function(e){return this.clone().idivn(e)},n.prototype.egcd=function(e){a(0===e.negative),a(!e.isZero());var t=this,s=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var r=new n(1),i=new n(0),o=new n(0),c=new n(1),u=0;t.isEven()&&s.isEven();)t.iushrn(1),s.iushrn(1),++u;for(var d=s.clone(),h=t.clone();!t.isZero();){for(var l=0,f=1;0==(t.words[0]&f)&&l<26;++l,f<<=1);if(l>0)for(t.iushrn(l);l-- >0;)(r.isOdd()||i.isOdd())&&(r.iadd(d),i.isub(h)),r.iushrn(1),i.iushrn(1);for(var m=0,p=1;0==(s.words[0]&p)&&m<26;++m,p<<=1);if(m>0)for(s.iushrn(m);m-- >0;)(o.isOdd()||c.isOdd())&&(o.iadd(d),c.isub(h)),o.iushrn(1),c.iushrn(1);t.cmp(s)>=0?(t.isub(s),r.isub(o),i.isub(c)):(s.isub(t),o.isub(r),c.isub(i))}return{a:o,b:c,gcd:s.iushln(u)}},n.prototype._invmp=function(e){a(0===e.negative),a(!e.isZero());var t=this,s=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var r,i=new n(1),o=new n(0),c=s.clone();t.cmpn(1)>0&&s.cmpn(1)>0;){for(var u=0,d=1;0==(t.words[0]&d)&&u<26;++u,d<<=1);if(u>0)for(t.iushrn(u);u-- >0;)i.isOdd()&&i.iadd(c),i.iushrn(1);for(var h=0,l=1;0==(s.words[0]&l)&&h<26;++h,l<<=1);if(h>0)for(s.iushrn(h);h-- >0;)o.isOdd()&&o.iadd(c),o.iushrn(1);t.cmp(s)>=0?(t.isub(s),i.isub(o)):(s.isub(t),o.isub(i))}return(r=0===t.cmpn(1)?i:o).cmpn(0)<0&&r.iadd(e),r},n.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),s=e.clone();t.negative=0,s.negative=0;for(var a=0;t.isEven()&&s.isEven();a++)t.iushrn(1),s.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;s.isEven();)s.iushrn(1);var r=t.cmp(s);if(r<0){var n=t;t=s,s=n}else if(0===r||0===s.cmpn(1))break;t.isub(s)}return s.iushln(a)},n.prototype.invm=function(e){return this.egcd(e).a.umod(e)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(e){return this.words[0]&e},n.prototype.bincn=function(e){a("number"==typeof e);var t=e%26,s=(e-t)/26,r=1<<t;if(this.length<=s)return this._expand(s+1),this.words[s]|=r,this;for(var n=r,i=s;0!==n&&i<this.length;i++){var o=0|this.words[i];n=(o+=n)>>>26,o&=67108863,this.words[i]=o}return 0!==n&&(this.words[i]=n,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(e){var t,s=e<0;if(0!==this.negative&&!s)return-1;if(0===this.negative&&s)return 1;if(this.strip(),this.length>1)t=1;else{s&&(e=-e),a(e<=67108863,"Number is too big");var r=0|this.words[0];t=r===e?0:r<e?-1:1}return 0!==this.negative?0|-t:t},n.prototype.cmp=function(e){if(0!==this.negative&&0===e.negative)return-1;if(0===this.negative&&0!==e.negative)return 1;var t=this.ucmp(e);return 0!==this.negative?0|-t:t},n.prototype.ucmp=function(e){if(this.length>e.length)return 1;if(this.length<e.length)return-1;for(var t=0,s=this.length-1;s>=0;s--){var a=0|this.words[s],r=0|e.words[s];if(a!==r){a<r?t=-1:a>r&&(t=1);break}}return t},n.prototype.gtn=function(e){return 1===this.cmpn(e)},n.prototype.gt=function(e){return 1===this.cmp(e)},n.prototype.gten=function(e){return this.cmpn(e)>=0},n.prototype.gte=function(e){return this.cmp(e)>=0},n.prototype.ltn=function(e){return-1===this.cmpn(e)},n.prototype.lt=function(e){return-1===this.cmp(e)},n.prototype.lten=function(e){return this.cmpn(e)<=0},n.prototype.lte=function(e){return this.cmp(e)<=0},n.prototype.eqn=function(e){return 0===this.cmpn(e)},n.prototype.eq=function(e){return 0===this.cmp(e)},n.red=function(e){return new S(e)},n.prototype.toRed=function(e){return a(!this.red,"Already a number in reduction context"),a(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},n.prototype.fromRed=function(){return a(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(e){return this.red=e,this},n.prototype.forceRed=function(e){return a(!this.red,"Already a number in reduction context"),this._forceRed(e)},n.prototype.redAdd=function(e){return a(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},n.prototype.redIAdd=function(e){return a(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},n.prototype.redSub=function(e){return a(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},n.prototype.redISub=function(e){return a(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},n.prototype.redShl=function(e){return a(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},n.prototype.redMul=function(e){return a(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},n.prototype.redIMul=function(e){return a(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},n.prototype.redSqr=function(){return a(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return a(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return a(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return a(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return a(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(e){return a(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var w={k256:null,p224:null,p192:null,p25519:null};function g(e,t){this.name=e,this.p=new n(t,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function y(){g.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){g.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){g.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){g.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function S(e){if("string"==typeof e){var t=n._prime(e);this.m=t.p,this.prime=t}else a(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function I(e){S.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var e=new n(null);return e.words=new Array(Math.ceil(this.n/13)),e},g.prototype.ireduce=function(e){var t,s=e;do{this.split(s,this.tmp),t=(s=(s=this.imulK(s)).iadd(this.tmp)).bitLength()}while(t>this.n);var a=t<this.n?-1:s.ucmp(this.p);return 0===a?(s.words[0]=0,s.length=1):a>0?s.isub(this.p):void 0!==s.strip?s.strip():s._strip(),s},g.prototype.split=function(e,t){e.iushrn(this.n,0,t)},g.prototype.imulK=function(e){return e.imul(this.k)},r(y,g),y.prototype.split=function(e,t){for(var s=Math.min(e.length,9),a=0;a<s;a++)t.words[a]=e.words[a];if(t.length=s,e.length<=9)return e.words[0]=0,void(e.length=1);var r=e.words[9];for(t.words[t.length++]=4194303&r,a=10;a<e.length;a++){var n=0|e.words[a];e.words[a-10]=(4194303&n)<<4|r>>>22,r=n}r>>>=22,e.words[a-10]=r,0===r&&e.length>10?e.length-=10:e.length-=9},y.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,s=0;s<e.length;s++){var a=0|e.words[s];t+=977*a,e.words[s]=67108863&t,t=64*a+(t/67108864|0)}return 0===e.words[e.length-1]&&(e.length--,0===e.words[e.length-1]&&e.length--),e},r(b,g),r(v,g),r(M,g),M.prototype.imulK=function(e){for(var t=0,s=0;s<e.length;s++){var a=19*(0|e.words[s])+t,r=67108863&a;a>>>=26,e.words[s]=r,t=a}return 0!==t&&(e.words[e.length++]=t),e},n._prime=function(e){if(w[e])return w[e];var t;if("k256"===e)t=new y;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new M}return w[e]=t,t},S.prototype._verify1=function(e){a(0===e.negative,"red works only with positives"),a(e.red,"red works only with red numbers")},S.prototype._verify2=function(e,t){a(0==(e.negative|t.negative),"red works only with positives"),a(e.red&&e.red===t.red,"red works only with red numbers")},S.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},S.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},S.prototype.add=function(e,t){this._verify2(e,t);var s=e.add(t);return s.cmp(this.m)>=0&&s.isub(this.m),s._forceRed(this)},S.prototype.iadd=function(e,t){this._verify2(e,t);var s=e.iadd(t);return s.cmp(this.m)>=0&&s.isub(this.m),s},S.prototype.sub=function(e,t){this._verify2(e,t);var s=e.sub(t);return s.cmpn(0)<0&&s.iadd(this.m),s._forceRed(this)},S.prototype.isub=function(e,t){this._verify2(e,t);var s=e.isub(t);return s.cmpn(0)<0&&s.iadd(this.m),s},S.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},S.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},S.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},S.prototype.isqr=function(e){return this.imul(e,e.clone())},S.prototype.sqr=function(e){return this.mul(e,e)},S.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(a(t%2==1),3===t){var s=this.m.add(new n(1)).iushrn(2);return this.pow(e,s)}for(var r=this.m.subn(1),i=0;!r.isZero()&&0===r.andln(1);)i++,r.iushrn(1);a(!r.isZero());var o=new n(1).toRed(this),c=o.redNeg(),u=this.m.subn(1).iushrn(1),d=this.m.bitLength();for(d=new n(2*d*d).toRed(this);0!==this.pow(d,u).cmp(c);)d.redIAdd(c);for(var h=this.pow(d,r),l=this.pow(e,r.addn(1).iushrn(1)),f=this.pow(e,r),m=i;0!==f.cmp(o);){for(var p=f,w=0;0!==p.cmp(o);w++)p=p.redSqr();a(w<m);var g=this.pow(h,new n(1).iushln(m-w-1));l=l.redMul(g),h=g.redSqr(),f=f.redMul(h),m=w}return l},S.prototype.invm=function(e){var t=e._invmp(this.m);return 0!==t.negative?(t.negative=0,this.imod(t).redNeg()):this.imod(t)},S.prototype.pow=function(e,t){if(t.isZero())return new n(1).toRed(this);if(0===t.cmpn(1))return e.clone();var s=new Array(16);s[0]=new n(1).toRed(this),s[1]=e;for(var a=2;a<s.length;a++)s[a]=this.mul(s[a-1],e);var r=s[0],i=0,o=0,c=t.bitLength()%26;for(0===c&&(c=26),a=t.length-1;a>=0;a--){for(var u=t.words[a],d=c-1;d>=0;d--){var h=u>>d&1;r!==s[0]&&(r=this.sqr(r)),0!==h||0!==i?(i<<=1,i|=h,(4===++o||0===a&&0===d)&&(r=this.mul(r,s[i]),o=0,i=0)):o=0}c=26}return r},S.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},S.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},n.mont=function(e){return new I(e)},r(I,S),I.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},I.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},I.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var s=e.imul(t),a=s.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),r=s.isub(a).iushrn(this.shift),n=r;return r.cmp(this.m)>=0?n=r.isub(this.m):r.cmpn(0)<0&&(n=r.iadd(this.m)),n._forceRed(this)},I.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new n(0)._forceRed(this);var s=e.mul(t),a=s.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),r=s.isub(a).iushrn(this.shift),i=r;return r.cmp(this.m)>=0?i=r.isub(this.m):r.cmpn(0)<0&&(i=r.iadd(this.m)),i._forceRed(this)},I.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,s(19)(e))},function(e,t,s){var a=s(7);e.exports=y,y.simpleSieve=w,y.fermatTest=g;var r=s(5),n=new r(24),i=new(s(9)),o=new r(1),c=new r(2),u=new r(5),d=(new r(16),new r(8),new r(10)),h=new r(3),l=(new r(7),new r(11)),f=new r(4),m=(new r(12),null);function p(){if(null!==m)return m;var e=[];e[0]=2;for(var t=1,s=3;s<1048576;s+=2){for(var a=Math.ceil(Math.sqrt(s)),r=0;r<t&&e[r]<=a&&s%e[r]!=0;r++);t!==r&&e[r]<=a||(e[t++]=s)}return m=e,e}function w(e){for(var t=p(),s=0;s<t.length;s++)if(0===e.modn(t[s]))return 0===e.cmpn(t[s]);return!0}function g(e){var t=r.mont(e);return 0===c.toRed(t).redPow(e.subn(1)).fromRed().cmpn(1)}function y(e,t){if(e<16)return new r(2===t||5===t?[140,123]:[140,39]);var s,m;for(t=new r(t);;){for(s=new r(a(Math.ceil(e/8)));s.bitLength()>e;)s.ishrn(1);if(s.isEven()&&s.iadd(o),s.testn(1)||s.iadd(c),t.cmp(c)){if(!t.cmp(u))for(;s.mod(d).cmp(h);)s.iadd(f)}else for(;s.mod(n).cmp(l);)s.iadd(f);if(w(m=s.shrn(1))&&w(s)&&g(m)&&g(s)&&i.test(m)&&i.test(s))return s}}},function(e,t,s){"use strict";(function(t,a){var r=s(18).Buffer,n=t.crypto||t.msCrypto;n&&n.getRandomValues?e.exports=function(e,t){if(e>4294967295)throw new RangeError("requested too many random bytes");var s=r.allocUnsafe(e);if(e>0)if(e>65536)for(var i=0;i<e;i+=65536)n.getRandomValues(s.slice(i,i+65536));else n.getRandomValues(s);if("function"==typeof t)return a.nextTick((function(){t(null,s)}));return s}:e.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}).call(this,s(3),s(8))},function(e,t){var s,a,r=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function o(e){if(s===setTimeout)return setTimeout(e,0);if((s===n||!s)&&setTimeout)return s=setTimeout,setTimeout(e,0);try{return s(e,0)}catch(t){try{return s.call(null,e,0)}catch(t){return s.call(this,e,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:n}catch(e){s=n}try{a="function"==typeof clearTimeout?clearTimeout:i}catch(e){a=i}}();var c,u=[],d=!1,h=-1;function l(){d&&c&&(d=!1,c.length?u=c.concat(u):h=-1,u.length&&f())}function f(){if(!d){var e=o(l);d=!0;for(var t=u.length;t;){for(c=u,u=[];++h<t;)c&&c[h].run();h=-1,t=u.length}c=null,d=!1,function(e){if(a===clearTimeout)return clearTimeout(e);if((a===i||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(e);try{a(e)}catch(t){try{return a.call(null,e)}catch(t){return a.call(this,e)}}}(e)}}function m(e,t){this.fun=e,this.array=t}function p(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var s=1;s<arguments.length;s++)t[s-1]=arguments[s];u.push(new m(e,t)),1!==u.length||d||o(f)},m.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=p,r.addListener=p,r.once=p,r.off=p,r.removeListener=p,r.removeAllListeners=p,r.emit=p,r.prependListener=p,r.prependOnceListener=p,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},function(e,t,s){var a=s(5),r=s(21);function n(e){this.rand=e||new r.Rand}e.exports=n,n.create=function(e){return new n(e)},n.prototype._randbelow=function(e){var t=e.bitLength(),s=Math.ceil(t/8);do{var r=new a(this.rand.generate(s))}while(r.cmp(e)>=0);return r},n.prototype._randrange=function(e,t){var s=t.sub(e);return e.add(this._randbelow(s))},n.prototype.test=function(e,t,s){var r=e.bitLength(),n=a.mont(e),i=new a(1).toRed(n);t||(t=Math.max(1,r/48|0));for(var o=e.subn(1),c=0;!o.testn(c);c++);for(var u=e.shrn(c),d=o.toRed(n);t>0;t--){var h=this._randrange(new a(2),o);s&&s(h);var l=h.toRed(n).redPow(u);if(0!==l.cmp(i)&&0!==l.cmp(d)){for(var f=1;f<c;f++){if(0===(l=l.redSqr()).cmp(i))return!1;if(0===l.cmp(d))break}if(f===c)return!1}}return!0},n.prototype.getDivisor=function(e,t){var s=e.bitLength(),r=a.mont(e),n=new a(1).toRed(r);t||(t=Math.max(1,s/48|0));for(var i=e.subn(1),o=0;!i.testn(o);o++);for(var c=e.shrn(o),u=i.toRed(r);t>0;t--){var d=this._randrange(new a(2),i),h=e.gcd(d);if(0!==h.cmpn(1))return h;var l=d.toRed(r).redPow(c);if(0!==l.cmp(n)&&0!==l.cmp(u)){for(var f=1;f<o;f++){if(0===(l=l.redSqr()).cmp(n))return l.fromRed().subn(1).gcd(e);if(0===l.cmp(u))break}if(f===o)return(l=l.redSqr()).fromRed().subn(1).gcd(e)}}return!1}},function(e,t,s){(function(e){var a=s(6),r=s(23),n=s(24);var i={binary:!0,hex:!0,base64:!0};t.DiffieHellmanGroup=t.createDiffieHellmanGroup=t.getDiffieHellman=function(t){var s=new e(r[t].prime,"hex"),a=new e(r[t].gen,"hex");return new n(s,a)},t.createDiffieHellman=t.DiffieHellman=function t(s,r,o,c){return e.isBuffer(r)||void 0===i[r]?t(s,"binary",r,o):(r=r||"binary",c=c||"binary",o=o||new e([2]),e.isBuffer(o)||(o=new e(o,c)),"number"==typeof s?new n(a(s,o),o,!0):(e.isBuffer(s)||(s=new e(s,r)),new n(s,o,!0)))}}).call(this,s(4).Buffer)},function(e,t,s){"use strict";(function(t){!function(s){function a(e){const t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);let s=1779033703,a=3144134277,r=1013904242,n=2773480762,i=1359893119,o=2600822924,c=528734635,u=1541459225;const d=new Uint32Array(64);function h(e){let h=0,l=e.length;for(;l>=64;){let f,m,p,w,g,y=s,b=a,v=r,M=n,S=i,I=o,P=c,E=u;for(m=0;m<16;m++)p=h+4*m,d[m]=(255&e[p])<<24|(255&e[p+1])<<16|(255&e[p+2])<<8|255&e[p+3];for(m=16;m<64;m++)f=d[m-2],w=(f>>>17|f<<15)^(f>>>19|f<<13)^f>>>10,f=d[m-15],g=(f>>>7|f<<25)^(f>>>18|f<<14)^f>>>3,d[m]=(w+d[m-7]|0)+(g+d[m-16]|0)|0;for(m=0;m<64;m++)w=(((S>>>6|S<<26)^(S>>>11|S<<21)^(S>>>25|S<<7))+(S&I^~S&P)|0)+(E+(t[m]+d[m]|0)|0)|0,g=((y>>>2|y<<30)^(y>>>13|y<<19)^(y>>>22|y<<10))+(y&b^y&v^b&v)|0,E=P,P=I,I=S,S=M+w|0,M=v,v=b,b=y,y=w+g|0;s=s+y|0,a=a+b|0,r=r+v|0,n=n+M|0,i=i+S|0,o=o+I|0,c=c+P|0,u=u+E|0,h+=64,l-=64}}h(e);let l,f=e.length%64,m=e.length/536870912|0,p=e.length<<3,w=f<56?56:120,g=e.slice(e.length-f,e.length);for(g.push(128),l=f+1;l<w;l++)g.push(0);return g.push(m>>>24&255),g.push(m>>>16&255),g.push(m>>>8&255),g.push(m>>>0&255),g.push(p>>>24&255),g.push(p>>>16&255),g.push(p>>>8&255),g.push(p>>>0&255),h(g),[s>>>24&255,s>>>16&255,s>>>8&255,s>>>0&255,a>>>24&255,a>>>16&255,a>>>8&255,a>>>0&255,r>>>24&255,r>>>16&255,r>>>8&255,r>>>0&255,n>>>24&255,n>>>16&255,n>>>8&255,n>>>0&255,i>>>24&255,i>>>16&255,i>>>8&255,i>>>0&255,o>>>24&255,o>>>16&255,o>>>8&255,o>>>0&255,c>>>24&255,c>>>16&255,c>>>8&255,c>>>0&255,u>>>24&255,u>>>16&255,u>>>8&255,u>>>0&255]}function r(e,t,s){e=e.length<=64?e:a(e);const r=64+t.length+4,n=new Array(r),i=new Array(64);let o,c=[];for(o=0;o<64;o++)n[o]=54;for(o=0;o<e.length;o++)n[o]^=e[o];for(o=0;o<t.length;o++)n[64+o]=t[o];for(o=r-4;o<r;o++)n[o]=0;for(o=0;o<64;o++)i[o]=92;for(o=0;o<e.length;o++)i[o]^=e[o];function u(){for(let e=r-1;e>=r-4;e--){if(n[e]++,n[e]<=255)return;n[e]=0}}for(;s>=32;)u(),c=c.concat(a(i.concat(a(n)))),s-=32;return s>0&&(u(),c=c.concat(a(i.concat(a(n))).slice(0,s))),c}function n(e,t,s,a,r){let n;for(u(e,16*(2*s-1),r,0,16),n=0;n<2*s;n++)c(e,16*n,r,16),o(r,a),u(r,0,e,t+16*n,16);for(n=0;n<s;n++)u(e,t+2*n*16,e,16*n,16);for(n=0;n<s;n++)u(e,t+16*(2*n+1),e,16*(n+s),16)}function i(e,t){return e<<t|e>>>32-t}function o(e,t){u(e,0,t,0,16);for(let e=8;e>0;e-=2)t[4]^=i(t[0]+t[12],7),t[8]^=i(t[4]+t[0],9),t[12]^=i(t[8]+t[4],13),t[0]^=i(t[12]+t[8],18),t[9]^=i(t[5]+t[1],7),t[13]^=i(t[9]+t[5],9),t[1]^=i(t[13]+t[9],13),t[5]^=i(t[1]+t[13],18),t[14]^=i(t[10]+t[6],7),t[2]^=i(t[14]+t[10],9),t[6]^=i(t[2]+t[14],13),t[10]^=i(t[6]+t[2],18),t[3]^=i(t[15]+t[11],7),t[7]^=i(t[3]+t[15],9),t[11]^=i(t[7]+t[3],13),t[15]^=i(t[11]+t[7],18),t[1]^=i(t[0]+t[3],7),t[2]^=i(t[1]+t[0],9),t[3]^=i(t[2]+t[1],13),t[0]^=i(t[3]+t[2],18),t[6]^=i(t[5]+t[4],7),t[7]^=i(t[6]+t[5],9),t[4]^=i(t[7]+t[6],13),t[5]^=i(t[4]+t[7],18),t[11]^=i(t[10]+t[9],7),t[8]^=i(t[11]+t[10],9),t[9]^=i(t[8]+t[11],13),t[10]^=i(t[9]+t[8],18),t[12]^=i(t[15]+t[14],7),t[13]^=i(t[12]+t[15],9),t[14]^=i(t[13]+t[12],13),t[15]^=i(t[14]+t[13],18);for(let s=0;s<16;++s)e[s]+=t[s]}function c(e,t,s,a){for(let r=0;r<a;r++)s[r]^=e[t+r]}function u(e,t,s,a,r){for(;r--;)s[a++]=e[t++]}function d(e){if(!e||"number"!=typeof e.length)return!1;for(let t=0;t<e.length;t++){const s=e[t];if("number"!=typeof s||s%1||s<0||s>=256)return!1}return!0}function h(e,t){if("number"!=typeof e||e%1)throw new Error("invalid "+t);return e}function l(e,s,a,i,o,l,f){if(a=h(a,"N"),i=h(i,"r"),o=h(o,"p"),l=h(l,"dkLen"),0===a||0!=(a&a-1))throw new Error("N must be power of 2");if(a>2147483647/128/i)throw new Error("N too large");if(i>2147483647/128/o)throw new Error("r too large");if(!d(e))throw new Error("password must be an array or buffer");if(e=Array.prototype.slice.call(e),!d(s))throw new Error("salt must be an array or buffer");s=Array.prototype.slice.call(s);let m=r(e,s,128*o*i);const p=new Uint32Array(32*o*i);for(let e=0;e<p.length;e++){const t=4*e;p[e]=(255&m[t+3])<<24|(255&m[t+2])<<16|(255&m[t+1])<<8|(255&m[t+0])<<0}const w=new Uint32Array(64*i),g=new Uint32Array(32*i*a),y=32*i,b=new Uint32Array(16),v=new Uint32Array(16),M=o*a*2;let S,I,P=0,E=null,B=!1,N=0,U=0;const A=f?parseInt(1e3/i):4294967295,T=void 0!==t?t:setTimeout,k=function(){if(B)return f(new Error("cancelled"),P/M);let t;switch(N){case 0:I=32*U*i,u(p,I,w,0,y),N=1,S=0;case 1:t=a-S,t>A&&(t=A);for(let e=0;e<t;e++)u(w,0,g,(S+e)*y,y),n(w,y,i,b,v);if(S+=t,P+=t,f){const e=parseInt(1e3*P/M);if(e!==E){if(B=f(null,P/M),B)break;E=e}}if(S<a)break;S=0,N=2;case 2:t=a-S,t>A&&(t=A);for(let e=0;e<t;e++){const e=w[16*(2*i-1)]&a-1;c(g,e*y,w,y),n(w,y,i,b,v)}if(S+=t,P+=t,f){const e=parseInt(1e3*P/M);if(e!==E){if(B=f(null,P/M),B)break;E=e}}if(S<a)break;if(u(w,0,p,I,y),U++,U<o){N=0;break}m=[];for(let e=0;e<p.length;e++)m.push(p[e]>>0&255),m.push(p[e]>>8&255),m.push(p[e]>>16&255),m.push(p[e]>>24&255);const s=r(e,m,l);return f&&f(null,1,s),s}f&&T(k)};if(!f)for(;;){const e=k();if(null!=e)return e}k()}const f={scrypt:function(e,t,s,a,r,n,i){return new Promise((function(o,c){let u=0;i&&i(0),l(e,t,s,a,r,n,(function(e,t,s){if(e)c(e);else if(s)i&&1!==u&&i(1),o(new Uint8Array(s));else if(i&&t!==u)return u=t,i(t)}))}))},syncScrypt:function(e,t,s,a,r,n){return new Uint8Array(l(e,t,s,a,r,n))}};e.exports=f}()}).call(this,s(25).setImmediate)},function(e,t,s){var a,r=function(){var e,t,s=((t=(e={constructor:function(e,t){this.array=[],this.compare=t||a;for(var s=e.length,r=0;r<s;)this.insert(e[r++])},insert:function(e){for(var t,s,a=this.array,r=this.compare,n=a.length-1,i=0,o=-1;n>=i;)if((s=r(a[t=(n+i)/2>>>0],e))<0)i=t+1;else{if(!(s>0)){o=t;break}n=t-1}for(-1===o&&(o=n),o++,n=a.length-1;o<n&&0===r(e,a[o]);)o++;for(t=a.length,a.push(e);t>o;)a[t]=a[--t];return a[o]=e,this},search:function(e){for(var t,s,a=this.array,r=this.compare,n=a.length-1,i=0;n>=i;)if((s=r(a[t=(n+i)/2>>>0],e))<0)i=t+1;else{if(!(s>0))return t;n=t-1}return-1},remove:function(e){var t=this.search(e);return t>=0&&this.array.splice(t,1),this}}).constructor).prototype=e,t);return s.comparing=function(e,t){return new s(t,(function(t,s){return a(t[e],s[e])}))},s;function a(e,t){return e<t?-1:e>t?1:0}}();e.exports=r,void 0===(a=function(){return r}.call(t,s,t,e))||(e.exports=a)},function(e,t){var s="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(s){var a=new Uint8Array(16);e.exports=function(){return s(a),a}}else{var r=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}},function(e,t){for(var s=[],a=0;a<256;++a)s[a]=(a+256).toString(16).substr(1);e.exports=function(e,t){var a=t||0,r=s;return[r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],"-",r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]],r[e[a++]]].join("")}},function(e,t,s){"use strict";t.byteLength=function(e){var t=u(e),s=t[0],a=t[1];return 3*(s+a)/4-a},t.toByteArray=function(e){var t,s,a=u(e),i=a[0],o=a[1],c=new n(function(e,t,s){return 3*(t+s)/4-s}(0,i,o)),d=0,h=o>0?i-4:i;for(s=0;s<h;s+=4)t=r[e.charCodeAt(s)]<<18|r[e.charCodeAt(s+1)]<<12|r[e.charCodeAt(s+2)]<<6|r[e.charCodeAt(s+3)],c[d++]=t>>16&255,c[d++]=t>>8&255,c[d++]=255&t;2===o&&(t=r[e.charCodeAt(s)]<<2|r[e.charCodeAt(s+1)]>>4,c[d++]=255&t);1===o&&(t=r[e.charCodeAt(s)]<<10|r[e.charCodeAt(s+1)]<<4|r[e.charCodeAt(s+2)]>>2,c[d++]=t>>8&255,c[d++]=255&t);return c},t.fromByteArray=function(e){for(var t,s=e.length,r=s%3,n=[],i=0,o=s-r;i<o;i+=16383)n.push(d(e,i,i+16383>o?o:i+16383));1===r?(t=e[s-1],n.push(a[t>>2]+a[t<<4&63]+"==")):2===r&&(t=(e[s-2]<<8)+e[s-1],n.push(a[t>>10]+a[t>>4&63]+a[t<<2&63]+"="));return n.join("")};for(var a=[],r=[],n="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,c=i.length;o<c;++o)a[o]=i[o],r[i.charCodeAt(o)]=o;function u(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}function d(e,t,s){for(var r,n,i=[],o=t;o<s;o+=3)r=(e[o]<<16&16711680)+(e[o+1]<<8&65280)+(255&e[o+2]),i.push(a[(n=r)>>18&63]+a[n>>12&63]+a[n>>6&63]+a[63&n]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},function(e,t){
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+t.read=function(e,t,s,a,r){var n,i,o=8*r-a-1,c=(1<<o)-1,u=c>>1,d=-7,h=s?r-1:0,l=s?-1:1,f=e[t+h];for(h+=l,n=f&(1<<-d)-1,f>>=-d,d+=o;d>0;n=256*n+e[t+h],h+=l,d-=8);for(i=n&(1<<-d)-1,n>>=-d,d+=a;d>0;i=256*i+e[t+h],h+=l,d-=8);if(0===n)n=1-u;else{if(n===c)return i?NaN:1/0*(f?-1:1);i+=Math.pow(2,a),n-=u}return(f?-1:1)*i*Math.pow(2,n-a)},t.write=function(e,t,s,a,r,n){var i,o,c,u=8*n-r-1,d=(1<<u)-1,h=d>>1,l=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=a?0:n-1,m=a?1:-1,p=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,i=d):(i=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-i))<1&&(i--,c*=2),(t+=i+h>=1?l/c:l*Math.pow(2,1-h))*c>=2&&(i++,c/=2),i+h>=d?(o=0,i=d):i+h>=1?(o=(t*c-1)*Math.pow(2,r),i+=h):(o=t*Math.pow(2,h-1)*Math.pow(2,r),i=0));r>=8;e[s+f]=255&o,f+=m,o/=256,r-=8);for(i=i<<r|o,u+=r;u>0;e[s+f]=255&i,f+=m,i/=256,u-=8);e[s+f-m]|=128*p}},function(e,t){var s={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==s.call(e)}},function(e,t,s){
+/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
+var a=s(4),r=a.Buffer;function n(e,t){for(var s in e)t[s]=e[s]}function i(e,t,s){return r(e,t,s)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?e.exports=a:(n(a,t),t.Buffer=i),i.prototype=Object.create(r.prototype),n(r,i),i.from=function(e,t,s){if("number"==typeof e)throw new TypeError("Argument must not be a number");return r(e,t,s)},i.alloc=function(e,t,s){if("number"!=typeof e)throw new TypeError("Argument must be a number");var a=r(e);return void 0!==t?"string"==typeof s?a.fill(t,s):a.fill(t):a.fill(0),a},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return a.SlowBuffer(e)}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){},function(e,t,s){var a;function r(e){this.rand=e}if(e.exports=function(e){return a||(a=new r(null)),a.generate(e)},e.exports.Rand=r,r.prototype.generate=function(e){return this._rand(e)},r.prototype._rand=function(e){if(this.rand.getBytes)return this.rand.getBytes(e);for(var t=new Uint8Array(e),s=0;s<t.length;s++)t[s]=this.rand.getByte();return t},"object"==typeof self)self.crypto&&self.crypto.getRandomValues?r.prototype._rand=function(e){var t=new Uint8Array(e);return self.crypto.getRandomValues(t),t}:self.msCrypto&&self.msCrypto.getRandomValues?r.prototype._rand=function(e){var t=new Uint8Array(e);return self.msCrypto.getRandomValues(t),t}:"object"==typeof window&&(r.prototype._rand=function(){throw new Error("Not implemented yet")});else try{var n=s(22);if("function"!=typeof n.randomBytes)throw new Error("Not supported");r.prototype._rand=function(e){return n.randomBytes(e)}}catch(e){}},function(e,t){},function(e){e.exports=JSON.parse('{"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}')},function(e,t,s){(function(t){var a=s(5),r=new(s(9)),n=new a(24),i=new a(11),o=new a(10),c=new a(3),u=new a(7),d=s(6),h=s(7);function l(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this._pub=new a(e),this}function f(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this._priv=new a(e),this}e.exports=p;var m={};function p(e,t,s){this.setGenerator(t),this.__prime=new a(e),this._prime=a.mont(this.__prime),this._primeLen=e.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,s?(this.setPublicKey=l,this.setPrivateKey=f):this._primeCode=8}function w(e,s){var a=new t(e.toArray());return s?a.toString(s):a}Object.defineProperty(p.prototype,"verifyError",{enumerable:!0,get:function(){return"number"!=typeof this._primeCode&&(this._primeCode=function(e,t){var s=t.toString("hex"),a=[s,e.toString(16)].join("_");if(a in m)return m[a];var h,l=0;if(e.isEven()||!d.simpleSieve||!d.fermatTest(e)||!r.test(e))return l+=1,l+="02"===s||"05"===s?8:4,m[a]=l,l;switch(r.test(e.shrn(1))||(l+=2),s){case"02":e.mod(n).cmp(i)&&(l+=8);break;case"05":(h=e.mod(o)).cmp(c)&&h.cmp(u)&&(l+=8);break;default:l+=4}return m[a]=l,l}(this.__prime,this.__gen)),this._primeCode}}),p.prototype.generateKeys=function(){return this._priv||(this._priv=new a(h(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},p.prototype.computeSecret=function(e){var s=(e=(e=new a(e)).toRed(this._prime)).redPow(this._priv).fromRed(),r=new t(s.toArray()),n=this.getPrime();if(r.length<n.length){var i=new t(n.length-r.length);i.fill(0),r=t.concat([i,r])}return r},p.prototype.getPublicKey=function(e){return w(this._pub,e)},p.prototype.getPrivateKey=function(e){return w(this._priv,e)},p.prototype.getPrime=function(e){return w(this.__prime,e)},p.prototype.getGenerator=function(e){return w(this._gen,e)},p.prototype.setGenerator=function(e,s){return s=s||"utf8",t.isBuffer(e)||(e=new t(e,s)),this.__gen=e,this._gen=new a(e),this}}).call(this,s(4).Buffer)},function(e,t,s){(function(e){var a=void 0!==e&&e||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function n(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new n(r.call(setTimeout,a,arguments),clearTimeout)},t.setInterval=function(){return new n(r.call(setInterval,a,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},n.prototype.unref=n.prototype.ref=function(){},n.prototype.close=function(){this._clearFn.call(a,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},s(26),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,s(3))},function(e,t,s){(function(e,t){!function(e,s){"use strict";if(!e.setImmediate){var a,r,n,i,o,c=1,u={},d=!1,h=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,"[object process]"==={}.toString.call(e.process)?a=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,s=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=s,t}}()?e.MessageChannel?((n=new MessageChannel).port1.onmessage=function(e){m(e.data)},a=function(e){n.port2.postMessage(e)}):h&&"onreadystatechange"in h.createElement("script")?(r=h.documentElement,a=function(e){var t=h.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t)}):a=function(e){setTimeout(m,0,e)}:(i="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(i)&&m(+t.data.slice(i.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(t){e.postMessage(i+t,"*")}),l.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),s=0;s<t.length;s++)t[s]=arguments[s+1];var r={callback:e,args:t};return u[c]=r,a(c),c++},l.clearImmediate=f}function f(e){delete u[e]}function m(e){if(d)setTimeout(m,0,e);else{var t=u[e];if(t){d=!0;try{!function(e){var t=e.callback,s=e.args;switch(s.length){case 0:t();break;case 1:t(s[0]);break;case 2:t(s[0],s[1]);break;case 3:t(s[0],s[1],s[2]);break;default:t.apply(void 0,s)}}(t)}finally{f(e),d=!1}}}}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,s(3),s(8))},function(e,t,s){"use strict";s.r(t);var a=s(1),r=s.n(a),n=s(0),i=s.n(n),o=200,c=400,u=401,d=402,h=403,l=404,f=409,m=429,p=500,w=503,g=504,y=1012,b=3e3,v=3001;class M extends Error{constructor(...e){super(...e),this.name="UsernameAlreadyExists",this.message="Username already exists.",this.status=f}}class S extends Error{constructor(...e){super(...e),this.name="UsernameMissing",this.message="Username missing.",this.status=c}}class I extends Error{constructor(...e){super(...e),this.name="UsernameCannotBeBlank",this.message="Username cannot be blank.",this.status=c}}class P extends Error{constructor(e,...t){super(e,...t),this.name="UsernameTooLong",this.message="Username too long. Must be a max of ".concat(e," characters."),this.status=c}}class E extends Error{constructor(...e){super(...e),this.name="UsernameMustBeString",this.message="Username must be a string.",this.status=c}}class B extends Error{constructor(...e){super(...e),this.name="PasswordMissing",this.message="Password missing.",this.status=c}}class N extends Error{constructor(...e){super(...e),this.name="PasswordCannotBeBlank",this.message="Password cannot be blank.",this.status=c}}class U extends Error{constructor(e,...t){super(e,...t),this.name="PasswordTooShort",this.message="Password too short. Must be a minimum of ".concat(e," characters."),this.status=c}}class A extends Error{constructor(e,...t){super(e,...t),this.name="PasswordTooLong",this.message="Password too long. Must be a max of ".concat(e," characters."),this.status=c}}class T extends Error{constructor(...e){super(...e),this.name="PasswordMustBeString",this.message="Password must be a string.",this.status=c}}class k extends Error{constructor(e,...t){super(e,...t),this.name="PasswordAttemptLimitExceeded",this.message="Password attempt limit exceeded. Must wait ".concat(e," to attempt to use password again."),this.status=u}}class D extends Error{constructor(...e){super(...e),this.name="UsernameOrPasswordMismatch",this.message="Username or password mismatch.",this.status=u}}class K extends Error{constructor(...e){super(...e),this.name="SessionLengthMustBeNumber",this.message="Session length must be a number.",this.status=c}}class x extends Error{constructor(e,...t){super(e,...t),this.name="SessionLengthTooShort",this.message="Session length cannot be shorter than ".concat(e,"."),this.status=c}}class R extends Error{constructor(e,...t){super(e,...t),this.name="SessionLengthTooLong",this.message="Session length cannot be longer than ".concat(e,"."),this.status=c}}class O extends Error{constructor(...e){super(...e),this.name="AllowServerSideEncryptionMustBeBoolean",this.message="Allow server-side encryption value must be a boolean.",this.status=c}}class C extends Error{constructor(e,...t){super(...t),this.name="UserAlreadySignedIn",this.message="Already signed in.",this.status=c,this.username=e}}class _ extends Error{constructor(...e){super(...e),this.name="UserPendingDeletion",this.message="User is pending deletion.",this.status=h}}class F extends Error{constructor(...e){super(...e),this.name="AppIdNotValid",this.message="App ID not valid.",this.status=u}}class L extends Error{constructor(e,...t){super(e,...t),this.name="DomainNotWhitelisted",this.message="Domain not whitelisted. Whitelist the domain ".concat(e?"'".concat(e,"' "):"","in your admin panel."),this.status=u}}class j extends Error{constructor(...e){super(...e),this.name="UserNotSignedIn",this.message="Not signed in.",this.status=c}}class q extends Error{constructor(e,...t){super(e,...t),e&&(this.username=e),this.name="UserNotFound",this.message="User not found.",this.status=l}}class V extends Error{constructor(...e){super(...e),this.name="UserEmailNotFound",this.message="User does not have an email saved.",this.status=l}}class H extends Error{constructor(...e){super(...e),this.name="UserMustChangePassword",this.message="Must change password first.",this.status=h}}class G extends Error{constructor(...e){super(...e),this.name="EmailNotValid",this.message="Email not valid.",this.status=c}}class J extends Error{constructor(...e){super(...e),this.name="ProfileMustBeObject",this.message="Profile must be a flat JSON object.",this.status=c}}class W extends Error{constructor(...e){super(...e),this.name="ProfileCannotBeEmpty",this.message="Profile cannot be empty.",this.status=c}}class Y extends Error{constructor(e,...t){super(e,...t),this.name="ProfileHasTooManyKeys",this.message="Profile has too many keys. Must have a max of ".concat(e," keys."),this.status=c}}class z extends Error{constructor(e,t,...s){super(e,t,...s),this.name="ProfileKeyTooLong",this.message="Profile key too long. Must be a max of ".concat(e," characters."),this.status=c,this.key=t}}class Z extends Error{constructor(e,t,...s){super(e,t,...s),this.name="ProfileValueMustBeString",this.message="Profile value must be a string.",this.status=c,this.key=e,this.value=t}}class X extends Error{constructor(e,...t){super(e,...t),this.name="ProfileValueCannotBeBlank",this.message="Profile value cannot be blank.",this.status=c,this.key=e}}class Q extends Error{constructor(e,t,s,...a){super(e,t,s,...a),this.name="ProfileValueTooLong",this.message="Profile value too long. Must be a max of ".concat(e," characters."),this.status=c,this.key=t,this.value=s}}class $ extends Error{constructor(e,...t){super(e,...t),this.name="RememberMeValueNotValid",this.message="Remember me value must be one of ".concat(JSON.stringify(Object.keys(e)),"."),this.status=c}}class ee extends Error{constructor(...e){super(...e),this.name="ParamsMissing",this.message="Parameters expected are missing.",this.status=c}}class te extends Error{constructor(...e){super(...e),this.name="TrialExceededLimit",this.message="Trial exceeded limit of users.",this.status=d}}class se extends Error{constructor(...e){super(...e),this.name="CurrentPasswordMissing",this.message="Current password missing.",this.status=c}}class ae extends Error{constructor(...e){super(...e),this.name="CurrentPasswordIncorrect",this.message="Current password is incorrect.",this.status=u}}class re extends Error{constructor(e,...t){super(e,...t),this.name="KeyNotFound",this.message=e,this.status=l}}class ne extends Error{constructor(...e){super(...e),this.name="DeleteEndToEndEncryptedDataMustBeBoolean",this.message="Delete end-to-end encrypted data value must be a boolean.",this.status=c}}var ie={UsernameAlreadyExists:M,UsernameMissing:S,UsernameCannotBeBlank:I,UsernameTooLong:P,UsernameMustBeString:E,PasswordMissing:B,PasswordCannotBeBlank:N,PasswordTooShort:U,PasswordTooLong:A,PasswordMustBeString:T,PasswordAttemptLimitExceeded:k,UsernameOrPasswordMismatch:D,SessionLengthMustBeNumber:K,SessionLengthTooShort:x,SessionLengthTooLong:R,AllowServerSideEncryptionMustBeBoolean:O,UserAlreadySignedIn:C,UserPendingDeletion:_,AppIdNotValid:F,DomainNotWhitelisted:L,UserNotSignedIn:j,UserNotFound:q,UserEmailNotFound:V,UserMustChangePassword:H,EmailNotValid:G,ProfileMustBeObject:J,ProfileCannotBeEmpty:W,ProfileHasTooManyKeys:Y,ProfileKeyTooLong:z,ProfileValueMustBeString:Z,ProfileValueCannotBeBlank:X,ProfileValueTooLong:Q,RememberMeValueNotValid:$,ParamsMissing:ee,TrialExceededLimit:te,CurrentPasswordMissing:se,CurrentPasswordIncorrect:ae,KeyNotFound:re,DeleteEndToEndEncryptedDataMustBeBoolean:ne};class oe extends Error{constructor(...e){super(...e),this.name="DatabaseNameMissing",this.message="Database name missing.",this.status=c}}class ce extends Error{constructor(...e){super(...e),this.name="DatabaseNameCannotBeBlank",this.message="Database name cannot be blank.",this.status=c}}class ue extends Error{constructor(...e){super(...e),this.name="DatabaseNameMustBeString",this.message="Database name must be a string.",this.status=c}}class de extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseNameTooLong",this.message="Database name cannot be more than ".concat(e," characters."),this.status=c}}class he extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseNameRestricted",this.message="Database name '".concat(e,"' is restricted. It is used internally by userbase-js."),this.status=h}}class le extends Error{constructor(...e){super(...e),this.name="DatabaseAlreadyOpening",this.message="Already attempting to open database.",this.status=c}}class fe extends Error{constructor(...e){super(...e),this.name="ChangeHandlerMissing",this.message="Change handler missing.",this.status=c}}class me extends Error{constructor(...e){super(...e),this.name="ChangeHandlerMustBeFunction",this.message="Change handler must be a function.",this.status=c}}class pe extends Error{constructor(e,...t){super(e,...t),this.name="EncryptionModeNotValid",this.message="Encryption mode must be one of ".concat(JSON.stringify(Object.keys(e)),"."),this.status=c}}class we extends Error{constructor(...e){super(...e),this.name="ServerSideEncryptionNotEnabledInClient",this.message="Server-side encryption must be enabled in the client to use it. To enable it, set allowServerSideEncryption to true in init().",this.status=h}}class ge extends Error{constructor(...e){super(...e),this.name="DatabaseNotOpen",this.message="Database is not open.",this.status=c}}class ye extends Error{constructor(...e){super(...e),this.name="DatabaseNotFound",this.message="Database not found. Find available databases using getDatabases().",this.status=l}}class be extends Error{constructor(...e){super(...e),this.name="DatabaseIsReadOnly",this.message="Database is read only. Must have permission to write to database.",this.status=h}}class ve extends Error{constructor(...e){super(...e),this.name="DatabaseIdMustBeString",this.message="Database id must be a string.",this.status=c}}class Me extends Error{constructor(...e){super(...e),this.name="DatabaseIdCannotBeBlank",this.message="Database id cannot be blank.",this.status=c}}class Se extends Error{constructor(...e){super(...e),this.name="DatabaseIdNotAllowed",this.message="Database id not allowed. Cannot provide both databaseName and databaseId, can only provide one.",this.status=c}}class Ie extends Error{constructor(...e){super(...e),this.name="DatabaseIdNotAllowedForOwnDatabase",this.message="Tried to open the user's own database using its databaseId rather than its databaseName. The databaseId should only be used to open databases shared from other users.",this.status=h}}class Pe extends Error{constructor(e,...t){super(e,...t),this.name="DatabaseIdInvalidLength",this.message="Database id invalid length. Must be ".concat(e," characters."),this.status=c}}class Ee extends Error{constructor(...e){super(...e),this.name="ShareTokenInvalid",this.message="Share token invalid.",this.status=c}}class Be extends Error{constructor(...e){super(...e),this.name="ShareTokenNotFound",this.message="Share token not found. Perhaps the database owner has generated a new share token.",this.status=l}}class Ne extends Error{constructor(e,...t){super(e,...t),this.name="ShareTokenNotAllowed",this.message="Share token not allowed.",this.status=c}}class Ue extends Error{constructor(...e){super(...e),this.name="ShareTokenNotAllowedForOwnDatabase",this.message="Tried to open the user's own database using its shareToken rather than its databaseName. The shareToken should only be used to open databases shared from other users.",this.status=h}}class Ae extends Error{constructor(...e){super(...e),this.name="ReadOnlyMustBeBoolean",this.message="Read only value must be a boolean.",this.status=c}}class Te extends Error{constructor(...e){super(...e),this.name="ReadOnlyParamNotAllowed",this.message="Read only parameter not allowed when revoking access to a database.",this.status=c}}class ke extends Error{constructor(e,...t){super(e,...t),this.name="ResharingAllowedParamNotAllowed",this.message="Resharing allowed parameter not allowed ".concat(e,"."),this.status=c}}class De extends Error{constructor(...e){super(...e),this.name="ResharingAllowedMustBeBoolean",this.message="Resharing allowed value must be a boolean.",this.status=c}}class Ke extends Error{constructor(e,...t){super(e,...t),this.name="ResharingNotAllowed",this.message="Resharing not allowed. ".concat(e,"."),this.status=h}}class xe extends Error{constructor(...e){super(...e),this.name="ResharingWithWriteAccessNotAllowed",this.message="Resharing with write access not allowed. Must have permission to write to the database to reshare the database with write access another user.",this.status=h}}class Re extends Error{constructor(...e){super(...e),this.name="SharingWithSelfNotAllowed",this.message="Sharing database with self is not allowed. Must share database with another user.",this.status=c}}class Oe extends Error{constructor(...e){super(...e),this.name="ModifyingOwnPermissionsNotAllowed",this.message="Modifying own database permissions not allowed. Must modify another user's permissions.",this.status=c}}class Ce extends Error{constructor(...e){super(...e),this.name="ModifyingOwnerPermissionsNotAllowed",this.message="Modifying the owner of a database's permissions is not allowed.",this.status=h}}class _e extends Error{constructor(...e){super(...e),this.name="ModifyingPermissionsNotAllowed",this.message="Modifying another user's permissions is not allowed. Must have permission to reshare the database with another user.",this.status=h}}class Fe extends Error{constructor(...e){super(...e),this.name="GrantingWriteAccessNotAllowed",this.message="Granting write access not allowed. Must have permission to write to the database to grant write access to another user.",this.status=h}}class Le extends Error{constructor(...e){super(...e),this.name="RequireVerifiedMustBeBoolean",this.message="Require verified value must be a boolean.",this.status=c}}class je extends Error{constructor(...e){super(...e),this.name="RequireVerifiedParamNotNecessary",this.message="Require verified parameter not necessary when sharing database without a username.",this.status=c}}class qe extends Error{constructor(...e){super(...e),this.name="RevokeMustBeBoolean",this.message="Revoke value must be a boolean.",this.status=c}}class Ve extends Error{constructor(...e){super(...e),this.name="ItemMissing",this.message="Item missing.",this.status=c}}class He extends Error{constructor(...e){super(...e),this.name="ItemInvalid",this.message="Item must be serializable to JSON.",this.status=c}}class Ge extends Error{constructor(e,...t){super(e,...t),this.name="ItemTooLarge",this.message="Item must be less than ".concat(e," KB."),this.status=c}}class Je extends Error{constructor(...e){super(...e),this.name="ItemIdMustBeString",this.message="Item id must be a string.",this.status=c}}class We extends Error{constructor(e,...t){super(e,...t),this.name="ItemIdTooLong",this.message="Item id cannot be more than ".concat(e," characters."),this.status=c}}class Ye extends Error{constructor(...e){super(...e),this.name="ItemIdMissing",this.message="Item id missing.",this.status=c}}class ze extends Error{constructor(...e){super(...e),this.name="ItemIdCannotBeBlank",this.message="Item id cannot be blank.",this.status=c}}class Ze extends Error{constructor(...e){super(...e),this.name="ItemAlreadyExists",this.message="Item with the same id already exists.",this.status=f}}class Xe extends Error{constructor(...e){super(...e),this.name="ItemDoesNotExist",this.message="Item with the provided id does not exist.",this.status=l}}class Qe extends Error{constructor(...e){super(...e),this.name="ItemUpdateConflict",this.message="Item update conflict.",this.status=f}}class $e extends Error{constructor(...e){super(...e),this.name="FileMissing",this.message="File missing.",this.status=c}}class et extends Error{constructor(...e){super(...e),this.name="FileMustBeFile",this.message="File must be a file.",this.status=c}}class tt extends Error{constructor(...e){super(...e),this.name="FileCannotBeEmpty",this.message="File cannot be empty.",this.status=c}}class st extends Error{constructor(...e){super(...e),this.name="FileUploadConflict",this.message="File upload conflict.",this.status=f}}class at extends Error{constructor(...e){super(...e),this.name="FileNotFound",this.message="File not found.",this.status=l}}class rt extends Error{constructor(...e){super(...e),this.name="FileIdMissing",this.message="File id missing.",this.status=c}}class nt extends Error{constructor(...e){super(...e),this.name="FileIdMustBeString",this.message="File id must be a string.",this.status=c}}class it extends Error{constructor(...e){super(...e),this.name="FileIdCannotBeBlank",this.message="File id cannot be blank.",this.status=c}}class ot extends Error{constructor(e,...t){super(e,...t),this.name="FileIdTooLong",this.message="File id cannot be more than ".concat(e," characters."),this.status=c}}class ct extends Error{constructor(...e){super(...e),this.name="RangeMustBeObject",this.message="Range param provided must be object.",this.status=c}}class ut extends Error{constructor(...e){super(...e),this.name="RangeMissingStart",this.message="Range param missing start.",this.status=c}}class dt extends Error{constructor(...e){super(...e),this.name="RangeMissingEnd",this.message="Range param missing end.",this.status=c}}class ht extends Error{constructor(...e){super(...e),this.name="RangeStartMustBeNumber",this.message="Range start provided must be a number.",this.status=c}}class lt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeNumber",this.message="Range end provided must be a number.",this.status=c}}class ft extends Error{constructor(...e){super(...e),this.name="RangeStartMustBeGreaterThanZero",this.message="Range start provided must be greater than 0.",this.status=c}}class mt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeGreaterThanRangeStart",this.message="Range end provided must be greater than range start.",this.status=c}}class pt extends Error{constructor(...e){super(...e),this.name="RangeEndMustBeLessThanFileSize",this.message="Range end provided must be less than file size.",this.status=c}}class wt extends Error{constructor(...e){super(...e),this.name="OperationsMissing",this.message="Operations missing.",this.status=c}}class gt extends Error{constructor(...e){super(...e),this.name="OperationsMustBeArray",this.message="Operations provided must be an array.",this.status=c}}class yt extends Error{constructor(e,...t){super(e,...t),this.name="CommandNotRecognized",this.message="Command '".concat(e,"' not recognized."),this.status=c}}class bt extends Error{constructor(...e){super(...e),this.name="OperationsConflict",this.message="Operations conflict. Only allowed 1 operation per item.",this.status=f}}class vt extends Error{constructor(e,...t){super(e,...t),this.name="OperationsExceedLimit",this.message="Operations exceed limit. Only allowed ".concat(e," operations."),this.status=c}}class Mt extends Error{constructor(...e){super(...e),this.name="UserNotVerified",this.message="User not verified. Either verify user before sharing database, or set requireVerified to false.",this.status=h}}class St extends Error{constructor(...e){super(...e),this.name="UserMustBeReverified",this.message="User must be reverified.",this.status=h}}class It extends Error{constructor(...e){super(...e),this.name="UserUnableToReceiveDatabase",this.message="User unable to receive database. User must sign in with an updated userbase-js client to be able to receive database.",this.status=h}}class Pt extends Error{constructor(...e){super(...e),this.name="VerificationMessageMissing",this.message="Verification message missing.",this.status=c}}class Et extends Error{constructor(...e){super(...e),this.name="VerificationMessageCannotBeBlank",this.message="Verification message cannot be blank.",this.status=c}}class Bt extends Error{constructor(...e){super(...e),this.name="VerificationMessageMustBeString",this.message="Verification message must be a string.",this.status=c}}class Nt extends Error{constructor(e,...t){super(e,...t),this.name="VerificationMessageInvalid",this.message="Verification message invalid.",this.status=c}}class Ut extends Error{constructor(e,...t){super(e,...t),this.name="VerifyingSelfNotAllowed",this.message="Verifying self not allowed. Can only verify other users.",this.status=c}}class At extends Error{constructor(...e){super(...e),this.name="ProgressHandlerMustBeFunction",this.message="Progress handler must be a function.",this.status=c}}class Tt extends Error{constructor(e,...t){super(e,...t),this.name="TransactionUnauthorized",this.message="Calling '".concat(e,"' on this item is unauthorized."),this.status=h}}class kt extends Error{constructor(e,...t){super(e,...t),this.name="WriteAccessParamNotAllowed",this.message="Write access parameter not allowed. Only the item creator or database owner can change an item's write access settings.",this.status=h}}var Dt={DatabaseNameMissing:oe,DatabaseNameCannotBeBlank:ce,DatabaseNameMustBeString:ue,DatabaseNameTooLong:de,DatabaseNameRestricted:he,DatabaseNotFound:ye,DatabaseIsReadOnly:be,DatabaseAlreadyOpening:le,DatabaseIdMustBeString:ve,DatabaseIdCannotBeBlank:Me,DatabaseIdNotAllowed:Se,DatabaseIdNotAllowedForOwnDatabase:Ie,DatabaseIdInvalidLength:Pe,ShareTokenInvalid:Ee,ShareTokenNotFound:Be,ShareTokenNotAllowed:Ne,ShareTokenNotAllowedForOwnDatabase:Ue,ReadOnlyMustBeBoolean:Ae,ReadOnlyParamNotAllowed:Te,ResharingAllowedMustBeBoolean:De,ResharingNotAllowed:Ke,ResharingWithWriteAccessNotAllowed:xe,ResharingAllowedParamNotAllowed:ke,SharingWithSelfNotAllowed:Re,ModifyingOwnPermissionsNotAllowed:Oe,ModifyingOwnerPermissionsNotAllowed:Ce,ModifyingPermissionsNotAllowed:_e,GrantingWriteAccessNotAllowed:Fe,RequireVerifiedMustBeBoolean:Le,RequireVerifiedParamNotNecessary:je,RevokeMustBeBoolean:qe,ChangeHandlerMissing:fe,ChangeHandlerMustBeFunction:me,EncryptionModeNotValid:pe,ServerSideEncryptionNotEnabledInClient:we,DatabaseNotOpen:ge,ItemMissing:Ve,ItemInvalid:He,ItemTooLarge:Ge,ItemIdMustBeString:Je,ItemIdTooLong:We,ItemIdMissing:Ye,ItemIdCannotBeBlank:ze,ItemAlreadyExists:Ze,ItemDoesNotExist:Xe,ItemUpdateConflict:Qe,FileMissing:$e,FileMustBeFile:et,FileCannotBeEmpty:tt,FileUploadConflict:st,FileNotFound:at,FileIdMissing:rt,FileIdMustBeString:nt,FileIdCannotBeBlank:it,FileIdTooLong:ot,RangeMustBeObject:ct,RangeMissingStart:ut,RangeMissingEnd:dt,RangeStartMustBeNumber:ht,RangeEndMustBeNumber:lt,RangeStartMustBeGreaterThanZero:ft,RangeEndMustBeGreaterThanRangeStart:mt,RangeEndMustBeLessThanFileSize:pt,OperationsMissing:wt,OperationsMustBeArray:gt,OperationsConflict:bt,OperationsExceedLimit:vt,CommandNotRecognized:yt,UserNotVerified:Mt,UserMustBeReverified:St,UserUnableToReceiveDatabase:It,VerificationMessageMissing:Pt,VerificationMessageMustBeString:Bt,VerificationMessageCannotBeBlank:Et,VerificationMessageInvalid:Nt,VerifyingSelfNotAllowed:Ut,ProgressHandlerMustBeFunction:At,TransactionUnauthorized:Tt,WriteAccessParamNotAllowed:kt};class Kt extends Error{constructor(e,...t){super(e,...t),this.name="AppIdAlreadySet",this.message="Application ID already set.",this.status=f,this.appId=e}}class xt extends Error{constructor(...e){super(...e),this.name="AppIdMustBeString",this.message="Application ID must be a string.",this.status=c}}class Rt extends Error{constructor(...e){super(...e),this.name="AppIdMissing",this.message="Application ID missing.",this.status=c}}class Ot extends Error{constructor(...e){super(...e),this.name="AppIdCannotBeBlank",this.message="Application ID cannot be blank.",this.status=c}}class Ct extends Error{constructor(...e){super(...e),this.name="WebCryptoUnavailable",this.message="The WebCrypto API is unavailable. Please make sure your website uses https.",this.status=c}}class _t extends Error{constructor(...e){super(...e),this.name="UpdateUserHandlerMustBeFunction",this.message="Update user handler must be a function.",this.status=c}}var Ft={AppIdAlreadySet:Kt,AppIdMustBeString:xt,AppIdMissing:Rt,AppIdCannotBeBlank:Ot,WebCryptoUnavailable:Ct,UpdateUserHandlerMustBeFunction:_t};class Lt extends Error{constructor(...e){super(...e),this.name="SuccessUrlMissing",this.message="Success url missing to let Stripe know where to redirect users on successful payment.",this.status=c}}class jt extends Error{constructor(...e){super(...e),this.name="SuccessUrlMustBeString",this.message="Success url must be a string.",this.status=c}}class qt extends Error{constructor(e,...t){super(e,...t),this.name="SuccessUrlInvalid",this.message=e?"Success url must start with http or https.":"Success url invalid.",this.status=c}}class Vt extends Error{constructor(...e){super(...e),this.name="CancelUrlMissing",this.message="Cancel url missing to let Stripe know where to redirect users on canceled payment.",this.status=c}}class Ht extends Error{constructor(...e){super(...e),this.name="CancelUrlMustBeString",this.message="Cancel url must be a string.",this.status=c}}class Gt extends Error{constructor(e,...t){super(e,...t),this.name="CancelUrlInvalid",this.message=e?"Cancel url must start with http or https.":"Cancel url invalid.",this.status=c}}class Jt extends Error{constructor(...e){super(...e),this.name="StripeLibraryMissing",this.message="Stripe.js library missing. Be sure to include the script in your html file (https://stripe.com/docs/stripe-js#setup).",this.status=c}}class Wt extends Error{constructor(...e){super(...e),this.name="PaymentsDisabled",this.message="Payments on this app are disabled. Enable payments in the admin panel.",this.status=h}}class Yt extends Error{constructor(...e){super(...e),this.name="PriceIdOrPlanIdAllowed",this.message="Only one of priceId or planId allowed.",this.status=c}}class zt extends Error{constructor(...e){super(...e),this.name="PriceIdOrPlanIdMissing",this.message="Please provide a priceId or planId. You can create a product in the Stripe dashboard and find its priceId there.",this.status=c}}class Zt extends Error{constructor(...e){super(...e),this.name="SubscriptionPlanAlreadyPurchased",this.message="Subscription plan already purchased. Cancel subscription to purchase another.",this.status=f}}class Xt extends Error{constructor(...e){super(...e),this.name="StripeAccountNotConnected",this.message="Stripe account not connected. Connect a Stripe account in the admin panel.",this.status=h}}class Qt extends Error{constructor(...e){super(...e),this.name="SubscriptionNotFound",this.message="Subscription not found. User must purchase a subscription.",this.status=d}}class $t extends Error{constructor(e,...t){super(...t),this.name="SubscriptionInactive",this.message="The user's subscription is inactive.",this.subscriptionStatus=e,this.status=d}}class es extends Error{constructor(...e){super(...e),this.name="SubscriptionNotPurchased",this.message="Subscription not purchased. User must purchase a subscription.",this.status=d}}class ts extends Error{constructor(...e){super(...e),this.name="SubscriptionAlreadyCanceled",this.message="Subscription already canceled. User must purchase a new subscription.",this.status=c}}class ss extends Error{constructor(...e){super(...e),this.name="TrialExpired",this.message="Trial expired. User must purchase a subscription.",this.status=d}}class as extends Error{constructor(e,...t){super(e,...t);const{status:s,type:a,message:r}=e;this.name="StripeError",this.message=r,this.type=a,this.status=s}}var rs={SuccessUrlMissing:Lt,SuccessUrlMustBeString:jt,SuccessUrlInvalid:qt,CancelUrlMissing:Vt,CancelUrlMustBeString:Ht,CancelUrlInvalid:Gt,StripeJsLibraryMissing:Jt,PaymentsDisabled:Wt,PriceIdOrPlanIdAllowed:Yt,PriceIdOrPlanIdMissing:zt,SubscriptionPlanAlreadyPurchased:Zt,StripeAccountNotConnected:Xt,SubscriptionNotFound:Qt,SubscriptionInactive:$t,SubscriptionNotPurchased:es,SubscriptionAlreadyCanceled:ts,TrialExpired:ss,StripeError:as};function ns(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function is(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?ns(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):ns(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}class os extends Error{constructor(...e){super(...e),this.name="AppIdNotSet",this.message="App ID not set yet. Make sure to configure app ID.",this.status=c}}class cs extends Error{constructor(...e){super(...e),this.name="ServiceUnavailable",this.message="Service unavailable.",this.status=w}}class us extends Error{constructor(...e){super(...e),this.name="ParamsMustBeObject",this.message="Parameters passed to function must be placed inside an object.",this.status=c}}class ds extends Error{constructor(e,...t){super(e,...t);const s=Math.floor(e/1e3);this.name="TooManyRequests",this.message="Too many requests in a row. Please try again in ".concat(s," second").concat(1!==s?"s":"","."),this.status=m}}var hs=is(is(is(is(is({},ie),Dt),Ft),rs),{},{AppIdNotSet:os,InternalServerError:class extends cs{constructor(...e){super(...e),this.status=p}},ServiceUnavailable:cs,Timeout:class extends cs{constructor(...e){super(...e),this.status=g}},Reconnecting:class extends cs{constructor(...e){super(...e),this.message="Reconnecting."}},UnknownServiceUnavailable:class extends cs{constructor(e,...t){super(e,...t),console.error("Userbase error. Please report this to support@userbase.com.\n\n",e)}},ParamsMustBeObject:us,TooManyRequests:ds});let ls=null,fs=null,ms=!1;var ps="2.8.0",ws=()=>{if(!ls)throw new hs.AppIdNotSet;return ls},gs=()=>fs,ys=()=>window._userbaseEndpoint||"https://v1.userbase.com/v1",bs=({appId:e,updateUserHandler:t,allowServerSideEncryption:s})=>{if(ls&&ls!==e)throw new hs.AppIdAlreadySet(ls);ls=e,fs=t,ms=s},vs=e=>e?window._USERBASE_STRIPE_PRODUCTION_PUBLISHABLE_KEY||"pk_live_jI6lbsAIQlu2u4uTkDXFrSEW":window._USERBASE_STRIPE_TEST_PUBLISHABLE_KEY||"pk_test_rYANrLdNfdJXJ2d808wW4pqY",Ms=()=>ms;class Ss extends Error{constructor(e,t,s,...a){super(e,t,s,...a),this.response={data:e,status:t,statusText:s},this.message="Request failed with status code "+t}}class Is extends Error{constructor(e,...t){super(e,...t),this.message="timeout of ".concat(e,"ms exceeded")}}const Ps=(e,t,s,a=1e4)=>{e.timeout=a,e.onload=()=>((e,t,s)=>{let a;try{a=JSON.parse(e.response)}catch(t){a=e.response}e.status>=200&&e.status<300?t(a):s(new Ss(a,e.status,e.statusText))})(e,t,s),e.onerror=()=>s(new hs.ServiceUnavailable),e.ontimeout=()=>s(new Is(a))};var Es=(e,t,s,a,r,n,i,o,c)=>new Promise((u,d)=>{const h=new XMLHttpRequest,l="".concat(ys(),"/api/auth/sign-up?appId=").concat(ws(),"&userbaseJsVersion=").concat(ps),f=JSON.stringify({username:e,passwordToken:t,ecKeyData:s,passwordSalts:a,keySalts:r,email:n,profile:i,passwordBasedBackup:o,sessionLength:c});h.open("POST",l),h.setRequestHeader("Content-Type","application/json"),h.send(f),Ps(h,u,d)}),Bs=e=>new Promise((t,s)=>{const a=new XMLHttpRequest,r="".concat(ys(),"/api/auth/get-password-salts?appId=").concat(ws(),"&username=").concat(encodeURIComponent(e),"&userbaseJsVersion=").concat(ps);a.open("GET",r),a.send(),Ps(a,t,s)}),Ns=async(e,t,s)=>new Promise((a,r)=>{const n=new XMLHttpRequest,i="".concat(ys(),"/api/auth/sign-in?appId=").concat(ws(),"&userbaseJsVersion=").concat(ps),o=JSON.stringify({username:e,passwordToken:t,sessionLength:s});n.open("POST",i),n.setRequestHeader("Content-Type","application/json"),n.send(o),Ps(n,a,r)}),Us=(e,t)=>new Promise((s,a)=>{const r=new XMLHttpRequest,n="".concat(ys(),"/api/auth/sign-in-with-session?appId=").concat(ws(),"&sessionId=").concat(e,"&userbaseJsVersion=").concat(ps),i=JSON.stringify({sessionLength:t});r.open("POST",n),r.setRequestHeader("Content-Type","application/json"),r.send(i),Ps(r,s,a)}),As=async()=>new Promise((e,t)=>{const s=new XMLHttpRequest,a="".concat(ys(),"/api/auth/server-public-key?&userbaseJsVersion=").concat(ps);s.open("GET",a),s.responseType="arraybuffer",s.send(),Ps(s,e,t)}),Ts=e=>new Promise((t,s)=>{const a=new XMLHttpRequest,r="".concat(ys(),"/api/public-key?appId=").concat(ws(),"&username=").concat(encodeURIComponent(e),"&userbaseJsVersion=").concat(ps);a.open("GET",r),a.send(),Ps(a,t,s)}),ks=s(2),Ds=s.n(ks);function Ks(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function xs(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Ks(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Ks(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const Rs=e=>(...t)=>{try{return e(...t)}catch(e){console.warn("Error accessing browser storage. Defaulting to memory.\n\n",e)}},Os=(e,t)=>"userbaseSeed.".concat(e,".").concat(t),Cs=Rs((e,t,s,a,r,n)=>{const i={username:t,signedIn:s,sessionId:a,creationDate:r,expirationDate:n},o=JSON.stringify(i);"local"===e?localStorage.setItem("userbaseCurrentSession",o):"session"===e&&sessionStorage.setItem("userbaseCurrentSession",o)});var _s={signInSession:(e,t,s,a,r)=>{Cs(e,t,!0,s,a,r)},signOutSession:(e,t)=>{Cs(e,t,!1)},getCurrentSession:Rs(()=>{const e=sessionStorage.getItem("userbaseCurrentSession");if(e){if(!JSON.parse(e).signedIn){const e=localStorage.getItem("userbaseCurrentSession");if(e){const t=JSON.parse(e);if(t.signedIn)return xs(xs({},t),{},{rememberMe:"local"})}}return xs(xs({},JSON.parse(e)),{},{rememberMe:"session"})}const t=localStorage.getItem("userbaseCurrentSession");return t&&xs(xs({},JSON.parse(t)),{},{rememberMe:"local"})}),saveSeedString:Rs((e,t,s,a)=>{"local"===e?localStorage.setItem(Os(t,s),a):"session"===e&&sessionStorage.setItem(Os(t,s),a)}),removeSeedString:Rs((e,t)=>{const s=Os(e,t);sessionStorage.removeItem(s),localStorage.removeItem(s)}),getSeedString:Rs((e,t)=>{const s=Os(e,t);return sessionStorage.getItem(s)||localStorage.getItem(s)}),removeCurrentSession:Rs(()=>{sessionStorage.removeItem("userbaseCurrentSession"),localStorage.removeItem("userbaseCurrentSession")})};const Fs=(e,t)=>{const s=t?new Uint8Array(e):new Uint16Array(e),a=s.length;let r="",n=10240;for(var i=0;i<a;i+=n){i+n>a&&(n=a-i);const e=s.subarray(i,i+n);r+=String.fromCharCode.apply(null,e)}return r},Ls=(e,t=!1)=>{let s=new ArrayBuffer(e.length*(t?1:2)),a=t?new Uint8Array(s):new Uint16Array(s);for(let t=0,s=e.length;t<s;t++)a[t]=e.charCodeAt(t);return s},js=(e,t)=>{const s=new Uint8Array(e.byteLength+t.byteLength);return s.set(new Uint8Array(e),0),s.set(new Uint8Array(t),e.byteLength),s.buffer},qs=async e=>await window.crypto.subtle.digest({name:"SHA-256"},e);var Vs={BYTE_SIZE:32,HASH_ALGORITHM_NAME:"SHA-256",hash:qs,hashBase64String:async e=>{const t=i.a.decode(e),s=await qs(t);return i.a.encode(s)},hashString:async e=>{const t=Ls(e),s=await qs(t);return i.a.encode(s)}};const Hs=["deriveKey","deriveBits"],Gs=async e=>await window.crypto.subtle.importKey("raw",e,{name:"HKDF"},!1,Hs),Js=Vs.BYTE_SIZE,Ws=(e,t)=>({name:"HKDF",info:Ls(e),hash:Vs.HASH_ALGORITHM_NAME,salt:t});var Ys={importHkdfKeyFromString:async e=>{const t=Ls(e);return await Gs(t)},importHkdfKey:Gs,generateSalt:()=>window.crypto.getRandomValues(new Uint8Array(Js)),getParams:Ws,getPasswordToken:async(e,t)=>{const s=await window.crypto.subtle.deriveBits(Ws("password-token",t),e,256);return i.a.encode(s)}};const zs=["encrypt","decrypt"],Zs=()=>"undefined"!=typeof window?window:self,Xs=()=>({name:"AES-GCM",length:256}),Qs=e=>({name:"AES-GCM",tagLength:128,iv:e}),$s=()=>window.crypto.getRandomValues(new Uint8Array(12)),ea=e=>{const t=e.byteLength-12;return{ciphertextArrayBuffer:e.slice(0,t),iv:e.slice(t)}},ta=async()=>await window.crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,zs),sa=async e=>await Zs().crypto.subtle.importKey("raw",e,{name:"AES-GCM"},!0,zs),aa=async e=>await Zs().crypto.subtle.exportKey("raw",e),ra=async(e,t)=>{const s=$s(),a=await Zs().crypto.subtle.encrypt(Qs(s),e,t);return js(a,s)},na=async(e,t)=>{const s=Ls(t),a=await ra(e,s);return i.a.encode(a)},ia=async(e,t)=>{const{ciphertextArrayBuffer:s,iv:a}=ea(t);return await Zs().crypto.subtle.decrypt(Qs(a),e,s)},oa=async(e,t)=>{const s=i.a.decode(t),a=await ia(e,s);return Fs(a)};var ca={getEncryptionKeyParams:Xs,getCiphertextParams:Qs,generateIv:$s,sliceEncryptedArrayBuffer:ea,importKeyFromMaster:async(e,t,s="encryption")=>await window.crypto.subtle.deriveKey(Ys.getParams(s,t),e,{name:"AES-GCM",length:256},!0,zs),generateKey:ta,getKeyStringFromKey:async e=>{const t=await window.crypto.subtle.exportKey("raw",e);return i.a.encode(t)},getKeyFromKeyString:async e=>{const t=i.a.decode(e);return await sa(t)},getRawKeyFromKey:aa,getKeyFromRawKey:sa,encrypt:ra,encryptJson:async(e,t)=>{const s=JSON.stringify(t);return await na(e,s)},encryptString:na,decrypt:ia,decryptJson:async(e,t)=>{const s=await oa(e,t);return JSON.parse(s)},decryptString:oa,getPasswordBasedEncryptionKey:async(e,t)=>await window.crypto.subtle.deriveKey(Ys.getParams("password-based-encryption",t),e,{name:"AES-GCM",length:256},!1,zs),generateAndEncryptKeyEncryptionKey:async e=>{const t=await ta(),s=await aa(t);return[t,await ra(e,s)]},RAW_KEY_TYPE:"raw",KEY_WILL_BE_USED_TO:zs},ua=s(10),da=s.n(ua);const ha=["encrypt"],la=(e=>{if(e.length%2!=0)throw new Error("Hex string must be even length");const t=e.length/2,s=[];for(let a=0;a<t;a++){const t=2*a,r=e.substring(t,t+2),n=parseInt(r,16);s.push(n)}return new Uint8Array(s)})("ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"),fa=[2];let ma=null;const pa=e=>((e,t)=>(e.setPrivateKey(t),e.generateKeys(),e))(da.a.createDiffieHellman(la,fa),e),wa=async(e,t)=>{const s=pa(e).computeSecret(t),a=await Vs.hash(s);return await ca.getKeyFromRawKey(a)};var ga={getPublicKey:e=>pa(e).getPublicKey(),getSharedKey:wa,getSharedKeyWithServer:async e=>await wa(e,new Uint8Array(await(async()=>ma||(ma=await As(),ma))())),importKeyFromMaster:async(e,t)=>{const s=await window.crypto.subtle.deriveKey(Ys.getParams("diffie-hellman",t),e,ca.getEncryptionKeyParams(),!0,ha);return await ca.getRawKeyFromKey(s)}};const ya=["sign","verify"],ba=["sign"],va=["verify"],Ma={name:"ECDSA",namedCurve:"P-256"},Sa={name:"ECDSA",hash:{name:Vs.HASH_ALGORITHM_NAME}},Ia=async e=>await window.crypto.subtle.exportKey("spki",e),Pa=async e=>{const t=await Ia(e);return i.a.encode(t)},Ea=async(e,t)=>await ca.importKeyFromMaster(e,t,"ecdsa-key-encryption-key"),Ba=async(e,t)=>await window.crypto.subtle.sign(Sa,e,t),Na=async(e,t,s)=>await window.crypto.subtle.verify(Sa,e,t,s);var Ua={generateEcdsaKeyData:async e=>{const t=await(async()=>await window.crypto.subtle.generateKey(Ma,!0,ya))(),s=Ys.generateSalt(),a=await Ea(e,s),r=await(async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);return Ls(JSON.stringify(t))})(t.privateKey),n=await ca.encrypt(a,r);return{ecdsaPrivateKey:t.privateKey,ecdsaPublicKey:await Pa(t.publicKey),encryptedEcdsaPrivateKey:i.a.encode(n),ecdsaKeyEncryptionKeySalt:i.a.encode(s)}},importEcdsaKeyEncryptionKeyFromMaster:Ea,getPrivateKeyFromRawPrivateKey:async e=>{const t=JSON.parse(Fs(e));return await window.crypto.subtle.importKey("jwk",t,Ma,!0,ba)},getPublicKeyFromRawPublicKey:async e=>await window.crypto.subtle.importKey("spki",e,Ma,!0,va),getRawPublicKeyFromPublicKey:Ia,getPublicKeyStringFromPublicKey:Pa,getPublicKeyFromPrivateKey:async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);delete t.d,t.key_ops=va;return await window.crypto.subtle.importKey("jwk",t,Ma,!0,va)},sign:Ba,signString:async(e,t)=>{const s=Ls(t),a=await Ba(e,s);return i.a.encode(a)},verify:Na,verifyString:async(e,t,s)=>{const a=Ls(s),r=i.a.decode(t);return await Na(e,r,a)}};const Aa=["deriveKey","deriveBits"],Ta={name:"ECDH",namedCurve:"P-256"},ka=async()=>await window.crypto.subtle.generateKey(Ta,!0,Aa),Da=async e=>await window.crypto.subtle.exportKey("spki",e),Ka=async(e,t)=>await ca.importKeyFromMaster(e,t,"ecdh-key-encryption-key");var xa={generateKeyPair:ka,generateEcdhKeyData:async(e,t)=>{const s=await ka(),a=Ys.generateSalt(),r=await Ka(e,a),n=await(async e=>{const t=await window.crypto.subtle.exportKey("jwk",e);return Ls(JSON.stringify(t))})(s.privateKey),o=await ca.encrypt(r,n),c=await Da(s.publicKey),u=await Ua.sign(t,c);return{ecdhPrivateKey:s.privateKey,ecdhPublicKey:i.a.encode(c),encryptedEcdhPrivateKey:i.a.encode(o),signedEcdhPublicKey:i.a.encode(u),ecdhKeyEncryptionKeySalt:i.a.encode(a)}},importEcdhKeyEncryptionKeyFromMaster:Ka,getPrivateKeyFromRawPrivateKey:async e=>{const t=JSON.parse(Fs(e));return await window.crypto.subtle.importKey("jwk",t,Ta,!0,Aa)},getRawPublicKeyFromPublicKey:Da,getPublicKeyFromRawPublicKey:async e=>await window.crypto.subtle.importKey("spki",e,Ta,!0,[]),computeSharedKeyEncryptionKey:async(e,t)=>await window.crypto.subtle.deriveKey({name:"ECDH",namedCurve:"P-256",public:e},t,ca.getEncryptionKeyParams(),!1,ca.KEY_WILL_BE_USED_TO)};const Ra=["sign"],Oa=["sign","verify"],Ca=async(e,t)=>await window.crypto.subtle.sign({name:"HMAC"},e,t);var _a={importKeyFromMaster:async(e,t)=>await window.crypto.subtle.deriveKey(Ys.getParams("authentication",t),e,{name:"HMAC",hash:{name:Vs.HASH_ALGORITHM_NAME},length:512},!1,Ra),importKeyFromRawBits:async e=>await window.crypto.subtle.importKey("raw",e,{name:"HMAC",hash:{name:Vs.HASH_ALGORITHM_NAME},length:256},!1,Oa),sign:Ca,signString:async(e,t)=>{const s=await Ca(e,Ls(t));return i.a.encode(s)}},Fa=s(11),La=s.n(Fa);var ja={generateSeed:()=>window.crypto.getRandomValues(new Uint8Array(32)),aesGcm:ca,diffieHellman:ga,ecdsa:Ua,ecdh:xa,sha256:Vs,hmac:_a,hkdf:Ys,scrypt:{generateSalt:()=>window.crypto.getRandomValues(new Uint8Array(16)),hash:async(e,t,s=La.a.scrypt)=>{const a=new Uint8Array(Ls(e)),r=await s(a,t,16384,8,1,32);return i.a.encode(r)}}};const qa=e=>e.split(":")[0],Va=e=>{const t=(e=>"http://"===e.substring(0,"http://".length)?e.substring("http://".length):"https://"===e.substring(0,"https://".length)?e.substring("https://".length):e)(e);return("https"===qa(e)?"wss://":"ws://")+t},Ha=e=>2*e.length,Ga=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function Ja(){let e=[],t=0;this.getLength=()=>e.length-t,this.isEmpty=()=>0===e.length,this.enqueue=t=>(e.push(t),this.getLength()),this.dequeue=()=>{const s=e[t];return t+=1,2*t>e.length&&(e=e.slice(t),t=0),s},this.peek=()=>e[t]}const Wa=()=>{const e=URL.createObjectURL(new Blob(["(",function(){self.onmessage=function(e){const{compress:t,decompress:s,data:a}=e.data,r=function(){function e(e,t){if(!r[e]){r[e]={};for(var s=0;s<e.length;s++)r[e][e.charAt(s)]=s}return r[e][t]}var t=String.fromCharCode,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",r={},n={compressToBase64:function(e){if(null==e)return"";var t=n._compress(e,6,(function(e){return s.charAt(e)}));switch(t.length%4){default:case 0:return t;case 1:return t+"===";case 2:return t+"==";case 3:return t+"="}},decompressFromBase64:function(t){return null==t?"":""==t?null:n._decompress(t.length,32,(function(a){return e(s,t.charAt(a))}))},compressToUTF16:function(e){return null==e?"":n._compress(e,15,(function(e){return t(e+32)}))+" "},decompressFromUTF16:function(e){return null==e?"":""==e?null:n._decompress(e.length,16384,(function(t){return e.charCodeAt(t)-32}))},compressToUint8Array:function(e){for(var t=n.compress(e),s=new Uint8Array(2*t.length),a=0,r=t.length;r>a;a++){var i=t.charCodeAt(a);s[2*a]=i>>>8,s[2*a+1]=i%256}return s},decompressFromUint8Array:function(e){if(null==e)return n.decompress(e);for(var s=new Array(e.length/2),a=0,r=s.length;r>a;a++)s[a]=256*e[2*a]+e[2*a+1];var i=[];return s.forEach((function(e){i.push(t(e))})),n.decompress(i.join(""))},compressToEncodedURIComponent:function(e){return null==e?"":n._compress(e,6,(function(e){return a.charAt(e)}))},decompressFromEncodedURIComponent:function(t){return null==t?"":""==t?null:(t=t.replace(/ /g,"+"),n._decompress(t.length,32,(function(s){return e(a,t.charAt(s))})))},compress:function(e){return n._compress(e,16,(function(e){return t(e)}))},_compress:function(e,t,s){if(null==e)return"";var a,r,n,i={},o={},c="",u="",d="",h=2,l=3,f=2,m=[],p=0,w=0;for(n=0;n<e.length;n+=1)if(c=e.charAt(n),Object.prototype.hasOwnProperty.call(i,c)||(i[c]=l++,o[c]=!0),u=d+c,Object.prototype.hasOwnProperty.call(i,u))d=u;else{if(Object.prototype.hasOwnProperty.call(o,d)){if(d.charCodeAt(0)<256){for(a=0;f>a;a++)p<<=1,w==t-1?(w=0,m.push(s(p)),p=0):w++;for(r=d.charCodeAt(0),a=0;8>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}else{for(r=1,a=0;f>a;a++)p=p<<1|r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r=0;for(r=d.charCodeAt(0),a=0;16>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}0==--h&&(h=Math.pow(2,f),f++),delete o[d]}else for(r=i[d],a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;0==--h&&(h=Math.pow(2,f),f++),i[u]=l++,d=String(c)}if(""!==d){if(Object.prototype.hasOwnProperty.call(o,d)){if(d.charCodeAt(0)<256){for(a=0;f>a;a++)p<<=1,w==t-1?(w=0,m.push(s(p)),p=0):w++;for(r=d.charCodeAt(0),a=0;8>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}else{for(r=1,a=0;f>a;a++)p=p<<1|r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r=0;for(r=d.charCodeAt(0),a=0;16>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1}0==--h&&(h=Math.pow(2,f),f++),delete o[d]}else for(r=i[d],a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;0==--h&&(h=Math.pow(2,f),f++)}for(r=2,a=0;f>a;a++)p=p<<1|1&r,w==t-1?(w=0,m.push(s(p)),p=0):w++,r>>=1;for(;;){if(p<<=1,w==t-1){m.push(s(p));break}w++}return m.join("")},decompress:function(e){return null==e?"":""==e?null:n._decompress(e.length,32768,(function(t){return e.charCodeAt(t)}))},_decompress:function(e,s,a){var r,n,i,o,c,u,d,h=[],l=4,f=4,m=3,p="",w=[],g={val:a(0),position:s,index:1};for(r=0;3>r;r+=1)h[r]=r;for(i=0,c=Math.pow(2,2),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;switch(i){case 0:for(i=0,c=Math.pow(2,8),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;d=t(i);break;case 1:for(i=0,c=Math.pow(2,16),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;d=t(i);break;case 2:return""}for(h[3]=d,n=d,w.push(d);;){if(g.index>e)return"";for(i=0,c=Math.pow(2,m),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;switch(d=i){case 0:for(i=0,c=Math.pow(2,8),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;h[f++]=t(i),d=f-1,l--;break;case 1:for(i=0,c=Math.pow(2,16),u=1;u!=c;)o=g.val&g.position,g.position>>=1,0==g.position&&(g.position=s,g.val=a(g.index++)),i|=(o>0?1:0)*u,u<<=1;h[f++]=t(i),d=f-1,l--;break;case 2:return w.join("")}if(0==l&&(l=Math.pow(2,m),m++),h[d])p=h[d];else{if(d!==f)return null;p=n+n.charAt(0)}w.push(p),h[f++]=n+p.charAt(0),n=p,0==--l&&(l=Math.pow(2,m),m++)}}};return n}();t?postMessage(r.compress(a)):s&&postMessage(r.decompress(a))}}.toString(),")()"],{type:"application/javascript"})),t=new Worker(e);return URL.revokeObjectURL(e),t},Ya=async e=>{const t=Wa();return new Promise(s=>{t.onmessage=e=>{s(e.data),t.terminate()},t.postMessage({compress:!0,data:e})})},za=async e=>{const t=Wa();return new Promise(s=>{t.onmessage=e=>{s(e.data),t.terminate()},t.postMessage({decompress:!0,data:e})})},Za=async(e,t,s,a,r,n)=>new Promise((i,o)=>{const c=new XMLHttpRequest,u="".concat(ys(),"/api/bundle-chunk?userbaseJsVersion=").concat(ps,"&")+"userId=".concat(e,"&")+"databaseId=".concat(t,"&")+"seqNo=".concat(s,"&")+"bundleId=".concat(a,"&")+"chunkNumber=".concat(r);c.open("POST",u),c.send(new Uint8Array(n)),Ps(c,i,o,3e4)});function Xa(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function Qa(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Xa(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Xa(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const $a=Ds()();class er extends Error{constructor(e,t,...s){super(...s),this.name="RequestFailed: ".concat(e),this.message=t.message,this.status=t.status||"timeout"===t.message&&g,this.response=t.status&&t}}class tr extends Error{constructor(e,t,s,...a){super(...a),this.name="WebSocket error",this.message=e,this.username=t,this.e=s}}var sr=new class{constructor(){this.init()}init(e,t,s,a,r,n,i,o){this.pingTimeout&&clearTimeout(this.pingTimeout);for(const e of Object.keys(this))delete this[e];this.ws=null,this.connected=!1,this.resolveConnection=e,this.rejectConnection=t,this.connectionResolved=!1,this.session={username:s&&s.username,sessionId:s&&s.sessionId,creationDate:s&&s.creationDate,expirationDate:s&&s.expirationDate,userId:s&&s.userId,authToken:s&&s.authToken},this.seedString=a,this.changePassword=n,this.keys={init:!1,salts:{}},this.userData={stripeData:{}},this.rememberMe=r,this.requests={},this.state=i||{dbNameToHash:{},databases:{},databasesByDbId:{},shareTokenIdToDbId:{}},this.encryptionMode=o}connect(e,t=null,s,a,r,n){if(this.connected)throw new tr("Web Socket already connected",this.session.username);return new Promise((i,c)=>{let u=!1;const d=setTimeout(()=>{this.connected||this.reconnecting||(u=!0,c(new tr("timeout")))},1e4),h="".concat(Va(ys()),"/api?appId=").concat(ws(),"&sessionId=").concat(e.sessionId,"&clientId=").concat($a,"&userbaseJsVersion=").concat(ps),l=new WebSocket(h);l.onopen=async()=>{u||clearTimeout(d)},l.onmessage=async r=>{if(!u)try{const u=JSON.parse(r.data);switch(u.route){case"Ping":{this.heartbeat();const e="Pong";this.ws.send(JSON.stringify({action:e}));break}case"Connection":{const{encryptionMode:o}=u;if(this.init(i,c,e,t,s,a,n,o),this.ws=l,this.heartbeat(),this.connected=!0,t){const{keySalts:e,validationMessage:t,ecKeyData:s,encryptedValidationMessage:a}=u;this.keys.salts=e,this.validationMessage=t,this.ecKeyData=s,a&&(this.encryptedValidationMessage=new Uint8Array(a.data));try{await this.setKeys(this.seedString);const e=await this.validateKey();this.userData=e}catch(r){throw r&&"OperationError"===r.name||r instanceof DOMException?new Error("Invalid seed"):r}this.keys.init=!0}this.resolveConnection(),this.connectionResolved=!0;break}case"ApplyTransactions":{const e=u.dbId,t=u.dbNameHash,s=u.isOwner?this.state.databases[t]:this.state.databasesByDbId[e];if(!s)throw new Error("Missing database");s.applyTransactionsQueue.isEmpty()?s.applyTransactionsQueue.enqueue(null):await new Promise(e=>{const t=e;s.applyTransactionsQueue.enqueue(t)});if((u.dbNameHash&&(u.dbKey||u.plaintextDbKey)||u.shareTokenEncryptedDbKey)&&(!s.dbKeyString||!s.dbKey)){const e=u.plaintextDbKey||(u.dbKey?await ja.aesGcm.decryptString(this.keys.encryptionKey,u.dbKey):await s.decryptShareTokenEncryptedDbKey(u.shareTokenEncryptedDbKey,u.shareTokenEncryptionKeySalt));s.dbKeyString=e,s.dbKey=await ja.aesGcm.getKeyFromKeyString(e)}if(!s.dbKey)throw new Error("Missing db key");if(u.writers){s.attributionEnabled=!0;for(const{userId:e,username:t}of u.writers)s.usernamesByUserId.set(e,t)}if(u.waitForFullBundle){s.finishedWaitingForBundle||await new Promise(e=>s.finishedWaitingForBundle=e);try{const e=await this.rebuildBundle(s,u.bundleSeqNo,u.encryptedBundleEncryptionKey);await s.applyBundle(e,u.bundleSeqNo)}catch(r){throw window.alert("Oops! Something went wrong. Please contact the site administrator with this issue (".concat(e,").\n\n")+r),r}}const a=u.transactionLog;if(await s.applyTransactions(a,u.ownerId,e,t),u.buildBundle&&this.buildBundle(s),s.applyTransactionsQueue.dequeue(),!s.applyTransactionsQueue.isEmpty()){s.applyTransactionsQueue.peek()()}break}case"DownloadBundleChunk":{const{dbId:e,dbNameHash:t,isOwner:s,bundleSeqNo:a,isFirstChunk:r,isLastChunk:n,chunk:i}=u,o=s?this.state.databases[t]:this.state.databasesByDbId[e];if(!o)throw new Error("Missing database");r&&(o.bundleChunks[a]=[]),o.bundleChunks[a].push(i),n&&(o.finishedWaitingForBundle?o.finishedWaitingForBundle():o.finishedWaitingForBundle=!0);break}case"UpdatedUser":this.handleUpdateUser(u.updatedUser);break;case"SignOut":case"UpdateUser":case"DeleteUser":case"CreateDatabase":case"OpenDatabase":case"OpenDatabaseByDatabaseId":case"GetDatabases":case"GetDatabaseUsers":case"Insert":case"Update":case"Delete":case"BatchTransaction":case"InitBundleUpload":case"CompleteBundleUpload":case"GenerateFileId":case"UploadFileChunk":case"CompleteFileUpload":case"GetChunk":case"ValidateKey":case"GetPasswordSalts":case"PurchaseSubscription":case"CancelSubscription":case"ResumeSubscription":case"UpdatePaymentMethod":case"ShareDatabase":case"ShareDatabaseToken":case"AuthenticateShareToken":case"SaveDatabase":case"ModifyDatabasePermissions":case"VerifyUser":{const e=u.requestId;if(!e)return console.warn("Missing request id");const t=this.requests[e];if(!t)return console.warn("Request ".concat(e," no longer exists!"));if(!t.promiseResolve||!t.promiseReject)return;const s=u.response;return s&&s.status===o?t.promiseResolve(s):t.promiseReject(s)}default:console.log("Received unknown message from backend:"+JSON.stringify(u))}}catch(r){this.connectionResolved?console.warn("Error handling message: ",r):(this.close(),c(new tr(r.message,e.username,r)))}},l.onclose=async o=>{if(u)return;const d=o.code===y,h=o.code===b;if(d||h||!o.wasClean){const o=d&&!r?0:r?r+1e3:1e3;this.reconnecting=!0,await this.reconnect(i,c,e,this.seedString||t,s,a,o,!this.reconnected&&n)}else o.code===v?c(new tr("Web Socket already connected",e.username,o)):this.init()},l.onerror=()=>{}})}async reconnect(e,t,s,a,r,n,i,o){try{const t=Math.min(i,3e4);console.log("Connection to server lost. Attempting to reconnect in ".concat(t/1e3," second").concat(1e3!==t?"s":"","..."));const c=[],u=[];e(await new Promise((e,d)=>setTimeout(async()=>{try{const t=o||{dbNameToHash:Qa({},this.state.dbNameToHash),databases:Qa({},this.state.databases),databasesByDbId:Qa({},this.state.databasesByDbId),shareTokenIdToDbId:Qa({},this.state.shareTokenIdToDbId)};for(const e in t.databases)t.databases[e].init=!1,t.databases[e].finishedWaitingForBundle=!1,c.push(e);for(const e in t.databasesByDbId)t.databasesByDbId[e].init=!1,t.databasesByDbId[e].finishedWaitingForBundle=!1,u.push(e);this.init(),this.reconnecting=!0;const d=await this.connect(s,a,r,n,i,t);this.reconnected=!0,o||(await this.reopenDatabases(c,u,1e3),console.log("Reconnected!")),e(d)}catch(e){d(e)}},t)))}catch(e){t(e)}}async reopenDatabases(e,t,s){try{const s=[];for(const t of e){const e=this.state.databases[t];if(!e.init){const a="OpenDatabase",r={dbNameHash:t,reopenAtSeqNo:e.lastSeqNo};s.push(this.request(a,r))}}for(const e of t){const t=this.state.databasesByDbId[e];if(!t.init){const a=t.shareTokenHkdfKey,r=a?await this.authenticateShareToken(t.shareTokenId,a):{},n="OpenDatabaseByDatabaseId",i=Qa({databaseId:e,reopenAtSeqNo:t.lastSeqNo},r);s.push(this.request(n,i))}}await Promise.all(s)}catch(a){await new Promise(a=>setTimeout(async()=>{await this.reopenDatabases(e,t,s+1e3),a()},Math.min(s,3e4)))}}heartbeat(){clearTimeout(this.pingTimeout);this.pingTimeout=setTimeout(()=>{this.ws&&this.ws.close(b)},33e3)}close(e){this.ws?this.ws.close(e):this.init()}async signOut(){const e=this.session.username,t=this.connectionResolved,s=this.rejectConnection;try{_s.signOutSession(this.rememberMe,e);const a=this.session.sessionId;if(this.reconnecting)throw new hs.Reconnecting;const r="SignOut",n={sessionId:a};await this.request(r,n),this.close(),!t&&s&&s(new tr("Canceled",e))}catch(a){throw!t&&s&&s(new tr("Canceled",e)),a}}async setKeys(e){if(this.keys.init)return;if(!e)throw new tr("Missing seed",this.session.username);if(!this.keys.salts)throw new tr("Missing salts",this.session.username);this.seedString||(this.seedString=e);const t=i.a.decode(e),s=await ja.hkdf.importHkdfKey(t),a=this.keys.salts;if(this.keys.encryptionKey=await ja.aesGcm.importKeyFromMaster(s,i.a.decode(a.encryptionKeySalt)),this.keys.hmacKey=await ja.hmac.importKeyFromMaster(s,i.a.decode(a.hmacKeySalt)),a.ecdsaKeyEncryptionKeySalt){const e=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(s,i.a.decode(a.ecdsaKeyEncryptionKeySalt)),t=i.a.decode(this.ecKeyData.encryptedEcdsaPrivateKey),r=await ja.aesGcm.decrypt(e,t);this.keys.ecdsaPrivateKey=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(r);const n=await ja.ecdh.importEcdhKeyEncryptionKeyFromMaster(s,i.a.decode(a.ecdhKeyEncryptionKeySalt)),o=i.a.decode(this.ecKeyData.encryptedEcdhPrivateKey),c=await ja.aesGcm.decrypt(n,o);this.keys.ecdhPrivateKey=await ja.ecdh.getPrivateKeyFromRawPrivateKey(c)}else a.dhKeySalt&&(this.keys.dhPrivateKey=await ja.diffieHellman.importKeyFromMaster(s,i.a.decode(a.dhKeySalt)));if(a.dhKeySalt||a.ecdsaKeyWrapperSalt){const e=await ja.ecdsa.generateEcdsaKeyData(s),t=await ja.ecdh.generateEcdhKeyData(s,e.ecdsaPrivateKey);this.keys.ecdsaPrivateKey=e.ecdsaPrivateKey,this.keys.ecdhPrivateKey=t.ecdhPrivateKey,delete e.ecdsaPrivateKey,delete t.ecdhPrivateKey,this.newEcKeyData={ecdsaKeyData:e,ecdhKeyData:t}}}async validateKey(){let e;if(this.keys.ecdsaPrivateKey&&!this.keys.dhPrivateKey)e=await ja.ecdsa.sign(this.keys.ecdsaPrivateKey,i.a.decode(this.validationMessage));else if(this.keys.dhPrivateKey){const t=await ja.diffieHellman.getSharedKeyWithServer(this.keys.dhPrivateKey);e=await ja.aesGcm.decrypt(t,this.encryptedValidationMessage),delete this.keys.dhPrivateKey}const t={validationMessage:i.a.encode(e),ecKeyData:this.newEcKeyData};return(await this.request("ValidateKey",t)).data}async request(e,t){const s=Ds()();this.requests[s]={};const a=this.watch(s);this.ws.send(JSON.stringify({requestId:s,action:e,params:t}));try{return await a}catch(t){throw t.status===m?new hs.TooManyRequests(t.data.retryDelay):new er(e,t)}}async watch(e){const t=await new Promise((t,s)=>{this.requests[e].promiseResolve=t,this.requests[e].promiseReject=s,setTimeout(()=>{s(new Error("timeout"))},3e4)});return delete this.requests[e],t}async rebuildBundle(e,t,s){const a=[];for(let s=0;s<e.bundleChunks[t].length;s++){const r=e.bundleChunks[t][s],n=Ls(r);a.push(n)}const r=(e=>{const t=e.map(e=>e.byteLength),s=t.reduce((e,t)=>e+t),a=new Uint8Array(s);let r=0;for(let s=0;s<e.length;s++)a.set(new Uint8Array(e[s]),r),r+=t[s];return{buffer:a.buffer,byteLengths:t}})(a).buffer,{encrypted:n,plaintextMetadata:o}=JSON.parse(Fs(r)),c=await ja.aesGcm.decrypt(e.dbKey,i.a.decode(s)),u=await ja.aesGcm.getKeyFromRawKey(c),d=await ja.aesGcm.decrypt(u,Ls(n)),h=Fs(d),[l,f]=await Promise.all([za(h),za(o)]),m=Qa(Qa({},JSON.parse(l)),JSON.parse(f));return delete e.bundleChunks[t],m}async uploadBundle(e,t,s,a,r){let n=0,i=0,o=[];for(;n<r.byteLength;){const c=r.slice(n,n+524288);if(o.push(Za(e,t,s,a,i,c)),10===o.length){try{await Promise.all(o)}catch(e){return 0}o=[]}i+=1,n+=524288}try{await Promise.all(o)}catch(e){return 0}return i}async initBundleUpload(e,t,s){const a={dbId:e,seqNo:t};let r;try{r=await this.request("InitBundleUpload",a)}catch(e){return{}}const{bundleId:n}=r.data,[o,c]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(s);return{bundleId:n,bundleEncryptionKey:o,encryptedBundleEncryptionKey:i.a.encode(c)}}orderedItems(e,t){const s=[];for(let a=0;a<t.array.length;a++){const r=t.array[a].itemId;s.push(e[r])}return s}prepareBundle(e){const{items:t,itemsIndex:s,itemsPlaintextMetadata:a}=e;return{encrypted:JSON.stringify({items:this.orderedItems(t,s),itemsIndex:s.array}),plaintextMetadata:JSON.stringify({itemsPlaintextMetadata:this.orderedItems(a,s)})}}async buildBundle(e){const t=e.dbId,s=e.lastSeqNo,a=e.dbKey,r=this.session.userId;if(e.bundledAtSeqNo&&e.bundledAtSeqNo>=s)return;e.bundledAtSeqNo=s;const n=this.prepareBundle(e),i=e.attributionEnabled?[...e.usernamesByUserId.keys()].join(","):void 0,{bundleId:o,bundleEncryptionKey:c,encryptedBundleEncryptionKey:u}=await this.initBundleUpload(t,s,a);if(!o)return;const[d,h]=await Promise.all([Ya(n.encrypted),Ya(n.plaintextMetadata)]),l=Ls(d),f=await ja.aesGcm.encrypt(c,l);n.encrypted=Fs(f),n.plaintextMetadata=h;const m=Ls(JSON.stringify(n)),p=await this.uploadBundle(r,t,s,o,m);if(!p)return;const w={dbId:t,seqNo:s,bundleId:o,writers:i,numChunks:p,encryptedBundleEncryptionKey:u};try{await this.request("CompleteBundleUpload",w)}catch(e){return}}buildUserResult({username:e,userId:t,authToken:s,email:a,profile:r,protectedProfile:n,usedTempPassword:i,changePassword:o,passwordChanged:c,userData:u}){const d={username:e,userId:t,authToken:s};if(a&&(d.email=a),r&&(d.profile=r),n&&(d.protectedProfile=n),i&&(d.usedTempPassword=i),o&&(d.changePassword=o),c&&(d.passwordChanged=c),u){const{creationDate:e,stripeData:t}=u;if(e&&(d.creationDate=e),t){const{paymentsMode:e,subscriptionStatus:s,cancelSubscriptionAt:a,subscriptionPlanId:r,trialExpirationDate:n}=t;e&&(d.paymentsMode=e),s&&(d.subscriptionStatus=s),a&&(d.cancelSubscriptionAt=a),r&&(d.subscriptionPlanId=r),n&&(d.trialExpirationDate=n)}}return d}handleUpdateUser(e){if(this.session&&this.session.userId===e.userId){this.session.username=e.username,this.userData=e.userData;const t=gs();t&&t({user:this.buildUserResult(Qa({authToken:this.session.authToken},e))})}}async rotateKeys(e,t){const{keySalts:s,ecKeyData:a}=t,{ecdsaKeyData:r,ecdhKeyData:n}=a;s.ecdsaKeyEncryptionKeySalt=r.ecdsaKeyEncryptionKeySalt,s.ecdhKeyEncryptionKeySalt=n.ecdhKeyEncryptionKeySalt,this.keys.salts=s,this.ecKeyData=Qa(Qa({},r),n),await this.setKeys(e),this.keys.init=!0}async authenticateShareToken(e,t){const s={shareTokenId:e};let a;try{a=await this.request("AuthenticateShareToken",s)}catch(e){if(e.response&&"ShareTokenNotFound"===e.response.data)throw new hs.ShareTokenNotFound;throw e}const{databaseId:r,shareTokenAuthKeyData:n,validationMessage:o}=a.data;let c;try{const e=i.a.decode(n.shareTokenEcdsaKeyEncryptionKeySalt),s=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(t,e),a=i.a.decode(n.shareTokenEncryptedEcdsaPrivateKey),r=await ja.aesGcm.decrypt(s,a);c=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(r)}catch(e){throw new hs.ShareTokenInvalid}const u=await ja.ecdsa.sign(c,i.a.decode(o));return{databaseId:r,validationMessage:o,signedValidationMessage:i.a.encode(u)}}};function ar(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function rr(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?ar(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):ar(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const nr={local:!0,session:!0,none:!0},ir="Device not recognized. This temporary password can only be used to sign in from a device you've signed in from before.",or="Device not recognized. Forgot password only works from a device you've signed in from before.",cr=e=>{if(e.response){if("Domain not whitelisted"===e.response.data)throw new hs.DomainNotWhitelisted(window.location.origin);if("App ID not valid"===e.response.data)throw new hs.AppIdNotValid;if("UserNotFound"===e.response.data)throw new hs.UserNotFound;if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout},ur=async(e,t,s,a)=>{try{await sr.connect(e,t,s,a)}catch(e){if(cr(e),"Web Socket already connected"===e.message)throw new hs.UserAlreadySignedIn(e.username);throw e}},dr=e=>{if(e.response&&"UsernameTooLong"===e.response.data.error)throw new hs.UsernameTooLong(e.response.data.maxLen);if(e.response&&"PasswordAttemptLimitExceeded"===e.response.data.error)throw new hs.PasswordAttemptLimitExceeded(e.response.data.delay)},hr=e=>{if(e.response&&e.response.data){const t=e.response.data;switch(t.error){case"SessionLengthTooShort":throw new hs.SessionLengthTooShort(t.minLen);case"SessionLengthTooLong":throw new hs.SessionLengthTooLong(t.maxLen)}}},lr=(e,t)=>{if(cr(e),dr(e),e.response){const s=e.response.data;switch(s){case"UsernameAlreadyExists":throw new hs.UsernameAlreadyExists(t);case"TrialExceededLimit":throw new hs.TrialExceededLimit;case"CurrentPasswordIncorrect":throw new hs.CurrentPasswordIncorrect}switch(s.error){case"EmailNotValid":throw new hs.EmailNotValid;case"ProfileMustBeObject":throw new hs.ProfileMustBeObject;case"ProfileKeyTooLong":throw new hs.ProfileKeyTooLong(s.maxLen,s.key);case"ProfileValueMustBeString":throw new hs.ProfileValueMustBeString(s.key,s.value);case"ProfileValueCannotBeBlank":throw new hs.ProfileValueCannotBeBlank(s.key);case"ProfileValueTooLong":throw new hs.ProfileValueTooLong(s.maxLen,s.key,s.value);case"ProfileHasTooManyKeys":throw new hs.ProfileHasTooManyKeys(s.maxKeys);case"ProfileCannotBeEmpty":throw new hs.ProfileCannotBeEmpty}}throw e},fr=e=>e&&60*e*60*1e3,mr=e=>{if("string"!=typeof e)throw new hs.UsernameMustBeString;if(0===e.length)throw new hs.UsernameCannotBeBlank},pr=e=>{if("string"!=typeof e)throw new hs.PasswordMustBeString;if(0===e.length)throw new hs.PasswordCannotBeBlank;if(e.length<6)throw new hs.PasswordTooShort(6);if(e.length>1e3)throw new hs.PasswordTooLong(1e3)},wr=e=>{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"username"))throw new hs.UsernameMissing;if(!Ga(e,"password"))throw new hs.PasswordMissing;if(mr(e.username),pr(e.password),Ga(e,"rememberMe")&&!nr[e.rememberMe])throw new hs.RememberMeValueNotValid(nr);if(Ga(e,"sessionLength")&&"number"!=typeof e.sessionLength)throw new hs.SessionLengthMustBeNumber},gr=async(e,t,s)=>{const a=ja.scrypt.generateSalt(),r=await ja.scrypt.hash(e,a,s),n=await ja.hkdf.importHkdfKeyFromString(r),o=ja.hkdf.generateSalt(),c=await ja.hkdf.getPasswordToken(n,o),u=ja.hkdf.generateSalt(),d=await ja.aesGcm.getPasswordBasedEncryptionKey(n,u),h=await ja.aesGcm.encrypt(d,t);return{passwordToken:c,passwordSalts:{passwordSalt:i.a.encode(a),passwordTokenSalt:i.a.encode(o)},passwordBasedBackup:{passwordBasedEncryptionKeySalt:i.a.encode(u),passwordEncryptedSeed:i.a.encode(h)}}},yr=async e=>{const t=await ja.hkdf.importHkdfKey(e),s=ja.hkdf.generateSalt(),a=ja.hkdf.generateSalt(),r={encryptionKeySalt:i.a.encode(s),hmacKeySalt:i.a.encode(a)},n=await ja.ecdsa.generateEcdsaKeyData(t),o=await ja.ecdh.generateEcdhKeyData(t,n.ecdsaPrivateKey);delete n.ecdsaPrivateKey,delete o.ecdhPrivateKey;return{ecKeyData:{ecdsaKeyData:n,ecdhKeyData:o},keySalts:r}},br=e=>{if("object"!=typeof e)throw new hs.ProfileMustBeObject;let t=!1;for(const s in e){t=!0;const a=e[s];if("string"!=typeof a)throw new hs.ProfileValueMustBeString(s,a);if(!a)throw new hs.ProfileValueCannotBeBlank(s)}if(!t)throw new hs.ProfileCannotBeEmpty},vr=async()=>{try{const e="GetPasswordSalts";return(await sr.request(e)).data}catch(e){throw cr(e),e}},Mr=async(e,t,s)=>{const{passwordSalt:a,passwordTokenSalt:r}=t,n=await ja.scrypt.hash(e,new Uint8Array(i.a.decode(a)),s),o=await ja.hkdf.importHkdfKeyFromString(n);return{passwordHkdfKey:o,passwordToken:await ja.hkdf.getPasswordToken(o,i.a.decode(r))}},Sr=async(e,t)=>{let s;try{const a=_s.getCurrentSession();if(!a)return{};const{signedIn:r,sessionId:n,creationDate:i,expirationDate:o,rememberMe:c}=a;s=a.username;const u=_s.getSeedString(e,s);if(!r||!u||new Date>new Date(o))return{lastUsedUsername:s};let d;try{d=await Us(n,t)}catch(e){if(cr(e),hr(e),e.response&&"Session invalid"===e.response.data)return{lastUsedUsername:s};throw e}const{userId:h,authToken:l,username:f,email:m,profile:p,protectedProfile:w}=d;if(f!==s&&(_s.saveSeedString(c,e,f,u),_s.removeSeedString(e,s)),_s.signInSession(c,f,n,i,d.expirationDate),sr.connectionResolved){if(sr.session.sessionId===n)return{user:sr.buildUserResult({username:f,userId:h,authToken:sr.session.authToken,email:m,profile:p,protectedProfile:w,userData:sr.userData})};throw new hs.UserAlreadySignedIn(sr.session.username)}const g=rr(rr({},a),{},{username:f,userId:h,authToken:l});return await ur(g,u,c),{user:sr.buildUserResult({username:f,userId:h,authToken:l,email:m,profile:p,protectedProfile:w,userData:sr.userData})}}catch(e){if("Invalid seed"===e.message)return{lastUsedUsername:s};throw cr(e),e}},Ir=async(e,t)=>{const s=_s.getSeedString(e,t);if(!s)throw new hs.KeyNotFound(or);const a=i.a.decode(s);return await ja.hkdf.importHkdfKey(a)};var Pr={signUp:async e=>{try{(e=>{if(wr(e),e.profile&&br(e.profile),e.email&&"string"!=typeof e.email)throw new hs.EmailNotValid})(e);const{password:t,profile:s,passwordHashAlgo:a,rememberMe:r="session"}=e,n=e.username.toLowerCase(),o=e.email&&e.email.toLowerCase(),c=ws(),u=await ja.generateSeed(),d=fr(e.sessionLength),{sessionId:h,creationDate:l,expirationDate:f,userId:m,authToken:p}=await(async(e,t,s,a,r,n,i)=>{const{passwordToken:o,passwordSalts:c,passwordBasedBackup:u}=await gr(t,s,a),{ecKeyData:d,keySalts:h}=await yr(s);try{return await Es(e,o,d,c,h,r,n,u,i)}catch(t){hr(t),lr(t,e)}})(n,t,u,a,o,s,d),w={username:n,userId:m,sessionId:h,creationDate:l,expirationDate:f,authToken:p},g=i.a.encode(u);return _s.saveSeedString(r,c,n,g),_s.signInSession(r,n,h,l,f),await ur(w,g,r),sr.buildUserResult({username:n,userId:m,authToken:p,email:o,profile:s,userData:sr.userData})}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameAlreadyExists":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"UsernameTooLong":case"PasswordMissing":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"PasswordMustBeString":case"EmailNotValid":case"ProfileMustBeObject":case"ProfileCannotBeEmpty":case"ProfileHasTooManyKeys":case"ProfileKeyTooLong":case"ProfileValueMustBeString":case"ProfileValueCannotBeBlank":case"ProfileValueTooLong":case"RememberMeValueNotValid":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"TrialExceededLimit":case"AppIdNotSet":case"AppIdNotValid":case"DomainNotWhitelisted":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},signOut:async()=>{try{if(!sr.session.username)throw new hs.UserNotSignedIn;try{await sr.signOut()}catch(e){throw cr(e),e}}catch(e){switch(e.name){case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},signIn:async e=>{try{wr(e);const t=e.username.toLowerCase(),{password:s,passwordHashAlgo:a,rememberMe:r="session"}=e,n=ws(),o=await(async e=>{try{return await Bs(e)}catch(e){if(cr(e),dr(e),e.response&&"User not found"===e.response.data)throw new hs.UsernameOrPasswordMismatch;throw e}})(t),{passwordHkdfKey:c,passwordToken:u}=await Mr(s,o,a),d=fr(e.sessionLength),h=await(async(e,t,s)=>{try{return await Ns(e,t,s)}catch(e){if(cr(e),dr(e),hr(e),e.response&&"Invalid password"===e.response.data)throw new hs.UsernameOrPasswordMismatch;if(e.response&&"User pending deletion"===e.response.data)throw new hs.UserPendingDeletion;throw e}})(t,u,d),{userId:l,email:f,profile:m,passwordBasedBackup:p,protectedProfile:w,usedTempPassword:g,changePassword:y}=h,b=rr(rr({},h.session),{},{username:t,userId:l});let v;if(!y){const e=_s.getSeedString(n,t);let s;if(!e&&g)throw new hs.KeyNotFound(ir);g||(s=await(async(e,t)=>{const{passwordBasedEncryptionKeySalt:s,passwordEncryptedSeed:a}=t,r=await ja.aesGcm.getPasswordBasedEncryptionKey(e,i.a.decode(s)),n=await ja.aesGcm.decrypt(r,i.a.decode(a));return i.a.encode(n)})(c,p),_s.saveSeedString(r,n,t,s)),v=s||e}_s.signInSession(r,t,b.sessionId,b.creationDate,b.expirationDate);try{await ur(b,v,r,y)}catch(e){if(g&&"Invalid seed"===e.message)throw new hs.KeyNotFound(ir);throw e}return sr.buildUserResult({username:t,userId:l,authToken:b.authToken,email:f,profile:m,protectedProfile:w,usedTempPassword:g,changePassword:y,userData:sr.userData})}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameOrPasswordMismatch":case"UserPendingDeletion":case"UsernameCannotBeBlank":case"UsernameTooLong":case"UsernameMustBeString":case"PasswordMissing":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"PasswordMustBeString":case"PasswordAttemptLimitExceeded":case"RememberMeValueNotValid":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"KeyNotFound":case"AppIdNotSet":case"AppIdNotValid":case"DomainNotWhitelisted":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},init:async e=>{try{if(!window.crypto.subtle)throw new hs.WebCryptoUnavailable;if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"appId"))throw new hs.AppIdMissing;if("string"!=typeof e.appId)throw new hs.AppIdMustBeString;if(0===e.appId.length)throw new hs.AppIdCannotBeBlank;if(Ga(e,"updateUserHandler")&&"function"!=typeof e.updateUserHandler)throw new hs.UpdateUserHandlerMustBeFunction;if(Ga(e,"sessionLength")&&"number"!=typeof e.sessionLength)throw new hs.SessionLengthMustBeNumber;if(Ga(e,"allowServerSideEncryption")&&"boolean"!=typeof e.allowServerSideEncryption)throw new hs.AllowServerSideEncryptionMustBeBoolean;bs(e);return await Sr(e.appId,fr(e.sessionLength))}catch(e){switch(e.name){case"WebCryptoUnavailable":case"ParamsMustBeObject":case"AppIdMissing":case"AppIdAlreadySet":case"AppIdMustBeString":case"AppIdCannotBeBlank":case"AppIdNotValid":case"DomainNotWhitelisted":case"UpdateUserHandlerMustBeFunction":case"SessionLengthMustBeNumber":case"SessionLengthTooShort":case"SessionLengthTooLong":case"AllowServerSideEncryptionMustBeBoolean":case"UserAlreadySignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},updateUser:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if((e=>{if(!(Ga(e,"username")||Ga(e,"newPassword")||Ga(e,"email")||Ga(e,"profile")))throw new hs.ParamsMissing;const{username:t,currentPassword:s,newPassword:a,email:r,profile:n}=e;if(Ga(e,"username")&&mr(t),Ga(e,"newPassword")){if(!Ga(e,"currentPassword"))throw new hs.CurrentPasswordMissing;pr(s),pr(a)}if(r&&"string"!=typeof r)throw new hs.EmailNotValid;n&&br(n)})(e),sr.reconnecting)throw new hs.Reconnecting;if(!sr.connectionResolved)throw new hs.UserNotSignedIn;const t=sr.session.userId,s=e.newPassword&&!sr.keys.init&&sr.changePassword&&await ja.generateSeed(),a="UpdateUser",r=await(async(e,t)=>{if(e.username&&(e.username=e.username.toLowerCase()),e.newPassword){const[s,a,r]=await Promise.all([vr(),gr(e.newPassword,t||i.a.decode(sr.seedString)),t&&yr(t)]),{passwordToken:n}=await Mr(e.currentPassword,s,e.passwordHashAlgo);e.currentPasswordToken=n,delete e.currentPassword,e.passwordToken=a.passwordToken,e.passwordSalts=a.passwordSalts,e.passwordBasedBackup=a.passwordBasedBackup,delete e.newPassword,r&&(e.newKeyData=r)}return e.email?e.email=e.email.toLowerCase():Ga(e,"email")&&(e.email=!1),!e.profile&&Ga(e,"profile")&&(e.profile=!1),e})(rr({},e),s);if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.connectionResolved)throw new hs.UserNotSignedIn;if(!sr.session||t!==sr.session.userId)throw new hs.ServiceUnavailable;try{r.username&&_s.saveSeedString(sr.rememberMe,ws(),r.username,sr.seedString);const e=(await sr.request(a,r)).data.updatedUser;if(sr.handleUpdateUser(e),s&&sr.session&&t===sr.session.userId){const t=i.a.encode(s);await sr.rotateKeys(t,r.newKeyData),_s.saveSeedString(sr.rememberMe,ws(),e.username,t);const{sessionId:a,creationDate:n,expirationDate:o}=sr.session;_s.signInSession(sr.rememberMe,e.username,a,n,o)}}catch(e){lr(e,r.username)}}catch(e){switch(e.name){case"ParamsMustBeObject":case"ParamsMissing":case"UsernameAlreadyExists":case"UsernameMustBeString":case"UsernameCannotBeBlank":case"UsernameTooLong":case"CurrentPasswordMissing":case"CurrentPasswordIncorrect":case"PasswordAttemptLimitExceeded":case"PasswordMustBeString":case"PasswordCannotBeBlank":case"PasswordTooShort":case"PasswordTooLong":case"EmailNotValid":case"ProfileMustBeObject":case"ProfileCannotBeEmpty":case"ProfileHasTooManyKeys":case"ProfileKeyTooLong":case"ProfileValueMustBeString":case"ProfileValueCannotBeBlank":case"ProfileValueTooLong":case"AppIdNotSet":case"AppIdNotValid":case"UserNotFound":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},deleteUser:async()=>{try{(()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init)throw new hs.UserNotSignedIn})();const e=sr.session.username;_s.removeSeedString(ws(),e),_s.removeCurrentSession();try{const e="DeleteUser";await sr.request(e)}catch(e){throw cr(e),e}sr.close()}catch(e){switch(e.name){case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},forgotPassword:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Ga(e,"deleteEndToEndEncryptedData")&&"boolean"!=typeof e.deleteEndToEndEncryptedData)throw new hs.DeleteEndToEndEncryptedDataMustBeBoolean;if(!Ga(e,"username"))throw new hs.UsernameMissing;mr(e.username);const t=e.username.toLowerCase(),s=ws(),a="".concat(Va(ys()),"/api/auth/forgot-password?appId=").concat(s,"&username=").concat(encodeURIComponent(t),"&userbaseJsVersion=").concat(ps),r=new WebSocket(a+(Ga(e,"deleteEndToEndEncryptedData")?"&deleteEndToEndEncryptedData=".concat(e.deleteEndToEndEncryptedData):""));await new Promise((e,a)=>{setTimeout(()=>a(new hs.Timeout),15e3),r.onerror=()=>a(new hs.ServiceUnavailable),r.onmessage=async n=>{try{const o=JSON.parse(n.data);switch(o.route){case"ReceiveEncryptedToken":{const e=await Ir(s,t),a=new Uint8Array(o.encryptedForgotPasswordToken.data),n=await ja.diffieHellman.importKeyFromMaster(e,i.a.decode(o.dhKeySalt)),c=await ja.diffieHellman.getSharedKeyWithServer(n);let u;try{u=i.a.encode(await ja.aesGcm.decrypt(c,a))}catch(e){throw new hs.KeyNotFound(or)}r.send(JSON.stringify({action:"ForgotPassword",params:{forgotPasswordToken:u}}));break}case"ReceiveToken":{const e=await Ir(s,t),{ecdsaKeyEncryptionKeySalt:a,encryptedEcdsaPrivateKey:n,forgotPasswordToken:c}=o,u=await ja.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(e,i.a.decode(a));let d;try{const e=await ja.aesGcm.decrypt(u,i.a.decode(n));d=await ja.ecdsa.getPrivateKeyFromRawPrivateKey(e)}catch(e){throw new hs.KeyNotFound(or)}const h=i.a.encode(await ja.ecdsa.sign(d,i.a.decode(c)));r.send(JSON.stringify({action:"ForgotPassword",params:{signedForgotPasswordToken:h}}));break}case"SuccessfullyForgotPassword":e();break;case"Error":{const e=o.data;switch(e.name){case"UsernameTooLong":throw new hs.UsernameTooLong(e.maxLen);case"AppIdNotValid":throw new hs.AppIdNotValid;case"UserNotFound":throw new hs.UserNotFound;case"UserEmailNotFound":throw new hs.UserEmailNotFound;default:throw o.status===p?new hs.ServiceUnavailable:new hs.UnknownServiceUnavailable(e)}}case"Ping":break;default:a(new Error("Received unknown message from userbase-server: ".concat(n.data)))}}catch(n){a(n)}}}),r.close()}catch(e){switch(e.name){case"ParamsMustBeObject":case"UsernameMissing":case"UsernameMustBeString":case"UsernameCannotBeBlank":case"UsernameTooLong":case"AppIdNotSet":case"AppIdNotValid":case"KeyNotFound":case"UserNotFound":case"UserEmailNotFound":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}},Er=s(12),Br=s.n(Er);function Nr(e,t){var s=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),s.push.apply(s,a)}return s}function Ur(e){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{};t%2?Nr(Object(s),!0).forEach((function(t){r()(e,t,s[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(s)):Nr(Object(s)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(s,t))}))}return e}const Ar={"end-to-end":!0,"server-side":!0},Tr=()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init||!Ar[sr.encryptionMode])throw new hs.UserNotSignedIn},kr=e=>{if(e.response){if("UserNotFound"===e.response.data)throw new hs.UserNotFound;if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout};class Dr{constructor(e){this.startSeqNo=e,this.txSeqNo=null,this.transactions={},this.promiseResolve=null,this.promiseReject=null,this.index=null}getStartSeqNo(){return this.startSeqNo}getIndex(){return this.index}setIndex(e){this.index=e}async getResult(e){this.txSeqNo=e;const t=new Promise((e,t)=>{this.promiseResolve=e,this.promiseReject=t,setTimeout(()=>{t(new Error("timeout"))},3e4)});return this.verifyPromise(),t}verifyPromise(){(this.txSeqNo||0==this.txSeqNo)&&this.promiseResolve&&this.promiseReject&&this.transactions[this.txSeqNo]&&("Success"==this.transactions[this.txSeqNo]?this.promiseResolve():this.promiseReject(this.transactions[this.txSeqNo]))}addTransaction(e,t){this.transactions[e.seqNo]||(this.transactions[e.seqNo]=t,this.verifyPromise())}}class Kr{constructor(e,t,s,a){this.onChange=xr(e),this.items={},this.itemsPlaintextMetadata={},this.fileIds={};this.itemsIndex=new Br.a([],(e,t)=>e.seqNo<t.seqNo||e.seqNo===t.seqNo&&e.operationIndex<t.operationIndex?-1:e.seqNo>t.seqNo||e.seqNo===t.seqNo&&e.operationIndex>t.operationIndex?1:0),this.unverifiedTransactions=[],this.lastSeqNo=0,this.init=!1,this.dbKey=null,this.receivedMessage=t,this.usernamesByUserId=new Map,this.attributionEnabled=!1,this.shareTokenId=s,this.shareTokenHkdfKey=a,this.applyTransactionsQueue=new Ja,this.bundleChunks={}}async applyTransactions(e,t,s,a){for(let s=0;s<e.length;s++){const a=e[s],r=a.seqNo;if(r!==this.lastSeqNo+1){console.warn("Client attempted to apply transaction with seq no ".concat(r," when last seq no is ").concat(this.lastSeqNo));continue}const n=await this.applyTransaction(this.dbKey,a,t);this.lastSeqNo=r;for(let t=0;t<this.unverifiedTransactions.length;t++)!this.unverifiedTransactions[t]||r<this.unverifiedTransactions[t].getStartSeqNo()||this.unverifiedTransactions[t].addTransaction(e[s],n);this.init&&"Success"===n&&this.onChange(this.getItems())}this.init||(this.init=!0,this.dbId=s,this.dbNameHash=a,this.onChange(this.getItems()),this.receivedMessage())}async applyBundle(e,t){if(0===this.lastSeqNo){for(let t=0;t<e.itemsIndex.length;t++){const s=e.itemsIndex[t],a=e.itemsIndex[t].itemId,r=e.items[t],n=e.itemsPlaintextMetadata[t];r.file&&r.file.fileEncryptionKeyString&&(r.file.fileEncryptionKey=await ja.aesGcm.getKeyFromKeyString(r.file.fileEncryptionKeyString),this.fileIds[r.file.fileId]=a),this.items[a]=r,this.itemsPlaintextMetadata[a]=n,this.itemsIndex.insert(s)}this.lastSeqNo=t}else console.warn("Client attempted to apply bundle when last seq no is ".concat(this.lastSeqNo))}async applyTransaction(e,t,s){const a=t.seqNo,r=t.command;switch(r){case"Insert":try{const s=await ja.aesGcm.decryptJson(e,t.record),r=s.id,n=s.item,i=this.attributionFromTransaction(t),o=t.writeAccess;return this.validateInsert(r),this.applyInsert(r,a,n,i,o)}catch(e){return e}case"Update":try{const a=await ja.aesGcm.decryptJson(e,t.record),r=a.id,n=a.item,i=this.attributionFromTransaction(t),o=a.__v,c=t.writeAccess;return this.validateUpdate(r,o,i,s,c,"updateItem"),this.applyUpdate(r,n,o,i,c)}catch(e){return e}case"Delete":try{const a=await ja.aesGcm.decryptJson(e,t.record),r=a.id,n=this.attributionFromTransaction(t),i=a.__v;return this.validateUpdateOrDelete(r,i,n,s,"deleteItem"),this.applyDelete(r)}catch(e){return e}case"BatchTransaction":try{const r=t.operations,n=this.attributionFromTransaction(t),i=[];for(const t of r)i.push(t.record&&ja.aesGcm.decryptJson(e,t.record));const o=await Promise.all(i);return this.validateBatchTransaction(r,o,n,s),this.applyBatchTransaction(a,r,o,n)}catch(e){return e}case"UploadFile":try{const a=await ja.aesGcm.decrypt(e,i.a.decode(t.fileEncryptionKey)),r=await ja.aesGcm.getKeyFromRawKey(a),n=await ja.aesGcm.getKeyStringFromKey(r),o=await ja.aesGcm.decryptJson(r,t.fileMetadata),c=o.itemId,u=o.__v,{fileName:d,fileSize:h,fileType:l}=o,f=t.fileId,m=this.attributionFromTransaction(t);return this.validateUploadFile(c,u,m,s,"uploadFile"),this.applyUploadFile(c,m,u,r,n,d,f,h,l)}catch(e){return e}case"Rollback":return;default:return void console.warn("Unknown command: ".concat(r))}}attributionFromTransaction(e){if(this.attributionEnabled)return{timestamp:e.timestamp,userId:e.userId}}validateInsert(e){if(this.items[e])throw new hs.ItemAlreadyExists}validateUpdate(e,t,s,a,r,n){this.validateUpdateOrDelete(e,t,s,a,n);const{createdBy:i}=this.itemsPlaintextMetadata[e];if(r||!1===r){if(!i)return;const e=i.userId,t=s.userId;if(e!==t&&t!==a)throw new hs.WriteAccessParamNotAllowed}}validateUpdateOrDelete(e,t,s,a,r){if(!this.items[e])throw new hs.ItemDoesNotExist;if(t<=this.getItemVersionNumber(e))throw new hs.ItemUpdateConflict;this.validateAccessPermissions(e,s,a,r)}validateUploadFile(e,t,s,a,r){if(!this.items[e])throw new hs.ItemDoesNotExist;if(t<=this.getFileVersionNumber(e))throw new hs.FileUploadConflict;this.validateAccessPermissions(e,s,a,r)}validateAccessPermissions(e,t,s,a){const{createdBy:r,writeAccess:n}=this.itemsPlaintextMetadata[e];if(r&&t&&n){const e=r.userId,i=t.userId;let o=!1;const{onlyCreator:c,users:u}=n;if(i===s||i===e)o=!0;else if(!c&&u)for(const{userId:e}of u)if(o=i===e,o)break;if(!o)throw new hs.TransactionUnauthorized(a)}}itemExists(e){return Ga(this.items,e)}applyInsert(e,t,s,a,r,n){const i={seqNo:t};if("number"==typeof n&&(i.operationIndex=n),this.items[e]=Ur(Ur({},i),{},{record:s,__v:0}),this.itemsPlaintextMetadata[e]={createdBy:a,writeAccess:r},this.itemsIndex.insert(Ur(Ur({},i),{},{itemId:e})),r&&r.users)for(const{userId:e,username:t}of r.users)this.usernamesByUserId.set(e,t);return"Success"}applyUpdate(e,t,s,a,r){if(this.items[e].record=t,this.items[e].__v=s,this.itemsPlaintextMetadata[e].updatedBy=a,!1===r)delete this.itemsPlaintextMetadata[e].writeAccess;else if(r&&(this.itemsPlaintextMetadata[e].writeAccess=r,r.users))for(const{userId:e,username:t}of r.users)this.usernamesByUserId.set(e,t);return"Success"}applyUploadFile(e,t,s,a,r,n,i,o,c){const u=this.items[e].file;return u&&delete this.fileIds[u.fileId],this.items[e].file={fileName:n,fileId:i,fileSize:o,fileType:c,fileEncryptionKey:a,fileEncryptionKeyString:r,__v:s},this.itemsPlaintextMetadata[e].fileUploadedBy=t,this.fileIds[i]=e,"Success"}applyDelete(e){return this.itemsIndex.remove(this.items[e]),delete this.items[e],delete this.itemsPlaintextMetadata[e],"Success"}validateBatchTransaction(e,t,s,a){const r={};for(let n=0;n<e.length;n++){const i=e[n],{command:o,writeAccess:c}=i,u=t[n].id,d=t[n].__v;if(r[u])throw new hs.OperationsConflict;switch(r[u]=!0,o){case"Insert":this.validateInsert(u);break;case"Update":this.validateUpdate(u,d,s,a,c,o);break;case"Delete":this.validateUpdateOrDelete(u,d,s,a,o)}}}applyBatchTransaction(e,t,s,a){for(let r=0;r<t.length;r++){const n=t[r],i=s[r].id,o=s[r].item,c=s[r].__v,u=n.writeAccess;switch(n.command){case"Insert":this.applyInsert(i,e,o,a,u,r);break;case"Update":this.applyUpdate(i,o,c,a,u);break;case"Delete":this.applyDelete(i,c)}}return"Success"}registerUnverifiedTransaction(){const e=new Dr(this.lastSeqNo),t=this.unverifiedTransactions.push(e);return e.setIndex(t-1),e}unregisterUnverifiedTransaction(e){delete this.unverifiedTransactions[e.getIndex()]}getItems(){const e=[];for(let t=0;t<this.itemsIndex.array.length;t++){const s=this.itemsIndex.array[t].itemId,a={itemId:s,item:this.items[s].record};if(this.items[s].file){const{fileId:e,fileName:t,fileSize:r}=this.items[s].file;a.fileId=e,a.fileName=t,a.fileSize=r}for(const e of["createdBy","updatedBy","fileUploadedBy"])if(this.itemsPlaintextMetadata[s][e]){const{timestamp:t,userId:r}=this.itemsPlaintextMetadata[s][e],n={timestamp:t},i=this.usernamesByUserId.get(r);null==i?n.userDeleted=!0:n.username=i,a[e]=n}if(this.itemsPlaintextMetadata[s].writeAccess){const{onlyCreator:e,users:t}=this.itemsPlaintextMetadata[s].writeAccess,r={};if(e&&(r.onlyCreator=e),t){r.users=[];for(const{userId:e}of t){const t=this.usernamesByUserId.get(e);t&&r.users.push({username:t})}}a.writeAccess=r}e.push(a)}return e}getItemVersionNumber(e){return this.items[e].__v}getFileVersionNumber(e){return this.items[e].file&&this.items[e].file.__v}async decryptShareTokenEncryptedDbKey(e,t){const s=await ja.aesGcm.importKeyFromMaster(this.shareTokenHkdfKey,i.a.decode(t));return await ja.aesGcm.decryptString(s,e)}}const xr=e=>t=>{try{e(t)}catch(e){console.error("There was an error in your changeHandler.\n\n",e)}},Rr=(e,t,s)=>{e.onChange=xr(t);const a=e.receivedMessage;return e.receivedMessage=()=>{a(),s()},!!e.init&&(e.onChange(e.getItems()),e.receivedMessage(),!0)},Or=e=>{const t=e.slice(0,36),s=Fs(t,!0);if(!s||36!==s.length)throw new hs.ShareTokenInvalid;return s},Cr=async(e,t,s)=>{let a,r;try{a=(e=>{const t=i.a.decode(e);return{shareTokenId:Or(t),shareTokenSeed:t.slice(36)}})(e),r=await ja.hkdf.importHkdfKey(a.shareTokenSeed)}catch(e){throw new hs.ShareTokenInvalid}const{shareTokenId:n}=a,{databaseId:o,validationMessage:c,signedValidationMessage:u}=await sr.authenticateShareToken(n,r);sr.state.shareTokenIdToDbId[n]=o,await _r(o,t,s,n,r,c,u)},_r=async(e,t,s,a,r,n,i)=>{const o=sr.state.databasesByDbId[e];if(o){if(Rr(o,t,s))return}else sr.state.databasesByDbId[e]=new Kr(t,s,a,r);const c={databaseId:e,validationMessage:n,signedValidationMessage:i};await sr.request("OpenDatabaseByDatabaseId",c)},Fr=async(e,t)=>{try{let s,a;const r=new Promise((e,t)=>{s=e,a=setTimeout(()=>t(new Error("timeout")),3e4)}),{dbNameHash:n,newDatabaseParams:i,databaseId:o,shareToken:c}=t;try{n?await(async(e,t,s,a)=>{const r=sr.state.databases[e];if(r){if(Rr(r,s,a))return}else sr.state.databases[e]=new Kr(s,a);const n={dbNameHash:e,newDatabaseParams:t};await sr.request("OpenDatabase",n)})(n,i,e,s):o?await _r(o,e,s):c&&await Cr(c,e,s),await r}catch(e){if(clearTimeout(a),e.response&&e.response.data){const t=e.response.data;if("Database already creating"===t)throw new hs.DatabaseAlreadyOpening;if("Database is owned by user"===t){if(o)throw new hs.DatabaseIdNotAllowedForOwnDatabase;if(c)throw new hs.ShareTokenNotAllowedForOwnDatabase}else if("Database key not found"===t||"Database not found"===t)throw new hs.DatabaseNotFound;switch(t.name){case"SubscriptionNotFound":throw new hs.SubscriptionNotFound;case"SubscriptionInactive":throw new hs.SubscriptionInactive(t.subscriptionStatus);case"TrialExpired":throw new hs.TrialExpired}}throw e}}catch(e){throw kr(e),e}},Lr=e=>{if("server-side"===e&&!Ms())throw new hs.ServerSideEncryptionNotEnabledInClient},jr=e=>{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Ga(e,"databaseName")){if((e=>{if("string"!=typeof e)throw new hs.DatabaseNameMustBeString;if(0===e.length)throw new hs.DatabaseNameCannotBeBlank;if(e.length>100)throw new hs.DatabaseNameTooLong(100)})(e.databaseName),Ga(e,"databaseId"))throw new hs.DatabaseIdNotAllowed;if(Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;if(!e.allowVerifiedUsersDatabase&&"__userbase_verified_users"===e.databaseName)throw new hs.DatabaseNameRestricted("__userbase_verified_users")}else if(Ga(e,"databaseId")){if((e=>{if("string"!=typeof e)throw new hs.DatabaseIdMustBeString;if(0===e.length)throw new hs.DatabaseIdCannotBeBlank;if(36!==e.length)throw new hs.DatabaseIdInvalidLength(36)})(e.databaseId),Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed}else{if(!Ga(e,"shareToken"))throw new hs.DatabaseNameMissing;if("string"!=typeof e.shareToken)throw new hs.ShareTokenInvalid}if(Ga(e,"encryptionMode")&&!Ar[e.encryptionMode])throw new hs.EncryptionModeNotValid(Ar);Tr()},qr=async e=>{try{if(jr(e),!Ga(e,"changeHandler"))throw new hs.ChangeHandlerMissing;const{databaseName:t,databaseId:s,shareToken:a,changeHandler:r,encryptionMode:n=sr.encryptionMode}=e;if("function"!=typeof r)throw new hs.ChangeHandlerMustBeFunction;if(Lr(n),t){const e="server-side"===n?t:sr.state.dbNameToHash[t]||await ja.hmac.signString(sr.keys.hmacKey,t);"end-to-end"===n&&(sr.state.dbNameToHash[t]=e);const s={dbNameHash:e,newDatabaseParams:await(async(e,t)=>{const s=Ds()(),a=await ja.aesGcm.generateKey(),r=await ja.aesGcm.getKeyStringFromKey(a),[n,i]=await Promise.all([ja.aesGcm.encryptString(sr.keys.encryptionKey,r),ja.aesGcm.encryptString(a,e)]),o={dbId:s,encryptedDbKey:n,encryptedDbName:i,attribution:!0};return"server-side"===t&&(o.plaintextDbKey=r),o.fingerprint=await ln(),o})(t,n)};await Fr(r,s)}else if(s){const e={databaseId:s};await Fr(r,e)}else{const e={shareToken:a};await Fr(r,e)}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseAlreadyOpening":case"DatabaseNameMustBeString":case"DatabaseNameMissing":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"DatabaseIdNotAllowedForOwnDatabase":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"ShareTokenNotFound":case"ShareTokenNotAllowedForOwnDatabase":case"DatabaseNotFound":case"ChangeHandlerMissing":case"ChangeHandlerMustBeFunction":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"SubscriptionNotFound":case"SubscriptionInactive":case"TrialExpired":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Vr=(e,t,s,a="end-to-end")=>{Lr(a);const r=s&&Or(i.a.decode(s)),n="server-side"===a?e:sr.state.dbNameToHash[e],o=e?sr.state.databases[n]:sr.state.databasesByDbId[t||sr.state.shareTokenIdToDbId[r]];if(!o||!o.init)throw new hs.DatabaseNotOpen;return o},Hr=async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Insert",a=await Gr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemAlreadyExists":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Gr=async(e,t)=>{if(!Ga(t,"item"))throw new hs.ItemMissing;const{item:s,itemId:a,writeAccess:r}=t;if(Ga(t,"itemId")){if("string"!=typeof a)throw new hs.ItemIdMustBeString;if(0===a.length)throw new hs.ItemIdCannotBeBlank;if(a.length>100)throw new hs.ItemIdTooLong(100)}const n=JSON.stringify(s);if(!n)throw new hs.ItemInvalid;if(Ha(n)>10240)throw new hs.ItemTooLarge(10);const i=a||Ds()(),o={id:i,item:s};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,i),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,o),writeAccess:r}},Jr=async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Update",a=await Wr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemDoesNotExist":case"ItemUpdateConflict":case"WriteAccessParamNotAllowed":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},Wr=async(e,t)=>{if(!Ga(t,"item"))throw new hs.ItemMissing;if(!Ga(t,"itemId"))throw new hs.ItemIdMissing;!t.writeAccess&&Ga(t,"writeAccess")&&(t.writeAccess=!1);const{item:s,itemId:a,writeAccess:r}=t;if("string"!=typeof a)throw new hs.ItemIdMustBeString;if(0===a.length)throw new hs.ItemIdCannotBeBlank;if(a.length>100)throw new hs.ItemIdTooLong(100);if(!e.itemExists(a))throw new hs.ItemDoesNotExist;const n=JSON.stringify(s);if(!n)throw new hs.ItemInvalid;if(Ha(n)>10240)throw new hs.ItemTooLarge(10);const i={id:a,item:s,__v:e.getItemVersionNumber(a)+1};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,a),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,i),writeAccess:r}},Yr=async(e,t)=>{if(!Ga(t,"itemId"))throw new hs.ItemIdMissing;const{itemId:s}=t;if("string"!=typeof s)throw new hs.ItemIdMustBeString;if(0===s.length)throw new hs.ItemIdCannotBeBlank;if(s.length>100)throw new hs.ItemIdTooLong(100);if(!e.itemExists(s))throw new hs.ItemDoesNotExist;const a={id:s,__v:e.getItemVersionNumber(s)+1};return{itemKey:await ja.hmac.signString(sr.keys.hmacKey,s),encryptedItem:await ja.aesGcm.encryptJson(e.dbKey,a)}},zr=async(e,t,s)=>{try{const a=e.registerUnverifiedTransaction(),r=Ur(Ur({},s),{},{dbId:e.dbId,dbNameHash:e.dbNameHash}),n=(await sr.request(t,r)).data.sequenceNo;return await a.getResult(n),e.unregisterUnverifiedTransaction(a),n}catch(e){if(kr(e),e.response){if("DatabaseIsReadOnly"===e.response.data.name)throw new hs.DatabaseIsReadOnly;if("UserNotFound"===e.response.data.message)throw new hs.UserNotFound(e.response.data.username)}throw e}},Zr=async(e,t,s,a,r,n,i,o)=>{const c=await(async e=>{const t=new FileReader;return new Promise((s,a)=>{t.onload=e=>{e.target.error?a(e.target.error):s(e.target.result)},t.readAsArrayBuffer(e)})})(t),[u,d]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(r),h=await ja.aesGcm.encrypt(u,c),l={dbId:s,chunkNumber:n,fileId:a,chunk:Fs(new Uint8Array(h)),chunkEncryptionKey:Fs(new Uint8Array(d))},f=(async(e,t,s,a)=>{await e,t.bytesTransferred+=a,s&&s(Ur({},t))})(sr.request("UploadFileChunk",l),i,o,t.size);e.push(f),10===e.length&&(await Promise.all(e),e.length=0)},Xr=async(e,t,s,a)=>{try{const r="GetChunk",n={dbId:e,fileId:t,chunkNumber:s},i=(await sr.request(r,n)).data,o=new Uint8Array(new Uint16Array(Ls(i.chunk))).buffer,c=new Uint8Array(new Uint16Array(Ls(i.chunkEncryptionKey))).buffer,u=await ja.aesGcm.decrypt(a,c),d=await ja.aesGcm.getKeyFromRawKey(u);return await ja.aesGcm.decrypt(d,o)}catch(e){throw kr(e),e}},Qr=async(e,t,s)=>{const{username:a,senderUsername:r,verificationValues:n}=s,{sentSignature:o,receivedSignature:c,senderEcdsaPublicKey:u}=n,d=t[a]&&t[a].record.fingerprint,h=i.a.decode(u),l=t[r]&&t[r].record.fingerprint||await hn(h),f=await ja.ecdsa.getPublicKeyFromRawPublicKey(h),m=await rn(e,d),p=await ja.ecdsa.verifyString(f,o,m),w=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(n.recipientEcdsaPublicKey)),g=await rn(e,l),y=await ja.ecdsa.verifyString(w,c,g);return p&&y},$r=async(e,t,s,a,r)=>{const{mySentSignature:n,myReceivedSignature:o}=r,c=await rn(e,t),u=await ja.ecdsa.verifyString(a,o,c);if(!u)return u;const d=await rn(e,s),h=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(r.mySenderEcdsaPublicKey));return await ja.ecdsa.verifyString(h,n,d)&&u},en=async(e,t,s,a,r)=>{const{sentSignature:n,receivedSignature:o}=r,c=await rn(e,t),u=await ja.ecdsa.verifyString(a,n,c);if(!u)return u;const d=await rn(e,s),h=await ja.ecdsa.getPublicKeyFromRawPublicKey(i.a.decode(r.recipientEcdsaPublicKey)),l=await ja.ecdsa.verifyString(h,o,d);return u&&l},tn=async(e,t,s,a,r)=>{const n=await ja.ecdsa.getPublicKeyFromPrivateKey(sr.keys.ecdsaPrivateKey),i=await ln();for(let o=0;o<t.length;o++){const c=t[o],{username:u,isOwner:d,senderUsername:h,verificationValues:l}=c;try{const a=s[u]&&s[u].record.fingerprint,f=l.isChild,m=r===u;if(a)if(f)t[o].verified=await en(e,a,i,n,l);else if(m){const r=await $r(e,a,i,n,l);if(r&&h){const a=await Qr(e,s,c);t[o].verified=a}else t[o].verified=r}else if(d)t[o].verified=d;else{const a=await Qr(e,s,c);t[o].verified=a}}catch(e){}delete t[o].senderUsername,d||(l&&l.isChild?t[o].receivedFromUsername=a:h&&(t[o].receivedFromUsername=h)),delete t[o].verificationValues}return t},sn=async(e,t,s,a,r)=>{const{databaseId:n,databaseNameHash:o,isOwner:c,readOnly:u,resharingAllowed:d,senderUsername:h}=e;let l,f;if(e.encryptedDbKey||e.plaintextDbKey){const s=e.plaintextDbKey||await ja.aesGcm.decryptString(t,e.encryptedDbKey);if(l=await ja.aesGcm.getKeyFromKeyString(s),f=await ja.aesGcm.decryptString(l,e.databaseName),c&&"__userbase_verified_users"===f)return null}else{if(e.wrappedDbKey)return null;{let a;try{const{ephemeralPublicKey:t,signedEphemeralPublicKey:r,sharedEncryptedDbKey:n}=e;a=i.a.decode(e.senderEcdsaPublicKey);const o=await ja.ecdsa.getPublicKeyFromRawPublicKey(a);if(!await ja.ecdsa.verify(o,i.a.decode(r),i.a.decode(t)))throw new hs.ServiceUnavailable;const c=await ja.ecdh.getPublicKeyFromRawPublicKey(i.a.decode(t)),u=await ja.ecdh.computeSharedKeyEncryptionKey(c,s),d=await ja.aesGcm.decryptString(u,n);l=await ja.aesGcm.getKeyFromKeyString(d),f=await ja.aesGcm.decryptString(l,e.databaseName)}catch(e){return null}const r=await hn(a),n=await nn(l,r),c=await ja.aesGcm.getKeyStringFromKey(l),u="SaveDatabase",d={databaseNameHash:o,encryptedDbKey:await ja.aesGcm.encryptString(t,c),receivedSignature:n};sr.request(u,d)}}const m={databaseName:f,databaseId:n,isOwner:c,readOnly:u,resharingAllowed:d,encryptionMode:e.plaintextDbKey?"server-side":"end-to-end"},p=await(async(e,t,s,a,r,n)=>{const i=[],o={databaseId:e,databaseNameHash:t};let c=await sr.request("GetDatabaseUsers",o);for(i.push(...await tn(s,c.data.users,a,r,n));c.data.nextPageTokenLessThanUserId||c.data.nextPageTokenMoreThanUserId;)o.nextPageTokenLessThanUserId=c.data.nextPageTokenLessThanUserId,o.nextPageTokenMoreThanUserId=c.data.nextPageTokenMoreThanUserId,c=await sr.request("GetDatabaseUsers",o),i.push(...await tn(s,c.data.users,a,r,n));return i})(n,o,l,a,r,h);return c||(e=>{for(let t=0;t<e.length;t++){if(e[t].isOwner)return!0}return!1})(p)?(m.users=p,!c&&h&&(m.receivedFromUsername=h),m):null},an=async(e,t,s="end-to-end")=>{let a;Lr(s);try{a=Vr(e,t,null,s)}catch(r){const n="GetDatabases",i=e?{dbNameHash:"server-side"===s?e:await ja.hmac.signString(sr.keys.hmacKey,e)}:{databaseId:t},o=(await sr.request(n,i)).data.databases;if(!o||!o.length)throw new hs.DatabaseNotFound;a=o[0],a.dbNameHash=a.databaseNameHash,a.dbId=a.databaseId}return a},rn=async(e,t)=>{const s=await ja.aesGcm.getRawKeyFromKey(e),a=await ja.sha256.hash(s),r=await ja.hmac.importKeyFromRawBits(a);return await ja.hmac.signString(r,t)},nn=async(e,t)=>{const s=await rn(e,t);return await ja.ecdsa.signString(sr.keys.ecdsaPrivateKey,s)},on=async e=>{let t;return e.dbKey?t=await ja.aesGcm.getKeyStringFromKey(e.dbKey):(t=e.plaintextDbKey||await ja.aesGcm.decryptString(sr.keys.encryptionKey,e.encryptedDbKey),e.dbKey=await ja.aesGcm.getKeyFromKeyString(t)),t},cn=async(e,t,s,a,r)=>{const{databaseName:n,databaseId:o}=e,c=e.username.toLowerCase();try{const[e,u,d]=await Promise.all([Ts(c),a&&fn(),an(n,o,r)]);if(!e.ecdhPublicKey||!e.ecdsaPublicKey)throw new hs.UserUnableToReceiveDatabase;const h=i.a.decode(e.ecdsaPublicKey),l=await hn(h);a&&await(async(e,t,s)=>{let a,r;const n=Object.keys(s);for(let i=0;i<n.length;i++){const o=n[i],c=s[o].record.fingerprint;if(e===o&&t===c){a=c;break}c===t&&(r=!0)}if(!a&&r)throw new hs.UserMustBeReverified;if(!a)throw new hs.UserNotVerified})(c,l,u);const f=await ja.ecdsa.getPublicKeyFromRawPublicKey(h),{signedEcdhPublicKey:m,ecdhPublicKey:p}=e;if(!await ja.ecdsa.verify(f,i.a.decode(m),i.a.decode(p)))throw new hs.ServiceUnavailable;const w=await ja.ecdh.getPublicKeyFromRawPublicKey(i.a.decode(e.ecdhPublicKey)),g=await ja.ecdh.generateKeyPair(),y=await ja.ecdh.getRawPublicKeyFromPublicKey(g.publicKey),b=await ja.ecdsa.sign(sr.keys.ecdsaPrivateKey,y),v=await ja.ecdh.computeSharedKeyEncryptionKey(w,g.privateKey),M=await on(d),S=await ja.aesGcm.encryptString(v,M),I="ShareDatabase",P={databaseId:d.dbId,databaseNameHash:d.dbNameHash,username:c,readOnly:t,resharingAllowed:s,sharedEncryptedDbKey:S,ephemeralPublicKey:i.a.encode(y),signedEphemeralPublicKey:i.a.encode(b),sentSignature:await nn(d.dbKey,l),recipientEcdsaPublicKey:e.ecdsaPublicKey};await sr.request(I,P)}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"SharingWithSelfNotAllowed":throw new hs.SharingWithSelfNotAllowed;case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"ResharingNotAllowed":throw new hs.ResharingNotAllowed("Must have permission to reshare the database with another user");case"ResharingWithWriteAccessNotAllowed":throw new hs.ResharingWithWriteAccessNotAllowed;case"UserNotFound":throw new hs.UserNotFound;case"DatabaseAlreadyShared":return}throw e}},un=e=>{if("string"!=typeof e)throw new hs.UsernameMustBeString;if(0===e.length)throw new hs.UsernameCannotBeBlank},dn=e=>{if(Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;if(Ga(e,"username")&&un(e.username),Ga(e,"readOnly")&&"boolean"!=typeof e.readOnly)throw new hs.ReadOnlyMustBeBoolean;if(Ga(e,"resharingAllowed")&&"boolean"!=typeof e.resharingAllowed)throw new hs.ResharingAllowedMustBeBoolean;if(Ga(e,"requireVerified")&&"boolean"!=typeof e.requireVerified)throw new hs.RequireVerifiedMustBeBoolean},hn=async e=>{const t=await ja.sha256.hash(e);return i.a.encode(t)},ln=async()=>{const e=await ja.ecdsa.getPublicKeyFromPrivateKey(sr.keys.ecdsaPrivateKey),t=await ja.ecdsa.getRawPublicKeyFromPublicKey(e);return await hn(t)},fn=async()=>{await qr({databaseName:"__userbase_verified_users",changeHandler:()=>{},allowVerifiedUsersDatabase:!0,encryptionMode:"end-to-end"});const e=sr.state.dbNameToHash.__userbase_verified_users;return sr.state.databases[e].items};var mn={openDatabase:qr,getDatabases:async e=>{try{void 0!==e&&jr(e),Tr();const{encryptionKey:t,ecdhPrivateKey:s}=sr.keys,a=sr.session.username;if(e&&Ga(e,"shareToken"))throw new hs.ShareTokenNotAllowed;const r=e&&e.encryptionMode||sr.encryptionMode;Lr(r);try{const n=[],i="GetDatabases",o=e&&{databaseId:e.databaseId,dbNameHash:"server-side"===r?e.databaseName:e.databaseName&&await ja.hmac.signString(sr.keys.hmacKey,e.databaseName)};let[c,u]=await Promise.all([sr.request(i,o),fn()]),d=await Promise.all(c.data.databases.map(e=>sn(e,t,s,u,a)));for(n.push(...d);c.data.nextPageToken;){const e={nextPageToken:c.data.nextPageToken};c=await sr.request(i,e),d=await Promise.all(c.data.databases.map(e=>sn(e,t,s,u,a))),n.push(...d)}return{databases:n.filter(e=>null!==e)}}catch(e){throw kr(e),e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},insertItem:Hr,updateItem:Jr,deleteItem:async e=>{try{jr(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),s="Delete",a=await Yr(t,e);await zr(t,s,a)}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemDoesNotExist":case"ItemUpdateConflict":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},putTransaction:async e=>{try{if(jr(e),!Ga(e,"operations"))throw new hs.OperationsMissing;const{databaseName:t,databaseId:s,shareToken:a,operations:r,encryptionMode:n=sr.encryptionMode}=e;if(!Array.isArray(r))throw new hs.OperationsMustBeArray;const i=Vr(t,s,a,n),o="BatchTransaction",c=await Promise.all(r.map(e=>{const t=e.command;switch(t){case"Insert":return Gr(i,e);case"Update":return Wr(i,e);case"Delete":return Yr(i,e);default:throw new hs.CommandNotRecognized(t)}})),u=await Promise.all(c),d={operations:r.map((e,t)=>Ur({command:e.command},u[t]))};try{await zr(i,o,d)}catch(e){if(e.response&&"OperationsExceedLimit"===e.response.data.error)throw new hs.OperationsExceedLimit(e.response.data.limit);throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"OperationsMissing":case"OperationsMustBeArray":case"OperationsConflict":case"OperationsExceedLimit":case"CommandNotRecognized":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemMissing":case"ItemInvalid":case"ItemTooLarge":case"ItemAlreadyExists":case"ItemDoesNotExist":case"ItemUpdateConflict":case"WriteAccessParamNotAllowed":case"TransactionUnauthorized":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},uploadFile:async e=>{try{(e=>{if(jr(e),Ga(e,"progressHandler")&&"function"!=typeof e.progressHandler)throw new hs.ProgressHandlerMustBeFunction})(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),{dbId:s}=t;try{const{itemKey:a,fileMetadata:r}=await(async(e,t)=>{if(!Ga(e,"itemId"))throw new hs.ItemIdMissing;if(!Ga(e,"file"))throw new hs.FileMissing;const{itemId:s,file:a}=e;if("string"!=typeof s)throw new hs.ItemIdMustBeString;if(0===s.length)throw new hs.ItemIdCannotBeBlank;if(s.length>100)throw new hs.ItemIdTooLong(100);if(!t.itemExists(s))throw new hs.ItemDoesNotExist;if(!(a instanceof File))throw new hs.FileMustBeFile;if(0===a.size)throw new hs.FileCannotBeEmpty;const r=await ja.hmac.signString(sr.keys.hmacKey,s),n=t.getFileVersionNumber(s);return{itemKey:r,fileMetadata:{itemId:s,__v:void 0===n?0:n+1,fileName:a.name,fileSize:a.size,fileType:a.type}}})(e,t),[n,o]=await ja.aesGcm.generateAndEncryptKeyEncryptionKey(t.dbKey),c=await ja.aesGcm.encryptJson(n,r),{data:{fileId:u}}=await sr.request("GenerateFileId",{dbId:t.dbId}),d=e.file;let h=0,l=0,f=[];const m={bytesTransferred:0};for(;h<d.size;){const t=d.slice(h,h+524288);await Zr(f,t,s,u,n,l,m,e.progressHandler),l+=1,h+=524288}await Promise.all(f),await(async(e,t,s,a,r)=>{const n={dbId:e.dbId,fileId:t,itemKey:s,fileMetadata:a,fileEncryptionKey:i.a.encode(r)};await zr(e,"CompleteFileUpload",n)})(t,u,a,c,o)}catch(e){if(kr(e),e.response&&"DatabaseIsReadOnly"===e.response.data)throw new hs.DatabaseIsReadOnly;throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"ItemIdMissing":case"ItemIdMustBeString":case"ItemIdCannotBeBlank":case"ItemIdTooLong":case"ItemDoesNotExist":case"TransactionUnauthorized":case"FileMustBeFile":case"FileCannotBeEmpty":case"FileMissing":case"FileUploadConflict":case"ProgressHandlerMustBeFunction":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},getFile:async e=>{try{(e=>{if(jr(e),!Ga(e,"fileId"))throw new hs.FileIdMissing;const{fileId:t,range:s}=e;if("string"!=typeof t)throw new hs.FileIdMustBeString;if(0===t.length)throw new hs.FileIdCannotBeBlank;if(t.length>100)throw new hs.FileIdTooLong(100);if(Ga(e,"range")){if("object"!=typeof s)throw new hs.RangeMustBeObject;if(!Ga(s,"start"))throw new hs.RangeMissingStart;if(!Ga(s,"end"))throw new hs.RangeMissingEnd;const{start:e,end:t}=s;if("number"!=typeof e)throw new hs.RangeStartMustBeNumber;if("number"!=typeof t)throw new hs.RangeEndMustBeNumber;if(e<0)throw new hs.RangeStartMustBeGreaterThanZero;if(t<=e)throw new hs.RangeEndMustBeGreaterThanRangeStart}})(e);const t=Vr(e.databaseName,e.databaseId,e.shareToken,e.encryptionMode||sr.encryptionMode),{dbId:s}=t,{fileId:a,range:r}=e,n=t.fileIds[a],i=t.items[n];if(!i||!i.file)throw new hs.FileNotFound;const{file:{fileName:o,fileSize:c,fileType:u,fileEncryptionKey:d}}=i;if(r&&r.end>c)throw new hs.RangeEndMustBeLessThanFileSize;const h=r?await(async(e,t,s,a)=>{const{start:r,end:n}=a,i=[],o=Math.floor(r/524288),c=Math.floor(n/524288)-(n%524288==0?1:0);let u=o;for(;u<=c;){let a=await Xr(e,t,u,s);u===o&&u===c&&n%524288?a=a.slice(r%524288,n%524288):u===o?a=a.slice(r%524288):u===c&&n%524288&&(a=a.slice(0,n%524288)),i.push(a),u+=1}return i})(s,a,d,r):await(async(e,t,s,a)=>{const r=[];let n=0;const i=a<524288?0:Math.floor(a/524288)-(a%524288==0?1:0);for(;n<=i;){const a=await Xr(e,t,n,s);r.push(a),n+=1}return r})(s,a,d,c);return{file:new File(h,o,{type:u})}}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNotOpen":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"ShareTokenInvalid":case"DatabaseIsReadOnly":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"FileIdMissing":case"FileIdMustBeString":case"FileIdCannotBeBlank":case"FileIdTooLong":case"FileNotFound":case"RangeMustBeObject":case"RangeMissingStart":case"RangeMissingEnd":case"RangeStartMustBeNumber":case"RangeEndMustBeNumber":case"RangeStartMustBeGreaterThanZero":case"RangeEndMustBeGreaterThanRangeStart":case"RangeEndMustBeLessThanFileSize":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},shareDatabase:async e=>{try{jr(e),dn(e);const t=!Ga(e,"readOnly")||e.readOnly,s=!!Ga(e,"resharingAllowed")&&e.resharingAllowed,a=!Ga(e,"requireVerified")||e.requireVerified,r=e.encryptionMode||sr.encryptionMode;Lr(r);let n={};return Ga(e,"username")?await cn(e,t,s,a,r):n.shareToken=await(async(e,t,s)=>{try{const{databaseName:a,databaseId:r}=e;if(Ga(e,"requireVerified"))throw new hs.RequireVerifiedParamNotNecessary;if(Ga(e,"resharingAllowed"))throw new hs.ResharingAllowedParamNotAllowed("when retrieving a share token");const n=ja.generateSeed(),o=await ja.hkdf.importHkdfKey(n),c=ja.hkdf.generateSalt(),u=await ja.aesGcm.importKeyFromMaster(o,c),d=await an(a,r,s),h=await on(d),l=await ja.aesGcm.encryptString(u,h),{ecdsaPublicKey:f,encryptedEcdsaPrivateKey:m,ecdsaKeyEncryptionKeySalt:p}=await ja.ecdsa.generateEcdsaKeyData(o),w="ShareDatabaseToken",g={databaseId:d.dbId,databaseNameHash:d.dbNameHash,readOnly:t,keyData:{shareTokenEncryptedDbKey:l,shareTokenEncryptionKeySalt:i.a.encode(c),shareTokenPublicKey:f,shareTokenEncryptedEcdsaPrivateKey:m,shareTokenEcdsaKeyEncryptionKeySalt:p}},y=await sr.request(w,g),{shareTokenId:b}=y.data,v=Ls(b,!0);return i.a.encode(js(v,n))}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"ResharingNotAllowed":throw new hs.ResharingNotAllowed("Only the owner can generate a share token")}throw e}})(e,t,r),n}catch(e){switch(e.name){case"ParamsMustBeObject":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"DatabaseNotFound":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"ReadOnlyMustBeBoolean":case"ResharingAllowedMustBeBoolean":case"ResharingNotAllowed":case"ResharingWithWriteAccessNotAllowed":case"ResharingAllowedParamNotAllowed":case"RequireVerifiedMustBeBoolean":case"RequireVerifiedParamNotNecessary":case"SharingWithSelfNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"UserUnableToReceiveDatabase":case"UserNotFound":case"UserNotVerified":case"UserMustBeReverified":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},modifyDatabasePermissions:async e=>{try{if(jr(e),dn(e),!Ga(e,"username"))throw new hs.UsernameMissing;if(Ga(e,"revoke")){if("boolean"!=typeof e.revoke)throw new hs.RevokeMustBeBoolean;if(e.revoke){if(Ga(e,"readOnly"))throw new hs.ReadOnlyParamNotAllowed;if(Ga(e,"resharingAllowed"))throw new hs.ResharingAllowedParamNotAllowed("when revoking access to a database")}}else if(!Ga(e,"readOnly")&&!Ga(e,"resharingAllowed"))throw new hs.ParamsMissing;const{databaseName:t,databaseId:s,readOnly:a,resharingAllowed:r,revoke:n,encryptionMode:i=sr.encryptionMode}=e,o=e.username.toLowerCase();try{const e=await an(t,s,i),c="ModifyDatabasePermissions",u={databaseId:e.dbId,databaseNameHash:e.dbNameHash,username:o,readOnly:a,resharingAllowed:r,revoke:n};await sr.request(c,u)}catch(e){if(kr(e),e.response&&e.response.data)switch(e.response.data.message){case"SharingWithSelfNotAllowed":throw new hs.ModifyingOwnPermissionsNotAllowed;case"ModifyingOwnerPermissionsNotAllowed":throw new hs.ModifyingOwnerPermissionsNotAllowed;case"ResharingNotAllowed":throw new hs.ModifyingPermissionsNotAllowed;case"ResharingWithWriteAccessNotAllowed":throw new hs.GrantingWriteAccessNotAllowed;case"DatabaseNotFound":throw new hs.DatabaseNotFound;case"UserNotFound":throw new hs.UserNotFound}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"ParamsMissing":case"DatabaseNameMissing":case"DatabaseNameMustBeString":case"DatabaseNameCannotBeBlank":case"DatabaseNameTooLong":case"DatabaseNameRestricted":case"DatabaseIdMustBeString":case"DatabaseIdCannotBeBlank":case"DatabaseIdInvalidLength":case"DatabaseIdNotAllowed":case"ShareTokenNotAllowed":case"DatabaseNotFound":case"EncryptionModeNotValid":case"ServerSideEncryptionNotEnabledInClient":case"UsernameMissing":case"UsernameCannotBeBlank":case"UsernameMustBeString":case"ReadOnlyMustBeBoolean":case"ReadOnlyParamNotAllowed":case"ResharingAllowedMustBeBoolean":case"ResharingAllowedParamNotAllowed":case"RevokeMustBeBoolean":case"ModifyingOwnPermissionsNotAllowed":case"ModifyingOwnerPermissionsNotAllowed":case"ModifyingPermissionsNotAllowed":case"GrantingWriteAccessNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"UserNotFound":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},getVerificationMessage:async()=>{try{Tr();const e=sr.session.username,t=await ln();return{verificationMessage:((e,t)=>btoa(JSON.stringify({username:e,fingerprint:t})))(e,t)}}catch(e){switch(e.name){case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},verifyUser:async e=>{try{if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(Tr(),!Ga(e,"verificationMessage"))throw new hs.VerificationMessageMissing;const{verificationMessage:t}=e;if("string"!=typeof t)throw new hs.VerificationMessageMustBeString;if(0===t.length)throw new hs.VerificationMessageCannotBeBlank;const{username:s,fingerprint:a}=(e=>{try{const{username:t,fingerprint:s}=JSON.parse(atob(e));if(un(t),!s)throw new hs.VerificationMessageInvalid;return{username:t,fingerprint:s}}catch(e){throw new hs.VerificationMessageInvalid}})(t);if(s===sr.session.username||a===await ln())throw new hs.VerifyingSelfNotAllowed;await fn();const r="__userbase_verified_users",n=!0,i=s,o={fingerprint:a};try{await Hr({databaseName:r,itemId:i,item:o,allowVerifiedUsersDatabase:n})}catch(e){if("ItemAlreadyExists"!==e.name)throw e;await Jr({databaseName:r,itemId:i,item:o,allowVerifiedUsersDatabase:n})}}catch(e){switch(e.name){case"ParamsMustBeObject":case"VerificationMessageMissing":case"VerificationMessageMustBeString":case"VerificationMessageCannotBeBlank":case"VerificationMessageInvalid":case"VerifyingSelfNotAllowed":case"UserMustChangePassword":case"UserNotSignedIn":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}};const pn=()=>{if(sr.reconnecting)throw new hs.Reconnecting;if(!sr.keys.init&&sr.changePassword)throw new hs.UserMustChangePassword;if(!sr.keys.init)throw new hs.UserNotSignedIn},wn=e=>{if(e.response){if(e.response.status===p)throw new hs.InternalServerError;if(e.response.status===g)throw new hs.Timeout}else if(e.message&&-1!==e.message.indexOf("timeout"))throw new hs.Timeout},gn=e=>{pn();const t=sr.userData.stripeData;if(!t.stripeAccountId)throw new hs.StripeAccountNotConnected;if("disabled"===t.paymentsMode)throw new hs.PaymentsDisabled;if(!Ga(window,"Stripe"))throw new hs.StripeJsLibraryMissing;if("object"!=typeof e)throw new hs.ParamsMustBeObject;if(!Ga(e,"successUrl"))throw new hs.SuccessUrlMissing;if("string"!=typeof e.successUrl)throw new hs.SuccessUrlMustBeString;const s=qa(e.successUrl);if("http"!==s&&"https"!==s){const e=!0;throw new hs.SuccessUrlInvalid(e)}if(!Ga(e,"cancelUrl"))throw new hs.CancelUrlMissing;if("string"!=typeof e.cancelUrl)throw new hs.CancelUrlMustBeString;const a=qa(e.cancelUrl);if("http"!==a&&"https"!==a){const e=!0;throw new hs.CancelUrlInvalid(e)}},yn=()=>{pn();const e=sr.userData.stripeData;if(!e.stripeAccountId)throw new hs.StripeAccountNotConnected;if("disabled"===e.paymentsMode)throw new hs.PaymentsDisabled;if("canceled"===e.subscriptionStatus)throw new hs.SubscriptionAlreadyCanceled};var bn={purchaseSubscription:async e=>{try{const t=sr.userData.stripeData;if(!t.cancelSubscriptionAt&&t.subscriptionStatus&&"canceled"!==t.subscriptionStatus)throw new hs.SubscriptionPlanAlreadyPurchased;gn(e);try{const s="PurchaseSubscription",a=(await sr.request(s,e)).data,r=vs("prod"===t.paymentsMode),n=await window.Stripe(r,{stripeAccount:t.stripeAccountId}).redirectToCheckout({sessionId:a});if(n.error)throw n.error}catch(e){if(wn(e),e.response)switch(e.response.data){case"PriceIdOrPlanIdAllowed":throw new hs.PriceIdOrPlanIdAllowed;case"PriceIdOrPlanIdMissing":throw new hs.PriceIdOrPlanIdMissing;case"SubscriptionPlanAlreadyPurchased":throw new hs.SubscriptionPlanAlreadyPurchased;case"SuccessUrlInvalid":throw new hs.SuccessUrlInvalid;case"CancelUrlInvalid":throw new hs.CancelUrlInvalid;default:if(e.response.data&&"StripeError"===e.response.data.name)throw new hs.StripeError(e.response.data)}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"SuccessUrlMissing":case"SuccessUrlMustBeString":case"SuccessUrlInvalid":case"CancelUrlMissing":case"CancelUrlMustBeString":case"CancelUrlInvalid":case"StripeError":case"StripeJsLibraryMissing":case"PriceIdOrPlanIdAllowed":case"PriceIdOrPlanIdMissing":case"SubscriptionPlanAlreadyPurchased":case"StripeAccountNotConnected":case"PaymentsDisabled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},cancelSubscription:async()=>{try{yn();try{const e="CancelSubscription",t=(await sr.request(e)).data;return sr.userData.stripeData.cancelSubscriptionAt=t,{cancelSubscriptionAt:t}}catch(e){if(wn(e),e.response&&"SubscriptionNotFound"===e.response.data)throw new hs.SubscriptionNotFound;throw e}}catch(e){switch(e.name){case"SubscriptionNotFound":case"StripeAccountNotConnected":case"PaymentsDisabled":case"SubscriptionAlreadyCanceled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},resumeSubscription:async()=>{try{yn();try{const e="ResumeSubscription";await sr.request(e),delete sr.userData.stripeData.cancelSubscriptionAt}catch(e){if(wn(e),e.response&&"SubscriptionNotFound"===e.response.data)throw new hs.SubscriptionNotFound;throw e}}catch(e){switch(e.name){case"SubscriptionNotFound":case"StripeAccountNotConnected":case"PaymentsDisabled":case"SubscriptionAlreadyCanceled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}},updatePaymentMethod:async e=>{try{gn(e);const t=sr.userData.stripeData;if(!t.subscriptionStatus)throw new hs.SubscriptionNotPurchased;try{const s="UpdatePaymentMethod",a=(await sr.request(s,e)).data,r=vs("prod"===t.paymentsMode),n=await window.Stripe(r,{stripeAccount:t.stripeAccountId}).redirectToCheckout({sessionId:a});if(n.error)throw n.error}catch(e){if(wn(e),e.response){if("SuccessUrlInvalid"===e.response.data)throw new hs.SuccessUrlInvalid;if("CancelUrlInvalid"===e.response.data)throw new hs.CancelUrlInvalid}throw e}}catch(e){switch(e.name){case"ParamsMustBeObject":case"SuccessUrlMissing":case"SuccessUrlMustBeString":case"SuccessUrlInvalid":case"CancelUrlMissing":case"CancelUrlMustBeString":case"CancelUrlInvalid":case"StripeJsLibraryMissing":case"SubscriptionNotPurchased":case"StripeAccountNotConnected":case"PaymentsDisabled":case"UserMustChangePassword":case"UserNotSignedIn":case"TooManyRequests":case"ServiceUnavailable":throw e;default:throw new hs.UnknownServiceUnavailable(e)}}}};t.default={init:Pr.init,signUp:Pr.signUp,signIn:Pr.signIn,signOut:Pr.signOut,updateUser:Pr.updateUser,deleteUser:Pr.deleteUser,forgotPassword:Pr.forgotPassword,openDatabase:mn.openDatabase,insertItem:mn.insertItem,updateItem:mn.updateItem,deleteItem:mn.deleteItem,putTransaction:mn.putTransaction,uploadFile:mn.uploadFile,getFile:mn.getFile,getDatabases:mn.getDatabases,shareDatabase:mn.shareDatabase,modifyDatabasePermissions:mn.modifyDatabasePermissions,getVerificationMessage:mn.getVerificationMessage,verifyUser:mn.verifyUser,purchaseSubscription:bn.purchaseSubscription,cancelSubscription:bn.cancelSubscription,resumeSubscription:bn.resumeSubscription,updatePaymentMethod:bn.updatePaymentMethod}}]).default;
+//# sourceMappingURL=userbase.js.map
diff --git a/public/js/userbase.js.map b/public/js/userbase.js.map
new file mode 100644
index 0000000..84fe57a
--- /dev/null
+++ b/public/js/userbase.js.map
@@ -0,0 +1,2022 @@
+{
+  "version": 3,
+  "sources": [
+    "webpack://userbase/webpack/bootstrap",
+    "webpack://userbase/./node_modules/base64-arraybuffer/lib/base64-arraybuffer.js",
+    "webpack://userbase/./node_modules/@babel/runtime/helpers/defineProperty.js",
+    "webpack://userbase/./node_modules/uuid/v4.js",
+    "webpack://userbase/(webpack)/buildin/global.js",
+    "webpack://userbase/./node_modules/node-libs-browser/node_modules/buffer/index.js",
+    "webpack://userbase/./node_modules/bn.js/lib/bn.js",
+    "webpack://userbase/./node_modules/diffie-hellman/lib/generatePrime.js",
+    "webpack://userbase/./node_modules/randombytes/browser.js",
+    "webpack://userbase/./node_modules/process/browser.js",
+    "webpack://userbase/./node_modules/miller-rabin/lib/mr.js",
+    "webpack://userbase/./node_modules/diffie-hellman/browser.js",
+    "webpack://userbase/./node_modules/scrypt-js/scrypt.js",
+    "webpack://userbase/./node_modules/sorted-array/sorted-array.js",
+    "webpack://userbase/./node_modules/uuid/lib/rng-browser.js",
+    "webpack://userbase/./node_modules/uuid/lib/bytesToUuid.js",
+    "webpack://userbase/./node_modules/base64-js/index.js",
+    "webpack://userbase/./node_modules/ieee754/index.js",
+    "webpack://userbase/./node_modules/isarray/index.js",
+    "webpack://userbase/./node_modules/safe-buffer/index.js",
+    "webpack://userbase/(webpack)/buildin/module.js",
+    "webpack://userbase/./node_modules/brorand/index.js",
+    "webpack://userbase/./node_modules/diffie-hellman/lib/dh.js",
+    "webpack://userbase/./node_modules/timers-browserify/main.js",
+    "webpack://userbase/./node_modules/setimmediate/setImmediate.js",
+    "webpack://userbase/./src/statusCodes.js",
+    "webpack://userbase/./src/errors/auth.js",
+    "webpack://userbase/./src/errors/db.js",
+    "webpack://userbase/./src/errors/config.js",
+    "webpack://userbase/./src/errors/payments.js",
+    "webpack://userbase/./src/errors/index.js",
+    "webpack://userbase/./src/config.js",
+    "webpack://userbase/./src/api/utils.js",
+    "webpack://userbase/./src/api/auth.js",
+    "webpack://userbase/./src/localData.js",
+    "webpack://userbase/./src/Crypto/utils.js",
+    "webpack://userbase/./src/Crypto/sha-256.js",
+    "webpack://userbase/./src/Crypto/hkdf.js",
+    "webpack://userbase/./src/Crypto/aes-gcm.js",
+    "webpack://userbase/./src/Crypto/diffie-hellman.js",
+    "webpack://userbase/./src/Crypto/ecdsa.js",
+    "webpack://userbase/./src/Crypto/ecdh.js",
+    "webpack://userbase/./src/Crypto/hmac.js",
+    "webpack://userbase/./src/Crypto/index.js",
+    "webpack://userbase/./src/Crypto/scrypt.js",
+    "webpack://userbase/./src/utils.js",
+    "webpack://userbase/./src/worker.js",
+    "webpack://userbase/./src/api/db.js",
+    "webpack://userbase/./src/ws.js",
+    "webpack://userbase/./src/auth.js",
+    "webpack://userbase/./src/db.js",
+    "webpack://userbase/./src/payments.js",
+    "webpack://userbase/./src/index.js"
+  ],
+  "names": [
+    "installedModules",
+    "__webpack_require__",
+    "moduleId",
+    "exports",
+    "module",
+    "i",
+    "l",
+    "modules",
+    "call",
+    "m",
+    "c",
+    "d",
+    "name",
+    "getter",
+    "o",
+    "Object",
+    "defineProperty",
+    "enumerable",
+    "get",
+    "r",
+    "Symbol",
+    "toStringTag",
+    "value",
+    "t",
+    "mode",
+    "__esModule",
+    "ns",
+    "create",
+    "key",
+    "bind",
+    "n",
+    "object",
+    "property",
+    "prototype",
+    "hasOwnProperty",
+    "p",
+    "s",
+    "chars",
+    "lookup",
+    "Uint8Array",
+    "length",
+    "charCodeAt",
+    "encode",
+    "arraybuffer",
+    "bytes",
+    "len",
+    "base64",
+    "substring",
+    "decode",
+    "encoded1",
+    "encoded2",
+    "encoded3",
+    "encoded4",
+    "bufferLength",
+    "ArrayBuffer",
+    "obj",
+    "configurable",
+    "writable",
+    "rng",
+    "bytesToUuid",
+    "options",
+    "buf",
+    "offset",
+    "Array",
+    "rnds",
+    "random",
+    "ii",
+    "g",
+    "this",
+    "Function",
+    "e",
+    "window",
+    "ieee754",
+    "isArray",
+    "kMaxLength",
+    "Buffer",
+    "TYPED_ARRAY_SUPPORT",
+    "createBuffer",
+    "that",
+    "RangeError",
+    "__proto__",
+    "arg",
+    "encodingOrOffset",
+    "Error",
+    "allocUnsafe",
+    "from",
+    "TypeError",
+    "array",
+    "byteOffset",
+    "byteLength",
+    "undefined",
+    "fromArrayLike",
+    "fromArrayBuffer",
+    "string",
+    "encoding",
+    "isEncoding",
+    "actual",
+    "write",
+    "slice",
+    "fromString",
+    "isBuffer",
+    "checked",
+    "copy",
+    "buffer",
+    "val",
+    "type",
+    "data",
+    "fromObject",
+    "assertSize",
+    "size",
+    "toString",
+    "isView",
+    "loweredCase",
+    "utf8ToBytes",
+    "base64ToBytes",
+    "toLowerCase",
+    "slowToString",
+    "start",
+    "end",
+    "hexSlice",
+    "utf8Slice",
+    "asciiSlice",
+    "latin1Slice",
+    "base64Slice",
+    "utf16leSlice",
+    "swap",
+    "b",
+    "bidirectionalIndexOf",
+    "dir",
+    "isNaN",
+    "arrayIndexOf",
+    "indexOf",
+    "lastIndexOf",
+    "arr",
+    "indexSize",
+    "arrLength",
+    "valLength",
+    "String",
+    "read",
+    "readUInt16BE",
+    "foundIndex",
+    "found",
+    "j",
+    "hexWrite",
+    "Number",
+    "remaining",
+    "strLen",
+    "parsed",
+    "parseInt",
+    "substr",
+    "utf8Write",
+    "blitBuffer",
+    "asciiWrite",
+    "str",
+    "byteArray",
+    "push",
+    "asciiToBytes",
+    "latin1Write",
+    "base64Write",
+    "ucs2Write",
+    "units",
+    "hi",
+    "lo",
+    "utf16leToBytes",
+    "fromByteArray",
+    "Math",
+    "min",
+    "res",
+    "secondByte",
+    "thirdByte",
+    "fourthByte",
+    "tempCodePoint",
+    "firstByte",
+    "codePoint",
+    "bytesPerSequence",
+    "codePoints",
+    "fromCharCode",
+    "apply",
+    "decodeCodePointsArray",
+    "SlowBuffer",
+    "alloc",
+    "INSPECT_MAX_BYTES",
+    "global",
+    "foo",
+    "subarray",
+    "typedArraySupport",
+    "poolSize",
+    "_augment",
+    "species",
+    "fill",
+    "allocUnsafeSlow",
+    "_isBuffer",
+    "compare",
+    "a",
+    "x",
+    "y",
+    "concat",
+    "list",
+    "pos",
+    "swap16",
+    "swap32",
+    "swap64",
+    "arguments",
+    "equals",
+    "inspect",
+    "max",
+    "match",
+    "join",
+    "target",
+    "thisStart",
+    "thisEnd",
+    "thisCopy",
+    "targetCopy",
+    "includes",
+    "isFinite",
+    "toJSON",
+    "_arr",
+    "ret",
+    "out",
+    "toHex",
+    "checkOffset",
+    "ext",
+    "checkInt",
+    "objectWriteUInt16",
+    "littleEndian",
+    "objectWriteUInt32",
+    "checkIEEE754",
+    "writeFloat",
+    "noAssert",
+    "writeDouble",
+    "newBuf",
+    "sliceLen",
+    "readUIntLE",
+    "mul",
+    "readUIntBE",
+    "readUInt8",
+    "readUInt16LE",
+    "readUInt32LE",
+    "readUInt32BE",
+    "readIntLE",
+    "pow",
+    "readIntBE",
+    "readInt8",
+    "readInt16LE",
+    "readInt16BE",
+    "readInt32LE",
+    "readInt32BE",
+    "readFloatLE",
+    "readFloatBE",
+    "readDoubleLE",
+    "readDoubleBE",
+    "writeUIntLE",
+    "writeUIntBE",
+    "writeUInt8",
+    "floor",
+    "writeUInt16LE",
+    "writeUInt16BE",
+    "writeUInt32LE",
+    "writeUInt32BE",
+    "writeIntLE",
+    "limit",
+    "sub",
+    "writeIntBE",
+    "writeInt8",
+    "writeInt16LE",
+    "writeInt16BE",
+    "writeInt32LE",
+    "writeInt32BE",
+    "writeFloatLE",
+    "writeFloatBE",
+    "writeDoubleLE",
+    "writeDoubleBE",
+    "targetStart",
+    "set",
+    "code",
+    "INVALID_BASE64_RE",
+    "Infinity",
+    "leadSurrogate",
+    "toByteArray",
+    "trim",
+    "replace",
+    "stringtrim",
+    "base64clean",
+    "src",
+    "dst",
+    "assert",
+    "msg",
+    "inherits",
+    "ctor",
+    "superCtor",
+    "super_",
+    "TempCtor",
+    "constructor",
+    "BN",
+    "number",
+    "base",
+    "endian",
+    "isBN",
+    "negative",
+    "words",
+    "red",
+    "_init",
+    "wordSize",
+    "parseHex",
+    "parseBase",
+    "num",
+    "left",
+    "right",
+    "cmp",
+    "_initNumber",
+    "_initArray",
+    "_parseHex",
+    "_parseBase",
+    "strip",
+    "toArray",
+    "ceil",
+    "w",
+    "off",
+    "limbLen",
+    "limbPow",
+    "total",
+    "mod",
+    "word",
+    "imuln",
+    "_iaddn",
+    "dest",
+    "clone",
+    "_expand",
+    "_normSign",
+    "zeros",
+    "groupSizes",
+    "groupBases",
+    "smallMulTo",
+    "self",
+    "carry",
+    "k",
+    "ncarry",
+    "rword",
+    "maxJ",
+    "padding",
+    "groupSize",
+    "groupBase",
+    "isZero",
+    "modn",
+    "idivn",
+    "toNumber",
+    "toBuffer",
+    "toArrayLike",
+    "ArrayType",
+    "reqLength",
+    "q",
+    "andln",
+    "iushrn",
+    "clz32",
+    "_countBits",
+    "_zeroBits",
+    "bitLength",
+    "zeroBits",
+    "toTwos",
+    "width",
+    "abs",
+    "inotn",
+    "iaddn",
+    "fromTwos",
+    "testn",
+    "notn",
+    "ineg",
+    "isNeg",
+    "neg",
+    "iuor",
+    "ior",
+    "or",
+    "uor",
+    "iuand",
+    "iand",
+    "and",
+    "uand",
+    "iuxor",
+    "ixor",
+    "xor",
+    "uxor",
+    "bytesNeeded",
+    "bitsLeft",
+    "setn",
+    "bit",
+    "wbit",
+    "iadd",
+    "isub",
+    "add",
+    "comb10MulTo",
+    "mid",
+    "a0",
+    "al0",
+    "ah0",
+    "a1",
+    "al1",
+    "ah1",
+    "a2",
+    "al2",
+    "ah2",
+    "a3",
+    "al3",
+    "ah3",
+    "a4",
+    "al4",
+    "ah4",
+    "a5",
+    "al5",
+    "ah5",
+    "a6",
+    "al6",
+    "ah6",
+    "a7",
+    "al7",
+    "ah7",
+    "a8",
+    "al8",
+    "ah8",
+    "a9",
+    "al9",
+    "ah9",
+    "b0",
+    "bl0",
+    "bh0",
+    "b1",
+    "bl1",
+    "bh1",
+    "b2",
+    "bl2",
+    "bh2",
+    "b3",
+    "bl3",
+    "bh3",
+    "b4",
+    "bl4",
+    "bh4",
+    "b5",
+    "bl5",
+    "bh5",
+    "b6",
+    "bl6",
+    "bh6",
+    "b7",
+    "bl7",
+    "bh7",
+    "b8",
+    "bl8",
+    "bh8",
+    "b9",
+    "bl9",
+    "bh9",
+    "w0",
+    "imul",
+    "w1",
+    "w2",
+    "w3",
+    "w4",
+    "w5",
+    "w6",
+    "w7",
+    "w8",
+    "w9",
+    "w10",
+    "w11",
+    "w12",
+    "w13",
+    "w14",
+    "w15",
+    "w16",
+    "w17",
+    "w18",
+    "jumboMulTo",
+    "FFTM",
+    "mulp",
+    "mulTo",
+    "hncarry",
+    "bigMulTo",
+    "makeRBT",
+    "N",
+    "revBin",
+    "rb",
+    "permute",
+    "rbt",
+    "rws",
+    "iws",
+    "rtws",
+    "itws",
+    "transform",
+    "rtwdf",
+    "cos",
+    "PI",
+    "itwdf",
+    "sin",
+    "rtwdf_",
+    "itwdf_",
+    "re",
+    "ie",
+    "ro",
+    "io",
+    "rx",
+    "guessLen13b",
+    "odd",
+    "conjugate",
+    "normalize13b",
+    "ws",
+    "round",
+    "convert13b",
+    "stub",
+    "ph",
+    "_",
+    "rwst",
+    "iwst",
+    "nrws",
+    "nrwst",
+    "niwst",
+    "rmws",
+    "mulf",
+    "muln",
+    "sqr",
+    "isqr",
+    "toBitArray",
+    "iushln",
+    "bits",
+    "carryMask",
+    "newCarry",
+    "ishln",
+    "hint",
+    "extended",
+    "h",
+    "mask",
+    "maskedWords",
+    "ishrn",
+    "shln",
+    "ushln",
+    "shrn",
+    "ushrn",
+    "imaskn",
+    "maskn",
+    "isubn",
+    "addn",
+    "subn",
+    "iabs",
+    "_ishlnsubmul",
+    "shift",
+    "_wordDiv",
+    "bhi",
+    "diff",
+    "qj",
+    "div",
+    "divmod",
+    "positive",
+    "divn",
+    "umod",
+    "divRound",
+    "dm",
+    "half",
+    "r2",
+    "acc",
+    "egcd",
+    "A",
+    "B",
+    "C",
+    "D",
+    "isEven",
+    "yp",
+    "xp",
+    "im",
+    "isOdd",
+    "jm",
+    "gcd",
+    "_invmp",
+    "x1",
+    "x2",
+    "delta",
+    "cmpn",
+    "invm",
+    "bincn",
+    "ucmp",
+    "gtn",
+    "gt",
+    "gten",
+    "gte",
+    "ltn",
+    "lt",
+    "lten",
+    "lte",
+    "eqn",
+    "eq",
+    "Red",
+    "toRed",
+    "ctx",
+    "convertTo",
+    "_forceRed",
+    "fromRed",
+    "convertFrom",
+    "forceRed",
+    "redAdd",
+    "redIAdd",
+    "redSub",
+    "redISub",
+    "redShl",
+    "shl",
+    "redMul",
+    "_verify2",
+    "redIMul",
+    "redSqr",
+    "_verify1",
+    "redISqr",
+    "redSqrt",
+    "sqrt",
+    "redInvm",
+    "redNeg",
+    "redPow",
+    "primes",
+    "k256",
+    "p224",
+    "p192",
+    "p25519",
+    "MPrime",
+    "tmp",
+    "_tmp",
+    "K256",
+    "P224",
+    "P192",
+    "P25519",
+    "prime",
+    "_prime",
+    "Mont",
+    "imod",
+    "rinv",
+    "minv",
+    "ireduce",
+    "rlen",
+    "split",
+    "imulK",
+    "_strip",
+    "input",
+    "output",
+    "outLen",
+    "prev",
+    "next",
+    "mod3",
+    "one",
+    "nOne",
+    "lpow",
+    "z",
+    "inv",
+    "wnd",
+    "current",
+    "currentLen",
+    "mont",
+    "u",
+    "randomBytes",
+    "findPrime",
+    "simpleSieve",
+    "fermatTest",
+    "TWENTYFOUR",
+    "millerRabin",
+    "ONE",
+    "TWO",
+    "FIVE",
+    "TEN",
+    "THREE",
+    "ELEVEN",
+    "FOUR",
+    "_getPrimes",
+    "gen",
+    "n2",
+    "test",
+    "crypto",
+    "msCrypto",
+    "getRandomValues",
+    "cb",
+    "generated",
+    "process",
+    "nextTick",
+    "cachedSetTimeout",
+    "cachedClearTimeout",
+    "defaultSetTimout",
+    "defaultClearTimeout",
+    "runTimeout",
+    "fun",
+    "setTimeout",
+    "clearTimeout",
+    "currentQueue",
+    "queue",
+    "draining",
+    "queueIndex",
+    "cleanUpNextTick",
+    "drainQueue",
+    "timeout",
+    "run",
+    "marker",
+    "runClearTimeout",
+    "Item",
+    "noop",
+    "args",
+    "title",
+    "browser",
+    "env",
+    "argv",
+    "version",
+    "versions",
+    "on",
+    "addListener",
+    "once",
+    "removeListener",
+    "removeAllListeners",
+    "emit",
+    "prependListener",
+    "prependOnceListener",
+    "listeners",
+    "binding",
+    "cwd",
+    "chdir",
+    "umask",
+    "bn",
+    "brorand",
+    "MillerRabin",
+    "rand",
+    "Rand",
+    "_randbelow",
+    "min_bytes",
+    "generate",
+    "_randrange",
+    "stop",
+    "rone",
+    "n1",
+    "rn1",
+    "getDivisor",
+    "DH",
+    "ENCODINGS",
+    "DiffieHellmanGroup",
+    "createDiffieHellmanGroup",
+    "getDiffieHellman",
+    "createDiffieHellman",
+    "DiffieHellman",
+    "enc",
+    "generator",
+    "genc",
+    "generatePrime",
+    "root",
+    "SHA256",
+    "K",
+    "Uint32Array",
+    "h0",
+    "h1",
+    "h2",
+    "h3",
+    "h4",
+    "h5",
+    "h6",
+    "h7",
+    "blocks",
+    "t1",
+    "t2",
+    "f",
+    "bytesLeft",
+    "bitLenHi",
+    "bitLenLo",
+    "numZeros",
+    "PBKDF2_HMAC_SHA256_OneIter",
+    "password",
+    "salt",
+    "dkLen",
+    "innerLen",
+    "inner",
+    "outerKey",
+    "dk",
+    "incrementCounter",
+    "blockmix_salsa8",
+    "BY",
+    "Yi",
+    "_X",
+    "arraycopy",
+    "blockxor",
+    "salsa20_8",
+    "R",
+    "S",
+    "Si",
+    "srcPos",
+    "destPos",
+    "checkBufferish",
+    "v",
+    "ensureInteger",
+    "_scrypt",
+    "callback",
+    "XY",
+    "V",
+    "totalOps",
+    "i1",
+    "Bi",
+    "currentOp",
+    "lastPercent10",
+    "state",
+    "i0",
+    "setImmediate",
+    "incrementalSMix",
+    "steps",
+    "percent10",
+    "derivedKey",
+    "lib",
+    "scrypt",
+    "progressCallback",
+    "Promise",
+    "resolve",
+    "reject",
+    "lastProgress",
+    "error",
+    "progress",
+    "syncScrypt",
+    "SortedArray",
+    "compareDefault",
+    "index",
+    "insert",
+    "element",
+    "ordering",
+    "high",
+    "low",
+    "search",
+    "remove",
+    "splice",
+    "comparing",
+    "rnds8",
+    "byteToHex",
+    "bth",
+    "b64",
+    "lens",
+    "getLens",
+    "validLen",
+    "placeHoldersLen",
+    "Arr",
+    "_byteLength",
+    "curByte",
+    "revLookup",
+    "uint8",
+    "extraBytes",
+    "parts",
+    "len2",
+    "encodeChunk",
+    "isLE",
+    "mLen",
+    "nBytes",
+    "eLen",
+    "eMax",
+    "eBias",
+    "nBits",
+    "NaN",
+    "rt",
+    "log",
+    "LN2",
+    "copyProps",
+    "SafeBuffer",
+    "webpackPolyfill",
+    "deprecate",
+    "paths",
+    "children",
+    "_rand",
+    "getBytes",
+    "getByte",
+    "SEVEN",
+    "setPublicKey",
+    "pub",
+    "_pub",
+    "setPrivateKey",
+    "priv",
+    "_priv",
+    "primeCache",
+    "malleable",
+    "setGenerator",
+    "__prime",
+    "_primeLen",
+    "_primeCode",
+    "formatReturnValue",
+    "hex",
+    "rem",
+    "checkPrime",
+    "__gen",
+    "generateKeys",
+    "_gen",
+    "getPublicKey",
+    "computeSecret",
+    "other",
+    "secret",
+    "getPrime",
+    "front",
+    "getPrivateKey",
+    "getGenerator",
+    "Timeout",
+    "id",
+    "clearFn",
+    "_id",
+    "_clearFn",
+    "scope",
+    "setInterval",
+    "clearInterval",
+    "close",
+    "unref",
+    "ref",
+    "enroll",
+    "item",
+    "msecs",
+    "_idleTimeoutId",
+    "_idleTimeout",
+    "unenroll",
+    "_unrefActive",
+    "active",
+    "_onTimeout",
+    "clearImmediate",
+    "registerImmediate",
+    "html",
+    "channel",
+    "messagePrefix",
+    "onGlobalMessage",
+    "nextHandle",
+    "tasksByHandle",
+    "currentlyRunningATask",
+    "doc",
+    "document",
+    "attachTo",
+    "getPrototypeOf",
+    "handle",
+    "runIfPresent",
+    "postMessage",
+    "importScripts",
+    "postMessageIsAsynchronous",
+    "oldOnMessage",
+    "onmessage",
+    "canUsePostMessage",
+    "MessageChannel",
+    "port1",
+    "event",
+    "port2",
+    "createElement",
+    "documentElement",
+    "script",
+    "onreadystatechange",
+    "removeChild",
+    "appendChild",
+    "source",
+    "addEventListener",
+    "attachEvent",
+    "task",
+    "UsernameAlreadyExists",
+    "params",
+    "super",
+    "message",
+    "status",
+    "statusCodes",
+    "UsernameMissing",
+    "UsernameCannotBeBlank",
+    "UsernameTooLong",
+    "maxLen",
+    "UsernameMustBeString",
+    "PasswordMissing",
+    "PasswordCannotBeBlank",
+    "PasswordTooShort",
+    "minLen",
+    "PasswordTooLong",
+    "PasswordMustBeString",
+    "PasswordAttemptLimitExceeded",
+    "delay",
+    "UsernameOrPasswordMismatch",
+    "SessionLengthMustBeNumber",
+    "SessionLengthTooShort",
+    "SessionLengthTooLong",
+    "AllowServerSideEncryptionMustBeBoolean",
+    "UserAlreadySignedIn",
+    "username",
+    "UserPendingDeletion",
+    "AppIdNotValid",
+    "DomainNotWhitelisted",
+    "domain",
+    "UserNotSignedIn",
+    "UserNotFound",
+    "UserEmailNotFound",
+    "UserMustChangePassword",
+    "EmailNotValid",
+    "ProfileMustBeObject",
+    "ProfileCannotBeEmpty",
+    "ProfileHasTooManyKeys",
+    "maxKeys",
+    "ProfileKeyTooLong",
+    "ProfileValueMustBeString",
+    "ProfileValueCannotBeBlank",
+    "ProfileValueTooLong",
+    "RememberMeValueNotValid",
+    "JSON",
+    "stringify",
+    "keys",
+    "ParamsMissing",
+    "TrialExceededLimit",
+    "CurrentPasswordMissing",
+    "CurrentPasswordIncorrect",
+    "KeyNotFound",
+    "DeleteEndToEndEncryptedDataMustBeBoolean",
+    "DatabaseNameMissing",
+    "DatabaseNameCannotBeBlank",
+    "DatabaseNameMustBeString",
+    "DatabaseNameTooLong",
+    "maxLength",
+    "DatabaseNameRestricted",
+    "databaseName",
+    "DatabaseAlreadyOpening",
+    "ChangeHandlerMissing",
+    "ChangeHandlerMustBeFunction",
+    "EncryptionModeNotValid",
+    "ServerSideEncryptionNotEnabledInClient",
+    "DatabaseNotOpen",
+    "DatabaseNotFound",
+    "DatabaseIsReadOnly",
+    "DatabaseIdMustBeString",
+    "DatabaseIdCannotBeBlank",
+    "DatabaseIdNotAllowed",
+    "DatabaseIdNotAllowedForOwnDatabase",
+    "DatabaseIdInvalidLength",
+    "ShareTokenInvalid",
+    "ShareTokenNotFound",
+    "ShareTokenNotAllowed",
+    "reason",
+    "ShareTokenNotAllowedForOwnDatabase",
+    "ReadOnlyMustBeBoolean",
+    "ReadOnlyParamNotAllowed",
+    "ResharingAllowedParamNotAllowed",
+    "ResharingAllowedMustBeBoolean",
+    "ResharingNotAllowed",
+    "ResharingWithWriteAccessNotAllowed",
+    "SharingWithSelfNotAllowed",
+    "ModifyingOwnPermissionsNotAllowed",
+    "ModifyingOwnerPermissionsNotAllowed",
+    "ModifyingPermissionsNotAllowed",
+    "GrantingWriteAccessNotAllowed",
+    "RequireVerifiedMustBeBoolean",
+    "RequireVerifiedParamNotNecessary",
+    "RevokeMustBeBoolean",
+    "ItemMissing",
+    "ItemInvalid",
+    "ItemTooLarge",
+    "maxKb",
+    "ItemIdMustBeString",
+    "ItemIdTooLong",
+    "ItemIdMissing",
+    "ItemIdCannotBeBlank",
+    "ItemAlreadyExists",
+    "ItemDoesNotExist",
+    "ItemUpdateConflict",
+    "FileMissing",
+    "FileMustBeFile",
+    "FileCannotBeEmpty",
+    "FileUploadConflict",
+    "FileNotFound",
+    "FileIdMissing",
+    "FileIdMustBeString",
+    "FileIdCannotBeBlank",
+    "FileIdTooLong",
+    "RangeMustBeObject",
+    "RangeMissingStart",
+    "RangeMissingEnd",
+    "RangeStartMustBeNumber",
+    "RangeEndMustBeNumber",
+    "RangeStartMustBeGreaterThanZero",
+    "RangeEndMustBeGreaterThanRangeStart",
+    "RangeEndMustBeLessThanFileSize",
+    "OperationsMissing",
+    "OperationsMustBeArray",
+    "CommandNotRecognized",
+    "command",
+    "OperationsConflict",
+    "OperationsExceedLimit",
+    "UserNotVerified",
+    "UserMustBeReverified",
+    "UserUnableToReceiveDatabase",
+    "VerificationMessageMissing",
+    "VerificationMessageCannotBeBlank",
+    "VerificationMessageMustBeString",
+    "VerificationMessageInvalid",
+    "VerifyingSelfNotAllowed",
+    "ProgressHandlerMustBeFunction",
+    "TransactionUnauthorized",
+    "WriteAccessParamNotAllowed",
+    "AppIdAlreadySet",
+    "appId",
+    "AppIdMustBeString",
+    "AppIdMissing",
+    "AppIdCannotBeBlank",
+    "WebCryptoUnavailable",
+    "UpdateUserHandlerMustBeFunction",
+    "SuccessUrlMissing",
+    "SuccessUrlMustBeString",
+    "SuccessUrlInvalid",
+    "invalidProtocol",
+    "CancelUrlMissing",
+    "CancelUrlMustBeString",
+    "CancelUrlInvalid",
+    "StripeJsLibraryMissing",
+    "PaymentsDisabled",
+    "PriceIdOrPlanIdAllowed",
+    "PriceIdOrPlanIdMissing",
+    "SubscriptionPlanAlreadyPurchased",
+    "StripeAccountNotConnected",
+    "SubscriptionNotFound",
+    "SubscriptionInactive",
+    "subscriptionStatus",
+    "SubscriptionNotPurchased",
+    "SubscriptionAlreadyCanceled",
+    "TrialExpired",
+    "StripeError",
+    "AppIdNotSet",
+    "ServiceUnavailable",
+    "ParamsMustBeObject",
+    "TooManyRequests",
+    "retryDelay",
+    "retryDelaySeconds",
+    "auth",
+    "db",
+    "config",
+    "payments",
+    "InternalServerError",
+    "Reconnecting",
+    "UnknownServiceUnavailable",
+    "console",
+    "userbaseAppId",
+    "userbaseUpdateUserHandler",
+    "userbaseAllowServerSideEncryptionMode",
+    "errors",
+    "_userbaseEndpoint",
+    "updateUserHandler",
+    "allowServerSideEncryption",
+    "isProduction",
+    "_USERBASE_STRIPE_PRODUCTION_PUBLISHABLE_KEY",
+    "_USERBASE_STRIPE_TEST_PUBLISHABLE_KEY",
+    "RequestError",
+    "statusText",
+    "response",
+    "TimeoutError",
+    "processXhr",
+    "xhr",
+    "onload",
+    "parse",
+    "handleResponse",
+    "onerror",
+    "ontimeout",
+    "passwordToken",
+    "ecKeyData",
+    "passwordSalts",
+    "keySalts",
+    "email",
+    "profile",
+    "passwordBasedBackup",
+    "sessionLength",
+    "XMLHttpRequest",
+    "url",
+    "open",
+    "setRequestHeader",
+    "send",
+    "encodeURIComponent",
+    "async",
+    "sessionId",
+    "responseType",
+    "tryCatchWrapper",
+    "func",
+    "warn",
+    "_getSeedName",
+    "setCurrentSession",
+    "rememberMe",
+    "signedIn",
+    "creationDate",
+    "expirationDate",
+    "session",
+    "sessionString",
+    "localStorage",
+    "setItem",
+    "sessionStorage",
+    "signInSession",
+    "signOutSession",
+    "getCurrentSession",
+    "sessionStorageCurrentSessionString",
+    "getItem",
+    "localCurrentSessionString",
+    "localCurrentSession",
+    "localSessionString",
+    "saveSeedString",
+    "seedString",
+    "removeSeedString",
+    "seedName",
+    "removeItem",
+    "getSeedString",
+    "removeCurrentSession",
+    "arrayBufferToString",
+    "minified",
+    "bufView",
+    "Uint16Array",
+    "result",
+    "chunkSize",
+    "chunk",
+    "stringToArrayBuffer",
+    "appendBuffer",
+    "buffer1",
+    "buffer2",
+    "hash",
+    "subtle",
+    "digest",
+    "BYTE_SIZE",
+    "HASH_ALGORITHM_NAME",
+    "hashBase64String",
+    "dataString",
+    "hashString",
+    "KEY_WILL_BE_USED_TO",
+    "importHkdfKey",
+    "importKey",
+    "seed",
+    "SALT_BYTE_SIZE",
+    "sha256",
+    "getParams",
+    "keyName",
+    "info",
+    "importHkdfKeyFromString",
+    "generateSalt",
+    "getPasswordToken",
+    "hkdfKey",
+    "passwordTokenBits",
+    "deriveBits",
+    "windowOrSelfObject",
+    "getEncryptionKeyParams",
+    "getCiphertextParams",
+    "iv",
+    "tagLength",
+    "generateIv",
+    "sliceEncryptedArrayBuffer",
+    "encryptedArrayBuffer",
+    "ivStartIndex",
+    "ciphertextArrayBuffer",
+    "generateKey",
+    "getKeyFromRawKey",
+    "rawKey",
+    "getRawKeyFromKey",
+    "exportKey",
+    "encrypt",
+    "plaintext",
+    "encryptString",
+    "plaintextString",
+    "plaintextArrayBuffer",
+    "encrypted",
+    "decrypt",
+    "decryptString",
+    "encryptedString",
+    "importKeyFromMaster",
+    "masterKey",
+    "encryptionKeyName",
+    "deriveKey",
+    "hkdf",
+    "getKeyStringFromKey",
+    "getKeyFromKeyString",
+    "keyString",
+    "encryptJson",
+    "plaintextJson",
+    "decryptJson",
+    "encryptedJsonString",
+    "getPasswordBasedEncryptionKey",
+    "generateAndEncryptKeyEncryptionKey",
+    "keyEncryptionKey",
+    "keyEncryptionKeyRaw",
+    "RAW_KEY_TYPE",
+    "PRIME",
+    "hexString",
+    "halfHexStringLen",
+    "byteStartIndex",
+    "byte",
+    "byteAsInt",
+    "hexStringToArrayBuffer",
+    "GENERATOR",
+    "serverPublicKey",
+    "privateKey",
+    "diffieHellman",
+    "setPrivateKeyAndGenerateKeys",
+    "getSharedKey",
+    "otherPublicKey",
+    "sharedSecret",
+    "sharedRawKey",
+    "aesGcm",
+    "getSharedKeyWithServer",
+    "authApi",
+    "getServerPublicKey",
+    "KEY_PAIR_WILL_BE_USED_TO",
+    "PRIVATE_KEY_WILL_BE_USED_TO",
+    "PUBLIC_KEY_WILL_BE_USED_TO",
+    "ECDSA_PARAMS",
+    "namedCurve",
+    "ECDSA_SIGNING_PARAMS",
+    "getRawPublicKeyFromPublicKey",
+    "publicKey",
+    "getPublicKeyStringFromPublicKey",
+    "rawPublicKey",
+    "importEcdsaKeyEncryptionKeyFromMaster",
+    "sign",
+    "verify",
+    "signature",
+    "generateEcdsaKeyData",
+    "ecdsaKeyPair",
+    "generateKeyPair",
+    "ecdsaKeyEncryptionKeySalt",
+    "ecdsaKeyEncryptionKey",
+    "ecdsaRawPrivateKey",
+    "jwkPrivateKey",
+    "getRawPrivateKeyFromPrivateKey",
+    "encryptedEcdsaPrivateKey",
+    "ecdsaPrivateKey",
+    "ecdsaPublicKey",
+    "getPrivateKeyFromRawPrivateKey",
+    "rawPrivateKey",
+    "getPublicKeyFromRawPublicKey",
+    "getPublicKeyFromPrivateKey",
+    "key_ops",
+    "signString",
+    "verifyString",
+    "signatureString",
+    "ECDH_PARAMS",
+    "importEcdhKeyEncryptionKeyFromMaster",
+    "generateEcdhKeyData",
+    "ecdhKeyPair",
+    "ecdhKeyEncryptionKeySalt",
+    "ecdhKeyEncryptionKey",
+    "ecdhRawPrivateKey",
+    "encryptedEcdhPrivateKey",
+    "ecdhPublicKey",
+    "signedEcdhPublicKey",
+    "ecdsa",
+    "ecdhPrivateKey",
+    "computeSharedKeyEncryptionKey",
+    "otherEcdhPublicKey",
+    "public",
+    "KEY_WILL_BE_USED_TO_SIGN",
+    "KEY_WILL_BE_USED_TO_SIGN_AND_VERIFY",
+    "importKeyFromRawBits",
+    "rawBits",
+    "generateSeed",
+    "ecdh",
+    "hmac",
+    "passwordString",
+    "passwordHashAlgo",
+    "scryptJs",
+    "passwordArrayBuffer",
+    "passwordHash",
+    "getProtocolFromEndpoint",
+    "endpoint",
+    "getWsUrl",
+    "host",
+    "removeProtocolFromEndpoint",
+    "byteSizeOfString",
+    "objectHasOwnProperty",
+    "Queue",
+    "getLength",
+    "isEmpty",
+    "enqueue",
+    "dequeue",
+    "peek",
+    "newWorker",
+    "blobURL",
+    "URL",
+    "createObjectURL",
+    "Blob",
+    "compress",
+    "decompress",
+    "LZString",
+    "charAt",
+    "compressToBase64",
+    "_compress",
+    "decompressFromBase64",
+    "_decompress",
+    "compressToUTF16",
+    "decompressFromUTF16",
+    "compressToUint8Array",
+    "decompressFromUint8Array",
+    "forEach",
+    "compressToEncodedURIComponent",
+    "decompressFromEncodedURIComponent",
+    "position",
+    "worker",
+    "Worker",
+    "revokeObjectURL",
+    "terminate",
+    "uploadBundleChunk",
+    "userId",
+    "databaseId",
+    "seqNo",
+    "bundleId",
+    "chunkNo",
+    "clientId",
+    "uuidv4",
+    "RequestFailed",
+    "action",
+    "WebSocketError",
+    "init",
+    "resolveConnection",
+    "rejectConnection",
+    "changePassword",
+    "encryptionMode",
+    "pingTimeout",
+    "connected",
+    "connectionResolved",
+    "authToken",
+    "salts",
+    "userData",
+    "stripeData",
+    "requests",
+    "dbNameToHash",
+    "databases",
+    "databasesByDbId",
+    "shareTokenIdToDbId",
+    "connect",
+    "reconnectDelay",
+    "timeoutToOpenWebSocket",
+    "reconnecting",
+    "WebSocket",
+    "onopen",
+    "route",
+    "heartbeat",
+    "validationMessage",
+    "encryptedValidationMessage",
+    "setKeys",
+    "validateKey",
+    "DOMException",
+    "dbId",
+    "dbNameHash",
+    "database",
+    "isOwner",
+    "applyTransactionsQueue",
+    "startApplyingThisBatchOfTransactions",
+    "dbKey",
+    "plaintextDbKey",
+    "shareTokenEncryptedDbKey",
+    "dbKeyString",
+    "encryptionKey",
+    "decryptShareTokenEncryptedDbKey",
+    "shareTokenEncryptionKeySalt",
+    "writers",
+    "attributionEnabled",
+    "usernamesByUserId",
+    "waitForFullBundle",
+    "finishedWaitingForBundle",
+    "bundle",
+    "rebuildBundle",
+    "bundleSeqNo",
+    "encryptedBundleEncryptionKey",
+    "applyBundle",
+    "alert",
+    "newTransactions",
+    "transactionLog",
+    "applyTransactions",
+    "ownerId",
+    "buildBundle",
+    "startApplyingNextBatchInQueue",
+    "isFirstChunk",
+    "isLastChunk",
+    "bundleChunks",
+    "handleUpdateUser",
+    "updatedUser",
+    "requestId",
+    "request",
+    "promiseResolve",
+    "promiseReject",
+    "onclose",
+    "serviceRestart",
+    "clientDisconnected",
+    "wasClean",
+    "reconnect",
+    "reconnected",
+    "currentState",
+    "dbsToReopen",
+    "dbsToReopenById",
+    "reopenDatabases",
+    "openDatabasePromises",
+    "reopenAtSeqNo",
+    "lastSeqNo",
+    "shareTokenHkdfKey",
+    "shareTokenAuthData",
+    "authenticateShareToken",
+    "shareTokenId",
+    "all",
+    "localData",
+    "encryptionKeySalt",
+    "hmacKey",
+    "hmacKeySalt",
+    "rawEcdsaPrivateKey",
+    "rawEcdhPrivateKey",
+    "dhKeySalt",
+    "dhPrivateKey",
+    "ecdsaKeyWrapperSalt",
+    "ecdsaKeyData",
+    "ecdhKeyData",
+    "newEcKeyData",
+    "sharedKey",
+    "responseWatcher",
+    "watch",
+    "chunkArrayBuffer",
+    "bundleArrayBuffer",
+    "buffers",
+    "bufferByteLengths",
+    "map",
+    "totalByteLength",
+    "reduce",
+    "byteLengthSum",
+    "bufferByteLength",
+    "currentByteLength",
+    "byteLengths",
+    "appendBuffers",
+    "plaintextMetadata",
+    "bundleEncryptionKeyRaw",
+    "bundleEncryptionKey",
+    "decrypted",
+    "decryptedString",
+    "decompressedEncrypted",
+    "decompressedPlaintextMetdata",
+    "chunkNumber",
+    "batch",
+    "initResponse",
+    "orderedItems",
+    "items",
+    "itemsIndex",
+    "orderedItemsArray",
+    "itemId",
+    "prepareBundle",
+    "itemsPlaintextMetadata",
+    "bundledAtSeqNo",
+    "initBundleUpload",
+    "compressedBeforeEncryption",
+    "compressedPlaintextMetadataString",
+    "compressedArrayBufferBeforeEncryption",
+    "encryptedItems",
+    "numChunks",
+    "uploadBundle",
+    "buildUserResult",
+    "protectedProfile",
+    "usedTempPassword",
+    "passwordChanged",
+    "paymentsMode",
+    "cancelSubscriptionAt",
+    "subscriptionPlanId",
+    "trialExpirationDate",
+    "user",
+    "newSeedString",
+    "newKeyData",
+    "shareTokenAuthKeyData",
+    "shareTokenEcdsaPrivateKey",
+    "shareTokenEcdsaKeyEncryptionKeySalt",
+    "shareTokenEcdsaKeyEncryptionKey",
+    "shareTokenEncryptedEcdsaPrivateKey",
+    "shareTokenEcdsaPrivateKeyRaw",
+    "signedValidationMessage",
+    "REMEMBER_ME_OPTIONS",
+    "local",
+    "none",
+    "KEY_NOT_FOUND_ON_SIGN_IN",
+    "KEY_NOT_FOUND_ON_FORGOT_PASSWORD",
+    "_parseGenericErrors",
+    "location",
+    "origin",
+    "_connectWebSocket",
+    "_parseGenericUsernamePasswordError",
+    "_parseSessionLengthError",
+    "_parseUserResponseError",
+    "_calculateSessionLengthMs",
+    "_validateUsername",
+    "_validatePassword",
+    "_validateSignUpOrSignInInput",
+    "_generatePasswordToken",
+    "passwordSalt",
+    "passwordHkdfKey",
+    "passwordTokenSalt",
+    "passwordBasedEncryptionKeySalt",
+    "passwordBasedEncryptionKey",
+    "passwordEncryptedSeed",
+    "_generateKeys",
+    "_validateProfile",
+    "keyExists",
+    "_getPasswordSaltsOverWebSocket",
+    "_rebuildPasswordToken",
+    "signInWithSession",
+    "lastUsedUsername",
+    "currentSession",
+    "savedSeedString",
+    "Date",
+    "apiSignInWithSessionResult",
+    "_getMasterKeyAndKeyNotFoundMessage",
+    "signUp",
+    "_validateSignUpInput",
+    "_generateKeysAndSignUp",
+    "signOut",
+    "signIn",
+    "_getPasswordSaltsOverRestEndpoint",
+    "apiSignInResult",
+    "_signInWrapper",
+    "seedStringFromBackup",
+    "seedFromBackup",
+    "_getSeedStringFromPasswordBasedBackup",
+    "updateUser",
+    "currentPassword",
+    "newPassword",
+    "_validateUpdatedUserInput",
+    "startingUserId",
+    "newSeed",
+    "finalParams",
+    "currentPasswordSalts",
+    "newPasswordPromise",
+    "currentPasswordToken",
+    "_buildUpdateUserParams",
+    "rotateKeys",
+    "deleteUser",
+    "_checkSignedInState",
+    "forgotPassword",
+    "deleteEndToEndEncryptedData",
+    "forgotPasswordWs",
+    "encryptedForgotPasswordToken",
+    "forgotPasswordToken",
+    "signedForgotPasswordToken",
+    "ENCRYPTION_MODE_OPTIONS",
+    "UnverifiedTransaction",
+    "startSeqNo",
+    "txSeqNo",
+    "transactions",
+    "getStartSeqNo",
+    "getIndex",
+    "setIndex",
+    "promise",
+    "verifyPromise",
+    "addTransaction",
+    "transaction",
+    "Database",
+    "changeHandler",
+    "receivedMessage",
+    "onChange",
+    "_setChangeHandler",
+    "fileIds",
+    "operationIndex",
+    "unverifiedTransactions",
+    "Map",
+    "transactionCode",
+    "applyTransaction",
+    "getItems",
+    "itemIndex",
+    "file",
+    "fileEncryptionKeyString",
+    "fileEncryptionKey",
+    "fileId",
+    "record",
+    "createdBy",
+    "attributionFromTransaction",
+    "writeAccess",
+    "validateInsert",
+    "applyInsert",
+    "updatedBy",
+    "__v",
+    "validateUpdate",
+    "applyUpdate",
+    "deletedBy",
+    "validateUpdateOrDelete",
+    "applyDelete",
+    "operations",
+    "attribution",
+    "recordPromises",
+    "operation",
+    "records",
+    "validateBatchTransaction",
+    "applyBatchTransaction",
+    "fileEncryptionKeyRaw",
+    "fileMetadata",
+    "fileVersion",
+    "fileName",
+    "fileSize",
+    "fileType",
+    "fileUploadedBy",
+    "validateUploadFile",
+    "applyUploadFile",
+    "timestamp",
+    "createdByUserId",
+    "updatedByUserId",
+    "getItemVersionNumber",
+    "validateAccessPermissions",
+    "getFileVersionNumber",
+    "modifiedByUserId",
+    "userIsAuthorized",
+    "onlyCreator",
+    "users",
+    "itemExists",
+    "existingFile",
+    "uniqueItemIds",
+    "registerUnverifiedTransaction",
+    "unverifiedTransaction",
+    "unregisterUnverifiedTransaction",
+    "pendingTransaction",
+    "prop",
+    "userDeleted",
+    "shareTokenEncryptionKey",
+    "_idempotentOpenDatabase",
+    "currentReceivedMessage",
+    "_getShareTokenIdFromShareToken",
+    "shareTokenArrayBuffer",
+    "shareTokenIdArrayBuffer",
+    "_openDatabaseByShareToken",
+    "shareToken",
+    "shareTokenIdAndShareTokenSeed",
+    "shareTokenResult",
+    "shareTokenSeed",
+    "_getShareTokenIdAndShareTokenSeed",
+    "_openDatabaseByDatabaseId",
+    "_openDatabase",
+    "firstMessageFromWebSocket",
+    "newDatabaseParams",
+    "_openDatabaseByNameHash",
+    "_validateEncryptionMode",
+    "_validateDbInput",
+    "dbName",
+    "_validateDbName",
+    "allowVerifiedUsersDatabase",
+    "_validateDbId",
+    "openDatabase",
+    "openByDbNameHashParams",
+    "encryptedDbKey",
+    "encryptedDbName",
+    "fingerprint",
+    "_getMyFingerprint",
+    "_createDatabase",
+    "openByDbIdParams",
+    "openByShareToken",
+    "getOpenDb",
+    "insertItem",
+    "insertParams",
+    "_buildInsertParams",
+    "postTransaction",
+    "itemString",
+    "MAX_ITEM_KB",
+    "itemRecord",
+    "itemKey",
+    "encryptedItem",
+    "updateItem",
+    "updateParams",
+    "_buildUpdateParams",
+    "_buildDeleteParams",
+    "pendingTx",
+    "paramsWithDbData",
+    "sequenceNo",
+    "getResult",
+    "_uploadChunk",
+    "bytesTransferredObject",
+    "progressHandler",
+    "plaintextChunk",
+    "reader",
+    "FileReader",
+    "readAsArrayBuffer",
+    "blob",
+    "_readBlob",
+    "chunkEncryptionKey",
+    "encryptedChunkEncryptionKey",
+    "encryptedChunk",
+    "uploadChunkParams",
+    "uploadChunkRequest",
+    "bytesTransferred",
+    "_uploadChunkRequest",
+    "_getChunk",
+    "chunkRawBuffer",
+    "chunkEncryptionKeyRawBuffer",
+    "chunkEncryptionKeyRaw",
+    "_verifyUsersParent",
+    "verifiedUsers",
+    "databaseUser",
+    "senderUsername",
+    "verificationValues",
+    "sentSignature",
+    "receivedSignature",
+    "senderEcdsaPublicKey",
+    "verifiedFingerprint",
+    "parentRawEcdsaPublicKey",
+    "parentFingerprint",
+    "_getFingerprint",
+    "parentEcdsaPublicKey",
+    "expectedSentSignature",
+    "_signFingerprintWithDbKey",
+    "verifiedParentSent",
+    "recipientEcdsaPublicKey",
+    "expectedReceivedSignature",
+    "verifiedReceivedFromParent",
+    "_verifyReceivedDatabaseFromUser",
+    "myFingerprint",
+    "myEcdsaPublicKey",
+    "mySentSignature",
+    "myReceivedSignature",
+    "verifiedReceived",
+    "mySenderEcdsaPublicKey",
+    "_verifySentDatabaseToUser",
+    "verifiedSent",
+    "_buildDatabaseUserResult",
+    "databaseUsers",
+    "myUsername",
+    "mySenderUsername",
+    "sentDatabaseToUser",
+    "isChild",
+    "receivedDatabaseFromUser",
+    "verified",
+    "verifiedReceivedDatabaseFromUser",
+    "verifiedGrandparent",
+    "verifiedUsersParent",
+    "receivedFromUsername",
+    "_buildDatabaseResult",
+    "databaseNameHash",
+    "readOnly",
+    "resharingAllowed",
+    "wrappedDbKey",
+    "senderRawEcdsaPublicKey",
+    "ephemeralPublicKey",
+    "signedEphemeralPublicKey",
+    "sharedEncryptedDbKey",
+    "senderEphemeralEcdhPublicKey",
+    "sharedKeyEncryptionKey",
+    "senderFingerprint",
+    "_signDbKeyAndFingerprint",
+    "databaseUsersResponse",
+    "nextPageTokenLessThanUserId",
+    "nextPageTokenMoreThanUserId",
+    "_getDatabaseUsers",
+    "_databaseHasOwner",
+    "_getDatabase",
+    "requestParams",
+    "rawDbKey",
+    "dbKeyHash",
+    "signedFingerprint",
+    "_getDatabaseEncryptionKey",
+    "_shareDatabaseWithUsername",
+    "requireVerified",
+    "recipientPublicKey",
+    "_openVerifiedUsersDatabase",
+    "recipientRawEcdsaPublicKey",
+    "recipientFingerprint",
+    "verifiedRecipientFingerprint",
+    "foundOldFingerprint",
+    "verifiedUsersArray",
+    "verifiedUsername",
+    "_verifyDatabaseRecipientFingerprint",
+    "recipientEcdhPublicKey",
+    "ephemeralEcdhKeyPair",
+    "rawEphemeralEcdhPublicKey",
+    "signedEphemeralEcdhPublicKey",
+    "sharedEncryptedDbKeyString",
+    "_validateDbSharingInput",
+    "ecdsaPublicKeyHash",
+    "ecdsaRawPublicKey",
+    "getDatabases",
+    "databasesResponse",
+    "databaseResults",
+    "nextPageToken",
+    "filter",
+    "deleteItem",
+    "deleteParams",
+    "putTransaction",
+    "operationParamsPromises",
+    "operationParamsPromiseResults",
+    "operationParams",
+    "uploadFile",
+    "_validateUploadFile",
+    "File",
+    "currentVersion",
+    "_buildFileMetadata",
+    "encryptedFileEncryptionKey",
+    "encryptedFileMetadata",
+    "_completeFileUpload",
+    "getFile",
+    "range",
+    "_validateGetFileParams",
+    "chunks",
+    "startChunkNumber",
+    "endChunkNumber",
+    "_getByteRange",
+    "finalChunkNumber",
+    "_getFile",
+    "shareDatabase",
+    "shareTokenEncryptedDbKeyString",
+    "keyData",
+    "shareTokenPublicKey",
+    "shareTokenResponse",
+    "_getShareToken",
+    "modifyDatabasePermissions",
+    "revoke",
+    "getVerificationMessage",
+    "verificationMessage",
+    "btoa",
+    "_packVerificationMessage",
+    "verifyUser",
+    "atob",
+    "_unpackVerificationMessage",
+    "_validatePurchaseOrUpdate",
+    "stripeAccountId",
+    "successUrl",
+    "successUrlProtocol",
+    "cancelUrl",
+    "cancelUrlProtocol",
+    "_validateModifySubscriptionConditions",
+    "purchaseSubscription",
+    "stripeSessionId",
+    "stripePk",
+    "Stripe",
+    "stripeAccount",
+    "redirectToCheckout",
+    "cancelSubscription",
+    "resumeSubscription",
+    "updatePaymentMethod"
+  ],
+  "mappings": "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",
+  "file": "userbase.js",
+  "sourcesContent": [
+    " \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 27);\n",
+    "/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n",
+    "function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;",
+    "var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n  var i = buf && offset || 0;\n\n  if (typeof(options) == 'string') {\n    buf = options === 'binary' ? new Array(16) : null;\n    options = null;\n  }\n  options = options || {};\n\n  var rnds = options.random || (options.rng || rng)();\n\n  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n  rnds[6] = (rnds[6] & 0x0f) | 0x40;\n  rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n  // Copy bytes to buffer, if provided\n  if (buf) {\n    for (var ii = 0; ii < 16; ++ii) {\n      buf[i + ii] = rnds[ii];\n    }\n  }\n\n  return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n",
+    "var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n",
+    "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n",
+    "(function (module, exports) {\n  'use strict';\n\n  // Utils\n  function assert (val, msg) {\n    if (!val) throw new Error(msg || 'Assertion failed');\n  }\n\n  // Could use `inherits` module, but don't want to move from single file\n  // architecture yet.\n  function inherits (ctor, superCtor) {\n    ctor.super_ = superCtor;\n    var TempCtor = function () {};\n    TempCtor.prototype = superCtor.prototype;\n    ctor.prototype = new TempCtor();\n    ctor.prototype.constructor = ctor;\n  }\n\n  // BN\n\n  function BN (number, base, endian) {\n    if (BN.isBN(number)) {\n      return number;\n    }\n\n    this.negative = 0;\n    this.words = null;\n    this.length = 0;\n\n    // Reduction context\n    this.red = null;\n\n    if (number !== null) {\n      if (base === 'le' || base === 'be') {\n        endian = base;\n        base = 10;\n      }\n\n      this._init(number || 0, base || 10, endian || 'be');\n    }\n  }\n  if (typeof module === 'object') {\n    module.exports = BN;\n  } else {\n    exports.BN = BN;\n  }\n\n  BN.BN = BN;\n  BN.wordSize = 26;\n\n  var Buffer;\n  try {\n    Buffer = require('buffer').Buffer;\n  } catch (e) {\n  }\n\n  BN.isBN = function isBN (num) {\n    if (num instanceof BN) {\n      return true;\n    }\n\n    return num !== null && typeof num === 'object' &&\n      num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n  };\n\n  BN.max = function max (left, right) {\n    if (left.cmp(right) > 0) return left;\n    return right;\n  };\n\n  BN.min = function min (left, right) {\n    if (left.cmp(right) < 0) return left;\n    return right;\n  };\n\n  BN.prototype._init = function init (number, base, endian) {\n    if (typeof number === 'number') {\n      return this._initNumber(number, base, endian);\n    }\n\n    if (typeof number === 'object') {\n      return this._initArray(number, base, endian);\n    }\n\n    if (base === 'hex') {\n      base = 16;\n    }\n    assert(base === (base | 0) && base >= 2 && base <= 36);\n\n    number = number.toString().replace(/\\s+/g, '');\n    var start = 0;\n    if (number[0] === '-') {\n      start++;\n    }\n\n    if (base === 16) {\n      this._parseHex(number, start);\n    } else {\n      this._parseBase(number, base, start);\n    }\n\n    if (number[0] === '-') {\n      this.negative = 1;\n    }\n\n    this.strip();\n\n    if (endian !== 'le') return;\n\n    this._initArray(this.toArray(), base, endian);\n  };\n\n  BN.prototype._initNumber = function _initNumber (number, base, endian) {\n    if (number < 0) {\n      this.negative = 1;\n      number = -number;\n    }\n    if (number < 0x4000000) {\n      this.words = [ number & 0x3ffffff ];\n      this.length = 1;\n    } else if (number < 0x10000000000000) {\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff\n      ];\n      this.length = 2;\n    } else {\n      assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff,\n        1\n      ];\n      this.length = 3;\n    }\n\n    if (endian !== 'le') return;\n\n    // Reverse the bytes\n    this._initArray(this.toArray(), base, endian);\n  };\n\n  BN.prototype._initArray = function _initArray (number, base, endian) {\n    // Perhaps a Uint8Array\n    assert(typeof number.length === 'number');\n    if (number.length <= 0) {\n      this.words = [ 0 ];\n      this.length = 1;\n      return this;\n    }\n\n    this.length = Math.ceil(number.length / 3);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    var j, w;\n    var off = 0;\n    if (endian === 'be') {\n      for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n        w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    } else if (endian === 'le') {\n      for (i = 0, j = 0; i < number.length; i += 3) {\n        w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    }\n    return this.strip();\n  };\n\n  function parseHex (str, start, end) {\n    var r = 0;\n    var len = Math.min(str.length, end);\n    for (var i = start; i < len; i++) {\n      var c = str.charCodeAt(i) - 48;\n\n      r <<= 4;\n\n      // 'a' - 'f'\n      if (c >= 49 && c <= 54) {\n        r |= c - 49 + 0xa;\n\n      // 'A' - 'F'\n      } else if (c >= 17 && c <= 22) {\n        r |= c - 17 + 0xa;\n\n      // '0' - '9'\n      } else {\n        r |= c & 0xf;\n      }\n    }\n    return r;\n  }\n\n  BN.prototype._parseHex = function _parseHex (number, start) {\n    // Create possibly bigger array to ensure that it fits the number\n    this.length = Math.ceil((number.length - start) / 6);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    var j, w;\n    // Scan 24-bit chunks and add them to the number\n    var off = 0;\n    for (i = number.length - 6, j = 0; i >= start; i -= 6) {\n      w = parseHex(number, i, i + 6);\n      this.words[j] |= (w << off) & 0x3ffffff;\n      // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb\n      this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n      off += 24;\n      if (off >= 26) {\n        off -= 26;\n        j++;\n      }\n    }\n    if (i + 6 !== start) {\n      w = parseHex(number, start, i + 6);\n      this.words[j] |= (w << off) & 0x3ffffff;\n      this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n    }\n    this.strip();\n  };\n\n  function parseBase (str, start, end, mul) {\n    var r = 0;\n    var len = Math.min(str.length, end);\n    for (var i = start; i < len; i++) {\n      var c = str.charCodeAt(i) - 48;\n\n      r *= mul;\n\n      // 'a'\n      if (c >= 49) {\n        r += c - 49 + 0xa;\n\n      // 'A'\n      } else if (c >= 17) {\n        r += c - 17 + 0xa;\n\n      // '0' - '9'\n      } else {\n        r += c;\n      }\n    }\n    return r;\n  }\n\n  BN.prototype._parseBase = function _parseBase (number, base, start) {\n    // Initialize as zero\n    this.words = [ 0 ];\n    this.length = 1;\n\n    // Find length of limb in base\n    for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n      limbLen++;\n    }\n    limbLen--;\n    limbPow = (limbPow / base) | 0;\n\n    var total = number.length - start;\n    var mod = total % limbLen;\n    var end = Math.min(total, total - mod) + start;\n\n    var word = 0;\n    for (var i = start; i < end; i += limbLen) {\n      word = parseBase(number, i, i + limbLen, base);\n\n      this.imuln(limbPow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n\n    if (mod !== 0) {\n      var pow = 1;\n      word = parseBase(number, i, number.length, base);\n\n      for (i = 0; i < mod; i++) {\n        pow *= base;\n      }\n\n      this.imuln(pow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n  };\n\n  BN.prototype.copy = function copy (dest) {\n    dest.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      dest.words[i] = this.words[i];\n    }\n    dest.length = this.length;\n    dest.negative = this.negative;\n    dest.red = this.red;\n  };\n\n  BN.prototype.clone = function clone () {\n    var r = new BN(null);\n    this.copy(r);\n    return r;\n  };\n\n  BN.prototype._expand = function _expand (size) {\n    while (this.length < size) {\n      this.words[this.length++] = 0;\n    }\n    return this;\n  };\n\n  // Remove leading `0` from `this`\n  BN.prototype.strip = function strip () {\n    while (this.length > 1 && this.words[this.length - 1] === 0) {\n      this.length--;\n    }\n    return this._normSign();\n  };\n\n  BN.prototype._normSign = function _normSign () {\n    // -0 = 0\n    if (this.length === 1 && this.words[0] === 0) {\n      this.negative = 0;\n    }\n    return this;\n  };\n\n  BN.prototype.inspect = function inspect () {\n    return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n  };\n\n  /*\n\n  var zeros = [];\n  var groupSizes = [];\n  var groupBases = [];\n\n  var s = '';\n  var i = -1;\n  while (++i < BN.wordSize) {\n    zeros[i] = s;\n    s += '0';\n  }\n  groupSizes[0] = 0;\n  groupSizes[1] = 0;\n  groupBases[0] = 0;\n  groupBases[1] = 0;\n  var base = 2 - 1;\n  while (++base < 36 + 1) {\n    var groupSize = 0;\n    var groupBase = 1;\n    while (groupBase < (1 << BN.wordSize) / base) {\n      groupBase *= base;\n      groupSize += 1;\n    }\n    groupSizes[base] = groupSize;\n    groupBases[base] = groupBase;\n  }\n\n  */\n\n  var zeros = [\n    '',\n    '0',\n    '00',\n    '000',\n    '0000',\n    '00000',\n    '000000',\n    '0000000',\n    '00000000',\n    '000000000',\n    '0000000000',\n    '00000000000',\n    '000000000000',\n    '0000000000000',\n    '00000000000000',\n    '000000000000000',\n    '0000000000000000',\n    '00000000000000000',\n    '000000000000000000',\n    '0000000000000000000',\n    '00000000000000000000',\n    '000000000000000000000',\n    '0000000000000000000000',\n    '00000000000000000000000',\n    '000000000000000000000000',\n    '0000000000000000000000000'\n  ];\n\n  var groupSizes = [\n    0, 0,\n    25, 16, 12, 11, 10, 9, 8,\n    8, 7, 7, 7, 7, 6, 6,\n    6, 6, 6, 6, 6, 5, 5,\n    5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5\n  ];\n\n  var groupBases = [\n    0, 0,\n    33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n    43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n    16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n    6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n    24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n  ];\n\n  BN.prototype.toString = function toString (base, padding) {\n    base = base || 10;\n    padding = padding | 0 || 1;\n\n    var out;\n    if (base === 16 || base === 'hex') {\n      out = '';\n      var off = 0;\n      var carry = 0;\n      for (var i = 0; i < this.length; i++) {\n        var w = this.words[i];\n        var word = (((w << off) | carry) & 0xffffff).toString(16);\n        carry = (w >>> (24 - off)) & 0xffffff;\n        if (carry !== 0 || i !== this.length - 1) {\n          out = zeros[6 - word.length] + word + out;\n        } else {\n          out = word + out;\n        }\n        off += 2;\n        if (off >= 26) {\n          off -= 26;\n          i--;\n        }\n      }\n      if (carry !== 0) {\n        out = carry.toString(16) + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    if (base === (base | 0) && base >= 2 && base <= 36) {\n      // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n      var groupSize = groupSizes[base];\n      // var groupBase = Math.pow(base, groupSize);\n      var groupBase = groupBases[base];\n      out = '';\n      var c = this.clone();\n      c.negative = 0;\n      while (!c.isZero()) {\n        var r = c.modn(groupBase).toString(base);\n        c = c.idivn(groupBase);\n\n        if (!c.isZero()) {\n          out = zeros[groupSize - r.length] + r + out;\n        } else {\n          out = r + out;\n        }\n      }\n      if (this.isZero()) {\n        out = '0' + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    assert(false, 'Base should be between 2 and 36');\n  };\n\n  BN.prototype.toNumber = function toNumber () {\n    var ret = this.words[0];\n    if (this.length === 2) {\n      ret += this.words[1] * 0x4000000;\n    } else if (this.length === 3 && this.words[2] === 0x01) {\n      // NOTE: at this stage it is known that the top bit is set\n      ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n    } else if (this.length > 2) {\n      assert(false, 'Number can only safely store up to 53 bits');\n    }\n    return (this.negative !== 0) ? -ret : ret;\n  };\n\n  BN.prototype.toJSON = function toJSON () {\n    return this.toString(16);\n  };\n\n  BN.prototype.toBuffer = function toBuffer (endian, length) {\n    assert(typeof Buffer !== 'undefined');\n    return this.toArrayLike(Buffer, endian, length);\n  };\n\n  BN.prototype.toArray = function toArray (endian, length) {\n    return this.toArrayLike(Array, endian, length);\n  };\n\n  BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n    var byteLength = this.byteLength();\n    var reqLength = length || Math.max(1, byteLength);\n    assert(byteLength <= reqLength, 'byte array longer than desired length');\n    assert(reqLength > 0, 'Requested array length <= 0');\n\n    this.strip();\n    var littleEndian = endian === 'le';\n    var res = new ArrayType(reqLength);\n\n    var b, i;\n    var q = this.clone();\n    if (!littleEndian) {\n      // Assume big-endian\n      for (i = 0; i < reqLength - byteLength; i++) {\n        res[i] = 0;\n      }\n\n      for (i = 0; !q.isZero(); i++) {\n        b = q.andln(0xff);\n        q.iushrn(8);\n\n        res[reqLength - i - 1] = b;\n      }\n    } else {\n      for (i = 0; !q.isZero(); i++) {\n        b = q.andln(0xff);\n        q.iushrn(8);\n\n        res[i] = b;\n      }\n\n      for (; i < reqLength; i++) {\n        res[i] = 0;\n      }\n    }\n\n    return res;\n  };\n\n  if (Math.clz32) {\n    BN.prototype._countBits = function _countBits (w) {\n      return 32 - Math.clz32(w);\n    };\n  } else {\n    BN.prototype._countBits = function _countBits (w) {\n      var t = w;\n      var r = 0;\n      if (t >= 0x1000) {\n        r += 13;\n        t >>>= 13;\n      }\n      if (t >= 0x40) {\n        r += 7;\n        t >>>= 7;\n      }\n      if (t >= 0x8) {\n        r += 4;\n        t >>>= 4;\n      }\n      if (t >= 0x02) {\n        r += 2;\n        t >>>= 2;\n      }\n      return r + t;\n    };\n  }\n\n  BN.prototype._zeroBits = function _zeroBits (w) {\n    // Short-cut\n    if (w === 0) return 26;\n\n    var t = w;\n    var r = 0;\n    if ((t & 0x1fff) === 0) {\n      r += 13;\n      t >>>= 13;\n    }\n    if ((t & 0x7f) === 0) {\n      r += 7;\n      t >>>= 7;\n    }\n    if ((t & 0xf) === 0) {\n      r += 4;\n      t >>>= 4;\n    }\n    if ((t & 0x3) === 0) {\n      r += 2;\n      t >>>= 2;\n    }\n    if ((t & 0x1) === 0) {\n      r++;\n    }\n    return r;\n  };\n\n  // Return number of used bits in a BN\n  BN.prototype.bitLength = function bitLength () {\n    var w = this.words[this.length - 1];\n    var hi = this._countBits(w);\n    return (this.length - 1) * 26 + hi;\n  };\n\n  function toBitArray (num) {\n    var w = new Array(num.bitLength());\n\n    for (var bit = 0; bit < w.length; bit++) {\n      var off = (bit / 26) | 0;\n      var wbit = bit % 26;\n\n      w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n    }\n\n    return w;\n  }\n\n  // Number of trailing zero bits\n  BN.prototype.zeroBits = function zeroBits () {\n    if (this.isZero()) return 0;\n\n    var r = 0;\n    for (var i = 0; i < this.length; i++) {\n      var b = this._zeroBits(this.words[i]);\n      r += b;\n      if (b !== 26) break;\n    }\n    return r;\n  };\n\n  BN.prototype.byteLength = function byteLength () {\n    return Math.ceil(this.bitLength() / 8);\n  };\n\n  BN.prototype.toTwos = function toTwos (width) {\n    if (this.negative !== 0) {\n      return this.abs().inotn(width).iaddn(1);\n    }\n    return this.clone();\n  };\n\n  BN.prototype.fromTwos = function fromTwos (width) {\n    if (this.testn(width - 1)) {\n      return this.notn(width).iaddn(1).ineg();\n    }\n    return this.clone();\n  };\n\n  BN.prototype.isNeg = function isNeg () {\n    return this.negative !== 0;\n  };\n\n  // Return negative clone of `this`\n  BN.prototype.neg = function neg () {\n    return this.clone().ineg();\n  };\n\n  BN.prototype.ineg = function ineg () {\n    if (!this.isZero()) {\n      this.negative ^= 1;\n    }\n\n    return this;\n  };\n\n  // Or `num` with `this` in-place\n  BN.prototype.iuor = function iuor (num) {\n    while (this.length < num.length) {\n      this.words[this.length++] = 0;\n    }\n\n    for (var i = 0; i < num.length; i++) {\n      this.words[i] = this.words[i] | num.words[i];\n    }\n\n    return this.strip();\n  };\n\n  BN.prototype.ior = function ior (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuor(num);\n  };\n\n  // Or `num` with `this`\n  BN.prototype.or = function or (num) {\n    if (this.length > num.length) return this.clone().ior(num);\n    return num.clone().ior(this);\n  };\n\n  BN.prototype.uor = function uor (num) {\n    if (this.length > num.length) return this.clone().iuor(num);\n    return num.clone().iuor(this);\n  };\n\n  // And `num` with `this` in-place\n  BN.prototype.iuand = function iuand (num) {\n    // b = min-length(num, this)\n    var b;\n    if (this.length > num.length) {\n      b = num;\n    } else {\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = this.words[i] & num.words[i];\n    }\n\n    this.length = b.length;\n\n    return this.strip();\n  };\n\n  BN.prototype.iand = function iand (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuand(num);\n  };\n\n  // And `num` with `this`\n  BN.prototype.and = function and (num) {\n    if (this.length > num.length) return this.clone().iand(num);\n    return num.clone().iand(this);\n  };\n\n  BN.prototype.uand = function uand (num) {\n    if (this.length > num.length) return this.clone().iuand(num);\n    return num.clone().iuand(this);\n  };\n\n  // Xor `num` with `this` in-place\n  BN.prototype.iuxor = function iuxor (num) {\n    // a.length > b.length\n    var a;\n    var b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = a.words[i] ^ b.words[i];\n    }\n\n    if (this !== a) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = a.length;\n\n    return this.strip();\n  };\n\n  BN.prototype.ixor = function ixor (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuxor(num);\n  };\n\n  // Xor `num` with `this`\n  BN.prototype.xor = function xor (num) {\n    if (this.length > num.length) return this.clone().ixor(num);\n    return num.clone().ixor(this);\n  };\n\n  BN.prototype.uxor = function uxor (num) {\n    if (this.length > num.length) return this.clone().iuxor(num);\n    return num.clone().iuxor(this);\n  };\n\n  // Not ``this`` with ``width`` bitwidth\n  BN.prototype.inotn = function inotn (width) {\n    assert(typeof width === 'number' && width >= 0);\n\n    var bytesNeeded = Math.ceil(width / 26) | 0;\n    var bitsLeft = width % 26;\n\n    // Extend the buffer with leading zeroes\n    this._expand(bytesNeeded);\n\n    if (bitsLeft > 0) {\n      bytesNeeded--;\n    }\n\n    // Handle complete words\n    for (var i = 0; i < bytesNeeded; i++) {\n      this.words[i] = ~this.words[i] & 0x3ffffff;\n    }\n\n    // Handle the residue\n    if (bitsLeft > 0) {\n      this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n    }\n\n    // And remove leading zeroes\n    return this.strip();\n  };\n\n  BN.prototype.notn = function notn (width) {\n    return this.clone().inotn(width);\n  };\n\n  // Set `bit` of `this`\n  BN.prototype.setn = function setn (bit, val) {\n    assert(typeof bit === 'number' && bit >= 0);\n\n    var off = (bit / 26) | 0;\n    var wbit = bit % 26;\n\n    this._expand(off + 1);\n\n    if (val) {\n      this.words[off] = this.words[off] | (1 << wbit);\n    } else {\n      this.words[off] = this.words[off] & ~(1 << wbit);\n    }\n\n    return this.strip();\n  };\n\n  // Add `num` to `this` in-place\n  BN.prototype.iadd = function iadd (num) {\n    var r;\n\n    // negative + positive\n    if (this.negative !== 0 && num.negative === 0) {\n      this.negative = 0;\n      r = this.isub(num);\n      this.negative ^= 1;\n      return this._normSign();\n\n    // positive + negative\n    } else if (this.negative === 0 && num.negative !== 0) {\n      num.negative = 0;\n      r = this.isub(num);\n      num.negative = 1;\n      return r._normSign();\n    }\n\n    // a.length > b.length\n    var a, b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n\n    this.length = a.length;\n    if (carry !== 0) {\n      this.words[this.length] = carry;\n      this.length++;\n    // Copy the rest of the words\n    } else if (a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    return this;\n  };\n\n  // Add `num` to `this`\n  BN.prototype.add = function add (num) {\n    var res;\n    if (num.negative !== 0 && this.negative === 0) {\n      num.negative = 0;\n      res = this.sub(num);\n      num.negative ^= 1;\n      return res;\n    } else if (num.negative === 0 && this.negative !== 0) {\n      this.negative = 0;\n      res = num.sub(this);\n      this.negative = 1;\n      return res;\n    }\n\n    if (this.length > num.length) return this.clone().iadd(num);\n\n    return num.clone().iadd(this);\n  };\n\n  // Subtract `num` from `this` in-place\n  BN.prototype.isub = function isub (num) {\n    // this - (-num) = this + num\n    if (num.negative !== 0) {\n      num.negative = 0;\n      var r = this.iadd(num);\n      num.negative = 1;\n      return r._normSign();\n\n    // -this - num = -(this + num)\n    } else if (this.negative !== 0) {\n      this.negative = 0;\n      this.iadd(num);\n      this.negative = 1;\n      return this._normSign();\n    }\n\n    // At this point both numbers are positive\n    var cmp = this.cmp(num);\n\n    // Optimization - zeroify\n    if (cmp === 0) {\n      this.negative = 0;\n      this.length = 1;\n      this.words[0] = 0;\n      return this;\n    }\n\n    // a > b\n    var a, b;\n    if (cmp > 0) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n\n    // Copy rest of the words\n    if (carry === 0 && i < a.length && a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = Math.max(this.length, i);\n\n    if (a !== this) {\n      this.negative = 1;\n    }\n\n    return this.strip();\n  };\n\n  // Subtract `num` from `this`\n  BN.prototype.sub = function sub (num) {\n    return this.clone().isub(num);\n  };\n\n  function smallMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    var len = (self.length + num.length) | 0;\n    out.length = len;\n    len = (len - 1) | 0;\n\n    // Peel one iteration (compiler can't do it, because of code complexity)\n    var a = self.words[0] | 0;\n    var b = num.words[0] | 0;\n    var r = a * b;\n\n    var lo = r & 0x3ffffff;\n    var carry = (r / 0x4000000) | 0;\n    out.words[0] = lo;\n\n    for (var k = 1; k < len; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = carry >>> 26;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = (k - j) | 0;\n        a = self.words[i] | 0;\n        b = num.words[j] | 0;\n        r = a * b + rword;\n        ncarry += (r / 0x4000000) | 0;\n        rword = r & 0x3ffffff;\n      }\n      out.words[k] = rword | 0;\n      carry = ncarry | 0;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry | 0;\n    } else {\n      out.length--;\n    }\n\n    return out.strip();\n  }\n\n  // TODO(indutny): it may be reasonable to omit it for users who don't need\n  // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n  // multiplication (like elliptic secp256k1).\n  var comb10MulTo = function comb10MulTo (self, num, out) {\n    var a = self.words;\n    var b = num.words;\n    var o = out.words;\n    var c = 0;\n    var lo;\n    var mid;\n    var hi;\n    var a0 = a[0] | 0;\n    var al0 = a0 & 0x1fff;\n    var ah0 = a0 >>> 13;\n    var a1 = a[1] | 0;\n    var al1 = a1 & 0x1fff;\n    var ah1 = a1 >>> 13;\n    var a2 = a[2] | 0;\n    var al2 = a2 & 0x1fff;\n    var ah2 = a2 >>> 13;\n    var a3 = a[3] | 0;\n    var al3 = a3 & 0x1fff;\n    var ah3 = a3 >>> 13;\n    var a4 = a[4] | 0;\n    var al4 = a4 & 0x1fff;\n    var ah4 = a4 >>> 13;\n    var a5 = a[5] | 0;\n    var al5 = a5 & 0x1fff;\n    var ah5 = a5 >>> 13;\n    var a6 = a[6] | 0;\n    var al6 = a6 & 0x1fff;\n    var ah6 = a6 >>> 13;\n    var a7 = a[7] | 0;\n    var al7 = a7 & 0x1fff;\n    var ah7 = a7 >>> 13;\n    var a8 = a[8] | 0;\n    var al8 = a8 & 0x1fff;\n    var ah8 = a8 >>> 13;\n    var a9 = a[9] | 0;\n    var al9 = a9 & 0x1fff;\n    var ah9 = a9 >>> 13;\n    var b0 = b[0] | 0;\n    var bl0 = b0 & 0x1fff;\n    var bh0 = b0 >>> 13;\n    var b1 = b[1] | 0;\n    var bl1 = b1 & 0x1fff;\n    var bh1 = b1 >>> 13;\n    var b2 = b[2] | 0;\n    var bl2 = b2 & 0x1fff;\n    var bh2 = b2 >>> 13;\n    var b3 = b[3] | 0;\n    var bl3 = b3 & 0x1fff;\n    var bh3 = b3 >>> 13;\n    var b4 = b[4] | 0;\n    var bl4 = b4 & 0x1fff;\n    var bh4 = b4 >>> 13;\n    var b5 = b[5] | 0;\n    var bl5 = b5 & 0x1fff;\n    var bh5 = b5 >>> 13;\n    var b6 = b[6] | 0;\n    var bl6 = b6 & 0x1fff;\n    var bh6 = b6 >>> 13;\n    var b7 = b[7] | 0;\n    var bl7 = b7 & 0x1fff;\n    var bh7 = b7 >>> 13;\n    var b8 = b[8] | 0;\n    var bl8 = b8 & 0x1fff;\n    var bh8 = b8 >>> 13;\n    var b9 = b[9] | 0;\n    var bl9 = b9 & 0x1fff;\n    var bh9 = b9 >>> 13;\n\n    out.negative = self.negative ^ num.negative;\n    out.length = 19;\n    /* k = 0 */\n    lo = Math.imul(al0, bl0);\n    mid = Math.imul(al0, bh0);\n    mid = (mid + Math.imul(ah0, bl0)) | 0;\n    hi = Math.imul(ah0, bh0);\n    var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n    w0 &= 0x3ffffff;\n    /* k = 1 */\n    lo = Math.imul(al1, bl0);\n    mid = Math.imul(al1, bh0);\n    mid = (mid + Math.imul(ah1, bl0)) | 0;\n    hi = Math.imul(ah1, bh0);\n    lo = (lo + Math.imul(al0, bl1)) | 0;\n    mid = (mid + Math.imul(al0, bh1)) | 0;\n    mid = (mid + Math.imul(ah0, bl1)) | 0;\n    hi = (hi + Math.imul(ah0, bh1)) | 0;\n    var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n    w1 &= 0x3ffffff;\n    /* k = 2 */\n    lo = Math.imul(al2, bl0);\n    mid = Math.imul(al2, bh0);\n    mid = (mid + Math.imul(ah2, bl0)) | 0;\n    hi = Math.imul(ah2, bh0);\n    lo = (lo + Math.imul(al1, bl1)) | 0;\n    mid = (mid + Math.imul(al1, bh1)) | 0;\n    mid = (mid + Math.imul(ah1, bl1)) | 0;\n    hi = (hi + Math.imul(ah1, bh1)) | 0;\n    lo = (lo + Math.imul(al0, bl2)) | 0;\n    mid = (mid + Math.imul(al0, bh2)) | 0;\n    mid = (mid + Math.imul(ah0, bl2)) | 0;\n    hi = (hi + Math.imul(ah0, bh2)) | 0;\n    var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n    w2 &= 0x3ffffff;\n    /* k = 3 */\n    lo = Math.imul(al3, bl0);\n    mid = Math.imul(al3, bh0);\n    mid = (mid + Math.imul(ah3, bl0)) | 0;\n    hi = Math.imul(ah3, bh0);\n    lo = (lo + Math.imul(al2, bl1)) | 0;\n    mid = (mid + Math.imul(al2, bh1)) | 0;\n    mid = (mid + Math.imul(ah2, bl1)) | 0;\n    hi = (hi + Math.imul(ah2, bh1)) | 0;\n    lo = (lo + Math.imul(al1, bl2)) | 0;\n    mid = (mid + Math.imul(al1, bh2)) | 0;\n    mid = (mid + Math.imul(ah1, bl2)) | 0;\n    hi = (hi + Math.imul(ah1, bh2)) | 0;\n    lo = (lo + Math.imul(al0, bl3)) | 0;\n    mid = (mid + Math.imul(al0, bh3)) | 0;\n    mid = (mid + Math.imul(ah0, bl3)) | 0;\n    hi = (hi + Math.imul(ah0, bh3)) | 0;\n    var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n    w3 &= 0x3ffffff;\n    /* k = 4 */\n    lo = Math.imul(al4, bl0);\n    mid = Math.imul(al4, bh0);\n    mid = (mid + Math.imul(ah4, bl0)) | 0;\n    hi = Math.imul(ah4, bh0);\n    lo = (lo + Math.imul(al3, bl1)) | 0;\n    mid = (mid + Math.imul(al3, bh1)) | 0;\n    mid = (mid + Math.imul(ah3, bl1)) | 0;\n    hi = (hi + Math.imul(ah3, bh1)) | 0;\n    lo = (lo + Math.imul(al2, bl2)) | 0;\n    mid = (mid + Math.imul(al2, bh2)) | 0;\n    mid = (mid + Math.imul(ah2, bl2)) | 0;\n    hi = (hi + Math.imul(ah2, bh2)) | 0;\n    lo = (lo + Math.imul(al1, bl3)) | 0;\n    mid = (mid + Math.imul(al1, bh3)) | 0;\n    mid = (mid + Math.imul(ah1, bl3)) | 0;\n    hi = (hi + Math.imul(ah1, bh3)) | 0;\n    lo = (lo + Math.imul(al0, bl4)) | 0;\n    mid = (mid + Math.imul(al0, bh4)) | 0;\n    mid = (mid + Math.imul(ah0, bl4)) | 0;\n    hi = (hi + Math.imul(ah0, bh4)) | 0;\n    var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n    w4 &= 0x3ffffff;\n    /* k = 5 */\n    lo = Math.imul(al5, bl0);\n    mid = Math.imul(al5, bh0);\n    mid = (mid + Math.imul(ah5, bl0)) | 0;\n    hi = Math.imul(ah5, bh0);\n    lo = (lo + Math.imul(al4, bl1)) | 0;\n    mid = (mid + Math.imul(al4, bh1)) | 0;\n    mid = (mid + Math.imul(ah4, bl1)) | 0;\n    hi = (hi + Math.imul(ah4, bh1)) | 0;\n    lo = (lo + Math.imul(al3, bl2)) | 0;\n    mid = (mid + Math.imul(al3, bh2)) | 0;\n    mid = (mid + Math.imul(ah3, bl2)) | 0;\n    hi = (hi + Math.imul(ah3, bh2)) | 0;\n    lo = (lo + Math.imul(al2, bl3)) | 0;\n    mid = (mid + Math.imul(al2, bh3)) | 0;\n    mid = (mid + Math.imul(ah2, bl3)) | 0;\n    hi = (hi + Math.imul(ah2, bh3)) | 0;\n    lo = (lo + Math.imul(al1, bl4)) | 0;\n    mid = (mid + Math.imul(al1, bh4)) | 0;\n    mid = (mid + Math.imul(ah1, bl4)) | 0;\n    hi = (hi + Math.imul(ah1, bh4)) | 0;\n    lo = (lo + Math.imul(al0, bl5)) | 0;\n    mid = (mid + Math.imul(al0, bh5)) | 0;\n    mid = (mid + Math.imul(ah0, bl5)) | 0;\n    hi = (hi + Math.imul(ah0, bh5)) | 0;\n    var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n    w5 &= 0x3ffffff;\n    /* k = 6 */\n    lo = Math.imul(al6, bl0);\n    mid = Math.imul(al6, bh0);\n    mid = (mid + Math.imul(ah6, bl0)) | 0;\n    hi = Math.imul(ah6, bh0);\n    lo = (lo + Math.imul(al5, bl1)) | 0;\n    mid = (mid + Math.imul(al5, bh1)) | 0;\n    mid = (mid + Math.imul(ah5, bl1)) | 0;\n    hi = (hi + Math.imul(ah5, bh1)) | 0;\n    lo = (lo + Math.imul(al4, bl2)) | 0;\n    mid = (mid + Math.imul(al4, bh2)) | 0;\n    mid = (mid + Math.imul(ah4, bl2)) | 0;\n    hi = (hi + Math.imul(ah4, bh2)) | 0;\n    lo = (lo + Math.imul(al3, bl3)) | 0;\n    mid = (mid + Math.imul(al3, bh3)) | 0;\n    mid = (mid + Math.imul(ah3, bl3)) | 0;\n    hi = (hi + Math.imul(ah3, bh3)) | 0;\n    lo = (lo + Math.imul(al2, bl4)) | 0;\n    mid = (mid + Math.imul(al2, bh4)) | 0;\n    mid = (mid + Math.imul(ah2, bl4)) | 0;\n    hi = (hi + Math.imul(ah2, bh4)) | 0;\n    lo = (lo + Math.imul(al1, bl5)) | 0;\n    mid = (mid + Math.imul(al1, bh5)) | 0;\n    mid = (mid + Math.imul(ah1, bl5)) | 0;\n    hi = (hi + Math.imul(ah1, bh5)) | 0;\n    lo = (lo + Math.imul(al0, bl6)) | 0;\n    mid = (mid + Math.imul(al0, bh6)) | 0;\n    mid = (mid + Math.imul(ah0, bl6)) | 0;\n    hi = (hi + Math.imul(ah0, bh6)) | 0;\n    var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n    w6 &= 0x3ffffff;\n    /* k = 7 */\n    lo = Math.imul(al7, bl0);\n    mid = Math.imul(al7, bh0);\n    mid = (mid + Math.imul(ah7, bl0)) | 0;\n    hi = Math.imul(ah7, bh0);\n    lo = (lo + Math.imul(al6, bl1)) | 0;\n    mid = (mid + Math.imul(al6, bh1)) | 0;\n    mid = (mid + Math.imul(ah6, bl1)) | 0;\n    hi = (hi + Math.imul(ah6, bh1)) | 0;\n    lo = (lo + Math.imul(al5, bl2)) | 0;\n    mid = (mid + Math.imul(al5, bh2)) | 0;\n    mid = (mid + Math.imul(ah5, bl2)) | 0;\n    hi = (hi + Math.imul(ah5, bh2)) | 0;\n    lo = (lo + Math.imul(al4, bl3)) | 0;\n    mid = (mid + Math.imul(al4, bh3)) | 0;\n    mid = (mid + Math.imul(ah4, bl3)) | 0;\n    hi = (hi + Math.imul(ah4, bh3)) | 0;\n    lo = (lo + Math.imul(al3, bl4)) | 0;\n    mid = (mid + Math.imul(al3, bh4)) | 0;\n    mid = (mid + Math.imul(ah3, bl4)) | 0;\n    hi = (hi + Math.imul(ah3, bh4)) | 0;\n    lo = (lo + Math.imul(al2, bl5)) | 0;\n    mid = (mid + Math.imul(al2, bh5)) | 0;\n    mid = (mid + Math.imul(ah2, bl5)) | 0;\n    hi = (hi + Math.imul(ah2, bh5)) | 0;\n    lo = (lo + Math.imul(al1, bl6)) | 0;\n    mid = (mid + Math.imul(al1, bh6)) | 0;\n    mid = (mid + Math.imul(ah1, bl6)) | 0;\n    hi = (hi + Math.imul(ah1, bh6)) | 0;\n    lo = (lo + Math.imul(al0, bl7)) | 0;\n    mid = (mid + Math.imul(al0, bh7)) | 0;\n    mid = (mid + Math.imul(ah0, bl7)) | 0;\n    hi = (hi + Math.imul(ah0, bh7)) | 0;\n    var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n    w7 &= 0x3ffffff;\n    /* k = 8 */\n    lo = Math.imul(al8, bl0);\n    mid = Math.imul(al8, bh0);\n    mid = (mid + Math.imul(ah8, bl0)) | 0;\n    hi = Math.imul(ah8, bh0);\n    lo = (lo + Math.imul(al7, bl1)) | 0;\n    mid = (mid + Math.imul(al7, bh1)) | 0;\n    mid = (mid + Math.imul(ah7, bl1)) | 0;\n    hi = (hi + Math.imul(ah7, bh1)) | 0;\n    lo = (lo + Math.imul(al6, bl2)) | 0;\n    mid = (mid + Math.imul(al6, bh2)) | 0;\n    mid = (mid + Math.imul(ah6, bl2)) | 0;\n    hi = (hi + Math.imul(ah6, bh2)) | 0;\n    lo = (lo + Math.imul(al5, bl3)) | 0;\n    mid = (mid + Math.imul(al5, bh3)) | 0;\n    mid = (mid + Math.imul(ah5, bl3)) | 0;\n    hi = (hi + Math.imul(ah5, bh3)) | 0;\n    lo = (lo + Math.imul(al4, bl4)) | 0;\n    mid = (mid + Math.imul(al4, bh4)) | 0;\n    mid = (mid + Math.imul(ah4, bl4)) | 0;\n    hi = (hi + Math.imul(ah4, bh4)) | 0;\n    lo = (lo + Math.imul(al3, bl5)) | 0;\n    mid = (mid + Math.imul(al3, bh5)) | 0;\n    mid = (mid + Math.imul(ah3, bl5)) | 0;\n    hi = (hi + Math.imul(ah3, bh5)) | 0;\n    lo = (lo + Math.imul(al2, bl6)) | 0;\n    mid = (mid + Math.imul(al2, bh6)) | 0;\n    mid = (mid + Math.imul(ah2, bl6)) | 0;\n    hi = (hi + Math.imul(ah2, bh6)) | 0;\n    lo = (lo + Math.imul(al1, bl7)) | 0;\n    mid = (mid + Math.imul(al1, bh7)) | 0;\n    mid = (mid + Math.imul(ah1, bl7)) | 0;\n    hi = (hi + Math.imul(ah1, bh7)) | 0;\n    lo = (lo + Math.imul(al0, bl8)) | 0;\n    mid = (mid + Math.imul(al0, bh8)) | 0;\n    mid = (mid + Math.imul(ah0, bl8)) | 0;\n    hi = (hi + Math.imul(ah0, bh8)) | 0;\n    var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n    w8 &= 0x3ffffff;\n    /* k = 9 */\n    lo = Math.imul(al9, bl0);\n    mid = Math.imul(al9, bh0);\n    mid = (mid + Math.imul(ah9, bl0)) | 0;\n    hi = Math.imul(ah9, bh0);\n    lo = (lo + Math.imul(al8, bl1)) | 0;\n    mid = (mid + Math.imul(al8, bh1)) | 0;\n    mid = (mid + Math.imul(ah8, bl1)) | 0;\n    hi = (hi + Math.imul(ah8, bh1)) | 0;\n    lo = (lo + Math.imul(al7, bl2)) | 0;\n    mid = (mid + Math.imul(al7, bh2)) | 0;\n    mid = (mid + Math.imul(ah7, bl2)) | 0;\n    hi = (hi + Math.imul(ah7, bh2)) | 0;\n    lo = (lo + Math.imul(al6, bl3)) | 0;\n    mid = (mid + Math.imul(al6, bh3)) | 0;\n    mid = (mid + Math.imul(ah6, bl3)) | 0;\n    hi = (hi + Math.imul(ah6, bh3)) | 0;\n    lo = (lo + Math.imul(al5, bl4)) | 0;\n    mid = (mid + Math.imul(al5, bh4)) | 0;\n    mid = (mid + Math.imul(ah5, bl4)) | 0;\n    hi = (hi + Math.imul(ah5, bh4)) | 0;\n    lo = (lo + Math.imul(al4, bl5)) | 0;\n    mid = (mid + Math.imul(al4, bh5)) | 0;\n    mid = (mid + Math.imul(ah4, bl5)) | 0;\n    hi = (hi + Math.imul(ah4, bh5)) | 0;\n    lo = (lo + Math.imul(al3, bl6)) | 0;\n    mid = (mid + Math.imul(al3, bh6)) | 0;\n    mid = (mid + Math.imul(ah3, bl6)) | 0;\n    hi = (hi + Math.imul(ah3, bh6)) | 0;\n    lo = (lo + Math.imul(al2, bl7)) | 0;\n    mid = (mid + Math.imul(al2, bh7)) | 0;\n    mid = (mid + Math.imul(ah2, bl7)) | 0;\n    hi = (hi + Math.imul(ah2, bh7)) | 0;\n    lo = (lo + Math.imul(al1, bl8)) | 0;\n    mid = (mid + Math.imul(al1, bh8)) | 0;\n    mid = (mid + Math.imul(ah1, bl8)) | 0;\n    hi = (hi + Math.imul(ah1, bh8)) | 0;\n    lo = (lo + Math.imul(al0, bl9)) | 0;\n    mid = (mid + Math.imul(al0, bh9)) | 0;\n    mid = (mid + Math.imul(ah0, bl9)) | 0;\n    hi = (hi + Math.imul(ah0, bh9)) | 0;\n    var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n    w9 &= 0x3ffffff;\n    /* k = 10 */\n    lo = Math.imul(al9, bl1);\n    mid = Math.imul(al9, bh1);\n    mid = (mid + Math.imul(ah9, bl1)) | 0;\n    hi = Math.imul(ah9, bh1);\n    lo = (lo + Math.imul(al8, bl2)) | 0;\n    mid = (mid + Math.imul(al8, bh2)) | 0;\n    mid = (mid + Math.imul(ah8, bl2)) | 0;\n    hi = (hi + Math.imul(ah8, bh2)) | 0;\n    lo = (lo + Math.imul(al7, bl3)) | 0;\n    mid = (mid + Math.imul(al7, bh3)) | 0;\n    mid = (mid + Math.imul(ah7, bl3)) | 0;\n    hi = (hi + Math.imul(ah7, bh3)) | 0;\n    lo = (lo + Math.imul(al6, bl4)) | 0;\n    mid = (mid + Math.imul(al6, bh4)) | 0;\n    mid = (mid + Math.imul(ah6, bl4)) | 0;\n    hi = (hi + Math.imul(ah6, bh4)) | 0;\n    lo = (lo + Math.imul(al5, bl5)) | 0;\n    mid = (mid + Math.imul(al5, bh5)) | 0;\n    mid = (mid + Math.imul(ah5, bl5)) | 0;\n    hi = (hi + Math.imul(ah5, bh5)) | 0;\n    lo = (lo + Math.imul(al4, bl6)) | 0;\n    mid = (mid + Math.imul(al4, bh6)) | 0;\n    mid = (mid + Math.imul(ah4, bl6)) | 0;\n    hi = (hi + Math.imul(ah4, bh6)) | 0;\n    lo = (lo + Math.imul(al3, bl7)) | 0;\n    mid = (mid + Math.imul(al3, bh7)) | 0;\n    mid = (mid + Math.imul(ah3, bl7)) | 0;\n    hi = (hi + Math.imul(ah3, bh7)) | 0;\n    lo = (lo + Math.imul(al2, bl8)) | 0;\n    mid = (mid + Math.imul(al2, bh8)) | 0;\n    mid = (mid + Math.imul(ah2, bl8)) | 0;\n    hi = (hi + Math.imul(ah2, bh8)) | 0;\n    lo = (lo + Math.imul(al1, bl9)) | 0;\n    mid = (mid + Math.imul(al1, bh9)) | 0;\n    mid = (mid + Math.imul(ah1, bl9)) | 0;\n    hi = (hi + Math.imul(ah1, bh9)) | 0;\n    var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n    w10 &= 0x3ffffff;\n    /* k = 11 */\n    lo = Math.imul(al9, bl2);\n    mid = Math.imul(al9, bh2);\n    mid = (mid + Math.imul(ah9, bl2)) | 0;\n    hi = Math.imul(ah9, bh2);\n    lo = (lo + Math.imul(al8, bl3)) | 0;\n    mid = (mid + Math.imul(al8, bh3)) | 0;\n    mid = (mid + Math.imul(ah8, bl3)) | 0;\n    hi = (hi + Math.imul(ah8, bh3)) | 0;\n    lo = (lo + Math.imul(al7, bl4)) | 0;\n    mid = (mid + Math.imul(al7, bh4)) | 0;\n    mid = (mid + Math.imul(ah7, bl4)) | 0;\n    hi = (hi + Math.imul(ah7, bh4)) | 0;\n    lo = (lo + Math.imul(al6, bl5)) | 0;\n    mid = (mid + Math.imul(al6, bh5)) | 0;\n    mid = (mid + Math.imul(ah6, bl5)) | 0;\n    hi = (hi + Math.imul(ah6, bh5)) | 0;\n    lo = (lo + Math.imul(al5, bl6)) | 0;\n    mid = (mid + Math.imul(al5, bh6)) | 0;\n    mid = (mid + Math.imul(ah5, bl6)) | 0;\n    hi = (hi + Math.imul(ah5, bh6)) | 0;\n    lo = (lo + Math.imul(al4, bl7)) | 0;\n    mid = (mid + Math.imul(al4, bh7)) | 0;\n    mid = (mid + Math.imul(ah4, bl7)) | 0;\n    hi = (hi + Math.imul(ah4, bh7)) | 0;\n    lo = (lo + Math.imul(al3, bl8)) | 0;\n    mid = (mid + Math.imul(al3, bh8)) | 0;\n    mid = (mid + Math.imul(ah3, bl8)) | 0;\n    hi = (hi + Math.imul(ah3, bh8)) | 0;\n    lo = (lo + Math.imul(al2, bl9)) | 0;\n    mid = (mid + Math.imul(al2, bh9)) | 0;\n    mid = (mid + Math.imul(ah2, bl9)) | 0;\n    hi = (hi + Math.imul(ah2, bh9)) | 0;\n    var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n    w11 &= 0x3ffffff;\n    /* k = 12 */\n    lo = Math.imul(al9, bl3);\n    mid = Math.imul(al9, bh3);\n    mid = (mid + Math.imul(ah9, bl3)) | 0;\n    hi = Math.imul(ah9, bh3);\n    lo = (lo + Math.imul(al8, bl4)) | 0;\n    mid = (mid + Math.imul(al8, bh4)) | 0;\n    mid = (mid + Math.imul(ah8, bl4)) | 0;\n    hi = (hi + Math.imul(ah8, bh4)) | 0;\n    lo = (lo + Math.imul(al7, bl5)) | 0;\n    mid = (mid + Math.imul(al7, bh5)) | 0;\n    mid = (mid + Math.imul(ah7, bl5)) | 0;\n    hi = (hi + Math.imul(ah7, bh5)) | 0;\n    lo = (lo + Math.imul(al6, bl6)) | 0;\n    mid = (mid + Math.imul(al6, bh6)) | 0;\n    mid = (mid + Math.imul(ah6, bl6)) | 0;\n    hi = (hi + Math.imul(ah6, bh6)) | 0;\n    lo = (lo + Math.imul(al5, bl7)) | 0;\n    mid = (mid + Math.imul(al5, bh7)) | 0;\n    mid = (mid + Math.imul(ah5, bl7)) | 0;\n    hi = (hi + Math.imul(ah5, bh7)) | 0;\n    lo = (lo + Math.imul(al4, bl8)) | 0;\n    mid = (mid + Math.imul(al4, bh8)) | 0;\n    mid = (mid + Math.imul(ah4, bl8)) | 0;\n    hi = (hi + Math.imul(ah4, bh8)) | 0;\n    lo = (lo + Math.imul(al3, bl9)) | 0;\n    mid = (mid + Math.imul(al3, bh9)) | 0;\n    mid = (mid + Math.imul(ah3, bl9)) | 0;\n    hi = (hi + Math.imul(ah3, bh9)) | 0;\n    var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n    w12 &= 0x3ffffff;\n    /* k = 13 */\n    lo = Math.imul(al9, bl4);\n    mid = Math.imul(al9, bh4);\n    mid = (mid + Math.imul(ah9, bl4)) | 0;\n    hi = Math.imul(ah9, bh4);\n    lo = (lo + Math.imul(al8, bl5)) | 0;\n    mid = (mid + Math.imul(al8, bh5)) | 0;\n    mid = (mid + Math.imul(ah8, bl5)) | 0;\n    hi = (hi + Math.imul(ah8, bh5)) | 0;\n    lo = (lo + Math.imul(al7, bl6)) | 0;\n    mid = (mid + Math.imul(al7, bh6)) | 0;\n    mid = (mid + Math.imul(ah7, bl6)) | 0;\n    hi = (hi + Math.imul(ah7, bh6)) | 0;\n    lo = (lo + Math.imul(al6, bl7)) | 0;\n    mid = (mid + Math.imul(al6, bh7)) | 0;\n    mid = (mid + Math.imul(ah6, bl7)) | 0;\n    hi = (hi + Math.imul(ah6, bh7)) | 0;\n    lo = (lo + Math.imul(al5, bl8)) | 0;\n    mid = (mid + Math.imul(al5, bh8)) | 0;\n    mid = (mid + Math.imul(ah5, bl8)) | 0;\n    hi = (hi + Math.imul(ah5, bh8)) | 0;\n    lo = (lo + Math.imul(al4, bl9)) | 0;\n    mid = (mid + Math.imul(al4, bh9)) | 0;\n    mid = (mid + Math.imul(ah4, bl9)) | 0;\n    hi = (hi + Math.imul(ah4, bh9)) | 0;\n    var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n    w13 &= 0x3ffffff;\n    /* k = 14 */\n    lo = Math.imul(al9, bl5);\n    mid = Math.imul(al9, bh5);\n    mid = (mid + Math.imul(ah9, bl5)) | 0;\n    hi = Math.imul(ah9, bh5);\n    lo = (lo + Math.imul(al8, bl6)) | 0;\n    mid = (mid + Math.imul(al8, bh6)) | 0;\n    mid = (mid + Math.imul(ah8, bl6)) | 0;\n    hi = (hi + Math.imul(ah8, bh6)) | 0;\n    lo = (lo + Math.imul(al7, bl7)) | 0;\n    mid = (mid + Math.imul(al7, bh7)) | 0;\n    mid = (mid + Math.imul(ah7, bl7)) | 0;\n    hi = (hi + Math.imul(ah7, bh7)) | 0;\n    lo = (lo + Math.imul(al6, bl8)) | 0;\n    mid = (mid + Math.imul(al6, bh8)) | 0;\n    mid = (mid + Math.imul(ah6, bl8)) | 0;\n    hi = (hi + Math.imul(ah6, bh8)) | 0;\n    lo = (lo + Math.imul(al5, bl9)) | 0;\n    mid = (mid + Math.imul(al5, bh9)) | 0;\n    mid = (mid + Math.imul(ah5, bl9)) | 0;\n    hi = (hi + Math.imul(ah5, bh9)) | 0;\n    var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n    w14 &= 0x3ffffff;\n    /* k = 15 */\n    lo = Math.imul(al9, bl6);\n    mid = Math.imul(al9, bh6);\n    mid = (mid + Math.imul(ah9, bl6)) | 0;\n    hi = Math.imul(ah9, bh6);\n    lo = (lo + Math.imul(al8, bl7)) | 0;\n    mid = (mid + Math.imul(al8, bh7)) | 0;\n    mid = (mid + Math.imul(ah8, bl7)) | 0;\n    hi = (hi + Math.imul(ah8, bh7)) | 0;\n    lo = (lo + Math.imul(al7, bl8)) | 0;\n    mid = (mid + Math.imul(al7, bh8)) | 0;\n    mid = (mid + Math.imul(ah7, bl8)) | 0;\n    hi = (hi + Math.imul(ah7, bh8)) | 0;\n    lo = (lo + Math.imul(al6, bl9)) | 0;\n    mid = (mid + Math.imul(al6, bh9)) | 0;\n    mid = (mid + Math.imul(ah6, bl9)) | 0;\n    hi = (hi + Math.imul(ah6, bh9)) | 0;\n    var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n    w15 &= 0x3ffffff;\n    /* k = 16 */\n    lo = Math.imul(al9, bl7);\n    mid = Math.imul(al9, bh7);\n    mid = (mid + Math.imul(ah9, bl7)) | 0;\n    hi = Math.imul(ah9, bh7);\n    lo = (lo + Math.imul(al8, bl8)) | 0;\n    mid = (mid + Math.imul(al8, bh8)) | 0;\n    mid = (mid + Math.imul(ah8, bl8)) | 0;\n    hi = (hi + Math.imul(ah8, bh8)) | 0;\n    lo = (lo + Math.imul(al7, bl9)) | 0;\n    mid = (mid + Math.imul(al7, bh9)) | 0;\n    mid = (mid + Math.imul(ah7, bl9)) | 0;\n    hi = (hi + Math.imul(ah7, bh9)) | 0;\n    var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n    w16 &= 0x3ffffff;\n    /* k = 17 */\n    lo = Math.imul(al9, bl8);\n    mid = Math.imul(al9, bh8);\n    mid = (mid + Math.imul(ah9, bl8)) | 0;\n    hi = Math.imul(ah9, bh8);\n    lo = (lo + Math.imul(al8, bl9)) | 0;\n    mid = (mid + Math.imul(al8, bh9)) | 0;\n    mid = (mid + Math.imul(ah8, bl9)) | 0;\n    hi = (hi + Math.imul(ah8, bh9)) | 0;\n    var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n    w17 &= 0x3ffffff;\n    /* k = 18 */\n    lo = Math.imul(al9, bl9);\n    mid = Math.imul(al9, bh9);\n    mid = (mid + Math.imul(ah9, bl9)) | 0;\n    hi = Math.imul(ah9, bh9);\n    var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n    w18 &= 0x3ffffff;\n    o[0] = w0;\n    o[1] = w1;\n    o[2] = w2;\n    o[3] = w3;\n    o[4] = w4;\n    o[5] = w5;\n    o[6] = w6;\n    o[7] = w7;\n    o[8] = w8;\n    o[9] = w9;\n    o[10] = w10;\n    o[11] = w11;\n    o[12] = w12;\n    o[13] = w13;\n    o[14] = w14;\n    o[15] = w15;\n    o[16] = w16;\n    o[17] = w17;\n    o[18] = w18;\n    if (c !== 0) {\n      o[19] = c;\n      out.length++;\n    }\n    return out;\n  };\n\n  // Polyfill comb\n  if (!Math.imul) {\n    comb10MulTo = smallMulTo;\n  }\n\n  function bigMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    out.length = self.length + num.length;\n\n    var carry = 0;\n    var hncarry = 0;\n    for (var k = 0; k < out.length - 1; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = hncarry;\n      hncarry = 0;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = k - j;\n        var a = self.words[i] | 0;\n        var b = num.words[j] | 0;\n        var r = a * b;\n\n        var lo = r & 0x3ffffff;\n        ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n        lo = (lo + rword) | 0;\n        rword = lo & 0x3ffffff;\n        ncarry = (ncarry + (lo >>> 26)) | 0;\n\n        hncarry += ncarry >>> 26;\n        ncarry &= 0x3ffffff;\n      }\n      out.words[k] = rword;\n      carry = ncarry;\n      ncarry = hncarry;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry;\n    } else {\n      out.length--;\n    }\n\n    return out.strip();\n  }\n\n  function jumboMulTo (self, num, out) {\n    var fftm = new FFTM();\n    return fftm.mulp(self, num, out);\n  }\n\n  BN.prototype.mulTo = function mulTo (num, out) {\n    var res;\n    var len = this.length + num.length;\n    if (this.length === 10 && num.length === 10) {\n      res = comb10MulTo(this, num, out);\n    } else if (len < 63) {\n      res = smallMulTo(this, num, out);\n    } else if (len < 1024) {\n      res = bigMulTo(this, num, out);\n    } else {\n      res = jumboMulTo(this, num, out);\n    }\n\n    return res;\n  };\n\n  // Cooley-Tukey algorithm for FFT\n  // slightly revisited to rely on looping instead of recursion\n\n  function FFTM (x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  FFTM.prototype.makeRBT = function makeRBT (N) {\n    var t = new Array(N);\n    var l = BN.prototype._countBits(N) - 1;\n    for (var i = 0; i < N; i++) {\n      t[i] = this.revBin(i, l, N);\n    }\n\n    return t;\n  };\n\n  // Returns binary-reversed representation of `x`\n  FFTM.prototype.revBin = function revBin (x, l, N) {\n    if (x === 0 || x === N - 1) return x;\n\n    var rb = 0;\n    for (var i = 0; i < l; i++) {\n      rb |= (x & 1) << (l - i - 1);\n      x >>= 1;\n    }\n\n    return rb;\n  };\n\n  // Performs \"tweedling\" phase, therefore 'emulating'\n  // behaviour of the recursive algorithm\n  FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n    for (var i = 0; i < N; i++) {\n      rtws[i] = rws[rbt[i]];\n      itws[i] = iws[rbt[i]];\n    }\n  };\n\n  FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n    this.permute(rbt, rws, iws, rtws, itws, N);\n\n    for (var s = 1; s < N; s <<= 1) {\n      var l = s << 1;\n\n      var rtwdf = Math.cos(2 * Math.PI / l);\n      var itwdf = Math.sin(2 * Math.PI / l);\n\n      for (var p = 0; p < N; p += l) {\n        var rtwdf_ = rtwdf;\n        var itwdf_ = itwdf;\n\n        for (var j = 0; j < s; j++) {\n          var re = rtws[p + j];\n          var ie = itws[p + j];\n\n          var ro = rtws[p + j + s];\n          var io = itws[p + j + s];\n\n          var rx = rtwdf_ * ro - itwdf_ * io;\n\n          io = rtwdf_ * io + itwdf_ * ro;\n          ro = rx;\n\n          rtws[p + j] = re + ro;\n          itws[p + j] = ie + io;\n\n          rtws[p + j + s] = re - ro;\n          itws[p + j + s] = ie - io;\n\n          /* jshint maxdepth : false */\n          if (j !== l) {\n            rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n            itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n            rtwdf_ = rx;\n          }\n        }\n      }\n    }\n  };\n\n  FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n    var N = Math.max(m, n) | 1;\n    var odd = N & 1;\n    var i = 0;\n    for (N = N / 2 | 0; N; N = N >>> 1) {\n      i++;\n    }\n\n    return 1 << i + 1 + odd;\n  };\n\n  FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n    if (N <= 1) return;\n\n    for (var i = 0; i < N / 2; i++) {\n      var t = rws[i];\n\n      rws[i] = rws[N - i - 1];\n      rws[N - i - 1] = t;\n\n      t = iws[i];\n\n      iws[i] = -iws[N - i - 1];\n      iws[N - i - 1] = -t;\n    }\n  };\n\n  FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n    var carry = 0;\n    for (var i = 0; i < N / 2; i++) {\n      var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n        Math.round(ws[2 * i] / N) +\n        carry;\n\n      ws[i] = w & 0x3ffffff;\n\n      if (w < 0x4000000) {\n        carry = 0;\n      } else {\n        carry = w / 0x4000000 | 0;\n      }\n    }\n\n    return ws;\n  };\n\n  FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n    var carry = 0;\n    for (var i = 0; i < len; i++) {\n      carry = carry + (ws[i] | 0);\n\n      rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n      rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n    }\n\n    // Pad with zeroes\n    for (i = 2 * len; i < N; ++i) {\n      rws[i] = 0;\n    }\n\n    assert(carry === 0);\n    assert((carry & ~0x1fff) === 0);\n  };\n\n  FFTM.prototype.stub = function stub (N) {\n    var ph = new Array(N);\n    for (var i = 0; i < N; i++) {\n      ph[i] = 0;\n    }\n\n    return ph;\n  };\n\n  FFTM.prototype.mulp = function mulp (x, y, out) {\n    var N = 2 * this.guessLen13b(x.length, y.length);\n\n    var rbt = this.makeRBT(N);\n\n    var _ = this.stub(N);\n\n    var rws = new Array(N);\n    var rwst = new Array(N);\n    var iwst = new Array(N);\n\n    var nrws = new Array(N);\n    var nrwst = new Array(N);\n    var niwst = new Array(N);\n\n    var rmws = out.words;\n    rmws.length = N;\n\n    this.convert13b(x.words, x.length, rws, N);\n    this.convert13b(y.words, y.length, nrws, N);\n\n    this.transform(rws, _, rwst, iwst, N, rbt);\n    this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n    for (var i = 0; i < N; i++) {\n      var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n      iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n      rwst[i] = rx;\n    }\n\n    this.conjugate(rwst, iwst, N);\n    this.transform(rwst, iwst, rmws, _, N, rbt);\n    this.conjugate(rmws, _, N);\n    this.normalize13b(rmws, N);\n\n    out.negative = x.negative ^ y.negative;\n    out.length = x.length + y.length;\n    return out.strip();\n  };\n\n  // Multiply `this` by `num`\n  BN.prototype.mul = function mul (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return this.mulTo(num, out);\n  };\n\n  // Multiply employing FFT\n  BN.prototype.mulf = function mulf (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return jumboMulTo(this, num, out);\n  };\n\n  // In-place Multiplication\n  BN.prototype.imul = function imul (num) {\n    return this.clone().mulTo(num, this);\n  };\n\n  BN.prototype.imuln = function imuln (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n\n    // Carry\n    var carry = 0;\n    for (var i = 0; i < this.length; i++) {\n      var w = (this.words[i] | 0) * num;\n      var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n      carry >>= 26;\n      carry += (w / 0x4000000) | 0;\n      // NOTE: lo is 27bit maximum\n      carry += lo >>> 26;\n      this.words[i] = lo & 0x3ffffff;\n    }\n\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n\n    return this;\n  };\n\n  BN.prototype.muln = function muln (num) {\n    return this.clone().imuln(num);\n  };\n\n  // `this` * `this`\n  BN.prototype.sqr = function sqr () {\n    return this.mul(this);\n  };\n\n  // `this` * `this` in-place\n  BN.prototype.isqr = function isqr () {\n    return this.imul(this.clone());\n  };\n\n  // Math.pow(`this`, `num`)\n  BN.prototype.pow = function pow (num) {\n    var w = toBitArray(num);\n    if (w.length === 0) return new BN(1);\n\n    // Skip leading zeroes\n    var res = this;\n    for (var i = 0; i < w.length; i++, res = res.sqr()) {\n      if (w[i] !== 0) break;\n    }\n\n    if (++i < w.length) {\n      for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n        if (w[i] === 0) continue;\n\n        res = res.mul(q);\n      }\n    }\n\n    return res;\n  };\n\n  // Shift-left in-place\n  BN.prototype.iushln = function iushln (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n    var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n    var i;\n\n    if (r !== 0) {\n      var carry = 0;\n\n      for (i = 0; i < this.length; i++) {\n        var newCarry = this.words[i] & carryMask;\n        var c = ((this.words[i] | 0) - newCarry) << r;\n        this.words[i] = c | carry;\n        carry = newCarry >>> (26 - r);\n      }\n\n      if (carry) {\n        this.words[i] = carry;\n        this.length++;\n      }\n    }\n\n    if (s !== 0) {\n      for (i = this.length - 1; i >= 0; i--) {\n        this.words[i + s] = this.words[i];\n      }\n\n      for (i = 0; i < s; i++) {\n        this.words[i] = 0;\n      }\n\n      this.length += s;\n    }\n\n    return this.strip();\n  };\n\n  BN.prototype.ishln = function ishln (bits) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushln(bits);\n  };\n\n  // Shift-right in-place\n  // NOTE: `hint` is a lowest bit before trailing zeroes\n  // NOTE: if `extended` is present - it will be filled with destroyed bits\n  BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var h;\n    if (hint) {\n      h = (hint - (hint % 26)) / 26;\n    } else {\n      h = 0;\n    }\n\n    var r = bits % 26;\n    var s = Math.min((bits - r) / 26, this.length);\n    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n    var maskedWords = extended;\n\n    h -= s;\n    h = Math.max(0, h);\n\n    // Extended mode, copy masked part\n    if (maskedWords) {\n      for (var i = 0; i < s; i++) {\n        maskedWords.words[i] = this.words[i];\n      }\n      maskedWords.length = s;\n    }\n\n    if (s === 0) {\n      // No-op, we should not move anything at all\n    } else if (this.length > s) {\n      this.length -= s;\n      for (i = 0; i < this.length; i++) {\n        this.words[i] = this.words[i + s];\n      }\n    } else {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    var carry = 0;\n    for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n      var word = this.words[i] | 0;\n      this.words[i] = (carry << (26 - r)) | (word >>> r);\n      carry = word & mask;\n    }\n\n    // Push carried bits as a mask\n    if (maskedWords && carry !== 0) {\n      maskedWords.words[maskedWords.length++] = carry;\n    }\n\n    if (this.length === 0) {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    return this.strip();\n  };\n\n  BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushrn(bits, hint, extended);\n  };\n\n  // Shift-left\n  BN.prototype.shln = function shln (bits) {\n    return this.clone().ishln(bits);\n  };\n\n  BN.prototype.ushln = function ushln (bits) {\n    return this.clone().iushln(bits);\n  };\n\n  // Shift-right\n  BN.prototype.shrn = function shrn (bits) {\n    return this.clone().ishrn(bits);\n  };\n\n  BN.prototype.ushrn = function ushrn (bits) {\n    return this.clone().iushrn(bits);\n  };\n\n  // Test if n bit is set\n  BN.prototype.testn = function testn (bit) {\n    assert(typeof bit === 'number' && bit >= 0);\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) return false;\n\n    // Check bit and return\n    var w = this.words[s];\n\n    return !!(w & q);\n  };\n\n  // Return only lowers bits of number (in-place)\n  BN.prototype.imaskn = function imaskn (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n\n    assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n    if (this.length <= s) {\n      return this;\n    }\n\n    if (r !== 0) {\n      s++;\n    }\n    this.length = Math.min(s, this.length);\n\n    if (r !== 0) {\n      var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n      this.words[this.length - 1] &= mask;\n    }\n\n    return this.strip();\n  };\n\n  // Return only lowers bits of number\n  BN.prototype.maskn = function maskn (bits) {\n    return this.clone().imaskn(bits);\n  };\n\n  // Add plain number `num` to `this`\n  BN.prototype.iaddn = function iaddn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.isubn(-num);\n\n    // Possible sign change\n    if (this.negative !== 0) {\n      if (this.length === 1 && (this.words[0] | 0) < num) {\n        this.words[0] = num - (this.words[0] | 0);\n        this.negative = 0;\n        return this;\n      }\n\n      this.negative = 0;\n      this.isubn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    // Add without checks\n    return this._iaddn(num);\n  };\n\n  BN.prototype._iaddn = function _iaddn (num) {\n    this.words[0] += num;\n\n    // Carry\n    for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n      this.words[i] -= 0x4000000;\n      if (i === this.length - 1) {\n        this.words[i + 1] = 1;\n      } else {\n        this.words[i + 1]++;\n      }\n    }\n    this.length = Math.max(this.length, i + 1);\n\n    return this;\n  };\n\n  // Subtract plain number `num` from `this`\n  BN.prototype.isubn = function isubn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.iaddn(-num);\n\n    if (this.negative !== 0) {\n      this.negative = 0;\n      this.iaddn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    this.words[0] -= num;\n\n    if (this.length === 1 && this.words[0] < 0) {\n      this.words[0] = -this.words[0];\n      this.negative = 1;\n    } else {\n      // Carry\n      for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n        this.words[i] += 0x4000000;\n        this.words[i + 1] -= 1;\n      }\n    }\n\n    return this.strip();\n  };\n\n  BN.prototype.addn = function addn (num) {\n    return this.clone().iaddn(num);\n  };\n\n  BN.prototype.subn = function subn (num) {\n    return this.clone().isubn(num);\n  };\n\n  BN.prototype.iabs = function iabs () {\n    this.negative = 0;\n\n    return this;\n  };\n\n  BN.prototype.abs = function abs () {\n    return this.clone().iabs();\n  };\n\n  BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n    var len = num.length + shift;\n    var i;\n\n    this._expand(len);\n\n    var w;\n    var carry = 0;\n    for (i = 0; i < num.length; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      var right = (num.words[i] | 0) * mul;\n      w -= right & 0x3ffffff;\n      carry = (w >> 26) - ((right / 0x4000000) | 0);\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n    for (; i < this.length - shift; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      carry = w >> 26;\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n\n    if (carry === 0) return this.strip();\n\n    // Subtraction overflow\n    assert(carry === -1);\n    carry = 0;\n    for (i = 0; i < this.length; i++) {\n      w = -(this.words[i] | 0) + carry;\n      carry = w >> 26;\n      this.words[i] = w & 0x3ffffff;\n    }\n    this.negative = 1;\n\n    return this.strip();\n  };\n\n  BN.prototype._wordDiv = function _wordDiv (num, mode) {\n    var shift = this.length - num.length;\n\n    var a = this.clone();\n    var b = num;\n\n    // Normalize\n    var bhi = b.words[b.length - 1] | 0;\n    var bhiBits = this._countBits(bhi);\n    shift = 26 - bhiBits;\n    if (shift !== 0) {\n      b = b.ushln(shift);\n      a.iushln(shift);\n      bhi = b.words[b.length - 1] | 0;\n    }\n\n    // Initialize quotient\n    var m = a.length - b.length;\n    var q;\n\n    if (mode !== 'mod') {\n      q = new BN(null);\n      q.length = m + 1;\n      q.words = new Array(q.length);\n      for (var i = 0; i < q.length; i++) {\n        q.words[i] = 0;\n      }\n    }\n\n    var diff = a.clone()._ishlnsubmul(b, 1, m);\n    if (diff.negative === 0) {\n      a = diff;\n      if (q) {\n        q.words[m] = 1;\n      }\n    }\n\n    for (var j = m - 1; j >= 0; j--) {\n      var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n        (a.words[b.length + j - 1] | 0);\n\n      // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n      // (0x7ffffff)\n      qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n      a._ishlnsubmul(b, qj, j);\n      while (a.negative !== 0) {\n        qj--;\n        a.negative = 0;\n        a._ishlnsubmul(b, 1, j);\n        if (!a.isZero()) {\n          a.negative ^= 1;\n        }\n      }\n      if (q) {\n        q.words[j] = qj;\n      }\n    }\n    if (q) {\n      q.strip();\n    }\n    a.strip();\n\n    // Denormalize\n    if (mode !== 'div' && shift !== 0) {\n      a.iushrn(shift);\n    }\n\n    return {\n      div: q || null,\n      mod: a\n    };\n  };\n\n  // NOTE: 1) `mode` can be set to `mod` to request mod only,\n  //       to `div` to request div only, or be absent to\n  //       request both div & mod\n  //       2) `positive` is true if unsigned mod is requested\n  BN.prototype.divmod = function divmod (num, mode, positive) {\n    assert(!num.isZero());\n\n    if (this.isZero()) {\n      return {\n        div: new BN(0),\n        mod: new BN(0)\n      };\n    }\n\n    var div, mod, res;\n    if (this.negative !== 0 && num.negative === 0) {\n      res = this.neg().divmod(num, mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.iadd(num);\n        }\n      }\n\n      return {\n        div: div,\n        mod: mod\n      };\n    }\n\n    if (this.negative === 0 && num.negative !== 0) {\n      res = this.divmod(num.neg(), mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      return {\n        div: div,\n        mod: res.mod\n      };\n    }\n\n    if ((this.negative & num.negative) !== 0) {\n      res = this.neg().divmod(num.neg(), mode);\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.isub(num);\n        }\n      }\n\n      return {\n        div: res.div,\n        mod: mod\n      };\n    }\n\n    // Both numbers are positive at this point\n\n    // Strip both numbers to approximate shift value\n    if (num.length > this.length || this.cmp(num) < 0) {\n      return {\n        div: new BN(0),\n        mod: this\n      };\n    }\n\n    // Very short reduction\n    if (num.length === 1) {\n      if (mode === 'div') {\n        return {\n          div: this.divn(num.words[0]),\n          mod: null\n        };\n      }\n\n      if (mode === 'mod') {\n        return {\n          div: null,\n          mod: new BN(this.modn(num.words[0]))\n        };\n      }\n\n      return {\n        div: this.divn(num.words[0]),\n        mod: new BN(this.modn(num.words[0]))\n      };\n    }\n\n    return this._wordDiv(num, mode);\n  };\n\n  // Find `this` / `num`\n  BN.prototype.div = function div (num) {\n    return this.divmod(num, 'div', false).div;\n  };\n\n  // Find `this` % `num`\n  BN.prototype.mod = function mod (num) {\n    return this.divmod(num, 'mod', false).mod;\n  };\n\n  BN.prototype.umod = function umod (num) {\n    return this.divmod(num, 'mod', true).mod;\n  };\n\n  // Find Round(`this` / `num`)\n  BN.prototype.divRound = function divRound (num) {\n    var dm = this.divmod(num);\n\n    // Fast case - exact division\n    if (dm.mod.isZero()) return dm.div;\n\n    var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n    var half = num.ushrn(1);\n    var r2 = num.andln(1);\n    var cmp = mod.cmp(half);\n\n    // Round down\n    if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n    // Round up\n    return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n  };\n\n  BN.prototype.modn = function modn (num) {\n    assert(num <= 0x3ffffff);\n    var p = (1 << 26) % num;\n\n    var acc = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      acc = (p * acc + (this.words[i] | 0)) % num;\n    }\n\n    return acc;\n  };\n\n  // In-place division by number\n  BN.prototype.idivn = function idivn (num) {\n    assert(num <= 0x3ffffff);\n\n    var carry = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var w = (this.words[i] | 0) + carry * 0x4000000;\n      this.words[i] = (w / num) | 0;\n      carry = w % num;\n    }\n\n    return this.strip();\n  };\n\n  BN.prototype.divn = function divn (num) {\n    return this.clone().idivn(num);\n  };\n\n  BN.prototype.egcd = function egcd (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var x = this;\n    var y = p.clone();\n\n    if (x.negative !== 0) {\n      x = x.umod(p);\n    } else {\n      x = x.clone();\n    }\n\n    // A * x + B * y = x\n    var A = new BN(1);\n    var B = new BN(0);\n\n    // C * x + D * y = y\n    var C = new BN(0);\n    var D = new BN(1);\n\n    var g = 0;\n\n    while (x.isEven() && y.isEven()) {\n      x.iushrn(1);\n      y.iushrn(1);\n      ++g;\n    }\n\n    var yp = y.clone();\n    var xp = x.clone();\n\n    while (!x.isZero()) {\n      for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        x.iushrn(i);\n        while (i-- > 0) {\n          if (A.isOdd() || B.isOdd()) {\n            A.iadd(yp);\n            B.isub(xp);\n          }\n\n          A.iushrn(1);\n          B.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        y.iushrn(j);\n        while (j-- > 0) {\n          if (C.isOdd() || D.isOdd()) {\n            C.iadd(yp);\n            D.isub(xp);\n          }\n\n          C.iushrn(1);\n          D.iushrn(1);\n        }\n      }\n\n      if (x.cmp(y) >= 0) {\n        x.isub(y);\n        A.isub(C);\n        B.isub(D);\n      } else {\n        y.isub(x);\n        C.isub(A);\n        D.isub(B);\n      }\n    }\n\n    return {\n      a: C,\n      b: D,\n      gcd: y.iushln(g)\n    };\n  };\n\n  // This is reduced incarnation of the binary EEA\n  // above, designated to invert members of the\n  // _prime_ fields F(p) at a maximal speed\n  BN.prototype._invmp = function _invmp (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var a = this;\n    var b = p.clone();\n\n    if (a.negative !== 0) {\n      a = a.umod(p);\n    } else {\n      a = a.clone();\n    }\n\n    var x1 = new BN(1);\n    var x2 = new BN(0);\n\n    var delta = b.clone();\n\n    while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n      for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        a.iushrn(i);\n        while (i-- > 0) {\n          if (x1.isOdd()) {\n            x1.iadd(delta);\n          }\n\n          x1.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        b.iushrn(j);\n        while (j-- > 0) {\n          if (x2.isOdd()) {\n            x2.iadd(delta);\n          }\n\n          x2.iushrn(1);\n        }\n      }\n\n      if (a.cmp(b) >= 0) {\n        a.isub(b);\n        x1.isub(x2);\n      } else {\n        b.isub(a);\n        x2.isub(x1);\n      }\n    }\n\n    var res;\n    if (a.cmpn(1) === 0) {\n      res = x1;\n    } else {\n      res = x2;\n    }\n\n    if (res.cmpn(0) < 0) {\n      res.iadd(p);\n    }\n\n    return res;\n  };\n\n  BN.prototype.gcd = function gcd (num) {\n    if (this.isZero()) return num.abs();\n    if (num.isZero()) return this.abs();\n\n    var a = this.clone();\n    var b = num.clone();\n    a.negative = 0;\n    b.negative = 0;\n\n    // Remove common factor of two\n    for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n      a.iushrn(1);\n      b.iushrn(1);\n    }\n\n    do {\n      while (a.isEven()) {\n        a.iushrn(1);\n      }\n      while (b.isEven()) {\n        b.iushrn(1);\n      }\n\n      var r = a.cmp(b);\n      if (r < 0) {\n        // Swap `a` and `b` to make `a` always bigger than `b`\n        var t = a;\n        a = b;\n        b = t;\n      } else if (r === 0 || b.cmpn(1) === 0) {\n        break;\n      }\n\n      a.isub(b);\n    } while (true);\n\n    return b.iushln(shift);\n  };\n\n  // Invert number in the field F(num)\n  BN.prototype.invm = function invm (num) {\n    return this.egcd(num).a.umod(num);\n  };\n\n  BN.prototype.isEven = function isEven () {\n    return (this.words[0] & 1) === 0;\n  };\n\n  BN.prototype.isOdd = function isOdd () {\n    return (this.words[0] & 1) === 1;\n  };\n\n  // And first word and num\n  BN.prototype.andln = function andln (num) {\n    return this.words[0] & num;\n  };\n\n  // Increment at the bit position in-line\n  BN.prototype.bincn = function bincn (bit) {\n    assert(typeof bit === 'number');\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) {\n      this._expand(s + 1);\n      this.words[s] |= q;\n      return this;\n    }\n\n    // Add bit and propagate, if needed\n    var carry = q;\n    for (var i = s; carry !== 0 && i < this.length; i++) {\n      var w = this.words[i] | 0;\n      w += carry;\n      carry = w >>> 26;\n      w &= 0x3ffffff;\n      this.words[i] = w;\n    }\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n    return this;\n  };\n\n  BN.prototype.isZero = function isZero () {\n    return this.length === 1 && this.words[0] === 0;\n  };\n\n  BN.prototype.cmpn = function cmpn (num) {\n    var negative = num < 0;\n\n    if (this.negative !== 0 && !negative) return -1;\n    if (this.negative === 0 && negative) return 1;\n\n    this.strip();\n\n    var res;\n    if (this.length > 1) {\n      res = 1;\n    } else {\n      if (negative) {\n        num = -num;\n      }\n\n      assert(num <= 0x3ffffff, 'Number is too big');\n\n      var w = this.words[0] | 0;\n      res = w === num ? 0 : w < num ? -1 : 1;\n    }\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Compare two numbers and return:\n  // 1 - if `this` > `num`\n  // 0 - if `this` == `num`\n  // -1 - if `this` < `num`\n  BN.prototype.cmp = function cmp (num) {\n    if (this.negative !== 0 && num.negative === 0) return -1;\n    if (this.negative === 0 && num.negative !== 0) return 1;\n\n    var res = this.ucmp(num);\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Unsigned comparison\n  BN.prototype.ucmp = function ucmp (num) {\n    // At this point both numbers have the same sign\n    if (this.length > num.length) return 1;\n    if (this.length < num.length) return -1;\n\n    var res = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var a = this.words[i] | 0;\n      var b = num.words[i] | 0;\n\n      if (a === b) continue;\n      if (a < b) {\n        res = -1;\n      } else if (a > b) {\n        res = 1;\n      }\n      break;\n    }\n    return res;\n  };\n\n  BN.prototype.gtn = function gtn (num) {\n    return this.cmpn(num) === 1;\n  };\n\n  BN.prototype.gt = function gt (num) {\n    return this.cmp(num) === 1;\n  };\n\n  BN.prototype.gten = function gten (num) {\n    return this.cmpn(num) >= 0;\n  };\n\n  BN.prototype.gte = function gte (num) {\n    return this.cmp(num) >= 0;\n  };\n\n  BN.prototype.ltn = function ltn (num) {\n    return this.cmpn(num) === -1;\n  };\n\n  BN.prototype.lt = function lt (num) {\n    return this.cmp(num) === -1;\n  };\n\n  BN.prototype.lten = function lten (num) {\n    return this.cmpn(num) <= 0;\n  };\n\n  BN.prototype.lte = function lte (num) {\n    return this.cmp(num) <= 0;\n  };\n\n  BN.prototype.eqn = function eqn (num) {\n    return this.cmpn(num) === 0;\n  };\n\n  BN.prototype.eq = function eq (num) {\n    return this.cmp(num) === 0;\n  };\n\n  //\n  // A reduce context, could be using montgomery or something better, depending\n  // on the `m` itself.\n  //\n  BN.red = function red (num) {\n    return new Red(num);\n  };\n\n  BN.prototype.toRed = function toRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    assert(this.negative === 0, 'red works only with positives');\n    return ctx.convertTo(this)._forceRed(ctx);\n  };\n\n  BN.prototype.fromRed = function fromRed () {\n    assert(this.red, 'fromRed works only with numbers in reduction context');\n    return this.red.convertFrom(this);\n  };\n\n  BN.prototype._forceRed = function _forceRed (ctx) {\n    this.red = ctx;\n    return this;\n  };\n\n  BN.prototype.forceRed = function forceRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    return this._forceRed(ctx);\n  };\n\n  BN.prototype.redAdd = function redAdd (num) {\n    assert(this.red, 'redAdd works only with red numbers');\n    return this.red.add(this, num);\n  };\n\n  BN.prototype.redIAdd = function redIAdd (num) {\n    assert(this.red, 'redIAdd works only with red numbers');\n    return this.red.iadd(this, num);\n  };\n\n  BN.prototype.redSub = function redSub (num) {\n    assert(this.red, 'redSub works only with red numbers');\n    return this.red.sub(this, num);\n  };\n\n  BN.prototype.redISub = function redISub (num) {\n    assert(this.red, 'redISub works only with red numbers');\n    return this.red.isub(this, num);\n  };\n\n  BN.prototype.redShl = function redShl (num) {\n    assert(this.red, 'redShl works only with red numbers');\n    return this.red.shl(this, num);\n  };\n\n  BN.prototype.redMul = function redMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.mul(this, num);\n  };\n\n  BN.prototype.redIMul = function redIMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.imul(this, num);\n  };\n\n  BN.prototype.redSqr = function redSqr () {\n    assert(this.red, 'redSqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqr(this);\n  };\n\n  BN.prototype.redISqr = function redISqr () {\n    assert(this.red, 'redISqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.isqr(this);\n  };\n\n  // Square root over p\n  BN.prototype.redSqrt = function redSqrt () {\n    assert(this.red, 'redSqrt works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqrt(this);\n  };\n\n  BN.prototype.redInvm = function redInvm () {\n    assert(this.red, 'redInvm works only with red numbers');\n    this.red._verify1(this);\n    return this.red.invm(this);\n  };\n\n  // Return negative clone of `this` % `red modulo`\n  BN.prototype.redNeg = function redNeg () {\n    assert(this.red, 'redNeg works only with red numbers');\n    this.red._verify1(this);\n    return this.red.neg(this);\n  };\n\n  BN.prototype.redPow = function redPow (num) {\n    assert(this.red && !num.red, 'redPow(normalNum)');\n    this.red._verify1(this);\n    return this.red.pow(this, num);\n  };\n\n  // Prime numbers with efficient reduction\n  var primes = {\n    k256: null,\n    p224: null,\n    p192: null,\n    p25519: null\n  };\n\n  // Pseudo-Mersenne prime\n  function MPrime (name, p) {\n    // P = 2 ^ N - K\n    this.name = name;\n    this.p = new BN(p, 16);\n    this.n = this.p.bitLength();\n    this.k = new BN(1).iushln(this.n).isub(this.p);\n\n    this.tmp = this._tmp();\n  }\n\n  MPrime.prototype._tmp = function _tmp () {\n    var tmp = new BN(null);\n    tmp.words = new Array(Math.ceil(this.n / 13));\n    return tmp;\n  };\n\n  MPrime.prototype.ireduce = function ireduce (num) {\n    // Assumes that `num` is less than `P^2`\n    // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n    var r = num;\n    var rlen;\n\n    do {\n      this.split(r, this.tmp);\n      r = this.imulK(r);\n      r = r.iadd(this.tmp);\n      rlen = r.bitLength();\n    } while (rlen > this.n);\n\n    var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n    if (cmp === 0) {\n      r.words[0] = 0;\n      r.length = 1;\n    } else if (cmp > 0) {\n      r.isub(this.p);\n    } else {\n      if (r.strip !== undefined) {\n        // r is BN v4 instance\n        r.strip();\n      } else {\n        // r is BN v5 instance\n        r._strip();\n      }\n    }\n\n    return r;\n  };\n\n  MPrime.prototype.split = function split (input, out) {\n    input.iushrn(this.n, 0, out);\n  };\n\n  MPrime.prototype.imulK = function imulK (num) {\n    return num.imul(this.k);\n  };\n\n  function K256 () {\n    MPrime.call(\n      this,\n      'k256',\n      'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n  }\n  inherits(K256, MPrime);\n\n  K256.prototype.split = function split (input, output) {\n    // 256 = 9 * 26 + 22\n    var mask = 0x3fffff;\n\n    var outLen = Math.min(input.length, 9);\n    for (var i = 0; i < outLen; i++) {\n      output.words[i] = input.words[i];\n    }\n    output.length = outLen;\n\n    if (input.length <= 9) {\n      input.words[0] = 0;\n      input.length = 1;\n      return;\n    }\n\n    // Shift by 9 limbs\n    var prev = input.words[9];\n    output.words[output.length++] = prev & mask;\n\n    for (i = 10; i < input.length; i++) {\n      var next = input.words[i] | 0;\n      input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n      prev = next;\n    }\n    prev >>>= 22;\n    input.words[i - 10] = prev;\n    if (prev === 0 && input.length > 10) {\n      input.length -= 10;\n    } else {\n      input.length -= 9;\n    }\n  };\n\n  K256.prototype.imulK = function imulK (num) {\n    // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n    num.words[num.length] = 0;\n    num.words[num.length + 1] = 0;\n    num.length += 2;\n\n    // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n    var lo = 0;\n    for (var i = 0; i < num.length; i++) {\n      var w = num.words[i] | 0;\n      lo += w * 0x3d1;\n      num.words[i] = lo & 0x3ffffff;\n      lo = w * 0x40 + ((lo / 0x4000000) | 0);\n    }\n\n    // Fast length reduction\n    if (num.words[num.length - 1] === 0) {\n      num.length--;\n      if (num.words[num.length - 1] === 0) {\n        num.length--;\n      }\n    }\n    return num;\n  };\n\n  function P224 () {\n    MPrime.call(\n      this,\n      'p224',\n      'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n  }\n  inherits(P224, MPrime);\n\n  function P192 () {\n    MPrime.call(\n      this,\n      'p192',\n      'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n  }\n  inherits(P192, MPrime);\n\n  function P25519 () {\n    // 2 ^ 255 - 19\n    MPrime.call(\n      this,\n      '25519',\n      '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n  }\n  inherits(P25519, MPrime);\n\n  P25519.prototype.imulK = function imulK (num) {\n    // K = 0x13\n    var carry = 0;\n    for (var i = 0; i < num.length; i++) {\n      var hi = (num.words[i] | 0) * 0x13 + carry;\n      var lo = hi & 0x3ffffff;\n      hi >>>= 26;\n\n      num.words[i] = lo;\n      carry = hi;\n    }\n    if (carry !== 0) {\n      num.words[num.length++] = carry;\n    }\n    return num;\n  };\n\n  // Exported mostly for testing purposes, use plain name instead\n  BN._prime = function prime (name) {\n    // Cached version of prime\n    if (primes[name]) return primes[name];\n\n    var prime;\n    if (name === 'k256') {\n      prime = new K256();\n    } else if (name === 'p224') {\n      prime = new P224();\n    } else if (name === 'p192') {\n      prime = new P192();\n    } else if (name === 'p25519') {\n      prime = new P25519();\n    } else {\n      throw new Error('Unknown prime ' + name);\n    }\n    primes[name] = prime;\n\n    return prime;\n  };\n\n  //\n  // Base reduction engine\n  //\n  function Red (m) {\n    if (typeof m === 'string') {\n      var prime = BN._prime(m);\n      this.m = prime.p;\n      this.prime = prime;\n    } else {\n      assert(m.gtn(1), 'modulus must be greater than 1');\n      this.m = m;\n      this.prime = null;\n    }\n  }\n\n  Red.prototype._verify1 = function _verify1 (a) {\n    assert(a.negative === 0, 'red works only with positives');\n    assert(a.red, 'red works only with red numbers');\n  };\n\n  Red.prototype._verify2 = function _verify2 (a, b) {\n    assert((a.negative | b.negative) === 0, 'red works only with positives');\n    assert(a.red && a.red === b.red,\n      'red works only with red numbers');\n  };\n\n  Red.prototype.imod = function imod (a) {\n    if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n    return a.umod(this.m)._forceRed(this);\n  };\n\n  Red.prototype.neg = function neg (a) {\n    if (a.isZero()) {\n      return a.clone();\n    }\n\n    return this.m.sub(a)._forceRed(this);\n  };\n\n  Red.prototype.add = function add (a, b) {\n    this._verify2(a, b);\n\n    var res = a.add(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.iadd = function iadd (a, b) {\n    this._verify2(a, b);\n\n    var res = a.iadd(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.sub = function sub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.sub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.isub = function isub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.isub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.shl = function shl (a, num) {\n    this._verify1(a);\n    return this.imod(a.ushln(num));\n  };\n\n  Red.prototype.imul = function imul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.imul(b));\n  };\n\n  Red.prototype.mul = function mul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.mul(b));\n  };\n\n  Red.prototype.isqr = function isqr (a) {\n    return this.imul(a, a.clone());\n  };\n\n  Red.prototype.sqr = function sqr (a) {\n    return this.mul(a, a);\n  };\n\n  Red.prototype.sqrt = function sqrt (a) {\n    if (a.isZero()) return a.clone();\n\n    var mod3 = this.m.andln(3);\n    assert(mod3 % 2 === 1);\n\n    // Fast case\n    if (mod3 === 3) {\n      var pow = this.m.add(new BN(1)).iushrn(2);\n      return this.pow(a, pow);\n    }\n\n    // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n    //\n    // Find Q and S, that Q * 2 ^ S = (P - 1)\n    var q = this.m.subn(1);\n    var s = 0;\n    while (!q.isZero() && q.andln(1) === 0) {\n      s++;\n      q.iushrn(1);\n    }\n    assert(!q.isZero());\n\n    var one = new BN(1).toRed(this);\n    var nOne = one.redNeg();\n\n    // Find quadratic non-residue\n    // NOTE: Max is such because of generalized Riemann hypothesis.\n    var lpow = this.m.subn(1).iushrn(1);\n    var z = this.m.bitLength();\n    z = new BN(2 * z * z).toRed(this);\n\n    while (this.pow(z, lpow).cmp(nOne) !== 0) {\n      z.redIAdd(nOne);\n    }\n\n    var c = this.pow(z, q);\n    var r = this.pow(a, q.addn(1).iushrn(1));\n    var t = this.pow(a, q);\n    var m = s;\n    while (t.cmp(one) !== 0) {\n      var tmp = t;\n      for (var i = 0; tmp.cmp(one) !== 0; i++) {\n        tmp = tmp.redSqr();\n      }\n      assert(i < m);\n      var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n      r = r.redMul(b);\n      c = b.redSqr();\n      t = t.redMul(c);\n      m = i;\n    }\n\n    return r;\n  };\n\n  Red.prototype.invm = function invm (a) {\n    var inv = a._invmp(this.m);\n    if (inv.negative !== 0) {\n      inv.negative = 0;\n      return this.imod(inv).redNeg();\n    } else {\n      return this.imod(inv);\n    }\n  };\n\n  Red.prototype.pow = function pow (a, num) {\n    if (num.isZero()) return new BN(1).toRed(this);\n    if (num.cmpn(1) === 0) return a.clone();\n\n    var windowSize = 4;\n    var wnd = new Array(1 << windowSize);\n    wnd[0] = new BN(1).toRed(this);\n    wnd[1] = a;\n    for (var i = 2; i < wnd.length; i++) {\n      wnd[i] = this.mul(wnd[i - 1], a);\n    }\n\n    var res = wnd[0];\n    var current = 0;\n    var currentLen = 0;\n    var start = num.bitLength() % 26;\n    if (start === 0) {\n      start = 26;\n    }\n\n    for (i = num.length - 1; i >= 0; i--) {\n      var word = num.words[i];\n      for (var j = start - 1; j >= 0; j--) {\n        var bit = (word >> j) & 1;\n        if (res !== wnd[0]) {\n          res = this.sqr(res);\n        }\n\n        if (bit === 0 && current === 0) {\n          currentLen = 0;\n          continue;\n        }\n\n        current <<= 1;\n        current |= bit;\n        currentLen++;\n        if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n        res = this.mul(res, wnd[current]);\n        currentLen = 0;\n        current = 0;\n      }\n      start = 26;\n    }\n\n    return res;\n  };\n\n  Red.prototype.convertTo = function convertTo (num) {\n    var r = num.umod(this.m);\n\n    return r === num ? r.clone() : r;\n  };\n\n  Red.prototype.convertFrom = function convertFrom (num) {\n    var res = num.clone();\n    res.red = null;\n    return res;\n  };\n\n  //\n  // Montgomery method engine\n  //\n\n  BN.mont = function mont (num) {\n    return new Mont(num);\n  };\n\n  function Mont (m) {\n    Red.call(this, m);\n\n    this.shift = this.m.bitLength();\n    if (this.shift % 26 !== 0) {\n      this.shift += 26 - (this.shift % 26);\n    }\n\n    this.r = new BN(1).iushln(this.shift);\n    this.r2 = this.imod(this.r.sqr());\n    this.rinv = this.r._invmp(this.m);\n\n    this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n    this.minv = this.minv.umod(this.r);\n    this.minv = this.r.sub(this.minv);\n  }\n  inherits(Mont, Red);\n\n  Mont.prototype.convertTo = function convertTo (num) {\n    return this.imod(num.ushln(this.shift));\n  };\n\n  Mont.prototype.convertFrom = function convertFrom (num) {\n    var r = this.imod(num.mul(this.rinv));\n    r.red = null;\n    return r;\n  };\n\n  Mont.prototype.imul = function imul (a, b) {\n    if (a.isZero() || b.isZero()) {\n      a.words[0] = 0;\n      a.length = 1;\n      return a;\n    }\n\n    var t = a.imul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.mul = function mul (a, b) {\n    if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n    var t = a.mul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.invm = function invm (a) {\n    // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n    var res = this.imod(a._invmp(this.m).mul(this.r2));\n    return res._forceRed(this);\n  };\n})(typeof module === 'undefined' || module, this);\n",
+    "var randomBytes = require('randombytes');\nmodule.exports = findPrime;\nfindPrime.simpleSieve = simpleSieve;\nfindPrime.fermatTest = fermatTest;\nvar BN = require('bn.js');\nvar TWENTYFOUR = new BN(24);\nvar MillerRabin = require('miller-rabin');\nvar millerRabin = new MillerRabin();\nvar ONE = new BN(1);\nvar TWO = new BN(2);\nvar FIVE = new BN(5);\nvar SIXTEEN = new BN(16);\nvar EIGHT = new BN(8);\nvar TEN = new BN(10);\nvar THREE = new BN(3);\nvar SEVEN = new BN(7);\nvar ELEVEN = new BN(11);\nvar FOUR = new BN(4);\nvar TWELVE = new BN(12);\nvar primes = null;\n\nfunction _getPrimes() {\n  if (primes !== null)\n    return primes;\n\n  var limit = 0x100000;\n  var res = [];\n  res[0] = 2;\n  for (var i = 1, k = 3; k < limit; k += 2) {\n    var sqrt = Math.ceil(Math.sqrt(k));\n    for (var j = 0; j < i && res[j] <= sqrt; j++)\n      if (k % res[j] === 0)\n        break;\n\n    if (i !== j && res[j] <= sqrt)\n      continue;\n\n    res[i++] = k;\n  }\n  primes = res;\n  return res;\n}\n\nfunction simpleSieve(p) {\n  var primes = _getPrimes();\n\n  for (var i = 0; i < primes.length; i++)\n    if (p.modn(primes[i]) === 0) {\n      if (p.cmpn(primes[i]) === 0) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n\n  return true;\n}\n\nfunction fermatTest(p) {\n  var red = BN.mont(p);\n  return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0;\n}\n\nfunction findPrime(bits, gen) {\n  if (bits < 16) {\n    // this is what openssl does\n    if (gen === 2 || gen === 5) {\n      return new BN([0x8c, 0x7b]);\n    } else {\n      return new BN([0x8c, 0x27]);\n    }\n  }\n  gen = new BN(gen);\n\n  var num, n2;\n\n  while (true) {\n    num = new BN(randomBytes(Math.ceil(bits / 8)));\n    while (num.bitLength() > bits) {\n      num.ishrn(1);\n    }\n    if (num.isEven()) {\n      num.iadd(ONE);\n    }\n    if (!num.testn(1)) {\n      num.iadd(TWO);\n    }\n    if (!gen.cmp(TWO)) {\n      while (num.mod(TWENTYFOUR).cmp(ELEVEN)) {\n        num.iadd(FOUR);\n      }\n    } else if (!gen.cmp(FIVE)) {\n      while (num.mod(TEN).cmp(THREE)) {\n        num.iadd(FOUR);\n      }\n    }\n    n2 = num.shrn(1);\n    if (simpleSieve(n2) && simpleSieve(num) &&\n      fermatTest(n2) && fermatTest(num) &&\n      millerRabin.test(n2) && millerRabin.test(num)) {\n      return num;\n    }\n  }\n\n}\n",
+    "'use strict'\n\n// limit of Crypto.getRandomValues()\n// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\nvar MAX_BYTES = 65536\n\n// Node supports requesting up to this number of bytes\n// https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48\nvar MAX_UINT32 = 4294967295\n\nfunction oldBrowser () {\n  throw new Error('Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11')\n}\n\nvar Buffer = require('safe-buffer').Buffer\nvar crypto = global.crypto || global.msCrypto\n\nif (crypto && crypto.getRandomValues) {\n  module.exports = randomBytes\n} else {\n  module.exports = oldBrowser\n}\n\nfunction randomBytes (size, cb) {\n  // phantomjs needs to throw\n  if (size > MAX_UINT32) throw new RangeError('requested too many random bytes')\n\n  var bytes = Buffer.allocUnsafe(size)\n\n  if (size > 0) {  // getRandomValues fails on IE if size == 0\n    if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues\n      // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues\n      for (var generated = 0; generated < size; generated += MAX_BYTES) {\n        // buffer.slice automatically checks if the end is past the end of\n        // the buffer so we don't have to here\n        crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES))\n      }\n    } else {\n      crypto.getRandomValues(bytes)\n    }\n  }\n\n  if (typeof cb === 'function') {\n    return process.nextTick(function () {\n      cb(null, bytes)\n    })\n  }\n\n  return bytes\n}\n",
+    "// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n",
+    "var bn = require('bn.js');\nvar brorand = require('brorand');\n\nfunction MillerRabin(rand) {\n  this.rand = rand || new brorand.Rand();\n}\nmodule.exports = MillerRabin;\n\nMillerRabin.create = function create(rand) {\n  return new MillerRabin(rand);\n};\n\nMillerRabin.prototype._randbelow = function _randbelow(n) {\n  var len = n.bitLength();\n  var min_bytes = Math.ceil(len / 8);\n\n  // Generage random bytes until a number less than n is found.\n  // This ensures that 0..n-1 have an equal probability of being selected.\n  do\n    var a = new bn(this.rand.generate(min_bytes));\n  while (a.cmp(n) >= 0);\n\n  return a;\n};\n\nMillerRabin.prototype._randrange = function _randrange(start, stop) {\n  // Generate a random number greater than or equal to start and less than stop.\n  var size = stop.sub(start);\n  return start.add(this._randbelow(size));\n};\n\nMillerRabin.prototype.test = function test(n, k, cb) {\n  var len = n.bitLength();\n  var red = bn.mont(n);\n  var rone = new bn(1).toRed(red);\n\n  if (!k)\n    k = Math.max(1, (len / 48) | 0);\n\n  // Find d and s, (n - 1) = (2 ^ s) * d;\n  var n1 = n.subn(1);\n  for (var s = 0; !n1.testn(s); s++) {}\n  var d = n.shrn(s);\n\n  var rn1 = n1.toRed(red);\n\n  var prime = true;\n  for (; k > 0; k--) {\n    var a = this._randrange(new bn(2), n1);\n    if (cb)\n      cb(a);\n\n    var x = a.toRed(red).redPow(d);\n    if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)\n      continue;\n\n    for (var i = 1; i < s; i++) {\n      x = x.redSqr();\n\n      if (x.cmp(rone) === 0)\n        return false;\n      if (x.cmp(rn1) === 0)\n        break;\n    }\n\n    if (i === s)\n      return false;\n  }\n\n  return prime;\n};\n\nMillerRabin.prototype.getDivisor = function getDivisor(n, k) {\n  var len = n.bitLength();\n  var red = bn.mont(n);\n  var rone = new bn(1).toRed(red);\n\n  if (!k)\n    k = Math.max(1, (len / 48) | 0);\n\n  // Find d and s, (n - 1) = (2 ^ s) * d;\n  var n1 = n.subn(1);\n  for (var s = 0; !n1.testn(s); s++) {}\n  var d = n.shrn(s);\n\n  var rn1 = n1.toRed(red);\n\n  for (; k > 0; k--) {\n    var a = this._randrange(new bn(2), n1);\n\n    var g = n.gcd(a);\n    if (g.cmpn(1) !== 0)\n      return g;\n\n    var x = a.toRed(red).redPow(d);\n    if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)\n      continue;\n\n    for (var i = 1; i < s; i++) {\n      x = x.redSqr();\n\n      if (x.cmp(rone) === 0)\n        return x.fromRed().subn(1).gcd(n);\n      if (x.cmp(rn1) === 0)\n        break;\n    }\n\n    if (i === s) {\n      x = x.redSqr();\n      return x.fromRed().subn(1).gcd(n);\n    }\n  }\n\n  return false;\n};\n",
+    "var generatePrime = require('./lib/generatePrime')\nvar primes = require('./lib/primes.json')\n\nvar DH = require('./lib/dh')\n\nfunction getDiffieHellman (mod) {\n  var prime = new Buffer(primes[mod].prime, 'hex')\n  var gen = new Buffer(primes[mod].gen, 'hex')\n\n  return new DH(prime, gen)\n}\n\nvar ENCODINGS = {\n  'binary': true, 'hex': true, 'base64': true\n}\n\nfunction createDiffieHellman (prime, enc, generator, genc) {\n  if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) {\n    return createDiffieHellman(prime, 'binary', enc, generator)\n  }\n\n  enc = enc || 'binary'\n  genc = genc || 'binary'\n  generator = generator || new Buffer([2])\n\n  if (!Buffer.isBuffer(generator)) {\n    generator = new Buffer(generator, genc)\n  }\n\n  if (typeof prime === 'number') {\n    return new DH(generatePrime(prime, generator), generator, true)\n  }\n\n  if (!Buffer.isBuffer(prime)) {\n    prime = new Buffer(prime, enc)\n  }\n\n  return new DH(prime, generator, true)\n}\n\nexports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman\nexports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman\n",
+    "\"use strict\";\n\n(function(root) {\n    const MAX_VALUE = 0x7fffffff;\n\n    // The SHA256 and PBKDF2 implementation are from scrypt-async-js:\n    // See: https://github.com/dchest/scrypt-async-js\n    function SHA256(m) {\n        const K = new Uint32Array([\n           0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n           0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n           0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n           0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n           0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n           0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n           0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n           0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n           0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n           0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n           0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n           0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n           0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n       ]);\n\n        let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;\n        let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\n        const w = new Uint32Array(64);\n\n        function blocks(p) {\n            let off = 0, len = p.length;\n            while (len >= 64) {\n                let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i, j, t1, t2;\n\n                for (i = 0; i < 16; i++) {\n                    j = off + i*4;\n                    w[i] = ((p[j] & 0xff)<<24) | ((p[j+1] & 0xff)<<16) |\n                    ((p[j+2] & 0xff)<<8) | (p[j+3] & 0xff);\n                }\n\n                for (i = 16; i < 64; i++) {\n                    u = w[i-2];\n                    t1 = ((u>>>17) | (u<<(32-17))) ^ ((u>>>19) | (u<<(32-19))) ^ (u>>>10);\n\n                    u = w[i-15];\n                    t2 = ((u>>>7) | (u<<(32-7))) ^ ((u>>>18) | (u<<(32-18))) ^ (u>>>3);\n\n                    w[i] = (((t1 + w[i-7]) | 0) + ((t2 + w[i-16]) | 0)) | 0;\n                }\n\n                for (i = 0; i < 64; i++) {\n                    t1 = ((((((e>>>6) | (e<<(32-6))) ^ ((e>>>11) | (e<<(32-11))) ^\n                             ((e>>>25) | (e<<(32-25)))) + ((e & f) ^ (~e & g))) | 0) +\n                          ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n\n                    t2 = ((((a>>>2) | (a<<(32-2))) ^ ((a>>>13) | (a<<(32-13))) ^\n                           ((a>>>22) | (a<<(32-22)))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n\n                    h = g;\n                    g = f;\n                    f = e;\n                    e = (d + t1) | 0;\n                    d = c;\n                    c = b;\n                    b = a;\n                    a = (t1 + t2) | 0;\n                }\n\n                h0 = (h0 + a) | 0;\n                h1 = (h1 + b) | 0;\n                h2 = (h2 + c) | 0;\n                h3 = (h3 + d) | 0;\n                h4 = (h4 + e) | 0;\n                h5 = (h5 + f) | 0;\n                h6 = (h6 + g) | 0;\n                h7 = (h7 + h) | 0;\n\n                off += 64;\n                len -= 64;\n            }\n        }\n\n        blocks(m);\n\n        let i, bytesLeft = m.length % 64,\n        bitLenHi = (m.length / 0x20000000) | 0,\n        bitLenLo = m.length << 3,\n        numZeros = (bytesLeft < 56) ? 56 : 120,\n        p = m.slice(m.length - bytesLeft, m.length);\n\n        p.push(0x80);\n        for (i = bytesLeft + 1; i < numZeros; i++) { p.push(0); }\n        p.push((bitLenHi >>> 24) & 0xff);\n        p.push((bitLenHi >>> 16) & 0xff);\n        p.push((bitLenHi >>> 8)  & 0xff);\n        p.push((bitLenHi >>> 0)  & 0xff);\n        p.push((bitLenLo >>> 24) & 0xff);\n        p.push((bitLenLo >>> 16) & 0xff);\n        p.push((bitLenLo >>> 8)  & 0xff);\n        p.push((bitLenLo >>> 0)  & 0xff);\n\n        blocks(p);\n\n        return [\n            (h0 >>> 24) & 0xff, (h0 >>> 16) & 0xff, (h0 >>> 8) & 0xff, (h0 >>> 0) & 0xff,\n            (h1 >>> 24) & 0xff, (h1 >>> 16) & 0xff, (h1 >>> 8) & 0xff, (h1 >>> 0) & 0xff,\n            (h2 >>> 24) & 0xff, (h2 >>> 16) & 0xff, (h2 >>> 8) & 0xff, (h2 >>> 0) & 0xff,\n            (h3 >>> 24) & 0xff, (h3 >>> 16) & 0xff, (h3 >>> 8) & 0xff, (h3 >>> 0) & 0xff,\n            (h4 >>> 24) & 0xff, (h4 >>> 16) & 0xff, (h4 >>> 8) & 0xff, (h4 >>> 0) & 0xff,\n            (h5 >>> 24) & 0xff, (h5 >>> 16) & 0xff, (h5 >>> 8) & 0xff, (h5 >>> 0) & 0xff,\n            (h6 >>> 24) & 0xff, (h6 >>> 16) & 0xff, (h6 >>> 8) & 0xff, (h6 >>> 0) & 0xff,\n            (h7 >>> 24) & 0xff, (h7 >>> 16) & 0xff, (h7 >>> 8) & 0xff, (h7 >>> 0) & 0xff\n        ];\n    }\n\n    function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {\n        // compress password if it's longer than hash block length\n        password = (password.length <= 64) ? password : SHA256(password);\n\n        const innerLen = 64 + salt.length + 4;\n        const inner = new Array(innerLen);\n        const outerKey = new Array(64);\n\n        let i;\n        let dk = [];\n\n        // inner = (password ^ ipad) || salt || counter\n        for (i = 0; i < 64; i++) { inner[i] = 0x36; }\n        for (i = 0; i < password.length; i++) { inner[i] ^= password[i]; }\n        for (i = 0; i < salt.length; i++) { inner[64 + i] = salt[i]; }\n        for (i = innerLen - 4; i < innerLen; i++) { inner[i] = 0; }\n\n        // outerKey = password ^ opad\n        for (i = 0; i < 64; i++) outerKey[i] = 0x5c;\n        for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];\n\n        // increments counter inside inner\n        function incrementCounter() {\n            for (let i = innerLen - 1; i >= innerLen - 4; i--) {\n                inner[i]++;\n                if (inner[i] <= 0xff) return;\n                inner[i] = 0;\n            }\n        }\n\n        // output blocks = SHA256(outerKey || SHA256(inner)) ...\n        while (dkLen >= 32) {\n            incrementCounter();\n            dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));\n            dkLen -= 32;\n        }\n        if (dkLen > 0) {\n            incrementCounter();\n            dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));\n        }\n\n        return dk;\n    }\n\n    // The following is an adaptation of scryptsy\n    // See: https://www.npmjs.com/package/scryptsy\n    function blockmix_salsa8(BY, Yi, r, x, _X) {\n        let i;\n\n        arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16);\n        for (i = 0; i < 2 * r; i++) {\n            blockxor(BY, i * 16, _X, 16);\n            salsa20_8(_X, x);\n            arraycopy(_X, 0, BY, Yi + (i * 16), 16);\n        }\n\n        for (i = 0; i < r; i++) {\n            arraycopy(BY, Yi + (i * 2) * 16, BY, (i * 16), 16);\n        }\n\n        for (i = 0; i < r; i++) {\n            arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16);\n        }\n    }\n\n    function R(a, b) {\n        return (a << b) | (a >>> (32 - b));\n    }\n\n    function salsa20_8(B, x) {\n        arraycopy(B, 0, x, 0, 16);\n\n        for (let i = 8; i > 0; i -= 2) {\n            x[ 4] ^= R(x[ 0] + x[12], 7);\n            x[ 8] ^= R(x[ 4] + x[ 0], 9);\n            x[12] ^= R(x[ 8] + x[ 4], 13);\n            x[ 0] ^= R(x[12] + x[ 8], 18);\n            x[ 9] ^= R(x[ 5] + x[ 1], 7);\n            x[13] ^= R(x[ 9] + x[ 5], 9);\n            x[ 1] ^= R(x[13] + x[ 9], 13);\n            x[ 5] ^= R(x[ 1] + x[13], 18);\n            x[14] ^= R(x[10] + x[ 6], 7);\n            x[ 2] ^= R(x[14] + x[10], 9);\n            x[ 6] ^= R(x[ 2] + x[14], 13);\n            x[10] ^= R(x[ 6] + x[ 2], 18);\n            x[ 3] ^= R(x[15] + x[11], 7);\n            x[ 7] ^= R(x[ 3] + x[15], 9);\n            x[11] ^= R(x[ 7] + x[ 3], 13);\n            x[15] ^= R(x[11] + x[ 7], 18);\n            x[ 1] ^= R(x[ 0] + x[ 3], 7);\n            x[ 2] ^= R(x[ 1] + x[ 0], 9);\n            x[ 3] ^= R(x[ 2] + x[ 1], 13);\n            x[ 0] ^= R(x[ 3] + x[ 2], 18);\n            x[ 6] ^= R(x[ 5] + x[ 4], 7);\n            x[ 7] ^= R(x[ 6] + x[ 5], 9);\n            x[ 4] ^= R(x[ 7] + x[ 6], 13);\n            x[ 5] ^= R(x[ 4] + x[ 7], 18);\n            x[11] ^= R(x[10] + x[ 9], 7);\n            x[ 8] ^= R(x[11] + x[10], 9);\n            x[ 9] ^= R(x[ 8] + x[11], 13);\n            x[10] ^= R(x[ 9] + x[ 8], 18);\n            x[12] ^= R(x[15] + x[14], 7);\n            x[13] ^= R(x[12] + x[15], 9);\n            x[14] ^= R(x[13] + x[12], 13);\n            x[15] ^= R(x[14] + x[13], 18);\n        }\n\n        for (let i = 0; i < 16; ++i) {\n            B[i] += x[i];\n        }\n    }\n\n    // naive approach... going back to loop unrolling may yield additional performance\n    function blockxor(S, Si, D, len) {\n        for (let i = 0; i < len; i++) {\n            D[i] ^= S[Si + i]\n        }\n    }\n\n    function arraycopy(src, srcPos, dest, destPos, length) {\n        while (length--) {\n            dest[destPos++] = src[srcPos++];\n        }\n    }\n\n    function checkBufferish(o) {\n        if (!o || typeof(o.length) !== 'number') { return false; }\n\n        for (let i = 0; i < o.length; i++) {\n            const v = o[i];\n            if (typeof(v) !== 'number' || v % 1 || v < 0 || v >= 256) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    function ensureInteger(value, name) {\n        if (typeof(value) !== \"number\" || (value % 1)) { throw new Error('invalid ' + name); }\n        return value;\n    }\n\n    // N = Cpu cost, r = Memory cost, p = parallelization cost\n    // callback(error, progress, key)\n    function _scrypt(password, salt, N, r, p, dkLen, callback) {\n\n        N = ensureInteger(N, 'N');\n        r = ensureInteger(r, 'r');\n        p = ensureInteger(p, 'p');\n\n        dkLen = ensureInteger(dkLen, 'dkLen');\n\n        if (N === 0 || (N & (N - 1)) !== 0) { throw new Error('N must be power of 2'); }\n\n        if (N > MAX_VALUE / 128 / r) { throw new Error('N too large'); }\n        if (r > MAX_VALUE / 128 / p) { throw new Error('r too large'); }\n\n        if (!checkBufferish(password)) {\n            throw new Error('password must be an array or buffer');\n        }\n        password = Array.prototype.slice.call(password);\n\n        if (!checkBufferish(salt)) {\n            throw new Error('salt must be an array or buffer');\n        }\n        salt = Array.prototype.slice.call(salt);\n\n        let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);\n        const B = new Uint32Array(p * 32 * r)\n        for (let i = 0; i < B.length; i++) {\n            const j = i * 4;\n            B[i] = ((b[j + 3] & 0xff) << 24) |\n                   ((b[j + 2] & 0xff) << 16) |\n                   ((b[j + 1] & 0xff) << 8) |\n                   ((b[j + 0] & 0xff) << 0);\n        }\n\n        const XY = new Uint32Array(64 * r);\n        const V = new Uint32Array(32 * r * N);\n\n        const Yi = 32 * r;\n\n        // scratch space\n        const x = new Uint32Array(16);       // salsa20_8\n        const _X = new Uint32Array(16);      // blockmix_salsa8\n\n        const totalOps = p * N * 2;\n        let currentOp = 0;\n        let lastPercent10 = null;\n\n        // Set this to true to abandon the scrypt on the next step\n        let stop = false;\n\n        // State information\n        let state = 0;\n        let i0 = 0, i1;\n        let Bi;\n\n        // How many blockmix_salsa8 can we do per step?\n        const limit = callback ? parseInt(1000 / r): 0xffffffff;\n\n        // Trick from scrypt-async; if there is a setImmediate shim in place, use it\n        const nextTick = (typeof(setImmediate) !== 'undefined') ? setImmediate : setTimeout;\n\n        // This is really all I changed; making scryptsy a state machine so we occasionally\n        // stop and give other evnts on the evnt loop a chance to run. ~RicMoo\n        const incrementalSMix = function() {\n            if (stop) {\n                return callback(new Error('cancelled'), currentOp / totalOps);\n            }\n\n            let steps;\n\n            switch (state) {\n                case 0:\n                    // for (var i = 0; i < p; i++)...\n                    Bi = i0 * 32 * r;\n\n                    arraycopy(B, Bi, XY, 0, Yi);                       // ROMix - 1\n\n                    state = 1;                                         // Move to ROMix 2\n                    i1 = 0;\n\n                    // Fall through\n\n                case 1:\n\n                    // Run up to 1000 steps of the first inner smix loop\n                    steps = N - i1;\n                    if (steps > limit) { steps = limit; }\n                    for (let i = 0; i < steps; i++) {                  // ROMix - 2\n                        arraycopy(XY, 0, V, (i1 + i) * Yi, Yi)         // ROMix - 3\n                        blockmix_salsa8(XY, Yi, r, x, _X);             // ROMix - 4\n                    }\n\n                    // for (var i = 0; i < N; i++)\n                    i1 += steps;\n                    currentOp += steps;\n\n                    if (callback) {\n                        // Call the callback with the progress (optionally stopping us)\n                        const percent10 = parseInt(1000 * currentOp / totalOps);\n                        if (percent10 !== lastPercent10) {\n                            stop = callback(null, currentOp / totalOps);\n                            if (stop) { break; }\n                            lastPercent10 = percent10;\n                        }\n                    }\n\n                    if (i1 < N) { break; }\n\n                    i1 = 0;                                          // Move to ROMix 6\n                    state = 2;\n\n                    // Fall through\n\n                case 2:\n\n                    // Run up to 1000 steps of the second inner smix loop\n                    steps = N - i1;\n                    if (steps > limit) { steps = limit; }\n                    for (let i = 0; i < steps; i++) {                // ROMix - 6\n                        const offset = (2 * r - 1) * 16;             // ROMix - 7\n                        const j = XY[offset] & (N - 1);\n                        blockxor(V, j * Yi, XY, Yi);                 // ROMix - 8 (inner)\n                        blockmix_salsa8(XY, Yi, r, x, _X);           // ROMix - 9 (outer)\n                    }\n\n                    // for (var i = 0; i < N; i++)...\n                    i1 += steps;\n                    currentOp += steps;\n\n                    // Call the callback with the progress (optionally stopping us)\n                    if (callback) {\n                        const percent10 = parseInt(1000 * currentOp / totalOps);\n                        if (percent10 !== lastPercent10) {\n                            stop = callback(null, currentOp / totalOps);\n                            if (stop) { break; }\n                            lastPercent10 = percent10;\n                        }\n                    }\n\n                    if (i1 < N) { break; }\n\n                    arraycopy(XY, 0, B, Bi, Yi);                     // ROMix - 10\n\n                    // for (var i = 0; i < p; i++)...\n                    i0++;\n                    if (i0 < p) {\n                        state = 0;\n                        break;\n                    }\n\n                    b = [];\n                    for (let i = 0; i < B.length; i++) {\n                        b.push((B[i] >>  0) & 0xff);\n                        b.push((B[i] >>  8) & 0xff);\n                        b.push((B[i] >> 16) & 0xff);\n                        b.push((B[i] >> 24) & 0xff);\n                    }\n\n                    const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen);\n\n                    // Send the result to the callback\n                    if (callback) { callback(null, 1.0, derivedKey); }\n\n                    // Done; don't break (which would reschedule)\n                    return derivedKey;\n            }\n\n            // Schedule the next steps\n            if (callback) { nextTick(incrementalSMix); }\n        }\n\n        // Run the smix state machine until completion\n        if (!callback) {\n            while (true) {\n                const derivedKey = incrementalSMix();\n                if (derivedKey != undefined) { return derivedKey; }\n            }\n        }\n\n        // Bootstrap the async incremental smix\n        incrementalSMix();\n    }\n\n    const lib = {\n        scrypt: function(password, salt, N, r, p, dkLen, progressCallback) {\n            return new Promise(function(resolve, reject) {\n                let lastProgress = 0;\n                if (progressCallback) { progressCallback(0); }\n                _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) {\n                    if (error) {\n                        reject(error);\n                    } else if (key) {\n                        if (progressCallback && lastProgress !== 1) {\n                            progressCallback(1);\n                        }\n                        resolve(new Uint8Array(key));\n                    } else if (progressCallback && progress !== lastProgress) {\n                        lastProgress = progress;\n                        return progressCallback(progress);\n                    }\n                });\n            });\n        },\n        syncScrypt: function(password, salt, N, r, p, dkLen) {\n            return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen));\n        }\n    };\n\n    // node.js\n    if (typeof(exports) !== 'undefined') {\n       module.exports = lib;\n\n    // RequireJS/AMD\n    // http://www.requirejs.org/docs/api.html\n    // https://github.com/amdjs/amdjs-api/wiki/AMD\n    } else if (typeof(define) === 'function' && define.amd) {\n        define(lib);\n\n    // Web Browsers\n    } else if (root) {\n\n        // If there was an existing library \"scrypt\", make sure it is still available\n        if (root.scrypt) {\n            root._scrypt = root.scrypt;\n        }\n\n        root.scrypt = lib;\n    }\n\n})(this);\n",
+    "var SortedArray = (function () {\n    var SortedArray = defclass({\n\n        constructor: function (array, compare) {\n            this.array   = [];\n            this.compare = compare || compareDefault;\n            var length   = array.length,\n                index    = 0;\n            while (index < length) this.insert(array[index++]);\n        },\n        insert: function (element) {\n            var array   = this.array,\n                compare = this.compare,\n                high    = array.length-1,\n                low     = 0,\n                pos = -1,\n                index,\n                ordering;\n\n            // The array is sorted. You must find the position of new element in O(log(n)), not O(n).\n            while (high >= low) {\n                index    = (high + low) / 2 >>> 0;\n                ordering = compare(array[index], element);                \n                if (ordering < 0) low  = index + 1;\n                else if (ordering > 0) high = index - 1;\n                else {\n                    pos = index;\n                    break;\n                };\n            }\n\n            if (pos === -1) {\n                // if element was not found, high < low.\n                pos = high;\n            }\n            // This assures that equal elements inserted after will be in a higher position in array.\n            // They can be equal for comparison purposes, but different objects with different data.\n            // Respecting the chronological order can be important for many applications.\n            pos++;\n            high = array.length-1;\n            while ((pos < high) && (compare(element, array[pos]) === 0)){\n                pos++;\n            }\n            index = array.length;\n            // Just to increase array size.\n            array.push(element);            \n            // Much faster. No need to elements swap.\n            while (index > pos) {\n                array[index] = array[--index];\n            }\n            // Set the new element on its correct position.\n            array[pos] = element;\n\n            return this;\n        },\n        search: function (element) {\n            var array   = this.array,\n                compare = this.compare,\n                high    = array.length-1,\n                low     = 0,\n                // In most languages, inner variable declaration makes the code slower.\n                index,\n                ordering;\n\n            while (high >= low) {\n                index    = (high + low) / 2 >>> 0;\n                ordering = compare(array[index], element);\n\n                     if (ordering < 0) low  = index + 1;\n                else if (ordering > 0) high = index - 1;\n                else return index;\n            }\n\n            return -1;\n        },\n        remove: function (element) {\n            var index = this.search(element);\n            if (index >= 0) this.array.splice(index, 1);\n            return this;\n        }\n    });\n\n    SortedArray.comparing = function (property, array) {\n        return new SortedArray(array, function (a, b) {\n            // This should be faster than calling functions.\n            // Besides, this way it is not needed to create useless function to return property value.\n            return compareDefault(a[property], b[property]);\n        });\n    };\n\n    return SortedArray;\n\n    function defclass(prototype) {\n        var constructor = prototype.constructor;\n        constructor.prototype = prototype;\n        return constructor;\n    }\n\n    function compareDefault(a, b) {\n        // Equality has a very low chance to happen. It should be the last option.\n        if (a < b)\n            return -1;\n        else if (a > b)\n            return 1;\n        else\n            return 0;\n    }\n}());\n\nif (typeof module === \"object\") module.exports = SortedArray;\nif (typeof define === \"function\" && define.amd)\n    define(function () { return SortedArray; });\n",
+    "// Unique ID creation requires a high quality random # generator.  In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API.  We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n                      (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n  // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n  var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n  module.exports = function whatwgRNG() {\n    getRandomValues(rnds8);\n    return rnds8;\n  };\n} else {\n  // Math.random()-based (RNG)\n  //\n  // If all else fails, use Math.random().  It's fast, but is of unspecified\n  // quality.\n  var rnds = new Array(16);\n\n  module.exports = function mathRNG() {\n    for (var i = 0, r; i < 16; i++) {\n      if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n      rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n    }\n\n    return rnds;\n  };\n}\n",
+    "/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n  byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n  var i = offset || 0;\n  var bth = byteToHex;\n  // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n  return ([\n    bth[buf[i++]], bth[buf[i++]],\n    bth[buf[i++]], bth[buf[i++]], '-',\n    bth[buf[i++]], bth[buf[i++]], '-',\n    bth[buf[i++]], bth[buf[i++]], '-',\n    bth[buf[i++]], bth[buf[i++]], '-',\n    bth[buf[i++]], bth[buf[i++]],\n    bth[buf[i++]], bth[buf[i++]],\n    bth[buf[i++]], bth[buf[i++]]\n  ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n",
+    "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n",
+    "/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n",
+    "var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n",
+    "/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n",
+    "module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n",
+    "var r;\n\nmodule.exports = function rand(len) {\n  if (!r)\n    r = new Rand(null);\n\n  return r.generate(len);\n};\n\nfunction Rand(rand) {\n  this.rand = rand;\n}\nmodule.exports.Rand = Rand;\n\nRand.prototype.generate = function generate(len) {\n  return this._rand(len);\n};\n\n// Emulate crypto API using randy\nRand.prototype._rand = function _rand(n) {\n  if (this.rand.getBytes)\n    return this.rand.getBytes(n);\n\n  var res = new Uint8Array(n);\n  for (var i = 0; i < res.length; i++)\n    res[i] = this.rand.getByte();\n  return res;\n};\n\nif (typeof self === 'object') {\n  if (self.crypto && self.crypto.getRandomValues) {\n    // Modern browsers\n    Rand.prototype._rand = function _rand(n) {\n      var arr = new Uint8Array(n);\n      self.crypto.getRandomValues(arr);\n      return arr;\n    };\n  } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n    // IE\n    Rand.prototype._rand = function _rand(n) {\n      var arr = new Uint8Array(n);\n      self.msCrypto.getRandomValues(arr);\n      return arr;\n    };\n\n  // Safari's WebWorkers do not have `crypto`\n  } else if (typeof window === 'object') {\n    // Old junk\n    Rand.prototype._rand = function() {\n      throw new Error('Not implemented yet');\n    };\n  }\n} else {\n  // Node.js or Web worker with no crypto support\n  try {\n    var crypto = require('crypto');\n    if (typeof crypto.randomBytes !== 'function')\n      throw new Error('Not supported');\n\n    Rand.prototype._rand = function _rand(n) {\n      return crypto.randomBytes(n);\n    };\n  } catch (e) {\n  }\n}\n",
+    "var BN = require('bn.js');\nvar MillerRabin = require('miller-rabin');\nvar millerRabin = new MillerRabin();\nvar TWENTYFOUR = new BN(24);\nvar ELEVEN = new BN(11);\nvar TEN = new BN(10);\nvar THREE = new BN(3);\nvar SEVEN = new BN(7);\nvar primes = require('./generatePrime');\nvar randomBytes = require('randombytes');\nmodule.exports = DH;\n\nfunction setPublicKey(pub, enc) {\n  enc = enc || 'utf8';\n  if (!Buffer.isBuffer(pub)) {\n    pub = new Buffer(pub, enc);\n  }\n  this._pub = new BN(pub);\n  return this;\n}\n\nfunction setPrivateKey(priv, enc) {\n  enc = enc || 'utf8';\n  if (!Buffer.isBuffer(priv)) {\n    priv = new Buffer(priv, enc);\n  }\n  this._priv = new BN(priv);\n  return this;\n}\n\nvar primeCache = {};\nfunction checkPrime(prime, generator) {\n  var gen = generator.toString('hex');\n  var hex = [gen, prime.toString(16)].join('_');\n  if (hex in primeCache) {\n    return primeCache[hex];\n  }\n  var error = 0;\n\n  if (prime.isEven() ||\n    !primes.simpleSieve ||\n    !primes.fermatTest(prime) ||\n    !millerRabin.test(prime)) {\n    //not a prime so +1\n    error += 1;\n\n    if (gen === '02' || gen === '05') {\n      // we'd be able to check the generator\n      // it would fail so +8\n      error += 8;\n    } else {\n      //we wouldn't be able to test the generator\n      // so +4\n      error += 4;\n    }\n    primeCache[hex] = error;\n    return error;\n  }\n  if (!millerRabin.test(prime.shrn(1))) {\n    //not a safe prime\n    error += 2;\n  }\n  var rem;\n  switch (gen) {\n    case '02':\n      if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) {\n        // unsuidable generator\n        error += 8;\n      }\n      break;\n    case '05':\n      rem = prime.mod(TEN);\n      if (rem.cmp(THREE) && rem.cmp(SEVEN)) {\n        // prime mod 10 needs to equal 3 or 7\n        error += 8;\n      }\n      break;\n    default:\n      error += 4;\n  }\n  primeCache[hex] = error;\n  return error;\n}\n\nfunction DH(prime, generator, malleable) {\n  this.setGenerator(generator);\n  this.__prime = new BN(prime);\n  this._prime = BN.mont(this.__prime);\n  this._primeLen = prime.length;\n  this._pub = undefined;\n  this._priv = undefined;\n  this._primeCode = undefined;\n  if (malleable) {\n    this.setPublicKey = setPublicKey;\n    this.setPrivateKey = setPrivateKey;\n  } else {\n    this._primeCode = 8;\n  }\n}\nObject.defineProperty(DH.prototype, 'verifyError', {\n  enumerable: true,\n  get: function () {\n    if (typeof this._primeCode !== 'number') {\n      this._primeCode = checkPrime(this.__prime, this.__gen);\n    }\n    return this._primeCode;\n  }\n});\nDH.prototype.generateKeys = function () {\n  if (!this._priv) {\n    this._priv = new BN(randomBytes(this._primeLen));\n  }\n  this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed();\n  return this.getPublicKey();\n};\n\nDH.prototype.computeSecret = function (other) {\n  other = new BN(other);\n  other = other.toRed(this._prime);\n  var secret = other.redPow(this._priv).fromRed();\n  var out = new Buffer(secret.toArray());\n  var prime = this.getPrime();\n  if (out.length < prime.length) {\n    var front = new Buffer(prime.length - out.length);\n    front.fill(0);\n    out = Buffer.concat([front, out]);\n  }\n  return out;\n};\n\nDH.prototype.getPublicKey = function getPublicKey(enc) {\n  return formatReturnValue(this._pub, enc);\n};\n\nDH.prototype.getPrivateKey = function getPrivateKey(enc) {\n  return formatReturnValue(this._priv, enc);\n};\n\nDH.prototype.getPrime = function (enc) {\n  return formatReturnValue(this.__prime, enc);\n};\n\nDH.prototype.getGenerator = function (enc) {\n  return formatReturnValue(this._gen, enc);\n};\n\nDH.prototype.setGenerator = function (gen, enc) {\n  enc = enc || 'utf8';\n  if (!Buffer.isBuffer(gen)) {\n    gen = new Buffer(gen, enc);\n  }\n  this.__gen = gen;\n  this._gen = new BN(gen);\n  return this;\n};\n\nfunction formatReturnValue(bn, enc) {\n  var buf = new Buffer(bn.toArray());\n  if (!enc) {\n    return buf;\n  } else {\n    return buf.toString(enc);\n  }\n}\n",
+    "var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n",
+    "(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n",
+    "export default {\n  'Success': 200,\n\n  'Bad Request': 400,\n  'Unauthorized': 401,\n  'Payment Required': 402,\n  'Forbidden': 403,\n  'Not Found': 404,\n  'Conflict': 409,\n  'Too Many Requests': 429,\n\n  'Internal Server Error': 500,\n  'Service Unavailable': 503,\n  'Gateway Timeout': 504,\n\n  // WebSocket close event codes\n  'Service Restart': 1012,\n\n  // Custom ws close event codes\n  'No Pong Received': 3000,\n  'Client Already Connected': 3001\n}\n",
+    "import statusCodes from '../statusCodes'\n\nclass UsernameAlreadyExists extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UsernameAlreadyExists'\n    this.message = 'Username already exists.'\n    this.status = statusCodes['Conflict']\n  }\n}\n\nclass UsernameMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UsernameMissing'\n    this.message = 'Username missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UsernameCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UsernameCannotBeBlank'\n    this.message = 'Username cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UsernameTooLong extends Error {\n  constructor(maxLen, ...params) {\n    super(maxLen, ...params)\n\n    this.name = 'UsernameTooLong'\n    this.message = `Username too long. Must be a max of ${maxLen} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UsernameMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UsernameMustBeString'\n    this.message = 'Username must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PasswordMissing'\n    this.message = 'Password missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PasswordCannotBeBlank'\n    this.message = 'Password cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordTooShort extends Error {\n  constructor(minLen, ...params) {\n    super(minLen, ...params)\n\n    this.name = 'PasswordTooShort'\n    this.message = `Password too short. Must be a minimum of ${minLen} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordTooLong extends Error {\n  constructor(maxLen, ...params) {\n    super(maxLen, ...params)\n\n    this.name = 'PasswordTooLong'\n    this.message = `Password too long. Must be a max of ${maxLen} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PasswordMustBeString'\n    this.message = 'Password must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PasswordAttemptLimitExceeded extends Error {\n  constructor(delay, ...params) {\n    super(delay, ...params)\n\n    this.name = 'PasswordAttemptLimitExceeded'\n    this.message = `Password attempt limit exceeded. Must wait ${delay} to attempt to use password again.`\n    this.status = statusCodes['Unauthorized']\n  }\n}\n\nclass UsernameOrPasswordMismatch extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UsernameOrPasswordMismatch'\n    this.message = 'Username or password mismatch.'\n    this.status = statusCodes['Unauthorized']\n  }\n}\n\nclass SessionLengthMustBeNumber extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SessionLengthMustBeNumber'\n    this.message = 'Session length must be a number.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass SessionLengthTooShort extends Error {\n  constructor(minLen, ...params) {\n    super(minLen, ...params)\n\n    this.name = 'SessionLengthTooShort'\n    this.message = `Session length cannot be shorter than ${minLen}.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass SessionLengthTooLong extends Error {\n  constructor(maxLen, ...params) {\n    super(maxLen, ...params)\n\n    this.name = 'SessionLengthTooLong'\n    this.message = `Session length cannot be longer than ${maxLen}.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass AllowServerSideEncryptionMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AllowServerSideEncryptionMustBeBoolean'\n    this.message = 'Allow server-side encryption value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UserAlreadySignedIn extends Error {\n  constructor(username, ...params) {\n    super(...params)\n\n    this.name = 'UserAlreadySignedIn'\n    this.message = 'Already signed in.'\n    this.status = statusCodes['Bad Request']\n    this.username = username\n  }\n}\n\nclass UserPendingDeletion extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserPendingDeletion'\n    this.message = 'User is pending deletion.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass AppIdNotValid extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AppIdNotValid'\n    this.message = 'App ID not valid.'\n    this.status = statusCodes['Unauthorized']\n  }\n}\n\nclass DomainNotWhitelisted extends Error {\n  constructor(domain, ...params) {\n    super(domain, ...params)\n\n    this.name = 'DomainNotWhitelisted'\n    this.message = `Domain not whitelisted. Whitelist the domain ${domain ? `'${domain}' ` : ''}in your admin panel.`\n    this.status = statusCodes['Unauthorized']\n  }\n}\n\nclass UserNotSignedIn extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserNotSignedIn'\n    this.message = 'Not signed in.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UserNotFound extends Error {\n  constructor(username, ...params) {\n    super(username, ...params)\n\n    if (username) this.username = username\n\n    this.name = 'UserNotFound'\n    this.message = 'User not found.'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass UserEmailNotFound extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserEmailNotFound'\n    this.message = 'User does not have an email saved.'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass UserMustChangePassword extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserMustChangePassword'\n    this.message = 'Must change password first.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass EmailNotValid extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'EmailNotValid'\n    this.message = 'Email not valid.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ProfileMustBeObject extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ProfileMustBeObject'\n    this.message = 'Profile must be a flat JSON object.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ProfileCannotBeEmpty extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ProfileCannotBeEmpty'\n    this.message = 'Profile cannot be empty.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ProfileHasTooManyKeys extends Error {\n  constructor(maxKeys, ...params) {\n    super(maxKeys, ...params)\n\n    this.name = 'ProfileHasTooManyKeys'\n    this.message = `Profile has too many keys. Must have a max of ${maxKeys} keys.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ProfileKeyTooLong extends Error {\n  constructor(maxLen, key, ...params) {\n    super(maxLen, key, ...params)\n\n    this.name = 'ProfileKeyTooLong'\n    this.message = `Profile key too long. Must be a max of ${maxLen} characters.`\n    this.status = statusCodes['Bad Request']\n    this.key = key\n  }\n}\n\nclass ProfileValueMustBeString extends Error {\n  constructor(key, value, ...params) {\n    super(key, value, ...params)\n\n    this.name = 'ProfileValueMustBeString'\n    this.message = 'Profile value must be a string.'\n    this.status = statusCodes['Bad Request']\n    this.key = key\n    this.value = value\n  }\n}\n\nclass ProfileValueCannotBeBlank extends Error {\n  constructor(key, ...params) {\n    super(key, ...params)\n\n    this.name = 'ProfileValueCannotBeBlank'\n    this.message = 'Profile value cannot be blank.'\n    this.status = statusCodes['Bad Request']\n    this.key = key\n  }\n}\n\nclass ProfileValueTooLong extends Error {\n  constructor(maxLen, key, value, ...params) {\n    super(maxLen, key, value, ...params)\n\n    this.name = 'ProfileValueTooLong'\n    this.message = `Profile value too long. Must be a max of ${maxLen} characters.`\n    this.status = statusCodes['Bad Request']\n    this.key = key\n    this.value = value\n  }\n}\n\nclass RememberMeValueNotValid extends Error {\n  constructor(options, ...params) {\n    super(options, ...params)\n\n    this.name = 'RememberMeValueNotValid'\n    this.message = `Remember me value must be one of ${JSON.stringify(Object.keys(options))}.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ParamsMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ParamsMissing'\n    this.message = 'Parameters expected are missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass TrialExceededLimit extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'TrialExceededLimit'\n    this.message = 'Trial exceeded limit of users.'\n    this.status = statusCodes['Payment Required']\n  }\n}\n\nclass CurrentPasswordMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'CurrentPasswordMissing'\n    this.message = 'Current password missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass CurrentPasswordIncorrect extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'CurrentPasswordIncorrect'\n    this.message = 'Current password is incorrect.'\n    this.status = statusCodes['Unauthorized']\n  }\n}\n\nclass KeyNotFound extends Error {\n  constructor(message, ...params) {\n    super(message, ...params)\n\n    this.name = 'KeyNotFound'\n    this.message = message\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass DeleteEndToEndEncryptedDataMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DeleteEndToEndEncryptedDataMustBeBoolean'\n    this.message = 'Delete end-to-end encrypted data value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nexport default {\n  UsernameAlreadyExists,\n  UsernameMissing,\n  UsernameCannotBeBlank,\n  UsernameTooLong,\n  UsernameMustBeString,\n  PasswordMissing,\n  PasswordCannotBeBlank,\n  PasswordTooShort,\n  PasswordTooLong,\n  PasswordMustBeString,\n  PasswordAttemptLimitExceeded,\n  UsernameOrPasswordMismatch,\n  SessionLengthMustBeNumber,\n  SessionLengthTooShort,\n  SessionLengthTooLong,\n  AllowServerSideEncryptionMustBeBoolean,\n  UserAlreadySignedIn,\n  UserPendingDeletion,\n  AppIdNotValid,\n  DomainNotWhitelisted,\n  UserNotSignedIn,\n  UserNotFound,\n  UserEmailNotFound,\n  UserMustChangePassword,\n  EmailNotValid,\n  ProfileMustBeObject,\n  ProfileCannotBeEmpty,\n  ProfileHasTooManyKeys,\n  ProfileKeyTooLong,\n  ProfileValueMustBeString,\n  ProfileValueCannotBeBlank,\n  ProfileValueTooLong,\n  RememberMeValueNotValid,\n  ParamsMissing,\n  TrialExceededLimit,\n  CurrentPasswordMissing,\n  CurrentPasswordIncorrect,\n  KeyNotFound,\n  DeleteEndToEndEncryptedDataMustBeBoolean,\n}\n",
+    "import statusCodes from '../statusCodes'\n\nclass DatabaseNameMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseNameMissing'\n    this.message = 'Database name missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseNameCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseNameCannotBeBlank'\n    this.message = 'Database name cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseNameMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseNameMustBeString'\n    this.message = 'Database name must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseNameTooLong extends Error {\n  constructor(maxLength, ...params) {\n    super(maxLength, ...params)\n\n    this.name = 'DatabaseNameTooLong'\n    this.message = `Database name cannot be more than ${maxLength} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseNameRestricted extends Error {\n  constructor(databaseName, ...params) {\n    super(databaseName, ...params)\n\n    this.name = 'DatabaseNameRestricted'\n    this.message = `Database name '${databaseName}' is restricted. It is used internally by userbase-js.`\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass DatabaseAlreadyOpening extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseAlreadyOpening'\n    this.message = 'Already attempting to open database.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ChangeHandlerMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ChangeHandlerMissing'\n    this.message = 'Change handler missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ChangeHandlerMustBeFunction extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ChangeHandlerMustBeFunction'\n    this.message = 'Change handler must be a function.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass EncryptionModeNotValid extends Error {\n  constructor(options, ...params) {\n    super(options, ...params)\n\n    this.name = 'EncryptionModeNotValid'\n    this.message = `Encryption mode must be one of ${JSON.stringify(Object.keys(options))}.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ServerSideEncryptionNotEnabledInClient extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ServerSideEncryptionNotEnabledInClient'\n    this.message = 'Server-side encryption must be enabled in the client to use it. To enable it, set allowServerSideEncryption to true in init().'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass DatabaseNotOpen extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseNotOpen'\n    this.message = 'Database is not open.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseNotFound extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseNotFound'\n    this.message = 'Database not found. Find available databases using getDatabases().'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass DatabaseIsReadOnly extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseIsReadOnly'\n    this.message = 'Database is read only. Must have permission to write to database.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass DatabaseIdMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseIdMustBeString'\n    this.message = 'Database id must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseIdCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseIdCannotBeBlank'\n    this.message = 'Database id cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseIdNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseIdNotAllowed'\n    this.message = 'Database id not allowed. Cannot provide both databaseName and databaseId, can only provide one.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass DatabaseIdNotAllowedForOwnDatabase extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'DatabaseIdNotAllowedForOwnDatabase'\n    this.message = \"Tried to open the user's own database using its databaseId rather than its databaseName. The databaseId should only be used to open databases shared from other users.\"\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass DatabaseIdInvalidLength extends Error {\n  constructor(length, ...params) {\n    super(length, ...params)\n\n    this.name = 'DatabaseIdInvalidLength'\n    this.message = `Database id invalid length. Must be ${length} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ShareTokenInvalid extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ShareTokenInvalid'\n    this.message = 'Share token invalid.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ShareTokenNotFound extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ShareTokenNotFound'\n    this.message = 'Share token not found. Perhaps the database owner has generated a new share token.'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass ShareTokenNotAllowed extends Error {\n  constructor(reason, ...params) {\n    super(reason, ...params)\n\n    this.name = 'ShareTokenNotAllowed'\n    this.message = 'Share token not allowed.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ShareTokenNotAllowedForOwnDatabase extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ShareTokenNotAllowedForOwnDatabase'\n    this.message = \"Tried to open the user's own database using its shareToken rather than its databaseName. The shareToken should only be used to open databases shared from other users.\"\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass ReadOnlyMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ReadOnlyMustBeBoolean'\n    this.message = 'Read only value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ReadOnlyParamNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ReadOnlyParamNotAllowed'\n    this.message = 'Read only parameter not allowed when revoking access to a database.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ResharingAllowedParamNotAllowed extends Error {\n  constructor(reason, ...params) {\n    super(reason, ...params)\n\n    this.name = 'ResharingAllowedParamNotAllowed'\n    this.message = `Resharing allowed parameter not allowed ${reason}.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ResharingAllowedMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ResharingAllowedMustBeBoolean'\n    this.message = 'Resharing allowed value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ResharingNotAllowed extends Error {\n  constructor(reason, ...params) {\n    super(reason, ...params)\n\n    this.name = 'ResharingNotAllowed'\n    this.message = `Resharing not allowed. ${reason}.`\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass ResharingWithWriteAccessNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ResharingWithWriteAccessNotAllowed'\n    this.message = 'Resharing with write access not allowed. Must have permission to write to the database to reshare the database with write access another user.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass SharingWithSelfNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SharingWithSelfNotAllowed'\n    this.message = 'Sharing database with self is not allowed. Must share database with another user.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ModifyingOwnPermissionsNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ModifyingOwnPermissionsNotAllowed'\n    this.message = \"Modifying own database permissions not allowed. Must modify another user's permissions.\"\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ModifyingOwnerPermissionsNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ModifyingOwnerPermissionsNotAllowed'\n    this.message = \"Modifying the owner of a database's permissions is not allowed.\"\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass ModifyingPermissionsNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ModifyingPermissionsNotAllowed'\n    this.message = \"Modifying another user's permissions is not allowed. Must have permission to reshare the database with another user.\"\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass GrantingWriteAccessNotAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'GrantingWriteAccessNotAllowed'\n    this.message = 'Granting write access not allowed. Must have permission to write to the database to grant write access to another user.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass RequireVerifiedMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RequireVerifiedMustBeBoolean'\n    this.message = 'Require verified value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RequireVerifiedParamNotNecessary extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RequireVerifiedParamNotNecessary'\n    this.message = 'Require verified parameter not necessary when sharing database without a username.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RevokeMustBeBoolean extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RevokeMustBeBoolean'\n    this.message = 'Revoke value must be a boolean.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemMissing'\n    this.message = 'Item missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemInvalid extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemInvalid'\n    this.message = 'Item must be serializable to JSON.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemTooLarge extends Error {\n  constructor(maxKb, ...params) {\n    super(maxKb, ...params)\n\n    this.name = 'ItemTooLarge'\n    this.message = `Item must be less than ${maxKb} KB.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemIdMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemIdMustBeString'\n    this.message = 'Item id must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemIdTooLong extends Error {\n  constructor(maxLength, ...params) {\n    super(maxLength, ...params)\n\n    this.name = 'ItemIdTooLong'\n    this.message = `Item id cannot be more than ${maxLength} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemIdMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemIdMissing'\n    this.message = 'Item id missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemIdCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemIdCannotBeBlank'\n    this.message = 'Item id cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ItemAlreadyExists extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemAlreadyExists'\n    this.message = 'Item with the same id already exists.'\n    this.status = statusCodes['Conflict']\n  }\n}\n\nclass ItemDoesNotExist extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemDoesNotExist'\n    this.message = 'Item with the provided id does not exist.'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass ItemUpdateConflict extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ItemUpdateConflict'\n    this.message = 'Item update conflict.'\n    this.status = statusCodes['Conflict']\n  }\n}\n\nclass FileMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileMissing'\n    this.message = 'File missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileMustBeFile extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileMustBeFile'\n    this.message = 'File must be a file.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileCannotBeEmpty extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileCannotBeEmpty'\n    this.message = 'File cannot be empty.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileUploadConflict extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileUploadConflict'\n    this.message = 'File upload conflict.'\n    this.status = statusCodes['Conflict']\n  }\n}\n\nclass FileNotFound extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileNotFound'\n    this.message = 'File not found.'\n    this.status = statusCodes['Not Found']\n  }\n}\n\nclass FileIdMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileIdMissing'\n    this.message = 'File id missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileIdMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileIdMustBeString'\n    this.message = 'File id must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileIdCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'FileIdCannotBeBlank'\n    this.message = 'File id cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass FileIdTooLong extends Error {\n  constructor(maxLength, ...params) {\n    super(maxLength, ...params)\n\n    this.name = 'FileIdTooLong'\n    this.message = `File id cannot be more than ${maxLength} characters.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeMustBeObject extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeMustBeObject'\n    this.message = 'Range param provided must be object.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeMissingStart extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeMissingStart'\n    this.message = 'Range param missing start.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeMissingEnd extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeMissingEnd'\n    this.message = 'Range param missing end.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeStartMustBeNumber extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeStartMustBeNumber'\n    this.message = 'Range start provided must be a number.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeEndMustBeNumber extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeEndMustBeNumber'\n    this.message = 'Range end provided must be a number.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeStartMustBeGreaterThanZero extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeStartMustBeGreaterThanZero'\n    this.message = 'Range start provided must be greater than 0.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeEndMustBeGreaterThanRangeStart extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeEndMustBeGreaterThanRangeStart'\n    this.message = 'Range end provided must be greater than range start.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass RangeEndMustBeLessThanFileSize extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'RangeEndMustBeLessThanFileSize'\n    this.message = 'Range end provided must be less than file size.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass OperationsMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'OperationsMissing'\n    this.message = 'Operations missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass OperationsMustBeArray extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'OperationsMustBeArray'\n    this.message = 'Operations provided must be an array.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass CommandNotRecognized extends Error {\n  constructor(command, ...params) {\n    super(command, ...params)\n\n    this.name = 'CommandNotRecognized'\n    this.message = `Command '${command}' not recognized.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass OperationsConflict extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'OperationsConflict'\n    this.message = 'Operations conflict. Only allowed 1 operation per item.'\n    this.status = statusCodes['Conflict']\n  }\n}\n\nclass OperationsExceedLimit extends Error {\n  constructor(limit, ...params) {\n    super(limit, ...params)\n\n    this.name = 'OperationsExceedLimit'\n    this.message = `Operations exceed limit. Only allowed ${limit} operations.`\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UserNotVerified extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserNotVerified'\n    this.message = 'User not verified. Either verify user before sharing database, or set requireVerified to false.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass UserMustBeReverified extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserMustBeReverified'\n    this.message = 'User must be reverified.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass UserUnableToReceiveDatabase extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UserUnableToReceiveDatabase'\n    this.message = 'User unable to receive database. User must sign in with an updated userbase-js client to be able to receive database.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass VerificationMessageMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'VerificationMessageMissing'\n    this.message = 'Verification message missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass VerificationMessageCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'VerificationMessageCannotBeBlank'\n    this.message = 'Verification message cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass VerificationMessageMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'VerificationMessageMustBeString'\n    this.message = 'Verification message must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass VerificationMessageInvalid extends Error {\n  constructor(maxLength, ...params) {\n    super(maxLength, ...params)\n\n    this.name = 'VerificationMessageInvalid'\n    this.message = 'Verification message invalid.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass VerifyingSelfNotAllowed extends Error {\n  constructor(maxLength, ...params) {\n    super(maxLength, ...params)\n\n    this.name = 'VerifyingSelfNotAllowed'\n    this.message = 'Verifying self not allowed. Can only verify other users.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ProgressHandlerMustBeFunction extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ProgressHandlerMustBeFunction'\n    this.message = 'Progress handler must be a function.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass TransactionUnauthorized extends Error {\n  constructor(command, ...params) {\n    super(command, ...params)\n\n    this.name = 'TransactionUnauthorized'\n    this.message = `Calling '${command}' on this item is unauthorized.`\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass WriteAccessParamNotAllowed extends Error {\n  constructor(command, ...params) {\n    super(command, ...params)\n\n    this.name = 'WriteAccessParamNotAllowed'\n    this.message = `Write access parameter not allowed. Only the item creator or database owner can change an item's write access settings.`\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nexport default {\n  DatabaseNameMissing,\n  DatabaseNameCannotBeBlank,\n  DatabaseNameMustBeString,\n  DatabaseNameTooLong,\n  DatabaseNameRestricted,\n  DatabaseNotFound,\n  DatabaseIsReadOnly,\n  DatabaseAlreadyOpening,\n  DatabaseIdMustBeString,\n  DatabaseIdCannotBeBlank,\n  DatabaseIdNotAllowed,\n  DatabaseIdNotAllowedForOwnDatabase,\n  DatabaseIdInvalidLength,\n  ShareTokenInvalid,\n  ShareTokenNotFound,\n  ShareTokenNotAllowed,\n  ShareTokenNotAllowedForOwnDatabase,\n  ReadOnlyMustBeBoolean,\n  ReadOnlyParamNotAllowed,\n  ResharingAllowedMustBeBoolean,\n  ResharingNotAllowed,\n  ResharingWithWriteAccessNotAllowed,\n  ResharingAllowedParamNotAllowed,\n  SharingWithSelfNotAllowed,\n  ModifyingOwnPermissionsNotAllowed,\n  ModifyingOwnerPermissionsNotAllowed,\n  ModifyingPermissionsNotAllowed,\n  GrantingWriteAccessNotAllowed,\n  RequireVerifiedMustBeBoolean,\n  RequireVerifiedParamNotNecessary,\n  RevokeMustBeBoolean,\n  ChangeHandlerMissing,\n  ChangeHandlerMustBeFunction,\n  EncryptionModeNotValid,\n  ServerSideEncryptionNotEnabledInClient,\n  DatabaseNotOpen,\n  ItemMissing,\n  ItemInvalid,\n  ItemTooLarge,\n  ItemIdMustBeString,\n  ItemIdTooLong,\n  ItemIdMissing,\n  ItemIdCannotBeBlank,\n  ItemAlreadyExists,\n  ItemDoesNotExist,\n  ItemUpdateConflict,\n  FileMissing,\n  FileMustBeFile,\n  FileCannotBeEmpty,\n  FileUploadConflict,\n  FileNotFound,\n  FileIdMissing,\n  FileIdMustBeString,\n  FileIdCannotBeBlank,\n  FileIdTooLong,\n  RangeMustBeObject,\n  RangeMissingStart,\n  RangeMissingEnd,\n  RangeStartMustBeNumber,\n  RangeEndMustBeNumber,\n  RangeStartMustBeGreaterThanZero,\n  RangeEndMustBeGreaterThanRangeStart,\n  RangeEndMustBeLessThanFileSize,\n  OperationsMissing,\n  OperationsMustBeArray,\n  OperationsConflict,\n  OperationsExceedLimit,\n  CommandNotRecognized,\n  UserNotVerified,\n  UserMustBeReverified,\n  UserUnableToReceiveDatabase,\n  VerificationMessageMissing,\n  VerificationMessageMustBeString,\n  VerificationMessageCannotBeBlank,\n  VerificationMessageInvalid,\n  VerifyingSelfNotAllowed,\n  ProgressHandlerMustBeFunction,\n  TransactionUnauthorized,\n  WriteAccessParamNotAllowed,\n}\n",
+    "import statusCodes from '../statusCodes'\n\nclass AppIdAlreadySet extends Error {\n  constructor(appId, ...params) {\n    super(appId, ...params)\n\n    this.name = 'AppIdAlreadySet'\n    this.message = 'Application ID already set.'\n    this.status = statusCodes['Conflict']\n    this.appId = appId\n  }\n}\n\nclass AppIdMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AppIdMustBeString'\n    this.message = 'Application ID must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass AppIdMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AppIdMissing'\n    this.message = 'Application ID missing.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nclass AppIdCannotBeBlank extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AppIdCannotBeBlank'\n    this.message = 'Application ID cannot be blank.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass WebCryptoUnavailable extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'WebCryptoUnavailable'\n    this.message = 'The WebCrypto API is unavailable. Please make sure your website uses https.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass UpdateUserHandlerMustBeFunction extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'UpdateUserHandlerMustBeFunction'\n    this.message = 'Update user handler must be a function.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nexport default {\n  AppIdAlreadySet,\n  AppIdMustBeString,\n  AppIdMissing,\n  AppIdCannotBeBlank,\n  WebCryptoUnavailable,\n  UpdateUserHandlerMustBeFunction,\n}\n",
+    "import statusCodes from '../statusCodes'\n\nclass SuccessUrlMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SuccessUrlMissing'\n    this.message = 'Success url missing to let Stripe know where to redirect users on successful payment.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nclass SuccessUrlMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SuccessUrlMustBeString'\n    this.message = 'Success url must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nclass SuccessUrlInvalid extends Error {\n  constructor(invalidProtocol, ...params) {\n    super(invalidProtocol, ...params)\n\n    this.name = 'SuccessUrlInvalid'\n    this.message = invalidProtocol ? 'Success url must start with http or https.' : 'Success url invalid.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nclass CancelUrlMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'CancelUrlMissing'\n    this.message = 'Cancel url missing to let Stripe know where to redirect users on canceled payment.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass CancelUrlMustBeString extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'CancelUrlMustBeString'\n    this.message = 'Cancel url must be a string.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass CancelUrlInvalid extends Error {\n  constructor(invalidProtocol, ...params) {\n    super(invalidProtocol, ...params)\n\n    this.name = 'CancelUrlInvalid'\n    this.message = invalidProtocol ? 'Cancel url must start with http or https.' : 'Cancel url invalid.'\n    this.status = statusCodes['Bad Request']\n  }\n}\nclass StripeJsLibraryMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'StripeLibraryMissing'\n    this.message = 'Stripe.js library missing. Be sure to include the script in your html file (https://stripe.com/docs/stripe-js#setup).'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PaymentsDisabled extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PaymentsDisabled'\n    this.message = 'Payments on this app are disabled. Enable payments in the admin panel.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass PriceIdOrPlanIdAllowed extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PriceIdOrPlanIdAllowed'\n    this.message = 'Only one of priceId or planId allowed.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass PriceIdOrPlanIdMissing extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'PriceIdOrPlanIdMissing'\n    this.message = 'Please provide a priceId or planId. You can create a product in the Stripe dashboard and find its priceId there.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass SubscriptionPlanAlreadyPurchased extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SubscriptionPlanAlreadyPurchased'\n    this.message = 'Subscription plan already purchased. Cancel subscription to purchase another.'\n    this.status = statusCodes['Conflict']\n  }\n}\nclass StripeAccountNotConnected extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'StripeAccountNotConnected'\n    this.message = 'Stripe account not connected. Connect a Stripe account in the admin panel.'\n    this.status = statusCodes['Forbidden']\n  }\n}\n\nclass SubscriptionNotFound extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SubscriptionNotFound'\n    this.message = 'Subscription not found. User must purchase a subscription.'\n    this.status = statusCodes['Payment Required']\n  }\n}\n\nclass SubscriptionInactive extends Error {\n  constructor(subscriptionStatus, ...params) {\n    super(...params)\n\n    this.name = 'SubscriptionInactive'\n    this.message = \"The user's subscription is inactive.\"\n    this.subscriptionStatus = subscriptionStatus\n    this.status = statusCodes['Payment Required']\n  }\n}\n\nclass SubscriptionNotPurchased extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SubscriptionNotPurchased'\n    this.message = 'Subscription not purchased. User must purchase a subscription.'\n    this.status = statusCodes['Payment Required']\n  }\n}\n\nclass SubscriptionAlreadyCanceled extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'SubscriptionAlreadyCanceled'\n    this.message = 'Subscription already canceled. User must purchase a new subscription.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass TrialExpired extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'TrialExpired'\n    this.message = 'Trial expired. User must purchase a subscription.'\n    this.status = statusCodes['Payment Required']\n  }\n}\n\nclass StripeError extends Error {\n  constructor(error, ...params) {\n    super(error, ...params)\n\n    const { status, type, message } = error\n\n    this.name = 'StripeError'\n    this.message = message\n    this.type = type\n    this.status = status\n  }\n}\n\nexport default {\n  SuccessUrlMissing,\n  SuccessUrlMustBeString,\n  SuccessUrlInvalid,\n  CancelUrlMissing,\n  CancelUrlMustBeString,\n  CancelUrlInvalid,\n  StripeJsLibraryMissing,\n  PaymentsDisabled,\n  PriceIdOrPlanIdAllowed,\n  PriceIdOrPlanIdMissing,\n  SubscriptionPlanAlreadyPurchased,\n  StripeAccountNotConnected,\n  SubscriptionNotFound,\n  SubscriptionInactive,\n  SubscriptionNotPurchased,\n  SubscriptionAlreadyCanceled,\n  TrialExpired,\n  StripeError,\n}\n",
+    "import auth from './auth'\nimport db from './db'\nimport config from './config'\nimport payments from './payments'\nimport statusCodes from '../statusCodes'\n\nclass AppIdNotSet extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'AppIdNotSet'\n    this.message = 'App ID not set yet. Make sure to configure app ID.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass ServiceUnavailable extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ServiceUnavailable'\n    this.message = 'Service unavailable.'\n    this.status = statusCodes['Service Unavailable']\n  }\n}\n\nclass InternalServerError extends ServiceUnavailable {\n  constructor(...params) {\n    super(...params)\n\n    this.status = statusCodes['Internal Server Error']\n  }\n}\n\nclass Timeout extends ServiceUnavailable {\n  constructor(...params) {\n    super(...params)\n\n    this.status = statusCodes['Gateway Timeout']\n  }\n}\n\nclass Reconnecting extends ServiceUnavailable {\n  constructor(...params) {\n    super(...params)\n\n    this.message = 'Reconnecting.'\n  }\n}\n\nclass UnknownServiceUnavailable extends ServiceUnavailable {\n  constructor(e, ...params) {\n    super(e, ...params)\n\n    console.error('Userbase error. Please report this to support@userbase.com.\\n\\n', e)\n  }\n}\n\nclass ParamsMustBeObject extends Error {\n  constructor(...params) {\n    super(...params)\n\n    this.name = 'ParamsMustBeObject'\n    this.message = 'Parameters passed to function must be placed inside an object.'\n    this.status = statusCodes['Bad Request']\n  }\n}\n\nclass TooManyRequests extends Error {\n  constructor(retryDelay, ...params) {\n    super(retryDelay, ...params)\n\n    const retryDelaySeconds = Math.floor(retryDelay / 1000)\n\n    this.name = 'TooManyRequests'\n    this.message = `Too many requests in a row. Please try again in ${retryDelaySeconds} second${retryDelaySeconds !== 1 ? 's' : ''}.`\n    this.status = statusCodes['Too Many Requests']\n  }\n}\n\nexport default {\n  ...auth,\n  ...db,\n  ...config,\n  ...payments,\n  AppIdNotSet,\n  InternalServerError,\n  ServiceUnavailable,\n  Timeout,\n  Reconnecting,\n  UnknownServiceUnavailable,\n  ParamsMustBeObject,\n  TooManyRequests\n}\n",
+    "import errors from './errors'\n\nconst USERBASE_JS_VERSION = '2.8.0'\n\nconst VERSION = '/v1'\nconst DEFAULT_ENDPOINT = 'https://v1.userbase.com' + VERSION\n\nconst STRIPE_PRODUCTION_PUBLISHABLE_KEY = 'pk_live_jI6lbsAIQlu2u4uTkDXFrSEW'\nconst STRIPE_TEST_PUBLISHABLE_KEY = 'pk_test_rYANrLdNfdJXJ2d808wW4pqY'\n\nlet userbaseAppId = null\nlet userbaseUpdateUserHandler = null\nlet userbaseAllowServerSideEncryptionMode = false\n\nconst getAppId = () => {\n  if (!userbaseAppId) throw new errors.AppIdNotSet\n  return userbaseAppId\n}\n\nconst getUpdateUserHandler = () => userbaseUpdateUserHandler\n\nconst getEndpoint = () => {\n  return window._userbaseEndpoint || DEFAULT_ENDPOINT\n}\n\nconst configure = ({ appId, updateUserHandler, allowServerSideEncryption }) => {\n  if (userbaseAppId && userbaseAppId !== appId) throw new errors.AppIdAlreadySet(userbaseAppId)\n  userbaseAppId = appId\n  userbaseUpdateUserHandler = updateUserHandler\n  userbaseAllowServerSideEncryptionMode = allowServerSideEncryption\n}\n\nconst getStripePublishableKey = (isProduction) => {\n  return isProduction\n    ? (window._USERBASE_STRIPE_PRODUCTION_PUBLISHABLE_KEY || STRIPE_PRODUCTION_PUBLISHABLE_KEY)\n    : (window._USERBASE_STRIPE_TEST_PUBLISHABLE_KEY || STRIPE_TEST_PUBLISHABLE_KEY)\n}\n\nconst isServerSideEncryptionModeAllowed = () => userbaseAllowServerSideEncryptionMode\n\nexport default {\n  USERBASE_JS_VERSION,\n  getAppId,\n  getUpdateUserHandler,\n  getEndpoint,\n  configure,\n  getStripePublishableKey,\n  isServerSideEncryptionModeAllowed,\n}\n",
+    "import errors from '../errors'\n\nconst TEN_SECONDS_MS = 10 * 1000\n\nclass RequestError extends Error {\n  constructor(data, status, statusText, ...params) {\n    super(data, status, statusText, ...params)\n\n    this.response = {\n      data,\n      status,\n      statusText,\n    }\n\n    this.message = 'Request failed with status code ' + status\n  }\n}\n\nclass TimeoutError extends Error {\n  constructor(timeout, ...params) {\n    super(timeout, ...params)\n\n    this.message = `timeout of ${timeout}ms exceeded`\n  }\n}\n\nconst handleResponse = (xhr, resolve, reject) => {\n  let response\n  try {\n    response = JSON.parse(xhr.response)\n  } catch {\n    response = xhr.response\n  }\n\n  if (xhr.status >= 200 && xhr.status < 300) {\n    resolve(response)\n  } else {\n    reject(new RequestError(response, xhr.status, xhr.statusText))\n  }\n}\n\nexport const processXhr = (xhr, resolve, reject, timeout = TEN_SECONDS_MS) => {\n  xhr.timeout = timeout\n  xhr.onload = () => handleResponse(xhr, resolve, reject)\n  xhr.onerror = () => reject(new errors.ServiceUnavailable)\n  xhr.ontimeout = () => reject(new TimeoutError(timeout))\n}\n",
+    "import config from '../config'\nimport { processXhr } from './utils'\n\nconst signUp = (username, passwordToken, ecKeyData, passwordSalts, keySalts, email, profile, passwordBasedBackup, sessionLength) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'POST'\n    const url = `${config.getEndpoint()}/api/auth/sign-up?appId=${config.getAppId()}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n    const data = JSON.stringify({\n      username,\n      passwordToken,\n      ecKeyData,\n      passwordSalts,\n      keySalts,\n      email,\n      profile,\n      passwordBasedBackup,\n      sessionLength,\n    })\n\n    xhr.open(method, url)\n    xhr.setRequestHeader('Content-Type', 'application/json')\n    xhr.send(data)\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst getPasswordSalts = (username) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'GET'\n    const url = `${config.getEndpoint()}/api/auth/get-password-salts?appId=${config.getAppId()}&username=${encodeURIComponent(username)}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n\n    xhr.open(method, url)\n    xhr.send()\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst signIn = async (username, passwordToken, sessionLength) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'POST'\n    const url = `${config.getEndpoint()}/api/auth/sign-in?appId=${config.getAppId()}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n    const data = JSON.stringify({\n      username,\n      passwordToken,\n      sessionLength,\n    })\n\n    xhr.open(method, url)\n    xhr.setRequestHeader('Content-Type', 'application/json')\n    xhr.send(data)\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst signInWithSession = (sessionId, sessionLength) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'POST'\n    const url = `${config.getEndpoint()}/api/auth/sign-in-with-session?appId=${config.getAppId()}&sessionId=${sessionId}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n    const data = JSON.stringify({\n      sessionLength,\n    })\n\n    xhr.open(method, url)\n    xhr.setRequestHeader('Content-Type', 'application/json')\n    xhr.send(data)\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst getServerPublicKey = async () => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'GET'\n    const url = `${config.getEndpoint()}/api/auth/server-public-key?&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n    const responseType = 'arraybuffer'\n\n    xhr.open(method, url)\n    xhr.responseType = responseType\n    xhr.send()\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst getPublicKey = (username) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'GET'\n    const url = `${config.getEndpoint()}/api/public-key?appId=${config.getAppId()}&username=${encodeURIComponent(username)}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n\n    xhr.open(method, url)\n    xhr.send()\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nconst uploadBundleChunk = async (chunk, token) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'POST'\n    const url = `${config.getEndpoint()}/api/bundle-chunk?userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n\n    xhr.setRequestHeader('Authorization', 'Bearer ' + token)\n\n    xhr.open(method, url)\n    xhr.send(chunk)\n\n    processXhr(xhr, resolve, reject)\n  })\n}\n\nexport default {\n  signUp,\n  getPasswordSalts,\n  signIn,\n  signInWithSession,\n  getServerPublicKey,\n  getPublicKey,\n  uploadBundleChunk,\n}\n",
+    "const tryCatchWrapper = (func) => (...args) => {\n  try {\n    return func(...args)\n  } catch (e) {\n    // ok to swallow error\n    //\n    // local/sessionStorage are non-critical benefits. If they happen to be available,\n    // they're helpful, but if not, the SDK functions totally fine.\n    //\n    // If a function fails, behavior is functionally the same as if rememberMe is 'none'.\n    console.warn('Error accessing browser storage. Defaulting to memory.\\n\\n', e)\n  }\n}\n\nconst _getSeedName = (appId, username) => `userbaseSeed.${appId}.${username}`\n\nconst setCurrentSession = tryCatchWrapper((rememberMe, username, signedIn, sessionId, creationDate, expirationDate) => {\n  const session = { username, signedIn, sessionId, creationDate, expirationDate }\n  const sessionString = JSON.stringify(session)\n\n  if (rememberMe === 'local') {\n    localStorage.setItem('userbaseCurrentSession', sessionString)\n  } else if (rememberMe === 'session') {\n    sessionStorage.setItem('userbaseCurrentSession', sessionString)\n  }\n})\n\nconst getCurrentSession = tryCatchWrapper(() => {\n  const sessionStorageCurrentSessionString = sessionStorage.getItem('userbaseCurrentSession')\n\n  if (sessionStorageCurrentSessionString) {\n    const currentSession = JSON.parse(sessionStorageCurrentSessionString)\n\n    if (!currentSession.signedIn) {\n      const localCurrentSessionString = localStorage.getItem('userbaseCurrentSession')\n\n      if (localCurrentSessionString) {\n        const localCurrentSession = JSON.parse(localCurrentSessionString)\n\n        // allows session from localStorage to override sessionStorage if signed in\n        // to localStorage session and not signed in to sessionStorage session\n        if (localCurrentSession.signedIn) {\n          return {\n            ...localCurrentSession,\n            rememberMe: 'local'\n          }\n        }\n      }\n    }\n\n    return {\n      ...JSON.parse(sessionStorageCurrentSessionString),\n      rememberMe: 'session'\n    }\n  }\n\n  const localSessionString = localStorage.getItem('userbaseCurrentSession')\n  return localSessionString && {\n    ...JSON.parse(localSessionString),\n    rememberMe: 'local'\n  }\n})\n\nconst saveSeedString = tryCatchWrapper((rememberMe, appId, username, seedString) => {\n  if (rememberMe === 'local') {\n    localStorage.setItem(_getSeedName(appId, username), seedString)\n  } else if (rememberMe === 'session') {\n    sessionStorage.setItem(_getSeedName(appId, username), seedString)\n  }\n})\n\nconst removeSeedString = tryCatchWrapper((appId, username) => {\n  const seedName = _getSeedName(appId, username)\n  sessionStorage.removeItem(seedName)\n  localStorage.removeItem(seedName)\n})\n\nconst getSeedString = tryCatchWrapper((appId, username) => {\n  const seedName = _getSeedName(appId, username)\n  return sessionStorage.getItem(seedName) || localStorage.getItem(seedName)\n})\n\nconst signInSession = (rememberMe, username, sessionId, creationDate, expirationDate) => {\n  const signedIn = true\n  setCurrentSession(rememberMe, username, signedIn, sessionId, creationDate, expirationDate)\n}\n\nconst signOutSession = (rememberMe, username) => {\n  const signedIn = false\n  setCurrentSession(rememberMe, username, signedIn)\n}\n\nconst removeCurrentSession = tryCatchWrapper(() => {\n  sessionStorage.removeItem('userbaseCurrentSession')\n  localStorage.removeItem('userbaseCurrentSession')\n})\n\nexport default {\n  signInSession,\n  signOutSession,\n  getCurrentSession,\n  saveSeedString,\n  removeSeedString,\n  getSeedString,\n  removeCurrentSession,\n}\n",
+    "const ONE_KB = 1024\nconst TEN_KB = 10 * ONE_KB\n\n// https://stackoverflow.com/a/20604561/11601853\nexport const arrayBufferToString = (buf, minified) => {\n  const bufView = minified ? new Uint8Array(buf) : new Uint16Array(buf)\n  const length = bufView.length\n  let result = ''\n  let chunkSize = TEN_KB // using chunks prevents stack from blowing up\n\n  for (var i = 0; i < length; i += chunkSize) {\n    if (i + chunkSize > length) {\n      chunkSize = length - i\n    }\n    const chunk = bufView.subarray(i, i + chunkSize)\n    result += String.fromCharCode.apply(null, chunk)\n  }\n\n  return result\n}\n\n// https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String\nexport const stringToArrayBuffer = (str, minified = false) => {\n  let buf = new ArrayBuffer(str.length * (minified ? 1 : 2)) // 2 bytes for each char, unless using minified. minified only safe for known input\n  let bufView = minified ? new Uint8Array(buf) : new Uint16Array(buf)\n  for (let i = 0, strLen = str.length; i < strLen; i++) {\n    bufView[i] = str.charCodeAt(i)\n  }\n  return buf\n}\n\n/**\n* Creates a new Uint8Array based on two different ArrayBuffers\n*\n* Source: https://gist.github.com/72lions/4528834\n*\n* @param {ArrayBuffers} buffer1 The first buffer.\n* @param {ArrayBuffers} buffer2 The second buffer.\n* @return {ArrayBuffers} The new ArrayBuffer created out of the two.\n*\n*/\nexport const appendBuffer = (buffer1, buffer2) => {\n  const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)\n  tmp.set(new Uint8Array(buffer1), 0)\n  tmp.set(new Uint8Array(buffer2), buffer1.byteLength)\n  return tmp.buffer\n}\n\nexport const appendBuffers = (buffers) => {\n  const bufferByteLengths = buffers.map(buffer => buffer.byteLength)\n  const totalByteLength = bufferByteLengths.reduce((byteLengthSum, bufferByteLength) => byteLengthSum + bufferByteLength)\n\n  const tmp = new Uint8Array(totalByteLength)\n  let currentByteLength = 0\n  for (let i = 0; i < buffers.length; i++) {\n    tmp.set(new Uint8Array(buffers[i]), currentByteLength)\n    currentByteLength += bufferByteLengths[i]\n  }\n\n  return {\n    buffer: tmp.buffer,\n    byteLengths: bufferByteLengths\n  }\n}\n\nexport const hexStringToArrayBuffer = (hexString) => {\n  if (hexString.length % 2 !== 0) throw new Error('Hex string must be even length')\n  const halfHexStringLen = hexString.length / 2\n  const array = []\n  for (let i = 0; i < halfHexStringLen; i++) {\n    const byteStartIndex = i * 2\n    const byte = hexString.substring(byteStartIndex, byteStartIndex + 2)\n    const byteAsInt = parseInt(byte, 16)\n    array.push(byteAsInt)\n  }\n  return new Uint8Array(array)\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport { stringToArrayBuffer } from './utils'\n\nconst BYTE_SIZE = 32 // 256 / 8\nconst HASH_ALGORITHM_NAME = 'SHA-256'\n\n/**\n *\n * @param {ArrayBuffer} data\n */\nconst hash = async (data) => {\n  const result = await window.crypto.subtle.digest(\n    {\n      name: HASH_ALGORITHM_NAME,\n    },\n    data\n  )\n  return result\n}\n\nconst hashBase64String = async (dataString) => {\n  const data = base64.decode(dataString)\n  const result = await hash(data)\n  return base64.encode(result)\n}\n\nconst hashString = async (dataString) => {\n  const data = stringToArrayBuffer(dataString)\n  const result = await hash(data)\n  return base64.encode(result)\n}\n\nexport default {\n  BYTE_SIZE,\n  HASH_ALGORITHM_NAME,\n  hash,\n  hashBase64String,\n  hashString\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport sha256 from './sha-256'\nimport { stringToArrayBuffer } from './utils'\n\nconst HKDF_ALGORITHM_NAME = 'HKDF'\nconst RAW_KEY_TYPE = 'raw'\nconst KEY_IS_NOT_EXTRACTABLE = false\nconst KEY_WILL_BE_USED_TO = ['deriveKey', 'deriveBits']\n\nconst importHkdfKeyFromString = async (seedString) => {\n  const seed = stringToArrayBuffer(seedString)\n  const hkdfKey = await importHkdfKey(seed)\n  return hkdfKey\n}\n\nconst importHkdfKey = async (seed) => {\n  const hkdfKey = await window.crypto.subtle.importKey(\n    RAW_KEY_TYPE,\n    seed,\n    {\n      name: HKDF_ALGORITHM_NAME\n    },\n    KEY_IS_NOT_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return hkdfKey\n}\n\n/**\n *  RFC 5869:\n *\n *  \"the use of salt adds significantly to the strength of HKDF...\n *  Ideally, the salt value is a random (or pseudorandom) string of the\n *  length HashLen\"\n *\n *  https://tools.ietf.org/html/rfc5869#section-3.1\n *\n **/\nconst SALT_BYTE_SIZE = sha256.BYTE_SIZE\nconst generateSalt = () => window.crypto.getRandomValues(new Uint8Array(SALT_BYTE_SIZE))\n\nconst getParams = (keyName, salt) => ({\n  name: HKDF_ALGORITHM_NAME,\n  info: stringToArrayBuffer(keyName),\n  hash: sha256.HASH_ALGORITHM_NAME,\n  salt\n})\n\nconst PASSWORD_TOKEN_NAME = 'password-token'\nconst PASSWORD_TOKEN_NUM_BITS = 256\n\nconst getPasswordToken = async (hkdfKey, salt) => {\n  const passwordTokenBits = await window.crypto.subtle.deriveBits(\n    getParams(PASSWORD_TOKEN_NAME, salt),\n    hkdfKey,\n    PASSWORD_TOKEN_NUM_BITS\n  )\n\n  return base64.encode(passwordTokenBits)\n}\n\nexport default {\n  importHkdfKeyFromString,\n  importHkdfKey,\n  generateSalt,\n  getParams,\n  getPasswordToken\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport hkdf from './hkdf'\nimport { arrayBufferToString, stringToArrayBuffer, appendBuffer } from './utils'\n\nconst ENCRYPTION_ALGORITHM_NAME = 'AES-GCM'\nconst BIT_SIZE = 256\nconst KEY_IS_EXTRACTABLE = true\nconst KEY_WILL_BE_USED_TO = ['encrypt', 'decrypt']\nconst RAW_KEY_TYPE = 'raw'\n\nconst ENCRYPTION_KEY_NAME = 'encryption'\n\nconst PASSWORD_BASED_ENCRYPTION_KEY = 'password-based-encryption'\n\n/**\n * NIST recommendation:\n *\n * \"For  IVs,  it  is  recommended  that  implementations  restrict  support  to\n * the  length  of  96  bits,  to  promote interoperability, efficiency, and\n * simplicity of design.\"\n *\n * Pg. 8\n * https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf\n *\n **/\nconst RECOMMENDED_IV_BYTE_SIZE = 12 // 96 / 8\n\n/**\n * Source on tag length:\n * https://crypto.stackexchange.com/questions/26783/ciphertext-and-tag-size-and-iv-transmission-with-aes-in-gcm-mode/26787\n */\nconst RECOMMENDED_AUTHENTICATION_TAG_LENGTH = 128\n\nconst windowOrSelfObject = () => {\n  return typeof window !== 'undefined'\n    ? window\n    : self\n}\n\nconst getEncryptionKeyParams = () => ({\n  name: ENCRYPTION_ALGORITHM_NAME,\n  length: BIT_SIZE\n})\n\nconst getCiphertextParams = (iv) => ({\n  name: ENCRYPTION_ALGORITHM_NAME,\n  tagLength: RECOMMENDED_AUTHENTICATION_TAG_LENGTH,\n  iv\n})\n\nconst generateIv = () => window.crypto.getRandomValues(new Uint8Array(RECOMMENDED_IV_BYTE_SIZE))\n\nconst sliceEncryptedArrayBuffer = (encryptedArrayBuffer) => {\n  const ivStartIndex = encryptedArrayBuffer.byteLength - RECOMMENDED_IV_BYTE_SIZE\n  const ciphertextArrayBuffer = encryptedArrayBuffer.slice(0, ivStartIndex)\n  const iv = encryptedArrayBuffer.slice(ivStartIndex)\n\n  return { ciphertextArrayBuffer, iv }\n}\n\nconst importKeyFromMaster = async (masterKey, salt, encryptionKeyName = ENCRYPTION_KEY_NAME) => {\n  const encryptionKey = await window.crypto.subtle.deriveKey(\n    hkdf.getParams(encryptionKeyName, salt),\n    masterKey,\n    getEncryptionKeyParams(),\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return encryptionKey\n}\n\nconst generateKey = async () => {\n  const key = await window.crypto.subtle.generateKey(\n    getEncryptionKeyParams(),\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return key\n}\n\nconst getKeyStringFromKey = async (key) => {\n  const rawKey = await window.crypto.subtle.exportKey(RAW_KEY_TYPE, key)\n  const keyString = base64.encode(rawKey)\n  return keyString\n}\n\nconst getKeyFromKeyString = async (keyString) => {\n  const rawKey = base64.decode(keyString)\n  const key = await getKeyFromRawKey(rawKey)\n  return key\n}\n\nconst getKeyFromRawKey = async (rawKey) => {\n  const key = await windowOrSelfObject().crypto.subtle.importKey(\n    RAW_KEY_TYPE,\n    rawKey,\n    {\n      name: ENCRYPTION_ALGORITHM_NAME\n    },\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return key\n}\n\nconst getRawKeyFromKey = async (key) => {\n  const rawKey = await windowOrSelfObject().crypto.subtle.exportKey(RAW_KEY_TYPE, key)\n  return rawKey\n}\n\n/**\n *\n * @param {CryptoKey} key\n * @param {ArrayBuffer} plaintext\n * @returns {ArrayBuffer} encrypted Array Buffer\n *\n *     encrypted is a concatentation of Array Buffers [ciphertext, auth tag, IV]\n *\n *     The Authentication Tag is a hash of the plaintext to ensure the same data that\n *     is ecncrypted is the resulting data when decrypted. Note that the browser crypto\n *     library's result is the concatenation of Array Buffers [ciphertext, auth tag]\n *\n *     The IV is a random intialization vector that prevents an attacker\n *     from determining a user's key. It can be exposed alongside the ciphertext safely.\n *\n */\nconst encrypt = async (key, plaintext) => {\n  const iv = generateIv()\n\n  // this result is the concatenation of Array Buffers [ciphertext, auth tag]\n  const ciphertextArrayBuffer = await windowOrSelfObject().crypto.subtle.encrypt(\n    getCiphertextParams(iv),\n    key,\n    plaintext\n  )\n\n  return appendBuffer(ciphertextArrayBuffer, iv)\n}\n\nconst encryptJson = async (key, plaintextJson) => {\n  const plaintextString = JSON.stringify(plaintextJson)\n  const encrypted = await encryptString(key, plaintextString)\n  return encrypted\n}\n\nconst encryptString = async (key, plaintextString) => {\n  const plaintextArrayBuffer = stringToArrayBuffer(plaintextString)\n  const encrypted = await encrypt(key, plaintextArrayBuffer)\n  return base64.encode(encrypted)\n}\n\n/**\n *\n * @param {CryptoKey} key\n * @param {ArrayBuffer} encrypted - the encrypted Array Buffer\n * @returns {object} plaintext\n */\nconst decrypt = async (key, encrypted) => {\n  const { ciphertextArrayBuffer, iv } = sliceEncryptedArrayBuffer(encrypted)\n\n  const plaintextArrayBuffer = await windowOrSelfObject().crypto.subtle.decrypt(\n    getCiphertextParams(iv),\n    key,\n    ciphertextArrayBuffer\n  )\n  return plaintextArrayBuffer\n}\n\nconst decryptJson = async (key, encryptedJsonString) => {\n  const plaintextString = await decryptString(key, encryptedJsonString)\n  return JSON.parse(plaintextString)\n}\n\nconst decryptString = async (key, encryptedString) => {\n  const encryptedArrayBuffer = base64.decode(encryptedString)\n  const plaintextArrayBuffer = await decrypt(key, encryptedArrayBuffer)\n  const plaintextString = arrayBufferToString(plaintextArrayBuffer)\n  return plaintextString\n}\n\nconst getPasswordBasedEncryptionKey = async (hkdfKey, salt) => {\n  const encryptionKey = await window.crypto.subtle.deriveKey(\n    hkdf.getParams(PASSWORD_BASED_ENCRYPTION_KEY, salt),\n    hkdfKey,\n    getEncryptionKeyParams(),\n    !KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return encryptionKey\n}\n\nconst generateAndEncryptKeyEncryptionKey = async (key) => {\n  const keyEncryptionKey = await generateKey()\n  const keyEncryptionKeyRaw = await getRawKeyFromKey(keyEncryptionKey)\n  const encryptedKeyEncryptionKey = await encrypt(key, keyEncryptionKeyRaw)\n  return [keyEncryptionKey, encryptedKeyEncryptionKey]\n}\n\nexport default {\n  getEncryptionKeyParams,\n  getCiphertextParams,\n  generateIv,\n  sliceEncryptedArrayBuffer,\n  importKeyFromMaster,\n  generateKey,\n  getKeyStringFromKey,\n  getKeyFromKeyString,\n  getRawKeyFromKey,\n  getKeyFromRawKey,\n  encrypt,\n  encryptJson,\n  encryptString,\n  decrypt,\n  decryptJson,\n  decryptString,\n  getPasswordBasedEncryptionKey,\n  generateAndEncryptKeyEncryptionKey,\n  RAW_KEY_TYPE,\n  KEY_WILL_BE_USED_TO,\n}\n",
+    "import DH from 'diffie-hellman'\nimport aesGcm from './aes-gcm'\nimport hkdf from './hkdf'\nimport sha256 from './sha-256'\nimport { hexStringToArrayBuffer } from './utils'\nimport authApi from '../api/auth'\n\nconst KEY_IS_EXTRACTABLE = true\nconst KEY_WILL_BE_USED_TO = ['encrypt'] // unused\nconst DIFFIE_HELLMAN_KEY_NAME = 'diffie-hellman'\n\n// RFC 3526 detailing publicly known 2048 bit safe prime: https://www.ietf.org/rfc/rfc3526.txt\nconst PRIME = hexStringToArrayBuffer('ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff')\nconst GENERATOR = [2]\n\n// get public key from the server to allow developers to easily swap out default server with their own\n// server running userbase-server\nlet serverPublicKey = null\nconst getServerPublicKey = async () => {\n  if (serverPublicKey) {\n    return serverPublicKey\n  } else {\n    serverPublicKey = await authApi.getServerPublicKey() // eslint-disable-line require-atomic-updates\n    return serverPublicKey\n  }\n}\n\nconst setPrivateKeyAndGenerateKeys = (diffieHellman, privateKey) => {\n  diffieHellman.setPrivateKey(privateKey)\n  diffieHellman.generateKeys()\n  return diffieHellman\n}\n\nconst createDiffieHellman = (privateKey) => {\n  const diffieHellman = DH.createDiffieHellman(PRIME, GENERATOR)\n  return setPrivateKeyAndGenerateKeys(diffieHellman, privateKey)\n}\n\nconst getSharedKey = async (privateKey, otherPublicKey) => {\n  const diffieHellman = createDiffieHellman(privateKey)\n  const sharedSecret = diffieHellman.computeSecret(otherPublicKey)\n\n  const sharedRawKey = await sha256.hash(sharedSecret)\n  const sharedKey = await aesGcm.getKeyFromRawKey(sharedRawKey)\n  return sharedKey\n}\n\nconst getPublicKey = (privateKey) => {\n  const diffieHellman = createDiffieHellman(privateKey)\n  return diffieHellman.getPublicKey()\n}\n\nconst getSharedKeyWithServer = async (privateKey) => {\n  const sharedKey = await getSharedKey(privateKey, new Uint8Array(await getServerPublicKey()))\n  return sharedKey\n}\n\nconst importKeyFromMaster = async (masterKey, salt) => {\n  const privateKey = await window.crypto.subtle.deriveKey(\n    hkdf.getParams(DIFFIE_HELLMAN_KEY_NAME, salt),\n    masterKey,\n    aesGcm.getEncryptionKeyParams(), // DH not supported, using raw AES key as secret instead\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n\n  const rawPrivateKey = await aesGcm.getRawKeyFromKey(privateKey)\n  return rawPrivateKey\n}\n\nexport default {\n  getPublicKey,\n  getSharedKey,\n  getSharedKeyWithServer,\n  importKeyFromMaster,\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport sha256 from './sha-256'\nimport hkdf from './hkdf'\nimport aesGcm from './aes-gcm'\nimport { stringToArrayBuffer, arrayBufferToString } from './utils'\n\nconst ECDSA_ALGORITHM_NAME = 'ECDSA'\nconst KEY_IS_EXTRACTABLE = true\nconst KEY_PAIR_WILL_BE_USED_TO = ['sign', 'verify']\nconst PRIVATE_KEY_WILL_BE_USED_TO = ['sign']\nconst PRIVATE_KEY_TYPE = 'jwk' // pkcs8 not supported in firefox, must use jwk\nconst PUBLIC_KEY_WILL_BE_USED_TO = ['verify']\nconst PUBLIC_KEY_TYPE = 'spki'\n\nconst ECDSA_KEY_ENCRYPTION_KEY = 'ecdsa-key-encryption-key'\n\n/**\n * NIST recommendation:\n *\n * 128-bit security provided with 256-bit key size\n *\n * Pg. 55\n * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf\n *\n **/\nconst NAMED_CURVE = 'P-256'\n\nconst ECDSA_PARAMS = {\n  name: ECDSA_ALGORITHM_NAME,\n  namedCurve: NAMED_CURVE\n}\n\nconst ECDSA_SIGNING_PARAMS = {\n  name: ECDSA_ALGORITHM_NAME,\n  hash: { name: sha256.HASH_ALGORITHM_NAME }\n}\n\nconst generateKeyPair = async () => {\n  const keyPair = await window.crypto.subtle.generateKey(\n    ECDSA_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    KEY_PAIR_WILL_BE_USED_TO\n  )\n  return keyPair\n}\n\nconst getRawPrivateKeyFromPrivateKey = async (privateKey) => {\n  const jwkPrivateKey = await window.crypto.subtle.exportKey(PRIVATE_KEY_TYPE, privateKey)\n  const rawPrivateKey = stringToArrayBuffer(JSON.stringify(jwkPrivateKey))\n  return rawPrivateKey\n}\n\nconst getPrivateKeyFromRawPrivateKey = async (rawPrivateKey) => {\n  const jwkPrivateKey = JSON.parse(arrayBufferToString(rawPrivateKey))\n  const privateKey = await window.crypto.subtle.importKey(\n    PRIVATE_KEY_TYPE,\n    jwkPrivateKey,\n    ECDSA_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    PRIVATE_KEY_WILL_BE_USED_TO,\n  )\n\n  return privateKey\n}\n\nconst getPublicKeyFromRawPublicKey = async (rawPublicKey) => {\n  const publicKey = await window.crypto.subtle.importKey(\n    PUBLIC_KEY_TYPE,\n    rawPublicKey,\n    ECDSA_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    PUBLIC_KEY_WILL_BE_USED_TO\n  )\n  return publicKey\n}\n\nconst getRawPublicKeyFromPublicKey = async (publicKey) => {\n  const rawPublicKey = await window.crypto.subtle.exportKey(PUBLIC_KEY_TYPE, publicKey)\n  return rawPublicKey\n}\n\nconst getPublicKeyStringFromPublicKey = async (publicKey) => {\n  const rawPublicKey = await getRawPublicKeyFromPublicKey(publicKey)\n  const publicKeyString = base64.encode(rawPublicKey)\n  return publicKeyString\n}\n\nconst getPublicKeyFromPrivateKey = async (privateKey) => {\n  const jwkPrivateKey = await window.crypto.subtle.exportKey('jwk', privateKey)\n\n  // delete private key data\n  delete jwkPrivateKey.d\n\n  // set public key key_ops to enable import as public key\n  jwkPrivateKey.key_ops = PUBLIC_KEY_WILL_BE_USED_TO\n\n  const publicKey = await window.crypto.subtle.importKey(\n    'jwk',\n    jwkPrivateKey, // technically this now has same values as the public key would\n    ECDSA_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    PUBLIC_KEY_WILL_BE_USED_TO\n  )\n\n  return publicKey\n}\n\nconst importEcdsaKeyEncryptionKeyFromMaster = async (masterKey, salt) => {\n  const keyEncryptionKey = await aesGcm.importKeyFromMaster(masterKey, salt, ECDSA_KEY_ENCRYPTION_KEY)\n  return keyEncryptionKey\n}\n\nconst generateEcdsaKeyData = async (masterKey) => {\n  // need to generate new key pair because cannot derive ECDSA key pair using HKDF in WebCrypto\n  const ecdsaKeyPair = await generateKeyPair()\n\n  // derive a key encryption key using HKDF to encrypt the ECDSA private key and store it on server\n  const ecdsaKeyEncryptionKeySalt = hkdf.generateSalt()\n  const ecdsaKeyEncryptionKey = await importEcdsaKeyEncryptionKeyFromMaster(masterKey, ecdsaKeyEncryptionKeySalt)\n  const ecdsaRawPrivateKey = await getRawPrivateKeyFromPrivateKey(ecdsaKeyPair.privateKey)\n  const encryptedEcdsaPrivateKey = await aesGcm.encrypt(ecdsaKeyEncryptionKey, ecdsaRawPrivateKey)\n\n  return {\n    ecdsaPrivateKey: ecdsaKeyPair.privateKey,\n    ecdsaPublicKey: await getPublicKeyStringFromPublicKey(ecdsaKeyPair.publicKey),\n    encryptedEcdsaPrivateKey: base64.encode(encryptedEcdsaPrivateKey),\n    ecdsaKeyEncryptionKeySalt: base64.encode(ecdsaKeyEncryptionKeySalt),\n  }\n}\n\nconst sign = async (privateKey, data) => {\n  const signature = await window.crypto.subtle.sign(\n    ECDSA_SIGNING_PARAMS,\n    privateKey,\n    data\n  )\n  return signature\n}\n\nconst signString = async (privateKey, dataString) => {\n  const data = stringToArrayBuffer(dataString)\n  const signature = await sign(privateKey, data)\n  const signatureString = base64.encode(signature)\n  return signatureString\n}\n\nconst verify = async (publicKey, signature, data) => {\n  const isVerified = await window.crypto.subtle.verify(\n    ECDSA_SIGNING_PARAMS,\n    publicKey,\n    signature,\n    data\n  )\n  return isVerified\n}\n\nconst verifyString = async (publicKey, signatureString, dataString) => {\n  const data = stringToArrayBuffer(dataString)\n  const signature = base64.decode(signatureString)\n  const isVerified = await verify(publicKey, signature, data)\n  return isVerified\n}\n\nexport default {\n  generateEcdsaKeyData,\n  importEcdsaKeyEncryptionKeyFromMaster,\n  getPrivateKeyFromRawPrivateKey,\n  getPublicKeyFromRawPublicKey,\n  getRawPublicKeyFromPublicKey,\n  getPublicKeyStringFromPublicKey,\n  getPublicKeyFromPrivateKey,\n  sign,\n  signString,\n  verify,\n  verifyString,\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport hkdf from './hkdf'\nimport aesGcm from './aes-gcm'\nimport ecdsa from './ecdsa'\nimport { stringToArrayBuffer, arrayBufferToString } from './utils'\n\nconst ECDH_ALGORITHM_NAME = 'ECDH'\nconst KEY_IS_EXTRACTABLE = true\nconst KEY_WILL_BE_USED_TO = ['deriveKey', 'deriveBits']\nconst PRIVATE_KEY_TYPE = 'jwk' // pkcs8 not supported in firefox, must use jwk\nconst PUBLIC_KEY_TYPE = 'spki'\n\nconst ECDH_KEY_ENCRYPTION_KEY = 'ecdh-key-encryption-key'\n\n/**\n * NIST recommendation:\n *\n * 128-bit security provided with 256-bit key size\n *\n * Pg. 55\n * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf\n *\n **/\nconst NAMED_CURVE = 'P-256'\n\nconst ECDH_PARAMS = {\n  name: ECDH_ALGORITHM_NAME,\n  namedCurve: NAMED_CURVE\n}\n\nconst generateKeyPair = async () => {\n  const keyPair = await window.crypto.subtle.generateKey(\n    ECDH_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO\n  )\n  return keyPair\n}\n\nconst getRawPrivateKeyFromPrivateKey = async (privateKey) => {\n  const jwkPrivateKey = await window.crypto.subtle.exportKey(PRIVATE_KEY_TYPE, privateKey)\n  const rawPrivateKey = stringToArrayBuffer(JSON.stringify(jwkPrivateKey))\n  return rawPrivateKey\n}\n\nconst getPrivateKeyFromRawPrivateKey = async (rawPrivateKey) => {\n  const jwkPrivateKey = JSON.parse(arrayBufferToString(rawPrivateKey))\n  const privateKey = await window.crypto.subtle.importKey(\n    PRIVATE_KEY_TYPE,\n    jwkPrivateKey,\n    ECDH_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO,\n  )\n\n  return privateKey\n}\n\nconst getRawPublicKeyFromPublicKey = async (publicKey) => {\n  const rawPublicKey = await window.crypto.subtle.exportKey(PUBLIC_KEY_TYPE, publicKey)\n  return rawPublicKey\n}\n\nconst getPublicKeyFromRawPublicKey = async (rawPublicKey) => {\n  const publicKey = await window.crypto.subtle.importKey(\n    PUBLIC_KEY_TYPE,\n    rawPublicKey,\n    ECDH_PARAMS,\n    KEY_IS_EXTRACTABLE,\n    [], // empty list ok\n  )\n\n  return publicKey\n}\n\nconst importEcdhKeyEncryptionKeyFromMaster = async (masterKey, salt) => {\n  const keyEncryptionKey = await aesGcm.importKeyFromMaster(masterKey, salt, ECDH_KEY_ENCRYPTION_KEY)\n  return keyEncryptionKey\n}\n\nconst generateEcdhKeyData = async (masterKey, ecdsaPrivateKey) => {\n  // need to generate new key pair because cannot derive ECDH key pair using HKDF in WebCrypto\n  const ecdhKeyPair = await generateKeyPair()\n\n  // derive a key encryption key using HKDF to encrypt the ECDH private key and store it on server\n  const ecdhKeyEncryptionKeySalt = hkdf.generateSalt()\n  const ecdhKeyEncryptionKey = await importEcdhKeyEncryptionKeyFromMaster(masterKey, ecdhKeyEncryptionKeySalt)\n  const ecdhRawPrivateKey = await getRawPrivateKeyFromPrivateKey(ecdhKeyPair.privateKey)\n  const encryptedEcdhPrivateKey = await aesGcm.encrypt(ecdhKeyEncryptionKey, ecdhRawPrivateKey)\n\n  const ecdhPublicKey = await getRawPublicKeyFromPublicKey(ecdhKeyPair.publicKey)\n  const signedEcdhPublicKey = await ecdsa.sign(ecdsaPrivateKey, ecdhPublicKey)\n\n  return {\n    ecdhPrivateKey: ecdhKeyPair.privateKey,\n    ecdhPublicKey: base64.encode(ecdhPublicKey),\n    encryptedEcdhPrivateKey: base64.encode(encryptedEcdhPrivateKey),\n    signedEcdhPublicKey: base64.encode(signedEcdhPublicKey),\n    ecdhKeyEncryptionKeySalt: base64.encode(ecdhKeyEncryptionKeySalt),\n  }\n}\n\nconst computeSharedKeyEncryptionKey = async (otherEcdhPublicKey, ecdhPrivateKey) => {\n  const sharedKeyEncryptionKey = await window.crypto.subtle.deriveKey(\n    {\n      name: ECDH_ALGORITHM_NAME,\n      namedCurve: NAMED_CURVE,\n      public: otherEcdhPublicKey\n    },\n    ecdhPrivateKey,\n    aesGcm.getEncryptionKeyParams(),\n    !KEY_IS_EXTRACTABLE,\n    aesGcm.KEY_WILL_BE_USED_TO\n  )\n\n  return sharedKeyEncryptionKey\n}\n\nexport default {\n  generateKeyPair,\n  generateEcdhKeyData,\n  importEcdhKeyEncryptionKeyFromMaster,\n  getPrivateKeyFromRawPrivateKey,\n  getRawPublicKeyFromPublicKey,\n  getPublicKeyFromRawPublicKey,\n  computeSharedKeyEncryptionKey,\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport hkdf from './hkdf'\nimport sha256 from './sha-256'\nimport { stringToArrayBuffer } from './utils'\n\nconst HMAC_KEY_NAME = 'authentication'\n\nconst ALGORITHM_NAME = 'HMAC'\nconst KEY_IS_EXTRACTABLE = false\nconst KEY_WILL_BE_USED_TO_SIGN = ['sign']\nconst KEY_WILL_BE_USED_TO_SIGN_AND_VERIFY = ['sign', 'verify']\n\nconst importKeyFromMaster = async (masterKey, salt) => {\n  const hmacKey = await window.crypto.subtle.deriveKey(\n    hkdf.getParams(HMAC_KEY_NAME, salt),\n    masterKey,\n    {\n      name: ALGORITHM_NAME,\n      hash: {\n        name: sha256.HASH_ALGORITHM_NAME\n      },\n      length: 512 // need to explicitly set length for WebCrypto node polyfill (see: https://github.com/PeculiarVentures/webcrypto-core/issues/31)\n    },\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO_SIGN\n  )\n  return hmacKey\n}\n\nconst importKeyFromRawBits = async (rawBits) => {\n  const hmacKey = await window.crypto.subtle.importKey(\n    'raw',\n    rawBits,\n    {\n      name: ALGORITHM_NAME,\n      hash: {\n        name: sha256.HASH_ALGORITHM_NAME\n      },\n      length: 256 // need to explicitly set length for WebCrypto node polyfill (see: https://github.com/PeculiarVentures/webcrypto-core/issues/31)\n    },\n    KEY_IS_EXTRACTABLE,\n    KEY_WILL_BE_USED_TO_SIGN_AND_VERIFY\n  )\n  return hmacKey\n}\n\n/**\n *\n * @param {CryptoKey} key\n * @param {String} data\n */\nconst sign = async (key, data) => {\n  const result = await window.crypto.subtle.sign(\n    {\n      name: ALGORITHM_NAME,\n    },\n    key,\n    data\n  )\n  return result\n}\n\n/**\n *\n * @param {CryptoKey} key\n * @param {String} data\n */\nconst signString = async (key, data) => {\n  const result = await sign(key, stringToArrayBuffer(data))\n  return base64.encode(result)\n}\n\nexport default {\n  importKeyFromMaster,\n  importKeyFromRawBits,\n  sign,\n  signString\n}\n",
+    "import aesGcm from './aes-gcm'\nimport diffieHellman from './diffie-hellman'\nimport ecdsa from './ecdsa'\nimport ecdh from './ecdh'\nimport sha256 from './sha-256'\nimport hmac from './hmac'\nimport hkdf from './hkdf'\nimport scrypt from './scrypt'\n\nconst SEED_BYTE_SIZE = 32 // 256 / 8\nconst generateSeed = () => window.crypto.getRandomValues(new Uint8Array(SEED_BYTE_SIZE))\n\nexport default {\n  generateSeed,\n  aesGcm,\n  diffieHellman,\n  ecdsa,\n  ecdh,\n  sha256,\n  hmac,\n  hkdf,\n  scrypt\n}\n",
+    "import scryptJs from 'scrypt-js'\nimport base64 from 'base64-arraybuffer'\nimport { stringToArrayBuffer } from './utils'\n\n/**\n *\n * From the Scrypt paper:\n *\n * \"100ms is a reasonable upper bound on the delay which should be\n * cryptographically imposed on interactive logins\"\n *\n * Pg. 13\n * https://www.tarsnap.com/scrypt/scrypt.pdf\n *\n * With an optimized Scrypt algorithm running on a 3.1 GHz Intel Core i5,\n * N = 32768 is the highest work factor that takes <100ms for the\n * algorithm to run. Thus, it's the latest recommended work factor.\n *\n * Source: https://blog.filippo.io/the-scrypt-parameters/\n *\n * However, we are not running an optimized version of the algorithm on a\n * single machine. Users are running a pure js version written for the browser.\n * Safari, for example, takes >6 seconds to run when N = 32768 on a 2.5 GHz\n * Intel Core i5. A higher end CPU can only shave around 1 second off that time.\n * Further, it takes over 1s to run in Firefox, and over 500ms to run in Chrome.\n * This is an unacceptably slow interactive login delay to impose on users.\n *\n * Thus, we are going with N = 16384 to ensure interactive logins\n * are closer to the reasonable delay the function will impose on users,\n * while still maintaining a high level of security.\n *\n **/\nconst N = 16384 // 16mb\nconst r = 8\nconst p = 1\nconst dkLen = 32\n\n/**\n * NIST recommendation:\n *\n * \"The length of the randomly-generated portion of the salt shall be at least 128 bits.\"\n *\n * Section 5.1\n * https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf\n *\n **/\nconst SALT_LENGTH = 16\nconst generateSalt = () => window.crypto.getRandomValues(new Uint8Array(SALT_LENGTH))\n\nconst hash = async (passwordString, salt, passwordHashAlgo = scryptJs.scrypt) => {\n  const passwordArrayBuffer = new Uint8Array(stringToArrayBuffer(passwordString))\n  const passwordHash = await passwordHashAlgo(passwordArrayBuffer, salt, N, r, p, dkLen)\n  return base64.encode(passwordHash)\n}\n\nexport default {\n  generateSalt,\n  hash,\n}\n",
+    "export const readArrayBufferAsString = (arrayBuffer) => {\n  return new Promise(resolve => {\n    let reader = new FileReader()\n    reader.onload = () => resolve(reader.result)\n    reader.readAsText(new Blob([arrayBuffer]))\n  })\n}\n\nconst removeProtocolFromEndpoint = (endpoint) => {\n  const http = 'http://'\n  const https = 'https://'\n\n  if (endpoint.substring(0, http.length) === http) {\n    return endpoint.substring(http.length)\n  } else if (endpoint.substring(0, https.length) === https) {\n    return endpoint.substring(https.length)\n  } else {\n    return endpoint\n  }\n}\n\nexport const getProtocolFromEndpoint = (endpoint) => {\n  return endpoint.split(':')[0]\n}\n\nexport const getWsUrl = (endpoint) => {\n  const host = removeProtocolFromEndpoint(endpoint)\n  const protocol = getProtocolFromEndpoint(endpoint)\n\n  return ((protocol === 'https') ?\n    'wss://' : 'ws://') + host\n}\n\nexport const byteSizeOfString = (string) => {\n  return string.length * 2\n}\n\nexport const objectHasOwnProperty = (object, property) => {\n  return Object.prototype.hasOwnProperty.call(object, property)\n}\n\n// source: http://code.iamkate.com/javascript/queues\nexport function Queue() {\n  let queue = []\n  let offset = 0\n\n  this.getLength = () => queue.length - offset\n\n  this.isEmpty = () => queue.length === 0\n\n  this.enqueue = (item) => {\n    queue.push(item)\n    return this.getLength()\n  }\n\n  this.dequeue = () => {\n    // get item from front of the queue\n    const item = queue[offset]\n\n    offset += 1\n\n    // garbage collect unused space in queue when it grows large\n    if (offset * 2 > queue.length) {\n      queue = queue.slice(offset)\n      offset = 0\n    }\n\n    return item\n  }\n\n  this.peek = () => queue[offset]\n}\n",
+    "// load the worker using inline JS so clients can avoid needing to load worker from a separate file\n// https://stackoverflow.com/a/19201292\nconst newWorker = () => {\n  const workerFunction = function () {\n    self.onmessage = function (e) {\n      const {\n        compress,\n        decompress,\n        data,\n      } = e.data\n\n      // copied from LZString, since can't load module from inside web worker without loading a separate file\n      // https://github.com/pieroxy/lz-string/blob/b2e0b270a9f3cf330b778b777385fcba384a1a02/libs/lz-string.min.js\n      const LZString = function () { function o(o, r) { if (!t[o]) { t[o] = {}; for (var n = 0; n < o.length; n++)t[o][o.charAt(n)] = n } return t[o][r] } var r = String.fromCharCode, n = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\", e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\", t = {}, i = { compressToBase64: function (o) { if (null == o) return \"\"; var r = i._compress(o, 6, function (o) { return n.charAt(o) }); switch (r.length % 4) { default: case 0: return r; case 1: return r + \"===\"; case 2: return r + \"==\"; case 3: return r + \"=\" } }, decompressFromBase64: function (r) { return null == r ? \"\" : \"\" == r ? null : i._decompress(r.length, 32, function (e) { return o(n, r.charAt(e)) }) }, compressToUTF16: function (o) { return null == o ? \"\" : i._compress(o, 15, function (o) { return r(o + 32) }) + \" \" }, decompressFromUTF16: function (o) { return null == o ? \"\" : \"\" == o ? null : i._decompress(o.length, 16384, function (r) { return o.charCodeAt(r) - 32 }) }, compressToUint8Array: function (o) { for (var r = i.compress(o), n = new Uint8Array(2 * r.length), e = 0, t = r.length; t > e; e++) { var s = r.charCodeAt(e); n[2 * e] = s >>> 8, n[2 * e + 1] = s % 256 } return n }, decompressFromUint8Array: function (o) { if (null === o || void 0 === o) return i.decompress(o); for (var n = new Array(o.length / 2), e = 0, t = n.length; t > e; e++)n[e] = 256 * o[2 * e] + o[2 * e + 1]; var s = []; return n.forEach(function (o) { s.push(r(o)) }), i.decompress(s.join(\"\")) }, compressToEncodedURIComponent: function (o) { return null == o ? \"\" : i._compress(o, 6, function (o) { return e.charAt(o) }) }, decompressFromEncodedURIComponent: function (r) { return null == r ? \"\" : \"\" == r ? null : (r = r.replace(/ /g, \"+\"), i._decompress(r.length, 32, function (n) { return o(e, r.charAt(n)) })) }, compress: function (o) { return i._compress(o, 16, function (o) { return r(o) }) }, _compress: function (o, r, n) { if (null == o) return \"\"; var e, t, i, s = {}, p = {}, u = \"\", c = \"\", a = \"\", l = 2, f = 3, h = 2, d = [], m = 0, v = 0; for (i = 0; i < o.length; i += 1)if (u = o.charAt(i), Object.prototype.hasOwnProperty.call(s, u) || (s[u] = f++, p[u] = !0), c = a + u, Object.prototype.hasOwnProperty.call(s, c)) a = c; else { if (Object.prototype.hasOwnProperty.call(p, a)) { if (a.charCodeAt(0) < 256) { for (e = 0; h > e; e++)m <<= 1, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++; for (t = a.charCodeAt(0), e = 0; 8 > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } else { for (t = 1, e = 0; h > e; e++)m = m << 1 | t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t = 0; for (t = a.charCodeAt(0), e = 0; 16 > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } l--, 0 == l && (l = Math.pow(2, h), h++), delete p[a] } else for (t = s[a], e = 0; h > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; l--, 0 == l && (l = Math.pow(2, h), h++), s[c] = f++, a = String(u) } if (\"\" !== a) { if (Object.prototype.hasOwnProperty.call(p, a)) { if (a.charCodeAt(0) < 256) { for (e = 0; h > e; e++)m <<= 1, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++; for (t = a.charCodeAt(0), e = 0; 8 > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } else { for (t = 1, e = 0; h > e; e++)m = m << 1 | t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t = 0; for (t = a.charCodeAt(0), e = 0; 16 > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } l--, 0 == l && (l = Math.pow(2, h), h++), delete p[a] } else for (t = s[a], e = 0; h > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; l--, 0 == l && (l = Math.pow(2, h), h++) } for (t = 2, e = 0; h > e; e++)m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; for (; ;) { if (m <<= 1, v == r - 1) { d.push(n(m)); break } v++ } return d.join(\"\") }, decompress: function (o) { return null == o ? \"\" : \"\" == o ? null : i._decompress(o.length, 32768, function (r) { return o.charCodeAt(r) }) }, _decompress: function (o, n, e) { var t, i, s, p, u, c, a, l, f = [], h = 4, d = 4, m = 3, v = \"\", w = [], A = { val: e(0), position: n, index: 1 }; for (i = 0; 3 > i; i += 1)f[i] = i; for (p = 0, c = Math.pow(2, 2), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; switch (t = p) { case 0: for (p = 0, c = Math.pow(2, 8), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; l = r(p); break; case 1: for (p = 0, c = Math.pow(2, 16), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; l = r(p); break; case 2: return \"\" }for (f[3] = l, s = l, w.push(l); ;) { if (A.index > o) return \"\"; for (p = 0, c = Math.pow(2, m), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; switch (l = p) { case 0: for (p = 0, c = Math.pow(2, 8), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; f[d++] = r(p), l = d - 1, h--; break; case 1: for (p = 0, c = Math.pow(2, 16), a = 1; a != c;)u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; f[d++] = r(p), l = d - 1, h--; break; case 2: return w.join(\"\") }if (0 == h && (h = Math.pow(2, m), m++), f[l]) v = f[l]; else { if (l !== d) return null; v = s + s.charAt(0) } w.push(v), f[d++] = s + v.charAt(0), h--, s = v, 0 == h && (h = Math.pow(2, m), m++) } } }; return i }()\n\n      if (compress) postMessage(LZString.compress(data))\n      else if (decompress) postMessage(LZString.decompress(data))\n    }\n  }\n\n  const blobURL = URL.createObjectURL(new Blob(\n    ['(', workerFunction.toString(), ')()'],\n    { type: 'application/javascript' }\n  ))\n\n  const worker = new Worker(blobURL)\n\n  URL.revokeObjectURL(blobURL)\n  return worker\n}\n\n// compress and decompress inside a worker because large amounts of data freeze the DOM\nexport const compress = async (data) => {\n  const worker = newWorker()\n  return new Promise((resolve) => {\n    worker.onmessage = (e) => {\n      resolve(e.data)\n      worker.terminate()\n    }\n    worker.postMessage({ compress: true, data })\n  })\n}\n\nexport const decompress = async (data) => {\n  const worker = newWorker()\n  return new Promise((resolve) => {\n    worker.onmessage = (e) => {\n      resolve(e.data)\n      worker.terminate()\n    }\n    worker.postMessage({ decompress: true, data })\n  })\n}\n",
+    "import config from '../config'\nimport { processXhr } from './utils'\n\nconst TIMEOUT = 30 * 1000\n\nexport const uploadBundleChunk = async (userId, databaseId, seqNo, bundleId, chunkNo, chunk) => {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n\n    const method = 'POST'\n    const url = `${config.getEndpoint()}/api/bundle-chunk?userbaseJsVersion=${config.USERBASE_JS_VERSION}&` +\n      `userId=${userId}&` +\n      `databaseId=${databaseId}&` +\n      `seqNo=${seqNo}&` +\n      `bundleId=${bundleId}&` +\n      `chunkNumber=${chunkNo}`\n\n    xhr.open(method, url)\n    xhr.send(new Uint8Array(chunk)) // Uint8Array view prevents deprecation warning in Safari\n\n    processXhr(xhr, resolve, reject, TIMEOUT)\n  })\n}\n",
+    "import base64 from 'base64-arraybuffer'\nimport uuidv4 from 'uuid/v4'\nimport localData from './localData'\nimport crypto from './Crypto'\nimport { getWsUrl } from './utils'\nimport statusCodes from './statusCodes'\nimport config from './config'\nimport errors from './errors'\nimport { appendBuffers, arrayBufferToString, stringToArrayBuffer } from './Crypto/utils'\nimport { compress, decompress } from './worker'\nimport { uploadBundleChunk } from './api/db'\n\nconst wsAlreadyConnected = 'Web Socket already connected'\n\nconst BACKOFF_RETRY_DELAY = 1000\nconst MAX_RETRY_DELAY = 1000 * 30\n\nconst BUNDLE_CHUNK_SIZE = 1024 * 512 // 512kb\nconst BUNDLE_CHUNKS_PER_BATCH = 10\n\nconst WS_REQUEST_TIMEOUT = 30 * 1000\n\nconst clientId = uuidv4() // only 1 client ID per browser tab (assumes code does not reload)\n\nclass RequestFailed extends Error {\n  constructor(action, e, ...params) {\n    super(...params)\n\n    this.name = `RequestFailed: ${action}`\n    this.message = e.message\n    this.status = e.status || (e.message === 'timeout' && statusCodes['Gateway Timeout'])\n    this.response = e.status && e\n  }\n}\n\nclass WebSocketError extends Error {\n  constructor(message, username, e, ...params) {\n    super(...params)\n\n    this.name = 'WebSocket error'\n    this.message = message\n    this.username = username\n    this.e = e\n  }\n}\n\nclass Connection {\n  constructor() {\n    this.init()\n  }\n\n  init(resolveConnection, rejectConnection, session, seedString, rememberMe, changePassword, state, encryptionMode) {\n    if (this.pingTimeout) clearTimeout(this.pingTimeout)\n\n    for (const property of Object.keys(this)) {\n      delete this[property]\n    }\n\n    this.ws = null\n    this.connected = false\n\n    this.resolveConnection = resolveConnection\n    this.rejectConnection = rejectConnection\n    this.connectionResolved = false\n\n    this.session = {\n      username: session && session.username,\n      sessionId: session && session.sessionId,\n      creationDate: session && session.creationDate,\n      expirationDate: session && session.expirationDate,\n      userId: session && session.userId,\n      authToken: session && session.authToken,\n    }\n\n    this.seedString = seedString\n    this.changePassword = changePassword\n    this.keys = {\n      init: false,\n      salts: {}\n    }\n\n    this.userData = {\n      stripeData: {}\n    }\n\n    this.rememberMe = rememberMe\n\n    this.requests = {}\n\n    this.state = state || {\n      dbNameToHash: {},\n      databases: {}, // used when openDatabase is called with databaseName\n      databasesByDbId: {}, // used when openDatabase is called with databaseId\n      shareTokenIdToDbId: {}, // used when openDatabase is called with shareToken\n    }\n\n    this.encryptionMode = encryptionMode\n  }\n\n  connect(session, seedString = null, rememberMe, changePassword, reconnectDelay, state) {\n    if (this.connected) throw new WebSocketError(wsAlreadyConnected, this.session.username)\n\n    return new Promise((resolve, reject) => {\n      let timeout = false\n\n      const timeoutToOpenWebSocket = setTimeout(\n        () => {\n          if (!this.connected && !this.reconnecting) {\n            timeout = true\n            reject(new WebSocketError('timeout'))\n          }\n        },\n        10000\n      )\n\n      const url = `${getWsUrl(config.getEndpoint())}/api?appId=${config.getAppId()}&sessionId=${session.sessionId}&clientId=${clientId}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n\n      const ws = new WebSocket(url)\n\n      ws.onopen = async () => {\n        if (timeout) return\n        clearTimeout(timeoutToOpenWebSocket)\n      }\n\n      ws.onmessage = async (e) => {\n        if (timeout) return\n\n        try {\n          const message = JSON.parse(e.data)\n          const route = message.route\n\n          switch (route) {\n            case 'Ping': {\n              this.heartbeat()\n\n              const action = 'Pong'\n              this.ws.send(JSON.stringify({ action }))\n              break\n            }\n\n            case 'Connection': {\n              const { encryptionMode } = message\n              this.init(resolve, reject, session, seedString, rememberMe, changePassword, state, encryptionMode)\n              this.ws = ws\n              this.heartbeat()\n              this.connected = true\n\n              // seedString not present on initial connection when still need to change password\n              if (seedString) {\n                const {\n                  keySalts,\n                  validationMessage,\n                  ecKeyData,\n                  encryptedValidationMessage,\n                } = message\n\n                this.keys.salts = keySalts\n\n                this.validationMessage = validationMessage\n                this.ecKeyData = ecKeyData\n\n                // provided by userbase-server for users who have not yet generated their ECDSA key and\n                // still only have a DH key\n                if (encryptedValidationMessage) this.encryptedValidationMessage = new Uint8Array(encryptedValidationMessage.data)\n\n                try {\n                  await this.setKeys(this.seedString)\n                  const userData = await this.validateKey()\n                  this.userData = userData\n                } catch (e) {\n                  if ((e && e.name === 'OperationError') || e instanceof DOMException) throw new Error('Invalid seed')\n                  else throw e\n                }\n\n                this.keys.init = true\n              }\n\n              this.resolveConnection()\n              this.connectionResolved = true\n              break\n            }\n\n            case 'ApplyTransactions': {\n              const dbId = message.dbId\n              const dbNameHash = message.dbNameHash\n\n              // if owner, must have opened the database via databaseName\n              const database = message.isOwner\n                ? this.state.databases[dbNameHash]\n                : this.state.databasesByDbId[dbId]\n\n              if (!database) throw new Error('Missing database')\n\n              // queue guarantees transactions will be applied in the order they are received from the server\n              if (database.applyTransactionsQueue.isEmpty()) {\n\n                // take a spot in the queue and proceed applying so the next caller knows queue is not empty\n                database.applyTransactionsQueue.enqueue(null)\n              } else {\n\n                // wait until prior batch in queue finishes applying successfully\n                await new Promise(resolve => {\n                  const startApplyingThisBatchOfTransactions = resolve\n                  database.applyTransactionsQueue.enqueue(startApplyingThisBatchOfTransactions)\n                })\n              }\n\n              const openingDatabase = (message.dbNameHash && (message.dbKey || message.plaintextDbKey)) || message.shareTokenEncryptedDbKey\n              if (openingDatabase && (!database.dbKeyString || !database.dbKey)) {\n                const dbKeyString = message.plaintextDbKey || (message.dbKey\n                  ? await crypto.aesGcm.decryptString(this.keys.encryptionKey, message.dbKey)\n                  : await database.decryptShareTokenEncryptedDbKey(message.shareTokenEncryptedDbKey, message.shareTokenEncryptionKeySalt)\n                )\n                database.dbKeyString = dbKeyString\n                database.dbKey = await crypto.aesGcm.getKeyFromKeyString(dbKeyString)\n              }\n\n              if (!database.dbKey) throw new Error('Missing db key')\n\n              if (message.writers) {\n                database.attributionEnabled = true\n                for (const { userId, username } of message.writers) {\n                  database.usernamesByUserId.set(userId, username)\n                }\n              }\n\n              // server is sending bundle in chunks, wait until it sends the entire bundle and client applies it\n              if (message.waitForFullBundle) {\n                if (!database.finishedWaitingForBundle) {\n                  await new Promise(resolve => database.finishedWaitingForBundle = resolve)\n                }\n\n                // rebuild bundle from the chunks\n                try {\n                  const bundle = await this.rebuildBundle(database, message.bundleSeqNo, message.encryptedBundleEncryptionKey)\n                  await database.applyBundle(bundle, message.bundleSeqNo)\n                } catch (e) {\n                  window.alert(`Oops! Something went wrong. Please contact the site administrator with this issue (${dbId}).\\n\\n` + e)\n                  throw e\n                }\n              }\n\n              const newTransactions = message.transactionLog\n              await database.applyTransactions(newTransactions, message.ownerId, dbId, dbNameHash)\n\n              if (message.buildBundle) {\n                this.buildBundle(database)\n              }\n\n              // start applying next batch in queue when this one is finished applying successfully\n              database.applyTransactionsQueue.dequeue()\n              if (!database.applyTransactionsQueue.isEmpty()) {\n                const startApplyingNextBatchInQueue = database.applyTransactionsQueue.peek()\n                startApplyingNextBatchInQueue()\n              }\n\n              break\n            }\n\n            case 'DownloadBundleChunk': {\n              const { dbId, dbNameHash, isOwner, bundleSeqNo, isFirstChunk, isLastChunk, chunk } = message\n\n              // if owner, must have opened the database via databaseName\n              const database = isOwner\n                ? this.state.databases[dbNameHash]\n                : this.state.databasesByDbId[dbId]\n\n              if (!database) throw new Error('Missing database')\n\n              // assumes server will always send first chunk first, and last chunk last\n              if (isFirstChunk) database.bundleChunks[bundleSeqNo] = []\n\n              database.bundleChunks[bundleSeqNo].push(chunk)\n\n              if (isLastChunk) {\n                if (database.finishedWaitingForBundle) database.finishedWaitingForBundle()\n                else database.finishedWaitingForBundle = true\n              }\n\n              break\n            }\n\n            case 'UpdatedUser': {\n              this.handleUpdateUser(message.updatedUser)\n              break\n            }\n\n            case 'SignOut':\n            case 'UpdateUser':\n            case 'DeleteUser':\n            case 'CreateDatabase':\n            case 'OpenDatabase':\n            case 'OpenDatabaseByDatabaseId':\n            case 'GetDatabases':\n            case 'GetDatabaseUsers':\n            case 'Insert':\n            case 'Update':\n            case 'Delete':\n            case 'BatchTransaction':\n            case 'InitBundleUpload':\n            case 'CompleteBundleUpload':\n            case 'GenerateFileId':\n            case 'UploadFileChunk':\n            case 'CompleteFileUpload':\n            case 'GetChunk':\n            case 'ValidateKey':\n            case 'GetPasswordSalts':\n            case 'PurchaseSubscription':\n            case 'CancelSubscription':\n            case 'ResumeSubscription':\n            case 'UpdatePaymentMethod':\n            case 'ShareDatabase':\n            case 'ShareDatabaseToken':\n            case 'AuthenticateShareToken':\n            case 'SaveDatabase':\n            case 'ModifyDatabasePermissions':\n            case 'VerifyUser':\n              {\n                const requestId = message.requestId\n\n                if (!requestId) return console.warn('Missing request id')\n\n                const request = this.requests[requestId]\n                if (!request) return console.warn(`Request ${requestId} no longer exists!`)\n                else if (!request.promiseResolve || !request.promiseReject) return\n\n                const response = message.response\n\n                const successfulResponse = response && response.status === statusCodes['Success']\n\n                if (!successfulResponse) return request.promiseReject(response)\n                else return request.promiseResolve(response)\n              }\n\n            default: {\n              console.log('Received unknown message from backend:' + JSON.stringify(message))\n              break\n            }\n          }\n        } catch (e) {\n          if (!this.connectionResolved) {\n            this.close()\n            reject(new WebSocketError(e.message, session.username, e))\n          } else {\n            console.warn('Error handling message: ', e)\n          }\n        }\n      }\n\n      ws.onclose = async (e) => {\n        if (timeout) return\n\n        const serviceRestart = e.code === statusCodes['Service Restart']\n        const clientDisconnected = e.code === statusCodes['No Pong Received']\n        const attemptToReconnect = serviceRestart || clientDisconnected || !e.wasClean // closed without explicit call to ws.close()\n\n        if (attemptToReconnect) {\n          const delay = (serviceRestart && !reconnectDelay)\n            ? 0\n            : (reconnectDelay ? reconnectDelay + BACKOFF_RETRY_DELAY : 1000)\n\n          this.reconnecting = true\n          await this.reconnect(resolve, reject, session, this.seedString || seedString, rememberMe, changePassword, delay, !this.reconnected && state)\n        } else if (e.code === statusCodes['Client Already Connected']) {\n          reject(new WebSocketError(wsAlreadyConnected, session.username, e))\n        } else {\n          this.init()\n        }\n      }\n\n      ws.onerror = () => { } // no-op so node WS implementation doesn't throw not found\n    })\n  }\n\n  async reconnect(resolveConnection, rejectConnection, session, seedString, rememberMe, changePassword, reconnectDelay, currentState) {\n    try {\n      const retryDelay = Math.min(reconnectDelay, MAX_RETRY_DELAY)\n      console.log(`Connection to server lost. Attempting to reconnect in ${retryDelay / 1000} second${retryDelay !== 1000 ? 's' : ''}...`)\n\n      const dbsToReopen = []\n      const dbsToReopenById = []\n\n      // as soon as one reconnect succeeds, resolves all the way up the stack and all reconnects succeed\n      resolveConnection(await new Promise((resolve, reject) => setTimeout(\n        async () => {\n          try {\n            // get copy of currently opened databases' memory references to reopen WebSocket with same databases\n            const state = currentState || {\n              dbNameToHash: { ...this.state.dbNameToHash },\n              databases: { ...this.state.databases },\n              databasesByDbId: { ...this.state.databasesByDbId },\n              shareTokenIdToDbId: { ...this.state.shareTokenIdToDbId },\n            }\n\n            // mark databases as uninitialized to prevent client from using them until they are reopened\n            for (const dbNameHash in state.databases) {\n              state.databases[dbNameHash].init = false\n              state.databases[dbNameHash].finishedWaitingForBundle = false\n              dbsToReopen.push(dbNameHash)\n            }\n\n            for (const dbId in state.databasesByDbId) {\n              state.databasesByDbId[dbId].init = false\n              state.databasesByDbId[dbId].finishedWaitingForBundle = false\n              dbsToReopenById.push(dbId)\n            }\n\n            this.init()\n            this.reconnecting = true\n\n            const result = await this.connect(session, seedString, rememberMe, changePassword, reconnectDelay, state)\n\n            this.reconnected = true\n\n            // only reopen databases on the first call to reconnect()\n            if (!currentState) {\n              await this.reopenDatabases(dbsToReopen, dbsToReopenById, 1000)\n              console.log('Reconnected!')\n            }\n\n            resolve(result)\n          } catch (e) {\n            reject(e)\n          }\n        },\n        retryDelay\n      )))\n    } catch (e) {\n      rejectConnection(e)\n    }\n  }\n\n  async reopenDatabases(dbsToReopen, dbsToReopenById, retryDelay) {\n    try {\n      const openDatabasePromises = []\n\n      // open databases by database name hash\n      for (const dbNameHash of dbsToReopen) {\n        const database = this.state.databases[dbNameHash]\n\n        if (!database.init) {\n          const action = 'OpenDatabase'\n          const params = { dbNameHash, reopenAtSeqNo: database.lastSeqNo }\n          openDatabasePromises.push(this.request(action, params))\n        }\n      }\n\n      // open databases by database ID\n      for (const databaseId of dbsToReopenById) {\n        const database = this.state.databasesByDbId[databaseId]\n\n        if (!database.init) {\n          const shareTokenHkdfKey = database.shareTokenHkdfKey\n\n          // if opened with shareToken, need to reauthenticate it\n          const shareTokenAuthData = shareTokenHkdfKey\n            ? await this.authenticateShareToken(database.shareTokenId, shareTokenHkdfKey)\n            : {}\n\n          const action = 'OpenDatabaseByDatabaseId'\n          const params = { databaseId, reopenAtSeqNo: database.lastSeqNo, ...shareTokenAuthData }\n          openDatabasePromises.push(this.request(action, params))\n        }\n      }\n\n      await Promise.all(openDatabasePromises)\n    } catch (e) {\n\n      // keep attempting to reopen on failure\n      await new Promise(resolve => setTimeout(\n        async () => {\n          await this.reopenDatabases(dbsToReopen, dbsToReopenById, retryDelay + BACKOFF_RETRY_DELAY)\n          resolve()\n        },\n        Math.min(retryDelay, MAX_RETRY_DELAY)\n      ))\n    }\n  }\n\n  heartbeat() {\n    clearTimeout(this.pingTimeout)\n\n    const LATENCY_BUFFER = 3000\n\n    this.pingTimeout = setTimeout(() => {\n      if (this.ws) this.ws.close(statusCodes['No Pong Received'])\n    }, 30000 + LATENCY_BUFFER)\n  }\n\n  close(code) {\n    this.ws\n      ? this.ws.close(code)\n      : this.init()\n  }\n\n  async signOut() {\n    const username = this.session.username\n    const connectionResolved = this.connectionResolved\n    const rejectConnection = this.rejectConnection\n\n    try {\n      localData.signOutSession(this.rememberMe, username)\n\n      const sessionId = this.session.sessionId\n\n      if (this.reconnecting) throw new errors.Reconnecting\n\n      const action = 'SignOut'\n      const params = { sessionId }\n      await this.request(action, params)\n\n      this.close()\n\n      if (!connectionResolved && rejectConnection) {\n        rejectConnection(new WebSocketError('Canceled', username))\n      }\n\n    } catch (e) {\n      if (!connectionResolved && rejectConnection) {\n        rejectConnection(new WebSocketError('Canceled', username))\n      }\n\n      throw e\n    }\n  }\n\n  async setKeys(seedString) {\n    if (this.keys.init) return\n    if (!seedString) throw new WebSocketError('Missing seed', this.session.username)\n    if (!this.keys.salts) throw new WebSocketError('Missing salts', this.session.username)\n    if (!this.seedString) this.seedString = seedString\n\n    const seed = base64.decode(seedString)\n    const masterKey = await crypto.hkdf.importHkdfKey(seed)\n\n    const salts = this.keys.salts\n    this.keys.encryptionKey = await crypto.aesGcm.importKeyFromMaster(masterKey, base64.decode(salts.encryptionKeySalt))\n    this.keys.hmacKey = await crypto.hmac.importKeyFromMaster(masterKey, base64.decode(salts.hmacKeySalt))\n\n    if (salts.ecdsaKeyEncryptionKeySalt) {\n      const ecdsaKeyEncryptionKey = await crypto.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(masterKey, base64.decode(salts.ecdsaKeyEncryptionKeySalt))\n      const encryptedEcdsaPrivateKey = base64.decode(this.ecKeyData.encryptedEcdsaPrivateKey)\n      const rawEcdsaPrivateKey = await crypto.aesGcm.decrypt(ecdsaKeyEncryptionKey, encryptedEcdsaPrivateKey)\n      this.keys.ecdsaPrivateKey = await crypto.ecdsa.getPrivateKeyFromRawPrivateKey(rawEcdsaPrivateKey)\n\n      const ecdhKeyEncryptionKey = await crypto.ecdh.importEcdhKeyEncryptionKeyFromMaster(masterKey, base64.decode(salts.ecdhKeyEncryptionKeySalt))\n      const encryptedEcdhPrivateKey = base64.decode(this.ecKeyData.encryptedEcdhPrivateKey)\n      const rawEcdhPrivateKey = await crypto.aesGcm.decrypt(ecdhKeyEncryptionKey, encryptedEcdhPrivateKey)\n      this.keys.ecdhPrivateKey = await crypto.ecdh.getPrivateKeyFromRawPrivateKey(rawEcdhPrivateKey)\n    } else if (salts.dhKeySalt) {\n\n      // must be an old user created with userbase-js < v2.0.0. Need to prove access to DH key to server\n      this.keys.dhPrivateKey = await crypto.diffieHellman.importKeyFromMaster(masterKey, base64.decode(salts.dhKeySalt))\n    }\n\n    if (salts.dhKeySalt || salts.ecdsaKeyWrapperSalt) {\n\n      // must be an old user created with userbase-js <= v2.0.0. Update EC key data for future logins\n      const ecdsaKeyData = await crypto.ecdsa.generateEcdsaKeyData(masterKey)\n      const ecdhKeyData = await crypto.ecdh.generateEcdhKeyData(masterKey, ecdsaKeyData.ecdsaPrivateKey)\n\n      this.keys.ecdsaPrivateKey = ecdsaKeyData.ecdsaPrivateKey\n      this.keys.ecdhPrivateKey = ecdhKeyData.ecdhPrivateKey\n\n      delete ecdsaKeyData.ecdsaPrivateKey\n      delete ecdhKeyData.ecdhPrivateKey\n\n      this.newEcKeyData = {\n        ecdsaKeyData,\n        ecdhKeyData,\n      }\n    }\n  }\n\n  async validateKey() {\n    let validationMessage\n    if (this.keys.ecdsaPrivateKey && !this.keys.dhPrivateKey) {\n\n      // need to sign the validation message with ECDSA private key\n      validationMessage = await crypto.ecdsa.sign(this.keys.ecdsaPrivateKey, base64.decode(this.validationMessage))\n\n    } else if (this.keys.dhPrivateKey) {\n\n      // need to decrypt the encrypted validation emssage with DH shared key\n      const sharedKey = await crypto.diffieHellman.getSharedKeyWithServer(this.keys.dhPrivateKey)\n      validationMessage = await crypto.aesGcm.decrypt(sharedKey, this.encryptedValidationMessage)\n\n      delete this.keys.dhPrivateKey\n    }\n\n    const action = 'ValidateKey'\n    const params = {\n      validationMessage: base64.encode(validationMessage),\n      ecKeyData: this.newEcKeyData\n    }\n\n    const response = await this.request(action, params)\n    const userData = response.data\n    return userData\n  }\n\n  async request(action, params) {\n    // generate a new requestId\n    const requestId = uuidv4()\n    this.requests[requestId] = {}\n\n    // get a promise that is resolved when the WebSocket\n    // receives a response for this requestId — the promise\n    // would time out of x seconds\n    const responseWatcher = this.watch(requestId)\n\n    // send the request on the WebSocket\n    this.ws.send(JSON.stringify({\n      requestId,\n      action,\n      params\n    }))\n\n    // wait for the response to arrive\n    try {\n      const response = await responseWatcher\n      return response\n    } catch (e) {\n      // process any errors and re-throw them\n      if (e.status === statusCodes['Too Many Requests']) throw new errors.TooManyRequests(e.data.retryDelay)\n      else throw new RequestFailed(action, e)\n    }\n  }\n\n  async watch(requestId) {\n    const response = await new Promise((resolve, reject) => {\n      this.requests[requestId].promiseResolve = resolve\n      this.requests[requestId].promiseReject = reject\n\n      setTimeout(() => { reject(new Error('timeout')) }, WS_REQUEST_TIMEOUT)\n    })\n\n    delete this.requests[requestId]\n    return response\n  }\n\n  async rebuildBundle(database, bundleSeqNo, encryptedBundleEncryptionKey) {\n    const bundleChunks = []\n    for (let i = 0; i < database.bundleChunks[bundleSeqNo].length; i++) {\n      const chunk = database.bundleChunks[bundleSeqNo][i]\n      const chunkArrayBuffer = stringToArrayBuffer(chunk)\n      bundleChunks.push(chunkArrayBuffer)\n    }\n    const bundleArrayBuffer = appendBuffers(bundleChunks).buffer\n\n    const { encrypted, plaintextMetadata } = JSON.parse(arrayBufferToString(bundleArrayBuffer))\n\n    const bundleEncryptionKeyRaw = await crypto.aesGcm.decrypt(database.dbKey, base64.decode(encryptedBundleEncryptionKey))\n    const bundleEncryptionKey = await crypto.aesGcm.getKeyFromRawKey(bundleEncryptionKeyRaw)\n\n    const decrypted = await crypto.aesGcm.decrypt(bundleEncryptionKey, stringToArrayBuffer(encrypted))\n    const decryptedString = arrayBufferToString(decrypted)\n\n    const [decompressedEncrypted, decompressedPlaintextMetdata] = await Promise.all([\n      decompress(decryptedString),\n      decompress(plaintextMetadata),\n    ])\n\n    const bundle = {\n      ...JSON.parse(decompressedEncrypted),\n      ...JSON.parse(decompressedPlaintextMetdata),\n    }\n\n    delete database.bundleChunks[bundleSeqNo]\n\n    return bundle\n  }\n\n  async uploadBundle(userId, dbId, seqNo, bundleId, bundleArrayBuffer) {\n    let position = 0\n    let chunkNumber = 0\n    let batch = [] // will use this to send chunks to server in batches of BUNDLE_CHUNKS_PER_BATCH\n\n    while (position < bundleArrayBuffer.byteLength) {\n      const chunk = bundleArrayBuffer.slice(position, position + BUNDLE_CHUNK_SIZE)\n\n      // using XHR to send binary data because Safari has trouble with string encoding over WebSocket\n      batch.push(uploadBundleChunk(userId, dbId, seqNo, bundleId, chunkNumber, chunk))\n\n      if (batch.length === BUNDLE_CHUNKS_PER_BATCH) {\n        try {\n          await Promise.all(batch)\n        } catch {\n          // ok to fail - bundling is just an optimization\n          return 0\n        }\n        batch = []\n      }\n\n      chunkNumber += 1\n      position += BUNDLE_CHUNK_SIZE\n    }\n\n    try {\n      await Promise.all(batch)\n    } catch {\n      // ok to fail - bundling is just an optimization\n      return 0\n    }\n\n    return chunkNumber\n  }\n\n  async initBundleUpload(dbId, seqNo, dbKey) {\n    const action = 'InitBundleUpload'\n    const params = { dbId, seqNo }\n    let initResponse\n    try {\n      initResponse = await this.request(action, params)\n    } catch {\n      // ok to fail - bundling is just an optimization\n      return {}\n    }\n    const { bundleId } = initResponse.data\n\n    const [bundleEncryptionKey, encryptedBundleEncryptionKey] = await crypto.aesGcm.generateAndEncryptKeyEncryptionKey(dbKey)\n\n    return { bundleId, bundleEncryptionKey, encryptedBundleEncryptionKey: base64.encode(encryptedBundleEncryptionKey) }\n  }\n\n  orderedItems(items, itemsIndex) {\n    const orderedItemsArray = []\n    for (let i = 0; i < itemsIndex.array.length; i++) {\n      const itemId = itemsIndex.array[i].itemId\n      orderedItemsArray.push(items[itemId])\n    }\n    return orderedItemsArray\n  }\n\n  prepareBundle(database) {\n    const {\n      items,\n      itemsIndex,\n      itemsPlaintextMetadata,\n    } = database\n\n    const bundle = {\n      // these values are all provided as input values to SDK, or generated by SDK - will compress, then encrypt\n      encrypted: JSON.stringify({\n        items: this.orderedItems(items, itemsIndex),\n        itemsIndex: itemsIndex.array,\n      }),\n\n      // these are values the server has access to and can modify - will compress, but no need to encrypt and risk CRIME\n      plaintextMetadata: JSON.stringify({\n        itemsPlaintextMetadata: this.orderedItems(itemsPlaintextMetadata, itemsIndex),\n      }),\n    }\n\n    return bundle\n  }\n\n  async buildBundle(database) {\n    const dbId = database.dbId\n    const lastSeqNo = database.lastSeqNo\n    const dbKey = database.dbKey\n    const userId = this.session.userId\n\n    // Client will only attempt to bundle at a particular seqNo a single time. This prevents server from spamming\n    // client with buildBundle to maliciously get the client to re-use an IV in AES-GCM and reveal the dbKey\n    if (database.bundledAtSeqNo && database.bundledAtSeqNo >= lastSeqNo) return\n    else database.bundledAtSeqNo = lastSeqNo\n\n    const bundle = this.prepareBundle(database)\n\n    const writers = database.attributionEnabled\n      ? [...database.usernamesByUserId.keys()].join(',')\n      : undefined\n\n    const { bundleId, bundleEncryptionKey, encryptedBundleEncryptionKey } = await this.initBundleUpload(dbId, lastSeqNo, dbKey)\n    if (!bundleId) return\n\n    const [compressedBeforeEncryption, compressedPlaintextMetadataString] = await Promise.all([\n      compress(bundle.encrypted),\n      compress(bundle.plaintextMetadata),\n    ])\n\n    const compressedArrayBufferBeforeEncryption = stringToArrayBuffer(compressedBeforeEncryption)\n    const encryptedItems = await crypto.aesGcm.encrypt(bundleEncryptionKey, compressedArrayBufferBeforeEncryption)\n\n    bundle.encrypted = arrayBufferToString(encryptedItems)\n    bundle.plaintextMetadata = compressedPlaintextMetadataString\n    const bundleArrayBuffer = stringToArrayBuffer(JSON.stringify(bundle))\n\n    const numChunks = await this.uploadBundle(userId, dbId, lastSeqNo, bundleId, bundleArrayBuffer)\n    if (!numChunks) return\n\n    const action = 'CompleteBundleUpload'\n    const params = { dbId, seqNo: lastSeqNo, bundleId, writers, numChunks, encryptedBundleEncryptionKey }\n    try {\n      await this.request(action, params)\n    } catch {\n      // ok to fail - bundling is just an optimization\n      return\n    }\n  }\n\n  buildUserResult({ username, userId, authToken, email, profile, protectedProfile, usedTempPassword, changePassword, passwordChanged, userData }) {\n    const result = { username, userId, authToken }\n\n    if (email) result.email = email\n    if (profile) result.profile = profile\n    if (protectedProfile) result.protectedProfile = protectedProfile\n    if (usedTempPassword) result.usedTempPassword = usedTempPassword\n    if (changePassword) result.changePassword = changePassword\n    if (passwordChanged) result.passwordChanged = passwordChanged\n\n    if (userData) {\n      const { creationDate, stripeData } = userData\n      if (creationDate) result.creationDate = creationDate\n\n      if (stripeData) {\n        const { paymentsMode, subscriptionStatus, cancelSubscriptionAt, subscriptionPlanId, trialExpirationDate } = stripeData\n\n        if (paymentsMode) result.paymentsMode = paymentsMode\n        if (subscriptionStatus) result.subscriptionStatus = subscriptionStatus\n        if (cancelSubscriptionAt) result.cancelSubscriptionAt = cancelSubscriptionAt\n        if (subscriptionPlanId) result.subscriptionPlanId = subscriptionPlanId\n        if (trialExpirationDate) result.trialExpirationDate = trialExpirationDate\n      }\n    }\n\n    return result\n  }\n\n  handleUpdateUser(updatedUser) {\n    // make sure WebSocket session matches provided user\n    if (this.session && this.session.userId === updatedUser['userId']) {\n      this.session.username = updatedUser['username']\n      this.userData = updatedUser.userData\n\n      const updateUserHandler = config.getUpdateUserHandler()\n      if (updateUserHandler) {\n        updateUserHandler({ user: this.buildUserResult({ authToken: this.session.authToken, ...updatedUser }) })\n      }\n    }\n  }\n\n  async rotateKeys(newSeedString, newKeyData) {\n    // re-arrange object to fit expected structure for setKeys() function\n    const { keySalts, ecKeyData } = newKeyData\n    const { ecdsaKeyData, ecdhKeyData } = ecKeyData\n    keySalts.ecdsaKeyEncryptionKeySalt = ecdsaKeyData.ecdsaKeyEncryptionKeySalt\n    keySalts.ecdhKeyEncryptionKeySalt = ecdhKeyData.ecdhKeyEncryptionKeySalt\n\n    this.keys.salts = keySalts\n    this.ecKeyData = { ...ecdsaKeyData, ...ecdhKeyData }\n\n    await this.setKeys(newSeedString)\n\n    this.keys.init = true\n  }\n\n  async authenticateShareToken(shareTokenId, shareTokenHkdfKey) {\n    // retrieve shareToken auth key data in order to prove access to shareToken to server\n    const action = 'AuthenticateShareToken'\n    const params = { shareTokenId }\n\n    let response\n    try {\n      response = await this.request(action, params)\n    } catch (e) {\n      if (e.response && e.response.data === 'ShareTokenNotFound') throw new errors.ShareTokenNotFound\n      throw e\n    }\n    const { databaseId, shareTokenAuthKeyData, validationMessage } = response.data\n\n    // decrypt ECDSA private key. if it fails, not using the correct shareToken\n    let shareTokenEcdsaPrivateKey\n    try {\n      const shareTokenEcdsaKeyEncryptionKeySalt = base64.decode(shareTokenAuthKeyData.shareTokenEcdsaKeyEncryptionKeySalt)\n      const shareTokenEcdsaKeyEncryptionKey = await crypto.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(shareTokenHkdfKey, shareTokenEcdsaKeyEncryptionKeySalt)\n      const shareTokenEncryptedEcdsaPrivateKey = base64.decode(shareTokenAuthKeyData.shareTokenEncryptedEcdsaPrivateKey)\n      const shareTokenEcdsaPrivateKeyRaw = await crypto.aesGcm.decrypt(shareTokenEcdsaKeyEncryptionKey, shareTokenEncryptedEcdsaPrivateKey)\n      shareTokenEcdsaPrivateKey = await crypto.ecdsa.getPrivateKeyFromRawPrivateKey(shareTokenEcdsaPrivateKeyRaw)\n    } catch {\n      throw new errors.ShareTokenInvalid\n    }\n\n    // sign validation message sent by the server\n    const signedValidationMessage = await crypto.ecdsa.sign(shareTokenEcdsaPrivateKey, base64.decode(validationMessage))\n    return { databaseId, validationMessage, signedValidationMessage: base64.encode(signedValidationMessage) }\n  }\n}\n\nexport default new Connection()\n",
+    "import base64 from 'base64-arraybuffer'\nimport authApi from './api/auth'\nimport ws from './ws'\nimport crypto from './Crypto'\nimport localData from './localData'\nimport config from './config'\nimport errors from './errors'\nimport statusCodes from './statusCodes'\nimport { objectHasOwnProperty, getWsUrl } from './utils'\n\nconst MAX_PASSWORD_CHAR_LENGTH = 1000\nconst MIN_PASSWORD_CHAR_LENGTH = 6\n\nconst REMEMBER_ME_OPTIONS = {\n  local: true,\n  session: true,\n  none: true\n}\n\nconst KEY_NOT_FOUND_ON_SIGN_IN = \"Device not recognized. This temporary password can only be used to sign in from a device you've signed in from before.\"\nconst KEY_NOT_FOUND_ON_FORGOT_PASSWORD = \"Device not recognized. Forgot password only works from a device you've signed in from before.\"\n\nconst _checkSignedInState = () => {\n  if (ws.reconnecting) throw new errors.Reconnecting\n  if (!ws.keys.init && ws.changePassword) throw new errors.UserMustChangePassword\n  if (!ws.keys.init) throw new errors.UserNotSignedIn\n}\n\nconst _parseGenericErrors = (e) => {\n  if (e.response) {\n    if (e.response.data === 'Domain not whitelisted') {\n      throw new errors.DomainNotWhitelisted(window.location.origin)\n    } else if (e.response.data === 'App ID not valid') {\n      throw new errors.AppIdNotValid\n    } else if (e.response.data === 'UserNotFound') {\n      throw new errors.UserNotFound\n    } else if (e.response.status === statusCodes['Internal Server Error']) {\n      throw new errors.InternalServerError\n    } else if (e.response.status === statusCodes['Gateway Timeout']) {\n      throw new errors.Timeout\n    }\n  } else if (e.message && e.message.indexOf('timeout') !== -1) {\n    throw new errors.Timeout\n  }\n}\n\nconst _connectWebSocket = async (session, seed, rememberMe, changePassword) => {\n  try {\n    await ws.connect(session, seed, rememberMe, changePassword)\n  } catch (e) {\n    _parseGenericErrors(e)\n\n    if (e.message === 'Web Socket already connected') {\n      throw new errors.UserAlreadySignedIn(e.username)\n    }\n\n    throw e\n  }\n}\n\nconst _parseGenericUsernamePasswordError = (e) => {\n  if (e.response && e.response.data.error === 'UsernameTooLong') {\n    throw new errors.UsernameTooLong(e.response.data.maxLen)\n  } else if (e.response && e.response.data.error === 'PasswordAttemptLimitExceeded') {\n    throw new errors.PasswordAttemptLimitExceeded(e.response.data.delay)\n  }\n}\n\nconst _parseSessionLengthError = (e) => {\n  if (e.response && e.response.data) {\n    const data = e.response.data\n\n    switch (data.error) {\n      case 'SessionLengthTooShort':\n        throw new errors.SessionLengthTooShort(data.minLen)\n\n      case 'SessionLengthTooLong':\n        throw new errors.SessionLengthTooLong(data.maxLen)\n    }\n  }\n}\n\nconst _parseUserResponseError = (e, username) => {\n  _parseGenericErrors(e)\n  _parseGenericUsernamePasswordError(e)\n\n  if (e.response) {\n    const data = e.response.data\n\n    switch (data) {\n      case 'UsernameAlreadyExists':\n        throw new errors.UsernameAlreadyExists(username)\n\n      case 'TrialExceededLimit':\n        throw new errors.TrialExceededLimit\n\n      case 'CurrentPasswordIncorrect':\n        throw new errors.CurrentPasswordIncorrect\n\n      default:\n      // continue\n    }\n\n    switch (data.error) {\n      case 'EmailNotValid':\n        throw new errors.EmailNotValid\n\n      case 'ProfileMustBeObject':\n        throw new errors.ProfileMustBeObject\n\n      case 'ProfileKeyTooLong':\n        throw new errors.ProfileKeyTooLong(data.maxLen, data.key)\n\n      case 'ProfileValueMustBeString':\n        throw new errors.ProfileValueMustBeString(data.key, data.value)\n\n      case 'ProfileValueCannotBeBlank':\n        throw new errors.ProfileValueCannotBeBlank(data.key)\n\n      case 'ProfileValueTooLong':\n        throw new errors.ProfileValueTooLong(data.maxLen, data.key, data.value)\n\n      case 'ProfileHasTooManyKeys':\n        throw new errors.ProfileHasTooManyKeys(data.maxKeys)\n\n      case 'ProfileCannotBeEmpty':\n        throw new errors.ProfileCannotBeEmpty\n    }\n  }\n\n  throw e\n}\n\nconst _calculateSessionLengthMs = sessionLength => sessionLength && sessionLength * 60 * 60 * 1000\n\nconst _validateUsername = (username) => {\n  if (typeof username !== 'string') throw new errors.UsernameMustBeString\n  if (username.length === 0) throw new errors.UsernameCannotBeBlank\n}\n\nconst _validatePassword = (password) => {\n  if (typeof password !== 'string') throw new errors.PasswordMustBeString\n  if (password.length === 0) throw new errors.PasswordCannotBeBlank\n  if (password.length < MIN_PASSWORD_CHAR_LENGTH) throw new errors.PasswordTooShort(MIN_PASSWORD_CHAR_LENGTH)\n  if (password.length > MAX_PASSWORD_CHAR_LENGTH) throw new errors.PasswordTooLong(MAX_PASSWORD_CHAR_LENGTH)\n}\n\nconst _validateSignUpOrSignInInput = (params) => {\n  if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n\n  if (!objectHasOwnProperty(params, 'username')) throw new errors.UsernameMissing\n  if (!objectHasOwnProperty(params, 'password')) throw new errors.PasswordMissing\n\n  _validateUsername(params.username)\n  _validatePassword(params.password)\n\n  if (objectHasOwnProperty(params, 'rememberMe') && !REMEMBER_ME_OPTIONS[params.rememberMe]) {\n    throw new errors.RememberMeValueNotValid(REMEMBER_ME_OPTIONS)\n  }\n\n  if (objectHasOwnProperty(params, 'sessionLength') && typeof params.sessionLength !== 'number') {\n    throw new errors.SessionLengthMustBeNumber\n  }\n}\n\nconst _generatePasswordToken = async (password, seed, passwordHashAlgo) => {\n  const passwordSalt = crypto.scrypt.generateSalt()\n  const passwordHash = await crypto.scrypt.hash(password, passwordSalt, passwordHashAlgo)\n\n  const passwordHkdfKey = await crypto.hkdf.importHkdfKeyFromString(passwordHash)\n\n  const passwordTokenSalt = crypto.hkdf.generateSalt()\n  const passwordToken = await crypto.hkdf.getPasswordToken(passwordHkdfKey, passwordTokenSalt)\n\n  const passwordBasedEncryptionKeySalt = crypto.hkdf.generateSalt()\n  const passwordBasedEncryptionKey = await crypto.aesGcm.getPasswordBasedEncryptionKey(\n    passwordHkdfKey, passwordBasedEncryptionKeySalt)\n\n  const passwordEncryptedSeed = await crypto.aesGcm.encrypt(passwordBasedEncryptionKey, seed)\n\n  const passwordSalts = {\n    passwordSalt: base64.encode(passwordSalt),\n    passwordTokenSalt: base64.encode(passwordTokenSalt)\n  }\n\n  const passwordBasedBackup = {\n    passwordBasedEncryptionKeySalt: base64.encode(passwordBasedEncryptionKeySalt),\n    passwordEncryptedSeed: base64.encode(passwordEncryptedSeed)\n  }\n\n  return {\n    passwordToken,\n    passwordSalts,\n    passwordBasedBackup\n  }\n}\n\nconst _generateKeys = async (seed) => {\n  const masterKey = await crypto.hkdf.importHkdfKey(seed)\n\n  const encryptionKeySalt = crypto.hkdf.generateSalt()\n  const hmacKeySalt = crypto.hkdf.generateSalt()\n  const keySalts = {\n    encryptionKeySalt: base64.encode(encryptionKeySalt),\n    hmacKeySalt: base64.encode(hmacKeySalt),\n  }\n\n  const ecdsaKeyData = await crypto.ecdsa.generateEcdsaKeyData(masterKey)\n  const ecdhKeyData = await crypto.ecdh.generateEcdhKeyData(masterKey, ecdsaKeyData.ecdsaPrivateKey)\n\n  delete ecdsaKeyData.ecdsaPrivateKey\n  delete ecdhKeyData.ecdhPrivateKey\n\n  const ecKeyData = {\n    ecdsaKeyData,\n    ecdhKeyData,\n  }\n\n  return { ecKeyData, keySalts }\n}\n\nconst _generateKeysAndSignUp = async (username, password, seed, passwordHashAlgo, email, profile, sessionLength) => {\n  const {\n    passwordToken,\n    passwordSalts,\n    passwordBasedBackup\n  } = await _generatePasswordToken(password, seed, passwordHashAlgo)\n\n  const { ecKeyData, keySalts } = await _generateKeys(seed)\n\n  try {\n    const session = await authApi.signUp(\n      username,\n      passwordToken,\n      ecKeyData,\n      passwordSalts,\n      keySalts,\n      email,\n      profile,\n      passwordBasedBackup,\n      sessionLength,\n    )\n    return session\n  } catch (e) {\n    _parseSessionLengthError(e)\n    _parseUserResponseError(e, username)\n  }\n}\n\nconst _validateProfile = (profile) => {\n  if (typeof profile !== 'object') throw new errors.ProfileMustBeObject\n\n  let keyExists = false\n  for (const key in profile) {\n    keyExists = true\n\n    const value = profile[key]\n    if (typeof value !== 'string') throw new errors.ProfileValueMustBeString(key, value)\n    if (!value) throw new errors.ProfileValueCannotBeBlank(key)\n  }\n\n  if (!keyExists) throw new errors.ProfileCannotBeEmpty\n}\n\nconst _validateSignUpInput = (params) => {\n  _validateSignUpOrSignInInput(params)\n\n  if (params.profile) _validateProfile(params.profile)\n  if (params.email && typeof params.email !== 'string') throw new errors.EmailNotValid\n}\n\nconst signUp = async (params) => {\n  try {\n    _validateSignUpInput(params)\n\n    const { password, profile, passwordHashAlgo, rememberMe = 'session' } = params\n\n    const username = params.username.toLowerCase()\n    const email = params.email && params.email.toLowerCase()\n\n    const appId = config.getAppId()\n    const seed = await crypto.generateSeed()\n\n    const sessionLength = _calculateSessionLengthMs(params.sessionLength)\n\n    const { sessionId, creationDate, expirationDate, userId, authToken } = await _generateKeysAndSignUp(username, password, seed, passwordHashAlgo, email, profile, sessionLength)\n    const session = { username, userId, sessionId, creationDate, expirationDate, authToken }\n\n    const seedString = base64.encode(seed)\n\n    localData.saveSeedString(rememberMe, appId, username, seedString)\n    localData.signInSession(rememberMe, username, sessionId, creationDate, expirationDate)\n\n    await _connectWebSocket(session, seedString, rememberMe)\n\n    return ws.buildUserResult({ username, userId, authToken, email, profile, userData: ws.userData })\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'UsernameMissing':\n      case 'UsernameAlreadyExists':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameMustBeString':\n      case 'UsernameTooLong':\n      case 'PasswordMissing':\n      case 'PasswordCannotBeBlank':\n      case 'PasswordTooShort':\n      case 'PasswordTooLong':\n      case 'PasswordMustBeString':\n      case 'EmailNotValid':\n      case 'ProfileMustBeObject':\n      case 'ProfileCannotBeEmpty':\n      case 'ProfileHasTooManyKeys':\n      case 'ProfileKeyTooLong':\n      case 'ProfileValueMustBeString':\n      case 'ProfileValueCannotBeBlank':\n      case 'ProfileValueTooLong':\n      case 'RememberMeValueNotValid':\n      case 'SessionLengthMustBeNumber':\n      case 'SessionLengthTooShort':\n      case 'SessionLengthTooLong':\n      case 'TrialExceededLimit':\n      case 'AppIdNotSet':\n      case 'AppIdNotValid':\n      case 'DomainNotWhitelisted':\n      case 'UserAlreadySignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst signOut = async () => {\n  try {\n    if (!ws.session.username) throw new errors.UserNotSignedIn\n\n    try {\n      await ws.signOut()\n    } catch (e) {\n      _parseGenericErrors(e)\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'UserNotSignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst _getSeedStringFromPasswordBasedBackup = async (passwordHkdfKey, passwordBasedBackup) => {\n  const { passwordBasedEncryptionKeySalt, passwordEncryptedSeed } = passwordBasedBackup\n\n  const passwordBasedEncryptionKey = await crypto.aesGcm.getPasswordBasedEncryptionKey(\n    passwordHkdfKey, base64.decode(passwordBasedEncryptionKeySalt))\n\n  const seedFromBackup = await crypto.aesGcm.decrypt(passwordBasedEncryptionKey, base64.decode(passwordEncryptedSeed))\n  const seedStringFromBackup = base64.encode(seedFromBackup)\n\n  return seedStringFromBackup\n}\n\nconst _signInWrapper = async (username, passwordToken, sessionLength) => {\n  try {\n    const apiSignInResult = await authApi.signIn(username, passwordToken, sessionLength)\n    return apiSignInResult\n  } catch (e) {\n    _parseGenericErrors(e)\n    _parseGenericUsernamePasswordError(e)\n    _parseSessionLengthError(e)\n\n    if (e.response && e.response.data === 'Invalid password') {\n      throw new errors.UsernameOrPasswordMismatch\n    } else if (e.response && e.response.data === 'User pending deletion') {\n      throw new errors.UserPendingDeletion\n    }\n\n    throw e\n  }\n}\n\nconst _getPasswordSaltsOverRestEndpoint = async (username) => {\n  try {\n    const passwordSalts = await authApi.getPasswordSalts(username)\n    return passwordSalts\n  } catch (e) {\n    _parseGenericErrors(e)\n    _parseGenericUsernamePasswordError(e)\n\n    if (e.response && e.response.data === 'User not found') {\n      throw new errors.UsernameOrPasswordMismatch\n    }\n\n    throw e\n  }\n}\n\nconst _getPasswordSaltsOverWebSocket = async () => {\n  try {\n    const action = 'GetPasswordSalts'\n    const passwordSaltsResponse = await ws.request(action)\n    return passwordSaltsResponse.data\n  } catch (e) {\n    _parseGenericErrors(e)\n    throw e\n  }\n}\n\nconst _rebuildPasswordToken = async (password, passwordSalts, passwordHashAlgo) => {\n  const { passwordSalt, passwordTokenSalt } = passwordSalts\n\n  const passwordHash = await crypto.scrypt.hash(password, new Uint8Array(base64.decode(passwordSalt)), passwordHashAlgo)\n  const passwordHkdfKey = await crypto.hkdf.importHkdfKeyFromString(passwordHash)\n  const passwordToken = await crypto.hkdf.getPasswordToken(passwordHkdfKey, base64.decode(passwordTokenSalt))\n\n  return { passwordHkdfKey, passwordToken }\n}\n\nconst signIn = async (params) => {\n  try {\n    _validateSignUpOrSignInInput(params)\n\n    const username = params.username.toLowerCase()\n    const { password, passwordHashAlgo, rememberMe = 'session' } = params\n\n    const appId = config.getAppId()\n\n    const passwordSalts = await _getPasswordSaltsOverRestEndpoint(username)\n    const { passwordHkdfKey, passwordToken } = await _rebuildPasswordToken(password, passwordSalts, passwordHashAlgo)\n\n    const sessionLength = _calculateSessionLengthMs(params.sessionLength)\n\n    const apiSignInResult = await _signInWrapper(username, passwordToken, sessionLength)\n    const { userId, email, profile, passwordBasedBackup, protectedProfile, usedTempPassword, changePassword } = apiSignInResult\n    const session = {\n      ...apiSignInResult.session,\n      username,\n      userId,\n    }\n\n    let seedString\n    if (!changePassword) {\n      const savedSeedString = localData.getSeedString(appId, username)\n\n      let seedStringFromBackup\n      if (!savedSeedString && usedTempPassword) {\n        throw new errors.KeyNotFound(KEY_NOT_FOUND_ON_SIGN_IN)\n      } else if (!usedTempPassword) {\n        // always use seed from backup in case it's changed and local copy is out of date\n        seedStringFromBackup = await _getSeedStringFromPasswordBasedBackup(passwordHkdfKey, passwordBasedBackup)\n        localData.saveSeedString(rememberMe, appId, username, seedStringFromBackup)\n      }\n\n      seedString = seedStringFromBackup || savedSeedString\n    }\n\n    localData.signInSession(rememberMe, username, session.sessionId, session.creationDate, session.expirationDate)\n\n    try {\n      await _connectWebSocket(session, seedString, rememberMe, changePassword)\n    } catch (e) {\n      if (usedTempPassword && e.message === 'Invalid seed') throw new errors.KeyNotFound(KEY_NOT_FOUND_ON_SIGN_IN)\n      throw e\n    }\n\n    return ws.buildUserResult({\n      username, userId, authToken: session.authToken, email,\n      profile, protectedProfile, usedTempPassword, changePassword, userData: ws.userData\n    })\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'UsernameMissing':\n      case 'UsernameOrPasswordMismatch':\n      case 'UserPendingDeletion':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameTooLong':\n      case 'UsernameMustBeString':\n      case 'PasswordMissing':\n      case 'PasswordCannotBeBlank':\n      case 'PasswordTooShort':\n      case 'PasswordTooLong':\n      case 'PasswordMustBeString':\n      case 'PasswordAttemptLimitExceeded':\n      case 'RememberMeValueNotValid':\n      case 'SessionLengthMustBeNumber':\n      case 'SessionLengthTooShort':\n      case 'SessionLengthTooLong':\n      case 'KeyNotFound':\n      case 'AppIdNotSet':\n      case 'AppIdNotValid':\n      case 'DomainNotWhitelisted':\n      case 'UserAlreadySignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst init = async (params) => {\n  try {\n    if (!window.crypto.subtle) throw new errors.WebCryptoUnavailable\n\n    if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n\n    if (!objectHasOwnProperty(params, 'appId')) throw new errors.AppIdMissing\n    if (typeof params.appId !== 'string') throw new errors.AppIdMustBeString\n    if (params.appId.length === 0) throw new errors.AppIdCannotBeBlank\n\n    if (objectHasOwnProperty(params, 'updateUserHandler') && typeof params.updateUserHandler !== 'function') {\n      throw new errors.UpdateUserHandlerMustBeFunction\n    }\n\n    if (objectHasOwnProperty(params, 'sessionLength') && typeof params.sessionLength !== 'number') {\n      throw new errors.SessionLengthMustBeNumber\n    }\n\n    if (objectHasOwnProperty(params, 'allowServerSideEncryption') && typeof params.allowServerSideEncryption !== 'boolean') {\n      throw new errors.AllowServerSideEncryptionMustBeBoolean\n    }\n\n    config.configure(params)\n\n    const session = await signInWithSession(params.appId, _calculateSessionLengthMs(params.sessionLength))\n    return session\n  } catch (e) {\n\n    switch (e.name) {\n      case 'WebCryptoUnavailable':\n      case 'ParamsMustBeObject':\n      case 'AppIdMissing':\n      case 'AppIdAlreadySet':\n      case 'AppIdMustBeString':\n      case 'AppIdCannotBeBlank':\n      case 'AppIdNotValid':\n      case 'DomainNotWhitelisted':\n      case 'UpdateUserHandlerMustBeFunction':\n      case 'SessionLengthMustBeNumber':\n      case 'SessionLengthTooShort':\n      case 'SessionLengthTooLong':\n      case 'AllowServerSideEncryptionMustBeBoolean':\n      case 'UserAlreadySignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst signInWithSession = async (appId, sessionLength) => {\n  let lastUsedUsername\n  try {\n    const currentSession = localData.getCurrentSession()\n    if (!currentSession) return {}\n\n    const { signedIn, sessionId, creationDate, expirationDate, rememberMe } = currentSession\n    lastUsedUsername = currentSession.username\n    const savedSeedString = localData.getSeedString(appId, lastUsedUsername)\n\n    if (!signedIn || !savedSeedString || new Date() > new Date(expirationDate)) {\n      return { lastUsedUsername }\n    }\n\n    let apiSignInWithSessionResult\n    try {\n      apiSignInWithSessionResult = await authApi.signInWithSession(sessionId, sessionLength)\n    } catch (e) {\n      _parseGenericErrors(e)\n      _parseSessionLengthError(e)\n\n      if (e.response && e.response.data === 'Session invalid') {\n        return { lastUsedUsername }\n      }\n\n      throw e\n    }\n    const { userId, authToken, username, email, profile, protectedProfile } = apiSignInWithSessionResult\n\n    // overwrite local data if username has been changed on server\n    if (username !== lastUsedUsername) {\n      localData.saveSeedString(rememberMe, appId, username, savedSeedString)\n      localData.removeSeedString(appId, lastUsedUsername)\n    }\n\n    // expirationDate should have been extended\n    localData.signInSession(rememberMe, username, sessionId, creationDate, apiSignInWithSessionResult.expirationDate)\n\n    // enable idempotent calls to init()\n    if (ws.connectionResolved) {\n      if (ws.session.sessionId === sessionId) {\n        return { user: ws.buildUserResult({ username, userId, authToken: ws.session.authToken, email, profile, protectedProfile, userData: ws.userData }) }\n      } else {\n        throw new errors.UserAlreadySignedIn(ws.session.username)\n      }\n    }\n\n    const session = { ...currentSession, username, userId, authToken }\n    await _connectWebSocket(session, savedSeedString, rememberMe)\n\n    return { user: ws.buildUserResult({ username, userId, authToken, email, profile, protectedProfile, userData: ws.userData }) }\n  } catch (e) {\n    if (e.message === 'Invalid seed') return { lastUsedUsername }\n    _parseGenericErrors(e)\n    throw e\n  }\n}\n\nconst _validateUpdatedUserInput = (params) => {\n  if (!objectHasOwnProperty(params, 'username')\n    && !objectHasOwnProperty(params, 'newPassword')\n    && !objectHasOwnProperty(params, 'email')\n    && !objectHasOwnProperty(params, 'profile')\n  ) {\n    throw new errors.ParamsMissing\n  }\n\n  const { username, currentPassword, newPassword, email, profile } = params\n\n  if (objectHasOwnProperty(params, 'username')) _validateUsername(username)\n  if (objectHasOwnProperty(params, 'newPassword')) {\n    if (!objectHasOwnProperty(params, 'currentPassword')) throw new errors.CurrentPasswordMissing\n\n    _validatePassword(currentPassword)\n    _validatePassword(newPassword)\n  }\n\n  // if email or profile are falsey, will be set to false\n  if (email && typeof email !== 'string') throw new errors.EmailNotValid\n  if (profile) _validateProfile(profile)\n}\n\nconst _buildUpdateUserParams = async (params, newSeed) => {\n  if (params.username) params.username = params.username.toLowerCase()\n\n  if (params.newPassword) {\n    const [currentPasswordSalts, newPasswordPromise, newKeyData] = await Promise.all([\n      _getPasswordSaltsOverWebSocket(),\n      _generatePasswordToken(params.newPassword, newSeed || base64.decode(ws.seedString)),\n      newSeed && _generateKeys(newSeed)\n    ])\n\n    // current password\n    const { passwordToken } = await _rebuildPasswordToken(params.currentPassword, currentPasswordSalts, params.passwordHashAlgo)\n    params.currentPasswordToken = passwordToken\n    delete params.currentPassword\n\n    // new password\n    params.passwordToken = newPasswordPromise.passwordToken\n    params.passwordSalts = newPasswordPromise.passwordSalts\n    params.passwordBasedBackup = newPasswordPromise.passwordBasedBackup\n    delete params.newPassword\n\n    if (newKeyData) params.newKeyData = newKeyData\n  }\n\n  if (params.email) params.email = params.email.toLowerCase()\n  else if (objectHasOwnProperty(params, 'email')) params.email = false // marks email for deletion\n\n  if (!params.profile && objectHasOwnProperty(params, 'profile')) params.profile = false // marks profile for deletion\n\n  return params\n}\n\nconst updateUser = async (params) => {\n  try {\n    if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n\n    _validateUpdatedUserInput(params)\n\n    if (ws.reconnecting) throw new errors.Reconnecting\n    if (!ws.connectionResolved) throw new errors.UserNotSignedIn\n    const startingUserId = ws.session.userId\n\n    // need to generate new seed to rotate keys if user signed in with temp password to delete private data\n    const newSeed = params.newPassword && !ws.keys.init && ws.changePassword && await crypto.generateSeed()\n\n    const action = 'UpdateUser'\n    const finalParams = await _buildUpdateUserParams({ ...params }, newSeed)\n\n    if (ws.reconnecting) throw new errors.Reconnecting\n    if (!ws.connectionResolved) throw new errors.UserNotSignedIn\n\n    // ensures same user still attempting to update\n    if (!ws.session || startingUserId !== ws.session.userId) throw new errors.ServiceUnavailable\n\n    try {\n      if (finalParams.username) {\n        localData.saveSeedString(ws.rememberMe, config.getAppId(), finalParams.username, ws.seedString)\n      }\n\n      const response = await ws.request(action, finalParams)\n      const updatedUser = response.data.updatedUser\n      ws.handleUpdateUser(updatedUser)\n\n      // must have rotated keys successfully\n      if (newSeed && ws.session && startingUserId === ws.session.userId) {\n        const newSeedString = base64.encode(newSeed)\n        await ws.rotateKeys(newSeedString, finalParams.newKeyData)\n        localData.saveSeedString(ws.rememberMe, config.getAppId(), updatedUser.username, newSeedString)\n\n        const { sessionId, creationDate, expirationDate } = ws.session\n        localData.signInSession(ws.rememberMe, updatedUser.username, sessionId, creationDate, expirationDate)\n      }\n    } catch (e) {\n      _parseUserResponseError(e, finalParams.username)\n    }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'ParamsMissing':\n      case 'UsernameAlreadyExists':\n      case 'UsernameMustBeString':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameTooLong':\n      case 'CurrentPasswordMissing':\n      case 'CurrentPasswordIncorrect':\n      case 'PasswordAttemptLimitExceeded':\n      case 'PasswordMustBeString':\n      case 'PasswordCannotBeBlank':\n      case 'PasswordTooShort':\n      case 'PasswordTooLong':\n      case 'EmailNotValid':\n      case 'ProfileMustBeObject':\n      case 'ProfileCannotBeEmpty':\n      case 'ProfileHasTooManyKeys':\n      case 'ProfileKeyTooLong':\n      case 'ProfileValueMustBeString':\n      case 'ProfileValueCannotBeBlank':\n      case 'ProfileValueTooLong':\n      case 'AppIdNotSet':\n      case 'AppIdNotValid':\n      case 'UserNotFound':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst deleteUser = async () => {\n  try {\n    _checkSignedInState()\n\n    const username = ws.session.username\n    localData.removeSeedString(config.getAppId(), username)\n    localData.removeCurrentSession()\n\n    try {\n      const action = 'DeleteUser'\n      await ws.request(action)\n    } catch (e) {\n      _parseGenericErrors(e)\n      throw e\n    }\n\n    ws.close()\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _getMasterKeyAndKeyNotFoundMessage = async (appId, username) => {\n  const seedString = localData.getSeedString(appId, username)\n  if (!seedString) throw new errors.KeyNotFound(KEY_NOT_FOUND_ON_FORGOT_PASSWORD)\n  const seed = base64.decode(seedString)\n  const masterKey = await crypto.hkdf.importHkdfKey(seed)\n  return masterKey\n}\n\nconst forgotPassword = async (params) => {\n  try {\n    if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n    if (objectHasOwnProperty(params, 'deleteEndToEndEncryptedData') && typeof params.deleteEndToEndEncryptedData !== 'boolean') {\n      throw new errors.DeleteEndToEndEncryptedDataMustBeBoolean\n    }\n    if (!objectHasOwnProperty(params, 'username')) throw new errors.UsernameMissing\n\n    _validateUsername(params.username)\n    const username = params.username.toLowerCase()\n\n    const appId = config.getAppId()\n\n    const url = `${getWsUrl(config.getEndpoint())}/api/auth/forgot-password?appId=${appId}&username=${encodeURIComponent(username)}&userbaseJsVersion=${config.USERBASE_JS_VERSION}`\n    const forgotPasswordWs = new WebSocket(url + (objectHasOwnProperty(params, 'deleteEndToEndEncryptedData')\n      ? `&deleteEndToEndEncryptedData=${params.deleteEndToEndEncryptedData}` : ''))\n\n    await new Promise((resolve, reject) => {\n      setTimeout(() => reject(new errors.Timeout), 15000)\n\n      forgotPasswordWs.onerror = () => reject(new errors.ServiceUnavailable)\n\n      forgotPasswordWs.onmessage = async (e) => {\n        try {\n          const message = JSON.parse(e.data)\n\n          switch (message.route) {\n\n            // users created with userbase-js < v2.0.0 that have not signed in yet will need to prove access to DH key by decrypting token\n            case 'ReceiveEncryptedToken': {\n              const masterKey = await _getMasterKeyAndKeyNotFoundMessage(appId, username)\n\n              // if client decrypts encrypted token successfully, proves to server it has the user's key\n              const encryptedForgotPasswordToken = new Uint8Array(message.encryptedForgotPasswordToken.data)\n\n              const dhPrivateKey = await crypto.diffieHellman.importKeyFromMaster(masterKey, base64.decode(message.dhKeySalt))\n              const sharedKey = await crypto.diffieHellman.getSharedKeyWithServer(dhPrivateKey)\n\n              let forgotPasswordToken\n              try {\n                // if it fails to decrypt, it's almost certainly because key is incorrect\n                forgotPasswordToken = base64.encode(await crypto.aesGcm.decrypt(sharedKey, encryptedForgotPasswordToken))\n              } catch {\n                throw new errors.KeyNotFound(KEY_NOT_FOUND_ON_FORGOT_PASSWORD)\n              }\n\n              forgotPasswordWs.send(JSON.stringify({\n                action: 'ForgotPassword',\n                params: { forgotPasswordToken }\n              }))\n\n              break\n            }\n\n            // users signed in with userbase-js >= v2.0.1 will need to prove access to ECDSA key by signing token\n            case 'ReceiveToken': {\n              const masterKey = await _getMasterKeyAndKeyNotFoundMessage(appId, username)\n\n              const {\n                ecdsaKeyEncryptionKeySalt,\n                encryptedEcdsaPrivateKey,\n                forgotPasswordToken,\n              } = message\n\n              const ecdsaKeyEncryptionKey = await crypto.ecdsa.importEcdsaKeyEncryptionKeyFromMaster(masterKey, base64.decode(ecdsaKeyEncryptionKeySalt))\n\n              let ecdsaPrivateKey\n              try {\n                // if it fails to decrypt, it's almost certainly because key is incorrect\n                const rawEcdsaPrivateKey = await crypto.aesGcm.decrypt(ecdsaKeyEncryptionKey, base64.decode(encryptedEcdsaPrivateKey))\n                ecdsaPrivateKey = await crypto.ecdsa.getPrivateKeyFromRawPrivateKey(rawEcdsaPrivateKey)\n              } catch {\n                throw new errors.KeyNotFound(KEY_NOT_FOUND_ON_FORGOT_PASSWORD)\n              }\n\n              const signedForgotPasswordToken = base64.encode(await crypto.ecdsa.sign(ecdsaPrivateKey, base64.decode(forgotPasswordToken)))\n\n              forgotPasswordWs.send(JSON.stringify({\n                action: 'ForgotPassword',\n                params: { signedForgotPasswordToken }\n              }))\n\n              break\n            }\n\n            case 'SuccessfullyForgotPassword': {\n              // server has sent the email\n              resolve()\n              break\n            }\n\n            case 'Error': {\n              const data = message.data\n\n              switch (data.name) {\n                case 'UsernameTooLong': throw new errors.UsernameTooLong(data.maxLen)\n                case 'AppIdNotValid': throw new errors.AppIdNotValid\n                case 'UserNotFound': throw new errors.UserNotFound\n                case 'UserEmailNotFound': throw new errors.UserEmailNotFound\n\n                default: {\n                  if (message.status === statusCodes['Internal Server Error']) throw new errors.ServiceUnavailable\n                  else throw new errors.UnknownServiceUnavailable(data)\n                }\n              }\n            }\n\n            case 'Ping': {\n              // ignore -- websocket connection should only exist for the life of the forgot password request\n              break\n            }\n\n            default:\n              reject(new Error(`Received unknown message from userbase-server: ${e.data}`))\n          }\n        } catch (e) {\n          reject(e)\n        }\n      }\n    })\n\n    forgotPasswordWs.close()\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'UsernameMissing':\n      case 'UsernameMustBeString':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameTooLong':\n      case 'AppIdNotSet':\n      case 'AppIdNotValid':\n      case 'KeyNotFound':\n      case 'UserNotFound':\n      case 'UserEmailNotFound':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n\n    }\n  }\n}\n\nexport default {\n  signUp,\n  signOut,\n  signIn,\n  init,\n  updateUser,\n  deleteUser,\n  forgotPassword,\n}\n",
+    "import uuidv4 from 'uuid/v4'\nimport SortedArray from 'sorted-array'\nimport base64 from 'base64-arraybuffer'\nimport crypto from './Crypto'\nimport ws from './ws'\nimport errors from './errors'\nimport statusCodes from './statusCodes'\nimport { byteSizeOfString, Queue, objectHasOwnProperty } from './utils'\nimport { appendBuffer, arrayBufferToString, stringToArrayBuffer } from './Crypto/utils'\nimport authApi from './api/auth'\nimport config from './config'\n\nconst success = 'Success'\n\nconst MAX_DB_NAME_CHAR_LENGTH = 100\nconst MAX_ITEM_ID_CHAR_LENGTH = 100\n\nconst MAX_ITEM_KB = 10\nconst TEN_KB = MAX_ITEM_KB * 1024\nconst MAX_ITEM_BYTES = TEN_KB\n\nconst UUID_CHAR_LENGTH = 36\n\nconst FILE_CHUNK_SIZE = 1024 * 512 // 512kb\nconst FILE_CHUNKS_PER_BATCH = 10\n\nconst VERIFIED_USERS_DATABASE_NAME = '__userbase_verified_users'\n\nconst ENCRYPTION_MODE_OPTIONS = {\n  'end-to-end': true,\n  'server-side': true\n}\n\nconst TX_TIMEOUT = 30 * 1000\n\nconst _checkSignedInState = () => {\n  if (ws.reconnecting) throw new errors.Reconnecting\n  if (!ws.keys.init && ws.changePassword) throw new errors.UserMustChangePassword\n  if (!ws.keys.init || !ENCRYPTION_MODE_OPTIONS[ws.encryptionMode]) throw new errors.UserNotSignedIn\n}\n\nconst _parseGenericErrors = (e) => {\n  if (e.response) {\n    if (e.response.data === 'UserNotFound') {\n      throw new errors.UserNotFound\n    } else if (e.response.status === statusCodes['Internal Server Error']) {\n      throw new errors.InternalServerError\n    } else if (e.response.status === statusCodes['Gateway Timeout']) {\n      throw new errors.Timeout\n    }\n  } else if (e.message && e.message.indexOf('timeout') !== -1) {\n    throw new errors.Timeout\n  }\n}\n\nclass UnverifiedTransaction {\n  constructor(startSeqNo) {\n    this.startSeqNo = startSeqNo\n    this.txSeqNo = null\n    this.transactions = {}\n    this.promiseResolve = null\n    this.promiseReject = null\n    this.index = null\n  }\n\n  getStartSeqNo() {\n    return this.startSeqNo\n  }\n\n  getIndex() {\n    return this.index\n  }\n\n  setIndex(index) {\n    this.index = index\n  }\n\n  async getResult(seqNo) {\n    this.txSeqNo = seqNo\n\n    const promise = new Promise((resolve, reject) => {\n      this.promiseResolve = resolve\n      this.promiseReject = reject\n\n      setTimeout(() => { reject(new Error('timeout')) }, TX_TIMEOUT)\n    })\n\n    this.verifyPromise()\n\n    return promise\n  }\n\n  verifyPromise() {\n    if (!this.txSeqNo && this.txSeqNo != 0) {\n      return\n    }\n\n    if (!this.promiseResolve || !this.promiseReject) {\n      return\n    }\n\n    if (this.transactions[this.txSeqNo]) {\n      if (this.transactions[this.txSeqNo] == 'Success') {\n        this.promiseResolve()\n      } else {\n        this.promiseReject(this.transactions[this.txSeqNo])\n      }\n    }\n  }\n\n  addTransaction(transaction, code) {\n    if (this.transactions[transaction.seqNo]) return\n    this.transactions[transaction.seqNo] = code\n    this.verifyPromise()\n  }\n}\n\nclass Database {\n  constructor(changeHandler, receivedMessage, shareTokenId, shareTokenHkdfKey) {\n    this.onChange = _setChangeHandler(changeHandler)\n\n    this.items = {}\n    this.itemsPlaintextMetadata = {}\n    this.fileIds = {}\n\n    const compareItems = (a, b) => {\n      if (a.seqNo < b.seqNo || (a.seqNo === b.seqNo && a.operationIndex < b.operationIndex)) {\n        return -1\n      }\n      if (a.seqNo > b.seqNo || (a.seqNo === b.seqNo && a.operationIndex > b.operationIndex)) {\n        return 1\n      }\n      return 0\n    }\n\n    this.itemsIndex = new SortedArray([], compareItems)\n    this.unverifiedTransactions = []\n    this.lastSeqNo = 0\n    this.init = false\n    this.dbKey = null\n    this.receivedMessage = receivedMessage\n    this.usernamesByUserId = new Map()\n    this.attributionEnabled = false\n\n    this.shareTokenId = shareTokenId\n    this.shareTokenHkdfKey = shareTokenHkdfKey\n\n    // Queue that ensures 'ApplyTransactions' executes one at a time\n    this.applyTransactionsQueue = new Queue()\n\n    this.bundleChunks = {}\n  }\n\n  async applyTransactions(transactions, ownerId, dbId, dbNameHash) {\n    for (let i = 0; i < transactions.length; i++) {\n      const transaction = transactions[i]\n      const seqNo = transaction.seqNo\n\n      // client must only apply transcations in sequence\n      if (seqNo !== this.lastSeqNo + 1) {\n        console.warn(`Client attempted to apply transaction with seq no ${seqNo} when last seq no is ${this.lastSeqNo}`)\n        continue\n      }\n\n      const transactionCode = await this.applyTransaction(this.dbKey, transaction, ownerId)\n      this.lastSeqNo = seqNo\n\n      for (let j = 0; j < this.unverifiedTransactions.length; j++) {\n        if (!this.unverifiedTransactions[j] || seqNo < this.unverifiedTransactions[j].getStartSeqNo()) {\n          continue\n        }\n        this.unverifiedTransactions[j].addTransaction(transactions[i], transactionCode)\n      }\n\n      if (this.init && transactionCode === 'Success') {\n        this.onChange(this.getItems())\n      }\n    }\n\n    if (!this.init) {\n      this.init = true // allows triggers and loaders to be called from within client's changeHandler on database load\n      this.dbId = dbId\n      this.dbNameHash = dbNameHash\n      this.onChange(this.getItems())\n      this.receivedMessage() // wait to resolve openDatabase() until changeHandler has received all data\n    }\n  }\n\n  async applyBundle(bundle, bundleSeqNo) {\n    // client must only apply bundle when opening state\n    if (this.lastSeqNo !== 0) {\n      console.warn(`Client attempted to apply bundle when last seq no is ${this.lastSeqNo}`)\n      return\n    }\n\n    for (let i = 0; i < bundle.itemsIndex.length; i++) {\n      const itemIndex = bundle.itemsIndex[i]\n      const itemId = bundle.itemsIndex[i].itemId\n      const item = bundle.items[i]\n      const itemsPlaintextMetadata = bundle.itemsPlaintextMetadata[i]\n\n      if (item.file && item.file.fileEncryptionKeyString) {\n        item.file.fileEncryptionKey = await crypto.aesGcm.getKeyFromKeyString(item.file.fileEncryptionKeyString)\n        this.fileIds[item.file.fileId] = itemId\n      }\n\n      this.items[itemId] = item\n      this.itemsPlaintextMetadata[itemId] = itemsPlaintextMetadata\n      this.itemsIndex.insert(itemIndex)\n    }\n\n    this.lastSeqNo = bundleSeqNo\n  }\n\n  async applyTransaction(key, transaction, ownerId) {\n    const seqNo = transaction.seqNo\n    const command = transaction.command\n\n    switch (command) {\n      case 'Insert': {\n        try {\n          const record = await crypto.aesGcm.decryptJson(key, transaction.record)\n          const itemId = record.id\n          const item = record.item\n          const createdBy = this.attributionFromTransaction(transaction)\n          const writeAccess = transaction.writeAccess\n\n          this.validateInsert(itemId)\n          return this.applyInsert(itemId, seqNo, item, createdBy, writeAccess)\n        } catch (transactionCode) {\n          return transactionCode\n        }\n      }\n\n      case 'Update': {\n        try {\n          const record = await crypto.aesGcm.decryptJson(key, transaction.record)\n          const itemId = record.id\n          const item = record.item\n          const updatedBy = this.attributionFromTransaction(transaction)\n          const __v = record.__v\n          const writeAccess = transaction.writeAccess\n\n          this.validateUpdate(itemId, __v, updatedBy, ownerId, writeAccess, 'updateItem')\n          return this.applyUpdate(itemId, item, __v, updatedBy, writeAccess)\n        } catch (transactionCode) {\n          return transactionCode\n        }\n      }\n\n      case 'Delete': {\n        try {\n          const record = await crypto.aesGcm.decryptJson(key, transaction.record)\n          const itemId = record.id\n          const deletedBy = this.attributionFromTransaction(transaction)\n          const __v = record.__v\n\n          this.validateUpdateOrDelete(itemId, __v, deletedBy, ownerId, 'deleteItem')\n          return this.applyDelete(itemId)\n        } catch (transactionCode) {\n          return transactionCode\n        }\n      }\n\n      case 'BatchTransaction': {\n        try {\n          const batch = transaction.operations\n          const attribution = this.attributionFromTransaction(transaction)\n          const recordPromises = []\n\n          for (const operation of batch) {\n            recordPromises.push(operation.record && crypto.aesGcm.decryptJson(key, operation.record))\n          }\n          const records = await Promise.all(recordPromises)\n\n          this.validateBatchTransaction(batch, records, attribution, ownerId)\n          return this.applyBatchTransaction(seqNo, batch, records, attribution)\n        } catch (transactionCode) {\n          return transactionCode\n        }\n      }\n\n      case 'UploadFile': {\n        try {\n          const fileEncryptionKeyRaw = await crypto.aesGcm.decrypt(key, base64.decode(transaction.fileEncryptionKey))\n          const fileEncryptionKey = await crypto.aesGcm.getKeyFromRawKey(fileEncryptionKeyRaw)\n          const fileEncryptionKeyString = await crypto.aesGcm.getKeyStringFromKey(fileEncryptionKey)\n          const fileMetadata = await crypto.aesGcm.decryptJson(fileEncryptionKey, transaction.fileMetadata)\n\n          const itemId = fileMetadata.itemId\n          const fileVersion = fileMetadata.__v\n          const { fileName, fileSize, fileType } = fileMetadata\n          const fileId = transaction.fileId\n          const fileUploadedBy = this.attributionFromTransaction(transaction)\n\n          this.validateUploadFile(itemId, fileVersion, fileUploadedBy, ownerId, 'uploadFile')\n          return this.applyUploadFile(itemId, fileUploadedBy, fileVersion, fileEncryptionKey, fileEncryptionKeyString, fileName, fileId, fileSize, fileType)\n        } catch (transactionCode) {\n          return transactionCode\n        }\n      }\n\n      case 'Rollback': {\n        // no-op\n        return\n      }\n\n      default: {\n        console.warn(`Unknown command: ${command}`)\n        return\n      }\n    }\n  }\n\n  attributionFromTransaction(transaction) {\n    if (!this.attributionEnabled) return undefined\n    return {\n      timestamp: transaction.timestamp,\n      userId: transaction.userId,\n    }\n  }\n\n  validateInsert(itemId) {\n    if (this.items[itemId]) {\n      throw new errors.ItemAlreadyExists\n    }\n  }\n\n  validateUpdate(itemId, __v, updatedBy, ownerId, writeAccess, command) {\n    this.validateUpdateOrDelete(itemId, __v, updatedBy, ownerId, command)\n\n    // writeAccess can only be set or removed by either the item creator or database owner\n    const { createdBy } = this.itemsPlaintextMetadata[itemId]\n\n    if (writeAccess || writeAccess === false) {\n      if (!createdBy) return // if no attribution on item set, can't set write access\n      const createdByUserId = createdBy.userId\n      const updatedByUserId = updatedBy.userId\n\n      if (createdByUserId !== updatedByUserId && updatedByUserId !== ownerId) {\n        throw new errors.WriteAccessParamNotAllowed\n      }\n    }\n  }\n\n  validateUpdateOrDelete(itemId, __v, attribution, ownerId, command) {\n    const item = this.items[itemId]\n    if (!item) throw new errors.ItemDoesNotExist\n\n    const currentVersion = this.getItemVersionNumber(itemId)\n    if (__v <= currentVersion) {\n      throw new errors.ItemUpdateConflict\n    }\n\n    this.validateAccessPermissions(itemId, attribution, ownerId, command)\n  }\n\n  validateUploadFile(itemId, __v, fileUploadedBy, ownerId, command) {\n    const item = this.items[itemId]\n    if (!item) throw new errors.ItemDoesNotExist\n\n    const currentVersion = this.getFileVersionNumber(itemId)\n\n    if (__v <= currentVersion) {\n      throw new errors.FileUploadConflict\n    }\n\n    this.validateAccessPermissions(itemId, fileUploadedBy, ownerId, command)\n  }\n\n  validateAccessPermissions(itemId, attribution, ownerId, command) {\n    const { createdBy, writeAccess } = this.itemsPlaintextMetadata[itemId]\n    if (createdBy && attribution && writeAccess) {\n      const createdByUserId = createdBy.userId\n      const modifiedByUserId = attribution.userId\n\n      let userIsAuthorized = false\n      const { onlyCreator, users } = writeAccess\n\n      if (modifiedByUserId === ownerId || modifiedByUserId === createdByUserId) {\n        userIsAuthorized = true\n      } else if (!onlyCreator && users) {\n        for (const { userId } of users) {\n          userIsAuthorized = modifiedByUserId === userId\n          if (userIsAuthorized) break\n        }\n      }\n\n      if (!userIsAuthorized) throw new errors.TransactionUnauthorized(command)\n    }\n  }\n\n  itemExists(itemId) {\n    return objectHasOwnProperty(this.items, itemId)\n  }\n\n  applyInsert(itemId, seqNo, record, createdBy, writeAccess, operationIndex) {\n    const item = { seqNo }\n    if (typeof operationIndex === 'number') item.operationIndex = operationIndex\n\n    this.items[itemId] = {\n      ...item,\n      record,\n      __v: 0\n    }\n    this.itemsPlaintextMetadata[itemId] = {\n      createdBy,\n      writeAccess,\n    }\n    this.itemsIndex.insert({ ...item, itemId })\n\n    if (writeAccess && writeAccess.users) {\n      for (const { userId, username } of writeAccess.users) {\n        this.usernamesByUserId.set(userId, username)\n      }\n    }\n\n    return success\n  }\n\n  applyUpdate(itemId, record, __v, updatedBy, writeAccess) {\n    this.items[itemId].record = record\n    this.items[itemId].__v = __v\n\n    this.itemsPlaintextMetadata[itemId].updatedBy = updatedBy\n\n    if (writeAccess === false) {\n      delete this.itemsPlaintextMetadata[itemId].writeAccess\n    } else if (writeAccess) {\n      this.itemsPlaintextMetadata[itemId].writeAccess = writeAccess\n\n      if (writeAccess.users) {\n        for (const { userId, username } of writeAccess.users) {\n          this.usernamesByUserId.set(userId, username)\n        }\n      }\n    }\n\n    return success\n  }\n\n  applyUploadFile(itemId, fileUploadedBy, __v, fileEncryptionKey, fileEncryptionKeyString, fileName, fileId, fileSize, fileType) {\n    const existingFile = this.items[itemId].file\n    if (existingFile) delete this.fileIds[existingFile.fileId]\n\n    this.items[itemId].file = {\n      fileName,\n      fileId,\n      fileSize,\n      fileType,\n      fileEncryptionKey,\n      fileEncryptionKeyString,\n      __v,\n    }\n    this.itemsPlaintextMetadata[itemId].fileUploadedBy = fileUploadedBy\n    this.fileIds[fileId] = itemId\n    return success\n  }\n\n  applyDelete(itemId) {\n    this.itemsIndex.remove(this.items[itemId])\n    delete this.items[itemId]\n    delete this.itemsPlaintextMetadata[itemId]\n    return success\n  }\n\n  validateBatchTransaction(batch, records, attribution, ownerId) {\n    const uniqueItemIds = {}\n\n    for (let i = 0; i < batch.length; i++) {\n      const operation = batch[i]\n      const { command, writeAccess } = operation\n\n      const itemId = records[i].id\n      const __v = records[i].__v\n\n      if (uniqueItemIds[itemId]) throw new errors.OperationsConflict\n      uniqueItemIds[itemId] = true\n\n      switch (command) {\n        case 'Insert':\n          this.validateInsert(itemId)\n          break\n\n        case 'Update':\n          this.validateUpdate(itemId, __v, attribution, ownerId, writeAccess, command)\n          break\n\n        case 'Delete':\n          this.validateUpdateOrDelete(itemId, __v, attribution, ownerId, command)\n          break\n      }\n    }\n  }\n\n  applyBatchTransaction(seqNo, batch, records, attribution) {\n    for (let i = 0; i < batch.length; i++) {\n      const operation = batch[i]\n\n      const itemId = records[i].id\n      const item = records[i].item\n      const __v = records[i].__v\n      const writeAccess = operation.writeAccess\n\n      switch (operation.command) {\n        case 'Insert':\n          this.applyInsert(itemId, seqNo, item, attribution, writeAccess, i)\n          break\n\n        case 'Update':\n          this.applyUpdate(itemId, item, __v, attribution, writeAccess)\n          break\n\n        case 'Delete':\n          this.applyDelete(itemId, __v)\n          break\n      }\n    }\n\n    return success\n  }\n\n  registerUnverifiedTransaction() {\n    const unverifiedTransaction = new UnverifiedTransaction(this.lastSeqNo)\n    const i = this.unverifiedTransactions.push(unverifiedTransaction)\n    unverifiedTransaction.setIndex(i - 1)\n    return unverifiedTransaction\n  }\n\n  unregisterUnverifiedTransaction(pendingTransaction) {\n    delete this.unverifiedTransactions[pendingTransaction.getIndex()]\n  }\n\n  getItems() {\n    const result = []\n    for (let i = 0; i < this.itemsIndex.array.length; i++) {\n      const itemId = this.itemsIndex.array[i].itemId\n      const record = this.items[itemId].record\n      const item = { itemId, item: record }\n\n      // set file metadata\n      if (this.items[itemId].file) {\n        const { fileId, fileName, fileSize } = this.items[itemId].file\n        item.fileId = fileId\n        item.fileName = fileName\n        item.fileSize = fileSize\n      }\n\n      // set attribution metadata\n      for (const prop of ['createdBy', 'updatedBy', 'fileUploadedBy']) {\n        if (this.itemsPlaintextMetadata[itemId][prop]) {\n          const { timestamp, userId } = this.itemsPlaintextMetadata[itemId][prop]\n          const attribution = { timestamp }\n          const username = this.usernamesByUserId.get(userId)\n          if (username == null) {\n            attribution.userDeleted = true\n          } else {\n            attribution.username = username\n          }\n          item[prop] = attribution\n        }\n      }\n\n      // set write access permissions\n      if (this.itemsPlaintextMetadata[itemId].writeAccess) {\n        const { onlyCreator, users } = this.itemsPlaintextMetadata[itemId].writeAccess\n        const writeAccess = {}\n        if (onlyCreator) writeAccess.onlyCreator = onlyCreator\n\n        if (users) {\n          writeAccess.users = []\n          for (const { userId } of users) {\n            const username = this.usernamesByUserId.get(userId)\n            if (username) writeAccess.users.push({ username })\n          }\n        }\n\n        item.writeAccess = writeAccess\n      }\n\n      result.push(item)\n    }\n    return result\n  }\n\n  getItemVersionNumber(itemId) {\n    return this.items[itemId].__v\n  }\n\n  getFileVersionNumber(itemId) {\n    return this.items[itemId].file && this.items[itemId].file.__v\n  }\n\n  async decryptShareTokenEncryptedDbKey(shareTokenEncryptedDbKey, shareTokenEncryptionKeySalt) {\n    const shareTokenEncryptionKey = await crypto.aesGcm.importKeyFromMaster(this.shareTokenHkdfKey, base64.decode(shareTokenEncryptionKeySalt))\n    const dbKeyString = await crypto.aesGcm.decryptString(shareTokenEncryptionKey, shareTokenEncryptedDbKey)\n    return dbKeyString\n  }\n}\n\nconst _setChangeHandler = (changeHandler) => {\n  return (items) => {\n    try {\n      changeHandler(items)\n    } catch (e) {\n      console.error('There was an error in your changeHandler.\\n\\n', e)\n    }\n  }\n}\n\nconst _idempotentOpenDatabase = (database, changeHandler, receivedMessage) => {\n  // safe to replace -- enables idempotent calls to openDatabase\n  database.onChange = _setChangeHandler(changeHandler)\n\n  // if 1 call succeeds, all idempotent calls succeed\n  const currentReceivedMessage = database.receivedMessage\n  database.receivedMessage = () => {\n    currentReceivedMessage()\n    receivedMessage()\n  }\n\n  // database is already open, can return successfully\n  if (database.init) {\n    database.onChange(database.getItems())\n    database.receivedMessage()\n    return true\n  }\n\n  return false\n}\n\nconst _getShareTokenIdFromShareToken = (shareTokenArrayBuffer) => {\n  const shareTokenIdArrayBuffer = shareTokenArrayBuffer.slice(0, UUID_CHAR_LENGTH)\n  const shareTokenId = arrayBufferToString(shareTokenIdArrayBuffer, true)\n  if (!shareTokenId || shareTokenId.length !== UUID_CHAR_LENGTH) throw new errors.ShareTokenInvalid\n  return shareTokenId\n}\n\nconst _getShareTokenIdAndShareTokenSeed = (shareTokenResult) => {\n  const shareTokenArrayBuffer = base64.decode(shareTokenResult)\n  const shareTokenId = _getShareTokenIdFromShareToken(shareTokenArrayBuffer)\n  const shareTokenSeed = shareTokenArrayBuffer.slice(UUID_CHAR_LENGTH)\n  return { shareTokenId, shareTokenSeed }\n}\n\nconst _openDatabaseByShareToken = async (shareToken, changeHandler, receivedMessage) => {\n  let shareTokenIdAndShareTokenSeed, shareTokenHkdfKey\n  try {\n    shareTokenIdAndShareTokenSeed = _getShareTokenIdAndShareTokenSeed(shareToken)\n    shareTokenHkdfKey = await crypto.hkdf.importHkdfKey(shareTokenIdAndShareTokenSeed.shareTokenSeed)\n  } catch {\n    throw new errors.ShareTokenInvalid\n  }\n  const { shareTokenId } = shareTokenIdAndShareTokenSeed\n\n  const { databaseId, validationMessage, signedValidationMessage } = await ws.authenticateShareToken(shareTokenId, shareTokenHkdfKey)\n  ws.state.shareTokenIdToDbId[shareTokenId] = databaseId\n\n  await _openDatabaseByDatabaseId(databaseId, changeHandler, receivedMessage, shareTokenId, shareTokenHkdfKey, validationMessage, signedValidationMessage)\n}\n\nconst _openDatabaseByDatabaseId = async (databaseId, changeHandler, receivedMessage, shareTokenId, shareTokenHkdfKey, validationMessage, signedValidationMessage) => {\n  const database = ws.state.databasesByDbId[databaseId]\n\n  if (!database) {\n    ws.state.databasesByDbId[databaseId] = new Database(changeHandler, receivedMessage, shareTokenId, shareTokenHkdfKey)\n  } else {\n    if (_idempotentOpenDatabase(database, changeHandler, receivedMessage)) return\n  }\n\n  const action = 'OpenDatabaseByDatabaseId'\n  const params = { databaseId, validationMessage, signedValidationMessage }\n  await ws.request(action, params)\n}\n\nconst _openDatabaseByNameHash = async (dbNameHash, newDatabaseParams, changeHandler, receivedMessage) => {\n  const database = ws.state.databases[dbNameHash]\n\n  if (!database) {\n    ws.state.databases[dbNameHash] = new Database(changeHandler, receivedMessage)\n  } else {\n    if (_idempotentOpenDatabase(database, changeHandler, receivedMessage)) return\n  }\n\n  const action = 'OpenDatabase'\n  const params = { dbNameHash, newDatabaseParams }\n  await ws.request(action, params)\n}\n\nconst _openDatabase = async (changeHandler, params) => {\n  try {\n    let receivedMessage\n    let timeout\n    const firstMessageFromWebSocket = new Promise((resolve, reject) => {\n      receivedMessage = resolve\n      timeout = setTimeout(() => reject(new Error('timeout')), TX_TIMEOUT)\n    })\n\n    const { dbNameHash, newDatabaseParams, databaseId, shareToken } = params\n    try {\n\n      if (dbNameHash) await _openDatabaseByNameHash(dbNameHash, newDatabaseParams, changeHandler, receivedMessage)\n      else if (databaseId) await _openDatabaseByDatabaseId(databaseId, changeHandler, receivedMessage)\n      else if (shareToken) await _openDatabaseByShareToken(shareToken, changeHandler, receivedMessage)\n\n      await firstMessageFromWebSocket\n    } catch (e) {\n      clearTimeout(timeout)\n\n      if (e.response && e.response.data) {\n        const data = e.response.data\n\n        if (data === 'Database already creating') {\n          throw new errors.DatabaseAlreadyOpening\n        } else if (data === 'Database is owned by user') {\n          if (databaseId) throw new errors.DatabaseIdNotAllowedForOwnDatabase\n          else if (shareToken) throw new errors.ShareTokenNotAllowedForOwnDatabase\n        } else if (data === 'Database key not found' || data === 'Database not found') {\n          throw new errors.DatabaseNotFound\n        }\n\n        switch (data.name) {\n          case 'SubscriptionNotFound':\n            throw new errors.SubscriptionNotFound\n          case 'SubscriptionInactive':\n            throw new errors.SubscriptionInactive(data.subscriptionStatus)\n          case 'TrialExpired':\n            throw new errors.TrialExpired\n        }\n\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n    _parseGenericErrors(e)\n    throw e\n  }\n}\n\nconst _createDatabase = async (dbName, encryptionMode) => {\n  const dbId = uuidv4()\n\n  const dbKey = await crypto.aesGcm.generateKey()\n  const dbKeyString = await crypto.aesGcm.getKeyStringFromKey(dbKey)\n\n  const [encryptedDbKey, encryptedDbName] = await Promise.all([\n    crypto.aesGcm.encryptString(ws.keys.encryptionKey, dbKeyString),\n    crypto.aesGcm.encryptString(dbKey, dbName)\n  ])\n\n  const newDatabaseParams = {\n    dbId,\n    encryptedDbKey,\n    encryptedDbName,\n    attribution: true,\n  }\n\n  if (encryptionMode === 'server-side') newDatabaseParams.plaintextDbKey = dbKeyString\n\n  // tie database to user's fingerprint at time of creation\n  newDatabaseParams.fingerprint = await _getMyFingerprint()\n\n  return newDatabaseParams\n}\n\nconst _validateEncryptionMode = (encryptionMode) => {\n  if (encryptionMode === 'server-side' && !config.isServerSideEncryptionModeAllowed()) {\n    throw new errors.ServerSideEncryptionNotEnabledInClient\n  }\n}\n\nconst _validateDbName = (dbName) => {\n  if (typeof dbName !== 'string') throw new errors.DatabaseNameMustBeString\n  if (dbName.length === 0) throw new errors.DatabaseNameCannotBeBlank\n  if (dbName.length > MAX_DB_NAME_CHAR_LENGTH) throw new errors.DatabaseNameTooLong(MAX_DB_NAME_CHAR_LENGTH)\n}\n\nconst _validateDbId = (dbId) => {\n  if (typeof dbId !== 'string') throw new errors.DatabaseIdMustBeString\n  if (dbId.length === 0) throw new errors.DatabaseIdCannotBeBlank\n  if (dbId.length !== UUID_CHAR_LENGTH) throw new errors.DatabaseIdInvalidLength(UUID_CHAR_LENGTH)\n}\n\nconst _validateDbInput = (params) => {\n  if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n\n  if (objectHasOwnProperty(params, 'databaseName')) {\n\n    _validateDbName(params.databaseName)\n    if (objectHasOwnProperty(params, 'databaseId')) throw new errors.DatabaseIdNotAllowed\n    if (objectHasOwnProperty(params, 'shareToken')) throw new errors.ShareTokenNotAllowed\n\n    // try to block usage of verified users database. If user works around this and modifies this database,\n    // they could mess up the database for themself.\n    if (!params.allowVerifiedUsersDatabase && params.databaseName === VERIFIED_USERS_DATABASE_NAME) {\n      throw new errors.DatabaseNameRestricted(VERIFIED_USERS_DATABASE_NAME)\n    }\n\n  } else if (objectHasOwnProperty(params, 'databaseId')) {\n\n    _validateDbId(params.databaseId)\n    if (objectHasOwnProperty(params, 'shareToken')) throw new errors.ShareTokenNotAllowed\n\n  } else if (objectHasOwnProperty(params, 'shareToken')) {\n    if (typeof params.shareToken !== 'string') throw new errors.ShareTokenInvalid\n  } else {\n    throw new errors.DatabaseNameMissing\n  }\n\n  if (objectHasOwnProperty(params, 'encryptionMode') && !ENCRYPTION_MODE_OPTIONS[params.encryptionMode]) {\n    throw new errors.EncryptionModeNotValid(ENCRYPTION_MODE_OPTIONS)\n  }\n\n  _checkSignedInState()\n}\n\nconst openDatabase = async (params) => {\n  try {\n    _validateDbInput(params)\n    if (!objectHasOwnProperty(params, 'changeHandler')) throw new errors.ChangeHandlerMissing\n\n    const { databaseName, databaseId, shareToken, changeHandler, encryptionMode = ws.encryptionMode } = params\n\n    if (typeof changeHandler !== 'function') throw new errors.ChangeHandlerMustBeFunction\n    _validateEncryptionMode(encryptionMode)\n\n    if (databaseName) {\n      const dbNameHash = encryptionMode === 'server-side'\n        ? databaseName // Hashing is meant to keep it secret, no need to hash if encryption mode is server-side\n        : (ws.state.dbNameToHash[databaseName] || await crypto.hmac.signString(ws.keys.hmacKey, databaseName))\n\n      if (encryptionMode === 'end-to-end') ws.state.dbNameToHash[databaseName] = dbNameHash // eslint-disable-line require-atomic-updates\n\n      const newDatabaseParams = await _createDatabase(databaseName, encryptionMode)\n\n      const openByDbNameHashParams = { dbNameHash, newDatabaseParams }\n      await _openDatabase(changeHandler, openByDbNameHashParams)\n    } else if (databaseId) {\n      const openByDbIdParams = { databaseId }\n      await _openDatabase(changeHandler, openByDbIdParams)\n    } else {\n      const openByShareToken = { shareToken }\n      await _openDatabase(changeHandler, openByShareToken)\n    }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseAlreadyOpening':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'DatabaseIdNotAllowedForOwnDatabase':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'ShareTokenNotFound':\n      case 'ShareTokenNotAllowedForOwnDatabase':\n      case 'DatabaseNotFound':\n      case 'ChangeHandlerMissing':\n      case 'ChangeHandlerMustBeFunction':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'SubscriptionNotFound':\n      case 'SubscriptionInactive':\n      case 'TrialExpired':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst getOpenDb = (dbName, databaseId, shareToken, encryptionMode = 'end-to-end') => {\n  _validateEncryptionMode(encryptionMode)\n\n  const shareTokenId = shareToken && _getShareTokenIdFromShareToken(base64.decode(shareToken))\n\n  const dbNameHash = encryptionMode === 'server-side' ? dbName : ws.state.dbNameToHash[dbName]\n  const database = dbName\n    ? ws.state.databases[dbNameHash]\n    : ws.state.databasesByDbId[databaseId || ws.state.shareTokenIdToDbId[shareTokenId]]\n\n  if (!database || !database.init) throw new errors.DatabaseNotOpen\n  return database\n}\n\nconst insertItem = async (params) => {\n  try {\n    _validateDbInput(params)\n\n    const database = getOpenDb(params.databaseName, params.databaseId, params.shareToken, params.encryptionMode || ws.encryptionMode)\n\n    const action = 'Insert'\n    const insertParams = await _buildInsertParams(database, params)\n\n    await postTransaction(database, action, insertParams)\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'ItemIdMustBeString':\n      case 'ItemIdCannotBeBlank':\n      case 'ItemIdTooLong':\n      case 'ItemMissing':\n      case 'ItemInvalid':\n      case 'ItemTooLarge':\n      case 'ItemAlreadyExists':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _buildInsertParams = async (database, params) => {\n  if (!objectHasOwnProperty(params, 'item')) throw new errors.ItemMissing\n\n  const { item, itemId, writeAccess } = params\n\n  if (objectHasOwnProperty(params, 'itemId')) {\n    if (typeof itemId !== 'string') throw new errors.ItemIdMustBeString\n    if (itemId.length === 0) throw new errors.ItemIdCannotBeBlank\n    if (itemId.length > MAX_ITEM_ID_CHAR_LENGTH) throw new errors.ItemIdTooLong(MAX_ITEM_ID_CHAR_LENGTH)\n  }\n\n  const itemString = JSON.stringify(item)\n  if (!itemString) throw new errors.ItemInvalid\n  if (byteSizeOfString(itemString) > MAX_ITEM_BYTES) throw new errors.ItemTooLarge(MAX_ITEM_KB)\n\n  const id = itemId || uuidv4()\n\n  const itemKey = await crypto.hmac.signString(ws.keys.hmacKey, id)\n  const itemRecord = { id, item }\n  const encryptedItem = await crypto.aesGcm.encryptJson(database.dbKey, itemRecord)\n\n  return { itemKey, encryptedItem, writeAccess }\n}\n\nconst updateItem = async (params) => {\n  try {\n    _validateDbInput(params)\n\n    const database = getOpenDb(params.databaseName, params.databaseId, params.shareToken, params.encryptionMode || ws.encryptionMode)\n\n    const action = 'Update'\n    const updateParams = await _buildUpdateParams(database, params)\n\n    await postTransaction(database, action, updateParams)\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'ItemIdMissing':\n      case 'ItemIdMustBeString':\n      case 'ItemIdCannotBeBlank':\n      case 'ItemIdTooLong':\n      case 'ItemMissing':\n      case 'ItemInvalid':\n      case 'ItemTooLarge':\n      case 'ItemDoesNotExist':\n      case 'ItemUpdateConflict':\n      case 'WriteAccessParamNotAllowed':\n      case 'TransactionUnauthorized':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _buildUpdateParams = async (database, params) => {\n  if (!objectHasOwnProperty(params, 'item')) throw new errors.ItemMissing\n  if (!objectHasOwnProperty(params, 'itemId')) throw new errors.ItemIdMissing\n\n  if (!params.writeAccess && objectHasOwnProperty(params, 'writeAccess')) params.writeAccess = false // marks writeAccess for deletion\n\n  const { item, itemId, writeAccess } = params\n\n  if (typeof itemId !== 'string') throw new errors.ItemIdMustBeString\n  if (itemId.length === 0) throw new errors.ItemIdCannotBeBlank\n  if (itemId.length > MAX_ITEM_ID_CHAR_LENGTH) throw new errors.ItemIdTooLong(MAX_ITEM_ID_CHAR_LENGTH)\n\n  if (!database.itemExists(itemId)) throw new errors.ItemDoesNotExist\n\n  const itemString = JSON.stringify(item)\n  if (!itemString) throw new errors.ItemInvalid\n  if (byteSizeOfString(itemString) > MAX_ITEM_BYTES) throw new errors.ItemTooLarge(MAX_ITEM_KB)\n\n  const currentVersion = database.getItemVersionNumber(itemId)\n  const itemKey = await crypto.hmac.signString(ws.keys.hmacKey, itemId)\n  const itemRecord = { id: itemId, item, __v: currentVersion + 1 }\n  const encryptedItem = await crypto.aesGcm.encryptJson(database.dbKey, itemRecord)\n\n  return { itemKey, encryptedItem, writeAccess }\n}\n\nconst deleteItem = async (params) => {\n  try {\n    _validateDbInput(params)\n\n    const database = getOpenDb(params.databaseName, params.databaseId, params.shareToken, params.encryptionMode || ws.encryptionMode)\n\n    const action = 'Delete'\n    const deleteParams = await _buildDeleteParams(database, params)\n\n    await postTransaction(database, action, deleteParams)\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'ItemIdMissing':\n      case 'ItemIdMustBeString':\n      case 'ItemIdCannotBeBlank':\n      case 'ItemIdTooLong':\n      case 'ItemDoesNotExist':\n      case 'ItemUpdateConflict':\n      case 'TransactionUnauthorized':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _buildDeleteParams = async (database, params) => {\n  if (!objectHasOwnProperty(params, 'itemId')) throw new errors.ItemIdMissing\n\n  const { itemId } = params\n\n  if (typeof itemId !== 'string') throw new errors.ItemIdMustBeString\n  if (itemId.length === 0) throw new errors.ItemIdCannotBeBlank\n  if (itemId.length > MAX_ITEM_ID_CHAR_LENGTH) throw new errors.ItemIdTooLong(MAX_ITEM_ID_CHAR_LENGTH)\n\n  if (!database.itemExists(itemId)) throw new errors.ItemDoesNotExist\n\n  const currentVersion = database.getItemVersionNumber(itemId)\n  const itemKey = await crypto.hmac.signString(ws.keys.hmacKey, itemId)\n  const itemRecord = { id: itemId, __v: currentVersion + 1 }\n  const encryptedItem = await crypto.aesGcm.encryptJson(database.dbKey, itemRecord)\n\n  return { itemKey, encryptedItem }\n}\n\nconst putTransaction = async (params) => {\n  try {\n    _validateDbInput(params)\n    if (!objectHasOwnProperty(params, 'operations')) throw new errors.OperationsMissing\n\n    const { databaseName, databaseId, shareToken, operations, encryptionMode = ws.encryptionMode } = params\n\n    if (!Array.isArray(operations)) throw new errors.OperationsMustBeArray\n\n    const database = getOpenDb(databaseName, databaseId, shareToken, encryptionMode)\n\n    const action = 'BatchTransaction'\n\n    const operationParamsPromises = await Promise.all(operations.map(operation => {\n      const command = operation.command\n\n      switch (command) {\n        case 'Insert': {\n          return _buildInsertParams(database, operation)\n        }\n\n        case 'Update': {\n          return _buildUpdateParams(database, operation)\n        }\n\n        case 'Delete': {\n          return _buildDeleteParams(database, operation)\n        }\n\n        default: throw new errors.CommandNotRecognized(command)\n      }\n    }))\n    const operationParamsPromiseResults = await Promise.all(operationParamsPromises)\n\n    const operationParams = {\n      operations: operations.map((operation, i) => ({\n        command: operation.command,\n        ...operationParamsPromiseResults[i]\n      }))\n    }\n\n    try {\n      await postTransaction(database, action, operationParams)\n    } catch (e) {\n      if (e.response && e.response.data.error === 'OperationsExceedLimit') {\n        throw new errors.OperationsExceedLimit(e.response.data.limit)\n      }\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'OperationsMissing':\n      case 'OperationsMustBeArray':\n      case 'OperationsConflict':\n      case 'OperationsExceedLimit':\n      case 'CommandNotRecognized':\n      case 'ItemIdMissing':\n      case 'ItemIdMustBeString':\n      case 'ItemIdCannotBeBlank':\n      case 'ItemIdTooLong':\n      case 'ItemMissing':\n      case 'ItemInvalid':\n      case 'ItemTooLarge':\n      case 'ItemAlreadyExists':\n      case 'ItemDoesNotExist':\n      case 'ItemUpdateConflict':\n      case 'WriteAccessParamNotAllowed':\n      case 'TransactionUnauthorized':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst postTransaction = async (database, action, params) => {\n  try {\n    const pendingTx = database.registerUnverifiedTransaction()\n\n    const paramsWithDbData = {\n      ...params,\n      dbId: database.dbId,\n      dbNameHash: database.dbNameHash\n    }\n\n    const response = await ws.request(action, paramsWithDbData)\n    const seqNo = response.data.sequenceNo\n\n    await pendingTx.getResult(seqNo)\n\n    database.unregisterUnverifiedTransaction(pendingTx)\n\n    return seqNo\n  } catch (e) {\n    _parseGenericErrors(e)\n\n    if (e.response) {\n      if (e.response.data.name === 'DatabaseIsReadOnly') {\n        throw new errors.DatabaseIsReadOnly\n      } else if (e.response.data.message === 'UserNotFound') {\n        throw new errors.UserNotFound(e.response.data.username)\n      }\n    }\n\n    throw e\n  }\n}\n\nconst _completeFileUpload = async (database, fileId, itemKey, encryptedFileMetadata, encryptedFileEncryptionKey) => {\n  const params = {\n    dbId: database.dbId,\n    fileId,\n    itemKey,\n    fileMetadata: encryptedFileMetadata,\n    fileEncryptionKey: base64.encode(encryptedFileEncryptionKey)\n  }\n\n  const action = 'CompleteFileUpload'\n  await postTransaction(database, action, params)\n}\n\nconst _readBlob = async (blob) => {\n  const reader = new FileReader()\n\n  return new Promise((resolve, reject) => {\n    reader.onload = (e) => {\n      if (!e.target.error) {\n        resolve(e.target.result)\n      } else {\n        reject(e.target.error)\n      }\n    }\n\n    reader.readAsArrayBuffer(blob)\n  })\n}\n\nconst _uploadChunkRequest = async (request, bytesTransferredObject, progressHandler, chunkSize) => {\n  await request\n  bytesTransferredObject.bytesTransferred += chunkSize\n  if (progressHandler) progressHandler({ ...bytesTransferredObject })\n}\n\nconst _uploadChunk = async (batch, chunk, dbId, fileId, fileEncryptionKey, chunkNumber, bytesTransferredObject, progressHandler) => {\n  const plaintextChunk = await _readBlob(chunk)\n\n  // encrypt each chunk with new encryption key to maintain lower usage of file encryption key\n  const [chunkEncryptionKey, encryptedChunkEncryptionKey] = await crypto.aesGcm.generateAndEncryptKeyEncryptionKey(fileEncryptionKey)\n  const encryptedChunk = await crypto.aesGcm.encrypt(chunkEncryptionKey, plaintextChunk)\n\n  const uploadChunkParams = {\n    dbId,\n    chunkNumber,\n    fileId,\n\n    // arrayBufferToString takes up less space than base64 encoding. Uint8Array format required so that encrypted\n    // chunks that are odd number sized get converted to string properly\n    chunk: arrayBufferToString(new Uint8Array(encryptedChunk)),\n    chunkEncryptionKey: arrayBufferToString(new Uint8Array(encryptedChunkEncryptionKey)),\n  }\n\n  // queue UploadFileChunk request into batch of requests\n  const action = 'UploadFileChunk'\n\n  const uploadChunkRequest = _uploadChunkRequest(ws.request(action, uploadChunkParams), bytesTransferredObject, progressHandler, chunk.size)\n\n  batch.push(uploadChunkRequest)\n\n  // wait for batch of UploadFileChunk requests to finish before moving on to upload the next batch of chunks\n  if (batch.length === FILE_CHUNKS_PER_BATCH) {\n    await Promise.all(batch)\n    batch.length = 0\n  }\n}\n\nconst _buildFileMetadata = async (params, database) => {\n  if (!objectHasOwnProperty(params, 'itemId')) throw new errors.ItemIdMissing\n  if (!objectHasOwnProperty(params, 'file')) throw new errors.FileMissing\n\n  const { itemId, file } = params\n\n  if (typeof itemId !== 'string') throw new errors.ItemIdMustBeString\n  if (itemId.length === 0) throw new errors.ItemIdCannotBeBlank\n  if (itemId.length > MAX_ITEM_ID_CHAR_LENGTH) throw new errors.ItemIdTooLong(MAX_ITEM_ID_CHAR_LENGTH)\n\n  if (!database.itemExists(itemId)) throw new errors.ItemDoesNotExist\n\n  if (!(file instanceof File)) throw new errors.FileMustBeFile\n  if (file.size === 0) throw new errors.FileCannotBeEmpty\n\n  const itemKey = await crypto.hmac.signString(ws.keys.hmacKey, itemId)\n  const currentVersion = database.getFileVersionNumber(itemId)\n  const fileMetadata = {\n    itemId,\n    __v: currentVersion === undefined ? 0 : currentVersion + 1,\n    fileName: file.name,\n    fileSize: file.size,\n    fileType: file.type,\n  }\n  return { itemKey, fileMetadata }\n}\n\nconst _validateUploadFile = (params) => {\n  _validateDbInput(params)\n  if (objectHasOwnProperty(params, 'progressHandler') && typeof params.progressHandler !== 'function') {\n    throw new errors.ProgressHandlerMustBeFunction\n  }\n}\n\nconst uploadFile = async (params) => {\n  try {\n    _validateUploadFile(params)\n\n    const database = getOpenDb(params.databaseName, params.databaseId, params.shareToken, params.encryptionMode || ws.encryptionMode)\n    const { dbId } = database\n\n    try {\n      const { itemKey, fileMetadata } = await _buildFileMetadata(params, database)\n\n      // generate a new key particular to this file to maintain lower usage of dbKey\n      const [fileEncryptionKey, encryptedFileEncryptionKey] = await crypto.aesGcm.generateAndEncryptKeyEncryptionKey(database.dbKey)\n      const encryptedFileMetadata = await crypto.aesGcm.encryptJson(fileEncryptionKey, fileMetadata)\n\n      // server generates unique file identifier\n      const { data: { fileId } } = await ws.request('GenerateFileId', { dbId: database.dbId })\n\n      // upload file in chunks of size FILE_CHUNK_SIZE\n      const file = params.file\n      let position = 0\n      let chunkNumber = 0\n      let batch = [] // will use this to send chunks to server in batches of FILE_CHUNKS_PER_BATCH\n      const bytesTransferredObject = {\n        bytesTransferred: 0\n      }\n\n      while (position < file.size) {\n        // read a chunk at a time to keep memory overhead low\n        const chunk = file.slice(position, position + FILE_CHUNK_SIZE)\n        await _uploadChunk(batch, chunk, dbId, fileId, fileEncryptionKey, chunkNumber, bytesTransferredObject, params.progressHandler)\n\n        chunkNumber += 1\n        position += FILE_CHUNK_SIZE\n      }\n\n      await Promise.all(batch)\n      await _completeFileUpload(database, fileId, itemKey, encryptedFileMetadata, encryptedFileEncryptionKey)\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response && e.response.data === 'DatabaseIsReadOnly') {\n        throw new errors.DatabaseIsReadOnly\n      }\n\n      throw e\n    }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'ItemIdMissing':\n      case 'ItemIdMustBeString':\n      case 'ItemIdCannotBeBlank':\n      case 'ItemIdTooLong':\n      case 'ItemDoesNotExist':\n      case 'TransactionUnauthorized':\n      case 'FileMustBeFile':\n      case 'FileCannotBeEmpty':\n      case 'FileMissing':\n      case 'FileUploadConflict':\n      case 'ProgressHandlerMustBeFunction':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _getChunk = async (dbId, fileId, chunkNumber, fileEncryptionKey) => {\n  try {\n    const action = 'GetChunk'\n    const params = {\n      dbId,\n      fileId,\n      chunkNumber,\n    }\n    const response = await ws.request(action, params)\n    const data = response.data\n\n    const chunkRawBuffer = new Uint8Array(new Uint16Array(stringToArrayBuffer(data.chunk))).buffer\n    const chunkEncryptionKeyRawBuffer = new Uint8Array(new Uint16Array(stringToArrayBuffer(data.chunkEncryptionKey))).buffer\n\n    const chunkEncryptionKeyRaw = await crypto.aesGcm.decrypt(fileEncryptionKey, chunkEncryptionKeyRawBuffer)\n    const chunkEncryptionKey = await crypto.aesGcm.getKeyFromRawKey(chunkEncryptionKeyRaw)\n\n    const chunk = await crypto.aesGcm.decrypt(chunkEncryptionKey, chunkRawBuffer)\n    return chunk\n  } catch (e) {\n    _parseGenericErrors(e)\n    throw e\n  }\n}\n\nconst _getByteRange = async (dbId, fileId, fileEncryptionKey, range) => {\n  const { start, end } = range\n\n  const chunks = []\n  const startChunkNumber = Math.floor(start / FILE_CHUNK_SIZE)\n  const endChunkNumber = Math.floor(end / FILE_CHUNK_SIZE) - (end % FILE_CHUNK_SIZE === 0 ? 1 : 0)\n\n  let chunkNumber = startChunkNumber\n  while (chunkNumber <= endChunkNumber) {\n    let chunk = await _getChunk(dbId, fileId, chunkNumber, fileEncryptionKey)\n\n    if (chunkNumber === startChunkNumber && chunkNumber === endChunkNumber && end % FILE_CHUNK_SIZE) {\n      chunk = chunk.slice(start % FILE_CHUNK_SIZE, end % FILE_CHUNK_SIZE)\n    } else if (chunkNumber === startChunkNumber) {\n      chunk = chunk.slice(start % FILE_CHUNK_SIZE)\n    } else if (chunkNumber === endChunkNumber && end % FILE_CHUNK_SIZE) {\n      chunk = chunk.slice(0, end % FILE_CHUNK_SIZE)\n    }\n\n    chunks.push(chunk)\n    chunkNumber += 1\n  }\n\n  return chunks\n}\n\nconst _getFile = async (dbId, fileId, fileEncryptionKey, fileSize) => {\n  const chunks = []\n  let chunkNumber = 0\n\n  const finalChunkNumber = fileSize < FILE_CHUNK_SIZE\n    ? 0\n    : Math.floor(fileSize / FILE_CHUNK_SIZE) - (fileSize % FILE_CHUNK_SIZE === 0 ? 1 : 0)\n\n  while (chunkNumber <= finalChunkNumber) {\n    const chunk = await _getChunk(dbId, fileId, chunkNumber, fileEncryptionKey)\n    chunks.push(chunk)\n    chunkNumber += 1\n  }\n\n  return chunks\n}\n\nconst _validateGetFileParams = (params) => {\n  _validateDbInput(params)\n\n  if (!objectHasOwnProperty(params, 'fileId')) throw new errors.FileIdMissing\n\n  const { fileId, range } = params\n\n  if (typeof fileId !== 'string') throw new errors.FileIdMustBeString\n  if (fileId.length === 0) throw new errors.FileIdCannotBeBlank\n  if (fileId.length > MAX_ITEM_ID_CHAR_LENGTH) throw new errors.FileIdTooLong(MAX_ITEM_ID_CHAR_LENGTH)\n\n  if (objectHasOwnProperty(params, 'range')) {\n    if (typeof range !== 'object') throw new errors.RangeMustBeObject\n\n    if (!objectHasOwnProperty(range, 'start')) throw new errors.RangeMissingStart\n    if (!objectHasOwnProperty(range, 'end')) throw new errors.RangeMissingEnd\n\n    const { start, end } = range\n\n    if (typeof start !== 'number') throw new errors.RangeStartMustBeNumber\n    if (typeof end !== 'number') throw new errors.RangeEndMustBeNumber\n\n    if (start < 0) throw new errors.RangeStartMustBeGreaterThanZero\n    if (end <= start) throw new errors.RangeEndMustBeGreaterThanRangeStart\n  }\n}\n\nconst getFile = async (params) => {\n  try {\n    _validateGetFileParams(params)\n\n    const database = getOpenDb(params.databaseName, params.databaseId, params.shareToken, params.encryptionMode || ws.encryptionMode)\n    const { dbId } = database\n    const { fileId, range } = params\n\n    const itemId = database.fileIds[fileId]\n    const item = database.items[itemId]\n\n    if (!item || !item.file) throw new errors.FileNotFound\n\n    const { file: { fileName, fileSize, fileType, fileEncryptionKey } } = item\n\n    if (range && range.end > fileSize) throw new errors.RangeEndMustBeLessThanFileSize\n\n    const chunks = range\n      ? await _getByteRange(dbId, fileId, fileEncryptionKey, range)\n      : await _getFile(dbId, fileId, fileEncryptionKey, fileSize)\n\n    return {\n      file: new File(chunks, fileName, { type: fileType })\n    }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNotOpen':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'ShareTokenInvalid':\n      case 'DatabaseIsReadOnly':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'FileIdMissing':\n      case 'FileIdMustBeString':\n      case 'FileIdCannotBeBlank':\n      case 'FileIdTooLong':\n      case 'FileNotFound':\n      case 'RangeMustBeObject':\n      case 'RangeMissingStart':\n      case 'RangeMissingEnd':\n      case 'RangeStartMustBeNumber':\n      case 'RangeEndMustBeNumber':\n      case 'RangeStartMustBeGreaterThanZero':\n      case 'RangeEndMustBeGreaterThanRangeStart':\n      case 'RangeEndMustBeLessThanFileSize':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n\n  }\n}\n\nconst _verifyUsersParent = async (dbKey, verifiedUsers, databaseUser) => {\n  const { username, senderUsername, verificationValues } = databaseUser\n  const { sentSignature, receivedSignature, senderEcdsaPublicKey } = verificationValues\n\n  const verifiedFingerprint = verifiedUsers[username] && verifiedUsers[username].record.fingerprint\n\n  const parentRawEcdsaPublicKey = base64.decode(senderEcdsaPublicKey)\n  const parentFingerprint = (verifiedUsers[senderUsername] && verifiedUsers[senderUsername].record.fingerprint)\n    || await _getFingerprint(parentRawEcdsaPublicKey)\n  const parentEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(parentRawEcdsaPublicKey)\n\n  // verify parent's claim that sent the dbKey to user\n  const expectedSentSignature = await _signFingerprintWithDbKey(dbKey, verifiedFingerprint)\n  const verifiedParentSent = await crypto.ecdsa.verifyString(parentEcdsaPublicKey, sentSignature, expectedSentSignature)\n\n  // verify user's claim that received the dbKey from parent\n  const recipientEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(base64.decode(verificationValues.recipientEcdsaPublicKey))\n  const expectedReceivedSignature = await _signFingerprintWithDbKey(dbKey, parentFingerprint)\n  const verifiedReceivedFromParent = await crypto.ecdsa.verifyString(recipientEcdsaPublicKey, receivedSignature, expectedReceivedSignature)\n\n  return verifiedParentSent && verifiedReceivedFromParent\n}\n\nconst _verifyReceivedDatabaseFromUser = async (dbKey, verifiedFingerprint, myFingerprint, myEcdsaPublicKey, verificationValues) => {\n  const { mySentSignature, myReceivedSignature } = verificationValues\n\n  // verify my claim that I received dbKey from this user\n  const expectedReceivedSignature = await _signFingerprintWithDbKey(dbKey, verifiedFingerprint)\n  const verifiedReceived = await crypto.ecdsa.verifyString(myEcdsaPublicKey, myReceivedSignature, expectedReceivedSignature)\n\n  if (!verifiedReceived) return verifiedReceived\n\n  // verify user's claim that sent dbKey to me\n  const expectedSentSignature = await _signFingerprintWithDbKey(dbKey, myFingerprint)\n  const senderEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(base64.decode(verificationValues.mySenderEcdsaPublicKey))\n  const verifiedSent = await crypto.ecdsa.verifyString(senderEcdsaPublicKey, mySentSignature, expectedSentSignature)\n\n  return verifiedSent && verifiedReceived\n}\n\nconst _verifySentDatabaseToUser = async (dbKey, verifiedFingerprint, myFingerprint, myEcdsaPublicKey, verificationValues) => {\n  const { sentSignature, receivedSignature } = verificationValues\n\n  // verify my claim that I sent dbKey to this user\n  const expectedSentSignature = await _signFingerprintWithDbKey(dbKey, verifiedFingerprint)\n  const verifiedSent = await crypto.ecdsa.verifyString(myEcdsaPublicKey, sentSignature, expectedSentSignature)\n\n  if (!verifiedSent) return verifiedSent\n\n  // verify user's claim that received dbKey from me\n  const expectedReceivedSignature = await _signFingerprintWithDbKey(dbKey, myFingerprint)\n  const recipientEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(base64.decode(verificationValues.recipientEcdsaPublicKey))\n  const verifiedReceived = await crypto.ecdsa.verifyString(recipientEcdsaPublicKey, receivedSignature, expectedReceivedSignature)\n\n  return verifiedSent && verifiedReceived\n}\n\nconst _buildDatabaseUserResult = async (dbKey, databaseUsers, verifiedUsers, myUsername, mySenderUsername) => {\n  const myEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromPrivateKey(ws.keys.ecdsaPrivateKey)\n  const myFingerprint = await _getMyFingerprint()\n\n  // iterate over all database users to verify each user individually\n  for (let i = 0; i < databaseUsers.length; i++) {\n    const databaseUser = databaseUsers[i]\n    const { username, isOwner, senderUsername, verificationValues } = databaseUser\n\n    try {\n      const verifiedFingerprint = verifiedUsers[username] && verifiedUsers[username].record.fingerprint\n\n      const sentDatabaseToUser = verificationValues.isChild\n      const receivedDatabaseFromUser = mySenderUsername === username\n\n      if (verifiedFingerprint) {\n        if (sentDatabaseToUser) {\n          databaseUsers[i].verified = await _verifySentDatabaseToUser(dbKey, verifiedFingerprint, myFingerprint, myEcdsaPublicKey, verificationValues)\n        } else if (receivedDatabaseFromUser) {\n          const verifiedReceivedDatabaseFromUser = await _verifyReceivedDatabaseFromUser(dbKey, verifiedFingerprint, myFingerprint, myEcdsaPublicKey, verificationValues)\n\n          // verify user's relationship to parent if has a parent\n          if (verifiedReceivedDatabaseFromUser && senderUsername) {\n            const verifiedGrandparent = await _verifyUsersParent(dbKey, verifiedUsers, databaseUser)\n            databaseUsers[i].verified = verifiedGrandparent\n          } else {\n            databaseUsers[i].verified = verifiedReceivedDatabaseFromUser\n          }\n\n        } else if (!isOwner) {\n          // verify unrelated user's parent sent dbKey to user and user received dbKey from their parent\n          const verifiedUsersParent = await _verifyUsersParent(dbKey, verifiedUsers, databaseUser)\n          databaseUsers[i].verified = verifiedUsersParent\n        } else {\n          // must be an owner that is not my child or parent, and owner is automatically verified\n          databaseUsers[i].verified = isOwner\n        }\n      }\n    } catch {\n      // continue without setting verified boolean\n    }\n\n    // \"receivedFromUsername\" is easier to understand to end developer\n    delete databaseUsers[i].senderUsername\n    if (!isOwner) {\n      if (verificationValues && verificationValues.isChild) databaseUsers[i].receivedFromUsername = myUsername\n      else if (senderUsername) databaseUsers[i].receivedFromUsername = senderUsername\n    }\n\n    // these values are not useful to user\n    delete databaseUsers[i].verificationValues\n  }\n\n  return databaseUsers\n}\n\nconst _databaseHasOwner = (databaseUsers) => {\n  for (let i = 0; i < databaseUsers.length; i++) {\n    const user = databaseUsers[i]\n    if (user.isOwner) return true\n  }\n\n  return false\n}\n\nconst _getDatabaseUsers = async (databaseId, databaseNameHash, dbKey, verifiedUsers, username, senderUsername) => {\n  const users = []\n  const action = 'GetDatabaseUsers'\n  const params = { databaseId, databaseNameHash }\n  let databaseUsersResponse = await ws.request(action, params)\n\n  users.push(...await _buildDatabaseUserResult(dbKey, databaseUsersResponse.data.users, verifiedUsers, username, senderUsername))\n\n  while (databaseUsersResponse.data.nextPageTokenLessThanUserId || databaseUsersResponse.data.nextPageTokenMoreThanUserId) {\n    params.nextPageTokenLessThanUserId = databaseUsersResponse.data.nextPageTokenLessThanUserId\n    params.nextPageTokenMoreThanUserId = databaseUsersResponse.data.nextPageTokenMoreThanUserId\n    databaseUsersResponse = await ws.request(action, params)\n    users.push(...await _buildDatabaseUserResult(dbKey, databaseUsersResponse.data.users, verifiedUsers, username, senderUsername))\n  }\n\n  return users\n}\n\nconst _buildDatabaseResult = async (db, encryptionKey, ecdhPrivateKey, verifiedUsers, username) => {\n  const { databaseId, databaseNameHash, isOwner, readOnly, resharingAllowed, senderUsername } = db\n\n  let dbKey, databaseName\n  if (db.encryptedDbKey || db.plaintextDbKey) {\n    // user must already have access to database\n    const dbKeyString = db.plaintextDbKey || await crypto.aesGcm.decryptString(encryptionKey, db.encryptedDbKey)\n    dbKey = await crypto.aesGcm.getKeyFromKeyString(dbKeyString)\n    databaseName = await crypto.aesGcm.decryptString(dbKey, db.databaseName)\n\n    // don't expose the user's own verified users database to user -- it's used internally\n    if (isOwner && databaseName === VERIFIED_USERS_DATABASE_NAME) return null\n  } else if (db.wrappedDbKey) {\n    // user using userbase-js v2.0.0 shared with user using userbase-js >= v2.0.1. Updated client\n    // cannot receive access to databases shared via userbase-js v2.0.0\n    return null\n  } else {\n    // user is seeing the database for the first time\n    let senderRawEcdsaPublicKey\n    try {\n      const { ephemeralPublicKey, signedEphemeralPublicKey, sharedEncryptedDbKey } = db\n\n      // verify sender signed the ephemeral public key\n      senderRawEcdsaPublicKey = base64.decode(db.senderEcdsaPublicKey)\n      const senderEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(senderRawEcdsaPublicKey)\n      const senderSignedEphemeralPublicKey = await crypto.ecdsa.verify(senderEcdsaPublicKey, base64.decode(signedEphemeralPublicKey), base64.decode(ephemeralPublicKey))\n      if (!senderSignedEphemeralPublicKey) throw new errors.ServiceUnavailable\n\n      // compute shared key encryption key with other user and decrypt database encryption key\n      const senderEphemeralEcdhPublicKey = await crypto.ecdh.getPublicKeyFromRawPublicKey(base64.decode(ephemeralPublicKey))\n      const sharedKeyEncryptionKey = await crypto.ecdh.computeSharedKeyEncryptionKey(senderEphemeralEcdhPublicKey, ecdhPrivateKey)\n      const dbKeyString = await crypto.aesGcm.decryptString(sharedKeyEncryptionKey, sharedEncryptedDbKey)\n      dbKey = await crypto.aesGcm.getKeyFromKeyString(dbKeyString)\n\n      // make sure dbKey the sender sent works\n      databaseName = await crypto.aesGcm.decryptString(dbKey, db.databaseName)\n    } catch (e) {\n      // if for whatever reason the above process fails (e.g. malicious sender or version upgrade breaks the above implementation),\n      // simply return a null spot for database\n      return null\n    }\n\n    // compute receivedSignature to maintain record of who received dbKey from\n    const senderFingerprint = await _getFingerprint(senderRawEcdsaPublicKey)\n    const receivedSignature = await _signDbKeyAndFingerprint(dbKey, senderFingerprint)\n\n    // tell server to store encrypted db key & delete ephemeral key data\n    const dbKeyString = await crypto.aesGcm.getKeyStringFromKey(dbKey)\n    const encryptedDbKey = await crypto.aesGcm.encryptString(encryptionKey, dbKeyString)\n\n    const action = 'SaveDatabase'\n    const params = { databaseNameHash, encryptedDbKey, receivedSignature }\n    ws.request(action, params)\n  }\n\n  const result = {\n    databaseName,\n    databaseId,\n    isOwner,\n    readOnly,\n    resharingAllowed,\n    encryptionMode: db.plaintextDbKey ? 'server-side' : 'end-to-end',\n  }\n\n  const users = await _getDatabaseUsers(databaseId, databaseNameHash, dbKey, verifiedUsers, username, senderUsername)\n\n  // if database has no owner, owner must have been deleted and database should not be accessible to user\n  if (isOwner || _databaseHasOwner(users)) result.users = users\n  else return null\n\n  if (!isOwner && senderUsername) result.receivedFromUsername = senderUsername\n\n  return result\n}\n\nconst getDatabases = async (params) => {\n  try {\n    if (params !== undefined) _validateDbInput(params)\n    _checkSignedInState()\n\n    const { encryptionKey, ecdhPrivateKey } = ws.keys\n    const username = ws.session.username\n\n    if (params && objectHasOwnProperty(params, 'shareToken')) throw new errors.ShareTokenNotAllowed\n\n    const encryptionMode = (params && params.encryptionMode) || ws.encryptionMode\n    _validateEncryptionMode(encryptionMode)\n\n    try {\n      const databases = []\n      const action = 'GetDatabases'\n      const requestParams = params && {\n        databaseId: params.databaseId,\n        dbNameHash: encryptionMode === 'server-side'\n          ? params.databaseName\n          : params.databaseName && await crypto.hmac.signString(ws.keys.hmacKey, params.databaseName)\n      }\n\n      let [databasesResponse, verifiedUsers] = await Promise.all([ws.request(action, requestParams), _openVerifiedUsersDatabase()])\n      let databaseResults = await Promise.all(databasesResponse.data.databases.map(db => _buildDatabaseResult(db, encryptionKey, ecdhPrivateKey, verifiedUsers, username)))\n      databases.push(...databaseResults)\n\n      while (databasesResponse.data.nextPageToken) {\n        const params = { nextPageToken: databasesResponse.data.nextPageToken }\n        databasesResponse = await ws.request(action, params)\n        databaseResults = await Promise.all(databasesResponse.data.databases.map(db => _buildDatabaseResult(db, encryptionKey, ecdhPrivateKey, verifiedUsers, username)))\n        databases.push(...databaseResults)\n      }\n\n      return { databases: databases.filter(database => database !== null) }\n    } catch (e) {\n      _parseGenericErrors(e)\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst _getDatabase = async (databaseName, databaseId, encryptionMode = 'end-to-end') => {\n  _validateEncryptionMode(encryptionMode)\n\n  let database\n  try {\n    // check if database is already open in memory. shareToken = null because not possible to pass shareToken here\n    database = getOpenDb(databaseName, databaseId, null, encryptionMode)\n  } catch {\n    // if not already open in memory, it's ok. Just get the values we need from backend\n    const action = 'GetDatabases'\n    const requestParams = databaseName\n      ? { dbNameHash: encryptionMode === 'server-side' ? databaseName : await crypto.hmac.signString(ws.keys.hmacKey, databaseName) }\n      : { databaseId }\n\n    const databaseResponse = await ws.request(action, requestParams)\n\n    const databases = databaseResponse.data.databases\n    if (!databases || !databases.length) throw new errors.DatabaseNotFound\n    database = databases[0]\n\n    // type conversion :/\n    database.dbNameHash = database.databaseNameHash\n    database.dbId = database.databaseId\n  }\n  return database\n}\n\nconst _signFingerprintWithDbKey = async (dbKey, fingerprint) => {\n  // convert dbKey into hmacKey\n  const rawDbKey = await crypto.aesGcm.getRawKeyFromKey(dbKey)\n  const dbKeyHash = await crypto.sha256.hash(rawDbKey)\n  const hmacKey = await crypto.hmac.importKeyFromRawBits(dbKeyHash)\n\n  // sign fingerprint with hmacKey\n  const signedFingerprint = await crypto.hmac.signString(hmacKey, fingerprint)\n  return signedFingerprint\n}\n\nconst _signDbKeyAndFingerprint = async (dbKey, fingerprint) => {\n  const signedFingerprint = await _signFingerprintWithDbKey(dbKey, fingerprint)\n\n  // digitally sign the signedFingerprint to enable a user to verify that\n  // this user has sent/received dbKey to/from intended recipient/sender\n  const signedDbKeyAndFingerprint = await crypto.ecdsa.signString(ws.keys.ecdsaPrivateKey, signedFingerprint)\n  return signedDbKeyAndFingerprint\n}\n\nconst _verifyDatabaseRecipientFingerprint = async (username, recipientFingerprint, verifiedUsers) => {\n  // find recipient's fingerprint in verified users database\n  let verifiedRecipientFingerprint, foundOldFingerprint\n  const verifiedUsersArray = Object.keys(verifiedUsers)\n  for (let i = 0; i < verifiedUsersArray.length; i++) {\n    const verifiedUsername = verifiedUsersArray[i]\n    const verifiedFingerprint = verifiedUsers[verifiedUsername].record.fingerprint\n    if (username === verifiedUsername && recipientFingerprint === verifiedFingerprint) {\n      verifiedRecipientFingerprint = verifiedFingerprint\n      break\n    } else if (verifiedFingerprint === recipientFingerprint) {\n      foundOldFingerprint = true\n    }\n  }\n\n  // must have an outdated username stored in verified users database and therefore must reverify recipient\n  if (!verifiedRecipientFingerprint && foundOldFingerprint) throw new errors.UserMustBeReverified\n  if (!verifiedRecipientFingerprint) throw new errors.UserNotVerified\n}\n\nconst _getDatabaseEncryptionKey = async (database) => {\n  let dbKeyString\n  if (!database.dbKey) {\n    dbKeyString = database.plaintextDbKey || await crypto.aesGcm.decryptString(ws.keys.encryptionKey, database.encryptedDbKey)\n    database.dbKey = await crypto.aesGcm.getKeyFromKeyString(dbKeyString)\n  } else {\n    dbKeyString = await crypto.aesGcm.getKeyStringFromKey(database.dbKey)\n  }\n  return dbKeyString\n}\n\nconst _getShareToken = async (params, readOnly, encryptionMode) => {\n  try {\n    const { databaseName, databaseId } = params\n\n    if (objectHasOwnProperty(params, 'requireVerified')) throw new errors.RequireVerifiedParamNotNecessary\n    if (objectHasOwnProperty(params, 'resharingAllowed')) throw new errors.ResharingAllowedParamNotAllowed('when retrieving a share token')\n\n    // generate share token seed and associated keys\n    const shareTokenSeed = crypto.generateSeed()\n    const shareTokenHkdfKey = await crypto.hkdf.importHkdfKey(shareTokenSeed)\n\n    // generate share token encryption key\n    const shareTokenEncryptionKeySalt = crypto.hkdf.generateSalt()\n    const shareTokenEncryptionKey = await crypto.aesGcm.importKeyFromMaster(shareTokenHkdfKey, shareTokenEncryptionKeySalt)\n\n    // encrypt the database key using shareTokenEncryptionKey\n    const database = await _getDatabase(databaseName, databaseId, encryptionMode)\n    const dbKeyString = await _getDatabaseEncryptionKey(database)\n    const shareTokenEncryptedDbKeyString = await crypto.aesGcm.encryptString(shareTokenEncryptionKey, dbKeyString)\n\n    // generate share token ECDSA key data\n    const { ecdsaPublicKey, encryptedEcdsaPrivateKey, ecdsaKeyEncryptionKeySalt } = await crypto.ecdsa.generateEcdsaKeyData(shareTokenHkdfKey)\n\n    const action = 'ShareDatabaseToken'\n    const requestParams = {\n      databaseId: database.dbId,\n      databaseNameHash: database.dbNameHash,\n      readOnly,\n      keyData: {\n        shareTokenEncryptedDbKey: shareTokenEncryptedDbKeyString,\n        shareTokenEncryptionKeySalt: base64.encode(shareTokenEncryptionKeySalt),\n        shareTokenPublicKey: ecdsaPublicKey,\n        shareTokenEncryptedEcdsaPrivateKey: encryptedEcdsaPrivateKey,\n        shareTokenEcdsaKeyEncryptionKeySalt: ecdsaKeyEncryptionKeySalt,\n      }\n    }\n    const shareTokenResponse = await ws.request(action, requestParams)\n\n    // server generates unique ID\n    const { shareTokenId } = shareTokenResponse.data\n\n    // prepend shareTokenId to shareTokenSeed to get final shareToken to return to user, all in base64\n    const shareTokenIdArrayBuffer = stringToArrayBuffer(shareTokenId, true)\n    const shareToken = base64.encode(appendBuffer(shareTokenIdArrayBuffer, shareTokenSeed))\n    return shareToken\n  } catch (e) {\n    _parseGenericErrors(e)\n\n    if (e.response && e.response.data) {\n      switch (e.response.data.message) {\n        case 'DatabaseNotFound': throw new errors.DatabaseNotFound\n        case 'ResharingNotAllowed': throw new errors.ResharingNotAllowed('Only the owner can generate a share token')\n      }\n    }\n\n    throw e\n  }\n}\n\nconst _shareDatabaseWithUsername = async (params, readOnly, resharingAllowed, requireVerified, encryptionMode) => {\n  const { databaseName, databaseId } = params\n  const username = params.username.toLowerCase()\n\n  try {\n    // get recipient's public key to use to generate a shared key, and retrieve verified users list if requireVerified set to true\n    const [recipientPublicKey, verifiedUsers, database] = await Promise.all([\n      authApi.getPublicKey(username),\n      requireVerified && _openVerifiedUsersDatabase(),\n      _getDatabase(databaseName, databaseId, encryptionMode),\n    ])\n\n    // recipient must have required keys so client can share database key\n    if (!recipientPublicKey.ecdhPublicKey || !recipientPublicKey.ecdsaPublicKey) throw new errors.UserUnableToReceiveDatabase\n\n    // compute recipient's fingerprint of ECDSA public key stored on server\n    const recipientRawEcdsaPublicKey = base64.decode(recipientPublicKey.ecdsaPublicKey)\n    const recipientFingerprint = await _getFingerprint(recipientRawEcdsaPublicKey)\n\n    // verify that the recipient is in the user's list of verified users\n    if (requireVerified) await _verifyDatabaseRecipientFingerprint(username, recipientFingerprint, verifiedUsers)\n\n    // verify recipient signed the ECDH public key that sender will be using to share database\n    const recipientEcdsaPublicKey = await crypto.ecdsa.getPublicKeyFromRawPublicKey(recipientRawEcdsaPublicKey)\n    const { signedEcdhPublicKey, ecdhPublicKey } = recipientPublicKey\n    const isVerified = await crypto.ecdsa.verify(recipientEcdsaPublicKey, base64.decode(signedEcdhPublicKey), base64.decode(ecdhPublicKey))\n\n    // this should never happen. If this happens, the server is serving conflicting keys and client should not sign anything\n    if (!isVerified) throw new errors.ServiceUnavailable\n\n    const recipientEcdhPublicKey = await crypto.ecdh.getPublicKeyFromRawPublicKey(base64.decode(recipientPublicKey.ecdhPublicKey))\n\n    // generate ephemeral ECDH key pair to ensure forward secrecy for future shares between users if shared key is leaked\n    const ephemeralEcdhKeyPair = await crypto.ecdh.generateKeyPair()\n    const rawEphemeralEcdhPublicKey = await crypto.ecdh.getRawPublicKeyFromPublicKey(ephemeralEcdhKeyPair.publicKey)\n    const signedEphemeralEcdhPublicKey = await crypto.ecdsa.sign(ws.keys.ecdsaPrivateKey, rawEphemeralEcdhPublicKey)\n\n    // compute shared key encryption key with recipient so can use it to encrypt database encryption key\n    const sharedKeyEncryptionKey = await crypto.ecdh.computeSharedKeyEncryptionKey(recipientEcdhPublicKey, ephemeralEcdhKeyPair.privateKey)\n\n    // encrypt the database encryption key using shared ephemeral ECDH key\n    const dbKeyString = await _getDatabaseEncryptionKey(database)\n    const sharedEncryptedDbKeyString = await crypto.aesGcm.encryptString(sharedKeyEncryptionKey, dbKeyString)\n\n    const action = 'ShareDatabase'\n    const requestParams = {\n      databaseId: database.dbId,\n      databaseNameHash: database.dbNameHash,\n      username,\n      readOnly,\n      resharingAllowed,\n      sharedEncryptedDbKey: sharedEncryptedDbKeyString,\n      ephemeralPublicKey: base64.encode(rawEphemeralEcdhPublicKey),\n      signedEphemeralPublicKey: base64.encode(signedEphemeralEcdhPublicKey),\n      sentSignature: await _signDbKeyAndFingerprint(database.dbKey, recipientFingerprint),\n      recipientEcdsaPublicKey: recipientPublicKey.ecdsaPublicKey\n    }\n    await ws.request(action, requestParams)\n  } catch (e) {\n    _parseGenericErrors(e)\n\n    if (e.response && e.response.data) {\n      switch (e.response.data.message) {\n        case 'SharingWithSelfNotAllowed':\n          throw new errors.SharingWithSelfNotAllowed\n        case 'DatabaseNotFound':\n          throw new errors.DatabaseNotFound\n        case 'ResharingNotAllowed':\n          throw new errors.ResharingNotAllowed('Must have permission to reshare the database with another user')\n        case 'ResharingWithWriteAccessNotAllowed':\n          throw new errors.ResharingWithWriteAccessNotAllowed\n        case 'UserNotFound':\n          throw new errors.UserNotFound\n        case 'DatabaseAlreadyShared':\n          // safe to return\n          return\n      }\n    }\n\n    throw e\n  }\n}\n\nconst _validateUsername = (username) => {\n  if (typeof username !== 'string') throw new errors.UsernameMustBeString\n  if (username.length === 0) throw new errors.UsernameCannotBeBlank\n}\n\nconst _validateDbSharingInput = (params) => {\n  if (objectHasOwnProperty(params, 'shareToken')) throw new errors.ShareTokenNotAllowed\n\n  if (objectHasOwnProperty(params, 'username')) _validateUsername(params.username)\n\n  if (objectHasOwnProperty(params, 'readOnly') && typeof params.readOnly !== 'boolean') {\n    throw new errors.ReadOnlyMustBeBoolean\n  }\n\n  if (objectHasOwnProperty(params, 'resharingAllowed') && typeof params.resharingAllowed !== 'boolean') {\n    throw new errors.ResharingAllowedMustBeBoolean\n  }\n\n  if (objectHasOwnProperty(params, 'requireVerified') && typeof params.requireVerified !== 'boolean') {\n    throw new errors.RequireVerifiedMustBeBoolean\n  }\n}\n\nconst shareDatabase = async (params) => {\n  try {\n    _validateDbInput(params)\n    _validateDbSharingInput(params)\n\n    const readOnly = objectHasOwnProperty(params, 'readOnly') ? params.readOnly : true\n    const resharingAllowed = objectHasOwnProperty(params, 'resharingAllowed') ? params.resharingAllowed : false\n    const requireVerified = objectHasOwnProperty(params, 'requireVerified') ? params.requireVerified : true\n\n    const encryptionMode = params.encryptionMode || ws.encryptionMode\n    _validateEncryptionMode(encryptionMode)\n\n    let result = {}\n    if (objectHasOwnProperty(params, 'username')) await _shareDatabaseWithUsername(params, readOnly, resharingAllowed, requireVerified, encryptionMode)\n    else result.shareToken = await _getShareToken(params, readOnly, encryptionMode)\n\n    return result\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'DatabaseNotFound':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameMustBeString':\n      case 'ReadOnlyMustBeBoolean':\n      case 'ResharingAllowedMustBeBoolean':\n      case 'ResharingNotAllowed':\n      case 'ResharingWithWriteAccessNotAllowed':\n      case 'ResharingAllowedParamNotAllowed':\n      case 'RequireVerifiedMustBeBoolean':\n      case 'RequireVerifiedParamNotNecessary':\n      case 'SharingWithSelfNotAllowed':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserUnableToReceiveDatabase':\n      case 'UserNotFound':\n      case 'UserNotVerified':\n      case 'UserMustBeReverified':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst modifyDatabasePermissions = async (params) => {\n  try {\n    _validateDbInput(params)\n    _validateDbSharingInput(params)\n\n    if (!objectHasOwnProperty(params, 'username')) throw new errors.UsernameMissing\n\n    if (objectHasOwnProperty(params, 'revoke')) {\n      if (typeof params.revoke !== 'boolean') throw new errors.RevokeMustBeBoolean\n\n      // readOnly and resharingAllowed booleans have no use if revoking database from user\n      if (params.revoke) {\n        if (objectHasOwnProperty(params, 'readOnly')) throw new errors.ReadOnlyParamNotAllowed\n        if (objectHasOwnProperty(params, 'resharingAllowed')) throw new errors.ResharingAllowedParamNotAllowed('when revoking access to a database')\n      }\n    } else if (!objectHasOwnProperty(params, 'readOnly') && !objectHasOwnProperty(params, 'resharingAllowed')) {\n      throw new errors.ParamsMissing\n    }\n\n    const { databaseName, databaseId, readOnly, resharingAllowed, revoke, encryptionMode = ws.encryptionMode } = params\n    const username = params.username.toLowerCase()\n\n    try {\n      const database = await _getDatabase(databaseName, databaseId, encryptionMode)\n\n      const action = 'ModifyDatabasePermissions'\n      const requestParams = {\n        databaseId: database.dbId,\n        databaseNameHash: database.dbNameHash,\n        username,\n        readOnly,\n        resharingAllowed,\n        revoke,\n      }\n      await ws.request(action, requestParams)\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response && e.response.data) {\n        switch (e.response.data.message) {\n          case 'SharingWithSelfNotAllowed':\n            throw new errors.ModifyingOwnPermissionsNotAllowed\n          case 'ModifyingOwnerPermissionsNotAllowed':\n            throw new errors.ModifyingOwnerPermissionsNotAllowed\n          case 'ResharingNotAllowed':\n            throw new errors.ModifyingPermissionsNotAllowed\n          case 'ResharingWithWriteAccessNotAllowed':\n            throw new errors.GrantingWriteAccessNotAllowed\n          case 'DatabaseNotFound':\n            throw new errors.DatabaseNotFound\n          case 'UserNotFound':\n            throw new errors.UserNotFound\n        }\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'ParamsMissing':\n      case 'DatabaseNameMissing':\n      case 'DatabaseNameMustBeString':\n      case 'DatabaseNameCannotBeBlank':\n      case 'DatabaseNameTooLong':\n      case 'DatabaseNameRestricted':\n      case 'DatabaseIdMustBeString':\n      case 'DatabaseIdCannotBeBlank':\n      case 'DatabaseIdInvalidLength':\n      case 'DatabaseIdNotAllowed':\n      case 'ShareTokenNotAllowed':\n      case 'DatabaseNotFound':\n      case 'EncryptionModeNotValid':\n      case 'ServerSideEncryptionNotEnabledInClient':\n      case 'UsernameMissing':\n      case 'UsernameCannotBeBlank':\n      case 'UsernameMustBeString':\n      case 'ReadOnlyMustBeBoolean':\n      case 'ReadOnlyParamNotAllowed':\n      case 'ResharingAllowedMustBeBoolean':\n      case 'ResharingAllowedParamNotAllowed':\n      case 'RevokeMustBeBoolean':\n      case 'ModifyingOwnPermissionsNotAllowed':\n      case 'ModifyingOwnerPermissionsNotAllowed':\n      case 'ModifyingPermissionsNotAllowed':\n      case 'GrantingWriteAccessNotAllowed':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'UserNotFound':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst _packVerificationMessage = (username, fingerprint) => {\n  return btoa(JSON.stringify({ username, fingerprint }))\n}\n\nconst _unpackVerificationMessage = (verificationMessage) => {\n  try {\n    const { username, fingerprint } = JSON.parse(atob(verificationMessage))\n\n    _validateUsername(username)\n    if (!fingerprint) throw new errors.VerificationMessageInvalid\n\n    return { username, fingerprint }\n  } catch {\n    throw new errors.VerificationMessageInvalid\n  }\n}\n\nconst _getFingerprint = async (ecdsaRawPublicKey) => {\n  const ecdsaPublicKeyHash = await crypto.sha256.hash(ecdsaRawPublicKey)\n  const fingerprint = base64.encode(ecdsaPublicKeyHash)\n  return fingerprint\n}\n\nconst _getMyFingerprint = async () => {\n  const ecdsaPublicKey = await crypto.ecdsa.getPublicKeyFromPrivateKey(ws.keys.ecdsaPrivateKey)\n  const ecdsaRawPublicKey = await crypto.ecdsa.getRawPublicKeyFromPublicKey(ecdsaPublicKey)\n  const fingerprint = await _getFingerprint(ecdsaRawPublicKey)\n  return fingerprint\n}\n\nconst getVerificationMessage = async () => {\n  try {\n    _checkSignedInState()\n\n    const username = ws.session.username\n    const fingerprint = await _getMyFingerprint()\n\n    const verificationMessage = _packVerificationMessage(username, fingerprint)\n    return { verificationMessage }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst _openVerifiedUsersDatabase = async () => {\n  const databaseName = VERIFIED_USERS_DATABASE_NAME\n  const changeHandler = () => { } // not used\n  const allowVerifiedUsersDatabase = true\n  const encryptionMode = 'end-to-end' // if server has access, opens attack vector because can withold and/or replace verified users\n  await openDatabase({ databaseName, changeHandler, allowVerifiedUsersDatabase, encryptionMode })\n  const dbNameHash = ws.state.dbNameToHash[databaseName]\n  const verifiedUsers = ws.state.databases[dbNameHash].items\n  return verifiedUsers\n}\n\nconst verifyUser = async (params) => {\n  try {\n    if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n    _checkSignedInState()\n\n    if (!objectHasOwnProperty(params, 'verificationMessage')) throw new errors.VerificationMessageMissing\n    const { verificationMessage } = params\n    if (typeof verificationMessage !== 'string') throw new errors.VerificationMessageMustBeString\n    if (verificationMessage.length === 0) throw new errors.VerificationMessageCannotBeBlank\n\n    const { username, fingerprint } = _unpackVerificationMessage(verificationMessage)\n\n    if (username === ws.session.username || fingerprint === await _getMyFingerprint()) throw new errors.VerifyingSelfNotAllowed\n\n    // upsert the verification message into the user's encrypted database that stores verified users\n    await _openVerifiedUsersDatabase()\n\n    const databaseName = VERIFIED_USERS_DATABASE_NAME\n    const allowVerifiedUsersDatabase = true\n    const itemId = username\n    const item = { fingerprint }\n    try {\n      await insertItem({ databaseName, itemId, item, allowVerifiedUsersDatabase })\n    } catch (e) {\n      if (e.name === 'ItemAlreadyExists') await updateItem({ databaseName, itemId, item, allowVerifiedUsersDatabase })\n      else throw e\n    }\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'VerificationMessageMissing':\n      case 'VerificationMessageMustBeString':\n      case 'VerificationMessageCannotBeBlank':\n      case 'VerificationMessageInvalid':\n      case 'VerifyingSelfNotAllowed':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nexport default {\n  openDatabase,\n  getDatabases,\n\n  insertItem,\n  updateItem,\n  deleteItem,\n  putTransaction,\n\n  uploadFile,\n  getFile,\n\n  shareDatabase,\n  modifyDatabasePermissions,\n\n  getVerificationMessage,\n  verifyUser,\n}\n",
+    "import ws from './ws'\nimport errors from './errors'\nimport statusCodes from './statusCodes'\nimport { objectHasOwnProperty, getProtocolFromEndpoint } from './utils'\nimport config from './config'\n\nconst _checkSignedInState = () => {\n  if (ws.reconnecting) throw new errors.Reconnecting\n  if (!ws.keys.init && ws.changePassword) throw new errors.UserMustChangePassword\n  if (!ws.keys.init) throw new errors.UserNotSignedIn\n}\n\nconst _parseGenericErrors = (e) => {\n  if (e.response) {\n    if (e.response.status === statusCodes['Internal Server Error']) {\n      throw new errors.InternalServerError\n    } else if (e.response.status === statusCodes['Gateway Timeout']) {\n      throw new errors.Timeout\n    }\n  } else if (e.message && e.message.indexOf('timeout') !== -1) {\n    throw new errors.Timeout\n  }\n}\n\nconst _validatePurchaseOrUpdate = (params) => {\n  _checkSignedInState()\n\n  const stripeData = ws.userData.stripeData\n  if (!stripeData.stripeAccountId) throw new errors.StripeAccountNotConnected\n  if (stripeData.paymentsMode === 'disabled') throw new errors.PaymentsDisabled\n\n  if (!objectHasOwnProperty(window, 'Stripe')) throw new errors.StripeJsLibraryMissing\n\n  if (typeof params !== 'object') throw new errors.ParamsMustBeObject\n\n  if (!objectHasOwnProperty(params, 'successUrl')) throw new errors.SuccessUrlMissing\n  if (typeof params.successUrl !== 'string') throw new errors.SuccessUrlMustBeString\n  const successUrlProtocol = getProtocolFromEndpoint(params.successUrl)\n  if (successUrlProtocol !== 'http' && successUrlProtocol !== 'https') {\n    const invalidProtocol = true\n    throw new errors.SuccessUrlInvalid(invalidProtocol)\n  }\n\n  if (!objectHasOwnProperty(params, 'cancelUrl')) throw new errors.CancelUrlMissing\n  if (typeof params.cancelUrl !== 'string') throw new errors.CancelUrlMustBeString\n  const cancelUrlProtocol = getProtocolFromEndpoint(params.cancelUrl)\n  if (cancelUrlProtocol !== 'http' && cancelUrlProtocol !== 'https') {\n    const invalidProtocol = true\n    throw new errors.CancelUrlInvalid(invalidProtocol)\n  }\n}\n\nconst purchaseSubscription = async (params) => {\n  try {\n    const stripeData = ws.userData.stripeData\n    if (!stripeData.cancelSubscriptionAt && stripeData.subscriptionStatus && stripeData.subscriptionStatus !== 'canceled') {\n      throw new errors.SubscriptionPlanAlreadyPurchased\n    }\n    _validatePurchaseOrUpdate(params)\n\n    try {\n      const action = 'PurchaseSubscription'\n      const sessionIdResponse = await ws.request(action, params)\n      const stripeSessionId = sessionIdResponse.data\n\n      const stripePk = config.getStripePublishableKey(stripeData.paymentsMode === 'prod')\n\n      const result = await window\n        .Stripe(stripePk, { stripeAccount: stripeData.stripeAccountId })\n        .redirectToCheckout({ sessionId: stripeSessionId })\n\n      if (result.error) throw result.error\n\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response) {\n        switch (e.response.data) {\n          case 'PriceIdOrPlanIdAllowed': throw new errors.PriceIdOrPlanIdAllowed\n          case 'PriceIdOrPlanIdMissing': throw new errors.PriceIdOrPlanIdMissing\n          case 'SubscriptionPlanAlreadyPurchased': throw new errors.SubscriptionPlanAlreadyPurchased\n          case 'SuccessUrlInvalid': throw new errors.SuccessUrlInvalid\n          case 'CancelUrlInvalid': throw new errors.CancelUrlInvalid\n          default: {\n            if (e.response.data && e.response.data.name === 'StripeError') {\n              throw new errors.StripeError(e.response.data)\n            }\n          }\n        }\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'SuccessUrlMissing':\n      case 'SuccessUrlMustBeString':\n      case 'SuccessUrlInvalid':\n      case 'CancelUrlMissing':\n      case 'CancelUrlMustBeString':\n      case 'CancelUrlInvalid':\n      case 'StripeError':\n      case 'StripeJsLibraryMissing':\n      case 'PriceIdOrPlanIdAllowed':\n      case 'PriceIdOrPlanIdMissing':\n      case 'SubscriptionPlanAlreadyPurchased':\n      case 'StripeAccountNotConnected':\n      case 'PaymentsDisabled':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst _validateModifySubscriptionConditions = () => {\n  _checkSignedInState()\n\n  const stripeData = ws.userData.stripeData\n  if (!stripeData.stripeAccountId) throw new errors.StripeAccountNotConnected\n  if (stripeData.paymentsMode === 'disabled') throw new errors.PaymentsDisabled\n\n  if (stripeData.subscriptionStatus === 'canceled') throw new errors.SubscriptionAlreadyCanceled\n}\n\nconst cancelSubscription = async () => {\n  try {\n    _validateModifySubscriptionConditions()\n\n    try {\n      const action = 'CancelSubscription'\n      const cancelResponse = await ws.request(action)\n      const cancelSubscriptionAt = cancelResponse.data\n\n      ws.userData.stripeData.cancelSubscriptionAt = cancelSubscriptionAt\n      return { cancelSubscriptionAt }\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response && e.response.data === 'SubscriptionNotFound') {\n        throw new errors.SubscriptionNotFound\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'SubscriptionNotFound':\n      case 'StripeAccountNotConnected':\n      case 'PaymentsDisabled':\n      case 'SubscriptionAlreadyCanceled':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst resumeSubscription = async () => {\n  try {\n    _validateModifySubscriptionConditions()\n\n    try {\n      const action = 'ResumeSubscription'\n      await ws.request(action)\n\n      delete ws.userData.stripeData.cancelSubscriptionAt\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response && e.response.data === 'SubscriptionNotFound') {\n        throw new errors.SubscriptionNotFound\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'SubscriptionNotFound':\n      case 'StripeAccountNotConnected':\n      case 'PaymentsDisabled':\n      case 'SubscriptionAlreadyCanceled':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nconst updatePaymentMethod = async (params) => {\n  try {\n    _validatePurchaseOrUpdate(params)\n\n    const stripeData = ws.userData.stripeData\n    if (!stripeData.subscriptionStatus) throw new errors.SubscriptionNotPurchased\n\n    try {\n      const action = 'UpdatePaymentMethod'\n      const sessionIdResponse = await ws.request(action, params)\n      const stripeSessionId = sessionIdResponse.data\n\n      const stripePk = config.getStripePublishableKey(stripeData.paymentsMode === 'prod')\n\n      const result = await window\n        .Stripe(stripePk, { stripeAccount: stripeData.stripeAccountId })\n        .redirectToCheckout({ sessionId: stripeSessionId })\n\n      if (result.error) throw result.error\n\n    } catch (e) {\n      _parseGenericErrors(e)\n\n      if (e.response) {\n        if (e.response.data === 'SuccessUrlInvalid') {\n          throw new errors.SuccessUrlInvalid\n        } else if (e.response.data === 'CancelUrlInvalid') {\n          throw new errors.CancelUrlInvalid\n        }\n      }\n\n      throw e\n    }\n\n  } catch (e) {\n\n    switch (e.name) {\n      case 'ParamsMustBeObject':\n      case 'SuccessUrlMissing':\n      case 'SuccessUrlMustBeString':\n      case 'SuccessUrlInvalid':\n      case 'CancelUrlMissing':\n      case 'CancelUrlMustBeString':\n      case 'CancelUrlInvalid':\n      case 'StripeJsLibraryMissing':\n      case 'SubscriptionNotPurchased':\n      case 'StripeAccountNotConnected':\n      case 'PaymentsDisabled':\n      case 'UserMustChangePassword':\n      case 'UserNotSignedIn':\n      case 'TooManyRequests':\n      case 'ServiceUnavailable':\n        throw e\n\n      default:\n        throw new errors.UnknownServiceUnavailable(e)\n    }\n  }\n}\n\nexport default {\n  purchaseSubscription,\n  cancelSubscription,\n  resumeSubscription,\n  updatePaymentMethod,\n}\n",
+    "import auth from './auth'\nimport db from './db'\nimport payments from './payments'\n\nexport default {\n  init: auth.init,\n\n  signUp: auth.signUp,\n  signIn: auth.signIn,\n  signOut: auth.signOut,\n  updateUser: auth.updateUser,\n  deleteUser: auth.deleteUser,\n  forgotPassword: auth.forgotPassword,\n\n  openDatabase: db.openDatabase,\n\n  insertItem: db.insertItem,\n  updateItem: db.updateItem,\n  deleteItem: db.deleteItem,\n  putTransaction: db.putTransaction,\n\n  uploadFile: db.uploadFile,\n  getFile: db.getFile,\n\n  getDatabases: db.getDatabases,\n  shareDatabase: db.shareDatabase,\n  modifyDatabasePermissions: db.modifyDatabasePermissions,\n  getVerificationMessage: db.getVerificationMessage,\n  verifyUser: db.verifyUser,\n\n  purchaseSubscription: payments.purchaseSubscription,\n  cancelSubscription: payments.cancelSubscription,\n  resumeSubscription: payments.resumeSubscription,\n  updatePaymentMethod: payments.updatePaymentMethod,\n}\n"
+  ],
+  "sourceRoot": ""
+}
diff --git a/public/manifest.json b/public/manifest.json
index ad0313a..59b7a83 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -3,12 +3,12 @@
   "short_name": "Budget Zen",
   "icons": [
     {
-      "src": "/images/logo.svg",
+      "src": "/public/images/logo.svg",
       "sizes": "250x150 any",
       "type": "image/svg+xml"
     },
     {
-      "src": "/images/favicon.png",
+      "src": "/public/images/favicon.png",
       "sizes": "310x310",
       "type": "image/png",
       "purpose": "any maskable"
diff --git a/public/sitemap.xml b/public/sitemap.xml
deleted file mode 100644
index 120a8b8..0000000
--- a/public/sitemap.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://app.budgetzen.net</loc><lastmod>2020-11-21T13:32:06.336Z</lastmod><priority>1</priority></url></urlset>
diff --git a/routes.ts b/routes.ts
new file mode 100644
index 0000000..aeaf9ca
--- /dev/null
+++ b/routes.ts
@@ -0,0 +1,172 @@
+import { readableStreamFromReader } from 'https://deno.land/std@0.142.0/streams/mod.ts';
+import { baseUrl, basicLayoutResponse, isRunningLocally, PageContentResult, recordPageView } from './lib/utils.ts';
+
+// NOTE: This won't be necessary once https://github.com/denoland/deploy_feedback/issues/1 is closed
+import * as indexPage from './pages/index.ts';
+import * as pricingPage from './pages/pricing.ts';
+import * as settingsPage from './pages/settings.ts';
+import * as billingPage from './pages/billing.ts';
+const pages = {
+  index: indexPage,
+  pricing: pricingPage,
+  settings: settingsPage,
+  billing: billingPage,
+};
+
+export interface Route {
+  pattern: URLPattern;
+  handler: (
+    request: Request,
+    match: URLPatternResult,
+  ) => (Response | Promise<Response>);
+}
+
+interface Routes {
+  [routeKey: string]: Route;
+}
+
+function createBasicRouteHandler(id: string, pathname: string) {
+  return {
+    pattern: new URLPattern({ pathname }),
+    handler: async (request: Request, match: URLPatternResult) => {
+      try {
+        // NOTE: Use this instead once https://github.com/denoland/deploy_feedback/issues/1 is closed
+        // const { pageContent, pageAction } = await import(`./pages/${id}.ts`);
+
+        // @ts-ignore necessary because of the comment above
+        const { pageContent, pageAction } = pages[id];
+
+        if (!request.url.startsWith('http://localhost')) {
+          recordPageView(match.pathname.input);
+        }
+
+        if (request.method !== 'GET') {
+          return pageAction(request, match) as Response;
+        }
+
+        const pageContentResult = await pageContent(request, match);
+
+        if (pageContentResult instanceof Response) {
+          return pageContentResult;
+        }
+
+        const { htmlContent: htmlContent, titlePrefix } = (pageContentResult as PageContentResult);
+
+        return basicLayoutResponse(htmlContent, { currentPath: match.pathname.input, titlePrefix });
+      } catch (error) {
+        if (error.toString().includes('NotFound')) {
+          return new Response('Not Found', { status: 404 });
+        }
+
+        console.error(error);
+
+        return new Response('Internal Server Error', { status: 500 });
+      }
+    },
+  };
+}
+
+const routes: Routes = {
+  sitemap: {
+    pattern: new URLPattern({ pathname: '/sitemap.xml' }),
+    handler: (_request) => {
+      const pages = [
+        '/',
+        '/pricing',
+      ];
+
+      const oneHourAgo = new Date(new Date().setHours(new Date().getHours() - 1));
+
+      const sitemapContent = `<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
+  ${
+        pages.map((page) => `
+    <url>
+      <loc>${baseUrl}${page}</loc>
+      <lastmod>${oneHourAgo.toISOString()}</lastmod>
+      <priority>${page === '/' ? '1.0' : '0.8'}</priority>
+    </url>
+  `).join('')
+      }
+</urlset>
+`;
+
+      const oneDayInSeconds = 24 * 60 * 60;
+
+      return new Response(sitemapContent, {
+        headers: {
+          'content-type': 'application/xml',
+          'cache-control': `max-age=${oneDayInSeconds}, public`,
+        },
+      });
+    },
+  },
+  robots: {
+    pattern: new URLPattern({ pathname: '/robots.txt' }),
+    handler: async (_request) => {
+      const file = await Deno.open(`public/robots.txt`, { read: true });
+      const readableStream = readableStreamFromReader(file);
+
+      const oneDayInSeconds = 24 * 60 * 60;
+
+      return new Response(readableStream, {
+        headers: {
+          'content-type': 'text/plain',
+          'cache-control': `max-age=${oneDayInSeconds}, public`,
+        },
+      });
+    },
+  },
+  public: {
+    pattern: new URLPattern({ pathname: '/public/:filePath*' }),
+    handler: async (_request, match) => {
+      const { filePath } = match.pathname.groups;
+
+      try {
+        const file = await Deno.open(`public/${filePath}`, { read: true });
+        const readableStream = readableStreamFromReader(file);
+
+        const oneDayInSeconds = isRunningLocally(match) ? 0 : 24 * 60 * 60;
+
+        const headers: ResponseInit['headers'] = {
+          'cache-control': `max-age=${oneDayInSeconds}, public`,
+        };
+
+        // NOTE: It would be nice to figure out a better way to deduce content-type without dependencies
+        const fileExtension = filePath.split('.').pop()?.toLowerCase();
+
+        if (fileExtension === 'js') {
+          headers['content-type'] = 'text/javascript';
+        } else if (fileExtension === 'css') {
+          headers['content-type'] = 'text/css';
+        } else if (fileExtension === 'jpg') {
+          headers['content-type'] = 'image/jpeg';
+        } else if (fileExtension === 'png') {
+          headers['content-type'] = 'image/png';
+        } else if (fileExtension === 'svg') {
+          headers['content-type'] = 'image/svg+xml';
+        } else if (fileExtension === 'json') {
+          headers['content-type'] = 'text/json';
+        }
+
+        return new Response(readableStream, {
+          headers,
+        });
+      } catch (error) {
+        if (error.toString().includes('NotFound')) {
+          return new Response('Not Found', { status: 404 });
+        }
+
+        console.error(error);
+
+        return new Response('Internal Server Error', { status: 500 });
+      }
+    },
+  },
+  index: createBasicRouteHandler('index', '/'),
+  pricing: createBasicRouteHandler('pricing', '/pricing'),
+  settings: createBasicRouteHandler('settings', '/settings'),
+  billing: createBasicRouteHandler('billing', '/billing'),
+};
+
+export default routes;
diff --git a/serverless.yml b/serverless.yml
deleted file mode 100644
index 819a6f8..0000000
--- a/serverless.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-service:
-  name: budgetzen-web-v2
-
-useDotEnv: true
-
-myNextAppplication:
-  component: '@sls-next/serverless-component@3.6.0'
-  inputs:
-    domain: ['app', 'budgetzen.net']
-    bucketName: budgetzen-web-v2
-    bucketRegion: us-east-1
diff --git a/styles/__base.scss b/styles/__base.scss
deleted file mode 100644
index cb49c96..0000000
--- a/styles/__base.scss
+++ /dev/null
@@ -1,158 +0,0 @@
-@import 'styles/__reset';
-@import 'styles/__variables';
-
-html,
-body {
-  font: 16px/16px 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell',
-    'Fira Sans', 'Droid Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  background: $color-background;
-  color: $color-text;
-
-  @media (prefers-color-scheme: dark) {
-    background: #101010;
-    color: #f3f3f3;
-  }
-  &.theme-dark {
-    background: #101010;
-    color: #f3f3f3;
-  }
-}
-
-a {
-  color: $color-link;
-  text-decoration: underline;
-  transition: all 60ms ease-in;
-
-  @media (prefers-color-scheme: dark) {
-    color: $color-link-hover;
-  }
-  @at-root .theme-dark #{&} {
-    color: $color-link-hover;
-  }
-
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    color: $color-link-hover;
-
-    @media (prefers-color-scheme: dark) {
-      color: $color-menu-background-hover;
-    }
-    @at-root .theme-dark #{&} {
-      color: $color-menu-background-hover;
-    }
-  }
-
-  &.style-less {
-    color: unset;
-    text-decoration: unset;
-  }
-}
-
-code,
-pre {
-  font-family: 'Courier New', Courier, monospace;
-}
-
-pre {
-  font-family: 'Courier New', Courier, monospace;
-  background: rgba(0, 0, 0, 0.1);
-  padding: 1em;
-
-  @media (prefers-color-scheme: dark) {
-    background-color: rgba(0, 0, 0, 0.8);
-  }
-  @at-root .theme-dark #{&} {
-    background-color: rgba(0, 0, 0, 0.8);
-  }
-}
-
-.wrapper {
-  margin: 1rem auto;
-  display: block;
-  max-width: $max-width;
-  min-width: 80vw;
-
-  @media #{$bigger-screen} {
-    min-width: $min-width;
-  }
-}
-
-button {
-  -webkit-app-region: no-drag;
-}
-
-.hidden {
-  display: none;
-}
-
-.swal2-toast.swal2-icon-error {
-  cursor: pointer;
-}
-
-// Tweak CSS for modal from https://github.com/chenjiahan/rodal/issues/27#issuecomment-381396700
-.rodal,
-.rodal-mask {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: horizontal;
-  -webkit-box-direction: normal;
-  flex-direction: row;
-  -webkit-box-align: center;
-  align-items: center;
-  -webkit-box-pack: center;
-  justify-content: center;
-  position: fixed !important;
-  padding: 10px;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  overflow-y: auto;
-  overflow-x: hidden;
-  -webkit-box-align: center;
-  align-items: center;
-}
-.rodal-dialog {
-  display: flex;
-  margin: auto;
-  height: auto !important;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  flex-direction: column;
-  background-color: #fff;
-  font-family: inherit;
-  font-size: 1rem;
-  padding: 1.25em;
-  border-radius: 0.3125em;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-box-pack: center;
-  justify-content: center;
-  position: relative !important;
-  width: 32em;
-  max-width: 100%;
-
-  @media (prefers-color-scheme: dark) {
-    background-color: $color-text;
-  }
-  @at-root .theme-dark #{&} {
-    background-color: $color-text;
-  }
-}
-
-// Tweak CSS for switch
-.switch {
-  background-color: #ccc;
-  border: none;
-  border-radius: 20px;
-
-  &.on {
-    background-color: #80a881;
-  }
-}
-.switch-toggle {
-  border-radius: 20px;
-  box-shadow: none;
-}
diff --git a/styles/__reset.scss b/styles/__reset.scss
deleted file mode 100644
index d971da6..0000000
--- a/styles/__reset.scss
+++ /dev/null
@@ -1,129 +0,0 @@
-/* http://meyerweb.com/eric/tools/css/reset/
-   v2.0 | 20110126
-   License: none (public domain)
-*/
-
-html,
-body,
-div,
-span,
-applet,
-object,
-iframe,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-big,
-cite,
-code,
-del,
-dfn,
-em,
-img,
-ins,
-kbd,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-b,
-u,
-i,
-center,
-dl,
-dt,
-dd,
-ol,
-ul,
-li,
-fieldset,
-form,
-label,
-legend,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td,
-article,
-aside,
-canvas,
-details,
-embed,
-figure,
-figcaption,
-footer,
-header,
-hgroup,
-menu,
-nav,
-output,
-ruby,
-section,
-summary,
-time,
-mark,
-audio,
-video {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  font-size: 100%;
-  font: inherit;
-  vertical-align: baseline;
-}
-/* HTML5 display-role reset for older browsers */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-menu,
-nav,
-section {
-  display: block;
-}
-body {
-  line-height: 1;
-}
-ol,
-ul {
-  list-style: none;
-}
-blockquote,
-q {
-  quotes: none;
-}
-blockquote:before,
-blockquote:after,
-q:before,
-q:after {
-  content: '';
-  content: none;
-}
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
diff --git a/styles/__variables.scss b/styles/__variables.scss
deleted file mode 100644
index 2a7fe33..0000000
--- a/styles/__variables.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-$color-background: #efefef;
-$color-text: #222;
-$color-text-button: #222;
-$color-text-gray: #333;
-$color-white: #fff;
-$color-light-gray: #999;
-
-$color-link: #222;
-$color-link-hover: #555;
-
-$color-menu-text: #fff;
-$color-menu-background: #444;
-$color-menu-text-hover: #333;
-$color-menu-background-hover: #555;
-
-$color-background-red: #a02200;
-$color-background-green: #00a022;
-$color-background-blue: #2f74a0;
-
-$color-block-background: #fff;
-$color-block-border: #444;
-$color-block-border-hover: #555;
-
-$color-input-text: #333;
-$color-input-background: #fff;
-
-$break-xsmall: 400px;
-$break-small: 600px;
-$max-width: 1024px;
-$min-width: 950px;
-
-$medium-screen: 'only screen and (min-width : #{$break-xsmall})';
-$bigger-screen: 'only screen and (min-width : #{$break-small})';
-
-@mixin flex {
-  display: flex;
-  flex: 1;
-  flex-wrap: nowrap;
-  justify-content: center;
-  align-items: center;
-}
-
-@mixin flex-spaced {
-  @include flex;
-  justify-content: space-between;
-}
-
-@mixin flex-end {
-  @include flex;
-  align-items: flex-end;
-}
diff --git a/styles/_common.scss b/styles/_common.scss
deleted file mode 100644
index 3a798b0..0000000
--- a/styles/_common.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-@import 'styles/__variables';
-
-.common {
-  padding: 20px 10px;
-
-  &__line {
-    margin: 0 auto 1rem;
-    font-size: 1.2rem;
-    line-height: 1.7rem;
-    font-weight: 400;
-    text-align: left;
-
-    strong {
-      font-weight: bold;
-    }
-  }
-
-  &__button {
-    margin: 1em auto;
-    padding: 0.8em 1.3em;
-    display: block;
-    font-size: 1.3rem;
-    line-height: 1.5rem;
-    font-weight: 400;
-    text-align: center;
-    color: $color-menu-text;
-    background: $color-menu-background;
-    border-radius: 3px;
-    border: none;
-    cursor: pointer;
-    max-width: 300px;
-    text-decoration: none;
-    transition: all 60ms ease-in;
-
-    &:hover,
-    &:focus {
-      color: $color-menu-text;
-      background-color: $color-menu-background-hover;
-    }
-
-    @media #{$bigger-screen} {
-      max-width: 220px;
-    }
-  }
-}
-
-// Fix for SCSS modules not working for at-root components
-.theme-dark footer {
-  background-color: #161616;
-}
-
-.theme-dark label {
-  color: $color-link-hover;
-}
diff --git a/styles/main.scss b/styles/main.scss
deleted file mode 100644
index 9aed6bb..0000000
--- a/styles/main.scss
+++ /dev/null
@@ -1 +0,0 @@
-@import 'styles/__base.scss';
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index ebc47e3..0000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "compileOnSave": false,
-  "compilerOptions": {
-    "target": "esnext",
-    "module": "esnext",
-    "jsx": "preserve",
-    "allowJs": true,
-    "moduleResolution": "node",
-    "allowSyntheticDefaultImports": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "removeComments": false,
-    "preserveConstEnums": true,
-    "sourceMap": true,
-    "skipLibCheck": true,
-    "baseUrl": ".",
-    "typeRoots": ["./node_modules/@types"],
-    "lib": ["dom", "es2015", "es2016"],
-    "strict": false,
-    "forceConsistentCasingInFileNames": true,
-    "noEmit": true,
-    "esModuleInterop": true,
-    "resolveJsonModule": true,
-    "isolatedModules": true,
-    "incremental": true
-  },
-  "exclude": [
-    "node_modules",
-    "**/*.spec.ts",
-    "**/*.spec.tsx",
-    "**/*.test.ts",
-    "**/*.test.tsx"
-  ],
-  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
-}