diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 1ff94f7..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["next/babel"] -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9e9abb6 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,113 @@ +{ + "env": { + "node": true, + "mocha": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint", + "only-warn", + "import" + ], + "ignorePatterns": [ + "*.js", + "*.d.ts" + ], + "rules": { + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/member-delimiter-style": [ + "warn", + { + "multiline": { + "delimiter": "comma", + "requireLast": false + }, + "singleline": { + "delimiter": "comma", + "requireLast": false + }, + "multilineDetection": "brackets", + "overrides": { + "interface": { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + } + } + ], + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ], + "@typescript-eslint/semi": "warn", + "import/first": "warn", + "import/no-duplicates": "warn", + "import/no-unresolved": "warn", + "import/no-self-import": "warn", + "import/extensions": [ "warn", "always" ], + "import/order": [ "warn", { "newlines-between": "ignore", "alphabetize": { "order": "asc", "caseInsensitive": true } } ], + "semi": "off", // Using @typescript-eslint/semi instead + "no-else-return": "warn", + "no-trailing-spaces": "warn", + "eqeqeq": "warn", + "template-curly-spacing": "warn", + "no-template-curly-in-string": "warn", + "object-curly-spacing": [ + "warn", + "always" + ], + "array-bracket-spacing": [ + "warn", + "always" + ], + "linebreak-style": [ + "warn", + "unix" + ], + "quotes": [ + "warn", + "single" + ], + "eol-last": [ + "warn", + "always" + ], + "indent": [ + "warn", + 4, + { + "SwitchCase": 1 + } + ], + "no-empty": [ + "warn", + { + "allowEmptyCatch": true + } + ], + "no-multiple-empty-lines": [ + "warn", + { + "max": 999, + "maxEOF": 0 + } + ] + } +} diff --git a/.gitignore b/.gitignore index e8902a4..c30697c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,18 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# editor +.idea +.vscode +.history -# dependencies -/node_modules -/.pnp -.pnp.js +# npm +node_modules +lib -# testing -/coverage +# storage +files +config.json +*.key -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel - -src/tailwind.output.css +# build files +*.js +*.js.map +public/script diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e0..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/UPI Website.iml b/.idea/UPI Website.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/UPI Website.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 40674af..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 6706b1c..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/nwex.de.iml b/.idea/nwex.de.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/nwex.de.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.ref/tokenizer.ts b/.ref/tokenizer.ts deleted file mode 100644 index 9138deb..0000000 --- a/.ref/tokenizer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Parser } from './tokenizer/parser.class.js'; -import { Token } from './tokenizer/token.interfance.js'; - -Array.from(document.getElementsByClassName('tokenized')).map(tokenized => tokenized as HTMLDivElement).forEach(tokenized => { - const run = () => { - const source: string = tokenized.innerText; - - console.time('tokenized'); - const tokens: Array = new Parser(source).tokenize(); - console.timeEnd('tokenized'); - - tokenized.innerHTML = ''; - - const lines: Array = source.split('\n'); - - for (let line = 0; line < lines.length; line++) { - const lineValue: string = lines[line]; - - for (let column = 0; column < lineValue.length; column++) { - let found: boolean = false; - - for (const token of tokens) { - if (token.position.starts(line, column)) { - found = true; - - const element: HTMLSpanElement = document.createElement('span'); - - element.style.color = token.type; - element.innerText = lineValue.substring(token.position.column, token.position.length + token.position.column); - - tokenized.appendChild(element); - - break; - } - - if (token.position.intersects(line, column)) { - found = true; - break; - } - } - - if (found) continue; - if (column >= lineValue.length) break; - - tokenized.innerHTML += lineValue[column]; - } - - const element: HTMLSpanElement = document.createElement('span'); - element.innerText = '\n'; - tokenized.appendChild(element); - } - - tokenized.lastChild.remove(); - }; - - tokenized.addEventListener('focusout', run); - - run(); -}); \ No newline at end of file diff --git a/.ref/tokenizer/parser.class.ts b/.ref/tokenizer/parser.class.ts deleted file mode 100644 index bc92cd2..0000000 --- a/.ref/tokenizer/parser.class.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { Position } from './position.class.js'; -import { IdentifierState } from './state/identifierState.class.js'; -import { NumberState } from './state/numberState.class.js'; -import { StringState } from './state/stringState.class.js'; -import { Token } from './token.interfance.js'; -import { Type } from './type.enum.js'; - -export class Parser { - private string: StringState; - private identifier: IdentifierState; - private number: NumberState; - private position: Position; - - public constructor(private source: string) { - this.string = StringState.none.duplicate(); - this.identifier = IdentifierState.none.duplicate(); - this.number = NumberState.none.duplicate(); - this.position = Position.none.duplicate(); - } - - public tokenize(): Array { - const tokens: Array = new Array(); - - const commitIdentifier = () => { - if (!this.identifier.active) return; - - tokens.push({ - type: Type.Identifier, - value: this.identifier.value, - position: this.identifier.start.withLength(this.identifier.value.length) - }); - - this.identifier = IdentifierState.none; - }; - - const commitString = () => { - if (!this.string.active) return; - - tokens.push({ - type: Type.Literal, - value: this.string.value, - position: this.string.start.withLength(this.string.value.length + 2) - }); - - this.position.addColumn(this.string.value.length + 2); - - this.string = StringState.none; - }; - - const commitNumber = () => { - if (!this.number.active) return; - - tokens.push({ - type: Type.Literal, - value: this.number.value, - position: this.number.start.withLength(this.number.value.length) - }); - - this.number = NumberState.none; - }; - - while (this.source.length > 0) { - if (this.string.active) { - if (this.matches(this.string.quote)) { - this.consume(); - - commitString(); - } else { - this.string.value += this.consume(); - } - } else if (this.matches('"', '\'', '`')) { - commitIdentifier(); - commitNumber(); - - this.string = StringState.start(this.consume(), this.position); - } else if (this.number.active) { - if (this.matches('.')) { - if (this.number.decimal) { - commitNumber(); - } else { - this.number.decimal = true; - this.number.value += this.consume(); - this.position.addColumn(1); - } - } else if (this.matches('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) { - this.number.value += this.consume(); - this.position.addColumn(1); - } else commitNumber(); - } else if (this.matches('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) { - commitIdentifier(); - - this.number = NumberState.start(this.position); - this.number.value += this.consume(); - this.position.addColumn(1); - } else if (this.peek(2).match(/-\d/)) { - commitIdentifier(); - - this.number = NumberState.start(this.position); - this.number.value += this.consume(2); - this.position.addColumn(2); - } else if (this.matches('.', ',', ':', ';', '+', '-', '*', '/', '=', '<', '>', '|')) { - commitIdentifier(); - commitNumber(); - - tokens.push({ - type: Type.Punctuation, - value: this.consume(), - position: this.position.withLength(1) - }); - - this.position.addColumn(1); - } else if (this.matches('(', ')', '[', ']', '{', '}')) { - commitIdentifier(); - commitNumber(); - - tokens.push({ - type: Type.Nesting, - value: this.consume(), - position: this.position.withLength(1) - }); - - this.position.addColumn(1); - } else if (this.matches(' ')) { - commitIdentifier(); - commitNumber(); - - this.consume(); - this.position.addColumn(1); - } else if (this.matches('\n')) { - commitIdentifier(); - commitNumber(); - - this.consume(); - this.position.addLine(1).setColumn(0); - } else { - if (!this.identifier.active) { - this.identifier = IdentifierState.start(this.position); - } - - this.identifier.value += this.consume(); - this.position.addColumn(1); - } - } - - commitIdentifier(); - commitString(); - commitNumber(); - - return this.mark(tokens); - } - - private consume(length: number = 1): string { - const consumed: string = this.peek(length); - - this.source = this.source.substring(length); - - return consumed; - } - - private peek(length: number = 1): string { - return this.source.substring(0, length); - } - - private matches(...values: Array): boolean { - for (const value of values) { - if (this.source.startsWith(value)) return true; - } - - return false; - } - - private mark(tokens: Array): Array { - const marked: Array = new Array(); - - const keywords: Array = [ - 'let', - 'const', - 'var', - - 'class', - 'interface', - 'enum', - - 'if', - 'else', - - 'return', - 'break', - 'continue', - - 'try', - 'catch', - 'finally', - - 'for', - 'while', - 'do', - - 'of', - 'in', - 'as', - 'new', - - 'private', - 'public', - 'readonly', - 'static' - ]; - - tokens.forEach(token => { - if (token.type === Type.Identifier && keywords.includes(token.value)) { - token.type = Type.Keyword; - } - - if (token.type === Type.Identifier && token.value === 'true' || token.value === 'false') { - token.type = Type.Literal; - } - - if (token.type === Type.Identifier && token.value === 'null' || token.value === 'undefined') { - token.type = Type.Literal; - } - - marked.push(token); - }); - - console.log('Marked Tokens:', marked); - - return marked; - } -} \ No newline at end of file diff --git a/.ref/tokenizer/position.class.ts b/.ref/tokenizer/position.class.ts deleted file mode 100644 index c73b77c..0000000 --- a/.ref/tokenizer/position.class.ts +++ /dev/null @@ -1,44 +0,0 @@ -export class Position { - public constructor(public line: number, public column: number, public length: number) { - } - - public starts(line: number, column: number): boolean { - return line === this.line && column === this.column; - } - - public intersects(line: number, column: number): boolean { - return line === this.line && column > this.column && column < this.column + this.length; - } - - public duplicate(): Position { - return new Position(this.line, this.column, this.length); - } - - public withLength(length: number): Position { - const duplicate: Position = this.duplicate(); - - duplicate.length = length; - - return duplicate; - } - - public setColumn(column: number): Position { - this.column = column; - - return this; - } - - public addColumn(column: number): Position { - this.column += column; - - return this; - } - - public addLine(line: number): Position { - this.line += line; - - return this; - } - - public static none: Position = new Position(0, 0, 0); -} \ No newline at end of file diff --git a/.ref/tokenizer/state/identifierState.class.ts b/.ref/tokenizer/state/identifierState.class.ts deleted file mode 100644 index 2580a1e..0000000 --- a/.ref/tokenizer/state/identifierState.class.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Position } from '../position.class.js'; - -export class IdentifierState { - private constructor(public value: string, public active: boolean, public start: Position) { - } - - public duplicate(): IdentifierState { - return new IdentifierState(this.value, this.active, this.start.duplicate()); - } - - public static start(position: Position): IdentifierState { - return new IdentifierState('', true, position.duplicate()); - } - - public static none: IdentifierState = new IdentifierState(null, false, Position.none.duplicate()); -} \ No newline at end of file diff --git a/.ref/tokenizer/state/numberState.class.ts b/.ref/tokenizer/state/numberState.class.ts deleted file mode 100644 index f9f8734..0000000 --- a/.ref/tokenizer/state/numberState.class.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Position } from '../position.class.js'; - -export class NumberState { - private constructor(public value: string, public decimal: boolean, public active: boolean, public start: Position) { - } - - public duplicate(): NumberState { - return new NumberState(this.value, this.decimal, this.active, this.start.duplicate()); - } - - public static start(position: Position): NumberState { - return new NumberState('', false, true, position.duplicate()); - } - - public static none: NumberState = new NumberState(null, false, false, Position.none.duplicate()); -} \ No newline at end of file diff --git a/.ref/tokenizer/state/stringState.class.ts b/.ref/tokenizer/state/stringState.class.ts deleted file mode 100644 index 31e6e46..0000000 --- a/.ref/tokenizer/state/stringState.class.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Position } from '../position.class.js'; - -export class StringState { - private constructor(public value: string, public quote: string, public active: boolean, public start: Position) { - } - - public duplicate(): StringState { - return new StringState(this.value, this.quote, this.active, this.start.duplicate()); - } - - public static start(quote: string, position: Position): StringState { - return new StringState('', quote, true, position.duplicate()); - } - - public static none: StringState = new StringState(null, null, false, Position.none.duplicate()); -} \ No newline at end of file diff --git a/.ref/tokenizer/token.interfance.ts b/.ref/tokenizer/token.interfance.ts deleted file mode 100644 index b7cb1e7..0000000 --- a/.ref/tokenizer/token.interfance.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Position } from './position.class.js'; - -export interface Token { - type: string; - value: string; - position: Position; -} \ No newline at end of file diff --git a/.ref/tokenizer/type.enum.ts b/.ref/tokenizer/type.enum.ts deleted file mode 100644 index 4b1c0f7..0000000 --- a/.ref/tokenizer/type.enum.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum Type { - Identifier = '#606872', - Keyword = '#494f56', - Punctuation = '#72777c', - Nesting = '#78818d', - Literal = '#8f969e' -} \ No newline at end of file diff --git a/.storybook/.babelrc b/.storybook/.babelrc deleted file mode 100644 index 9fcef03..0000000 --- a/.storybook/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["next/babel"], - "plugins": [] -} diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 19a524e..0000000 --- a/.storybook/main.js +++ /dev/null @@ -1,82 +0,0 @@ -const path = require("path") - -const toPath = (_path) => path.join(process.cwd(), _path) - -module.exports = { - stories: ["../src/**/*.stories.@(js|jsx|ts|tsx)"], - addons: ["@storybook/addon-links", "@storybook/addon-essentials"], - - webpackFinal: async (config, { configType }) => { - // `configType` has a value of 'DEVELOPMENT' or 'PRODUCTION' - // You can change the configuration based on that. - // 'PRODUCTION' is used when building the static version of storybook. - - // Added to support PostCSS v8.X - /** - * CSS handling, specifically overriding postcss loader - */ - // Find the only Storybook webpack rule that tests for css - const cssRule = config.module.rules.find((rule) => - "test.css".match(rule.test) - ) - // Which loader in this rule mentions the custom Storybook postcss-loader? - const loaderIndex = cssRule.use.findIndex((loader) => { - // Loaders can be strings or objects - const loaderString = typeof loader === "string" ? loader : loader.loader - // Find the first mention of "postcss-loader", it may be in a string like: - // "@storybook/core/node_modules/postcss-loader" - return loaderString.includes("postcss-loader") - }) - // Simple loader string form, removes the obsolete "options" key - cssRule.use[loaderIndex] = "postcss-loader" - - // ignore *.po files - config.module.rules.push({ - test: /\.(po)$/, - use: [ - { - loader: require.resolve("ignore-loader") - } - ] - }) - - // SVG - // Needed for SVG importing using svgr - const indexOfRuleToRemove = config.module.rules.findIndex((rule) => - rule.test?.toString().includes("svg") - ) - - config.module.rules.splice(indexOfRuleToRemove, 1, { - test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/, - loader: require.resolve("file-loader"), - options: { - name: "static/media/[name].[hash:8].[ext]", - esModule: false - } - }) - config.module.rules.push({ - test: /\.svg$/, - use: [ - { - loader: "@svgr/webpack", - options: { - svgo: false - } - } - ] - }) - - return { - ...config, - resolve: { - ...config.resolve, - alias: { - ...config.resolve.alias - // "@emotion/core": toPath("node_modules/@emotion/react"), - // "@emotion/styled": toPath("node_modules/@emotion/styled"), - // "emotion-theming": toPath("node_modules/@emotion/react") - } - } - } - } -} diff --git a/.storybook/preview.js b/.storybook/preview.js deleted file mode 100644 index f07b520..0000000 --- a/.storybook/preview.js +++ /dev/null @@ -1,213 +0,0 @@ -// .storybook/preview.js -import { themes } from "@storybook/theming" - -import "../src/styles/tailwind.css" - -import * as nextImage from "next/image" - -// or global addParameters -export const parameters = { - docs: { - theme: themes.normal - }, - actions: { argTypesRegex: "^on[A-Z].*" }, - viewport: { - viewports: { - mobile1: { - name: "Small mobile", - styles: { - height: "568px", - width: "320px" - }, - type: "mobile" - }, - mobile2: { - name: "Large mobile", - styles: { - height: "896px", - width: "414px" - }, - type: "mobile" - }, - tablet: { - name: "Tablet", - styles: { - height: "1112px", - width: "834px" - }, - type: "tablet" - }, - iphone5: { - name: "iPhone 5", - styles: { - height: "568px", - width: "320px" - }, - type: "mobile" - }, - iphone6: { - name: "iPhone 6", - styles: { - height: "667px", - width: "375px" - }, - type: "mobile" - }, - iphone6p: { - name: "iPhone 6 Plus", - styles: { - height: "736px", - width: "414px" - }, - type: "mobile" - }, - iphone8p: { - name: "iPhone 8 Plus", - styles: { - height: "736px", - width: "414px" - }, - type: "mobile" - }, - iphonex: { - name: "iPhone X", - styles: { - height: "812px", - width: "375px" - }, - type: "mobile" - }, - iphonexr: { - name: "iPhone XR", - styles: { - height: "896px", - width: "414px" - }, - type: "mobile" - }, - iphonexsmax: { - name: "iPhone XS Max", - styles: { - height: "896px", - width: "414px" - }, - type: "mobile" - }, - ipad: { - name: "iPad", - styles: { - height: "1024px", - width: "768px" - }, - type: "tablet" - }, - ipad10p: { - name: "iPad Pro 10.5-in", - styles: { - height: "1112px", - width: "834px" - }, - type: "tablet" - }, - ipad12p: { - name: "iPad Pro 12.9-in", - styles: { - height: "1366px", - width: "1024px" - }, - type: "tablet" - }, - galaxys5: { - name: "Galaxy S5", - styles: { - height: "640px", - width: "360px" - }, - type: "mobile" - }, - galaxys9: { - name: "Galaxy S9", - styles: { - height: "740px", - width: "360px" - }, - type: "mobile" - }, - nexus5x: { - name: "Nexus 5X", - styles: { - height: "660px", - width: "412px" - }, - type: "mobile" - }, - nexus6p: { - name: "Nexus 6P", - styles: { - height: "732px", - width: "412px" - }, - type: "mobile" - }, - pixel: { - name: "Pixel", - styles: { - height: "960px", - width: "540px" - }, - type: "mobile" - }, - pixelxl: { - name: "Pixel XL", - styles: { - height: "1280px", - width: "720px" - }, - type: "mobile" - } - } - } -} - -// Replace next/image for Storybook -Object.defineProperty(nextImage, "default", { - configurable: true, - value: (props) => { - const { width, height, layout } = props - - if (layout === "fill") { - return ( - - ) - } - - const ratio = (height / width) * 100 - - return ( -
- -
- ) - } -}) diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 77c4e66..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "bradlc.vscode-tailwindcss" - ] -} \ No newline at end of file diff --git a/@types/index.d.ts b/@types/index.d.ts deleted file mode 100644 index 471e361..0000000 --- a/@types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module "*.svg" { - const content: any - export default content -} \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 2578f4b..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at contact@elitizon.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 0ecfb4b..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,92 +0,0 @@ -# Contributing - -When contributing to this repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. - -Please note we have a code of conduct, please follow it in all your interactions with the project. - -## Pull Request Process - -1. Ensure any install or build dependencies are removed before the end of the layer when doing a - build. -2. Update the README.md with details of changes to the interface, this includes new environment - variables, exposed ports, useful file locations and container parameters. -3. Increase the version numbers in any examples files and the README.md to the new version that this - Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). -4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you - do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [contact@elitizon.com]. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e7e7ce8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM node:alpine as build + +WORKDIR /usr/src/app + +RUN sed -i 's/dl-cdn/dl-5/g' /etc/apk/repositories && sed -i 's/http:/https:/g' /etc/apk/repositories + +COPY .npmrc /usr/src/app/ +COPY package.json /usr/src/app/ +COPY package-lock.json /usr/src/app/ + +RUN npm install --production + +COPY . /usr/src/app +RUN npx tsc -p tsconfig.json + +FROM httpd:alpine + +COPY --from=build /usr/src/app/public/ /usr/local/apache2/htdocs/ diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 113987b..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Elitizon Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 0e6562a..0000000 --- a/README.md +++ /dev/null @@ -1,189 +0,0 @@ -# A [NextJS](https://nextjs.org/) template with typescript, tailwindcss and storybook support - -> The configuration of NextJS, TailwindCSS and Storybook can be **complex** 😰 🤪 -> 👉 So we have decided to make this template public 🎉 - -This project was bootstrapped with [npx create-next-app](https://nextjs.org/learn/basics/create-nextjs-app/setup) and we have added support for: - -- ✅ [Typescript](https://www.typescriptlang.org/) -- ✅ [Taillwindcss](https://www.tailwindcss.com) -- ✅ [Storybook](https://storybook.js.org/) -- ✅ [Jest](https://jestjs.io/) -- ✅ [Import SVG as React Component (SVGR)](https://react-svgr.com/) (Thanks to [@neoziro](https://twitter.com/neoziro)) - -You are welcome to contribute to this project to make it better. Contact us at [contact@elitizon.com](contact@elitizon.com) - -Created with ❤️ by [Elitizon](https://www.elitizon.com) - -This template is available at [https://github.com/elitizon/nextjs-tailwind-storybook](https://github.com/elitizon/nextjs-tailwind-storybook) - -## To use this template: - -- clone it -- remove the .git folder -- git init . -- git add . -- git commit -m "First commit" - -## Structure of the template - -```bash -. -├── CODE_OF_CONDUCT.md -├── CONTRIBUTING.md -├── LICENSE -├── README.md -├── SECURITY.md -├── build.toml -├── next-env.d.ts -├── nextjs.config.js -├── out -│   ├── 404.html -│   ├── _next -│   ├── favicon.ico -│   ├── index.html -│   └── vercel.svg -├── package.json -├── postcss.config.js -├── public -│   ├── favicon.ico -│   └── vercel.svg -├── src -│   ├── assets -│   ├── components -│   ├── pages -│   └── styles -├── tailwind.config.js -├── tsconfig.json -└── yarn.lock - -``` - -Pages and components are developed in `src` directory. - -## Install all the dependencies - -### 👉 `yarn install` - -## Available Scripts - -In the project directory, you can run: - -### 👉 `yarn dev` - -**Results:** - -```bash -ready - started server on http://localhost:3000 - ✅ purgeEnabled=false - -event - compiled successfully -event - build page: /next/dist/pages/_error -wait - compiling... -event - compiled successfully -event - build page: / -wait - compiling...``` - -Run the project in the dev mode. -```` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### 👉 `yarn storybook` - -Runs storybook. - -Open [http://localhost:6006](http://localhost:6006) to view it in the browser. - -### 👉 `yarn test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -> If you get an error that contained this line: - -Use this command: - -`brew install watchman` - -### 👉`yarn build` - -Builds the app for production to the `.next` folder.\ -It correctly bundles NextJS in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -👉 **Result of execution** - -```bash -yarn run v1.22.10 -$ cross-env NODE_ENV=production next build -info - Creating an optimized production build... - - - TailwindCSS - - ----------- - - ✅ purgeEnabled=true - -info - Compiled successfully -info - Collecting page data... -info - Generating static pages (0/2) -info - Generating static pages (2/2) -info - Finalizing page optimization... - -Page Size First Load JS -┌ ○ / 1.55 kB 64.3 kB -├ /_app 0 B 62.7 kB -├ ○ /404 3.46 kB 66.2 kB -└ λ /api/hello 0 B 62.7 kB -+ First Load JS shared by all 62.7 kB - ├ chunks/f6078781a05fe1bcb0902d23dbbb2662c8d200b3.d4f570.js 13.1 kB - ├ chunks/framework.abffcf.js 41.8 kB - ├ chunks/main.1fee81.js 6.62 kB - ├ chunks/pages/_app.1315ea.js 523 B - ├ chunks/webpack.50bee0.js 751 B - └ css/ff7ad52a1259dc7bd680.css 1.88 kB - -λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps) -○ (Static) automatically rendered as static HTML (uses no initial props) -● (SSG) automatically generated as static HTML + JSON (uses getStaticProps) - (ISR) incremental static regeneration (uses revalidate in getStaticProps) - -Done in 9.00s. - -``` - -See the section about [deployment](https://nextjs.org/docs/deployment) for more information. - -### 👉`yarn start` - -Starts a server with the output for the `yarn build` command. - -`yarn build` must be executed before to use this command. - -### 👉`yarn export` - -Export the output of the `yarn build` command execution to the `./out` directory. - -`yarn build` must be executed before to use this command. - -### 👉`npx serve ./out` - -To launch a **static server** from the `./out` directory. This command can be useful to control the outcome of `yarn export`. - -`yarn build` and `yarn export` must be executed before to use this command. - -## Learn More - -You can learn more in the [NextJS documentation](https://nextjs.org/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -To learn how to develop UIs with component and design systems with Storybook, check out the [Learn Storybook documentation](https://www.learnstorybook.com/) diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 8e56d6d..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,10 +0,0 @@ -# Security Policy - -## Supported Versions - - - -| Version | Supported | -| ------- | ------------------ | -| 1.0.x | :white_check_mark: | - diff --git a/build.toml b/build.toml deleted file mode 100644 index f3c4be4..0000000 --- a/build.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build] - command = "yarn build && yarn export" - publish = "out" \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts deleted file mode 100644 index 7b7aa2c..0000000 --- a/next-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/next.config.js b/next.config.js deleted file mode 100644 index b1239d4..0000000 --- a/next.config.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = { - /* config options here */ - webpack(config, { isServer, dev: isDevelopmentMode }) { - config.module.rules.push({ - test: /\.svg$/, - issuer: { - test: /\.(js|ts)x?$/ - }, - use: [ - { - loader: "@svgr/webpack" - // https://react-svgr.com/docs/options/ - } - ] - }) - - config.module.rules.push({ - test: /\.po$/, - use: [ - { - loader: "ignore-loader" - } - ] - }) - - // Fixes npm packages that depend on `fs` module - if (!isServer) { - config.node = { - fs: "empty" - } - } - - // Attempt to ignore storybook files when doing a production build, - // see also: https://github.com/vercel/next.js/issues/1914 - if (!isDevelopmentMode) { - config.module.rules.push({ - test: /\.stories.(js|tsx?)/, - loader: "ignore-loader" - }) - } - - return config - }, - poweredByHeader: false, - images: { - domains: ["unsplash.com"] - } -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b742dde --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5184 @@ +{ + "name": "nwex.de", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "nwex.de", + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "typescript": "^4.4.4" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.9.0", + "concurrently": "^6.3.0", + "eslint": "^8.6.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-only-warn": "^1.0.3", + "reload": "^3.2.0" + } + }, + "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/@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/@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true + }, + "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/@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "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/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "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/experimental-utils/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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "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": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.9.0", + "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/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/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-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/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/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/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=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==", + "dev": true, + "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/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/chalk/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/cli-color": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz", + "integrity": "sha512-eBbxZF6fqPUNnf7CLAFOersUnyYzv83tHFLSlts+OAHsNendaqv2tHCq+/MO+b3Y+9JeoUlIvobyxG/Z8GNeOg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "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/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/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/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "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=", + "dev": true + }, + "node_modules/concurrently": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.3.0.tgz", + "integrity": "sha512-k4k1jQGHHKsfbqzkUszVf29qECBrkvBKkcPJEUDTyVR7tZd1G/JOfnst4g1sYbFvJ4UjHZisj1aWQR8yLKpGPw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "bin": { + "concurrently": "bin/concurrently.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/date-fns": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.25.0.tgz", + "integrity": "sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w==", + "dev": true, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "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-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "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/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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": { + "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-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.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.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-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "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.2", + "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.12.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-only-warn": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.0.3.tgz", + "integrity": "sha512-XQOX/TfLoLw6h8ky51d29uUjXRTQHqBGXPylDEmy5fe/w7LIOnp8MA24b1OSMEn9BQoKow1q3g1kLe5/9uBTvw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-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/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/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "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=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/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/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/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/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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/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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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/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/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "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/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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/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/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/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=", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "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==", + "dev": true, + "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-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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/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==", + "dev": true + }, + "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": "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/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/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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "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/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/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/memoizee/node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "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==", + "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==", + "dev": true + }, + "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/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.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/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "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/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/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/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/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/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/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/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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==", + "dev": true, + "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/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/reload": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/reload/-/reload-3.2.0.tgz", + "integrity": "sha512-30iJoDvFHGbfq6tT3Vag/4RV3wkpuCOqPSM3GyeuOSSo48wKfZT/iI19oeO0GCVX0XSr+44XJ6yBiRJWqOq+sw==", + "dev": true, + "dependencies": { + "cli-color": "~2.0.0", + "commander": "~7.2.0", + "finalhandler": "~1.1.1", + "minimist": "~1.2.0", + "open": "^8.0.0", + "serve-static": "~1.14.0", + "supervisor": "~0.12.0", + "url-parse": "~1.5.0", + "ws": "~7.4.0" + }, + "bin": { + "reload": "bin/reload" + } + }, + "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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "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/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==", + "dev": true, + "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/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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/send/node_modules/debug/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/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "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/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/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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.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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/supervisor": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz", + "integrity": "sha1-3n5jNwFbKRhRwQ81OMSn8EkX7ME=", + "dev": true, + "bin": { + "node-supervisor": "lib/cli-wrapper.js", + "supervisor": "lib/cli-wrapper.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "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/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/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/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "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-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/typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "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==", + "dev": true, + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "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/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==", + "dev": true, + "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/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/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "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/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" + } + } + }, + "dependencies": { + "@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" + } + }, + "@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 + }, + "@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==", + "dev": true, + "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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@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==", + "dev": true + }, + "@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 + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "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" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "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.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "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": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + } + }, + "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-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 + }, + "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==", + "dev": true + }, + "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" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "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 + }, + "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" + }, + "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" + } + } + } + }, + "cli-color": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz", + "integrity": "sha512-eBbxZF6fqPUNnf7CLAFOersUnyYzv83tHFLSlts+OAHsNendaqv2tHCq+/MO+b3Y+9JeoUlIvobyxG/Z8GNeOg==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + } + }, + "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" + } + }, + "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 + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concurrently": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.3.0.tgz", + "integrity": "sha512-k4k1jQGHHKsfbqzkUszVf29qECBrkvBKkcPJEUDTyVR7tZd1G/JOfnst4g1sYbFvJ4UjHZisj1aWQR8yLKpGPw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + } + }, + "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" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-fns": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.25.0.tgz", + "integrity": "sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "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 + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "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" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "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-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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": { + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.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-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "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.2", + "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.12.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-only-warn": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.0.3.tgz", + "integrity": "sha512-XQOX/TfLoLw6h8ky51d29uUjXRTQHqBGXPylDEmy5fe/w7LIOnp8MA24b1OSMEn9BQoKow1q3g1kLe5/9uBTvw==", + "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" + } + }, + "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" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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 + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + } + }, + "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 + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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" + } + }, + "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" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "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": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "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 + }, + "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" + } + }, + "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=", + "dev": true, + "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==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "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" + } + }, + "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==", + "dev": true + }, + "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": "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" + } + }, + "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" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "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 + }, + "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" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "dependencies": { + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + } + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "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==", + "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==", + "dev": true + }, + "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 + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "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==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.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" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "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 + }, + "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=", + "dev": true + }, + "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==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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 + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "reload": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/reload/-/reload-3.2.0.tgz", + "integrity": "sha512-30iJoDvFHGbfq6tT3Vag/4RV3wkpuCOqPSM3GyeuOSSo48wKfZT/iI19oeO0GCVX0XSr+44XJ6yBiRJWqOq+sw==", + "dev": true, + "requires": { + "cli-color": "~2.0.0", + "commander": "~7.2.0", + "finalhandler": "~1.1.1", + "minimist": "~1.2.0", + "open": "^8.0.0", + "serve-static": "~1.14.0", + "supervisor": "~0.12.0", + "url-parse": "~1.5.0", + "ws": "~7.4.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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "dev": true, + "requires": { + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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 + }, + "supervisor": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz", + "integrity": "sha1-3n5jNwFbKRhRwQ81OMSn8EkX7ME=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "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 + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "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" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "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" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "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-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 + }, + "typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "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 + }, + "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==", + "dev": true, + "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" + } + }, + "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 + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} + }, + "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 + } + } +} diff --git a/package.json b/package.json index d4b0b06..f603e44 100644 --- a/package.json +++ b/package.json @@ -1,93 +1,25 @@ { - "name": "nwex-de", - "version": "1.0.0", - "keywords": [ - "react", - "nextjs", - "tailwind", - "storybook", - "jest" - ], - "scripts": { - "dev": "next dev", - "build": "cross-env NODE_ENV=production next build", - "start": "next start", - "export": "next export", - "test": "jest --watch", - "storybook": "start-storybook -p 6006 -s public", - "build-storybook": "build-storybook -s public" - }, - "dependencies": { - "framer-motion": "^4.1.2", - "fs": "^0.0.1-security", - "next": "10.0.5", - "react": "17.0.1", - "react-calendar-heatmap": "^1.8.1", - "react-dom": "17.0.1", - "react-visibility-sensor": "^5.1.1", - "swr": "^0.5.5" - }, - "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@next/plugin-storybook": "^10.0.5", - "@storybook/addon-actions": "^6.1.14", - "@storybook/addon-essentials": "^6.1.14", - "@storybook/addon-links": "^6.1.14", - "@storybook/addon-viewport": "^6.1.14", - "@storybook/addons": "^6.1.14", - "@storybook/node-logger": "^6.1.14", - "@storybook/react": "^6.1.14", - "@storybook/theming": "^6.1.14", - "@svgr/webpack": "^5.5.0", - "@testing-library/dom": "^7.29.4", - "@testing-library/jest-dom": "^5.11.9", - "@testing-library/react": "^11.2.3", - "@testing-library/user-event": "^12.1.10", - "@types/jest": "^26.0.20", - "@types/node": "^14.14.21", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "autoprefixer": "^10.2.1", - "babel-core": "7.0.0-bridge.0", - "babel-jest": "^26.6.3", - "chokidar": "^3.5.1", - "chokidar-cli": "^2.1.0", - "cross-env": "^7.0.3", - "ignore-loader": "^0.1.2", - "jest": "^26.6.3", - "npm-run-all": "^4.1.5", - "postcss": "^8.2.4", - "postcss-cli": "^8.3.1", - "postcss-loader": "^4.1.0", - "react-test-renderer": "^17.0.1", - "sharp": "^0.27.0", - "storybook": "^6.1.14", - "storybook-addon-next-router": "^2.0.3", - "tailwindcss": "^2.0.2", - "typescript": "^4.1.3" - }, - "resolutions": { - "react": "17.0.1" - }, - "browserslist": [ - ">0.3%", - "not ie 11", - "not dead", - "not op_mini all" - ], - "jest": { - "testPathIgnorePatterns": [ - "./.next/", - "./node_modules/", - "./.storybook/" - ], - "transform": { - "^.+\\.(js|jsx|ts|tsx)$": "/node_modules/babel-jest" + "name": "nwex.de", + "version": "1.0.0", + "description": "Landing page for nwex.de", + "scripts": { + "start": "concurrently --kill-others 'tsc -p tsconfig.json --watch' 'reload -b -d public'" }, - "moduleNameMapper": { - "\\.svg": "/__mocks__/svgrMock.js" + "repository": { + "type": "git", + "url": "https://gitlab.upi.li/networkException/nwex.de" + }, + "author": "networkException", + "license": "UNLICENSED", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.9.0", + "concurrently": "^6.3.0", + "eslint": "^8.6.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-only-warn": "^1.0.3", + "reload": "^3.2.0" + }, + "dependencies": { + "typescript": "^4.4.4" } - } } diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index bc17c32..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - plugins: { tailwindcss: {}, autoprefixer: {} } -} diff --git a/public/assets/icons/discord.svg b/public/assets/icons/discord.svg deleted file mode 100644 index 539a11a..0000000 --- a/public/assets/icons/discord.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/assets/icons/github.svg b/public/assets/icons/github.svg deleted file mode 100644 index 2a5c95e..0000000 --- a/public/assets/icons/github.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/assets/icons/gitlab.svg b/public/assets/icons/gitlab.svg deleted file mode 100644 index adbc2e9..0000000 --- a/public/assets/icons/gitlab.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/assets/icons/keybase.svg b/public/assets/icons/keybase.svg deleted file mode 100644 index 6b58f8f..0000000 --- a/public/assets/icons/keybase.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/public/assets/icons/mail.svg b/public/assets/icons/mail.svg deleted file mode 100644 index c57fd20..0000000 --- a/public/assets/icons/mail.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/public/assets/icons/mastodon.svg b/public/assets/icons/mastodon.svg deleted file mode 100644 index 07183f1..0000000 --- a/public/assets/icons/mastodon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/assets/icons/matrix.svg b/public/assets/icons/matrix.svg deleted file mode 100644 index 48f8be5..0000000 --- a/public/assets/icons/matrix.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/assets/icons/twitter.svg b/public/assets/icons/twitter.svg deleted file mode 100644 index b81af46..0000000 --- a/public/assets/icons/twitter.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/assets/square-logo.svg b/public/assets/square-logo.svg deleted file mode 100644 index c3abb5e..0000000 --- a/public/assets/square-logo.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - favicon - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 4965832..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/fonts/inter/Inter-SemiBold.woff b/public/fonts/inter/Inter-SemiBold.woff deleted file mode 100644 index 490bd9d..0000000 Binary files a/public/fonts/inter/Inter-SemiBold.woff and /dev/null differ diff --git a/public/fonts/inter/Inter-SemiBold.woff2 b/public/fonts/inter/Inter-SemiBold.woff2 deleted file mode 100644 index 9fd7726..0000000 Binary files a/public/fonts/inter/Inter-SemiBold.woff2 and /dev/null differ diff --git a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.eot b/public/fonts/jetbrainsmono/JetBrainsMono-Regular.eot deleted file mode 100644 index dd3c98d..0000000 Binary files a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.eot and /dev/null differ diff --git a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff b/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff deleted file mode 100644 index 20b54f1..0000000 Binary files a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff and /dev/null differ diff --git a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 b/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 deleted file mode 100644 index e57de0b..0000000 Binary files a/public/fonts/jetbrainsmono/JetBrainsMono-Regular.woff2 and /dev/null differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..9f94c3f --- /dev/null +++ b/public/index.html @@ -0,0 +1,69 @@ + + + + + + nwex.de + + +

