diff --git a/html/highlighter.ts b/html/highlighter.ts deleted file mode 100644 index b34222f..0000000 --- a/html/highlighter.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { Palette } from "./highlighter/palette"; -import { Node, Position } from "./highlighter/node"; -import { State } from "./highlighter/state"; -import { Token, Type } from "./tokenizer/token"; -import { TODO, VERIFY, VERIFY_NOT_REACHED } from "../util/assertions.js"; - -export class Highlighter { - private state: State = State.Undefined; - private returnState!: State; - - private currentToken!: Token; - private currentNode!: Node; - - public nodes: Array = new Array(); - private pointer: number = 0; - - public finished: boolean = false; - - public constructor(private tokens: Array) { - } - - public spin(): void { - switch (this.state) { - case State.Undefined: { - switch (this.consumeNextTokenType()) { - case Type.Character: this.reconsumeIn(State.BeforePlain); break; - case Type.StartTag: this.reconsumeIn(State.StartTag); break; - case Type.EndTag: this.reconsumeIn(State.EndTag); break; - case Type.DOCTYPE: this.reconsumeIn(State.DOCTYPE); break; - case Type.Comment: this.reconsumeIn(State.Comment); break; - case Type.EndOfFile: this.finished = true; break; - default: TODO(`Unimplemented token type '${this.currentToken.type}'`); - } - - break; - } - case State.BeforePlain: { - switch (this.consumeNextTokenType()) { - case Type.Character: - this.createNode({ position: { line: 0, character: 0 }, color: Palette.Plain, content: '' }); - this.reconsumeIn(State.Plain); - break; - default: VERIFY_NOT_REACHED(this.currentToken.type); - } - - break; - } - case State.Plain: { - switch (this.consumeNextTokenType()) { - case Type.Character: this.currentNode.content += this.currentTokenOfType(CharacterToken).data; break; - default: - this.emitNode(this.currentNode); - this.reconsumeIn(State.Undefined); - } - - break; - } - case State.StartTag: { - switch (this.consumeNextTokenOfType(StartTagToken).name) { - case 'script': this.returnState = State.BeforeScript; break; - default: this.returnState = State.Undefined; break; - } - - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Punctuator, content: `<` }); - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Tag, content: this.currentTokenOfType(StartTagToken).name }); - - if (this.currentTokenOfType(StartTagToken).attributes.nonEmpty()) { - this.emitSpace({ line: 0, character: 0 }); - this.reconsumeIn(State.Attributes); - } - - this.reconsumeIn(State.AfterAttributes); - - this.state = this.returnState; - - break; - } - case State.EndTag: { - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Punctuator, content: '' }); - // } else { - // this.emitSpace({ line: 0, character: 0 }); - // this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Punctuator, content: '/>' }); - // } - break; - case Type.EndTag: - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Punctuator, content: '>' }); - break; - default: VERIFY_NOT_REACHED(this.currentToken.type); - } - - break; - } - case State.BeforeScript: { - switch (this.consumeNextTokenType()) { - case Type.Character: - this.createNode({ position: { line: 0, character: 0 }, color: Palette.String, content: '' }); - this.reconsumeIn(State.Script); - break; - case Type.EndTag: this.reconsumeIn(State.EndTag); break; - default: VERIFY_NOT_REACHED(this.currentToken.type); - } - - break; - } - case State.Script: { - switch (this.consumeNextTokenType()) { - case Type.Character: this.currentNode.content += this.currentTokenOfType(CharacterToken).data; break; - default: - this.emitNode(this.currentNode); - this.reconsumeIn(State.Undefined); - } - - break; - } - case State.DOCTYPE: { - const doctype = this.consumeNextTokenOfType(DOCTYPEToken); - - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Punctuator, content: '' }); - - this.state = State.Undefined; - - break; - } - case State.Comment: - this.emitNode({ position: { line: 0, character: 0 }, color: Palette.Comment, content: `` }); - - this.state = State.Undefined; - break; - default: TODO(`Unimplemented state '${this.state}'`); - } - } - - private emitNode(node: Node): void { - this.nodes.push(node); - } - - private emitSpace(position: Position): void { - this.nodes.push({ position, color: Palette.Plain, content: ' ' }); - } - - private createNode(node: Node): Node { - return this.currentNode = node; - } - - private consumeNextTokenOfType(type: Constructor): T { - this.currentToken = this.tokens[this.pointer]; - - VERIFY(this.currentToken instanceof type, `Expected '${type.name}', got '${this.currentToken.constructor.name}' instead`); - - this.pointer++; - - return this.currentToken; - } - - private consumeNextTokenOfEitherType(a: Constructor, b: Constructor): T | U { - this.currentToken = this.tokens[this.pointer]; - - VERIFY(this.currentToken instanceof a || this.currentToken instanceof b, `Expected '${a.name}' or '${b.name}', got '${this.currentToken.constructor.name}' instead`); - - this.pointer++; - - return this.currentToken; - } - - private consumeNextTokenType(): Type { - this.currentToken = this.tokens[this.pointer]; - this.pointer++; - - return this.currentToken?.type; - } - - private consumeNextToken(): Token { - this.currentToken = this.tokens[this.pointer]; - this.pointer++; - - return this.currentToken; - } - - private currentTokenOfType(type: Constructor): T { - VERIFY(this.currentToken instanceof type, `Expected '${type.name}', got '${this.currentToken.constructor.name}' instead`); - - return this.currentToken; - } - - private currentTokenOfEitherType(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 reconsumeIn(state: State): void { - this.pointer--; - this.state = state; - this.spin(); - } -} \ No newline at end of file diff --git a/html/highlighter/node.ts b/html/highlighter/node.ts deleted file mode 100644 index bfeec30..0000000 --- a/html/highlighter/node.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Palette } from "./palette" - -export type Node = { - content: string; - position: Position; - color: Palette; -} - -export type Position = { - line: number; - character: number; -} \ No newline at end of file diff --git a/html/highlighter/palette.ts b/html/highlighter/palette.ts deleted file mode 100644 index 3f7e56f..0000000 --- a/html/highlighter/palette.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const enum Palette { - Plain = '#a6accd', - Punctuator = '#89ddff', - Tag = '#f07178', - Attribute = '#c792ea', - String = '#c3e88d', - Comment = '#676e95', -} \ No newline at end of file diff --git a/html/highlighter/state.ts b/html/highlighter/state.ts deleted file mode 100644 index 6500b17..0000000 --- a/html/highlighter/state.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const enum State { - Undefined = 'undefined', - BeforePlain = 'before plain', - Plain = 'plain', - StartTag = 'start tag', - EndTag = 'end tag', - Attributes = 'attributes', - BeforeScript = 'before script', - AfterAttributes = 'after attributes', - DOCTYPE = 'DOCTYPE', - Script = 'script', - Comment = 'comment' -} \ No newline at end of file diff --git a/html/tokenizer.ts b/html/tokenizer.ts deleted file mode 100644 index b7d5532..0000000 --- a/html/tokenizer.ts +++ /dev/null @@ -1,657 +0,0 @@ -import { TODO, VERIFY, VERIFY_NOT_REACHED } from "../util/assertions.js"; -import { Constructor } from "../util/guards.js"; -import { ParseError } from "./errors.js"; -import { entities } from "./tokenizer/entities.js"; -import { State } from "./tokenizer/state.js"; -import { Attribute, CharacterToken, CommentToken, DOCTYPEToken, EndOfFileToken, EndTagToken, Position, StartTagToken, Token } from "./tokenizer/token.js"; - -export class Tokenizer { - private state: State = State.Data; - private returnState!: State; - - private temporaryBuffer!: string; - - private currentToken!: Token; - private currentInputCharacter!: string; - - private currentPosition: Position = { line: 0, column: 0, index: 0 }; - - 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)); - 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)); - this.state = State.AttributeName; - break; - } - default: { - this.currentOfEitherType(StartTagToken, EndTagToken).attributes.append(Attribute.createWithEmptyNameAndValue()); - 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.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.state = State.SelfClosingStartTag; break; - case '\u003D': this.state = State.BeforeAttributeValue; 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.currentOfEitherType(StartTagToken, EndTagToken).attributes.append(Attribute.createWithEmptyNameAndValue()); - this.reconsumeIn(State.AttributeName); - break; - } - - break; - } - case State.BeforeAttributeValue: { - switch (this.consumeNext()) { - case '\u0009': - case '\u000A': - case '\u000C': - case '\u0020': break; - case '\u0022': this.state = State.AttributeValueDouble; break; - case '\u0027': this.state = State.AttributeValueSingle; break; - case '\u003E': - this.parseError('missing-attribute-value'); - this.state = State.Data; - this.emitCurrentOfEitherType(StartTagToken, EndTagToken); - break; - default: - this.reconsumeIn(State.AttributeValueUnquoted); - } - - break; - } - case State.AttributeValueDouble: { - switch (this.consumeNext()) { - case '\u0022': 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.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: { - 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.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.emitCurrentOfType(CommentToken); 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.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.column++; - this.currentPosition.index++; - - if (this.currentInputCharacter === '\n') { - this.currentPosition.column = 0; - this.currentPosition.line++; - } - - 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`); - - this.populateRangeOnEmit(this.currentToken); - 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`); - - this.populateRangeOnEmit(this.currentToken); - 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/html/tokenizer/entities.ts b/html/tokenizer/entities.ts deleted file mode 100644 index 84ae845..0000000 --- a/html/tokenizer/entities.ts +++ /dev/null @@ -1,2236 +0,0 @@ -// 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: "<" } -}; \ No newline at end of file diff --git a/html/tokenizer/token.ts b/html/tokenizer/token.ts deleted file mode 100644 index ea1aced..0000000 --- a/html/tokenizer/token.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { VERIFY, VERIFY_NOT_REACHED } from "../../util/assertions.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 type Range = { - start: Position, - end: Position -} - -export type Position = { - line: number, - column: number, - index: number -} - -export class Attribute { - public name: string; - public value: string; - - public constructor(name: string, value: string) { - this.name = name; - this.value = value; - } - - 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 static createWithEmptyNameAndValue(): Attribute { - return new Attribute('', ''); - } - - public static createWithEmptyValue(name: string): Attribute { - return new Attribute(name, ''); - } -} - -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); - } -} - -export abstract class Token { - #type: Type; - #range!: Range; - - protected constructor(type: Type) { - this.#type = type; - - // @ts-expect-error - this.#range = {}; - } - - public startingAt(position: Position): this { - this.#range.start = { line: position.line, column: position.column, index: position.index }; - - return this; - } - - public endingAt(position: Position): this { - this.#range.end = { line: position.line, column: position.column, index: position.index }; - - return this; - } - - public at(position: Position): this { - this.#range.start = { line: position.line, column: position.column, index: position.index }; - this.#range.end = { line: position.line, column: position.column, index: position.index }; - - return this; - } - - public get range(): Range { - return this.#range; - } - - public get type(): Type { - return this.#type; - } -} - -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); - } -} - -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); - } -} - -export class EndOfFileToken extends Token { - public constructor() { - super(Type.EndOfFile); - } - - public static create(): EndOfFileToken { - return new EndOfFileToken(); - } -} - -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()); - } -} - -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()); - } -} - -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); - } -} - -export function stringify(token: Token): string { - if (token instanceof CharacterToken) return token.data; - if (token instanceof CommentToken) return ``; - if (token instanceof DOCTYPEToken) return ``; - if (token instanceof EndOfFileToken) return 'EOF'; - if (token instanceof EndTagToken) return ``; - if (token instanceof StartTagToken) { - let string = `<${token.name}`; - - for (const attribute of token.attributes.list) - string += ` ${attribute.name}="${attribute.value}"`; - - // TODO: Implemement selfClosing - // if (token.selfClosing) return `${string} />`; - - return `${string}>`; - } - - VERIFY_NOT_REACHED(token.constructor.name); - - return ''; -} \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index f7017b1..0000000 --- a/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - nwex.de - - -