networkException

+

try to catch(this: Exception);

+ +
+ I'm a TypeScript developer working on backend code, libraries and anything that scales. +
+
+

Projects I maintain in my free time

+ + +
+
+

Links

+ + +
+
+

This website

+ +

+ Although I also know my way around frontend development and design as well, I'm far less skilled at it. + As such this website is trying to impress in a different way: +

+

+ It implements parts of the HTML parser spec + to tokenize and highlight it's own source code. +

+
+ + + + + + diff --git a/public/style/index.css b/public/style/index.css new file mode 100644 index 0000000..8c4efb2 --- /dev/null +++ b/public/style/index.css @@ -0,0 +1,33 @@ +body { + background: #292D3E; + + font-family: monospace; +} + +pre { + margin: 0; +} + +body > pre > span { + cursor: default; +} + +a { + color: white; +} + +body { + color: white; + font-size: 1vmax; +} + +#inspector { + position: fixed; + pointer-events: none; + + background: inherit; + color: white; + border: 1px #424864 solid; + + padding: .5vw; +} diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index fbf0e25..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/SocialBadge/SocialBadge.stories.tsx b/src/components/SocialBadge/SocialBadge.stories.tsx deleted file mode 100644 index 55b718b..0000000 --- a/src/components/SocialBadge/SocialBadge.stories.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react" -import { Story, Meta } from "@storybook/react/types-6-0" -import { SocialBadge, SocialBadgeProps } from "." - -export default { - title: "Component/SocialBadge", - component: SocialBadge, - argTypes: { - title: { description: "The text displayed to the right of the icon" }, - link: { description: "The link that is opened when the Badge is clicked" }, - imagePath: { description: "The path to the circular image on the left" }, - } -} as Meta - -const Template: Story = (args) => - -// Default scenario -export const Default = Template.bind({}) -Default.args = {} - -// GitHub Variant -export const Github = Template.bind({}) -Github.args = { - title: "github.com", - link: "https://github.com/networkException", - imagePath: "/assets/icons/github.svg" -} diff --git a/src/components/SocialBadge/index.tsx b/src/components/SocialBadge/index.tsx deleted file mode 100644 index 801ba0d..0000000 --- a/src/components/SocialBadge/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; - -export interface SocialBadgeProps { - title: string - link: string, - imagePath: string -} - -export const SocialBadge: React.FC = ({title, link, imagePath}) => { - link = link ?? "/404"; - title = title ?? "Unbekannt"; - - console.log(imagePath); - - return ( - - {imagePath?():null} -
{title}
-
- ) -} diff --git a/src/html.ts b/src/html.ts new file mode 100644 index 0000000..53c8032 --- /dev/null +++ b/src/html.ts @@ -0,0 +1,34 @@ +import { Highlighter } from './html/highlighter.js'; +import { Span } from './html/highlighter/span.js'; +import { Tokenizer } from './html/tokenizer.js'; +import { Token, Type } from './html/tokenizer/token.js'; + +export function normalizeNewlines(input: string): string { + return input.replaceAll('\u000D\u000A', '\u000A').replaceAll('\u000D', '\u000A'); +} + +export function tokenize(input: string): Array { + console.time('html tokenizer'); + + const tokenizer = new Tokenizer(input); + + while (tokenizer.tokens[tokenizer.tokens.length - 1]?.type !== Type.EndOfFile) + tokenizer.spin(); + + console.timeEnd('html tokenizer'); + + return tokenizer.tokens; +} + +export function highlight(tokens: Array): Array { + const highlighter = new Highlighter(tokens); + + console.time('html highlighter'); + + while (!highlighter.finished) + highlighter.spin(); + + console.timeEnd('html highlighter'); + + return highlighter.spans; +} diff --git a/src/html/errors.ts b/src/html/errors.ts new file mode 100644 index 0000000..f240d63 --- /dev/null +++ b/src/html/errors.ts @@ -0,0 +1,20 @@ +// FIXME: Convert to const enum +export type ParseError = 'unexpected-null-character' | + 'unexpected-question-mark-instead-of-tag-name' | + 'eof-before-tag-name' | + 'invalid-first-character-of-tag-name' | + 'missing-end-tag-name' | + 'cdata-in-html-content' | + 'incorrectly-opened-comment' | + 'eof-in-doctype' | + 'missing-whitespace-before-doctype-name' | + 'eof-in-tag' | + 'unexpected-equals-sign-before-attribute-name' | + 'unexpected-character-in-attribute-name' | + 'missing-attribute-value' | + 'unexpected-character-in-unquoted-attribute-value' | + 'missing-whitespace-between-attributes' | + 'abrupt-closing-of-empty-comment' | + 'eof-in-comment' | + 'missing-semicolon-after-character-reference' | + 'unknown-named-character-reference'; diff --git a/src/html/highlighter.ts b/src/html/highlighter.ts new file mode 100644 index 0000000..cb13edb --- /dev/null +++ b/src/html/highlighter.ts @@ -0,0 +1,70 @@ +import { Color } from './highlighter/properties/color.js'; +import { Cursor } from './highlighter/properties/cursor.js'; +import { Font } from './highlighter/properties/font.js'; +import { Link } from './highlighter/properties/link.js'; +import { Span } from './highlighter/span.js'; +import { Token } from './tokenizer/token.js'; +import { CommentToken } from './tokenizer/tokens/comment.js'; +import { DOCTYPEToken } from './tokenizer/tokens/doctype.js'; +import { EndTagToken } from './tokenizer/tokens/endTag.js'; +import { StartTagToken } from './tokenizer/tokens/startTag.js'; + +export class Highlighter { + public spans: Array = new Array(); + + public finished: boolean = false; + + public constructor(private tokens: Array) { + } + + public spin(): void { + for (const token of this.tokens) { + if (token instanceof CommentToken) { + this.spans.push(Span.createFromRange(token, token.range, Color.Comment)); + } + + if (token instanceof DOCTYPEToken) { + this.spans.push(Span.createFromRange(token, { start: token.range.start.copy().decrement(8), end: token.range.start }, Color.Tag)); + this.spans.push(Span.createFromRange(token, { start: token.range.start, end: token.range.end }, Color.Attribute, Font.Italic)); + this.spans.push(Span.createFromRange(token, { start: token.range.start.copy().decrement(10), end: token.range.start.copy().decrement(9) }, Color.Punctuator)); + this.spans.push(Span.createAt(token, token.range.end, Color.Punctuator)); + } + + if (token instanceof StartTagToken || token instanceof EndTagToken) { + this.spans.push(Span.createFromRange(token, token.range, Color.Tag)); + + for (const attribute of token.attributes.list) { + this.spans.push(Span.createFromRange(attribute, attribute.nameRange, Color.Attribute, Font.Italic)); + + if (attribute.valueRange !== undefined) { + if (attribute.name === 'href') { + this.spans.push(Span.createAnchorFromRange(attribute, attribute.valueRange, Color.String, Font.Underline, Cursor.Pointer, Link.of(attribute.value))); + } else { + this.spans.push(Span.createFromRange(attribute, attribute.valueRange, Color.String)); + } + + if (attribute.quoted) { + this.spans.push(Span.createAt(attribute, attribute.valueRange.start, Color.Punctuator)); + this.spans.push(Span.createAt(attribute, attribute.valueRange.end, Color.Punctuator)); + } + } + + if (attribute.equalsPosition !== undefined) + this.spans.push(Span.createAt(attribute, attribute.equalsPosition, Color.Punctuator)); + } + + if (token instanceof StartTagToken) { + this.spans.push(Span.createAt(token, token.range.start.copy().decrement(1), Color.Punctuator)); + this.spans.push(Span.createAt(token, token.range.end, Color.Punctuator)); + } + + if (token instanceof EndTagToken) { + this.spans.push(Span.createFromRange(token, { start: token.range.start.copy().decrement(2), end: token.range.start.copy().decrement(1) }, Color.Punctuator)); + this.spans.push(Span.createAt(token, token.range.end, Color.Punctuator)); + } + } + } + + this.finished = true; + } +} diff --git a/src/html/highlighter/inspectable.ts b/src/html/highlighter/inspectable.ts new file mode 100644 index 0000000..da049bf --- /dev/null +++ b/src/html/highlighter/inspectable.ts @@ -0,0 +1,3 @@ +export abstract class Inspectable { + public abstract inspect(indent: number): string; +} diff --git a/src/html/highlighter/properties/color.ts b/src/html/highlighter/properties/color.ts new file mode 100644 index 0000000..0c66b00 --- /dev/null +++ b/src/html/highlighter/properties/color.ts @@ -0,0 +1,36 @@ +import { Property } from '../property.js'; + +export class Color extends Property { + public static Plain = new Color('#a6accd'); + public static Punctuator = new Color('#89ddff'); + public static Tag = new Color('#f07178'); + public static Attribute = new Color('#c792ea'); + public static String = new Color('#c3e88d'); + public static Comment = new Color('#676e95'); + + #color: string; + + private constructor(color: string) { + super(); + + this.#color = color; + } + + public get color(): string { + return this.#color; + } + + public override equals(other: Property): boolean { + if (!(other instanceof Color)) return false; + + return other.#color === this.#color; + } + + public override apply(element: HTMLElement): void { + element.style.color = this.#color; + } + + public override inspect(indent: number): string { + return `Color { ${this.#color} }`; + } +} diff --git a/src/html/highlighter/properties/cursor.ts b/src/html/highlighter/properties/cursor.ts new file mode 100644 index 0000000..5281c60 --- /dev/null +++ b/src/html/highlighter/properties/cursor.ts @@ -0,0 +1,28 @@ +import { Property } from '../property.js'; + +export class Cursor extends Property { + public static Default = new Cursor('default'); + public static Pointer = new Cursor('pointer'); + + #value: string; + + private constructor(value: string) { + super(); + + this.#value = value; + } + + public override equals(other: Property): boolean { + if (!(other instanceof Cursor)) return false; + + return other.#value === this.#value; + } + + public override apply(element: HTMLElement): void { + element.style.cursor = this.#value; + } + + public override inspect(indent: number): string { + return `Cursor { ${this.#value} }`; + } +} diff --git a/src/html/highlighter/properties/font.ts b/src/html/highlighter/properties/font.ts new file mode 100644 index 0000000..f85327f --- /dev/null +++ b/src/html/highlighter/properties/font.ts @@ -0,0 +1,30 @@ +import { Property } from '../property.js'; + +export class Font extends Property { + public static Italic = new Font(style => style.fontStyle = 'italic', 'italic'); + public static Underline = new Font(style => style.textDecoration = ' underline', 'underline'); + + #impelementation: (style: CSSStyleDeclaration) => void; + #value: string; + + private constructor(impelementation: (style: CSSStyleDeclaration) => void, value: string) { + super(); + + this.#impelementation = impelementation; + this.#value = value; + } + + public override equals(other: Property): boolean { + if (!(other instanceof Font)) return false; + + return other.#impelementation === this.#impelementation; + } + + public override apply(element: HTMLElement): void { + this.#impelementation(element.style); + } + + public override inspect(indent: number): string { + return `Font { ${this.#value} }`; + } +} diff --git a/src/html/highlighter/properties/link.ts b/src/html/highlighter/properties/link.ts new file mode 100644 index 0000000..b17ae0c --- /dev/null +++ b/src/html/highlighter/properties/link.ts @@ -0,0 +1,29 @@ +import { Property } from '../property.js'; + +export class Link extends Property { + #href: string; + + private constructor(href: string) { + super(); + + this.#href = href; + } + + public override equals(other: Property): boolean { + if (!(other instanceof Link)) return false; + + return other.#href === this.#href; + } + + public override apply(element: HTMLAnchorElement): void { + element.href = this.#href; + } + + public static of(href: string): Link { + return new Link(href); + } + + public override inspect(indent: number): string { + return `Link { href: '${this.#href}' }`; + } +} diff --git a/src/html/highlighter/property.ts b/src/html/highlighter/property.ts new file mode 100644 index 0000000..94acf76 --- /dev/null +++ b/src/html/highlighter/property.ts @@ -0,0 +1,6 @@ +import { Inspectable } from './inspectable.js'; + +export abstract class Property extends Inspectable { + public abstract equals(other: Property): boolean; + public abstract apply(element: HTMLElement): void; +} diff --git a/src/html/highlighter/span.ts b/src/html/highlighter/span.ts new file mode 100644 index 0000000..9bf0596 --- /dev/null +++ b/src/html/highlighter/span.ts @@ -0,0 +1,72 @@ +import { Attribute } from '../tokenizer/attribute.js'; +import { Position } from '../tokenizer/position.js'; +import { Range } from '../tokenizer/range.js'; +import { Token } from '../tokenizer/token.js'; +import { Inspectable } from './inspectable.js'; +import { Property } from './property.js'; + +export type Source = Attribute | Token | null; + +export class Span extends Inspectable { + #source: Source; + #from: Position; + #to: Position; + #properties: Array; + #tagName: keyof HTMLElementTagNameMap; + + private constructor(source: Source, from: Position, to: Position, tagName: keyof HTMLElementTagNameMap, properties: Array) { + super(); + + this.#source = source; + this.#from = from; + this.#to = to; + this.#tagName = tagName; + this.#properties = properties; + } + + public get source(): Source { + return this.#source; + } + + public contains(index: number): boolean { + return this.#from.index <= index && this.#to.index >= index; + } + + public get properties(): Array { + return this.#properties; + } + + public get tagName(): keyof HTMLElementTagNameMap { + return this.#tagName; + } + + public static createFromRange(source: Source, range: Range, ...properties: Array): Span { + return new Span(source, range.start, range.end, 'span', properties); + } + + public static createAnchorFromRange(source: Source, range: Range, ...properties: Array): Span { + return new Span(source, range.start, range.end, 'a', properties); + } + + public static createAt(source: Source, position: Position, ...properties: Array): Span { + return new Span(source, position, position, 'span', properties); + } + + public static createAnchorAt(source: Source, position: Position, ...properties: Array): Span { + return new Span(source, position, position, 'a', properties); + } + + public override inspect(indent: number): string { + let string = 'Span {\n'; + + string += ` from: ${this.#from.inspect(0)}\n`; + string += ` to: ${this.#to.inspect(0)}\n`; + string += ` properties: [ ${this.#properties.map(property => property.inspect(0)).join(', ')} ]\n`; + + if (this.#source !== null) string += ` source: ${this.#source.inspect(0)}\n`; + + string += '}'; + + return string; + } +} diff --git a/src/html/inspector.ts b/src/html/inspector.ts new file mode 100644 index 0000000..30c3f40 --- /dev/null +++ b/src/html/inspector.ts @@ -0,0 +1,48 @@ +import { Color } from './highlighter/properties/color.js'; +import { Span } from './highlighter/span.js'; + +export class Inspector { + #element: HTMLDivElement; + + public constructor() { + this.#element = document.createElement('div'); + this.#element.id = 'inspector'; + + document.body.appendChild(this.#element); + document.addEventListener('mousemove', event => this.#element.style.transform = `translate(${event.clientX + 10}px, ${event.clientY + 10}px)`); + } + + public instrument(element: HTMLElement, spans: Array): void { + if (spans.length === 0) + return; + + const container = document.createElement('pre'); + + container.textContent += spans[spans.length - 1].inspect(0); + + element.addEventListener('mouseenter', () => { + element.style.background = Color.Comment.color; + this.show(container); + }); + + element.addEventListener('mouseleave', () => { + element.style.background = 'none'; + this.hide(); + }); + } + + public show(element: HTMLElement): void { + this.#element.style.display = 'block'; + + if (this.#element.children[0] !== element) + this.#element.replaceChildren(element); + } + + public hide(): void { + this.#element.style.display = 'none'; + } + + public get element(): HTMLDivElement { + return this.#element; + } +} diff --git a/src/html/tokenizer.ts b/src/html/tokenizer.ts new file mode 100644 index 0000000..817ef86 --- /dev/null +++ b/src/html/tokenizer.ts @@ -0,0 +1,698 @@ +import { TODO, VERIFY, VERIFY_NOT_REACHED } from '../util/assertions.js'; +import { Constructor } from '../util/guards.js'; +import { ParseError } from './errors.js'; +import { Attribute } from './tokenizer/attribute.js'; +import { entities } from './tokenizer/entities.js'; +import { Position } from './tokenizer/position.js'; +import { State } from './tokenizer/state.js'; +import { Token } from './tokenizer/token.js'; +import { CharacterToken } from './tokenizer/tokens/character.js'; +import { CommentToken } from './tokenizer/tokens/comment.js'; +import { DOCTYPEToken } from './tokenizer/tokens/doctype.js'; +import { EndOfFileToken } from './tokenizer/tokens/endOfFile.js'; +import { EndTagToken } from './tokenizer/tokens/endTag.js'; +import { StartTagToken } from './tokenizer/tokens/startTag.js'; + +export class Tokenizer { + private state: State = State.Data; + private returnState!: State; + + private temporaryBuffer!: string; + + private currentToken!: Token; + private currentInputCharacter!: string; + + private currentPosition: Position = Position.createStarting(); + + public tokens: Array = new Array(); + private pointer: number = 0; + + public constructor(private input: string) { + } + + public spin(): void { + switch (this.state) { + case State.Data: { + switch (this.consumeNext()) { + case '\u0026': + this.returnState = State.Data; + this.state = State.CharacterReference; + break; + case '\u003C': this.state = State.TagOpen; break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.emit(CharacterToken.createWith(this.currentInputCharacter).at(this.currentPosition)); + break; + case undefined: this.emit(EndOfFileToken.create()); break; + default: this.emit(CharacterToken.createWith(this.currentInputCharacter).at(this.currentPosition)); + } + + break; + } + case State.RCDATA: { + switch (this.consumeNext()) { + case '\u003C': this.state = State.RAWTEXTLessThan; break; + case '\u0000': this.parseError('unexpected-null-character'); this.emit(CharacterToken.createReplacementCharacter().at(this.currentPosition)); break; + case undefined: this.emit(EndOfFileToken.create()); break; + default: this.emit(CharacterToken.createWith(this.currentInputCharacter).at(this.currentPosition)); + } + + break; + } + case State.TagOpen: { + switch (this.consumeNext()) { + case '\u0021': this.state = State.MarkupDeclarationOpen; break; + case '\u002F': this.state = State.EndTagOpen; break; + case '\u003F': + this.parseError('unexpected-question-mark-instead-of-tag-name'); + this.create(CommentToken.createEmpty().startingAt(this.currentPosition)); + this.reconsumeIn(State.BogusComment); + break; + case undefined: + this.parseError('eof-before-tag-name'); + this.emit(CharacterToken.createWith('\u003C').at(this.currentPosition)); + this.emit(EndOfFileToken.create()); + break; + default: { + if (this.asciiAlpha(this.currentInputCharacter)) { + this.create(StartTagToken.createEmpty().startingAt(this.currentPosition)); + this.reconsumeIn(State.TagName); + break; + } + + this.parseError('invalid-first-character-of-tag-name'); + this.emit(CharacterToken.createWith('\u003C').at(this.currentPosition)); + this.reconsumeIn(State.Data); + } + } + + break; + } + case State.EndTagOpen: { + switch (this.consumeNext()) { + case '\u003E': this.parseError('missing-end-tag-name'); this.state = State.Data; break; + case undefined: + this.parseError('eof-before-tag-name'); + this.emit(CharacterToken.createWith('\u003C').at(this.currentPosition)); + this.emit(CharacterToken.createWith('\u002F').at(this.currentPosition)); + this.emit(EndOfFileToken.create()); + break; + default: { + if (this.asciiAlpha(this.currentInputCharacter)) { + this.create(EndTagToken.createEmpty().startingAt(this.currentPosition)); + this.reconsumeIn(State.TagName); + break; + } + + this.parseError('invalid-first-character-of-tag-name'); + this.create(CommentToken.createEmpty().startingAt(this.currentPosition)); + this.reconsumeIn(State.BogusComment); + } + } + + break; + } + case State.MarkupDeclarationOpen: { + if (this.matchNextFew('--')) { + this.consumeNextFew('--'); + this.create(CommentToken.createEmpty().startingAt(this.currentPosition.copy().decrement(4))); + this.state = State.CommentStart; + } else if (this.matchNextFewCaseInsensitive('DOCTYPE')) { + this.consumeNextFewCaseInsensitive('DOCTYPE'); + this.state = State.DOCTYPE; + } else if (this.matchNextFew('[CDATA[')) { + this.consumeNextFew('[CDATA['); + // NOTE: This parser will never be generated as part of the fragment parsing algorithm, as such the CDATA section state does not + // exist and will not be started here. + this.parseError('cdata-in-html-content'); + this.create(CommentToken.createWith('[CDATA[').startingAt(this.currentPosition)); + this.state = State.BogusComment; + } else { + this.parseError('incorrectly-opened-comment'); + this.create(CommentToken.createEmpty().startingAt(this.currentPosition)); + this.state = State.BogusComment; + } + + break; + } + case State.DOCTYPE: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': this.state = State.BeforeDOCTYPEName; break; + case '\u003E': this.reconsumeIn(State.BeforeDOCTYPEName); break; + case undefined: + this.parseError('eof-in-doctype'); + this.emit(DOCTYPEToken.createWithForcedQuirks().at(this.currentPosition)); + this.emit(EndOfFileToken.create()); + break; + default: + this.parseError('missing-whitespace-before-doctype-name'); + this.reconsumeIn(State.BeforeDOCTYPEName); + } + + break; + } + case State.BeforeDOCTYPEName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.create(DOCTYPEToken.createWithName('\uFFFD').startingAt(this.currentPosition)); + this.state = State.DOCTYPEName; + break; + case undefined: + this.parseError('eof-in-doctype'); + this.emit(DOCTYPEToken.createWithForcedQuirks().at(this.currentPosition)); + this.emit(EndOfFileToken.create()); + break; + default: { + if (this.asciiUpperAlpha(this.currentInputCharacter)) { + this.create(DOCTYPEToken.createWithName(this.currentInputCharacter.toLowerCase()).startingAt(this.currentPosition)); + this.state = State.DOCTYPEName; + break; + } + + this.create(DOCTYPEToken.createWithName(this.currentInputCharacter).startingAt(this.currentPosition)); + this.state = State.DOCTYPEName; + } + } + + break; + } + case State.DOCTYPEName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': this.state = State.AfterDOCTYPEName; break; + case '\u003E': this.state = State.Data; this.emitCurrentOfType(DOCTYPEToken); break; + case '\u0000': this.parseError('unexpected-null-character'); this.currentOfType(DOCTYPEToken).appendReplacementCharacterToName(); break; + case undefined: + this.parseError('eof-in-doctype'); + this.currentOfType(DOCTYPEToken).forceQuirks = true; + this.emitCurrentOfType(DOCTYPEToken); + this.emit(EndOfFileToken.create()); + break; + default: { + if (this.asciiUpperAlpha(this.currentInputCharacter)) { + this.currentOfType(DOCTYPEToken).appendToName(this.currentInputCharacter.toLowerCase()); + break; + } + + this.currentOfType(DOCTYPEToken).appendToName(this.currentInputCharacter); + } + } + + break; + } + case State.TagName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': this.state = State.BeforeAttributeName; break; + case '\u002F': this.state = State.SelfClosingStartTag; break; + case '\u003E': this.state = State.Data; this.emitCurrentOfEitherType(StartTagToken, EndTagToken); break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.currentOfEitherType(StartTagToken, EndTagToken).appendReplacementCharacterToName(); + break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: { + if (this.asciiUpperAlpha(this.currentInputCharacter)) { + this.currentOfEitherType(StartTagToken, EndTagToken).appendToName(this.currentInputCharacter.toLowerCase()); + break; + } + + this.currentOfEitherType(StartTagToken, EndTagToken).appendToName(this.currentInputCharacter); + } + } + + break; + } + case State.BeforeAttributeName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': break; + case '\u002F': + case '\u003E': + case undefined: this.reconsumeIn(State.AfterAttributeName); break; + case '\u003D': { + this.parseError('unexpected-equals-sign-before-attribute-name'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.append(Attribute.createWithEmptyValue(this.currentInputCharacter).startingNameAt(this.currentPosition)); + this.state = State.AttributeName; + break; + } + default: { + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.append(Attribute.createWithEmptyNameAndValue().startingNameAt(this.currentPosition)); + this.reconsumeIn(State.AttributeName); + } + } + + break; + } + case State.AttributeName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': + case '\u002F': + case '\u003E': + case undefined: this.reconsumeIn(State.AfterAttributeName); break; + case '\u003D': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingNameAt(this.currentPosition.copy().decrement(1)); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.equalsAt(this.currentPosition); + this.state = State.BeforeAttributeValue; + break; + case '\u0000': this.parseError('unexpected-null-character'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendReplacementCharacterToName(); + break; + case '\u0022': + case '\u0027': + case '\u003C': + this.parseError('unexpected-character-in-attribute-name'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToName(this.currentInputCharacter); + break; + default: { + if (this.asciiUpperAlpha(this.currentInputCharacter)) { + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToName(this.currentInputCharacter.toLowerCase()); + break; + } + + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToName(this.currentInputCharacter); + } + } + + break; + } + case State.AfterAttributeName: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': break; + case '\u002F': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingNameAt(this.currentPosition); + this.state = State.SelfClosingStartTag; + break; + case '\u003D': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingNameAt(this.currentPosition); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.equalsAt(this.currentPosition); + this.state = State.BeforeAttributeValue; + break; + case '\u003E': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingNameAt(this.currentPosition); + this.state = State.Data; + this.emitCurrentOfEitherType(StartTagToken, EndTagToken); + break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.append(Attribute.createWithEmptyNameAndValue().startingNameAt(this.currentPosition)); + this.reconsumeIn(State.AttributeName); + break; + } + + break; + } + case State.BeforeAttributeValue: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': break; + case '\u0022': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.startingValueAt(this.currentPosition); + this.state = State.AttributeValueDouble; + break; + case '\u0027': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.startingValueAt(this.currentPosition); + this.state = State.AttributeValueSingle; + break; + case '\u003E': + this.parseError('missing-attribute-value'); + this.state = State.Data; + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingNameAt(this.currentPosition); + this.emitCurrentOfEitherType(StartTagToken, EndTagToken); + break; + default: + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.startingValueAt(this.currentPosition); + this.reconsumeIn(State.AttributeValueUnquoted); + } + + break; + } + case State.AttributeValueDouble: { + switch (this.consumeNext()) { + case '\u0022': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingValueAt(this.currentPosition); + this.state = State.AfterAttributeValue; + break; + case '\u0026': this.returnState = State.AttributeValueDouble; this.state = State.CharacterReference; break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendReplacementCharacterToValue(); + break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.currentInputCharacter); + } + + break; + } + case State.AttributeValueSingle: { + switch (this.consumeNext()) { + case '\u0027': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingValueAt(this.currentPosition); + this.state = State.AfterAttributeValue; + break; + case '\u0026': this.returnState = State.AttributeValueSingle; this.state = State.CharacterReference; break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendReplacementCharacterToValue(); + break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.currentInputCharacter); + } + + break; + } + case State.AttributeValueUnquoted: { + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.setUnquoted(); + + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': this.state = State.BeforeAttributeName; break; + case '\u0026': this.returnState = State.AttributeValueUnquoted; this.state = State.CharacterReference; break; + case '\u003E': + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.endingValueAt(this.currentPosition); + this.state = State.Data; + this.emitCurrentOfEitherType(StartTagToken, EndTagToken); + break; + case '\u0000': + this.parseError('unexpected-null-character'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendReplacementCharacterToValue(); + break; + case '\u0022': + case '\u0027': + case '\u003C': + case '\u003D': + case '\u0060': + this.parseError('unexpected-character-in-unquoted-attribute-value'); + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.currentInputCharacter); + break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.currentInputCharacter); + } + + break; + } + case State.AfterAttributeValue: { + switch (this.consumeNext()) { + case '\u0009': + case '\u000A': + case '\u000C': + case '\u0020': this.state = State.BeforeAttributeName; break; + case '\u002F': this.state = State.SelfClosingStartTag; break; + case '\u003E': this.state = State.Data; this.emitCurrentOfEitherType(StartTagToken, EndTagToken); break; + case undefined: this.parseError('eof-in-tag'); this.emit(EndOfFileToken.create()); break; + default: this.parseError('missing-whitespace-between-attributes'); this.reconsumeIn(State.BeforeAttributeName); + } + + break; + } + case State.CommentStart: { + switch (this.consumeNext()) { + case '\u002D': this.state = State.CommentStartDash; break; + case '\u003E': this.parseError('abrupt-closing-of-empty-comment'); this.state = State.Data; this.emitCurrentOfType(CommentToken); break; + default: this.reconsumeIn(State.Comment); + } + + break; + } + // FIXME: Possible improvement to https://html.spec.whatwg.org/multipage/parsing.html#comment-state (adding **current** in some places) + case State.Comment: { + switch (this.consumeNext()) { + case '\u003C': this.currentOfType(CommentToken).append(this.currentInputCharacter); this.state = State.CommentLessThanSign; break; + case '\u002D': this.state = State.CommentEndDash; break; + case '\u0000': this.parseError('unexpected-null-character'); this.currentOfType(CommentToken).appendReplacementCharacter(); break; + case undefined: this.parseError('eof-in-comment'); this.emitCurrentOfType(CommentToken); this.emit(EndOfFileToken.create()); break; + default: this.currentOfType(CommentToken).append(this.currentInputCharacter); + } + + break; + } + case State.CommentEndDash: { + switch (this.consumeNext()) { + case '\u002D': this.state = State.CommentEnd; break; + case undefined: this.parseError('eof-in-comment'); this.emitCurrentOfType(CommentToken); this.emit(EndOfFileToken.create()); break; + default: this.currentOfType(CommentToken).append('\u002D'); this.reconsumeIn(State.Comment); + } + + break; + } + // Same as above fixme https://html.spec.whatwg.org/multipage/parsing.html#comment-end-state + case State.CommentEnd: { + switch (this.consumeNext()) { + case '\u003E': this.state = State.Data; this.emit(this.currentOfType(CommentToken).endingAt(this.currentPosition.copy().increment(1))); break; + case '\u0021': this.state = State.CommentEndBang; break; + case '\u002D': this.currentOfType(CommentToken).append('\u002D'); break; + case undefined: this.parseError('eof-in-comment'); this.emitCurrentOfType(CommentToken); this.emit(EndOfFileToken.create()); break; + default: this.currentOfType(CommentToken).append('\u002D\u002D'); this.reconsumeIn(State.Comment); + } + + break; + } + // Same as above https://html.spec.whatwg.org/multipage/parsing.html#bogus-comment-state + case State.BogusComment: { + switch (this.consumeNext()) { + case '\u003E': this.state = State.Data; this.emitCurrentOfType(CommentToken); break; + case undefined: this.emitCurrentOfType(CommentToken); this.emit(EndOfFileToken.create()); break; + case '\u0000': this.parseError('unexpected-null-character'); this.currentOfType(CommentToken).appendReplacementCharacter(); break; + default: this.currentOfType(CommentToken).append(this.currentInputCharacter); + } + + break; + } + case State.CharacterReference: { + this.temporaryBuffer = ''; + this.temporaryBuffer += '\u0026'; + + switch (this.consumeNext()) { + case '\u0023': this.temporaryBuffer += this.currentInputCharacter; this.state = State.NumericCharacterReference; break; + default: { + if (this.asciiAlphanumeric(this.currentInputCharacter)) { + this.reconsumeIn(State.NamedCharacterReference); + break; + } + + this.flushCodePointsConsumedAsCharacterReference(); + this.reconsumeIn(this.returnState); + } + } + + break; + } + case State.NamedCharacterReference: { + let match = false; + + for (const entry in entities) { + if (this.matchNextFew(entry)) { + match = true; + + this.consumeNextFew(entry); + this.temporaryBuffer += entry; + + if (this.consumedAsPartOfAnAttribute() && entry[entry.length - 1] !== '\u003B' && (this.next() === '\u003D' || this.asciiAlphanumeric(this.next() ?? ''))) { + this.flushCodePointsConsumedAsCharacterReference(); + this.state = this.returnState; + break; + } + + if (entry[entry.length - 1] !== '\u003B') + this.parseError('missing-semicolon-after-character-reference'); + + this.temporaryBuffer = ''; + this.temporaryBuffer += entities[entry].characters; + this.flushCodePointsConsumedAsCharacterReference(); + this.state = this.returnState; + + break; + } + } + + if (!match) { + this.flushCodePointsConsumedAsCharacterReference(); + this.state = State.AmbiguousAmpersand; + } + + break; + } + case State.AmbiguousAmpersand: { + switch (this.consumeNext()) { + case '\u003B': this.parseError('unknown-named-character-reference'); this.reconsumeIn(this.returnState); break; + default: { + if (this.asciiAlphanumeric(this.currentInputCharacter)) { + if (this.consumedAsPartOfAnAttribute()) { + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.currentInputCharacter); + } else { + this.emit(CharacterToken.createWith(this.currentInputCharacter)); + } + + break; + } + + this.reconsumeIn(this.returnState); + } + } + + break; + } + default: TODO(`Unimplemented state '${this.state}'`); + } + } + + private flushCodePointsConsumedAsCharacterReference(): void { + if (this.consumedAsPartOfAnAttribute()) { + this.currentOfEitherType(StartTagToken, EndTagToken).attributes.current.appendToValue(this.temporaryBuffer); + return; + } + + for (const codePoint of this.temporaryBuffer) + this.emit(CharacterToken.createWith(codePoint)); + } + + private consumedAsPartOfAnAttribute(): boolean { + return this.returnState === State.AttributeValueDouble || this.returnState === State.AttributeValueSingle || this.returnState === State.AttributeValueUnquoted; + } + + private asciiAlphanumeric(input: string): boolean { + return this.asciiAlpha(input) || this.asciiDigit(input); + } + + private asciiAlpha(input: string): boolean { + return this.asciiUpperAlpha(input) || this.asciiLowerAlpha(input); + } + + private asciiUpperAlpha(input: string): boolean { + return /[\u0041-\u005A]/.test(input); + } + + private asciiLowerAlpha(input: string): boolean { + return /[\u0061-\u007A]/.test(input); + } + + private asciiDigit(input: string): boolean { + return /[\u0030-\u0030]/.test(input); + } + + private reconsumeIn(state: State): void { + this.pointer--; + + this.currentPosition.decrement(); + + this.state = state; + this.spin(); + } + + private parseError(error: ParseError): void { + console.error('Parse error: ' + error); + } + + private consumeNext(): string | undefined { + this.currentInputCharacter = this.input[this.pointer]; + this.pointer++; + + this.currentPosition.increment(); + + if (this.currentInputCharacter === '\n') + this.currentPosition.incrementLine(); + + return this.currentInputCharacter; + } + + private next(): string | undefined { + return this.input[this.pointer]; + } + + private matchNextFew(input: string): boolean { + return this.input.substr(this.pointer, input.length) === input; + } + + private matchNextFewCaseInsensitive(input: string): boolean { + return this.input.substr(this.pointer, input.length).toLowerCase() === input.toLowerCase(); + } + + private consumeNextFew(input: string): void { + for (let i = 0; i < input.length; i++) { + const consumed = this.consumeNext(); + + VERIFY(consumed === input[i], `Expected '${input[i]}' (${input} at ${i}), got ${consumed} instead`); + } + } + + private consumeNextFewCaseInsensitive(input: string): void { + for (let i = 0; i < input.length; i++) { + const consumed = this.consumeNext()?.toLowerCase(); + + VERIFY(consumed === input[i].toLowerCase(), `Expected '${input[i].toLowerCase()}' (${input.toLowerCase()} at ${i}), got ${consumed} instead`); + } + } + + private emit(token: Token): void { + this.populateRangeOnEmit(token); + this.tokens.push(token); + } + + private emitCurrentOfType(type: Constructor): void { + VERIFY(this.currentToken instanceof type, `Expected '${type.name}', got '${this.currentToken.constructor.name}' instead`); + + this.populateRangeOnEmit(this.currentToken); + this.tokens.push(this.currentToken); + } + + private emitCurrentOfEitherType(a: Constructor, b: Constructor): void { + VERIFY(this.currentToken instanceof a || this.currentToken instanceof b, `Expected '${a.name}' or '${b.name}', got '${this.currentToken.constructor.name}' instead`); + + this.populateRangeOnEmit(this.currentToken); + this.tokens.push(this.currentToken); + } + + private currentOfType(type: Constructor): T { + VERIFY(this.currentToken instanceof type, `Expected '${type.name}', got '${this.currentToken.constructor.name}' instead`); + + return this.currentToken; + } + + private currentOfEitherType(a: Constructor, b: Constructor): T | U { + VERIFY(this.currentToken instanceof a || this.currentToken instanceof b, `Expected '${a.name}' or '${b.name}', got '${this.currentToken.constructor.name}' instead`); + + return this.currentToken; + } + + private populateRangeOnEmit(token: Token): void { + if (token.range.start === undefined && token.range.end === undefined) + token.at(this.currentPosition); + + if (token.range.start !== undefined && token.range.end === undefined) + token.endingAt(this.currentPosition); + + if (token.range.start === undefined && token.range.end !== undefined) + VERIFY_NOT_REACHED(); + } + + private create(token: Token): Token { + if (token.range.start === undefined) + token.startingAt(this.currentPosition); + + return this.currentToken = token; + } +} diff --git a/src/html/tokenizer/attribute.ts b/src/html/tokenizer/attribute.ts new file mode 100644 index 0000000..00e87a4 --- /dev/null +++ b/src/html/tokenizer/attribute.ts @@ -0,0 +1,117 @@ +import { VERIFY } from '../../util/assertions.js'; +import { Inspectable } from '../highlighter/inspectable.js'; +import { Position } from './position.js'; +import { Range } from './range.js'; +import { REPLACEMENT_CHARACTER } from './token.js'; + +export class Attribute extends Inspectable { + public name: string; + public value: string; + public nameRange!: Range; + public valueRange?: Range; + public equalsPosition?: Position; + public quoted: boolean; + + public constructor(name: string, value: string) { + super(); + + this.name = name; + this.value = value; + this.quoted = true; + + // @ts-expect-error + this.nameRange = {}; + } + + public setUnquoted(): void { + this.quoted = false; + } + + public appendToName(characters: string): void { + this.name += characters; + } + + public appendReplacementCharacterToName(): void { + this.appendToName(REPLACEMENT_CHARACTER); + } + + public appendToValue(characters: string): void { + this.value += characters; + } + + public appendReplacementCharacterToValue(): void { + this.appendToValue(REPLACEMENT_CHARACTER); + } + + public startingNameAt(position: Position): this { + this.nameRange.start = position.copy(); + + return this; + } + + public endingNameAt(position: Position): this { + this.nameRange.end = position.copy(); + + return this; + } + + public equalsAt(position: Position): this { + this.equalsPosition = position.copy(); + + return this; + } + + public startingValueAt(position: Position): this { + // @ts-expect-error + if (this.valueRange === undefined) this.valueRange = {}; + VERIFY(this.valueRange !== undefined); + this.valueRange.start = position.copy(); + + return this; + } + + public endingValueAt(position: Position): this { + // @ts-expect-error + if (this.valueRange === undefined) this.valueRange = {}; + VERIFY(this.valueRange !== undefined); + this.valueRange.end = position.copy(); + + return this; + } + + public static createWithEmptyNameAndValue(): Attribute { + return new Attribute('', ''); + } + + public static createWithEmptyValue(name: string): Attribute { + return new Attribute(name, ''); + } + + public override inspect(indent: number): string { + return `Attribute { name: '${this.name}', value: '${this.value}' }`; + } +} + +export class AttributeList { + private attributes: Array; + + public constructor() { + this.attributes = new Array(); + } + + public get current(): Attribute { + return this.attributes[this.attributes.length - 1]; + } + + public get list(): Array { + return this.attributes; + } + + public nonEmpty(): boolean { + return this.list.length !== 0; + } + + public append(attribute: Attribute): void { + this.attributes.push(attribute); + } +} diff --git a/src/html/tokenizer/entities.ts b/src/html/tokenizer/entities.ts new file mode 100644 index 0000000..0a5531a --- /dev/null +++ b/src/html/tokenizer/entities.ts @@ -0,0 +1,2236 @@ +// Taken from https://html.spec.whatwg.org/entities.json +// See also: https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references + +export const entities: { [sequence: string]: { codepoints: Array, characters: string } } = { + '∳': { codepoints: [ 8755 ], characters: '∳' }, + '∲': { codepoints: [ 8754 ], characters: '∲' }, + '⟺': { codepoints: [ 10234 ], characters: '⟺' }, + '⪢̸': { codepoints: [ 10914, 824 ], characters: '⪢̸' }, + '˝': { codepoints: [ 733 ], characters: '˝' }, + '⋣': { codepoints: [ 8931 ], characters: '⋣' }, + '”': { codepoints: [ 8221 ], characters: '”' }, + '∯': { codepoints: [ 8751 ], characters: '∯' }, + '▪': { codepoints: [ 9642 ], characters: '▪' }, + '​': { codepoints: [ 8203 ], characters: '​' }, + '⋠': { codepoints: [ 8928 ], characters: '⋠' }, + '⋭': { codepoints: [ 8941 ], characters: '⋭' }, + '⋡': { codepoints: [ 8929 ], characters: '⋡' }, + 'ⅅ': { codepoints: [ 8517 ], characters: 'ⅅ' }, + '⇔': { codepoints: [ 8660 ], characters: '⇔' }, + '⟹': { codepoints: [ 10233 ], characters: '⟹' }, + '▫': { codepoints: [ 9643 ], characters: '▫' }, + '≫': { codepoints: [ 8811 ], characters: '≫' }, + '∦': { codepoints: [ 8742 ], characters: '∦' }, + '⩾̸': { codepoints: [ 10878, 824 ], characters: '⩾̸' }, + '⋬': { codepoints: [ 8940 ], characters: '⋬' }, + '⋢': { codepoints: [ 8930 ], characters: '⋢' }, + '“': { codepoints: [ 8220 ], characters: '“' }, + '⥯': { codepoints: [ 10607 ], characters: '⥯' }, + '⟸': { codepoints: [ 10232 ], characters: '⟸' }, + '⥐': { codepoints: [ 10576 ], characters: '⥐' }, + '⇆': { codepoints: [ 8646 ], characters: '⇆' }, + '​': { codepoints: [ 8203 ], characters: '​' }, + '≧̸': { codepoints: [ 8807, 824 ], characters: '≧̸' }, + '⧐̸': { codepoints: [ 10704, 824 ], characters: '⧐̸' }, + '⇄': { codepoints: [ 8644 ], characters: '⇄' }, + '⊒': { codepoints: [ 8850 ], characters: '⊒' }, + '↭': { codepoints: [ 8621 ], characters: '↭' }, + '⥟': { codepoints: [ 10591 ], characters: '⥟' }, + '⥗': { codepoints: [ 10583 ], characters: '⥗' }, + '⟷': { codepoints: [ 10231 ], characters: '⟷' }, + '⟺': { codepoints: [ 10234 ], characters: '⟺' }, + '​': { codepoints: [ 8203 ], characters: '​' }, + '⧏̸': { codepoints: [ 10703, 824 ], characters: '⧏̸' }, + '≼': { codepoints: [ 8828 ], characters: '≼' }, + '⇋': { codepoints: [ 8651 ], characters: '⇋' }, + '⟧': { codepoints: [ 10215 ], characters: '⟧' }, + '⥝': { codepoints: [ 10589 ], characters: '⥝' }, + '⥕': { codepoints: [ 10581 ], characters: '⥕' }, + '⊵': { codepoints: [ 8885 ], characters: '⊵' }, + '⊓': { codepoints: [ 8851 ], characters: '⊓' }, + '≽': { codepoints: [ 8829 ], characters: '≽' }, + '▸': { codepoints: [ 9656 ], characters: '▸' }, + '⟷': { codepoints: [ 10231 ], characters: '⟷' }, + '⇕': { codepoints: [ 8661 ], characters: '⇕' }, + '∥': { codepoints: [ 8741 ], characters: '∥' }, + '⥞': { codepoints: [ 10590 ], characters: '⥞' }, + '⥖': { codepoints: [ 10582 ], characters: '⥖' }, + '◼': { codepoints: [ 9724 ], characters: '◼' }, + '⩾': { codepoints: [ 10878 ], characters: '⩾' }, + '⟦': { codepoints: [ 10214 ], characters: '⟦' }, + '⥡': { codepoints: [ 10593 ], characters: '⥡' }, + '⥙': { codepoints: [ 10585 ], characters: '⥙' }, + '⊴': { codepoints: [ 8884 ], characters: '⊴' }, + '​': { codepoints: [ 8203 ], characters: '​' }, + '≫̸': { codepoints: [ 8811, 824 ], characters: '≫̸' }, + '⩽̸': { codepoints: [ 10877, 824 ], characters: '⩽̸' }, + '⪡̸': { codepoints: [ 10913, 824 ], characters: '⪡̸' }, + '∌': { codepoints: [ 8716 ], characters: '∌' }, + '⊐̸': { codepoints: [ 8848, 824 ], characters: '⊐̸' }, + '≇': { codepoints: [ 8775 ], characters: '≇' }, + '⟩': { codepoints: [ 10217 ], characters: '⟩' }, + '⥏': { codepoints: [ 10575 ], characters: '⥏' }, + '⊑': { codepoints: [ 8849 ], characters: '⊑' }, + '❘': { codepoints: [ 10072 ], characters: '❘' }, + '▾': { codepoints: [ 9662 ], characters: '▾' }, + '◂': { codepoints: [ 9666 ], characters: '◂' }, + '⇋': { codepoints: [ 8651 ], characters: '⇋' }, + '⇌': { codepoints: [ 8652 ], characters: '⇌' }, + '↠': { codepoints: [ 8608 ], characters: '↠' }, + '´': { codepoints: [ 180 ], characters: '´' }, + '`': { codepoints: [ 96 ], characters: '`' }, + '˜': { codepoints: [ 732 ], characters: '˜' }, + '⇒': { codepoints: [ 8658 ], characters: '⇒' }, + '⇵': { codepoints: [ 8693 ], characters: '⇵' }, + '◻': { codepoints: [ 9723 ], characters: '◻' }, + '⋛': { codepoints: [ 8923 ], characters: '⋛' }, + '≧': { codepoints: [ 8807 ], characters: '≧' }, + '⟨': { codepoints: [ 10216 ], characters: '⟨' }, + '⥑': { codepoints: [ 10577 ], characters: '⥑' }, + '⋚': { codepoints: [ 8922 ], characters: '⋚' }, + ' ': { codepoints: [ 160 ], characters: ' ' }, + '⪯̸': { codepoints: [ 10927, 824 ], characters: '⪯̸' }, + '⋫': { codepoints: [ 8939 ], characters: '⋫' }, + '⪰̸': { codepoints: [ 10928, 824 ], characters: '⪰̸' }, + '≿̸': { codepoints: [ 8831, 824 ], characters: '≿̸' }, + '⊉': { codepoints: [ 8841 ], characters: '⊉' }, + '⧐': { codepoints: [ 10704 ], characters: '⧐' }, + '⥜': { codepoints: [ 10588 ], characters: '⥜' }, + '⥔': { codepoints: [ 10580 ], characters: '⥔' }, + '⏝': { codepoints: [ 9181 ], characters: '⏝' }, + '⇅': { codepoints: [ 8645 ], characters: '⇅' }, + '↻': { codepoints: [ 8635 ], characters: '↻' }, + '⇂': { codepoints: [ 8642 ], characters: '⇂' }, + '⋭': { codepoints: [ 8941 ], characters: '⋭' }, + '⇁': { codepoints: [ 8641 ], characters: '⇁' }, + '⇉': { codepoints: [ 8649 ], characters: '⇉' }, + '↞': { codepoints: [ 8606 ], characters: '↞' }, + '⊳': { codepoints: [ 8883 ], characters: '⊳' }, + '’': { codepoints: [ 8217 ], characters: '’' }, + '∮': { codepoints: [ 8750 ], characters: '∮' }, + '⇓': { codepoints: [ 8659 ], characters: '⇓' }, + '⇐': { codepoints: [ 8656 ], characters: '⇐' }, + '⇁': { codepoints: [ 8641 ], characters: '⇁' }, + '⥎': { codepoints: [ 10574 ], characters: '⥎' }, + '⧏': { codepoints: [ 10703 ], characters: '⧏' }, + '⥠': { codepoints: [ 10592 ], characters: '⥠' }, + '⥘': { codepoints: [ 10584 ], characters: '⥘' }, + '↘': { codepoints: [ 8600 ], characters: '↘' }, + '≱': { codepoints: [ 8817 ], characters: '≱' }, + '≵': { codepoints: [ 8821 ], characters: '≵' }, + '≎̸': { codepoints: [ 8782, 824 ], characters: '≎̸' }, + '⋪': { codepoints: [ 8938 ], characters: '⋪' }, + '⊏̸': { codepoints: [ 8847, 824 ], characters: '⊏̸' }, + '⏜': { codepoints: [ 9180 ], characters: '⏜' }, + '⇂': { codepoints: [ 8642 ], characters: '⇂' }, + '→': { codepoints: [ 8594 ], characters: '→' }, + '↗': { codepoints: [ 8599 ], characters: '↗' }, + '▽': { codepoints: [ 9661 ], characters: '▽' }, + '↺': { codepoints: [ 8634 ], characters: '↺' }, + '↷': { codepoints: [ 8631 ], characters: '↷' }, + '⇃': { codepoints: [ 8643 ], characters: '⇃' }, + '↽': { codepoints: [ 8637 ], characters: '↽' }, + '⇆': { codepoints: [ 8646 ], characters: '⇆' }, + '⇎': { codepoints: [ 8654 ], characters: '⇎' }, + '↮': { codepoints: [ 8622 ], characters: '↮' }, + '⋬': { codepoints: [ 8940 ], characters: '⋬' }, + '⇄': { codepoints: [ 8644 ], characters: '⇄' }, + '↝': { codepoints: [ 8605 ], characters: '↝' }, + '⋌': { codepoints: [ 8908 ], characters: '⋌' }, + 'ϵ': { codepoints: [ 1013 ], characters: 'ϵ' }, + '⊵': { codepoints: [ 8885 ], characters: '⊵' }, + '⊲': { codepoints: [ 8882 ], characters: '⊲' }, + '˙': { codepoints: [ 729 ], characters: '˙' }, + '⊨': { codepoints: [ 8872 ], characters: '⊨' }, + '↽': { codepoints: [ 8637 ], characters: '↽' }, + '⪢': { codepoints: [ 10914 ], characters: '⪢' }, + '─': { codepoints: [ 9472 ], characters: '─' }, + '⁣': { codepoints: [ 8291 ], characters: '⁣' }, + '⁢': { codepoints: [ 8290 ], characters: '⁢' }, + '⇃': { codepoints: [ 8643 ], characters: '⇃' }, + '↔': { codepoints: [ 8596 ], characters: '↔' }, + '⇔': { codepoints: [ 8660 ], characters: '⇔' }, + '⩽': { codepoints: [ 10877 ], characters: '⩽' }, + '⟶': { codepoints: [ 10230 ], characters: '⟶' }, + '⟹': { codepoints: [ 10233 ], characters: '⟹' }, + '↙': { codepoints: [ 8601 ], characters: '↙' }, + '≪': { codepoints: [ 8810 ], characters: '≪' }, + '≹': { codepoints: [ 8825 ], characters: '≹' }, + '≸': { codepoints: [ 8824 ], characters: '≸' }, + '⊈': { codepoints: [ 8840 ], characters: '⊈' }, + '∤': { codepoints: [ 8740 ], characters: '∤' }, + '‘': { codepoints: [ 8216 ], characters: '‘' }, + '∋': { codepoints: [ 8715 ], characters: '∋' }, + '⥛': { codepoints: [ 10587 ], characters: '⥛' }, + '⥓': { codepoints: [ 10579 ], characters: '⥓' }, + '↓': { codepoints: [ 8595 ], characters: '↓' }, + '←': { codepoints: [ 8592 ], characters: '←' }, + '⊐': { codepoints: [ 8848 ], characters: '⊐' }, + '≅': { codepoints: [ 8773 ], characters: '≅' }, + '↖': { codepoints: [ 8598 ], characters: '↖' }, + '​': { codepoints: [ 8203 ], characters: '​' }, + '↶': { codepoints: [ 8630 ], characters: '↶' }, + '⌆': { codepoints: [ 8966 ], characters: '⌆' }, + '⇊': { codepoints: [ 8650 ], characters: '⇊' }, + '↪': { codepoints: [ 8618 ], characters: '↪' }, + '⇇': { codepoints: [ 8647 ], characters: '⇇' }, + '↔': { codepoints: [ 8596 ], characters: '↔' }, + '⋋': { codepoints: [ 8907 ], characters: '⋋' }, + '⟶': { codepoints: [ 10230 ], characters: '⟶' }, + '↬': { codepoints: [ 8620 ], characters: '↬' }, + '∦': { codepoints: [ 8742 ], characters: '∦' }, + '⋫': { codepoints: [ 8939 ], characters: '⋫' }, + '↣': { codepoints: [ 8611 ], characters: '↣' }, + '⇀': { codepoints: [ 8640 ], characters: '⇀' }, + '⊴': { codepoints: [ 8884 ], characters: '⊴' }, + '↾': { codepoints: [ 8638 ], characters: '↾' }, + '⁡': { codepoints: [ 8289 ], characters: '⁡' }, + 'ⅆ': { codepoints: [ 8518 ], characters: 'ⅆ' }, + '⫤': { codepoints: [ 10980 ], characters: '⫤' }, + '⇑': { codepoints: [ 8657 ], characters: '⇑' }, + '⥚': { codepoints: [ 10586 ], characters: '⥚' }, + '⥒': { codepoints: [ 10578 ], characters: '⥒' }, + '≦': { codepoints: [ 8806 ], characters: '≦' }, + '⟵': { codepoints: [ 10229 ], characters: '⟵' }, + '⟸': { codepoints: [ 10232 ], characters: '⟸' }, + '≂̸': { codepoints: [ 8770, 824 ], characters: '≂̸' }, + '≄': { codepoints: [ 8772 ], characters: '≄' }, + '≉': { codepoints: [ 8777 ], characters: '≉' }, + 'ℌ': { codepoints: [ 8460 ], characters: 'ℌ' }, + '⪯': { codepoints: [ 10927 ], characters: '⪯' }, + '≾': { codepoints: [ 8830 ], characters: '≾' }, + '⇥': { codepoints: [ 8677 ], characters: '⇥' }, + '↦': { codepoints: [ 8614 ], characters: '↦' }, + '⊳': { codepoints: [ 8883 ], characters: '⊳' }, + '↾': { codepoints: [ 8638 ], characters: '↾' }, + '⪰': { codepoints: [ 10928 ], characters: '⪰' }, + '≿': { codepoints: [ 8831 ], characters: '≿' }, + '⊇': { codepoints: [ 8839 ], characters: '⊇' }, + '⥮': { codepoints: [ 10606 ], characters: '⥮' }, + '≀': { codepoints: [ 8768 ], characters: '≀' }, + ' ': { codepoints: [ 8202 ], characters: ' ' }, + '△': { codepoints: [ 9651 ], characters: '△' }, + '▴': { codepoints: [ 9652 ], characters: '▴' }, + '⋇': { codepoints: [ 8903 ], characters: '⋇' }, + '≒': { codepoints: [ 8786 ], characters: '≒' }, + '↩': { codepoints: [ 8617 ], characters: '↩' }, + '↢': { codepoints: [ 8610 ], characters: '↢' }, + '↼': { codepoints: [ 8636 ], characters: '↼' }, + '⟵': { codepoints: [ 10229 ], characters: '⟵' }, + '↫': { codepoints: [ 8619 ], characters: '↫' }, + '∡': { codepoints: [ 8737 ], characters: '∡' }, + '⋪': { codepoints: [ 8938 ], characters: '⋪' }, + '∥': { codepoints: [ 8741 ], characters: '∥' }, + '∖': { codepoints: [ 8726 ], characters: '∖' }, + '▹': { codepoints: [ 9657 ], characters: '▹' }, + '↿': { codepoints: [ 8639 ], characters: '↿' }, + '⫋︀': { codepoints: [ 10955, 65024 ], characters: '⫋︀' }, + '⫌︀': { codepoints: [ 10956, 65024 ], characters: '⫌︀' }, + '⤓': { codepoints: [ 10515 ], characters: '⤓' }, + '↧': { codepoints: [ 8615 ], characters: '↧' }, + 'ⅇ': { codepoints: [ 8519 ], characters: 'ⅇ' }, + '≥': { codepoints: [ 8805 ], characters: '≥' }, + '≳': { codepoints: [ 8819 ], characters: '≳' }, + 'ℋ': { codepoints: [ 8459 ], characters: 'ℋ' }, + '≎': { codepoints: [ 8782 ], characters: '≎' }, + '⋂': { codepoints: [ 8898 ], characters: '⋂' }, + '⇤': { codepoints: [ 8676 ], characters: '⇤' }, + '↤': { codepoints: [ 8612 ], characters: '↤' }, + '⊲': { codepoints: [ 8882 ], characters: '⊲' }, + '↿': { codepoints: [ 8639 ], characters: '↿' }, + '≢': { codepoints: [ 8802 ], characters: '≢' }, + '≏̸': { codepoints: [ 8783, 824 ], characters: '≏̸' }, + '≰': { codepoints: [ 8816 ], characters: '≰' }, + '≴': { codepoints: [ 8820 ], characters: '≴' }, + '∝': { codepoints: [ 8733 ], characters: '∝' }, + '⌉': { codepoints: [ 8969 ], characters: '⌉' }, + '⥰': { codepoints: [ 10608 ], characters: '⥰' }, + '↑': { codepoints: [ 8593 ], characters: '↑' }, + '⊏': { codepoints: [ 8847 ], characters: '⊏' }, + '⎵': { codepoints: [ 9141 ], characters: '⎵' }, + '|': { codepoints: [ 124 ], characters: '|' }, + '⧫': { codepoints: [ 10731 ], characters: '⧫' }, + 'ⅇ': { codepoints: [ 8519 ], characters: 'ⅇ' }, + '≓': { codepoints: [ 8787 ], characters: '≓' }, + '▿': { codepoints: [ 9663 ], characters: '▿' }, + '◃': { codepoints: [ 9667 ], characters: '◃' }, + '⊊︀': { codepoints: [ 8842, 65024 ], characters: '⊊︀' }, + '⊋︀': { codepoints: [ 8843, 65024 ], characters: '⊋︀' }, + '⊖': { codepoints: [ 8854 ], characters: '⊖' }, + '⊗': { codepoints: [ 8855 ], characters: '⊗' }, + '⇌': { codepoints: [ 8652 ], characters: '⇌' }, + '≷': { codepoints: [ 8823 ], characters: '≷' }, + '⌈': { codepoints: [ 8968 ], characters: '⌈' }, + '≶': { codepoints: [ 8822 ], characters: '≶' }, + ' ': { codepoints: [ 8287 ], characters: ' ' }, + '≪̸': { codepoints: [ 8810, 824 ], characters: '≪̸' }, + '⊀': { codepoints: [ 8832 ], characters: '⊀' }, + '⊁': { codepoints: [ 8833 ], characters: '⊁' }, + '⊃⃒': { codepoints: [ 8835, 8402 ], characters: '⊃⃒' }, + '⎴': { codepoints: [ 9140 ], characters: '⎴' }, + '⇀': { codepoints: [ 8640 ], characters: '⇀' }, + '⇛': { codepoints: [ 8667 ], characters: '⇛' }, + '⧴': { codepoints: [ 10740 ], characters: '⧴' }, + '∘': { codepoints: [ 8728 ], characters: '∘' }, + '⊔': { codepoints: [ 8852 ], characters: '⊔' }, + '⊆': { codepoints: [ 8838 ], characters: '⊆' }, + '↕': { codepoints: [ 8597 ], characters: '↕' }, + '⇕': { codepoints: [ 8661 ], characters: '⇕' }, + '∣': { codepoints: [ 8739 ], characters: '∣' }, + '϶': { codepoints: [ 1014 ], characters: '϶' }, + '▪': { codepoints: [ 9642 ], characters: '▪' }, + '⊚': { codepoints: [ 8858 ], characters: '⊚' }, + '⊝': { codepoints: [ 8861 ], characters: '⊝' }, + '⋞': { codepoints: [ 8926 ], characters: '⋞' }, + '⋟': { codepoints: [ 8927 ], characters: '⋟' }, + '♦': { codepoints: [ 9830 ], characters: '♦' }, + '⪕': { codepoints: [ 10901 ], characters: '⪕' }, + 'ℰ': { codepoints: [ 8496 ], characters: 'ℰ' }, + '⇏': { codepoints: [ 8655 ], characters: '⇏' }, + '↛': { codepoints: [ 8603 ], characters: '↛' }, + '≼': { codepoints: [ 8828 ], characters: '≼' }, + '⪹': { codepoints: [ 10937 ], characters: '⪹' }, + 'ℍ': { codepoints: [ 8461 ], characters: 'ℍ' }, + 'ϕ': { codepoints: [ 981 ], characters: 'ϕ' }, + '≽': { codepoints: [ 8829 ], characters: '≽' }, + '⪺': { codepoints: [ 10938 ], characters: '⪺' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + '↕': { codepoints: [ 8597 ], characters: '↕' }, + 'ℬ': { codepoints: [ 8492 ], characters: 'ℬ' }, + '⊕': { codepoints: [ 8853 ], characters: '⊕' }, + '≂': { codepoints: [ 8770 ], characters: '≂' }, + 'ℱ': { codepoints: [ 8497 ], characters: 'ℱ' }, + 'ⅈ': { codepoints: [ 8520 ], characters: 'ⅈ' }, + 'ℒ': { codepoints: [ 8466 ], characters: 'ℒ' }, + '↼': { codepoints: [ 8636 ], characters: '↼' }, + '⇚': { codepoints: [ 8666 ], characters: '⇚' }, + '∉': { codepoints: [ 8713 ], characters: '∉' }, + '≯': { codepoints: [ 8815 ], characters: '≯' }, + '∷': { codepoints: [ 8759 ], characters: '∷' }, + '→': { codepoints: [ 8594 ], characters: '→' }, + '⌋': { codepoints: [ 8971 ], characters: '⌋' }, + '⇒': { codepoints: [ 8658 ], characters: '⇒' }, + '  ': { codepoints: [ 8287, 8202 ], characters: '  ' }, + '≃': { codepoints: [ 8771 ], characters: '≃' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + '⏟': { codepoints: [ 9183 ], characters: '⏟' }, + '⤒': { codepoints: [ 10514 ], characters: '⤒' }, + '↥': { codepoints: [ 8613 ], characters: '↥' }, + '⊛': { codepoints: [ 8859 ], characters: '⊛' }, + '∁': { codepoints: [ 8705 ], characters: '∁' }, + '⋏': { codepoints: [ 8911 ], characters: '⋏' }, + '⪖': { codepoints: [ 10902 ], characters: '⪖' }, + '⪌': { codepoints: [ 10892 ], characters: '⪌' }, + '⪅': { codepoints: [ 10885 ], characters: '⪅' }, + '⪋': { codepoints: [ 10891 ], characters: '⪋' }, + '⎰': { codepoints: [ 9136 ], characters: '⎰' }, + '⟼': { codepoints: [ 10236 ], characters: '⟼' }, + '↧': { codepoints: [ 8615 ], characters: '↧' }, + '↤': { codepoints: [ 8612 ], characters: '↤' }, + '⇍': { codepoints: [ 8653 ], characters: '⇍' }, + '↚': { codepoints: [ 8602 ], characters: '↚' }, + '⫅̸': { codepoints: [ 10949, 824 ], characters: '⫅̸' }, + '⫆̸': { codepoints: [ 10950, 824 ], characters: '⫆̸' }, + '⪷': { codepoints: [ 10935 ], characters: '⪷' }, + '→': { codepoints: [ 8594 ], characters: '→' }, + '⎱': { codepoints: [ 9137 ], characters: '⎱' }, + '⊑': { codepoints: [ 8849 ], characters: '⊑' }, + '⊒': { codepoints: [ 8850 ], characters: '⊒' }, + '⫋': { codepoints: [ 10955 ], characters: '⫋' }, + '⪸': { codepoints: [ 10936 ], characters: '⪸' }, + '⫌': { codepoints: [ 10956 ], characters: '⫌' }, + '⇈': { codepoints: [ 8648 ], characters: '⇈' }, + 'ϵ': { codepoints: [ 1013 ], characters: 'ϵ' }, + '∅': { codepoints: [ 8709 ], characters: '∅' }, + '∖': { codepoints: [ 8726 ], characters: '∖' }, + '·': { codepoints: [ 183 ], characters: '·' }, + '⊙': { codepoints: [ 8857 ], characters: '⊙' }, + '≡': { codepoints: [ 8801 ], characters: '≡' }, + '∐': { codepoints: [ 8720 ], characters: '∐' }, + '¨': { codepoints: [ 168 ], characters: '¨' }, + '↓': { codepoints: [ 8595 ], characters: '↓' }, + '̑': { codepoints: [ 785 ], characters: '̑' }, + '⇓': { codepoints: [ 8659 ], characters: '⇓' }, + '≏': { codepoints: [ 8783 ], characters: '≏' }, + '←': { codepoints: [ 8592 ], characters: '←' }, + '⌊': { codepoints: [ 8970 ], characters: '⌊' }, + '⇐': { codepoints: [ 8656 ], characters: '⇐' }, + '≲': { codepoints: [ 8818 ], characters: '≲' }, + 'ℳ': { codepoints: [ 8499 ], characters: 'ℳ' }, + '∓': { codepoints: [ 8723 ], characters: '∓' }, + '≭': { codepoints: [ 8813 ], characters: '≭' }, + '∄': { codepoints: [ 8708 ], characters: '∄' }, + '⊂⃒': { codepoints: [ 8834, 8402 ], characters: '⊂⃒' }, + '⏞': { codepoints: [ 9182 ], characters: '⏞' }, + '±': { codepoints: [ 177 ], characters: '±' }, + '∴': { codepoints: [ 8756 ], characters: '∴' }, + ' ': { codepoints: [ 8201 ], characters: ' ' }, + '⃛': { codepoints: [ 8411 ], characters: '⃛' }, + '⊎': { codepoints: [ 8846 ], characters: '⊎' }, + '‵': { codepoints: [ 8245 ], characters: '‵' }, + '⋍': { codepoints: [ 8909 ], characters: '⋍' }, + '⨂': { codepoints: [ 10754 ], characters: '⨂' }, + '·': { codepoints: [ 183 ], characters: '·' }, + '✓': { codepoints: [ 10003 ], characters: '✓' }, + 'ℂ': { codepoints: [ 8450 ], characters: 'ℂ' }, + '⊡': { codepoints: [ 8865 ], characters: '⊡' }, + '↓': { codepoints: [ 8595 ], characters: '↓' }, + '⪆': { codepoints: [ 10886 ], characters: '⪆' }, + '⋛': { codepoints: [ 8923 ], characters: '⋛' }, + '≩︀': { codepoints: [ 8809, 65024 ], characters: '≩︀' }, + '♥': { codepoints: [ 9829 ], characters: '♥' }, + '←': { codepoints: [ 8592 ], characters: '←' }, + '⋚': { codepoints: [ 8922 ], characters: '⋚' }, + '≨︀': { codepoints: [ 8808, 65024 ], characters: '≨︀' }, + '⩾̸': { codepoints: [ 10878, 824 ], characters: '⩾̸' }, + '⩽̸': { codepoints: [ 10877, 824 ], characters: '⩽̸' }, + '∦': { codepoints: [ 8742 ], characters: '∦' }, + '∤': { codepoints: [ 8740 ], characters: '∤' }, + '⊈': { codepoints: [ 8840 ], characters: '⊈' }, + '⊉': { codepoints: [ 8841 ], characters: '⊉' }, + '⋔': { codepoints: [ 8916 ], characters: '⋔' }, + 'ℚ': { codepoints: [ 8474 ], characters: 'ℚ' }, + '♠': { codepoints: [ 9824 ], characters: '♠' }, + '⫅': { codepoints: [ 10949 ], characters: '⫅' }, + '⊊': { codepoints: [ 8842 ], characters: '⊊' }, + '⫆': { codepoints: [ 10950 ], characters: '⫆' }, + '⊋': { codepoints: [ 8843 ], characters: '⊋' }, + '∴': { codepoints: [ 8756 ], characters: '∴' }, + '≜': { codepoints: [ 8796 ], characters: '≜' }, + '∝': { codepoints: [ 8733 ], characters: '∝' }, + '⤑': { codepoints: [ 10513 ], characters: '⤑' }, + '≐': { codepoints: [ 8784 ], characters: '≐' }, + '∫': { codepoints: [ 8747 ], characters: '∫' }, + '⪡': { codepoints: [ 10913 ], characters: '⪡' }, + '≠': { codepoints: [ 8800 ], characters: '≠' }, + '≁': { codepoints: [ 8769 ], characters: '≁' }, + '∂': { codepoints: [ 8706 ], characters: '∂' }, + '≺': { codepoints: [ 8826 ], characters: '≺' }, + '⊢': { codepoints: [ 8866 ], characters: '⊢' }, + '≻': { codepoints: [ 8827 ], characters: '≻' }, + '∋': { codepoints: [ 8715 ], characters: '∋' }, + '⊃': { codepoints: [ 8835 ], characters: '⊃' }, + '⥉': { codepoints: [ 10569 ], characters: '⥉' }, + '_': { codepoints: [ 95 ], characters: '_' }, + '⩘': { codepoints: [ 10840 ], characters: '⩘' }, + '⦨': { codepoints: [ 10664 ], characters: '⦨' }, + '⦩': { codepoints: [ 10665 ], characters: '⦩' }, + '⦪': { codepoints: [ 10666 ], characters: '⦪' }, + '⦫': { codepoints: [ 10667 ], characters: '⦫' }, + '⦬': { codepoints: [ 10668 ], characters: '⦬' }, + '⦭': { codepoints: [ 10669 ], characters: '⦭' }, + '⦮': { codepoints: [ 10670 ], characters: '⦮' }, + '⦯': { codepoints: [ 10671 ], characters: '⦯' }, + '⦝': { codepoints: [ 10653 ], characters: '⦝' }, + '≊': { codepoints: [ 8778 ], characters: '≊' }, + '∳': { codepoints: [ 8755 ], characters: '∳' }, + '≌': { codepoints: [ 8780 ], characters: '≌' }, + '⌅': { codepoints: [ 8965 ], characters: '⌅' }, + '⎶': { codepoints: [ 9142 ], characters: '⎶' }, + '⨁': { codepoints: [ 10753 ], characters: '⨁' }, + '⨆': { codepoints: [ 10758 ], characters: '⨆' }, + '⨄': { codepoints: [ 10756 ], characters: '⨄' }, + '⋀': { codepoints: [ 8896 ], characters: '⋀' }, + '⊟': { codepoints: [ 8863 ], characters: '⊟' }, + '⊠': { codepoints: [ 8864 ], characters: '⊠' }, + '⟈': { codepoints: [ 10184 ], characters: '⟈' }, + '⩉': { codepoints: [ 10825 ], characters: '⩉' }, + '®': { codepoints: [ 174 ], characters: '®' }, + 'Ⓢ': { codepoints: [ 9416 ], characters: 'Ⓢ' }, + '⨐': { codepoints: [ 10768 ], characters: '⨐' }, + '♣': { codepoints: [ 9827 ], characters: '♣' }, + '⩈': { codepoints: [ 10824 ], characters: '⩈' }, + '⋎': { codepoints: [ 8910 ], characters: '⋎' }, + '∲': { codepoints: [ 8754 ], characters: '∲' }, + '≑': { codepoints: [ 8785 ], characters: '≑' }, + '∸': { codepoints: [ 8760 ], characters: '∸' }, + '⤐': { codepoints: [ 10512 ], characters: '⤐' }, + '⟿': { codepoints: [ 10239 ], characters: '⟿' }, + '⏧': { codepoints: [ 9191 ], characters: '⏧' }, + '∅': { codepoints: [ 8709 ], characters: '∅' }, + '⧥': { codepoints: [ 10725 ], characters: '⧥' }, + '⨍': { codepoints: [ 10765 ], characters: '⨍' }, + '⩾': { codepoints: [ 10878 ], characters: '⩾' }, + '⪄': { codepoints: [ 10884 ], characters: '⪄' }, + '⪊': { codepoints: [ 10890 ], characters: '⪊' }, + '⤥': { codepoints: [ 10533 ], characters: '⤥' }, + '⤦': { codepoints: [ 10534 ], characters: '⤦' }, + 'ℐ': { codepoints: [ 8464 ], characters: 'ℐ' }, + 'ℑ': { codepoints: [ 8465 ], characters: 'ℑ' }, + '⧝': { codepoints: [ 10717 ], characters: '⧝' }, + 'ℤ': { codepoints: [ 8484 ], characters: 'ℤ' }, + '⊺': { codepoints: [ 8890 ], characters: '⊺' }, + '⨗': { codepoints: [ 10775 ], characters: '⨗' }, + '⦴': { codepoints: [ 10676 ], characters: '⦴' }, + '⥋': { codepoints: [ 10571 ], characters: '⥋' }, + '⩽': { codepoints: [ 10877 ], characters: '⩽' }, + '⪃': { codepoints: [ 10883 ], characters: '⪃' }, + '⌞': { codepoints: [ 8990 ], characters: '⌞' }, + '⪉': { codepoints: [ 10889 ], characters: '⪉' }, + '⌟': { codepoints: [ 8991 ], characters: '⌟' }, + '⥊': { codepoints: [ 10570 ], characters: '⥊' }, + '↥': { codepoints: [ 8613 ], characters: '↥' }, + '⊸': { codepoints: [ 8888 ], characters: '⊸' }, + 'ℕ': { codepoints: [ 8469 ], characters: 'ℕ' }, + '⩭̸': { codepoints: [ 10861, 824 ], characters: '⩭̸' }, + '⋵̸': { codepoints: [ 8949, 824 ], characters: '⋵̸' }, + '⨶': { codepoints: [ 10806 ], characters: '⨶' }, + '∥': { codepoints: [ 8741 ], characters: '∥' }, + '⨣': { codepoints: [ 10787 ], characters: '⨣' }, + '⨕': { codepoints: [ 10773 ], characters: '⨕' }, + '⪵': { codepoints: [ 10933 ], characters: '⪵' }, + '⋨': { codepoints: [ 8936 ], characters: '⋨' }, + '⌮': { codepoints: [ 9006 ], characters: '⌮' }, + '⌒': { codepoints: [ 8978 ], characters: '⌒' }, + '⌓': { codepoints: [ 8979 ], characters: '⌓' }, + '⦳': { codepoints: [ 10675 ], characters: '⦳' }, + 'ℜ': { codepoints: [ 8476 ], characters: 'ℜ' }, + '⨒': { codepoints: [ 10770 ], characters: '⨒' }, + '⧎': { codepoints: [ 10702 ], characters: '⧎' }, + '⨓': { codepoints: [ 10771 ], characters: '⨓' }, + '∖': { codepoints: [ 8726 ], characters: '∖' }, + '∣': { codepoints: [ 8739 ], characters: '∣' }, + '⧤': { codepoints: [ 10724 ], characters: '⧤' }, + '⊏': { codepoints: [ 8847 ], characters: '⊏' }, + '⊐': { codepoints: [ 8848 ], characters: '⊐' }, + '⊆': { codepoints: [ 8838 ], characters: '⊆' }, + '⪶': { codepoints: [ 10934 ], characters: '⪶' }, + '⋩': { codepoints: [ 8937 ], characters: '⋩' }, + '⊇': { codepoints: [ 8839 ], characters: '⊇' }, + 'ϑ': { codepoints: [ 977 ], characters: 'ϑ' }, + '∼': { codepoints: [ 8764 ], characters: '∼' }, + '⨱': { codepoints: [ 10801 ], characters: '⨱' }, + '▵': { codepoints: [ 9653 ], characters: '▵' }, + '⨺': { codepoints: [ 10810 ], characters: '⨺' }, + '⏢': { codepoints: [ 9186 ], characters: '⏢' }, + '⌜': { codepoints: [ 8988 ], characters: '⌜' }, + '⌝': { codepoints: [ 8989 ], characters: '⌝' }, + 'ϰ': { codepoints: [ 1008 ], characters: 'ϰ' }, + 'ς': { codepoints: [ 962 ], characters: 'ς' }, + 'ϑ': { codepoints: [ 977 ], characters: 'ϑ' }, + '∵': { codepoints: [ 8757 ], characters: '∵' }, + 'ℭ': { codepoints: [ 8493 ], characters: 'ℭ' }, + '∰': { codepoints: [ 8752 ], characters: '∰' }, + '¸': { codepoints: [ 184 ], characters: '¸' }, + '⋄': { codepoints: [ 8900 ], characters: '⋄' }, + '⊤': { codepoints: [ 8868 ], characters: '⊤' }, + '∈': { codepoints: [ 8712 ], characters: '∈' }, + 'Ε': { codepoints: [ 917 ], characters: 'Ε' }, + '⇒': { codepoints: [ 8658 ], characters: '⇒' }, + '⊣': { codepoints: [ 8867 ], characters: '⊣' }, + ' ': { codepoints: [ 10 ], characters: '\n' }, + '⁠': { codepoints: [ 8288 ], characters: '⁠' }, + '≮': { codepoints: [ 8814 ], characters: '≮' }, + 'Ο': { codepoints: [ 927 ], characters: 'Ο' }, + '‾': { codepoints: [ 8254 ], characters: '‾' }, + '∏': { codepoints: [ 8719 ], characters: '∏' }, + '↑': { codepoints: [ 8593 ], characters: '↑' }, + '⇑': { codepoints: [ 8657 ], characters: '⇑' }, + 'Υ': { codepoints: [ 933 ], characters: 'Υ' }, + 'ℵ': { codepoints: [ 8501 ], characters: 'ℵ' }, + '⊾': { codepoints: [ 8894 ], characters: '⊾' }, + '⍼': { codepoints: [ 9084 ], characters: '⍼' }, + '≍': { codepoints: [ 8781 ], characters: '≍' }, + '∽': { codepoints: [ 8765 ], characters: '∽' }, + '∵': { codepoints: [ 8757 ], characters: '∵' }, + '⦰': { codepoints: [ 10672 ], characters: '⦰' }, + '≬': { codepoints: [ 8812 ], characters: '≬' }, + '◯': { codepoints: [ 9711 ], characters: '◯' }, + '⨀': { codepoints: [ 10752 ], characters: '⨀' }, + '★': { codepoints: [ 9733 ], characters: '★' }, + '≡⃥': { codepoints: [ 8801, 8421 ], characters: '≡⃥' }, + '⊞': { codepoints: [ 8862 ], characters: '⊞' }, + '⩐': { codepoints: [ 10832 ], characters: '⩐' }, + '⦲': { codepoints: [ 10674 ], characters: '⦲' }, + '⧂': { codepoints: [ 10690 ], characters: '⧂' }, + '≔': { codepoints: [ 8788 ], characters: '≔' }, + '⩭': { codepoints: [ 10861 ], characters: '⩭' }, + '⤸': { codepoints: [ 10552 ], characters: '⤸' }, + '⤵': { codepoints: [ 10549 ], characters: '⤵' }, + '⤽': { codepoints: [ 10557 ], characters: '⤽' }, + '⤼': { codepoints: [ 10556 ], characters: '⤼' }, + '⤏': { codepoints: [ 10511 ], characters: '⤏' }, + '‡': { codepoints: [ 8225 ], characters: '‡' }, + '⩷': { codepoints: [ 10871 ], characters: '⩷' }, + '⦱': { codepoints: [ 10673 ], characters: '⦱' }, + '⋄': { codepoints: [ 8900 ], characters: '⋄' }, + 'ϝ': { codepoints: [ 989 ], characters: 'ϝ' }, + '∔': { codepoints: [ 8724 ], characters: '∔' }, + '⦦': { codepoints: [ 10662 ], characters: '⦦' }, + 'ε': { codepoints: [ 949 ], characters: 'ε' }, + '≕': { codepoints: [ 8789 ], characters: '≕' }, + '⩸': { codepoints: [ 10872 ], characters: '⩸' }, + '⪂': { codepoints: [ 10882 ], characters: '⪂' }, + '⩼': { codepoints: [ 10876 ], characters: '⩼' }, + '≷': { codepoints: [ 8823 ], characters: '≷' }, + '⥈': { codepoints: [ 10568 ], characters: '⥈' }, + '⨼': { codepoints: [ 10812 ], characters: '⨼' }, + '⋵': { codepoints: [ 8949 ], characters: '⋵' }, + '⤟': { codepoints: [ 10527 ], characters: '⤟' }, + '⥳': { codepoints: [ 10611 ], characters: '⥳' }, + '⦏': { codepoints: [ 10639 ], characters: '⦏' }, + '⦍': { codepoints: [ 10637 ], characters: '⦍' }, + '⥧': { codepoints: [ 10599 ], characters: '⥧' }, + '⪁': { codepoints: [ 10881 ], characters: '⪁' }, + '⋖': { codepoints: [ 8918 ], characters: '⋖' }, + '≶': { codepoints: [ 8822 ], characters: '≶' }, + '≲': { codepoints: [ 8818 ], characters: '≲' }, + '⨴': { codepoints: [ 10804 ], characters: '⨴' }, + '◊': { codepoints: [ 9674 ], characters: '◊' }, + '⩻': { codepoints: [ 10875 ], characters: '⩻' }, + '⥦': { codepoints: [ 10598 ], characters: '⥦' }, + '✠': { codepoints: [ 10016 ], characters: '✠' }, + '⨪': { codepoints: [ 10794 ], characters: '⨪' }, + '≉': { codepoints: [ 8777 ], characters: '≉' }, + '♮': { codepoints: [ 9838 ], characters: '♮' }, + '↗': { codepoints: [ 8599 ], characters: '↗' }, + '∄': { codepoints: [ 8708 ], characters: '∄' }, + '∉': { codepoints: [ 8713 ], characters: '∉' }, + '⋷': { codepoints: [ 8951 ], characters: '⋷' }, + '⋶': { codepoints: [ 8950 ], characters: '⋶' }, + '∌': { codepoints: [ 8716 ], characters: '∌' }, + '⋾': { codepoints: [ 8958 ], characters: '⋾' }, + '⋽': { codepoints: [ 8957 ], characters: '⋽' }, + '⨔': { codepoints: [ 10772 ], characters: '⨔' }, + '⪯̸': { codepoints: [ 10927, 824 ], characters: '⪯̸' }, + '⋢': { codepoints: [ 8930 ], characters: '⋢' }, + '⋣': { codepoints: [ 8931 ], characters: '⋣' }, + '⊂⃒': { codepoints: [ 8834, 8402 ], characters: '⊂⃒' }, + '⪰̸': { codepoints: [ 10928, 824 ], characters: '⪰̸' }, + '⊃⃒': { codepoints: [ 8835, 8402 ], characters: '⊃⃒' }, + '⧞': { codepoints: [ 10718 ], characters: '⧞' }, + '⊴⃒': { codepoints: [ 8884, 8402 ], characters: '⊴⃒' }, + '⊵⃒': { codepoints: [ 8885, 8402 ], characters: '⊵⃒' }, + '↖': { codepoints: [ 8598 ], characters: '↖' }, + '⦻': { codepoints: [ 10683 ], characters: '⦻' }, + 'ο': { codepoints: [ 959 ], characters: 'ο' }, + 'ℴ': { codepoints: [ 8500 ], characters: 'ℴ' }, + '⩗': { codepoints: [ 10839 ], characters: '⩗' }, + '‱': { codepoints: [ 8241 ], characters: '‱' }, + 'ℎ': { codepoints: [ 8462 ], characters: 'ℎ' }, + '⨢': { codepoints: [ 10786 ], characters: '⨢' }, + '⨦': { codepoints: [ 10790 ], characters: '⨦' }, + '⨧': { codepoints: [ 10791 ], characters: '⨧' }, + '≾': { codepoints: [ 8830 ], characters: '≾' }, + '⨖': { codepoints: [ 10774 ], characters: '⨖' }, + '≟': { codepoints: [ 8799 ], characters: '≟' }, + '⤠': { codepoints: [ 10528 ], characters: '⤠' }, + '⥴': { codepoints: [ 10612 ], characters: '⥴' }, + '⦎': { codepoints: [ 10638 ], characters: '⦎' }, + '⦐': { codepoints: [ 10640 ], characters: '⦐' }, + '⥩': { codepoints: [ 10601 ], characters: '⥩' }, + 'ℛ': { codepoints: [ 8475 ], characters: 'ℛ' }, + '⨵': { codepoints: [ 10805 ], characters: '⨵' }, + '⥨': { codepoints: [ 10600 ], characters: '⥨' }, + '↘': { codepoints: [ 8600 ], characters: '↘' }, + '⨤': { codepoints: [ 10788 ], characters: '⨤' }, + '⥲': { codepoints: [ 10610 ], characters: '⥲' }, + '⫃': { codepoints: [ 10947 ], characters: '⫃' }, + '⫁': { codepoints: [ 10945 ], characters: '⫁' }, + '⪿': { codepoints: [ 10943 ], characters: '⪿' }, + '⥹': { codepoints: [ 10617 ], characters: '⥹' }, + '≿': { codepoints: [ 8831 ], characters: '≿' }, + '⫘': { codepoints: [ 10968 ], characters: '⫘' }, + '⫄': { codepoints: [ 10948 ], characters: '⫄' }, + '⟉': { codepoints: [ 10185 ], characters: '⟉' }, + '⫗': { codepoints: [ 10967 ], characters: '⫗' }, + '⥻': { codepoints: [ 10619 ], characters: '⥻' }, + '⫂': { codepoints: [ 10946 ], characters: '⫂' }, + '⫀': { codepoints: [ 10944 ], characters: '⫀' }, + '↙': { codepoints: [ 8601 ], characters: '↙' }, + '⫚': { codepoints: [ 10970 ], characters: '⫚' }, + '⨹': { codepoints: [ 10809 ], characters: '⨹' }, + '⨻': { codepoints: [ 10811 ], characters: '⨻' }, + '↑': { codepoints: [ 8593 ], characters: '↑' }, + 'υ': { codepoints: [ 965 ], characters: 'υ' }, + '⦧': { codepoints: [ 10663 ], characters: '⦧' }, + '⦚': { codepoints: [ 10650 ], characters: '⦚' }, + '⇝': { codepoints: [ 8669 ], characters: '⇝' }, + 'Á': { codepoints: [ 193 ], characters: 'Á' }, + 'Ă': { codepoints: [ 258 ], characters: 'Ă' }, + 'À': { codepoints: [ 192 ], characters: 'À' }, + '≔': { codepoints: [ 8788 ], characters: '≔' }, + 'Ã': { codepoints: [ 195 ], characters: 'Ã' }, + '⌆': { codepoints: [ 8966 ], characters: '⌆' }, + '≎': { codepoints: [ 8782 ], characters: '≎' }, + 'Ć': { codepoints: [ 262 ], characters: 'Ć' }, + 'Č': { codepoints: [ 268 ], characters: 'Č' }, + 'Ç': { codepoints: [ 199 ], characters: 'Ç' }, + '⩴': { codepoints: [ 10868 ], characters: '⩴' }, + '∯': { codepoints: [ 8751 ], characters: '∯' }, + '≍': { codepoints: [ 8781 ], characters: '≍' }, + '‡': { codepoints: [ 8225 ], characters: '‡' }, + 'Ď': { codepoints: [ 270 ], characters: 'Ď' }, + '⃜': { codepoints: [ 8412 ], characters: '⃜' }, + 'Đ': { codepoints: [ 272 ], characters: 'Đ' }, + 'É': { codepoints: [ 201 ], characters: 'É' }, + 'Ě': { codepoints: [ 282 ], characters: 'Ě' }, + 'È': { codepoints: [ 200 ], characters: 'È' }, + '∃': { codepoints: [ 8707 ], characters: '∃' }, + '∀': { codepoints: [ 8704 ], characters: '∀' }, + 'Ϝ': { codepoints: [ 988 ], characters: 'Ϝ' }, + 'Ğ': { codepoints: [ 286 ], characters: 'Ğ' }, + 'Ģ': { codepoints: [ 290 ], characters: 'Ģ' }, + 'Ъ': { codepoints: [ 1066 ], characters: 'Ъ' }, + 'Ħ': { codepoints: [ 294 ], characters: 'Ħ' }, + 'Í': { codepoints: [ 205 ], characters: 'Í' }, + 'Ì': { codepoints: [ 204 ], characters: 'Ì' }, + 'Ĩ': { codepoints: [ 296 ], characters: 'Ĩ' }, + 'Ј': { codepoints: [ 1032 ], characters: 'Ј' }, + 'Ķ': { codepoints: [ 310 ], characters: 'Ķ' }, + 'Ĺ': { codepoints: [ 313 ], characters: 'Ĺ' }, + 'Λ': { codepoints: [ 923 ], characters: 'Λ' }, + 'Ľ': { codepoints: [ 317 ], characters: 'Ľ' }, + 'Ļ': { codepoints: [ 315 ], characters: 'Ļ' }, + 'Ŀ': { codepoints: [ 319 ], characters: 'Ŀ' }, + 'Ł': { codepoints: [ 321 ], characters: 'Ł' }, + 'Ń': { codepoints: [ 323 ], characters: 'Ń' }, + 'Ň': { codepoints: [ 327 ], characters: 'Ň' }, + 'Ņ': { codepoints: [ 325 ], characters: 'Ņ' }, + 'Ñ': { codepoints: [ 209 ], characters: 'Ñ' }, + 'Ó': { codepoints: [ 211 ], characters: 'Ó' }, + 'Ő': { codepoints: [ 336 ], characters: 'Ő' }, + 'Ò': { codepoints: [ 210 ], characters: 'Ò' }, + 'Ø': { codepoints: [ 216 ], characters: 'Ø' }, + 'Õ': { codepoints: [ 213 ], characters: 'Õ' }, + '⨷': { codepoints: [ 10807 ], characters: '⨷' }, + 'Ŕ': { codepoints: [ 340 ], characters: 'Ŕ' }, + '⤖': { codepoints: [ 10518 ], characters: '⤖' }, + 'Ř': { codepoints: [ 344 ], characters: 'Ř' }, + 'Ŗ': { codepoints: [ 342 ], characters: 'Ŗ' }, + 'Щ': { codepoints: [ 1065 ], characters: 'Щ' }, + 'Ь': { codepoints: [ 1068 ], characters: 'Ь' }, + 'Ś': { codepoints: [ 346 ], characters: 'Ś' }, + 'Š': { codepoints: [ 352 ], characters: 'Š' }, + 'Ş': { codepoints: [ 350 ], characters: 'Ş' }, + '□': { codepoints: [ 9633 ], characters: '□' }, + '⋐': { codepoints: [ 8912 ], characters: '⋐' }, + '⋑': { codepoints: [ 8913 ], characters: '⋑' }, + 'Ť': { codepoints: [ 356 ], characters: 'Ť' }, + 'Ţ': { codepoints: [ 354 ], characters: 'Ţ' }, + 'Ŧ': { codepoints: [ 358 ], characters: 'Ŧ' }, + 'Ú': { codepoints: [ 218 ], characters: 'Ú' }, + 'Ŭ': { codepoints: [ 364 ], characters: 'Ŭ' }, + 'Ű': { codepoints: [ 368 ], characters: 'Ű' }, + 'Ù': { codepoints: [ 217 ], characters: 'Ù' }, + 'Ũ': { codepoints: [ 360 ], characters: 'Ũ' }, + '⫦': { codepoints: [ 10982 ], characters: '⫦' }, + '‖': { codepoints: [ 8214 ], characters: '‖' }, + '⊪': { codepoints: [ 8874 ], characters: '⊪' }, + 'Ý': { codepoints: [ 221 ], characters: 'Ý' }, + 'Ź': { codepoints: [ 377 ], characters: 'Ź' }, + 'Ž': { codepoints: [ 381 ], characters: 'Ž' }, + 'á': { codepoints: [ 225 ], characters: 'á' }, + 'ă': { codepoints: [ 259 ], characters: 'ă' }, + 'à': { codepoints: [ 224 ], characters: 'à' }, + '⩕': { codepoints: [ 10837 ], characters: '⩕' }, + '∡': { codepoints: [ 8737 ], characters: '∡' }, + '∢': { codepoints: [ 8738 ], characters: '∢' }, + '⩯': { codepoints: [ 10863 ], characters: '⩯' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + 'ã': { codepoints: [ 227 ], characters: 'ã' }, + '⊽': { codepoints: [ 8893 ], characters: '⊽' }, + '⌅': { codepoints: [ 8965 ], characters: '⌅' }, + '∵': { codepoints: [ 8757 ], characters: '∵' }, + 'ℬ': { codepoints: [ 8492 ], characters: 'ℬ' }, + '⋂': { codepoints: [ 8898 ], characters: '⋂' }, + '⋃': { codepoints: [ 8899 ], characters: '⋃' }, + '⋁': { codepoints: [ 8897 ], characters: '⋁' }, + '⤍': { codepoints: [ 10509 ], characters: '⤍' }, + '⊥': { codepoints: [ 8869 ], characters: '⊥' }, + '⋈': { codepoints: [ 8904 ], characters: '⋈' }, + '⧉': { codepoints: [ 10697 ], characters: '⧉' }, + '‵': { codepoints: [ 8245 ], characters: '‵' }, + '¦': { codepoints: [ 166 ], characters: '¦' }, + '•': { codepoints: [ 8226 ], characters: '•' }, + '≏': { codepoints: [ 8783 ], characters: '≏' }, + 'ć': { codepoints: [ 263 ], characters: 'ć' }, + '⩄': { codepoints: [ 10820 ], characters: '⩄' }, + '⩋': { codepoints: [ 10827 ], characters: '⩋' }, + '⩇': { codepoints: [ 10823 ], characters: '⩇' }, + '⩀': { codepoints: [ 10816 ], characters: '⩀' }, + 'č': { codepoints: [ 269 ], characters: 'č' }, + 'ç': { codepoints: [ 231 ], characters: 'ç' }, + '≗': { codepoints: [ 8791 ], characters: '≗' }, + '⫯': { codepoints: [ 10991 ], characters: '⫯' }, + '≔': { codepoints: [ 8788 ], characters: '≔' }, + '@': { codepoints: [ 64 ], characters: '@' }, + '∘': { codepoints: [ 8728 ], characters: '∘' }, + '∮': { codepoints: [ 8750 ], characters: '∮' }, + '∐': { codepoints: [ 8720 ], characters: '∐' }, + '℗': { codepoints: [ 8471 ], characters: '℗' }, + '↶': { codepoints: [ 8630 ], characters: '↶' }, + '⩆': { codepoints: [ 10822 ], characters: '⩆' }, + '⩊': { codepoints: [ 10826 ], characters: '⩊' }, + '⊍': { codepoints: [ 8845 ], characters: '⊍' }, + '↷': { codepoints: [ 8631 ], characters: '↷' }, + '¤': { codepoints: [ 164 ], characters: '¤' }, + '⌭': { codepoints: [ 9005 ], characters: '⌭' }, + '†': { codepoints: [ 8224 ], characters: '†' }, + 'ℸ': { codepoints: [ 8504 ], characters: 'ℸ' }, + 'ď': { codepoints: [ 271 ], characters: 'ď' }, + '⥿': { codepoints: [ 10623 ], characters: '⥿' }, + '÷': { codepoints: [ 247 ], characters: '÷' }, + '⋇': { codepoints: [ 8903 ], characters: '⋇' }, + '⌞': { codepoints: [ 8990 ], characters: '⌞' }, + '⌍': { codepoints: [ 8973 ], characters: '⌍' }, + '$': { codepoints: [ 36 ], characters: '$' }, + '⌟': { codepoints: [ 8991 ], characters: '⌟' }, + '⌌': { codepoints: [ 8972 ], characters: '⌌' }, + 'đ': { codepoints: [ 273 ], characters: 'đ' }, + 'é': { codepoints: [ 233 ], characters: 'é' }, + '⩮': { codepoints: [ 10862 ], characters: '⩮' }, + 'ě': { codepoints: [ 283 ], characters: 'ě' }, + '≕': { codepoints: [ 8789 ], characters: '≕' }, + 'è': { codepoints: [ 232 ], characters: 'è' }, + '⪘': { codepoints: [ 10904 ], characters: '⪘' }, + '⪗': { codepoints: [ 10903 ], characters: '⪗' }, + '∅': { codepoints: [ 8709 ], characters: '∅' }, + ' ': { codepoints: [ 8196 ], characters: ' ' }, + ' ': { codepoints: [ 8197 ], characters: ' ' }, + '⧣': { codepoints: [ 10723 ], characters: '⧣' }, + '≖': { codepoints: [ 8790 ], characters: '≖' }, + '=': { codepoints: [ 61 ], characters: '=' }, + '≟': { codepoints: [ 8799 ], characters: '≟' }, + '♀': { codepoints: [ 9792 ], characters: '♀' }, + 'ffi': { codepoints: [ 64259 ], characters: 'ffi' }, + 'ffl': { codepoints: [ 64260 ], characters: 'ffl' }, + '∀': { codepoints: [ 8704 ], characters: '∀' }, + '½': { codepoints: [ 189 ], characters: '½' }, + '⅓': { codepoints: [ 8531 ], characters: '⅓' }, + '¼': { codepoints: [ 188 ], characters: '¼' }, + '⅕': { codepoints: [ 8533 ], characters: '⅕' }, + '⅙': { codepoints: [ 8537 ], characters: '⅙' }, + '⅛': { codepoints: [ 8539 ], characters: '⅛' }, + '⅔': { codepoints: [ 8532 ], characters: '⅔' }, + '⅖': { codepoints: [ 8534 ], characters: '⅖' }, + '¾': { codepoints: [ 190 ], characters: '¾' }, + '⅗': { codepoints: [ 8535 ], characters: '⅗' }, + '⅜': { codepoints: [ 8540 ], characters: '⅜' }, + '⅘': { codepoints: [ 8536 ], characters: '⅘' }, + '⅚': { codepoints: [ 8538 ], characters: '⅚' }, + '⅝': { codepoints: [ 8541 ], characters: '⅝' }, + '⅞': { codepoints: [ 8542 ], characters: '⅞' }, + 'ǵ': { codepoints: [ 501 ], characters: 'ǵ' }, + 'ϝ': { codepoints: [ 989 ], characters: 'ϝ' }, + 'ğ': { codepoints: [ 287 ], characters: 'ğ' }, + '⪀': { codepoints: [ 10880 ], characters: '⪀' }, + '⪔': { codepoints: [ 10900 ], characters: '⪔' }, + '⦕': { codepoints: [ 10645 ], characters: '⦕' }, + '⥸': { codepoints: [ 10616 ], characters: '⥸' }, + '⋗': { codepoints: [ 8919 ], characters: '⋗' }, + '≳': { codepoints: [ 8819 ], characters: '≳' }, + ' ': { codepoints: [ 8202 ], characters: ' ' }, + 'ℋ': { codepoints: [ 8459 ], characters: 'ℋ' }, + 'ъ': { codepoints: [ 1098 ], characters: 'ъ' }, + '♥': { codepoints: [ 9829 ], characters: '♥' }, + '…': { codepoints: [ 8230 ], characters: '…' }, + '⊹': { codepoints: [ 8889 ], characters: '⊹' }, + '∻': { codepoints: [ 8763 ], characters: '∻' }, + '―': { codepoints: [ 8213 ], characters: '―' }, + 'ℏ': { codepoints: [ 8463 ], characters: 'ℏ' }, + 'ħ': { codepoints: [ 295 ], characters: 'ħ' }, + '⁃': { codepoints: [ 8259 ], characters: '⁃' }, + '‐': { codepoints: [ 8208 ], characters: '‐' }, + 'í': { codepoints: [ 237 ], characters: 'í' }, + 'ì': { codepoints: [ 236 ], characters: 'ì' }, + '⨌': { codepoints: [ 10764 ], characters: '⨌' }, + '⧜': { codepoints: [ 10716 ], characters: '⧜' }, + '℅': { codepoints: [ 8453 ], characters: '℅' }, + 'ı': { codepoints: [ 305 ], characters: 'ı' }, + '⊺': { codepoints: [ 8890 ], characters: '⊺' }, + '¿': { codepoints: [ 191 ], characters: '¿' }, + '⋳': { codepoints: [ 8947 ], characters: '⋳' }, + 'ĩ': { codepoints: [ 297 ], characters: 'ĩ' }, + 'ј': { codepoints: [ 1112 ], characters: 'ј' }, + 'ϰ': { codepoints: [ 1008 ], characters: 'ϰ' }, + 'ķ': { codepoints: [ 311 ], characters: 'ķ' }, + 'ĸ': { codepoints: [ 312 ], characters: 'ĸ' }, + '⤛': { codepoints: [ 10523 ], characters: '⤛' }, + 'ĺ': { codepoints: [ 314 ], characters: 'ĺ' }, + 'ℒ': { codepoints: [ 8466 ], characters: 'ℒ' }, + 'λ': { codepoints: [ 955 ], characters: 'λ' }, + '⟨': { codepoints: [ 10216 ], characters: '⟨' }, + '⤝': { codepoints: [ 10525 ], characters: '⤝' }, + '↩': { codepoints: [ 8617 ], characters: '↩' }, + '↫': { codepoints: [ 8619 ], characters: '↫' }, + '⤹': { codepoints: [ 10553 ], characters: '⤹' }, + '↢': { codepoints: [ 8610 ], characters: '↢' }, + '⤙': { codepoints: [ 10521 ], characters: '⤙' }, + '{': { codepoints: [ 123 ], characters: '{' }, + '[': { codepoints: [ 91 ], characters: '' }, + 'ľ': { codepoints: [ 318 ], characters: 'ľ' }, + 'ļ': { codepoints: [ 316 ], characters: 'ļ' }, + '„': { codepoints: [ 8222 ], characters: '„' }, + '⩿': { codepoints: [ 10879 ], characters: '⩿' }, + '⪓': { codepoints: [ 10899 ], characters: '⪓' }, + '⥼': { codepoints: [ 10620 ], characters: '⥼' }, + '⌊': { codepoints: [ 8970 ], characters: '⌊' }, + '⥪': { codepoints: [ 10602 ], characters: '⥪' }, + '⥫': { codepoints: [ 10603 ], characters: '⥫' }, + 'ŀ': { codepoints: [ 320 ], characters: 'ŀ' }, + '⎰': { codepoints: [ 9136 ], characters: '⎰' }, + '⨭': { codepoints: [ 10797 ], characters: '⨭' }, + '∗': { codepoints: [ 8727 ], characters: '∗' }, + '_': { codepoints: [ 95 ], characters: '_' }, + '⦓': { codepoints: [ 10643 ], characters: '⦓' }, + '⥭': { codepoints: [ 10605 ], characters: '⥭' }, + '‹': { codepoints: [ 8249 ], characters: '‹' }, + '‚': { codepoints: [ 8218 ], characters: '‚' }, + 'ł': { codepoints: [ 322 ], characters: 'ł' }, + '⋋': { codepoints: [ 8907 ], characters: '⋋' }, + '⋉': { codepoints: [ 8905 ], characters: '⋉' }, + '⥶': { codepoints: [ 10614 ], characters: '⥶' }, + '⦖': { codepoints: [ 10646 ], characters: '⦖' }, + '↦': { codepoints: [ 8614 ], characters: '↦' }, + '▮': { codepoints: [ 9646 ], characters: '▮' }, + '⨩': { codepoints: [ 10793 ], characters: '⨩' }, + '*': { codepoints: [ 42 ], characters: '*' }, + '⫰': { codepoints: [ 10992 ], characters: '⫰' }, + '·': { codepoints: [ 183 ], characters: '·' }, + '⊟': { codepoints: [ 8863 ], characters: '⊟' }, + '∸': { codepoints: [ 8760 ], characters: '∸' }, + '∓': { codepoints: [ 8723 ], characters: '∓' }, + '⊧': { codepoints: [ 8871 ], characters: '⊧' }, + '∾': { codepoints: [ 8766 ], characters: '∾' }, + '⊯': { codepoints: [ 8879 ], characters: '⊯' }, + '⊮': { codepoints: [ 8878 ], characters: '⊮' }, + 'ń': { codepoints: [ 324 ], characters: 'ń' }, + '≏̸': { codepoints: [ 8783, 824 ], characters: '≏̸' }, + 'ň': { codepoints: [ 328 ], characters: 'ň' }, + 'ņ': { codepoints: [ 326 ], characters: 'ņ' }, + '⤤': { codepoints: [ 10532 ], characters: '⤤' }, + '≢': { codepoints: [ 8802 ], characters: '≢' }, + '⤨': { codepoints: [ 10536 ], characters: '⤨' }, + '∄': { codepoints: [ 8708 ], characters: '∄' }, + '⋬': { codepoints: [ 8940 ], characters: '⋬' }, + '⋹̸': { codepoints: [ 8953, 824 ], characters: '⋹̸' }, + '⫽⃥': { codepoints: [ 11005, 8421 ], characters: '⫽⃥' }, + '⋠': { codepoints: [ 8928 ], characters: '⋠' }, + '⤳̸': { codepoints: [ 10547, 824 ], characters: '⤳̸' }, + '↝̸': { codepoints: [ 8605, 824 ], characters: '↝̸' }, + '⋭': { codepoints: [ 8941 ], characters: '⋭' }, + '⋡': { codepoints: [ 8929 ], characters: '⋡' }, + '≄': { codepoints: [ 8772 ], characters: '≄' }, + 'ñ': { codepoints: [ 241 ], characters: 'ñ' }, + '№': { codepoints: [ 8470 ], characters: '№' }, + '⊭': { codepoints: [ 8877 ], characters: '⊭' }, + '⤄': { codepoints: [ 10500 ], characters: '⤄' }, + '⊬': { codepoints: [ 8876 ], characters: '⊬' }, + '⤂': { codepoints: [ 10498 ], characters: '⤂' }, + '⤃': { codepoints: [ 10499 ], characters: '⤃' }, + '⤣': { codepoints: [ 10531 ], characters: '⤣' }, + '⤧': { codepoints: [ 10535 ], characters: '⤧' }, + 'ó': { codepoints: [ 243 ], characters: 'ó' }, + 'ő': { codepoints: [ 337 ], characters: 'ő' }, + '⦼': { codepoints: [ 10684 ], characters: '⦼' }, + 'ò': { codepoints: [ 242 ], characters: 'ò' }, + '⊖': { codepoints: [ 8854 ], characters: '⊖' }, + '⊶': { codepoints: [ 8886 ], characters: '⊶' }, + 'ø': { codepoints: [ 248 ], characters: 'ø' }, + 'õ': { codepoints: [ 245 ], characters: 'õ' }, + '⊗': { codepoints: [ 8855 ], characters: '⊗' }, + '⫳': { codepoints: [ 10995 ], characters: '⫳' }, + '%': { codepoints: [ 37 ], characters: '%' }, + '.': { codepoints: [ 46 ], characters: '.' }, + '‰': { codepoints: [ 8240 ], characters: '‰' }, + 'ℳ': { codepoints: [ 8499 ], characters: 'ℳ' }, + 'ℏ': { codepoints: [ 8463 ], characters: 'ℏ' }, + 'ℏ': { codepoints: [ 8463 ], characters: 'ℏ' }, + '∔': { codepoints: [ 8724 ], characters: '∔' }, + '⨥': { codepoints: [ 10789 ], characters: '⨥' }, + '±': { codepoints: [ 177 ], characters: '±' }, + '⪯': { codepoints: [ 10927 ], characters: '⪯' }, + 'ℙ': { codepoints: [ 8473 ], characters: 'ℙ' }, + '⋨': { codepoints: [ 8936 ], characters: '⋨' }, + '∝': { codepoints: [ 8733 ], characters: '∝' }, + '⊰': { codepoints: [ 8880 ], characters: '⊰' }, + ' ': { codepoints: [ 8200 ], characters: ' ' }, + '⁗': { codepoints: [ 8279 ], characters: '⁗' }, + '⤜': { codepoints: [ 10524 ], characters: '⤜' }, + 'ŕ': { codepoints: [ 341 ], characters: 'ŕ' }, + '⟩': { codepoints: [ 10217 ], characters: '⟩' }, + '⥵': { codepoints: [ 10613 ], characters: '⥵' }, + '⤞': { codepoints: [ 10526 ], characters: '⤞' }, + '↪': { codepoints: [ 8618 ], characters: '↪' }, + '↬': { codepoints: [ 8620 ], characters: '↬' }, + '⥅': { codepoints: [ 10565 ], characters: '⥅' }, + '↣': { codepoints: [ 8611 ], characters: '↣' }, + '⤚': { codepoints: [ 10522 ], characters: '⤚' }, + '}': { codepoints: [ 125 ], characters: '}' }, + ']': { codepoints: [ 93 ], characters: ']' }, + 'ř': { codepoints: [ 345 ], characters: 'ř' }, + 'ŗ': { codepoints: [ 343 ], characters: 'ŗ' }, + '”': { codepoints: [ 8221 ], characters: '”' }, + '⥽': { codepoints: [ 10621 ], characters: '⥽' }, + '⌋': { codepoints: [ 8971 ], characters: '⌋' }, + '⥬': { codepoints: [ 10604 ], characters: '⥬' }, + '⎱': { codepoints: [ 9137 ], characters: '⎱' }, + '⨮': { codepoints: [ 10798 ], characters: '⨮' }, + '⦔': { codepoints: [ 10644 ], characters: '⦔' }, + '›': { codepoints: [ 8250 ], characters: '›' }, + '’': { codepoints: [ 8217 ], characters: '’' }, + '⋌': { codepoints: [ 8908 ], characters: '⋌' }, + '⋊': { codepoints: [ 8906 ], characters: '⋊' }, + 'ś': { codepoints: [ 347 ], characters: 'ś' }, + 'š': { codepoints: [ 353 ], characters: 'š' }, + 'ş': { codepoints: [ 351 ], characters: 'ş' }, + '⋩': { codepoints: [ 8937 ], characters: '⋩' }, + '⤥': { codepoints: [ 10533 ], characters: '⤥' }, + '⤩': { codepoints: [ 10537 ], characters: '⤩' }, + '⌢': { codepoints: [ 8994 ], characters: '⌢' }, + 'щ': { codepoints: [ 1097 ], characters: 'щ' }, + 'ς': { codepoints: [ 962 ], characters: 'ς' }, + 'ς': { codepoints: [ 962 ], characters: 'ς' }, + '⩪': { codepoints: [ 10858 ], characters: '⩪' }, + '⨳': { codepoints: [ 10803 ], characters: '⨳' }, + 'ь': { codepoints: [ 1100 ], characters: 'ь' }, + '⌿': { codepoints: [ 9023 ], characters: '⌿' }, + '♠': { codepoints: [ 9824 ], characters: '♠' }, + '⊓︀': { codepoints: [ 8851, 65024 ], characters: '⊓︀' }, + '⊔︀': { codepoints: [ 8852, 65024 ], characters: '⊔︀' }, + '⊑': { codepoints: [ 8849 ], characters: '⊑' }, + '⊒': { codepoints: [ 8850 ], characters: '⊒' }, + '□': { codepoints: [ 9633 ], characters: '□' }, + '▪': { codepoints: [ 9642 ], characters: '▪' }, + '∖': { codepoints: [ 8726 ], characters: '∖' }, + '⌣': { codepoints: [ 8995 ], characters: '⌣' }, + '⋆': { codepoints: [ 8902 ], characters: '⋆' }, + '⪽': { codepoints: [ 10941 ], characters: '⪽' }, + '⊂': { codepoints: [ 8834 ], characters: '⊂' }, + '⫇': { codepoints: [ 10951 ], characters: '⫇' }, + '⫕': { codepoints: [ 10965 ], characters: '⫕' }, + '⫓': { codepoints: [ 10963 ], characters: '⫓' }, + '⪰': { codepoints: [ 10928 ], characters: '⪰' }, + '⪾': { codepoints: [ 10942 ], characters: '⪾' }, + '⊃': { codepoints: [ 8835 ], characters: '⊃' }, + '⫈': { codepoints: [ 10952 ], characters: '⫈' }, + '⫔': { codepoints: [ 10964 ], characters: '⫔' }, + '⫖': { codepoints: [ 10966 ], characters: '⫖' }, + '⤦': { codepoints: [ 10534 ], characters: '⤦' }, + '⤪': { codepoints: [ 10538 ], characters: '⤪' }, + '⌖': { codepoints: [ 8982 ], characters: '⌖' }, + 'ť': { codepoints: [ 357 ], characters: 'ť' }, + 'ţ': { codepoints: [ 355 ], characters: 'ţ' }, + '⌕': { codepoints: [ 8981 ], characters: '⌕' }, + '∴': { codepoints: [ 8756 ], characters: '∴' }, + 'ϑ': { codepoints: [ 977 ], characters: 'ϑ' }, + ' ': { codepoints: [ 8201 ], characters: ' ' }, + '∼': { codepoints: [ 8764 ], characters: '∼' }, + '⊠': { codepoints: [ 8864 ], characters: '⊠' }, + '⨰': { codepoints: [ 10800 ], characters: '⨰' }, + '⌶': { codepoints: [ 9014 ], characters: '⌶' }, + '⫱': { codepoints: [ 10993 ], characters: '⫱' }, + '‴': { codepoints: [ 8244 ], characters: '‴' }, + '◬': { codepoints: [ 9708 ], characters: '◬' }, + 'ŧ': { codepoints: [ 359 ], characters: 'ŧ' }, + 'ú': { codepoints: [ 250 ], characters: 'ú' }, + 'ŭ': { codepoints: [ 365 ], characters: 'ŭ' }, + 'ű': { codepoints: [ 369 ], characters: 'ű' }, + '⥾': { codepoints: [ 10622 ], characters: '⥾' }, + 'ù': { codepoints: [ 249 ], characters: 'ù' }, + '⌜': { codepoints: [ 8988 ], characters: '⌜' }, + '⌏': { codepoints: [ 8975 ], characters: '⌏' }, + '⌝': { codepoints: [ 8989 ], characters: '⌝' }, + '⌎': { codepoints: [ 8974 ], characters: '⌎' }, + 'ũ': { codepoints: [ 361 ], characters: 'ũ' }, + '⦜': { codepoints: [ 10652 ], characters: '⦜' }, + 'ϕ': { codepoints: [ 981 ], characters: 'ϕ' }, + 'ϱ': { codepoints: [ 1009 ], characters: 'ϱ' }, + '⊻': { codepoints: [ 8891 ], characters: '⊻' }, + '⋮': { codepoints: [ 8942 ], characters: '⋮' }, + '|': { codepoints: [ 124 ], characters: '|' }, + '⫋︀': { codepoints: [ 10955, 65024 ], characters: '⫋︀' }, + '⊊︀': { codepoints: [ 8842, 65024 ], characters: '⊊︀' }, + '⫌︀': { codepoints: [ 10956, 65024 ], characters: '⫌︀' }, + '⊋︀': { codepoints: [ 8843, 65024 ], characters: '⊋︀' }, + '⩟': { codepoints: [ 10847 ], characters: '⩟' }, + '≙': { codepoints: [ 8793 ], characters: '≙' }, + '℘': { codepoints: [ 8472 ], characters: '℘' }, + '≀': { codepoints: [ 8768 ], characters: '≀' }, + '⨁': { codepoints: [ 10753 ], characters: '⨁' }, + '⨂': { codepoints: [ 10754 ], characters: '⨂' }, + '⨆': { codepoints: [ 10758 ], characters: '⨆' }, + '⨄': { codepoints: [ 10756 ], characters: '⨄' }, + '⋀': { codepoints: [ 8896 ], characters: '⋀' }, + 'ý': { codepoints: [ 253 ], characters: 'ý' }, + 'ź': { codepoints: [ 378 ], characters: 'ź' }, + 'ž': { codepoints: [ 382 ], characters: 'ž' }, + 'ℨ': { codepoints: [ 8488 ], characters: 'ℨ' }, + 'Æ': { codepoints: [ 198 ], characters: 'Æ' }, + 'Á': { codepoints: [ 193 ], characters: 'Á' }, + 'Â': { codepoints: [ 194 ], characters: 'Â' }, + 'À': { codepoints: [ 192 ], characters: 'À' }, + 'Α': { codepoints: [ 913 ], characters: 'Α' }, + 'Ā': { codepoints: [ 256 ], characters: 'Ā' }, + 'Ą': { codepoints: [ 260 ], characters: 'Ą' }, + 'Å': { codepoints: [ 197 ], characters: 'Å' }, + 'Ã': { codepoints: [ 195 ], characters: 'Ã' }, + '˘': { codepoints: [ 728 ], characters: '˘' }, + 'Ç': { codepoints: [ 199 ], characters: 'Ç' }, + 'Ĉ': { codepoints: [ 264 ], characters: 'Ĉ' }, + '∷': { codepoints: [ 8759 ], characters: '∷' }, + '⨯': { codepoints: [ 10799 ], characters: '⨯' }, + '⫤': { codepoints: [ 10980 ], characters: '⫤' }, + 'Δ': { codepoints: [ 916 ], characters: 'Δ' }, + 'É': { codepoints: [ 201 ], characters: 'É' }, + 'Ê': { codepoints: [ 202 ], characters: 'Ê' }, + 'È': { codepoints: [ 200 ], characters: 'È' }, + 'Ē': { codepoints: [ 274 ], characters: 'Ē' }, + 'Ę': { codepoints: [ 280 ], characters: 'Ę' }, + '⩵': { codepoints: [ 10869 ], characters: '⩵' }, + 'Γ': { codepoints: [ 915 ], characters: 'Γ' }, + 'Ĝ': { codepoints: [ 284 ], characters: 'Ĝ' }, + 'ˇ': { codepoints: [ 711 ], characters: 'ˇ' }, + 'Ĥ': { codepoints: [ 292 ], characters: 'Ĥ' }, + 'IJ': { codepoints: [ 306 ], characters: 'IJ' }, + 'Í': { codepoints: [ 205 ], characters: 'Í' }, + 'Î': { codepoints: [ 206 ], characters: 'Î' }, + 'Ì': { codepoints: [ 204 ], characters: 'Ì' }, + 'Ī': { codepoints: [ 298 ], characters: 'Ī' }, + 'Į': { codepoints: [ 302 ], characters: 'Į' }, + 'І': { codepoints: [ 1030 ], characters: 'І' }, + 'Ĵ': { codepoints: [ 308 ], characters: 'Ĵ' }, + 'Є': { codepoints: [ 1028 ], characters: 'Є' }, + 'Κ': { codepoints: [ 922 ], characters: 'Κ' }, + 'Ñ': { codepoints: [ 209 ], characters: 'Ñ' }, + 'Œ': { codepoints: [ 338 ], characters: 'Œ' }, + 'Ó': { codepoints: [ 211 ], characters: 'Ó' }, + 'Ô': { codepoints: [ 212 ], characters: 'Ô' }, + 'Ò': { codepoints: [ 210 ], characters: 'Ò' }, + 'Ō': { codepoints: [ 332 ], characters: 'Ō' }, + 'Ω': { codepoints: [ 937 ], characters: 'Ω' }, + 'Ø': { codepoints: [ 216 ], characters: 'Ø' }, + 'Õ': { codepoints: [ 213 ], characters: 'Õ' }, + '″': { codepoints: [ 8243 ], characters: '″' }, + '⤐': { codepoints: [ 10512 ], characters: '⤐' }, + 'Ŝ': { codepoints: [ 348 ], characters: 'Ŝ' }, + 'Σ': { codepoints: [ 931 ], characters: 'Σ' }, + 'Þ': { codepoints: [ 222 ], characters: 'Þ' }, + '™': { codepoints: [ 8482 ], characters: '™' }, + 'Ћ': { codepoints: [ 1035 ], characters: 'Ћ' }, + 'Θ': { codepoints: [ 920 ], characters: 'Θ' }, + '∼': { codepoints: [ 8764 ], characters: '∼' }, + 'Ú': { codepoints: [ 218 ], characters: 'Ú' }, + 'Ў': { codepoints: [ 1038 ], characters: 'Ў' }, + 'Û': { codepoints: [ 219 ], characters: 'Û' }, + 'Ù': { codepoints: [ 217 ], characters: 'Ù' }, + 'Ū': { codepoints: [ 362 ], characters: 'Ū' }, + '⋃': { codepoints: [ 8899 ], characters: '⋃' }, + 'Ų': { codepoints: [ 370 ], characters: 'Ų' }, + '⊥': { codepoints: [ 8869 ], characters: '⊥' }, + 'Ů': { codepoints: [ 366 ], characters: 'Ů' }, + '⊫': { codepoints: [ 8875 ], characters: '⊫' }, + '⊩': { codepoints: [ 8873 ], characters: '⊩' }, + 'Ŵ': { codepoints: [ 372 ], characters: 'Ŵ' }, + '⋀': { codepoints: [ 8896 ], characters: '⋀' }, + 'Ý': { codepoints: [ 221 ], characters: 'Ý' }, + 'Ŷ': { codepoints: [ 374 ], characters: 'Ŷ' }, + 'á': { codepoints: [ 225 ], characters: 'á' }, + 'â': { codepoints: [ 226 ], characters: 'â' }, + '´': { codepoints: [ 180 ], characters: '´' }, + 'æ': { codepoints: [ 230 ], characters: 'æ' }, + 'à': { codepoints: [ 224 ], characters: 'à' }, + 'ℵ': { codepoints: [ 8501 ], characters: 'ℵ' }, + 'α': { codepoints: [ 945 ], characters: 'α' }, + 'ā': { codepoints: [ 257 ], characters: 'ā' }, + '⨿': { codepoints: [ 10815 ], characters: '⨿' }, + '∠': { codepoints: [ 8736 ], characters: '∠' }, + '∟': { codepoints: [ 8735 ], characters: '∟' }, + 'Å': { codepoints: [ 197 ], characters: 'Å' }, + 'ą': { codepoints: [ 261 ], characters: 'ą' }, + 'å': { codepoints: [ 229 ], characters: 'å' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + 'ã': { codepoints: [ 227 ], characters: 'ã' }, + '⨑': { codepoints: [ 10769 ], characters: '⨑' }, + '≌': { codepoints: [ 8780 ], characters: '≌' }, + '„': { codepoints: [ 8222 ], characters: '„' }, + '϶': { codepoints: [ 1014 ], characters: '϶' }, + '␣': { codepoints: [ 9251 ], characters: '␣' }, + '▒': { codepoints: [ 9618 ], characters: '▒' }, + '░': { codepoints: [ 9617 ], characters: '░' }, + '▓': { codepoints: [ 9619 ], characters: '▓' }, + '█': { codepoints: [ 9608 ], characters: '█' }, + '╗': { codepoints: [ 9559 ], characters: '╗' }, + '╔': { codepoints: [ 9556 ], characters: '╔' }, + '╖': { codepoints: [ 9558 ], characters: '╖' }, + '╓': { codepoints: [ 9555 ], characters: '╓' }, + '╦': { codepoints: [ 9574 ], characters: '╦' }, + '╩': { codepoints: [ 9577 ], characters: '╩' }, + '╤': { codepoints: [ 9572 ], characters: '╤' }, + '╧': { codepoints: [ 9575 ], characters: '╧' }, + '╝': { codepoints: [ 9565 ], characters: '╝' }, + '╚': { codepoints: [ 9562 ], characters: '╚' }, + '╜': { codepoints: [ 9564 ], characters: '╜' }, + '╙': { codepoints: [ 9561 ], characters: '╙' }, + '╬': { codepoints: [ 9580 ], characters: '╬' }, + '╣': { codepoints: [ 9571 ], characters: '╣' }, + '╠': { codepoints: [ 9568 ], characters: '╠' }, + '╫': { codepoints: [ 9579 ], characters: '╫' }, + '╢': { codepoints: [ 9570 ], characters: '╢' }, + '╟': { codepoints: [ 9567 ], characters: '╟' }, + '╕': { codepoints: [ 9557 ], characters: '╕' }, + '╒': { codepoints: [ 9554 ], characters: '╒' }, + '┐': { codepoints: [ 9488 ], characters: '┐' }, + '┌': { codepoints: [ 9484 ], characters: '┌' }, + '╥': { codepoints: [ 9573 ], characters: '╥' }, + '╨': { codepoints: [ 9576 ], characters: '╨' }, + '┬': { codepoints: [ 9516 ], characters: '┬' }, + '┴': { codepoints: [ 9524 ], characters: '┴' }, + '╛': { codepoints: [ 9563 ], characters: '╛' }, + '╘': { codepoints: [ 9560 ], characters: '╘' }, + '┘': { codepoints: [ 9496 ], characters: '┘' }, + '└': { codepoints: [ 9492 ], characters: '└' }, + '╪': { codepoints: [ 9578 ], characters: '╪' }, + '╡': { codepoints: [ 9569 ], characters: '╡' }, + '╞': { codepoints: [ 9566 ], characters: '╞' }, + '┼': { codepoints: [ 9532 ], characters: '┼' }, + '┤': { codepoints: [ 9508 ], characters: '┤' }, + '├': { codepoints: [ 9500 ], characters: '├' }, + '˘': { codepoints: [ 728 ], characters: '˘' }, + '¦': { codepoints: [ 166 ], characters: '¦' }, + '⁏': { codepoints: [ 8271 ], characters: '⁏' }, + '⋍': { codepoints: [ 8909 ], characters: '⋍' }, + '⧅': { codepoints: [ 10693 ], characters: '⧅' }, + '⪮': { codepoints: [ 10926 ], characters: '⪮' }, + '≏': { codepoints: [ 8783 ], characters: '≏' }, + '⁁': { codepoints: [ 8257 ], characters: '⁁' }, + 'ˇ': { codepoints: [ 711 ], characters: 'ˇ' }, + '⩍': { codepoints: [ 10829 ], characters: '⩍' }, + 'ç': { codepoints: [ 231 ], characters: 'ç' }, + 'ĉ': { codepoints: [ 265 ], characters: 'ĉ' }, + '⩌': { codepoints: [ 10828 ], characters: '⩌' }, + '¸': { codepoints: [ 184 ], characters: '¸' }, + '✓': { codepoints: [ 10003 ], characters: '✓' }, + '♣': { codepoints: [ 9827 ], characters: '♣' }, + ':': { codepoints: [ 58 ], characters: ':' }, + ',': { codepoints: [ 44 ], characters: ':' }, + '↵': { codepoints: [ 8629 ], characters: '↵' }, + '✗': { codepoints: [ 10007 ], characters: '✗' }, + '⫑': { codepoints: [ 10961 ], characters: '⫑' }, + '⫒': { codepoints: [ 10962 ], characters: '⫒' }, + '⋯': { codepoints: [ 8943 ], characters: '⋯' }, + '⋞': { codepoints: [ 8926 ], characters: '⋞' }, + '⋟': { codepoints: [ 8927 ], characters: '⋟' }, + '⩅': { codepoints: [ 10821 ], characters: '⩅' }, + '¤': { codepoints: [ 164 ], characters: '¤' }, + '⋎': { codepoints: [ 8910 ], characters: '⋎' }, + '⋏': { codepoints: [ 8911 ], characters: '⋏' }, + '∱': { codepoints: [ 8753 ], characters: '∱' }, + '⊣': { codepoints: [ 8867 ], characters: '⊣' }, + '˝': { codepoints: [ 733 ], characters: '˝' }, + '⇊': { codepoints: [ 8650 ], characters: '⇊' }, + 'δ': { codepoints: [ 948 ], characters: 'δ' }, + '⇃': { codepoints: [ 8643 ], characters: '⇃' }, + '⇂': { codepoints: [ 8642 ], characters: '⇂' }, + '♦': { codepoints: [ 9830 ], characters: '♦' }, + '⋲': { codepoints: [ 8946 ], characters: '⋲' }, + '÷': { codepoints: [ 247 ], characters: '÷' }, + '≐': { codepoints: [ 8784 ], characters: '≐' }, + '⋱': { codepoints: [ 8945 ], characters: '⋱' }, + '▾': { codepoints: [ 9662 ], characters: '▾' }, + '⇵': { codepoints: [ 8693 ], characters: '⇵' }, + '⥯': { codepoints: [ 10607 ], characters: '⥯' }, + '⩷': { codepoints: [ 10871 ], characters: '⩷' }, + 'é': { codepoints: [ 233 ], characters: 'é' }, + 'ê': { codepoints: [ 234 ], characters: 'ê' }, + '≒': { codepoints: [ 8786 ], characters: '≒' }, + 'è': { codepoints: [ 232 ], characters: 'è' }, + 'ē': { codepoints: [ 275 ], characters: 'ē' }, + '∅': { codepoints: [ 8709 ], characters: '∅' }, + 'ę': { codepoints: [ 281 ], characters: 'ę' }, + '⩱': { codepoints: [ 10865 ], characters: '⩱' }, + 'ϵ': { codepoints: [ 1013 ], characters: 'ϵ' }, + '≂': { codepoints: [ 8770 ], characters: '≂' }, + '≡': { codepoints: [ 8801 ], characters: '≡' }, + '≓': { codepoints: [ 8787 ], characters: '≓' }, + '⥱': { codepoints: [ 10609 ], characters: '⥱' }, + '≐': { codepoints: [ 8784 ], characters: '≐' }, + '∃': { codepoints: [ 8707 ], characters: '∃' }, + 'ff': { codepoints: [ 64256 ], characters: 'ff' }, + 'fi': { codepoints: [ 64257 ], characters: 'fi' }, + 'fj': { codepoints: [ 102, 106 ], characters: 'fj' }, + 'fl': { codepoints: [ 64258 ], characters: 'fl' }, + '▱': { codepoints: [ 9649 ], characters: '▱' }, + '⫙': { codepoints: [ 10969 ], characters: '⫙' }, + '½': { codepoints: [ 189 ], characters: '½' }, + '¼': { codepoints: [ 188 ], characters: '¼' }, + '¾': { codepoints: [ 190 ], characters: '¾' }, + '⁄': { codepoints: [ 8260 ], characters: '⁄' }, + '⌢': { codepoints: [ 8994 ], characters: '⌢' }, + 'γ': { codepoints: [ 947 ], characters: 'γ' }, + 'ĝ': { codepoints: [ 285 ], characters: 'ĝ' }, + '⪩': { codepoints: [ 10921 ], characters: '⪩' }, + 'ℷ': { codepoints: [ 8503 ], characters: 'ℷ' }, + '≩': { codepoints: [ 8809 ], characters: '≩' }, + '⋧': { codepoints: [ 8935 ], characters: '⋧' }, + '`': { codepoints: [ 96 ], characters: '`' }, + '⪎': { codepoints: [ 10894 ], characters: '⪎' }, + '⪐': { codepoints: [ 10896 ], characters: '⪐' }, + '⩺': { codepoints: [ 10874 ], characters: '⩺' }, + '⋗': { codepoints: [ 8919 ], characters: '⋗' }, + '↭': { codepoints: [ 8621 ], characters: '↭' }, + 'ĥ': { codepoints: [ 293 ], characters: 'ĥ' }, + '⇿': { codepoints: [ 8703 ], characters: '⇿' }, + 'í': { codepoints: [ 237 ], characters: 'í' }, + 'î': { codepoints: [ 238 ], characters: 'î' }, + '¡': { codepoints: [ 161 ], characters: '¡' }, + 'ì': { codepoints: [ 236 ], characters: 'ì' }, + '∭': { codepoints: [ 8749 ], characters: '∭' }, + '℩': { codepoints: [ 8489 ], characters: '℩' }, + 'ij': { codepoints: [ 307 ], characters: 'ij' }, + 'ī': { codepoints: [ 299 ], characters: 'ī' }, + 'ℑ': { codepoints: [ 8465 ], characters: 'ℑ' }, + 'ı': { codepoints: [ 305 ], characters: 'ı' }, + 'Ƶ': { codepoints: [ 437 ], characters: 'Ƶ' }, + '∞': { codepoints: [ 8734 ], characters: '∞' }, + 'į': { codepoints: [ 303 ], characters: 'į' }, + '⨼': { codepoints: [ 10812 ], characters: '⨼' }, + '¿': { codepoints: [ 191 ], characters: '¿' }, + '⋹': { codepoints: [ 8953 ], characters: '⋹' }, + '⋴': { codepoints: [ 8948 ], characters: '⋴' }, + '∈': { codepoints: [ 8712 ], characters: '∈' }, + 'і': { codepoints: [ 1110 ], characters: 'і' }, + 'ĵ': { codepoints: [ 309 ], characters: 'ĵ' }, + 'ȷ': { codepoints: [ 567 ], characters: 'ȷ' }, + 'є': { codepoints: [ 1108 ], characters: 'є' }, + 'κ': { codepoints: [ 954 ], characters: 'κ' }, + '⇚': { codepoints: [ 8666 ], characters: '⇚' }, + '⤎': { codepoints: [ 10510 ], characters: '⤎' }, + '⦑': { codepoints: [ 10641 ], characters: '⦑' }, + '«': { codepoints: [ 171 ], characters: '«' }, + '⇤': { codepoints: [ 8676 ], characters: '⇤' }, + '⪭︀': { codepoints: [ 10925, 65024 ], characters: '⪭︀' }, + '⤌': { codepoints: [ 10508 ], characters: '⤌' }, + '❲': { codepoints: [ 10098 ], characters: '❲' }, + '⦋': { codepoints: [ 10635 ], characters: '⦋' }, + '⌈': { codepoints: [ 8968 ], characters: '⌈' }, + '“': { codepoints: [ 8220 ], characters: '“' }, + '⪨': { codepoints: [ 10920 ], characters: '⪨' }, + '↽': { codepoints: [ 8637 ], characters: '↽' }, + '↼': { codepoints: [ 8636 ], characters: '↼' }, + '▄': { codepoints: [ 9604 ], characters: '▄' }, + '⇇': { codepoints: [ 8647 ], characters: '⇇' }, + '◺': { codepoints: [ 9722 ], characters: '◺' }, + '≨': { codepoints: [ 8808 ], characters: '≨' }, + '⋦': { codepoints: [ 8934 ], characters: '⋦' }, + '⟬': { codepoints: [ 10220 ], characters: '⟬' }, + '⇽': { codepoints: [ 8701 ], characters: '⇽' }, + '⟦': { codepoints: [ 10214 ], characters: '⟦' }, + '⦅': { codepoints: [ 10629 ], characters: '⦅' }, + '⇆': { codepoints: [ 8646 ], characters: '⇆' }, + '⇋': { codepoints: [ 8651 ], characters: '⇋' }, + '⊿': { codepoints: [ 8895 ], characters: '⊿' }, + '⪍': { codepoints: [ 10893 ], characters: '⪍' }, + '⪏': { codepoints: [ 10895 ], characters: '⪏' }, + '‘': { codepoints: [ 8216 ], characters: '‘' }, + '⩹': { codepoints: [ 10873 ], characters: '⩹' }, + '⋖': { codepoints: [ 8918 ], characters: '⋖' }, + '⊴': { codepoints: [ 8884 ], characters: '⊴' }, + '◂': { codepoints: [ 9666 ], characters: '◂' }, + '∺': { codepoints: [ 8762 ], characters: '∺' }, + '—': { codepoints: [ 8212 ], characters: '—' }, + 'µ': { codepoints: [ 181 ], characters: 'µ' }, + '·': { codepoints: [ 183 ], characters: '·' }, + '−': { codepoints: [ 8722 ], characters: '−' }, + '⊸': { codepoints: [ 8888 ], characters: '⊸' }, + '∇': { codepoints: [ 8711 ], characters: '∇' }, + '≋̸': { codepoints: [ 8779, 824 ], characters: '≋̸' }, + 'ʼn': { codepoints: [ 329 ], characters: 'ʼn' }, + '♮': { codepoints: [ 9838 ], characters: '♮' }, + '≎̸': { codepoints: [ 8782, 824 ], characters: '≎̸' }, + '≇': { codepoints: [ 8775 ], characters: '≇' }, + '–': { codepoints: [ 8211 ], characters: '–' }, + '⇗': { codepoints: [ 8663 ], characters: '⇗' }, + '↗': { codepoints: [ 8599 ], characters: '↗' }, + '≐̸': { codepoints: [ 8784, 824 ], characters: '≐̸' }, + '≂̸': { codepoints: [ 8770, 824 ], characters: '≂̸' }, + '≧̸': { codepoints: [ 8807, 824 ], characters: '≧̸' }, + '≵': { codepoints: [ 8821 ], characters: '≵' }, + '⇎': { codepoints: [ 8654 ], characters: '⇎' }, + '↮': { codepoints: [ 8622 ], characters: '↮' }, + '⫲': { codepoints: [ 10994 ], characters: '⫲' }, + '⇍': { codepoints: [ 8653 ], characters: '⇍' }, + '↚': { codepoints: [ 8602 ], characters: '↚' }, + '≦̸': { codepoints: [ 8806, 824 ], characters: '≦̸' }, + '≮': { codepoints: [ 8814 ], characters: '≮' }, + '≴': { codepoints: [ 8820 ], characters: '≴' }, + '⋪': { codepoints: [ 8938 ], characters: '⋪' }, + '∉': { codepoints: [ 8713 ], characters: '∉' }, + '∌': { codepoints: [ 8716 ], characters: '∌' }, + '∂̸': { codepoints: [ 8706, 824 ], characters: '∂̸' }, + '⊀': { codepoints: [ 8832 ], characters: '⊀' }, + '⇏': { codepoints: [ 8655 ], characters: '⇏' }, + '↛': { codepoints: [ 8603 ], characters: '↛' }, + '⋫': { codepoints: [ 8939 ], characters: '⋫' }, + '≄': { codepoints: [ 8772 ], characters: '≄' }, + '∤': { codepoints: [ 8740 ], characters: '∤' }, + '∦': { codepoints: [ 8742 ], characters: '∦' }, + '⫅̸': { codepoints: [ 10949, 824 ], characters: '⫅̸' }, + '⊈': { codepoints: [ 8840 ], characters: '⊈' }, + '⊁': { codepoints: [ 8833 ], characters: '⊁' }, + '⫆̸': { codepoints: [ 10950, 824 ], characters: '⫆̸' }, + '⊉': { codepoints: [ 8841 ], characters: '⊉' }, + 'ñ': { codepoints: [ 241 ], characters: 'ñ' }, + ' ': { codepoints: [ 8199 ], characters: ' ' }, + '∼⃒': { codepoints: [ 8764, 8402 ], characters: '∼⃒' }, + '⇖': { codepoints: [ 8662 ], characters: '⇖' }, + '↖': { codepoints: [ 8598 ], characters: '↖' }, + 'ó': { codepoints: [ 243 ], characters: 'ó' }, + 'ô': { codepoints: [ 244 ], characters: 'ô' }, + '⊝': { codepoints: [ 8861 ], characters: '⊝' }, + 'œ': { codepoints: [ 339 ], characters: 'œ' }, + '⦿': { codepoints: [ 10687 ], characters: '⦿' }, + 'ò': { codepoints: [ 242 ], characters: 'ò' }, + '⦵': { codepoints: [ 10677 ], characters: '⦵' }, + '↺': { codepoints: [ 8634 ], characters: '↺' }, + '⦾': { codepoints: [ 10686 ], characters: '⦾' }, + '‾': { codepoints: [ 8254 ], characters: '‾' }, + 'ō': { codepoints: [ 333 ], characters: 'ō' }, + 'ω': { codepoints: [ 969 ], characters: 'ω' }, + '⦹': { codepoints: [ 10681 ], characters: '⦹' }, + '⊕': { codepoints: [ 8853 ], characters: '⊕' }, + '↻': { codepoints: [ 8635 ], characters: '↻' }, + 'ℴ': { codepoints: [ 8500 ], characters: 'ℴ' }, + 'ø': { codepoints: [ 248 ], characters: 'ø' }, + 'õ': { codepoints: [ 245 ], characters: 'õ' }, + '⌽': { codepoints: [ 9021 ], characters: '⌽' }, + '⫽': { codepoints: [ 11005 ], characters: '⫽' }, + '☎': { codepoints: [ 9742 ], characters: '☎' }, + '⊞': { codepoints: [ 8862 ], characters: '⊞' }, + '⩲': { codepoints: [ 10866 ], characters: '⩲' }, + '±': { codepoints: [ 177 ], characters: '±' }, + '£': { codepoints: [ 163 ], characters: '£' }, + '≼': { codepoints: [ 8828 ], characters: '≼' }, + '′': { codepoints: [ 8242 ], characters: '′' }, + '⪹': { codepoints: [ 10937 ], characters: '⪹' }, + '≾': { codepoints: [ 8830 ], characters: '≾' }, + '?': { codepoints: [ 63 ], characters: '?' }, + '⇛': { codepoints: [ 8667 ], characters: '⇛' }, + '⤏': { codepoints: [ 10511 ], characters: '⤏' }, + '√': { codepoints: [ 8730 ], characters: '√' }, + '⦒': { codepoints: [ 10642 ], characters: '⦒' }, + '⦥': { codepoints: [ 10661 ], characters: '⦥' }, + '»': { codepoints: [ 187 ], characters: '»' }, + '⇥': { codepoints: [ 8677 ], characters: '⇥' }, + '⤳': { codepoints: [ 10547 ], characters: '⤳' }, + '↝': { codepoints: [ 8605 ], characters: '↝' }, + '∶': { codepoints: [ 8758 ], characters: '∶' }, + '⤍': { codepoints: [ 10509 ], characters: '⤍' }, + '❳': { codepoints: [ 10099 ], characters: '❳' }, + '⦌': { codepoints: [ 10636 ], characters: '⦌' }, + '⌉': { codepoints: [ 8969 ], characters: '⌉' }, + '”': { codepoints: [ 8221 ], characters: '”' }, + 'ℝ': { codepoints: [ 8477 ], characters: 'ℝ' }, + '⇁': { codepoints: [ 8641 ], characters: '⇁' }, + '⇀': { codepoints: [ 8640 ], characters: '⇀' }, + '⇄': { codepoints: [ 8644 ], characters: '⇄' }, + '⇌': { codepoints: [ 8652 ], characters: '⇌' }, + '⫮': { codepoints: [ 10990 ], characters: '⫮' }, + '⟭': { codepoints: [ 10221 ], characters: '⟭' }, + '⇾': { codepoints: [ 8702 ], characters: '⇾' }, + '⟧': { codepoints: [ 10215 ], characters: '⟧' }, + '⦆': { codepoints: [ 10630 ], characters: '⦆' }, + '⇉': { codepoints: [ 8649 ], characters: '⇉' }, + '’': { codepoints: [ 8217 ], characters: '’' }, + '⊵': { codepoints: [ 8885 ], characters: '⊵' }, + '▸': { codepoints: [ 9656 ], characters: '▸' }, + '‚': { codepoints: [ 8218 ], characters: '‚' }, + '≽': { codepoints: [ 8829 ], characters: '≽' }, + 'ŝ': { codepoints: [ 349 ], characters: 'ŝ' }, + '⪺': { codepoints: [ 10938 ], characters: '⪺' }, + '≿': { codepoints: [ 8831 ], characters: '≿' }, + '⊡': { codepoints: [ 8865 ], characters: '⊡' }, + '⩦': { codepoints: [ 10854 ], characters: '⩦' }, + '⇘': { codepoints: [ 8664 ], characters: '⇘' }, + '↘': { codepoints: [ 8600 ], characters: '↘' }, + '∖': { codepoints: [ 8726 ], characters: '∖' }, + '♯': { codepoints: [ 9839 ], characters: '♯' }, + 'σ': { codepoints: [ 963 ], characters: 'σ' }, + '≃': { codepoints: [ 8771 ], characters: '≃' }, + '⪠': { codepoints: [ 10912 ], characters: '⪠' }, + '⪟': { codepoints: [ 10911 ], characters: '⪟' }, + '≆': { codepoints: [ 8774 ], characters: '≆' }, + '←': { codepoints: [ 8592 ], characters: '←' }, + '⌣': { codepoints: [ 8995 ], characters: '⌣' }, + '⪬︀': { codepoints: [ 10924, 65024 ], characters: '⪬︀' }, + '⊓': { codepoints: [ 8851 ], characters: '⊓' }, + '⊔': { codepoints: [ 8852 ], characters: '⊔' }, + '⊏': { codepoints: [ 8847 ], characters: '⊏' }, + '⊐': { codepoints: [ 8848 ], characters: '⊐' }, + '→': { codepoints: [ 8594 ], characters: '→' }, + '★': { codepoints: [ 9733 ], characters: '★' }, + '¯': { codepoints: [ 175 ], characters: '¯' }, + '⫋': { codepoints: [ 10955 ], characters: '⫋' }, + '⊊': { codepoints: [ 8842 ], characters: '⊊' }, + '⫌': { codepoints: [ 10956 ], characters: '⫌' }, + '⊋': { codepoints: [ 8843 ], characters: '⊋' }, + '⇙': { codepoints: [ 8665 ], characters: '⇙' }, + '↙': { codepoints: [ 8601 ], characters: '↙' }, + 'ß': { codepoints: [ 223 ], characters: 'ß' }, + 'θ': { codepoints: [ 952 ], characters: 'θ' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + 'þ': { codepoints: [ 254 ], characters: 'þ' }, + '˜': { codepoints: [ 732 ], characters: '˜' }, + '×': { codepoints: [ 215 ], characters: '×' }, + '™': { codepoints: [ 8482 ], characters: '™' }, + '⧍': { codepoints: [ 10701 ], characters: '⧍' }, + 'ћ': { codepoints: [ 1115 ], characters: 'ћ' }, + '≬': { codepoints: [ 8812 ], characters: '≬' }, + 'ú': { codepoints: [ 250 ], characters: 'ú' }, + 'ў': { codepoints: [ 1118 ], characters: 'ў' }, + 'û': { codepoints: [ 251 ], characters: 'û' }, + '⇅': { codepoints: [ 8645 ], characters: '⇅' }, + '⥮': { codepoints: [ 10606 ], characters: '⥮' }, + 'ù': { codepoints: [ 249 ], characters: 'ù' }, + '↿': { codepoints: [ 8639 ], characters: '↿' }, + '↾': { codepoints: [ 8638 ], characters: '↾' }, + '▀': { codepoints: [ 9600 ], characters: '▀' }, + '◸': { codepoints: [ 9720 ], characters: '◸' }, + 'ū': { codepoints: [ 363 ], characters: 'ū' }, + 'ų': { codepoints: [ 371 ], characters: 'ų' }, + '⊎': { codepoints: [ 8846 ], characters: '⊎' }, + 'ϒ': { codepoints: [ 978 ], characters: 'ϒ' }, + 'ů': { codepoints: [ 367 ], characters: 'ů' }, + '◹': { codepoints: [ 9721 ], characters: '◹' }, + '⋰': { codepoints: [ 8944 ], characters: '⋰' }, + '▴': { codepoints: [ 9652 ], characters: '▴' }, + '⇈': { codepoints: [ 8648 ], characters: '⇈' }, + '⫩': { codepoints: [ 10985 ], characters: '⫩' }, + '⊨': { codepoints: [ 8872 ], characters: '⊨' }, + 'ϖ': { codepoints: [ 982 ], characters: 'ϖ' }, + '⊢': { codepoints: [ 8866 ], characters: '⊢' }, + '≚': { codepoints: [ 8794 ], characters: '≚' }, + '⊲': { codepoints: [ 8882 ], characters: '⊲' }, + '⊂⃒': { codepoints: [ 8834, 8402 ], characters: '⊂⃒' }, + '⊃⃒': { codepoints: [ 8835, 8402 ], characters: '⊃⃒' }, + '∝': { codepoints: [ 8733 ], characters: '∝' }, + '⊳': { codepoints: [ 8883 ], characters: '⊳' }, + 'ŵ': { codepoints: [ 373 ], characters: 'ŵ' }, + '∧': { codepoints: [ 8743 ], characters: '∧' }, + '◯': { codepoints: [ 9711 ], characters: '◯' }, + '▽': { codepoints: [ 9661 ], characters: '▽' }, + '⟺': { codepoints: [ 10234 ], characters: '⟺' }, + '⟷': { codepoints: [ 10231 ], characters: '⟷' }, + '⟸': { codepoints: [ 10232 ], characters: '⟸' }, + '⟵': { codepoints: [ 10229 ], characters: '⟵' }, + '⨀': { codepoints: [ 10752 ], characters: '⨀' }, + '⟹': { codepoints: [ 10233 ], characters: '⟹' }, + '⟶': { codepoints: [ 10230 ], characters: '⟶' }, + '△': { codepoints: [ 9651 ], characters: '△' }, + 'ý': { codepoints: [ 253 ], characters: 'ý' }, + 'ŷ': { codepoints: [ 375 ], characters: 'ŷ' }, + 'Æ': { codepoints: [ 198 ], characters: 'Æ' }, + 'Â': { codepoints: [ 194 ], characters: 'Â' }, + '𝔸': { codepoints: [ 120120 ], characters: '𝔸' }, + 'Å': { codepoints: [ 197 ], characters: 'Å' }, + '𝒜': { codepoints: [ 119964 ], characters: '𝒜' }, + 'Ä': { codepoints: [ 196 ], characters: 'Ä' }, + '⫧': { codepoints: [ 10983 ], characters: '⫧' }, + 'Β': { codepoints: [ 914 ], characters: 'Β' }, + '𝔹': { codepoints: [ 120121 ], characters: '𝔹' }, + 'ℬ': { codepoints: [ 8492 ], characters: 'ℬ' }, + 'Ч': { codepoints: [ 1063 ], characters: 'Ч' }, + '©': { codepoints: [ 169 ], characters: '©' }, + 'Ċ': { codepoints: [ 266 ], characters: 'Ċ' }, + 'ℂ': { codepoints: [ 8450 ], characters: 'ℂ' }, + '𝒞': { codepoints: [ 119966 ], characters: '𝒞' }, + 'Ђ': { codepoints: [ 1026 ], characters: 'Ђ' }, + 'Ѕ': { codepoints: [ 1029 ], characters: 'Ѕ' }, + 'Џ': { codepoints: [ 1039 ], characters: 'Џ' }, + '↡': { codepoints: [ 8609 ], characters: '↡' }, + '𝔻': { codepoints: [ 120123 ], characters: '𝔻' }, + '𝒟': { codepoints: [ 119967 ], characters: '𝒟' }, + 'Ê': { codepoints: [ 202 ], characters: 'Ê' }, + 'Ė': { codepoints: [ 278 ], characters: 'Ė' }, + '𝔼': { codepoints: [ 120124 ], characters: '𝔼' }, + 'ℰ': { codepoints: [ 8496 ], characters: 'ℰ' }, + '⩳': { codepoints: [ 10867 ], characters: '⩳' }, + 'Ë': { codepoints: [ 203 ], characters: 'Ë' }, + '𝔽': { codepoints: [ 120125 ], characters: '𝔽' }, + 'ℱ': { codepoints: [ 8497 ], characters: 'ℱ' }, + 'Ѓ': { codepoints: [ 1027 ], characters: 'Ѓ' }, + 'Ġ': { codepoints: [ 288 ], characters: 'Ġ' }, + '𝔾': { codepoints: [ 120126 ], characters: '𝔾' }, + '𝒢': { codepoints: [ 119970 ], characters: '𝒢' }, + 'ℍ': { codepoints: [ 8461 ], characters: 'ℍ' }, + 'ℋ': { codepoints: [ 8459 ], characters: 'ℋ' }, + 'Е': { codepoints: [ 1045 ], characters: 'Е' }, + 'Ё': { codepoints: [ 1025 ], characters: 'Ё' }, + 'Î': { codepoints: [ 206 ], characters: 'Î' }, + 'İ': { codepoints: [ 304 ], characters: 'İ' }, + '𝕀': { codepoints: [ 120128 ], characters: '𝕀' }, + 'Ι': { codepoints: [ 921 ], characters: 'Ι' }, + 'ℐ': { codepoints: [ 8464 ], characters: 'ℐ' }, + 'Ï': { codepoints: [ 207 ], characters: 'Ï' }, + '𝕁': { codepoints: [ 120129 ], characters: '𝕁' }, + '𝒥': { codepoints: [ 119973 ], characters: '𝒥' }, + 'Х': { codepoints: [ 1061 ], characters: 'Х' }, + 'Ќ': { codepoints: [ 1036 ], characters: 'Ќ' }, + '𝕂': { codepoints: [ 120130 ], characters: '𝕂' }, + '𝒦': { codepoints: [ 119974 ], characters: '𝒦' }, + 'Љ': { codepoints: [ 1033 ], characters: 'Љ' }, + '⟪': { codepoints: [ 10218 ], characters: '⟪' }, + '↞': { codepoints: [ 8606 ], characters: '↞' }, + '𝕃': { codepoints: [ 120131 ], characters: '𝕃' }, + 'ℒ': { codepoints: [ 8466 ], characters: 'ℒ' }, + '𝕄': { codepoints: [ 120132 ], characters: '𝕄' }, + 'ℳ': { codepoints: [ 8499 ], characters: 'ℳ' }, + 'Њ': { codepoints: [ 1034 ], characters: 'Њ' }, + 'ℕ': { codepoints: [ 8469 ], characters: 'ℕ' }, + '𝒩': { codepoints: [ 119977 ], characters: '𝒩' }, + 'Ô': { codepoints: [ 212 ], characters: 'Ô' }, + '𝕆': { codepoints: [ 120134 ], characters: '𝕆' }, + '𝒪': { codepoints: [ 119978 ], characters: '𝒪' }, + 'Ö': { codepoints: [ 214 ], characters: 'Ö' }, + 'ℙ': { codepoints: [ 8473 ], characters: 'ℙ' }, + '𝒫': { codepoints: [ 119979 ], characters: '𝒫' }, + '"': { codepoints: [ 34 ], characters: '"' }, + 'ℚ': { codepoints: [ 8474 ], characters: 'ℚ' }, + '𝒬': { codepoints: [ 119980 ], characters: '𝒬' }, + '⟫': { codepoints: [ 10219 ], characters: '⟫' }, + '↠': { codepoints: [ 8608 ], characters: '↠' }, + 'ℝ': { codepoints: [ 8477 ], characters: 'ℝ' }, + 'ℛ': { codepoints: [ 8475 ], characters: 'ℛ' }, + 'Ш': { codepoints: [ 1064 ], characters: 'Ш' }, + '𝕊': { codepoints: [ 120138 ], characters: '𝕊' }, + '√': { codepoints: [ 8730 ], characters: '√' }, + '𝒮': { codepoints: [ 119982 ], characters: '𝒮' }, + '⋆': { codepoints: [ 8902 ], characters: '⋆' }, + 'Þ': { codepoints: [ 222 ], characters: 'Þ' }, + 'Ц': { codepoints: [ 1062 ], characters: 'Ц' }, + '𝕋': { codepoints: [ 120139 ], characters: '𝕋' }, + '𝒯': { codepoints: [ 119983 ], characters: '𝒯' }, + '↟': { codepoints: [ 8607 ], characters: '↟' }, + 'Û': { codepoints: [ 219 ], characters: 'Û' }, + '𝕌': { codepoints: [ 120140 ], characters: '𝕌' }, + 'ϒ': { codepoints: [ 978 ], characters: 'ϒ' }, + '𝒰': { codepoints: [ 119984 ], characters: '𝒰' }, + 'Ü': { codepoints: [ 220 ], characters: 'Ü' }, + '⫫': { codepoints: [ 10987 ], characters: '⫫' }, + '‖': { codepoints: [ 8214 ], characters: '‖' }, + '𝕍': { codepoints: [ 120141 ], characters: '𝕍' }, + '𝒱': { codepoints: [ 119985 ], characters: '𝒱' }, + '𝕎': { codepoints: [ 120142 ], characters: '𝕎' }, + '𝒲': { codepoints: [ 119986 ], characters: '𝒲' }, + '𝕏': { codepoints: [ 120143 ], characters: '𝕏' }, + '𝒳': { codepoints: [ 119987 ], characters: '𝒳' }, + 'Я': { codepoints: [ 1071 ], characters: 'Я' }, + 'Ї': { codepoints: [ 1031 ], characters: 'Ї' }, + 'Ю': { codepoints: [ 1070 ], characters: 'Ю' }, + '𝕐': { codepoints: [ 120144 ], characters: '𝕐' }, + '𝒴': { codepoints: [ 119988 ], characters: '𝒴' }, + 'Ÿ': { codepoints: [ 376 ], characters: 'Ÿ' }, + 'Ж': { codepoints: [ 1046 ], characters: 'Ж' }, + 'Ż': { codepoints: [ 379 ], characters: 'Ż' }, + 'Ζ': { codepoints: [ 918 ], characters: 'Ζ' }, + 'ℤ': { codepoints: [ 8484 ], characters: 'ℤ' }, + '𝒵': { codepoints: [ 119989 ], characters: '𝒵' }, + 'â': { codepoints: [ 226 ], characters: 'â' }, + '´': { codepoints: [ 180 ], characters: '´' }, + 'æ': { codepoints: [ 230 ], characters: 'æ' }, + '⩜': { codepoints: [ 10844 ], characters: '⩜' }, + '⩚': { codepoints: [ 10842 ], characters: '⩚' }, + '⦤': { codepoints: [ 10660 ], characters: '⦤' }, + '𝕒': { codepoints: [ 120146 ], characters: '𝕒' }, + '≋': { codepoints: [ 8779 ], characters: '≋' }, + ''': { codepoints: [ 39 ], characters: '\'' }, + 'å': { codepoints: [ 229 ], characters: 'å' }, + '𝒶': { codepoints: [ 119990 ], characters: '𝒶' }, + 'ä': { codepoints: [ 228 ], characters: 'ä' }, + '⫭': { codepoints: [ 10989 ], characters: '⫭' }, + '⎵': { codepoints: [ 9141 ], characters: '⎵' }, + 'β': { codepoints: [ 946 ], characters: 'β' }, + 'ℶ': { codepoints: [ 8502 ], characters: 'ℶ' }, + '⌐': { codepoints: [ 8976 ], characters: '⌐' }, + '𝕓': { codepoints: [ 120147 ], characters: '𝕓' }, + '═': { codepoints: [ 9552 ], characters: '═' }, + '║': { codepoints: [ 9553 ], characters: '║' }, + '─': { codepoints: [ 9472 ], characters: '─' }, + '│': { codepoints: [ 9474 ], characters: '│' }, + '𝒷': { codepoints: [ 119991 ], characters: '𝒷' }, + '∽': { codepoints: [ 8765 ], characters: '∽' }, + '\': { codepoints: [ 92 ], characters: '\\' }, + '•': { codepoints: [ 8226 ], characters: '•' }, + '≎': { codepoints: [ 8782 ], characters: '≎' }, + '∩︀': { codepoints: [ 8745, 65024 ], characters: '∩︀' }, + 'ċ': { codepoints: [ 267 ], characters: 'ċ' }, + '¸': { codepoints: [ 184 ], characters: '¸' }, + '¢': { codepoints: [ 162 ], characters: '¢' }, + 'ч': { codepoints: [ 1095 ], characters: 'ч' }, + '⧃': { codepoints: [ 10691 ], characters: '⧃' }, + 'ˆ': { codepoints: [ 710 ], characters: 'ˆ' }, + '≗': { codepoints: [ 8791 ], characters: '≗' }, + '∁': { codepoints: [ 8705 ], characters: '∁' }, + '≅': { codepoints: [ 8773 ], characters: '≅' }, + '𝕔': { codepoints: [ 120148 ], characters: '𝕔' }, + '©': { codepoints: [ 169 ], characters: '©' }, + '𝒸': { codepoints: [ 119992 ], characters: '𝒸' }, + '⫏': { codepoints: [ 10959 ], characters: '⫏' }, + '⫐': { codepoints: [ 10960 ], characters: '⫐' }, + '∪︀': { codepoints: [ 8746, 65024 ], characters: '∪︀' }, + '⇓': { codepoints: [ 8659 ], characters: '⇓' }, + '⥥': { codepoints: [ 10597 ], characters: '⥥' }, + '↓': { codepoints: [ 8595 ], characters: '↓' }, + '‐': { codepoints: [ 8208 ], characters: '‐' }, + '⋄': { codepoints: [ 8900 ], characters: '⋄' }, + 'ђ': { codepoints: [ 1106 ], characters: 'ђ' }, + '𝕕': { codepoints: [ 120149 ], characters: '𝕕' }, + '𝒹': { codepoints: [ 119993 ], characters: '𝒹' }, + 'ѕ': { codepoints: [ 1109 ], characters: 'ѕ' }, + '⧶': { codepoints: [ 10742 ], characters: '⧶' }, + '▿': { codepoints: [ 9663 ], characters: '▿' }, + 'џ': { codepoints: [ 1119 ], characters: 'џ' }, + '≑': { codepoints: [ 8785 ], characters: '≑' }, + '≖': { codepoints: [ 8790 ], characters: '≖' }, + 'ê': { codepoints: [ 234 ], characters: 'ê' }, + 'ė': { codepoints: [ 279 ], characters: 'ė' }, + ' ': { codepoints: [ 8195 ], characters: ' ' }, + ' ': { codepoints: [ 8194 ], characters: ' ' }, + '𝕖': { codepoints: [ 120150 ], characters: '𝕖' }, + '⋕': { codepoints: [ 8917 ], characters: '⋕' }, + 'ε': { codepoints: [ 949 ], characters: 'ε' }, + 'ℯ': { codepoints: [ 8495 ], characters: 'ℯ' }, + '≂': { codepoints: [ 8770 ], characters: '≂' }, + 'ë': { codepoints: [ 235 ], characters: 'ë' }, + '€': { codepoints: [ 8364 ], characters: '€' }, + '!': { codepoints: [ 33 ], characters: '!' }, + '♭': { codepoints: [ 9837 ], characters: '♭' }, + 'ƒ': { codepoints: [ 402 ], characters: 'ƒ' }, + '𝕗': { codepoints: [ 120151 ], characters: '𝕗' }, + '⋔': { codepoints: [ 8916 ], characters: '⋔' }, + '𝒻': { codepoints: [ 119995 ], characters: '𝒻' }, + 'ġ': { codepoints: [ 289 ], characters: 'ġ' }, + '≧': { codepoints: [ 8807 ], characters: '≧' }, + '⋛︀': { codepoints: [ 8923, 65024 ], characters: '⋛︀' }, + 'ѓ': { codepoints: [ 1107 ], characters: 'ѓ' }, + '⪊': { codepoints: [ 10890 ], characters: '⪊' }, + '⪈': { codepoints: [ 10888 ], characters: '⪈' }, + '𝕘': { codepoints: [ 120152 ], characters: '𝕘' }, + 'ℊ': { codepoints: [ 8458 ], characters: 'ℊ' }, + '≳': { codepoints: [ 8819 ], characters: '≳' }, + '⪧': { codepoints: [ 10919 ], characters: '⪧' }, + '≩︀': { codepoints: [ 8809, 65024 ], characters: '≩︀' }, + '⇔': { codepoints: [ 8660 ], characters: '⇔' }, + '½': { codepoints: [ 189 ], characters: '½' }, + '↔': { codepoints: [ 8596 ], characters: '↔' }, + 'ℏ': { codepoints: [ 8463 ], characters: 'ℏ' }, + '𝕙': { codepoints: [ 120153 ], characters: '𝕙' }, + '𝒽': { codepoints: [ 119997 ], characters: '𝒽' }, + 'î': { codepoints: [ 238 ], characters: 'î' }, + 'е': { codepoints: [ 1077 ], characters: 'е' }, + '¡': { codepoints: [ 161 ], characters: '¡' }, + '⊷': { codepoints: [ 8887 ], characters: '⊷' }, + 'ё': { codepoints: [ 1105 ], characters: 'ё' }, + '𝕚': { codepoints: [ 120154 ], characters: '𝕚' }, + 'ι': { codepoints: [ 953 ], characters: 'ι' }, + '𝒾': { codepoints: [ 119998 ], characters: '𝒾' }, + '∈': { codepoints: [ 8712 ], characters: '∈' }, + 'ï': { codepoints: [ 239 ], characters: 'ï' }, + '𝕛': { codepoints: [ 120155 ], characters: '𝕛' }, + '𝒿': { codepoints: [ 119999 ], characters: '𝒿' }, + 'х': { codepoints: [ 1093 ], characters: 'х' }, + 'ќ': { codepoints: [ 1116 ], characters: 'ќ' }, + '𝕜': { codepoints: [ 120156 ], characters: '𝕜' }, + '𝓀': { codepoints: [ 120000 ], characters: '𝓀' }, + '⇐': { codepoints: [ 8656 ], characters: '⇐' }, + '⥢': { codepoints: [ 10594 ], characters: '⥢' }, + '⟨': { codepoints: [ 10216 ], characters: '⟨' }, + '«': { codepoints: [ 171 ], characters: '«' }, + '←': { codepoints: [ 8592 ], characters: '←' }, + '⪭': { codepoints: [ 10925 ], characters: '⪭' }, + '{': { codepoints: [ 123 ], characters: '{' }, + '⤶': { codepoints: [ 10550 ], characters: '⤶' }, + '↲': { codepoints: [ 8626 ], characters: '↲' }, + '≦': { codepoints: [ 8806 ], characters: '≦' }, + '⋚︀': { codepoints: [ 8922, 65024 ], characters: '⋚︀' }, + 'љ': { codepoints: [ 1113 ], characters: 'љ' }, + '⪉': { codepoints: [ 10889 ], characters: '⪉' }, + '⪇': { codepoints: [ 10887 ], characters: '⪇' }, + '𝕝': { codepoints: [ 120157 ], characters: '𝕝' }, + '⧫': { codepoints: [ 10731 ], characters: '⧫' }, + '(': { codepoints: [ 40 ], characters: '(' }, + '𝓁': { codepoints: [ 120001 ], characters: '𝓁' }, + '≲': { codepoints: [ 8818 ], characters: '≲' }, + '[': { codepoints: [ 91 ], characters: '' }, + '⪦': { codepoints: [ 10918 ], characters: '⪦' }, + '◃': { codepoints: [ 9667 ], characters: '◃' }, + '≨︀': { codepoints: [ 8808, 65024 ], characters: '≨︀' }, + '¯': { codepoints: [ 175 ], characters: '¯' }, + '♂': { codepoints: [ 9794 ], characters: '♂' }, + '✠': { codepoints: [ 10016 ], characters: '✠' }, + 'µ': { codepoints: [ 181 ], characters: 'µ' }, + '⫛': { codepoints: [ 10971 ], characters: '⫛' }, + '…': { codepoints: [ 8230 ], characters: '…' }, + '𝕞': { codepoints: [ 120158 ], characters: '𝕞' }, + '𝓂': { codepoints: [ 120002 ], characters: '𝓂' }, + '≫̸': { codepoints: [ 8811, 824 ], characters: '≫̸' }, + '≪̸': { codepoints: [ 8810, 824 ], characters: '≪̸' }, + '∠⃒': { codepoints: [ 8736, 8402 ], characters: '∠⃒' }, + '⩰̸': { codepoints: [ 10864, 824 ], characters: '⩰̸' }, + ' ': { codepoints: [ 160 ], characters: ' ' }, + '⩃': { codepoints: [ 10819 ], characters: '⩃' }, + '⩂': { codepoints: [ 10818 ], characters: '⩂' }, + '≱': { codepoints: [ 8817 ], characters: '≱' }, + '⩾̸': { codepoints: [ 10878, 824 ], characters: '⩾̸' }, + '≯': { codepoints: [ 8815 ], characters: '≯' }, + '⋺': { codepoints: [ 8954 ], characters: '⋺' }, + 'њ': { codepoints: [ 1114 ], characters: 'њ' }, + '‥': { codepoints: [ 8229 ], characters: '‥' }, + '≰': { codepoints: [ 8816 ], characters: '≰' }, + '⩽̸': { codepoints: [ 10877, 824 ], characters: '⩽̸' }, + '∤': { codepoints: [ 8740 ], characters: '∤' }, + '𝕟': { codepoints: [ 120159 ], characters: '𝕟' }, + '∦': { codepoints: [ 8742 ], characters: '∦' }, + '⪯̸': { codepoints: [ 10927, 824 ], characters: '⪯̸' }, + '⪰̸': { codepoints: [ 10928, 824 ], characters: '⪰̸' }, + '𝓃': { codepoints: [ 120003 ], characters: '𝓃' }, + '≁': { codepoints: [ 8769 ], characters: '≁' }, + '⊄': { codepoints: [ 8836 ], characters: '⊄' }, + '⊅': { codepoints: [ 8837 ], characters: '⊅' }, + '≹': { codepoints: [ 8825 ], characters: '≹' }, + '≸': { codepoints: [ 8824 ], characters: '≸' }, + '≍⃒': { codepoints: [ 8781, 8402 ], characters: '≍⃒' }, + '≥⃒': { codepoints: [ 8805, 8402 ], characters: '≥⃒' }, + '>⃒': { codepoints: [ 62, 8402 ], characters: '>⃒' }, + '≤⃒': { codepoints: [ 8804, 8402 ], characters: '≤⃒' }, + '<⃒': { codepoints: [ 60, 8402 ], characters: '<⃒' }, + '⊛': { codepoints: [ 8859 ], characters: '⊛' }, + '⊚': { codepoints: [ 8858 ], characters: '⊚' }, + 'ô': { codepoints: [ 244 ], characters: 'ô' }, + '⨸': { codepoints: [ 10808 ], characters: '⨸' }, + '⊙': { codepoints: [ 8857 ], characters: '⊙' }, + '˛': { codepoints: [ 731 ], characters: '˛' }, + '∮': { codepoints: [ 8750 ], characters: '∮' }, + '⦶': { codepoints: [ 10678 ], characters: '⦶' }, + '𝕠': { codepoints: [ 120160 ], characters: '𝕠' }, + '⦷': { codepoints: [ 10679 ], characters: '⦷' }, + 'ª': { codepoints: [ 170 ], characters: 'ª' }, + 'º': { codepoints: [ 186 ], characters: 'º' }, + '⩖': { codepoints: [ 10838 ], characters: '⩖' }, + 'ℴ': { codepoints: [ 8500 ], characters: 'ℴ' }, + '⊘': { codepoints: [ 8856 ], characters: '⊘' }, + 'ö': { codepoints: [ 246 ], characters: 'ö' }, + '¶': { codepoints: [ 182 ], characters: '¶' }, + '∂': { codepoints: [ 8706 ], characters: '∂' }, + '⊥': { codepoints: [ 8869 ], characters: '⊥' }, + 'ϕ': { codepoints: [ 981 ], characters: 'ϕ' }, + '+': { codepoints: [ 43 ], characters: '+' }, + '𝕡': { codepoints: [ 120161 ], characters: '𝕡' }, + '£': { codepoints: [ 163 ], characters: '£' }, + '⪷': { codepoints: [ 10935 ], characters: '⪷' }, + '≺': { codepoints: [ 8826 ], characters: '≺' }, + '⪵': { codepoints: [ 10933 ], characters: '⪵' }, + '∏': { codepoints: [ 8719 ], characters: '∏' }, + '∝': { codepoints: [ 8733 ], characters: '∝' }, + '𝓅': { codepoints: [ 120005 ], characters: '𝓅' }, + '⨌': { codepoints: [ 10764 ], characters: '⨌' }, + '𝕢': { codepoints: [ 120162 ], characters: '𝕢' }, + '𝓆': { codepoints: [ 120006 ], characters: '𝓆' }, + '"': { codepoints: [ 34 ], characters: '"' }, + '⇒': { codepoints: [ 8658 ], characters: '⇒' }, + '⥤': { codepoints: [ 10596 ], characters: '⥤' }, + '∽̱': { codepoints: [ 8765, 817 ], characters: '∽̱' }, + '⟩': { codepoints: [ 10217 ], characters: '⟩' }, + '»': { codepoints: [ 187 ], characters: '»' }, + '→': { codepoints: [ 8594 ], characters: '→' }, + '}': { codepoints: [ 125 ], characters: '}' }, + '⤷': { codepoints: [ 10551 ], characters: '⤷' }, + '↳': { codepoints: [ 8627 ], characters: '↳' }, + 'ℜ': { codepoints: [ 8476 ], characters: 'ℜ' }, + '▭': { codepoints: [ 9645 ], characters: '▭' }, + 'ϱ': { codepoints: [ 1009 ], characters: 'ϱ' }, + '˚': { codepoints: [ 730 ], characters: '˚' }, + '𝕣': { codepoints: [ 120163 ], characters: '𝕣' }, + ')': { codepoints: [ 41 ], characters: ')' }, + '𝓇': { codepoints: [ 120007 ], characters: '𝓇' }, + ']': { codepoints: [ 93 ], characters: ']' }, + '▹': { codepoints: [ 9657 ], characters: '▹' }, + '⪸': { codepoints: [ 10936 ], characters: '⪸' }, + '⪶': { codepoints: [ 10934 ], characters: '⪶' }, + '⋅': { codepoints: [ 8901 ], characters: '⋅' }, + '§': { codepoints: [ 167 ], characters: '§' }, + ';': { codepoints: [ 59 ], characters: ';' }, + '✶': { codepoints: [ 10038 ], characters: '✶' }, + 'ш': { codepoints: [ 1096 ], characters: 'ш' }, + '≃': { codepoints: [ 8771 ], characters: '≃' }, + '⪞': { codepoints: [ 10910 ], characters: '⪞' }, + '⪝': { codepoints: [ 10909 ], characters: '⪝' }, + '∣': { codepoints: [ 8739 ], characters: '∣' }, + '⪬': { codepoints: [ 10924 ], characters: '⪬' }, + '⧄': { codepoints: [ 10692 ], characters: '⧄' }, + '𝕤': { codepoints: [ 120164 ], characters: '𝕤' }, + '∥': { codepoints: [ 8741 ], characters: '∥' }, + '▪': { codepoints: [ 9642 ], characters: '▪' }, + '𝓈': { codepoints: [ 120008 ], characters: '𝓈' }, + '☆': { codepoints: [ 9734 ], characters: '☆' }, + '⫅': { codepoints: [ 10949 ], characters: '⫅' }, + '⊆': { codepoints: [ 8838 ], characters: '⊆' }, + '≻': { codepoints: [ 8827 ], characters: '≻' }, + '♪': { codepoints: [ 9834 ], characters: '♪' }, + '¹': { codepoints: [ 185 ], characters: '¹' }, + '²': { codepoints: [ 178 ], characters: '²' }, + '³': { codepoints: [ 179 ], characters: '³' }, + '⫆': { codepoints: [ 10950 ], characters: '⫆' }, + '⊇': { codepoints: [ 8839 ], characters: '⊇' }, + 'ß': { codepoints: [ 223 ], characters: 'ß' }, + '⎴': { codepoints: [ 9140 ], characters: '⎴' }, + '⃛': { codepoints: [ 8411 ], characters: '⃛' }, + 'þ': { codepoints: [ 254 ], characters: 'þ' }, + '×': { codepoints: [ 215 ], characters: '×' }, + '∭': { codepoints: [ 8749 ], characters: '∭' }, + '⤨': { codepoints: [ 10536 ], characters: '⤨' }, + '𝕥': { codepoints: [ 120165 ], characters: '𝕥' }, + '⤩': { codepoints: [ 10537 ], characters: '⤩' }, + '≜': { codepoints: [ 8796 ], characters: '≜' }, + '𝓉': { codepoints: [ 120009 ], characters: '𝓉' }, + 'ц': { codepoints: [ 1094 ], characters: 'ц' }, + '⇑': { codepoints: [ 8657 ], characters: '⇑' }, + '⥣': { codepoints: [ 10595 ], characters: '⥣' }, + '↑': { codepoints: [ 8593 ], characters: '↑' }, + 'û': { codepoints: [ 251 ], characters: 'û' }, + '𝕦': { codepoints: [ 120166 ], characters: '𝕦' }, + 'υ': { codepoints: [ 965 ], characters: 'υ' }, + '𝓊': { codepoints: [ 120010 ], characters: '𝓊' }, + '▵': { codepoints: [ 9653 ], characters: '▵' }, + 'ü': { codepoints: [ 252 ], characters: 'ü' }, + '⇕': { codepoints: [ 8661 ], characters: '⇕' }, + '⫨': { codepoints: [ 10984 ], characters: '⫨' }, + '↕': { codepoints: [ 8597 ], characters: '↕' }, + '|': { codepoints: [ 124 ], characters: '|' }, + '𝕧': { codepoints: [ 120167 ], characters: '𝕧' }, + '𝓋': { codepoints: [ 120011 ], characters: '𝓋' }, + '𝕨': { codepoints: [ 120168 ], characters: '𝕨' }, + '𝓌': { codepoints: [ 120012 ], characters: '𝓌' }, + '⋂': { codepoints: [ 8898 ], characters: '⋂' }, + '⋃': { codepoints: [ 8899 ], characters: '⋃' }, + '⟼': { codepoints: [ 10236 ], characters: '⟼' }, + '⋻': { codepoints: [ 8955 ], characters: '⋻' }, + '𝕩': { codepoints: [ 120169 ], characters: '𝕩' }, + '𝓍': { codepoints: [ 120013 ], characters: '𝓍' }, + '⋁': { codepoints: [ 8897 ], characters: '⋁' }, + 'я': { codepoints: [ 1103 ], characters: 'я' }, + 'ї': { codepoints: [ 1111 ], characters: 'ї' }, + '𝕪': { codepoints: [ 120170 ], characters: '𝕪' }, + '𝓎': { codepoints: [ 120014 ], characters: '𝓎' }, + 'ю': { codepoints: [ 1102 ], characters: 'ю' }, + 'ÿ': { codepoints: [ 255 ], characters: 'ÿ' }, + 'ż': { codepoints: [ 380 ], characters: 'ż' }, + 'ζ': { codepoints: [ 950 ], characters: 'ζ' }, + 'ж': { codepoints: [ 1078 ], characters: 'ж' }, + '𝕫': { codepoints: [ 120171 ], characters: '𝕫' }, + '𝓏': { codepoints: [ 120015 ], characters: '𝓏' }, + '‌': { codepoints: [ 8204 ], characters: '‌' }, + '&': { codepoints: [ 38 ], characters: '&' }, + 'А': { codepoints: [ 1040 ], characters: 'А' }, + '𝔄': { codepoints: [ 120068 ], characters: '𝔄' }, + '⩓': { codepoints: [ 10835 ], characters: '⩓' }, + 'Ä': { codepoints: [ 196 ], characters: 'Ä' }, + 'Б': { codepoints: [ 1041 ], characters: 'Б' }, + '𝔅': { codepoints: [ 120069 ], characters: '𝔅' }, + '©': { codepoints: [ 169 ], characters: '©' }, + '⋒': { codepoints: [ 8914 ], characters: '⋒' }, + 'ℭ': { codepoints: [ 8493 ], characters: 'ℭ' }, + 'Χ': { codepoints: [ 935 ], characters: 'Χ' }, + '⋓': { codepoints: [ 8915 ], characters: '⋓' }, + 'Д': { codepoints: [ 1044 ], characters: 'Д' }, + '∇': { codepoints: [ 8711 ], characters: '∇' }, + '𝔇': { codepoints: [ 120071 ], characters: '𝔇' }, + '¨': { codepoints: [ 168 ], characters: '¨' }, + 'Ŋ': { codepoints: [ 330 ], characters: 'Ŋ' }, + 'Ð': { codepoints: [ 208 ], characters: 'Ð' }, + 'Э': { codepoints: [ 1069 ], characters: 'Э' }, + '𝔈': { codepoints: [ 120072 ], characters: '𝔈' }, + 'Η': { codepoints: [ 919 ], characters: 'Η' }, + 'Ë': { codepoints: [ 203 ], characters: 'Ë' }, + 'Ф': { codepoints: [ 1060 ], characters: 'Ф' }, + '𝔉': { codepoints: [ 120073 ], characters: '𝔉' }, + 'Г': { codepoints: [ 1043 ], characters: 'Г' }, + '𝔊': { codepoints: [ 120074 ], characters: '𝔊' }, + '^': { codepoints: [ 94 ], characters: '^' }, + 'ℌ': { codepoints: [ 8460 ], characters: 'ℌ' }, + 'И': { codepoints: [ 1048 ], characters: 'И' }, + 'ℑ': { codepoints: [ 8465 ], characters: 'ℑ' }, + '∬': { codepoints: [ 8748 ], characters: '∬' }, + 'Ï': { codepoints: [ 207 ], characters: 'Ï' }, + 'Й': { codepoints: [ 1049 ], characters: 'Й' }, + '𝔍': { codepoints: [ 120077 ], characters: '𝔍' }, + 'К': { codepoints: [ 1050 ], characters: 'К' }, + '𝔎': { codepoints: [ 120078 ], characters: '𝔎' }, + 'Л': { codepoints: [ 1051 ], characters: 'Л' }, + '𝔏': { codepoints: [ 120079 ], characters: '𝔏' }, + '↰': { codepoints: [ 8624 ], characters: '↰' }, + '⤅': { codepoints: [ 10501 ], characters: '⤅' }, + 'М': { codepoints: [ 1052 ], characters: 'М' }, + '𝔐': { codepoints: [ 120080 ], characters: '𝔐' }, + 'Н': { codepoints: [ 1053 ], characters: 'Н' }, + '𝔑': { codepoints: [ 120081 ], characters: '𝔑' }, + '⫬': { codepoints: [ 10988 ], characters: '⫬' }, + 'О': { codepoints: [ 1054 ], characters: 'О' }, + '𝔒': { codepoints: [ 120082 ], characters: '𝔒' }, + 'Ö': { codepoints: [ 214 ], characters: 'Ö' }, + 'П': { codepoints: [ 1055 ], characters: 'П' }, + '𝔓': { codepoints: [ 120083 ], characters: '𝔓' }, + 'Φ': { codepoints: [ 934 ], characters: 'Φ' }, + 'Ψ': { codepoints: [ 936 ], characters: 'Ψ' }, + '"': { codepoints: [ 34 ], characters: '"' }, + '𝔔': { codepoints: [ 120084 ], characters: '𝔔' }, + '®': { codepoints: [ 174 ], characters: '®' }, + 'Р': { codepoints: [ 1056 ], characters: 'Р' }, + 'ℜ': { codepoints: [ 8476 ], characters: 'ℜ' }, + 'Ρ': { codepoints: [ 929 ], characters: 'Ρ' }, + '↱': { codepoints: [ 8625 ], characters: '↱' }, + 'С': { codepoints: [ 1057 ], characters: 'С' }, + '𝔖': { codepoints: [ 120086 ], characters: '𝔖' }, + '⋐': { codepoints: [ 8912 ], characters: '⋐' }, + '∑': { codepoints: [ 8721 ], characters: '∑' }, + '⋑': { codepoints: [ 8913 ], characters: '⋑' }, + ' ': { codepoints: [ 9 ], characters: '\t' }, + 'Τ': { codepoints: [ 932 ], characters: 'Τ' }, + 'Т': { codepoints: [ 1058 ], characters: 'Т' }, + '𝔗': { codepoints: [ 120087 ], characters: '𝔗' }, + 'У': { codepoints: [ 1059 ], characters: 'У' }, + '𝔘': { codepoints: [ 120088 ], characters: '𝔘' }, + 'Ü': { codepoints: [ 220 ], characters: 'Ü' }, + 'В': { codepoints: [ 1042 ], characters: 'В' }, + '⋁': { codepoints: [ 8897 ], characters: '⋁' }, + '𝔙': { codepoints: [ 120089 ], characters: '𝔙' }, + '𝔚': { codepoints: [ 120090 ], characters: '𝔚' }, + '𝔛': { codepoints: [ 120091 ], characters: '𝔛' }, + 'Ы': { codepoints: [ 1067 ], characters: 'Ы' }, + '𝔜': { codepoints: [ 120092 ], characters: '𝔜' }, + 'З': { codepoints: [ 1047 ], characters: 'З' }, + 'ℨ': { codepoints: [ 8488 ], characters: 'ℨ' }, + '∾̳': { codepoints: [ 8766, 819 ], characters: '∾̳' }, + '∿': { codepoints: [ 8767 ], characters: '∿' }, + 'а': { codepoints: [ 1072 ], characters: 'а' }, + '𝔞': { codepoints: [ 120094 ], characters: '𝔞' }, + '&': { codepoints: [ 38 ], characters: '&' }, + '∧': { codepoints: [ 8743 ], characters: '∧' }, + '∠': { codepoints: [ 8736 ], characters: '∠' }, + '⩰': { codepoints: [ 10864 ], characters: '⩰' }, + '≊': { codepoints: [ 8778 ], characters: '≊' }, + '*': { codepoints: [ 42 ], characters: '*' }, + 'ä': { codepoints: [ 228 ], characters: 'ä' }, + 'б': { codepoints: [ 1073 ], characters: 'б' }, + '𝔟': { codepoints: [ 120095 ], characters: '𝔟' }, + '=⃥': { codepoints: [ 61, 8421 ], characters: '=⃥' }, + '⊥': { codepoints: [ 8869 ], characters: '⊥' }, + '∩': { codepoints: [ 8745 ], characters: '∩' }, + '¢': { codepoints: [ 162 ], characters: '¢' }, + '𝔠': { codepoints: [ 120096 ], characters: '𝔠' }, + 'χ': { codepoints: [ 967 ], characters: 'χ' }, + '○': { codepoints: [ 9675 ], characters: '○' }, + '©': { codepoints: [ 169 ], characters: '©' }, + '∪': { codepoints: [ 8746 ], characters: '∪' }, + 'д': { codepoints: [ 1076 ], characters: 'д' }, + '°': { codepoints: [ 176 ], characters: '°' }, + '𝔡': { codepoints: [ 120097 ], characters: '𝔡' }, + '¨': { codepoints: [ 168 ], characters: '¨' }, + '÷': { codepoints: [ 247 ], characters: '÷' }, + '˙': { codepoints: [ 729 ], characters: '˙' }, + 'э': { codepoints: [ 1101 ], characters: 'э' }, + '𝔢': { codepoints: [ 120098 ], characters: '𝔢' }, + '⪖': { codepoints: [ 10902 ], characters: '⪖' }, + 'ℓ': { codepoints: [ 8467 ], characters: 'ℓ' }, + '⪕': { codepoints: [ 10901 ], characters: '⪕' }, + 'ŋ': { codepoints: [ 331 ], characters: 'ŋ' }, + 'η': { codepoints: [ 951 ], characters: 'η' }, + 'ð': { codepoints: [ 240 ], characters: 'ð' }, + 'ë': { codepoints: [ 235 ], characters: 'ë' }, + 'ф': { codepoints: [ 1092 ], characters: 'ф' }, + '𝔣': { codepoints: [ 120099 ], characters: '𝔣' }, + '⪌': { codepoints: [ 10892 ], characters: '⪌' }, + '⪆': { codepoints: [ 10886 ], characters: '⪆' }, + 'г': { codepoints: [ 1075 ], characters: 'г' }, + '⋛': { codepoints: [ 8923 ], characters: '⋛' }, + '≥': { codepoints: [ 8805 ], characters: '≥' }, + '⩾': { codepoints: [ 10878 ], characters: '⩾' }, + '𝔤': { codepoints: [ 120100 ], characters: '𝔤' }, + '⋙': { codepoints: [ 8921 ], characters: '⋙' }, + '⪒': { codepoints: [ 10898 ], characters: '⪒' }, + '⪥': { codepoints: [ 10917 ], characters: '⪥' }, + '⪤': { codepoints: [ 10916 ], characters: '⪤' }, + '≩': { codepoints: [ 8809 ], characters: '≩' }, + '⪈': { codepoints: [ 10888 ], characters: '⪈' }, + '𝔥': { codepoints: [ 120101 ], characters: '𝔥' }, + 'и': { codepoints: [ 1080 ], characters: 'и' }, + '⇔': { codepoints: [ 8660 ], characters: '⇔' }, + '𝔦': { codepoints: [ 120102 ], characters: '𝔦' }, + '∫': { codepoints: [ 8747 ], characters: '∫' }, + 'ï': { codepoints: [ 239 ], characters: 'ï' }, + 'й': { codepoints: [ 1081 ], characters: 'й' }, + '𝔧': { codepoints: [ 120103 ], characters: '𝔧' }, + 'к': { codepoints: [ 1082 ], characters: 'к' }, + '𝔨': { codepoints: [ 120104 ], characters: '𝔨' }, + '⪋': { codepoints: [ 10891 ], characters: '⪋' }, + '⪅': { codepoints: [ 10885 ], characters: '⪅' }, + '⪫': { codepoints: [ 10923 ], characters: '⪫' }, + 'л': { codepoints: [ 1083 ], characters: 'л' }, + '⋚': { codepoints: [ 8922 ], characters: '⋚' }, + '≤': { codepoints: [ 8804 ], characters: '≤' }, + '⩽': { codepoints: [ 10877 ], characters: '⩽' }, + '𝔩': { codepoints: [ 120105 ], characters: '𝔩' }, + '⪑': { codepoints: [ 10897 ], characters: '⪑' }, + '≨': { codepoints: [ 8808 ], characters: '≨' }, + '⪇': { codepoints: [ 10887 ], characters: '⪇' }, + '◊': { codepoints: [ 9674 ], characters: '◊' }, + '‎': { codepoints: [ 8206 ], characters: '‎' }, + '↰': { codepoints: [ 8624 ], characters: '↰' }, + '¯': { codepoints: [ 175 ], characters: '¯' }, + '↦': { codepoints: [ 8614 ], characters: '↦' }, + 'м': { codepoints: [ 1084 ], characters: 'м' }, + '𝔪': { codepoints: [ 120106 ], characters: '𝔪' }, + '℧': { codepoints: [ 8487 ], characters: '℧' }, + '∣': { codepoints: [ 8739 ], characters: '∣' }, + '⋙̸': { codepoints: [ 8921, 824 ], characters: '⋙̸' }, + '≫⃒': { codepoints: [ 8811, 8402 ], characters: '≫⃒' }, + '⋘̸': { codepoints: [ 8920, 824 ], characters: '⋘̸' }, + '≪⃒': { codepoints: [ 8810, 8402 ], characters: '≪⃒' }, + '≉': { codepoints: [ 8777 ], characters: '≉' }, + ' ': { codepoints: [ 160 ], characters: ' ' }, + 'н': { codepoints: [ 1085 ], characters: 'н' }, + '𝔫': { codepoints: [ 120107 ], characters: '𝔫' }, + '≧̸': { codepoints: [ 8807, 824 ], characters: '≧̸' }, + '≱': { codepoints: [ 8817 ], characters: '≱' }, + '≯': { codepoints: [ 8815 ], characters: '≯' }, + '⋼': { codepoints: [ 8956 ], characters: '⋼' }, + '∋': { codepoints: [ 8715 ], characters: '∋' }, + '≦̸': { codepoints: [ 8806, 824 ], characters: '≦̸' }, + '≰': { codepoints: [ 8816 ], characters: '≰' }, + '≮': { codepoints: [ 8814 ], characters: '≮' }, + '¬': { codepoints: [ 172 ], characters: '¬' }, + '⊀': { codepoints: [ 8832 ], characters: '⊀' }, + '⊁': { codepoints: [ 8833 ], characters: '⊁' }, + '#': { codepoints: [ 35 ], characters: '#' }, + 'о': { codepoints: [ 1086 ], characters: 'о' }, + '𝔬': { codepoints: [ 120108 ], characters: '𝔬' }, + '⧁': { codepoints: [ 10689 ], characters: '⧁' }, + 'Ω': { codepoints: [ 937 ], characters: 'Ω' }, + '⧀': { codepoints: [ 10688 ], characters: '⧀' }, + '⩝': { codepoints: [ 10845 ], characters: '⩝' }, + 'ª': { codepoints: [ 170 ], characters: 'ª' }, + 'º': { codepoints: [ 186 ], characters: 'º' }, + '⩛': { codepoints: [ 10843 ], characters: '⩛' }, + 'ö': { codepoints: [ 246 ], characters: 'ö' }, + '∥': { codepoints: [ 8741 ], characters: '∥' }, + '¶': { codepoints: [ 182 ], characters: '¶' }, + 'п': { codepoints: [ 1087 ], characters: 'п' }, + '𝔭': { codepoints: [ 120109 ], characters: '𝔭' }, + 'φ': { codepoints: [ 966 ], characters: 'φ' }, + 'ϖ': { codepoints: [ 982 ], characters: 'ϖ' }, + '⪳': { codepoints: [ 10931 ], characters: '⪳' }, + '⪯': { codepoints: [ 10927 ], characters: '⪯' }, + 'ψ': { codepoints: [ 968 ], characters: 'ψ' }, + '𝔮': { codepoints: [ 120110 ], characters: '𝔮' }, + '"': { codepoints: [ 34 ], characters: '"' }, + 'р': { codepoints: [ 1088 ], characters: 'р' }, + '®': { codepoints: [ 174 ], characters: '®' }, + '𝔯': { codepoints: [ 120111 ], characters: '𝔯' }, + 'ρ': { codepoints: [ 961 ], characters: 'ρ' }, + '‏': { codepoints: [ 8207 ], characters: '‏' }, + '↱': { codepoints: [ 8625 ], characters: '↱' }, + '⪴': { codepoints: [ 10932 ], characters: '⪴' }, + '⪰': { codepoints: [ 10928 ], characters: '⪰' }, + 'с': { codepoints: [ 1089 ], characters: 'с' }, + '§': { codepoints: [ 167 ], characters: '§' }, + '𝔰': { codepoints: [ 120112 ], characters: '𝔰' }, + '­': { codepoints: [ 173 ], characters: '­' }, + '∼': { codepoints: [ 8764 ], characters: '∼' }, + '⪪': { codepoints: [ 10922 ], characters: '⪪' }, + '/': { codepoints: [ 47 ], characters: '/' }, + '□': { codepoints: [ 9633 ], characters: '□' }, + '⊂': { codepoints: [ 8834 ], characters: '⊂' }, + '∑': { codepoints: [ 8721 ], characters: '∑' }, + '¹': { codepoints: [ 185 ], characters: '¹' }, + '²': { codepoints: [ 178 ], characters: '²' }, + '³': { codepoints: [ 179 ], characters: '³' }, + '⊃': { codepoints: [ 8835 ], characters: '⊃' }, + 'τ': { codepoints: [ 964 ], characters: 'τ' }, + 'т': { codepoints: [ 1090 ], characters: 'т' }, + '𝔱': { codepoints: [ 120113 ], characters: '𝔱' }, + '⊤': { codepoints: [ 8868 ], characters: '⊤' }, + 'у': { codepoints: [ 1091 ], characters: 'у' }, + '𝔲': { codepoints: [ 120114 ], characters: '𝔲' }, + '¨': { codepoints: [ 168 ], characters: '¨' }, + 'ü': { codepoints: [ 252 ], characters: 'ü' }, + 'в': { codepoints: [ 1074 ], characters: 'в' }, + '∨': { codepoints: [ 8744 ], characters: '∨' }, + '𝔳': { codepoints: [ 120115 ], characters: '𝔳' }, + '𝔴': { codepoints: [ 120116 ], characters: '𝔴' }, + '𝔵': { codepoints: [ 120117 ], characters: '𝔵' }, + 'ы': { codepoints: [ 1099 ], characters: 'ы' }, + '¥': { codepoints: [ 165 ], characters: '¥' }, + '𝔶': { codepoints: [ 120118 ], characters: '𝔶' }, + 'ÿ': { codepoints: [ 255 ], characters: 'ÿ' }, + 'з': { codepoints: [ 1079 ], characters: 'з' }, + '𝔷': { codepoints: [ 120119 ], characters: '𝔷' }, + '‍': { codepoints: [ 8205 ], characters: '‍' }, + '&': { codepoints: [ 38 ], characters: '&' }, + 'ⅅ': { codepoints: [ 8517 ], characters: 'ⅅ' }, + 'Ð': { codepoints: [ 208 ], characters: 'Ð' }, + '>': { codepoints: [ 62 ], characters: '>' }, + '⋙': { codepoints: [ 8921 ], characters: '⋙' }, + '≫': { codepoints: [ 8811 ], characters: '≫' }, + 'ℑ': { codepoints: [ 8465 ], characters: 'ℑ' }, + '<': { codepoints: [ 60 ], characters: '<' }, + '⋘': { codepoints: [ 8920 ], characters: '⋘' }, + '≪': { codepoints: [ 8810 ], characters: '≪' }, + 'Μ': { codepoints: [ 924 ], characters: 'Μ' }, + 'Ν': { codepoints: [ 925 ], characters: 'Ν' }, + '⩔': { codepoints: [ 10836 ], characters: '⩔' }, + 'Π': { codepoints: [ 928 ], characters: 'Π' }, + '⪻': { codepoints: [ 10939 ], characters: '⪻' }, + '®': { codepoints: [ 174 ], characters: '®' }, + 'ℜ': { codepoints: [ 8476 ], characters: 'ℜ' }, + '⪼': { codepoints: [ 10940 ], characters: '⪼' }, + 'Ξ': { codepoints: [ 926 ], characters: 'Ξ' }, + '∾': { codepoints: [ 8766 ], characters: '∾' }, + '⁡': { codepoints: [ 8289 ], characters: '⁡' }, + '&': { codepoints: [ 38 ], characters: '&' }, + '≈': { codepoints: [ 8776 ], characters: '≈' }, + 'ⅆ': { codepoints: [ 8518 ], characters: 'ⅆ' }, + '°': { codepoints: [ 176 ], characters: '°' }, + 'ⅇ': { codepoints: [ 8519 ], characters: 'ⅇ' }, + '⪚': { codepoints: [ 10906 ], characters: '⪚' }, + '⪙': { codepoints: [ 10905 ], characters: '⪙' }, + 'ð': { codepoints: [ 240 ], characters: 'ð' }, + '≧': { codepoints: [ 8807 ], characters: '≧' }, + '≥': { codepoints: [ 8805 ], characters: '≥' }, + '≫': { codepoints: [ 8811 ], characters: '≫' }, + '≷': { codepoints: [ 8823 ], characters: '≷' }, + '>': { codepoints: [ 62 ], characters: '>' }, + '⁣': { codepoints: [ 8291 ], characters: '⁣' }, + 'ⅈ': { codepoints: [ 8520 ], characters: 'ⅈ' }, + '∈': { codepoints: [ 8712 ], characters: '∈' }, + '⁢': { codepoints: [ 8290 ], characters: '⁢' }, + '≦': { codepoints: [ 8806 ], characters: '≦' }, + '≤': { codepoints: [ 8804 ], characters: '≤' }, + '≶': { codepoints: [ 8822 ], characters: '≶' }, + '≪': { codepoints: [ 8810 ], characters: '≪' }, + '<': { codepoints: [ 60 ], characters: '<' }, + '∓': { codepoints: [ 8723 ], characters: '∓' }, + 'μ': { codepoints: [ 956 ], characters: 'μ' }, + '≠': { codepoints: [ 8800 ], characters: '≠' }, + '∋': { codepoints: [ 8715 ], characters: '∋' }, + '¬': { codepoints: [ 172 ], characters: '¬' }, + 'ν': { codepoints: [ 957 ], characters: 'ν' }, + 'Ⓢ': { codepoints: [ 9416 ], characters: 'Ⓢ' }, + '∨': { codepoints: [ 8744 ], characters: '∨' }, + 'π': { codepoints: [ 960 ], characters: 'π' }, + '±': { codepoints: [ 177 ], characters: '±' }, + '≺': { codepoints: [ 8826 ], characters: '≺' }, + '®': { codepoints: [ 174 ], characters: '®' }, + '℞': { codepoints: [ 8478 ], characters: '℞' }, + '≻': { codepoints: [ 8827 ], characters: '≻' }, + '­': { codepoints: [ 173 ], characters: '­' }, + '¨': { codepoints: [ 168 ], characters: '¨' }, + '℘': { codepoints: [ 8472 ], characters: '℘' }, + '≀': { codepoints: [ 8768 ], characters: '≀' }, + 'ξ': { codepoints: [ 958 ], characters: 'ξ' }, + '¥': { codepoints: [ 165 ], characters: '¥' }, + '>': { codepoints: [ 62 ], characters: '>' }, + '<': { codepoints: [ 60 ], characters: '<' }, + '>': { codepoints: [ 62 ], characters: '>' }, + '<': { codepoints: [ 60 ], characters: '<' } +}; diff --git a/src/html/tokenizer/position.ts b/src/html/tokenizer/position.ts new file mode 100644 index 0000000..1de8ad1 --- /dev/null +++ b/src/html/tokenizer/position.ts @@ -0,0 +1,60 @@ +import { Inspectable } from '../highlighter/inspectable.js'; + +export class Position extends Inspectable { + #line: number; + #column: number; + #index: number; + + private constructor(line: number, column: number, index: number) { + super(); + + this.#line = line; + this.#column = column; + this.#index = index; + } + + public get line(): number { + return this.#line; + } + + public get column(): number { + return this.#column; + } + + public get index(): number { + return this.#index; + } + + public increment(by: number = 1): this { + this.#index += by; + this.#column += by; + + return this; + } + + public decrement(by: number = 1): this { + this.#index -= by; + this.#column -= by; + + return this; + } + + public incrementLine(): this { + this.#line++; + this.#column = 0; + + return this; + } + + public copy(): Position { + return new Position(this.line, this.column, this.index); + } + + public static createStarting(): Position { + return new Position(0, 0, -1); + } + + public override inspect(indent: number): string { + return `Position { line: ${this.#line}, column: ${this.#column}, index: ${this.#index} }`; + } +} diff --git a/src/html/tokenizer/range.ts b/src/html/tokenizer/range.ts new file mode 100644 index 0000000..cd950b0 --- /dev/null +++ b/src/html/tokenizer/range.ts @@ -0,0 +1,6 @@ +import { Position } from './position.js'; + +export type Range = { + start: Position, + end: Position +}; diff --git a/src/html/tokenizer/state.ts b/src/html/tokenizer/state.ts new file mode 100644 index 0000000..1708a63 --- /dev/null +++ b/src/html/tokenizer/state.ts @@ -0,0 +1,82 @@ +export const enum State { + Data = 'Data', + RCDATA = 'RCDATA', + RAWTEXT = 'RAWTEXT', + ScriptData = 'Script data', + PLAINTEXT = 'PLAINTEXT', + TagOpen = 'Tag open', + EndTagOpen = 'End tag open', + TagName = 'Tag name', + RCDATALessThanSign = 'RCDATA less-than sign', + RCDATAEndTagOpen = 'RCDATA end tag open', + RCDATAEndTagName = 'RCDATA end tag name', + RAWTEXTLessThan = 'RAWTEXT less-than', + RAWTEXTEndTagOpen = 'RAWTEXT end tag open', + RAWTEXTEndTagName = 'RAWTEXT end tag name', + ScriptDataLessThanSign = 'Script data less-than sign', + ScriptDataEndTagOpen = 'Script data end tag open', + ScriptDataEndTagName = 'Script data end tag name', + ScriptDataEscapeStart = 'Script data escape start', + ScriptDataEscapeStartDash = 'Script data escape start dash', + ScriptDataEscaped = 'Script data escaped', + ScriptDataEscapedDash = 'Script data escaped dash', + ScriptDataEscapedDashDash = 'Script data escaped dash dash', + ScriptDataEscapedLessThanSign = 'Script data escaped less-than sign', + ScriptDataEscapedEndTagOpen = 'Script data escaped end tag open', + ScriptDataEscapedEndTagName = 'Script data escaped end tag name', + ScriptDataDoubleEscapeStart = 'Script data double escape start', + ScriptDataDoubleEscaped = 'Script data double escaped', + ScriptDataDoubleEscapedDash = 'Script data double escaped dash', + ScriptDataDoubleEscapedDashDash = 'Script data double escaped dash dash', + ScriptDataDoubleEscapedLessThanSign = 'Script data double escaped less-than sign', + ScriptDataDoubleEscapedEnd = 'Script data double escape end', + BeforeAttributeName = 'Before attribute name', + AttributeName = 'Attribute name', + AfterAttributeName = 'After attribute name', + BeforeAttributeValue = 'Before attribute value', + AttributeValueDouble = 'Attribute value (double-quoted)', + AttributeValueSingle = 'Attribute value (single-quoted)', + AttributeValueUnquoted = 'Attribute value (unquoted)', + AfterAttributeValue = 'After attribute value (quoted)', + SelfClosingStartTag = 'Self-closing start tag', + BogusComment = 'Bogus comment', + MarkupDeclarationOpen = 'Markup declaration open', + CommentStart = 'Comment start', + CommentStartDash = 'Comment start dash', + Comment = 'Comment', + CommentLessThanSign = 'Comment less-than sign', + CommentLessThanSignBang = 'Comment less-than sign bang', + CommentLessThanSignBangDash= 'Comment less-than sign bang dash', + CommentLessThanSignBangDashDash = 'Comment less-than sign bang dash dash', + CommentEndDash = 'Comment end dash', + CommentEnd = 'Comment end', + CommentEndBang = 'Comment end bang', + DOCTYPE = 'DOCTYPE', + BeforeDOCTYPEName = 'Before DOCTYPE name', + DOCTYPEName = 'DOCTYPE name', + AfterDOCTYPEName= 'After DOCTYPE name', + AfterDOCTYPEPublicKeyword = 'After DOCTYPE public keyword', + BeforeDOCTYPEPublicIdentifier = 'Before DOCTYPE public identifier', + DOCTYPEPublicIdentifierDouble = 'DOCTYPE public identifier (double-quoted)', + DOCTYPEPublicIdentifierSingle = 'DOCTYPE public identifier (single-quoted)', + AfterDOCTYPEPublicIdentifier = 'After DOCTYPE public identifier', + BetweenDOCTYPEPublicAndSystemIdentifiers = 'Between DOCTYPE public and system identifiers', + AfterDOCTYPESystemKeyword = 'After DOCTYPE system keyword', + BeforeDOCTYPESystemIdentifier = 'Before DOCTYPE system identifier', + DOCTYPESystemIdentifierDouble = 'DOCTYPE system identifier (double-quoted)', + DOCTYPESystemIdentifierSingle = 'DOCTYPE system identifier (single-quoted)', + AfterDOCTYPESystemIdentifier = 'After DOCTYPE system identifier', + BogusDOCTYPE = 'Bogus DOCTYPE', + CDATASection = 'CDATA section', + CDATASectionBracket = 'CDATA section bracket', + CDATASectionEnd = 'CDATA section end', + CharacterReference = 'Character reference', + NamedCharacterReference = 'Named character reference', + AmbiguousAmpersand = 'Ambiguous ampersand', + NumericCharacterReference = 'Numeric character reference', + HexadecimalCharacterReferenceStart = 'Hexadecimal character reference start', + DecimalCharacterReferenceStart = 'Decimal character reference start', + HexadecimalCharacterReference = 'Hexadecimal character reference', + DecimalCharacterReference = 'Decimal character reference', + NumericCharacterReferenceEnd = 'Numeric character reference end' +} diff --git a/src/html/tokenizer/token.ts b/src/html/tokenizer/token.ts new file mode 100644 index 0000000..7dc3219 --- /dev/null +++ b/src/html/tokenizer/token.ts @@ -0,0 +1,55 @@ +import { Inspectable } from '../highlighter/inspectable.js'; +import { Position } from './position.js'; +import { Range } from './range.js'; + +export const enum Type { + DOCTYPE = 'DOCTYPE', + StartTag = 'start tag', + EndTag = 'end tag', + Comment = 'comment', + Character = 'character', + EndOfFile = 'end-of-file' +} + +export const REPLACEMENT_CHARACTER = '\uFFFD'; + +export abstract class Token extends Inspectable { + #type: Type; + #range!: Range; + + protected constructor(type: Type) { + super(); + + this.#type = type; + + // @ts-expect-error + this.#range = {}; + } + + public startingAt(position: Position): this { + this.#range.start = position.copy(); + + return this; + } + + public endingAt(position: Position): this { + this.#range.end = position.copy(); + + return this; + } + + public at(position: Position): this { + this.#range.start = position.copy(); + this.#range.end = position.copy(); + + return this; + } + + public get range(): Range { + return this.#range; + } + + public get type(): Type { + return this.#type; + } +} diff --git a/src/html/tokenizer/tokens/character.ts b/src/html/tokenizer/tokens/character.ts new file mode 100644 index 0000000..b5e2707 --- /dev/null +++ b/src/html/tokenizer/tokens/character.ts @@ -0,0 +1,23 @@ +import { REPLACEMENT_CHARACTER, Token, Type } from '../token.js'; + +export class CharacterToken extends Token { + public readonly data: NonNullable; + + public constructor(data: NonNullable) { + super(Type.Character); + + this.data = data; + } + + public static createWith(data: NonNullable): CharacterToken { + return new CharacterToken(data); + } + + public static createReplacementCharacter(): CharacterToken { + return new CharacterToken(REPLACEMENT_CHARACTER); + } + + public override inspect(indent: number): string { + return `CharacterToken { '${this.data}' }`; + } +} diff --git a/src/html/tokenizer/tokens/comment.ts b/src/html/tokenizer/tokens/comment.ts new file mode 100644 index 0000000..b771e66 --- /dev/null +++ b/src/html/tokenizer/tokens/comment.ts @@ -0,0 +1,31 @@ +import { Token, Type, REPLACEMENT_CHARACTER } from '../token.js'; + +export class CommentToken extends Token { + public data: NonNullable; + + public constructor(data: NonNullable) { + super(Type.Comment); + + this.data = data; + } + + public append(characters: string): void { + this.data += characters; + } + + public appendReplacementCharacter(): void { + this.append(REPLACEMENT_CHARACTER); + } + + public static createEmpty(): CommentToken { + return new CommentToken(''); + } + + public static createWith(data: string): CommentToken { + return new CommentToken(data); + } + + public override inspect(indent: number): string { + return `CommentToken { '${this.data}' }`; + } +} diff --git a/src/html/tokenizer/tokens/doctype.ts b/src/html/tokenizer/tokens/doctype.ts new file mode 100644 index 0000000..a041ae7 --- /dev/null +++ b/src/html/tokenizer/tokens/doctype.ts @@ -0,0 +1,40 @@ +import { VERIFY } from '../../../util/assertions.js'; +import { Token, Type, REPLACEMENT_CHARACTER } from '../token.js'; + +export class DOCTYPEToken extends Token { + public name?: string; + public publicIdentifier?: string; + public systemIdentifier?: string; + public forceQuirks?: true; + + public constructor(name?: string, publicIdentifier?: string, systemIdentifier?: string, forceQuirks?: true) { + super(Type.DOCTYPE); + + this.name = name; + this.publicIdentifier = publicIdentifier; + this.systemIdentifier = systemIdentifier; + this.forceQuirks = forceQuirks; + } + + public appendToName(characters: string): void { + VERIFY(this.name !== undefined); + + this.name += characters; + } + + public appendReplacementCharacterToName(): void { + this.appendToName(REPLACEMENT_CHARACTER); + } + + public static createWithForcedQuirks(): DOCTYPEToken { + return new DOCTYPEToken(undefined, undefined, undefined, true); + } + + public static createWithName(name: string): DOCTYPEToken { + return new DOCTYPEToken(name, undefined, undefined, undefined); + } + + public override inspect(indent: number): string { + return `DOCTYPEToken { '${this.name}' }`; + } +} diff --git a/src/html/tokenizer/tokens/endOfFile.ts b/src/html/tokenizer/tokens/endOfFile.ts new file mode 100644 index 0000000..e01473f --- /dev/null +++ b/src/html/tokenizer/tokens/endOfFile.ts @@ -0,0 +1,15 @@ +import { Token, Type } from '../token.js'; + +export class EndOfFileToken extends Token { + public constructor() { + super(Type.EndOfFile); + } + + public static create(): EndOfFileToken { + return new EndOfFileToken(); + } + + public override inspect(indent: number): string { + return 'EndOfFileToken'; + } +} diff --git a/src/html/tokenizer/tokens/endTag.ts b/src/html/tokenizer/tokens/endTag.ts new file mode 100644 index 0000000..0f7888d --- /dev/null +++ b/src/html/tokenizer/tokens/endTag.ts @@ -0,0 +1,30 @@ +import { AttributeList } from '../attribute.js'; +import { Token, Type, REPLACEMENT_CHARACTER } from '../token.js'; + +export class EndTagToken extends Token { + public name: NonNullable; + public readonly attributes: AttributeList; + + public constructor(name: NonNullable, attributes: AttributeList) { + super(Type.EndTag); + + this.name = name; + this.attributes = attributes; + } + + public appendToName(characters: string): void { + this.name += characters; + } + + public appendReplacementCharacterToName(): void { + this.appendToName(REPLACEMENT_CHARACTER); + } + + public static createEmpty(): EndTagToken { + return new EndTagToken('', new AttributeList()); + } + + public override inspect(indent: number): string { + return `EndTagToken { '${this.name}' }`; + } +} diff --git a/src/html/tokenizer/tokens/startTag.ts b/src/html/tokenizer/tokens/startTag.ts new file mode 100644 index 0000000..666dade --- /dev/null +++ b/src/html/tokenizer/tokens/startTag.ts @@ -0,0 +1,30 @@ +import { AttributeList } from '../attribute.js'; +import { Token, Type, REPLACEMENT_CHARACTER } from '../token.js'; + +export class StartTagToken extends Token { + public name: NonNullable; + public readonly attributes: AttributeList; + + public constructor(name: NonNullable, attributes: AttributeList) { + super(Type.StartTag); + + this.name = name; + this.attributes = attributes; + } + + public appendToName(characters: string): void { + this.name += characters; + } + + public appendReplacementCharacterToName(): void { + this.appendToName(REPLACEMENT_CHARACTER); + } + + public static createEmpty(): StartTagToken { + return new StartTagToken('', new AttributeList()); + } + + public override inspect(indent: number): string { + return `StartTagToken { '${this.name}' }`; + } +} diff --git a/src/javascript.ts b/src/javascript.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/javascript/tokenizer.ts b/src/javascript/tokenizer.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx deleted file mode 100644 index d462344..0000000 --- a/src/pages/_app.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import "../styles/tailwind.css" - -function MyApp({ Component, pageProps }) { - return -} -export default MyApp diff --git a/src/styles/tailwind.css b/src/styles/tailwind.css deleted file mode 100644 index de15c91..0000000 --- a/src/styles/tailwind.css +++ /dev/null @@ -1,3 +0,0 @@ -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; \ No newline at end of file diff --git a/src/util/assertions.ts b/src/util/assertions.ts new file mode 100644 index 0000000..60d0a53 --- /dev/null +++ b/src/util/assertions.ts @@ -0,0 +1,15 @@ +export function VERIFY(condition: boolean, message?: string): asserts condition { + if (!condition) throw new Error(`VERIFY: ${message ?? 'Condition was not met.'}`); +} + +export function VERIFY_NOT_REACHED(message?: string): void { + if (message !== undefined) throw new Error(`VERIFY_NOT_REACHED: ${message}`); + + throw new Error('VERIFY_NOT_REACHED'); +} + +export function TODO(message?: string): void { + if (message !== undefined) throw new Error(`TODO: ${message}`); + + throw new Error('TODO'); +} diff --git a/src/util/guards.ts b/src/util/guards.ts new file mode 100644 index 0000000..6dd31b3 --- /dev/null +++ b/src/util/guards.ts @@ -0,0 +1,2 @@ +export type NonEmptyArray = [T, ...T[]]; +export type Constructor = new(...args: Array) => T; diff --git a/src/view.ts b/src/view.ts new file mode 100644 index 0000000..fb5226e --- /dev/null +++ b/src/view.ts @@ -0,0 +1,89 @@ +import { Color } from './html/highlighter/properties/color.js'; +import { Property } from './html/highlighter/property.js'; +import { Span } from './html/highlighter/span.js'; +import { Inspector } from './html/inspector.js'; + +const sameProperties = (a: Array | undefined, b: Array | undefined): boolean => { + if (a === undefined || b === undefined) return false; + if (a.length !== b.length) return false; + + for (const property of a) { + let found = false; + + for (const otherProperty of b) + if (property.equals(otherProperty)) + found = true; + + if (!found) return false; + } + + return true; +}; + +const applyProperties = (element: HTMLSpanElement, properties: Array): void => { + for (const property of properties) + property.apply(element); +}; + +export function render(text: string, spans: Array, inspector: Inspector): void { + console.time('render'); + + const container = document.createElement('pre'); + container.ariaHidden = 'true'; + + for (const child of document.body.children) { + (child as HTMLElement).style.display = 'none'; + child.ariaHidden = 'false'; + } + + document.body.appendChild(container); + + const defaultProperties: Array = [ Color.Plain ]; + const defaultTagName: keyof HTMLElementTagNameMap = 'span'; + + let lastProperties: Array = defaultProperties; + let lastTagName: keyof HTMLElementTagNameMap = defaultTagName; + let lastElement: HTMLSpanElement = document.createElement(lastTagName); + + applyProperties(lastElement, lastProperties); + + container.appendChild(lastElement); + + for (let characterIndex = 0; characterIndex < text.length; characterIndex++) { + const character = text[characterIndex]; + + let topMostProperties: Array = defaultProperties; + let topMostTagName: keyof HTMLElementTagNameMap = defaultTagName; + + const matchingSpans = new Array(); + + for (const span of spans) { + if (span.contains(characterIndex)) { + matchingSpans.push(span); + + topMostProperties = span.properties; + topMostTagName = span.tagName; + } + } + + if (sameProperties(lastProperties, topMostProperties) && topMostTagName === lastTagName) { + lastElement.textContent += character; + + inspector.instrument(lastElement, matchingSpans); + } else { + lastElement = document.createElement(topMostTagName); + lastElement.textContent = character; + + inspector.instrument(lastElement, matchingSpans); + + applyProperties(lastElement, topMostProperties); + + lastProperties = topMostProperties; + lastTagName = topMostTagName; + + container.appendChild(lastElement); + } + } + + console.timeEnd('render'); +} diff --git a/tsconfig.json b/tsconfig.json index a0da874..1b443dd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,15 @@ { - "compilerOptions": { - "target": "es6", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve" - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["**/node_modules"] + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "sourceMap": true, + "rootDir": "src", + "outDir": "public/script", + "strict": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "noImplicitAny": true, + "noImplicitOverride": true + } }