networkException

-

- - - diff --git a/package.json b/package.json index b65a5db..f603e44 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Landing page for nwex.de", "scripts": { - "start": "concurrently --kill-others 'tsc -p tsconfig.json --watch' 'reload -b'" + "start": "concurrently --kill-others 'tsc -p tsconfig.json --watch' 'reload -b -d public'" }, "repository": { "type": "git", 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/html.ts b/src/html.ts similarity index 68% rename from html.ts rename to src/html.ts index 6a0b347..53c8032 100644 --- a/html.ts +++ b/src/html.ts @@ -1,7 +1,7 @@ -import { Highlighter } from "./html/highlighter.js"; -import { Node } from "./html/highlighter/node.js"; -import { Tokenizer } from "./html/tokenizer.js"; -import { Token, Type } from "./html/tokenizer/token.js"; +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'); @@ -20,7 +20,7 @@ export function tokenize(input: string): Array { return tokenizer.tokens; } -export function highlight(tokens: Array): Array { +export function highlight(tokens: Array): Array { const highlighter = new Highlighter(tokens); console.time('html highlighter'); @@ -30,5 +30,5 @@ export function highlight(tokens: Array): Array { console.timeEnd('html highlighter'); - return highlighter.nodes; + return highlighter.spans; } diff --git a/html/errors.ts b/src/html/errors.ts similarity index 99% rename from html/errors.ts rename to src/html/errors.ts index 358d514..f240d63 100644 --- a/html/errors.ts +++ b/src/html/errors.ts @@ -17,4 +17,4 @@ export type ParseError = 'unexpected-null-character' | 'abrupt-closing-of-empty-comment' | 'eof-in-comment' | 'missing-semicolon-after-character-reference' | - 'unknown-named-character-reference'; \ No newline at end of file + '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/html/tokenizer/state.ts b/src/html/tokenizer/state.ts similarity index 99% rename from html/tokenizer/state.ts rename to src/html/tokenizer/state.ts index 0476d66..1708a63 100644 --- a/html/tokenizer/state.ts +++ b/src/html/tokenizer/state.ts @@ -79,4 +79,4 @@ export const enum State { HexadecimalCharacterReference = 'Hexadecimal character reference', DecimalCharacterReference = 'Decimal character reference', NumericCharacterReferenceEnd = 'Numeric character reference end' -} \ No newline at end of file +} 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/javascript.ts b/src/javascript.ts similarity index 100% rename from javascript.ts rename to src/javascript.ts diff --git a/javascript/tokenizer.ts b/src/javascript/tokenizer.ts similarity index 100% rename from javascript/tokenizer.ts rename to src/javascript/tokenizer.ts diff --git a/util/assertions.ts b/src/util/assertions.ts similarity index 100% rename from util/assertions.ts rename to src/util/assertions.ts diff --git a/util/guards.ts b/src/util/guards.ts similarity index 100% rename from util/guards.ts rename to src/util/guards.ts 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 67527ef..1b443dd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "module": "esnext", "target": "esnext", "sourceMap": true, - "rootDir": ".", + "rootDir": "src", + "outDir": "public/script", "strict": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, diff --git a/view.ts b/view.ts deleted file mode 100644 index a90916f..0000000 --- a/view.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Node } from "./html/highlighter/node"; - -export function render(nodes: Array): HTMLElement { - const p = document.createElement("pre"); - - for (const node of nodes) { - const span = document.createElement("span"); - - span.innerText = node.content; - span.style.color = node.color; - - p.appendChild(span); - } - - return p; -} \ No newline at end of file