diff --git a/HtmlParser-compile b/HtmlParser-compile
deleted file mode 100755
index 3e867827..00000000
--- a/HtmlParser-compile
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-APPDIR=`dirname $0`;
-java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/gwt-src:$APPDIR/super:/Developer/gwt-mac-1.5.1/gwt-user.jar:/Developer/gwt-mac-1.5.1/gwt-dev-mac.jar" com.google.gwt.dev.GWTCompiler -out "$APPDIR/www" "$@" nu.validator.htmlparser.HtmlParser;
diff --git a/HtmlParser-compile-detailed b/HtmlParser-compile-detailed
deleted file mode 100755
index a4102d64..00000000
--- a/HtmlParser-compile-detailed
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-APPDIR=`dirname $0`;
-java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/gwt-src:$APPDIR/super:/Developer/gwt-mac-1.5.1/gwt-user.jar:/Developer/gwt-mac-1.5.1/gwt-dev-mac.jar" com.google.gwt.dev.GWTCompiler -style DETAILED -out "$APPDIR/www" "$@" nu.validator.htmlparser.HtmlParser;
diff --git a/HtmlParser-compile-detailed.launch b/HtmlParser-compile-detailed.launch
deleted file mode 100644
index 0347fd6c..00000000
--- a/HtmlParser-compile-detailed.launch
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/htmlparser"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;htmlparser&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/gwt-src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;htmlparser&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry externalArchive=&quot;/Developer/gwt-mac-1.5.1/gwt-dev-mac.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry externalArchive=&quot;/Developer/gwt-mac-1.5.1/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.GWTCompiler"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-style DETAILED -out /Users/hsivonen/Projects/whattf/htmlparser/www nu.validator.htmlparser.HtmlParser"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="htmlparser"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xmx256M"/>
-</launchConfiguration>
diff --git a/HtmlParser-compile.launch b/HtmlParser-compile.launch
deleted file mode 100644
index 54e7bc33..00000000
--- a/HtmlParser-compile.launch
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/htmlparser"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;htmlparser&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/gwt-src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;htmlparser&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.GWTCompiler"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-out /home/hsivonen/Projects/whattf/htmlparser/www nu.validator.htmlparser.HtmlParser"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="htmlparser"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx256M"/>
-</launchConfiguration>
diff --git a/HtmlParser-linux b/HtmlParser-linux
deleted file mode 100755
index 0a9e9def..00000000
--- a/HtmlParser-linux
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-APPDIR=`dirname $0`;
-java  -Xmx256M -cp "$APPDIR/src:$APPDIR/gwt-src:$APPDIR/super:$APPDIR/bin:/home/hsivonen/gwt-linux-1.5.1/gwt-user.jar:/home/hsivonen/gwt-linux-1.5.1/gwt-dev-linux.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" "$@" nu.validator.htmlparser.HtmlParser/HtmlParser.html;
diff --git a/HtmlParser-shell b/HtmlParser-shell
deleted file mode 100755
index ffcf2e29..00000000
--- a/HtmlParser-shell
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-APPDIR=`dirname $0`;
-java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/gwt-src:$APPDIR/super:$APPDIR/bin:/Developer/gwt-mac-1.5.1/gwt-user.jar:/Developer/gwt-mac-1.5.1/gwt-dev-mac.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" "$@" nu.validator.htmlparser.HtmlParser/HtmlParser.html;
diff --git a/HtmlParser.launch b/HtmlParser.launch
deleted file mode 100644
index 9335abf6..00000000
--- a/HtmlParser.launch
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/htmlparser"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;htmlparser&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/gwt-src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/htmlparser/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento project=&quot;htmlparser&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry externalArchive=&quot;/Developer/gwt-mac-1.5.1/gwt-dev-mac.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.GWTShell"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-out www nu.validator.htmlparser.HtmlParser/HtmlParser.html"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="htmlparser"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xmx256M"/>
-</launchConfiguration>
diff --git a/doc/README b/doc/README
deleted file mode 100644
index e0132a41..00000000
--- a/doc/README
+++ /dev/null
@@ -1,15 +0,0 @@
-tokenization.txt represents the state of the spec implemented in Tokenizer.java.
-
-To get a diffable version corresponding to the current spec:
-lynx -display_charset=utf-8 -dump -nolist http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html > current.txt
-
-tree-construction.txt represents the state of the spec implemented in TreeBuilder.java.
-
-To get a diffable version corresponding to the current spec:
-lynx -display_charset=utf-8 -dump -nolist http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html > current.txt
-
-
-The text of the files in this directory comes from the WHATWG HTML 5 spec 
-which carries the following notice:
-© Copyright 2004-2010 Apple Computer, Inc., Mozilla Foundation, and Opera Software ASA.
-You are granted a license to use, reproduce and create derivative works of this document.
diff --git a/doc/named-character-references.html b/doc/named-character-references.html
deleted file mode 100644
index 5f05a991..00000000
--- a/doc/named-character-references.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<!-- spec rev 5682 -->
-
-   <table><thead><tr><th> Name </th> <th> Character(s) </th> <th> Glyph </th> <tbody><tr id="entity-AElig"><td> <code title="">AElig;</code> </td> <td> U+000C6 </td> <td> <span class="glyph" title="">&AElig;</span> </td> <tr id="entity-AMP"><td> <code title="">AMP;</code> </td> <td> U+00026 </td> <td> <span class="glyph" title="">&amp;</span> </td> <tr id="entity-Aacute"><td> <code title="">Aacute;</code> </td> <td> U+000C1 </td> <td> <span class="glyph" title="">&Aacute;</span> </td> <tr id="entity-Abreve"><td> <code title="">Abreve;</code> </td> <td> U+00102 </td> <td> <span class="glyph" title="">&#258;</span> </td> <tr id="entity-Acirc"><td> <code title="">Acirc;</code> </td> <td> U+000C2 </td> <td> <span class="glyph" title="">&Acirc;</span> </td> <tr id="entity-Acy"><td> <code title="">Acy;</code> </td> <td> U+00410 </td> <td> <span class="glyph" title="">&#1040;</span> </td> <tr id="entity-Afr"><td> <code title="">Afr;</code> </td> <td> U+1D504 </td> <td> <span class="glyph" title="">&#120068;</span> </td> <tr id="entity-Agrave"><td> <code title="">Agrave;</code> </td> <td> U+000C0 </td> <td> <span class="glyph" title="">&Agrave;</span> </td> <tr id="entity-Alpha"><td> <code title="">Alpha;</code> </td> <td> U+00391 </td> <td> <span class="glyph" title="">&Alpha;</span> </td> <tr id="entity-Amacr"><td> <code title="">Amacr;</code> </td> <td> U+00100 </td> <td> <span class="glyph" title="">&#256;</span> </td> <tr id="entity-And"><td> <code title="">And;</code> </td> <td> U+02A53 </td> <td> <span class="glyph" title="">&#10835;</span> </td> <tr id="entity-Aogon"><td> <code title="">Aogon;</code> </td> <td> U+00104 </td> <td> <span class="glyph" title="">&#260;</span> </td> <tr id="entity-Aopf"><td> <code title="">Aopf;</code> </td> <td> U+1D538 </td> <td> <span class="glyph" title="">&#120120;</span> </td> <tr id="entity-ApplyFunction"><td> <code title="">ApplyFunction;</code> </td> <td> U+02061 </td> <td> <span class="glyph" title="">&#8289;</span> </td> <tr id="entity-Aring"><td> <code title="">Aring;</code> </td> <td> U+000C5 </td> <td> <span class="glyph" title="">&Aring;</span> </td> <tr id="entity-Ascr"><td> <code title="">Ascr;</code> </td> <td> U+1D49C </td> <td> <span class="glyph" title="">&#119964;</span> </td> <tr id="entity-Assign"><td> <code title="">Assign;</code> </td> <td> U+02254 </td> <td> <span class="glyph" title="">&#8788;</span> </td> <tr id="entity-Atilde"><td> <code title="">Atilde;</code> </td> <td> U+000C3 </td> <td> <span class="glyph" title="">&Atilde;</span> </td> <tr id="entity-Auml"><td> <code title="">Auml;</code> </td> <td> U+000C4 </td> <td> <span class="glyph" title="">&Auml;</span> </td> <tr id="entity-Backslash"><td> <code title="">Backslash;</code> </td> <td> U+02216 </td> <td> <span class="glyph" title="">&#8726;</span> </td> <tr id="entity-Barv"><td> <code title="">Barv;</code> </td> <td> U+02AE7 </td> <td> <span class="glyph" title="">&#10983;</span> </td> <tr id="entity-Barwed"><td> <code title="">Barwed;</code> </td> <td> U+02306 </td> <td> <span class="glyph" title="">&#8966;</span> </td> <tr id="entity-Bcy"><td> <code title="">Bcy;</code> </td> <td> U+00411 </td> <td> <span class="glyph" title="">&#1041;</span> </td> <tr id="entity-Because"><td> <code title="">Because;</code> </td> <td> U+02235 </td> <td> <span class="glyph" title="">&#8757;</span> </td> <tr id="entity-Bernoullis"><td> <code title="">Bernoullis;</code> </td> <td> U+0212C </td> <td> <span class="glyph" title="">&#8492;</span> </td> <tr id="entity-Beta"><td> <code title="">Beta;</code> </td> <td> U+00392 </td> <td> <span class="glyph" title="">&Beta;</span> </td> <tr id="entity-Bfr"><td> <code title="">Bfr;</code> </td> <td> U+1D505 </td> <td> <span class="glyph" title="">&#120069;</span> </td> <tr id="entity-Bopf"><td> <code title="">Bopf;</code> </td> <td> U+1D539 </td> <td> <span class="glyph" title="">&#120121;</span> </td> <tr id="entity-Breve"><td> <code title="">Breve;</code> </td> <td> U+002D8 </td> <td> <span class="glyph" title="">&#728;</span> </td> <tr id="entity-Bscr"><td> <code title="">Bscr;</code> </td> <td> U+0212C </td> <td> <span class="glyph" title="">&#8492;</span> </td> <tr id="entity-Bumpeq"><td> <code title="">Bumpeq;</code> </td> <td> U+0224E </td> <td> <span class="glyph" title="">&#8782;</span> </td> <tr id="entity-CHcy"><td> <code title="">CHcy;</code> </td> <td> U+00427 </td> <td> <span class="glyph" title="">&#1063;</span> </td> <tr id="entity-COPY"><td> <code title="">COPY;</code> </td> <td> U+000A9 </td> <td> <span class="glyph" title="">&copy;</span> </td> <tr id="entity-Cacute"><td> <code title="">Cacute;</code> </td> <td> U+00106 </td> <td> <span class="glyph" title="">&#262;</span> </td> <tr id="entity-Cap"><td> <code title="">Cap;</code> </td> <td> U+022D2 </td> <td> <span class="glyph" title="">&#8914;</span> </td> <tr id="entity-CapitalDifferentialD"><td> <code title="">CapitalDifferentialD;</code> </td> <td> U+02145 </td> <td> <span class="glyph" title="">&#8517;</span> </td> <tr id="entity-Cayleys"><td> <code title="">Cayleys;</code> </td> <td> U+0212D </td> <td> <span class="glyph" title="">&#8493;</span> </td> <tr id="entity-Ccaron"><td> <code title="">Ccaron;</code> </td> <td> U+0010C </td> <td> <span class="glyph" title="">&#268;</span> </td> <tr id="entity-Ccedil"><td> <code title="">Ccedil;</code> </td> <td> U+000C7 </td> <td> <span class="glyph" title="">&Ccedil;</span> </td> <tr id="entity-Ccirc"><td> <code title="">Ccirc;</code> </td> <td> U+00108 </td> <td> <span class="glyph" title="">&#264;</span> </td> <tr id="entity-Cconint"><td> <code title="">Cconint;</code> </td> <td> U+02230 </td> <td> <span class="glyph" title="">&#8752;</span> </td> <tr id="entity-Cdot"><td> <code title="">Cdot;</code> </td> <td> U+0010A </td> <td> <span class="glyph" title="">&#266;</span> </td> <tr id="entity-Cedilla"><td> <code title="">Cedilla;</code> </td> <td> U+000B8 </td> <td> <span class="glyph" title="">&cedil;</span> </td> <tr id="entity-CenterDot"><td> <code title="">CenterDot;</code> </td> <td> U+000B7 </td> <td> <span class="glyph" title="">&middot;</span> </td> <tr id="entity-Cfr"><td> <code title="">Cfr;</code> </td> <td> U+0212D </td> <td> <span class="glyph" title="">&#8493;</span> </td> <tr id="entity-Chi"><td> <code title="">Chi;</code> </td> <td> U+003A7 </td> <td> <span class="glyph" title="">&Chi;</span> </td> <tr id="entity-CircleDot"><td> <code title="">CircleDot;</code> </td> <td> U+02299 </td> <td> <span class="glyph" title="">&#8857;</span> </td> <tr id="entity-CircleMinus"><td> <code title="">CircleMinus;</code> </td> <td> U+02296 </td> <td> <span class="glyph" title="">&#8854;</span> </td> <tr id="entity-CirclePlus"><td> <code title="">CirclePlus;</code> </td> <td> U+02295 </td> <td> <span class="glyph" title="">&oplus;</span> </td> <tr id="entity-CircleTimes"><td> <code title="">CircleTimes;</code> </td> <td> U+02297 </td> <td> <span class="glyph" title="">&otimes;</span> </td> <tr id="entity-ClockwiseContourIntegral"><td> <code title="">ClockwiseContourIntegral;</code> </td> <td> U+02232 </td> <td> <span class="glyph" title="">&#8754;</span> </td> <tr id="entity-CloseCurlyDoubleQuote"><td> <code title="">CloseCurlyDoubleQuote;</code> </td> <td> U+0201D </td> <td> <span class="glyph" title="">&rdquo;</span> </td> <tr id="entity-CloseCurlyQuote"><td> <code title="">CloseCurlyQuote;</code> </td> <td> U+02019 </td> <td> <span class="glyph" title="">&rsquo;</span> </td> <tr id="entity-Colon"><td> <code title="">Colon;</code> </td> <td> U+02237 </td> <td> <span class="glyph" title="">&#8759;</span> </td> <tr id="entity-Colone"><td> <code title="">Colone;</code> </td> <td> U+02A74 </td> <td> <span class="glyph" title="">&#10868;</span> </td> <tr id="entity-Congruent"><td> <code title="">Congruent;</code> </td> <td> U+02261 </td> <td> <span class="glyph" title="">&equiv;</span> </td> <tr id="entity-Conint"><td> <code title="">Conint;</code> </td> <td> U+0222F </td> <td> <span class="glyph" title="">&#8751;</span> </td> <tr id="entity-ContourIntegral"><td> <code title="">ContourIntegral;</code> </td> <td> U+0222E </td> <td> <span class="glyph" title="">&#8750;</span> </td> <tr id="entity-Copf"><td> <code title="">Copf;</code> </td> <td> U+02102 </td> <td> <span class="glyph" title="">&#8450;</span> </td> <tr id="entity-Coproduct"><td> <code title="">Coproduct;</code> </td> <td> U+02210 </td> <td> <span class="glyph" title="">&#8720;</span> </td> <tr id="entity-CounterClockwiseContourIntegral"><td> <code title="">CounterClockwiseContourIntegral;</code> </td> <td> U+02233 </td> <td> <span class="glyph" title="">&#8755;</span> </td> <tr id="entity-Cross"><td> <code title="">Cross;</code> </td> <td> U+02A2F </td> <td> <span class="glyph" title="">&#10799;</span> </td> <tr id="entity-Cscr"><td> <code title="">Cscr;</code> </td> <td> U+1D49E </td> <td> <span class="glyph" title="">&#119966;</span> </td> <tr id="entity-Cup"><td> <code title="">Cup;</code> </td> <td> U+022D3 </td> <td> <span class="glyph" title="">&#8915;</span> </td> <tr id="entity-CupCap"><td> <code title="">CupCap;</code> </td> <td> U+0224D </td> <td> <span class="glyph" title="">&#8781;</span> </td> <tr id="entity-DD"><td> <code title="">DD;</code> </td> <td> U+02145 </td> <td> <span class="glyph" title="">&#8517;</span> </td> <tr id="entity-DDotrahd"><td> <code title="">DDotrahd;</code> </td> <td> U+02911 </td> <td> <span class="glyph" title="">&#10513;</span> </td> <tr id="entity-DJcy"><td> <code title="">DJcy;</code> </td> <td> U+00402 </td> <td> <span class="glyph" title="">&#1026;</span> </td> <tr id="entity-DScy"><td> <code title="">DScy;</code> </td> <td> U+00405 </td> <td> <span class="glyph" title="">&#1029;</span> </td> <tr id="entity-DZcy"><td> <code title="">DZcy;</code> </td> <td> U+0040F </td> <td> <span class="glyph" title="">&#1039;</span> </td> <tr id="entity-Dagger"><td> <code title="">Dagger;</code> </td> <td> U+02021 </td> <td> <span class="glyph" title="">&Dagger;</span> </td> <tr id="entity-Darr"><td> <code title="">Darr;</code> </td> <td> U+021A1 </td> <td> <span class="glyph" title="">&#8609;</span> </td> <tr id="entity-Dashv"><td> <code title="">Dashv;</code> </td> <td> U+02AE4 </td> <td> <span class="glyph" title="">&#10980;</span> </td> <tr id="entity-Dcaron"><td> <code title="">Dcaron;</code> </td> <td> U+0010E </td> <td> <span class="glyph" title="">&#270;</span> </td> <tr id="entity-Dcy"><td> <code title="">Dcy;</code> </td> <td> U+00414 </td> <td> <span class="glyph" title="">&#1044;</span> </td> <tr id="entity-Del"><td> <code title="">Del;</code> </td> <td> U+02207 </td> <td> <span class="glyph" title="">&nabla;</span> </td> <tr id="entity-Delta"><td> <code title="">Delta;</code> </td> <td> U+00394 </td> <td> <span class="glyph" title="">&Delta;</span> </td> <tr id="entity-Dfr"><td> <code title="">Dfr;</code> </td> <td> U+1D507 </td> <td> <span class="glyph" title="">&#120071;</span> </td> <tr id="entity-DiacriticalAcute"><td> <code title="">DiacriticalAcute;</code> </td> <td> U+000B4 </td> <td> <span class="glyph" title="">&acute;</span> </td> <tr id="entity-DiacriticalDot"><td> <code title="">DiacriticalDot;</code> </td> <td> U+002D9 </td> <td> <span class="glyph" title="">&#729;</span> </td> <tr id="entity-DiacriticalDoubleAcute"><td> <code title="">DiacriticalDoubleAcute;</code> </td> <td> U+002DD </td> <td> <span class="glyph" title="">&#733;</span> </td> <tr id="entity-DiacriticalGrave"><td> <code title="">DiacriticalGrave;</code> </td> <td> U+00060 </td> <td> <span class="glyph" title="">`</span> </td> <tr id="entity-DiacriticalTilde"><td> <code title="">DiacriticalTilde;</code> </td> <td> U+002DC </td> <td> <span class="glyph" title="">&tilde;</span> </td> <tr id="entity-Diamond"><td> <code title="">Diamond;</code> </td> <td> U+022C4 </td> <td> <span class="glyph" title="">&#8900;</span> </td> <tr id="entity-DifferentialD"><td> <code title="">DifferentialD;</code> </td> <td> U+02146 </td> <td> <span class="glyph" title="">&#8518;</span> </td> <tr id="entity-Dopf"><td> <code title="">Dopf;</code> </td> <td> U+1D53B </td> <td> <span class="glyph" title="">&#120123;</span> </td> <tr id="entity-Dot"><td> <code title="">Dot;</code> </td> <td> U+000A8 </td> <td> <span class="glyph" title="">&uml;</span> </td> <tr id="entity-DotDot"><td> <code title="">DotDot;</code> </td> <td> U+020DC </td> <td> <span class="glyph composition" title="">&#9676;&#8412;</span> </td> <tr id="entity-DotEqual"><td> <code title="">DotEqual;</code> </td> <td> U+02250 </td> <td> <span class="glyph" title="">&#8784;</span> </td> <tr id="entity-DoubleContourIntegral"><td> <code title="">DoubleContourIntegral;</code> </td> <td> U+0222F </td> <td> <span class="glyph" title="">&#8751;</span> </td> <tr id="entity-DoubleDot"><td> <code title="">DoubleDot;</code> </td> <td> U+000A8 </td> <td> <span class="glyph" title="">&uml;</span> </td> <tr id="entity-DoubleDownArrow"><td> <code title="">DoubleDownArrow;</code> </td> <td> U+021D3 </td> <td> <span class="glyph" title="">&dArr;</span> </td> <tr id="entity-DoubleLeftArrow"><td> <code title="">DoubleLeftArrow;</code> </td> <td> U+021D0 </td> <td> <span class="glyph" title="">&lArr;</span> </td> <tr id="entity-DoubleLeftRightArrow"><td> <code title="">DoubleLeftRightArrow;</code> </td> <td> U+021D4 </td> <td> <span class="glyph" title="">&hArr;</span> </td> <tr id="entity-DoubleLeftTee"><td> <code title="">DoubleLeftTee;</code> </td> <td> U+02AE4 </td> <td> <span class="glyph" title="">&#10980;</span> </td> <tr id="entity-DoubleLongLeftArrow"><td> <code title="">DoubleLongLeftArrow;</code> </td> <td> U+027F8 </td> <td> <span class="glyph" title="">&#10232;</span> </td> <tr id="entity-DoubleLongLeftRightArrow"><td> <code title="">DoubleLongLeftRightArrow;</code> </td> <td> U+027FA </td> <td> <span class="glyph" title="">&#10234;</span> </td> <tr id="entity-DoubleLongRightArrow"><td> <code title="">DoubleLongRightArrow;</code> </td> <td> U+027F9 </td> <td> <span class="glyph" title="">&#10233;</span> </td> <tr id="entity-DoubleRightArrow"><td> <code title="">DoubleRightArrow;</code> </td> <td> U+021D2 </td> <td> <span class="glyph" title="">&rArr;</span> </td> <tr id="entity-DoubleRightTee"><td> <code title="">DoubleRightTee;</code> </td> <td> U+022A8 </td> <td> <span class="glyph" title="">&#8872;</span> </td> <tr id="entity-DoubleUpArrow"><td> <code title="">DoubleUpArrow;</code> </td> <td> U+021D1 </td> <td> <span class="glyph" title="">&uArr;</span> </td> <tr id="entity-DoubleUpDownArrow"><td> <code title="">DoubleUpDownArrow;</code> </td> <td> U+021D5 </td> <td> <span class="glyph" title="">&#8661;</span> </td> <tr id="entity-DoubleVerticalBar"><td> <code title="">DoubleVerticalBar;</code> </td> <td> U+02225 </td> <td> <span class="glyph" title="">&#8741;</span> </td> <tr id="entity-DownArrow"><td> <code title="">DownArrow;</code> </td> <td> U+02193 </td> <td> <span class="glyph" title="">&darr;</span> </td> <tr id="entity-DownArrowBar"><td> <code title="">DownArrowBar;</code> </td> <td> U+02913 </td> <td> <span class="glyph" title="">&#10515;</span> </td> <tr id="entity-DownArrowUpArrow"><td> <code title="">DownArrowUpArrow;</code> </td> <td> U+021F5 </td> <td> <span class="glyph" title="">&#8693;</span> </td> <tr id="entity-DownBreve"><td> <code title="">DownBreve;</code> </td> <td> U+00311 </td> <td> <span class="glyph composition" title="">&#9676;&#785;</span> </td> <tr id="entity-DownLeftRightVector"><td> <code title="">DownLeftRightVector;</code> </td> <td> U+02950 </td> <td> <span class="glyph" title="">&#10576;</span> </td> <tr id="entity-DownLeftTeeVector"><td> <code title="">DownLeftTeeVector;</code> </td> <td> U+0295E </td> <td> <span class="glyph" title="">&#10590;</span> </td> <tr id="entity-DownLeftVector"><td> <code title="">DownLeftVector;</code> </td> <td> U+021BD </td> <td> <span class="glyph" title="">&#8637;</span> </td> <tr id="entity-DownLeftVectorBar"><td> <code title="">DownLeftVectorBar;</code> </td> <td> U+02956 </td> <td> <span class="glyph" title="">&#10582;</span> </td> <tr id="entity-DownRightTeeVector"><td> <code title="">DownRightTeeVector;</code> </td> <td> U+0295F </td> <td> <span class="glyph" title="">&#10591;</span> </td> <tr id="entity-DownRightVector"><td> <code title="">DownRightVector;</code> </td> <td> U+021C1 </td> <td> <span class="glyph" title="">&#8641;</span> </td> <tr id="entity-DownRightVectorBar"><td> <code title="">DownRightVectorBar;</code> </td> <td> U+02957 </td> <td> <span class="glyph" title="">&#10583;</span> </td> <tr id="entity-DownTee"><td> <code title="">DownTee;</code> </td> <td> U+022A4 </td> <td> <span class="glyph" title="">&#8868;</span> </td> <tr id="entity-DownTeeArrow"><td> <code title="">DownTeeArrow;</code> </td> <td> U+021A7 </td> <td> <span class="glyph" title="">&#8615;</span> </td> <tr id="entity-Downarrow"><td> <code title="">Downarrow;</code> </td> <td> U+021D3 </td> <td> <span class="glyph" title="">&dArr;</span> </td> <tr id="entity-Dscr"><td> <code title="">Dscr;</code> </td> <td> U+1D49F </td> <td> <span class="glyph" title="">&#119967;</span> </td> <tr id="entity-Dstrok"><td> <code title="">Dstrok;</code> </td> <td> U+00110 </td> <td> <span class="glyph" title="">&#272;</span> </td> <tr id="entity-ENG"><td> <code title="">ENG;</code> </td> <td> U+0014A </td> <td> <span class="glyph" title="">&#330;</span> </td> <tr id="entity-ETH"><td> <code title="">ETH;</code> </td> <td> U+000D0 </td> <td> <span class="glyph" title="">&ETH;</span> </td> <tr id="entity-Eacute"><td> <code title="">Eacute;</code> </td> <td> U+000C9 </td> <td> <span class="glyph" title="">&Eacute;</span> </td> <tr id="entity-Ecaron"><td> <code title="">Ecaron;</code> </td> <td> U+0011A </td> <td> <span class="glyph" title="">&#282;</span> </td> <tr id="entity-Ecirc"><td> <code title="">Ecirc;</code> </td> <td> U+000CA </td> <td> <span class="glyph" title="">&Ecirc;</span> </td> <tr id="entity-Ecy"><td> <code title="">Ecy;</code> </td> <td> U+0042D </td> <td> <span class="glyph" title="">&#1069;</span> </td> <tr id="entity-Edot"><td> <code title="">Edot;</code> </td> <td> U+00116 </td> <td> <span class="glyph" title="">&#278;</span> </td> <tr id="entity-Efr"><td> <code title="">Efr;</code> </td> <td> U+1D508 </td> <td> <span class="glyph" title="">&#120072;</span> </td> <tr id="entity-Egrave"><td> <code title="">Egrave;</code> </td> <td> U+000C8 </td> <td> <span class="glyph" title="">&Egrave;</span> </td> <tr id="entity-Element"><td> <code title="">Element;</code> </td> <td> U+02208 </td> <td> <span class="glyph" title="">&isin;</span> </td> <tr id="entity-Emacr"><td> <code title="">Emacr;</code> </td> <td> U+00112 </td> <td> <span class="glyph" title="">&#274;</span> </td> <tr id="entity-EmptySmallSquare"><td> <code title="">EmptySmallSquare;</code> </td> <td> U+025FB </td> <td> <span class="glyph" title="">&#9723;</span> </td> <tr id="entity-EmptyVerySmallSquare"><td> <code title="">EmptyVerySmallSquare;</code> </td> <td> U+025AB </td> <td> <span class="glyph" title="">&#9643;</span> </td> <tr id="entity-Eogon"><td> <code title="">Eogon;</code> </td> <td> U+00118 </td> <td> <span class="glyph" title="">&#280;</span> </td> <tr id="entity-Eopf"><td> <code title="">Eopf;</code> </td> <td> U+1D53C </td> <td> <span class="glyph" title="">&#120124;</span> </td> <tr id="entity-Epsilon"><td> <code title="">Epsilon;</code> </td> <td> U+00395 </td> <td> <span class="glyph" title="">&Epsilon;</span> </td> <tr id="entity-Equal"><td> <code title="">Equal;</code> </td> <td> U+02A75 </td> <td> <span class="glyph" title="">&#10869;</span> </td> <tr id="entity-EqualTilde"><td> <code title="">EqualTilde;</code> </td> <td> U+02242 </td> <td> <span class="glyph" title="">&#8770;</span> </td> <tr id="entity-Equilibrium"><td> <code title="">Equilibrium;</code> </td> <td> U+021CC </td> <td> <span class="glyph" title="">&#8652;</span> </td> <tr id="entity-Escr"><td> <code title="">Escr;</code> </td> <td> U+02130 </td> <td> <span class="glyph" title="">&#8496;</span> </td> <tr id="entity-Esim"><td> <code title="">Esim;</code> </td> <td> U+02A73 </td> <td> <span class="glyph" title="">&#10867;</span> </td> <tr id="entity-Eta"><td> <code title="">Eta;</code> </td> <td> U+00397 </td> <td> <span class="glyph" title="">&Eta;</span> </td> <tr id="entity-Euml"><td> <code title="">Euml;</code> </td> <td> U+000CB </td> <td> <span class="glyph" title="">&Euml;</span> </td> <tr id="entity-Exists"><td> <code title="">Exists;</code> </td> <td> U+02203 </td> <td> <span class="glyph" title="">&exist;</span> </td> <tr id="entity-ExponentialE"><td> <code title="">ExponentialE;</code> </td> <td> U+02147 </td> <td> <span class="glyph" title="">&#8519;</span> </td> <tr id="entity-Fcy"><td> <code title="">Fcy;</code> </td> <td> U+00424 </td> <td> <span class="glyph" title="">&#1060;</span> </td> <tr id="entity-Ffr"><td> <code title="">Ffr;</code> </td> <td> U+1D509 </td> <td> <span class="glyph" title="">&#120073;</span> </td> <tr id="entity-FilledSmallSquare"><td> <code title="">FilledSmallSquare;</code> </td> <td> U+025FC </td> <td> <span class="glyph" title="">&#9724;</span> </td> <tr id="entity-FilledVerySmallSquare"><td> <code title="">FilledVerySmallSquare;</code> </td> <td> U+025AA </td> <td> <span class="glyph" title="">&#9642;</span> </td> <tr id="entity-Fopf"><td> <code title="">Fopf;</code> </td> <td> U+1D53D </td> <td> <span class="glyph" title="">&#120125;</span> </td> <tr id="entity-ForAll"><td> <code title="">ForAll;</code> </td> <td> U+02200 </td> <td> <span class="glyph" title="">&forall;</span> </td> <tr id="entity-Fouriertrf"><td> <code title="">Fouriertrf;</code> </td> <td> U+02131 </td> <td> <span class="glyph" title="">&#8497;</span> </td> <tr id="entity-Fscr"><td> <code title="">Fscr;</code> </td> <td> U+02131 </td> <td> <span class="glyph" title="">&#8497;</span> </td> <tr id="entity-GJcy"><td> <code title="">GJcy;</code> </td> <td> U+00403 </td> <td> <span class="glyph" title="">&#1027;</span> </td> <tr id="entity-GT"><td> <code title="">GT;</code> </td> <td> U+0003E </td> <td> <span class="glyph" title="">&gt;</span> </td> <tr id="entity-Gamma"><td> <code title="">Gamma;</code> </td> <td> U+00393 </td> <td> <span class="glyph" title="">&Gamma;</span> </td> <tr id="entity-Gammad"><td> <code title="">Gammad;</code> </td> <td> U+003DC </td> <td> <span class="glyph" title="">&#988;</span> </td> <tr id="entity-Gbreve"><td> <code title="">Gbreve;</code> </td> <td> U+0011E </td> <td> <span class="glyph" title="">&#286;</span> </td> <tr id="entity-Gcedil"><td> <code title="">Gcedil;</code> </td> <td> U+00122 </td> <td> <span class="glyph" title="">&#290;</span> </td> <tr id="entity-Gcirc"><td> <code title="">Gcirc;</code> </td> <td> U+0011C </td> <td> <span class="glyph" title="">&#284;</span> </td> <tr id="entity-Gcy"><td> <code title="">Gcy;</code> </td> <td> U+00413 </td> <td> <span class="glyph" title="">&#1043;</span> </td> <tr id="entity-Gdot"><td> <code title="">Gdot;</code> </td> <td> U+00120 </td> <td> <span class="glyph" title="">&#288;</span> </td> <tr id="entity-Gfr"><td> <code title="">Gfr;</code> </td> <td> U+1D50A </td> <td> <span class="glyph" title="">&#120074;</span> </td> <tr id="entity-Gg"><td> <code title="">Gg;</code> </td> <td> U+022D9 </td> <td> <span class="glyph" title="">&#8921;</span> </td> <tr id="entity-Gopf"><td> <code title="">Gopf;</code> </td> <td> U+1D53E </td> <td> <span class="glyph" title="">&#120126;</span> </td> <tr id="entity-GreaterEqual"><td> <code title="">GreaterEqual;</code> </td> <td> U+02265 </td> <td> <span class="glyph" title="">&ge;</span> </td> <tr id="entity-GreaterEqualLess"><td> <code title="">GreaterEqualLess;</code> </td> <td> U+022DB </td> <td> <span class="glyph" title="">&#8923;</span> </td> <tr id="entity-GreaterFullEqual"><td> <code title="">GreaterFullEqual;</code> </td> <td> U+02267 </td> <td> <span class="glyph" title="">&#8807;</span> </td> <tr id="entity-GreaterGreater"><td> <code title="">GreaterGreater;</code> </td> <td> U+02AA2 </td> <td> <span class="glyph" title="">&#10914;</span> </td> <tr id="entity-GreaterLess"><td> <code title="">GreaterLess;</code> </td> <td> U+02277 </td> <td> <span class="glyph" title="">&#8823;</span> </td> <tr id="entity-GreaterSlantEqual"><td> <code title="">GreaterSlantEqual;</code> </td> <td> U+02A7E </td> <td> <span class="glyph" title="">&#10878;</span> </td> <tr id="entity-GreaterTilde"><td> <code title="">GreaterTilde;</code> </td> <td> U+02273 </td> <td> <span class="glyph" title="">&#8819;</span> </td> <tr id="entity-Gscr"><td> <code title="">Gscr;</code> </td> <td> U+1D4A2 </td> <td> <span class="glyph" title="">&#119970;</span> </td> <tr id="entity-Gt"><td> <code title="">Gt;</code> </td> <td> U+0226B </td> <td> <span class="glyph" title="">&#8811;</span> </td> <tr id="entity-HARDcy"><td> <code title="">HARDcy;</code> </td> <td> U+0042A </td> <td> <span class="glyph" title="">&#1066;</span> </td> <tr id="entity-Hacek"><td> <code title="">Hacek;</code> </td> <td> U+002C7 </td> <td> <span class="glyph" title="">&#711;</span> </td> <tr id="entity-Hat"><td> <code title="">Hat;</code> </td> <td> U+0005E </td> <td> <span class="glyph" title="">^</span> </td> <tr id="entity-Hcirc"><td> <code title="">Hcirc;</code> </td> <td> U+00124 </td> <td> <span class="glyph" title="">&#292;</span> </td> <tr id="entity-Hfr"><td> <code title="">Hfr;</code> </td> <td> U+0210C </td> <td> <span class="glyph" title="">&#8460;</span> </td> <tr id="entity-HilbertSpace"><td> <code title="">HilbertSpace;</code> </td> <td> U+0210B </td> <td> <span class="glyph" title="">&#8459;</span> </td> <tr id="entity-Hopf"><td> <code title="">Hopf;</code> </td> <td> U+0210D </td> <td> <span class="glyph" title="">&#8461;</span> </td> <tr id="entity-HorizontalLine"><td> <code title="">HorizontalLine;</code> </td> <td> U+02500 </td> <td> <span class="glyph" title="">&#9472;</span> </td> <tr id="entity-Hscr"><td> <code title="">Hscr;</code> </td> <td> U+0210B </td> <td> <span class="glyph" title="">&#8459;</span> </td> <tr id="entity-Hstrok"><td> <code title="">Hstrok;</code> </td> <td> U+00126 </td> <td> <span class="glyph" title="">&#294;</span> </td> <tr id="entity-HumpDownHump"><td> <code title="">HumpDownHump;</code> </td> <td> U+0224E </td> <td> <span class="glyph" title="">&#8782;</span> </td> <tr id="entity-HumpEqual"><td> <code title="">HumpEqual;</code> </td> <td> U+0224F </td> <td> <span class="glyph" title="">&#8783;</span> </td> <tr id="entity-IEcy"><td> <code title="">IEcy;</code> </td> <td> U+00415 </td> <td> <span class="glyph" title="">&#1045;</span> </td> <tr id="entity-IJlig"><td> <code title="">IJlig;</code> </td> <td> U+00132 </td> <td> <span class="glyph" title="">&#306;</span> </td> <tr id="entity-IOcy"><td> <code title="">IOcy;</code> </td> <td> U+00401 </td> <td> <span class="glyph" title="">&#1025;</span> </td> <tr id="entity-Iacute"><td> <code title="">Iacute;</code> </td> <td> U+000CD </td> <td> <span class="glyph" title="">&Iacute;</span> </td> <tr id="entity-Icirc"><td> <code title="">Icirc;</code> </td> <td> U+000CE </td> <td> <span class="glyph" title="">&Icirc;</span> </td> <tr id="entity-Icy"><td> <code title="">Icy;</code> </td> <td> U+00418 </td> <td> <span class="glyph" title="">&#1048;</span> </td> <tr id="entity-Idot"><td> <code title="">Idot;</code> </td> <td> U+00130 </td> <td> <span class="glyph" title="">&#304;</span> </td> <tr id="entity-Ifr"><td> <code title="">Ifr;</code> </td> <td> U+02111 </td> <td> <span class="glyph" title="">&image;</span> </td> <tr id="entity-Igrave"><td> <code title="">Igrave;</code> </td> <td> U+000CC </td> <td> <span class="glyph" title="">&Igrave;</span> </td> <tr id="entity-Im"><td> <code title="">Im;</code> </td> <td> U+02111 </td> <td> <span class="glyph" title="">&image;</span> </td> <tr id="entity-Imacr"><td> <code title="">Imacr;</code> </td> <td> U+0012A </td> <td> <span class="glyph" title="">&#298;</span> </td> <tr id="entity-ImaginaryI"><td> <code title="">ImaginaryI;</code> </td> <td> U+02148 </td> <td> <span class="glyph" title="">&#8520;</span> </td> <tr id="entity-Implies"><td> <code title="">Implies;</code> </td> <td> U+021D2 </td> <td> <span class="glyph" title="">&rArr;</span> </td> <tr id="entity-Int"><td> <code title="">Int;</code> </td> <td> U+0222C </td> <td> <span class="glyph" title="">&#8748;</span> </td> <tr id="entity-Integral"><td> <code title="">Integral;</code> </td> <td> U+0222B </td> <td> <span class="glyph" title="">&int;</span> </td> <tr id="entity-Intersection"><td> <code title="">Intersection;</code> </td> <td> U+022C2 </td> <td> <span class="glyph" title="">&#8898;</span> </td> <tr id="entity-InvisibleComma"><td> <code title="">InvisibleComma;</code> </td> <td> U+02063 </td> <td> <span class="glyph" title="">&#8291;</span> </td> <tr id="entity-InvisibleTimes"><td> <code title="">InvisibleTimes;</code> </td> <td> U+02062 </td> <td> <span class="glyph" title="">&#8290;</span> </td> <tr id="entity-Iogon"><td> <code title="">Iogon;</code> </td> <td> U+0012E </td> <td> <span class="glyph" title="">&#302;</span> </td> <tr id="entity-Iopf"><td> <code title="">Iopf;</code> </td> <td> U+1D540 </td> <td> <span class="glyph" title="">&#120128;</span> </td> <tr id="entity-Iota"><td> <code title="">Iota;</code> </td> <td> U+00399 </td> <td> <span class="glyph" title="">&Iota;</span> </td> <tr id="entity-Iscr"><td> <code title="">Iscr;</code> </td> <td> U+02110 </td> <td> <span class="glyph" title="">&#8464;</span> </td> <tr id="entity-Itilde"><td> <code title="">Itilde;</code> </td> <td> U+00128 </td> <td> <span class="glyph" title="">&#296;</span> </td> <tr id="entity-Iukcy"><td> <code title="">Iukcy;</code> </td> <td> U+00406 </td> <td> <span class="glyph" title="">&#1030;</span> </td> <tr id="entity-Iuml"><td> <code title="">Iuml;</code> </td> <td> U+000CF </td> <td> <span class="glyph" title="">&Iuml;</span> </td> <tr id="entity-Jcirc"><td> <code title="">Jcirc;</code> </td> <td> U+00134 </td> <td> <span class="glyph" title="">&#308;</span> </td> <tr id="entity-Jcy"><td> <code title="">Jcy;</code> </td> <td> U+00419 </td> <td> <span class="glyph" title="">&#1049;</span> </td> <tr id="entity-Jfr"><td> <code title="">Jfr;</code> </td> <td> U+1D50D </td> <td> <span class="glyph" title="">&#120077;</span> </td> <tr id="entity-Jopf"><td> <code title="">Jopf;</code> </td> <td> U+1D541 </td> <td> <span class="glyph" title="">&#120129;</span> </td> <tr id="entity-Jscr"><td> <code title="">Jscr;</code> </td> <td> U+1D4A5 </td> <td> <span class="glyph" title="">&#119973;</span> </td> <tr id="entity-Jsercy"><td> <code title="">Jsercy;</code> </td> <td> U+00408 </td> <td> <span class="glyph" title="">&#1032;</span> </td> <tr id="entity-Jukcy"><td> <code title="">Jukcy;</code> </td> <td> U+00404 </td> <td> <span class="glyph" title="">&#1028;</span> </td> <tr id="entity-KHcy"><td> <code title="">KHcy;</code> </td> <td> U+00425 </td> <td> <span class="glyph" title="">&#1061;</span> </td> <tr id="entity-KJcy"><td> <code title="">KJcy;</code> </td> <td> U+0040C </td> <td> <span class="glyph" title="">&#1036;</span> </td> <tr id="entity-Kappa"><td> <code title="">Kappa;</code> </td> <td> U+0039A </td> <td> <span class="glyph" title="">&Kappa;</span> </td> <tr id="entity-Kcedil"><td> <code title="">Kcedil;</code> </td> <td> U+00136 </td> <td> <span class="glyph" title="">&#310;</span> </td> <tr id="entity-Kcy"><td> <code title="">Kcy;</code> </td> <td> U+0041A </td> <td> <span class="glyph" title="">&#1050;</span> </td> <tr id="entity-Kfr"><td> <code title="">Kfr;</code> </td> <td> U+1D50E </td> <td> <span class="glyph" title="">&#120078;</span> </td> <tr id="entity-Kopf"><td> <code title="">Kopf;</code> </td> <td> U+1D542 </td> <td> <span class="glyph" title="">&#120130;</span> </td> <tr id="entity-Kscr"><td> <code title="">Kscr;</code> </td> <td> U+1D4A6 </td> <td> <span class="glyph" title="">&#119974;</span> </td> <tr id="entity-LJcy"><td> <code title="">LJcy;</code> </td> <td> U+00409 </td> <td> <span class="glyph" title="">&#1033;</span> </td> <tr id="entity-LT"><td> <code title="">LT;</code> </td> <td> U+0003C </td> <td> <span class="glyph" title="">&lt;</span> </td> <tr id="entity-Lacute"><td> <code title="">Lacute;</code> </td> <td> U+00139 </td> <td> <span class="glyph" title="">&#313;</span> </td> <tr id="entity-Lambda"><td> <code title="">Lambda;</code> </td> <td> U+0039B </td> <td> <span class="glyph" title="">&Lambda;</span> </td> <tr id="entity-Lang"><td> <code title="">Lang;</code> </td> <td> U+027EA </td> <td> <span class="glyph" title="">&#10218;</span> </td> <tr id="entity-Laplacetrf"><td> <code title="">Laplacetrf;</code> </td> <td> U+02112 </td> <td> <span class="glyph" title="">&#8466;</span> </td> <tr id="entity-Larr"><td> <code title="">Larr;</code> </td> <td> U+0219E </td> <td> <span class="glyph" title="">&#8606;</span> </td> <tr id="entity-Lcaron"><td> <code title="">Lcaron;</code> </td> <td> U+0013D </td> <td> <span class="glyph" title="">&#317;</span> </td> <tr id="entity-Lcedil"><td> <code title="">Lcedil;</code> </td> <td> U+0013B </td> <td> <span class="glyph" title="">&#315;</span> </td> <tr id="entity-Lcy"><td> <code title="">Lcy;</code> </td> <td> U+0041B </td> <td> <span class="glyph" title="">&#1051;</span> </td> <tr id="entity-LeftAngleBracket"><td> <code title="">LeftAngleBracket;</code> </td> <td> U+027E8 </td> <td> <span class="glyph" title="">&#9001;</span> </td> <tr id="entity-LeftArrow"><td> <code title="">LeftArrow;</code> </td> <td> U+02190 </td> <td> <span class="glyph" title="">&larr;</span> </td> <tr id="entity-LeftArrowBar"><td> <code title="">LeftArrowBar;</code> </td> <td> U+021E4 </td> <td> <span class="glyph" title="">&#8676;</span> </td> <tr id="entity-LeftArrowRightArrow"><td> <code title="">LeftArrowRightArrow;</code> </td> <td> U+021C6 </td> <td> <span class="glyph" title="">&#8646;</span> </td> <tr id="entity-LeftCeiling"><td> <code title="">LeftCeiling;</code> </td> <td> U+02308 </td> <td> <span class="glyph" title="">&lceil;</span> </td> <tr id="entity-LeftDoubleBracket"><td> <code title="">LeftDoubleBracket;</code> </td> <td> U+027E6 </td> <td> <span class="glyph" title="">&#10214;</span> </td> <tr id="entity-LeftDownTeeVector"><td> <code title="">LeftDownTeeVector;</code> </td> <td> U+02961 </td> <td> <span class="glyph" title="">&#10593;</span> </td> <tr id="entity-LeftDownVector"><td> <code title="">LeftDownVector;</code> </td> <td> U+021C3 </td> <td> <span class="glyph" title="">&#8643;</span> </td> <tr id="entity-LeftDownVectorBar"><td> <code title="">LeftDownVectorBar;</code> </td> <td> U+02959 </td> <td> <span class="glyph" title="">&#10585;</span> </td> <tr id="entity-LeftFloor"><td> <code title="">LeftFloor;</code> </td> <td> U+0230A </td> <td> <span class="glyph" title="">&lfloor;</span> </td> <tr id="entity-LeftRightArrow"><td> <code title="">LeftRightArrow;</code> </td> <td> U+02194 </td> <td> <span class="glyph" title="">&harr;</span> </td> <tr id="entity-LeftRightVector"><td> <code title="">LeftRightVector;</code> </td> <td> U+0294E </td> <td> <span class="glyph" title="">&#10574;</span> </td> <tr id="entity-LeftTee"><td> <code title="">LeftTee;</code> </td> <td> U+022A3 </td> <td> <span class="glyph" title="">&#8867;</span> </td> <tr id="entity-LeftTeeArrow"><td> <code title="">LeftTeeArrow;</code> </td> <td> U+021A4 </td> <td> <span class="glyph" title="">&#8612;</span> </td> <tr id="entity-LeftTeeVector"><td> <code title="">LeftTeeVector;</code> </td> <td> U+0295A </td> <td> <span class="glyph" title="">&#10586;</span> </td> <tr id="entity-LeftTriangle"><td> <code title="">LeftTriangle;</code> </td> <td> U+022B2 </td> <td> <span class="glyph" title="">&#8882;</span> </td> <tr id="entity-LeftTriangleBar"><td> <code title="">LeftTriangleBar;</code> </td> <td> U+029CF </td> <td> <span class="glyph" title="">&#10703;</span> </td> <tr id="entity-LeftTriangleEqual"><td> <code title="">LeftTriangleEqual;</code> </td> <td> U+022B4 </td> <td> <span class="glyph" title="">&#8884;</span> </td> <tr id="entity-LeftUpDownVector"><td> <code title="">LeftUpDownVector;</code> </td> <td> U+02951 </td> <td> <span class="glyph" title="">&#10577;</span> </td> <tr id="entity-LeftUpTeeVector"><td> <code title="">LeftUpTeeVector;</code> </td> <td> U+02960 </td> <td> <span class="glyph" title="">&#10592;</span> </td> <tr id="entity-LeftUpVector"><td> <code title="">LeftUpVector;</code> </td> <td> U+021BF </td> <td> <span class="glyph" title="">&#8639;</span> </td> <tr id="entity-LeftUpVectorBar"><td> <code title="">LeftUpVectorBar;</code> </td> <td> U+02958 </td> <td> <span class="glyph" title="">&#10584;</span> </td> <tr id="entity-LeftVector"><td> <code title="">LeftVector;</code> </td> <td> U+021BC </td> <td> <span class="glyph" title="">&#8636;</span> </td> <tr id="entity-LeftVectorBar"><td> <code title="">LeftVectorBar;</code> </td> <td> U+02952 </td> <td> <span class="glyph" title="">&#10578;</span> </td> <tr id="entity-Leftarrow"><td> <code title="">Leftarrow;</code> </td> <td> U+021D0 </td> <td> <span class="glyph" title="">&lArr;</span> </td> <tr id="entity-Leftrightarrow"><td> <code title="">Leftrightarrow;</code> </td> <td> U+021D4 </td> <td> <span class="glyph" title="">&hArr;</span> </td> <tr id="entity-LessEqualGreater"><td> <code title="">LessEqualGreater;</code> </td> <td> U+022DA </td> <td> <span class="glyph" title="">&#8922;</span> </td> <tr id="entity-LessFullEqual"><td> <code title="">LessFullEqual;</code> </td> <td> U+02266 </td> <td> <span class="glyph" title="">&#8806;</span> </td> <tr id="entity-LessGreater"><td> <code title="">LessGreater;</code> </td> <td> U+02276 </td> <td> <span class="glyph" title="">&#8822;</span> </td> <tr id="entity-LessLess"><td> <code title="">LessLess;</code> </td> <td> U+02AA1 </td> <td> <span class="glyph" title="">&#10913;</span> </td> <tr id="entity-LessSlantEqual"><td> <code title="">LessSlantEqual;</code> </td> <td> U+02A7D </td> <td> <span class="glyph" title="">&#10877;</span> </td> <tr id="entity-LessTilde"><td> <code title="">LessTilde;</code> </td> <td> U+02272 </td> <td> <span class="glyph" title="">&#8818;</span> </td> <tr id="entity-Lfr"><td> <code title="">Lfr;</code> </td> <td> U+1D50F </td> <td> <span class="glyph" title="">&#120079;</span> </td> <tr id="entity-Ll"><td> <code title="">Ll;</code> </td> <td> U+022D8 </td> <td> <span class="glyph" title="">&#8920;</span> </td> <tr id="entity-Lleftarrow"><td> <code title="">Lleftarrow;</code> </td> <td> U+021DA </td> <td> <span class="glyph" title="">&#8666;</span> </td> <tr id="entity-Lmidot"><td> <code title="">Lmidot;</code> </td> <td> U+0013F </td> <td> <span class="glyph" title="">&#319;</span> </td> <tr id="entity-LongLeftArrow"><td> <code title="">LongLeftArrow;</code> </td> <td> U+027F5 </td> <td> <span class="glyph" title="">&#10229;</span> </td> <tr id="entity-LongLeftRightArrow"><td> <code title="">LongLeftRightArrow;</code> </td> <td> U+027F7 </td> <td> <span class="glyph" title="">&#10231;</span> </td> <tr id="entity-LongRightArrow"><td> <code title="">LongRightArrow;</code> </td> <td> U+027F6 </td> <td> <span class="glyph" title="">&#10230;</span> </td> <tr id="entity-Longleftarrow"><td> <code title="">Longleftarrow;</code> </td> <td> U+027F8 </td> <td> <span class="glyph" title="">&#10232;</span> </td> <tr id="entity-Longleftrightarrow"><td> <code title="">Longleftrightarrow;</code> </td> <td> U+027FA </td> <td> <span class="glyph" title="">&#10234;</span> </td> <tr id="entity-Longrightarrow"><td> <code title="">Longrightarrow;</code> </td> <td> U+027F9 </td> <td> <span class="glyph" title="">&#10233;</span> </td> <tr id="entity-Lopf"><td> <code title="">Lopf;</code> </td> <td> U+1D543 </td> <td> <span class="glyph" title="">&#120131;</span> </td> <tr id="entity-LowerLeftArrow"><td> <code title="">LowerLeftArrow;</code> </td> <td> U+02199 </td> <td> <span class="glyph" title="">&#8601;</span> </td> <tr id="entity-LowerRightArrow"><td> <code title="">LowerRightArrow;</code> </td> <td> U+02198 </td> <td> <span class="glyph" title="">&#8600;</span> </td> <tr id="entity-Lscr"><td> <code title="">Lscr;</code> </td> <td> U+02112 </td> <td> <span class="glyph" title="">&#8466;</span> </td> <tr id="entity-Lsh"><td> <code title="">Lsh;</code> </td> <td> U+021B0 </td> <td> <span class="glyph" title="">&#8624;</span> </td> <tr id="entity-Lstrok"><td> <code title="">Lstrok;</code> </td> <td> U+00141 </td> <td> <span class="glyph" title="">&#321;</span> </td> <tr id="entity-Lt"><td> <code title="">Lt;</code> </td> <td> U+0226A </td> <td> <span class="glyph" title="">&#8810;</span> </td> <tr id="entity-Map"><td> <code title="">Map;</code> </td> <td> U+02905 </td> <td> <span class="glyph" title="">&#10501;</span> </td> <tr id="entity-Mcy"><td> <code title="">Mcy;</code> </td> <td> U+0041C </td> <td> <span class="glyph" title="">&#1052;</span> </td> <tr id="entity-MediumSpace"><td> <code title="">MediumSpace;</code> </td> <td> U+0205F </td> <td> <span class="glyph" title="">&#8287;</span> </td> <tr id="entity-Mellintrf"><td> <code title="">Mellintrf;</code> </td> <td> U+02133 </td> <td> <span class="glyph" title="">&#8499;</span> </td> <tr id="entity-Mfr"><td> <code title="">Mfr;</code> </td> <td> U+1D510 </td> <td> <span class="glyph" title="">&#120080;</span> </td> <tr id="entity-MinusPlus"><td> <code title="">MinusPlus;</code> </td> <td> U+02213 </td> <td> <span class="glyph" title="">&#8723;</span> </td> <tr id="entity-Mopf"><td> <code title="">Mopf;</code> </td> <td> U+1D544 </td> <td> <span class="glyph" title="">&#120132;</span> </td> <tr id="entity-Mscr"><td> <code title="">Mscr;</code> </td> <td> U+02133 </td> <td> <span class="glyph" title="">&#8499;</span> </td> <tr id="entity-Mu"><td> <code title="">Mu;</code> </td> <td> U+0039C </td> <td> <span class="glyph" title="">&Mu;</span> </td> <tr id="entity-NJcy"><td> <code title="">NJcy;</code> </td> <td> U+0040A </td> <td> <span class="glyph" title="">&#1034;</span> </td> <tr id="entity-Nacute"><td> <code title="">Nacute;</code> </td> <td> U+00143 </td> <td> <span class="glyph" title="">&#323;</span> </td> <tr id="entity-Ncaron"><td> <code title="">Ncaron;</code> </td> <td> U+00147 </td> <td> <span class="glyph" title="">&#327;</span> </td> <tr id="entity-Ncedil"><td> <code title="">Ncedil;</code> </td> <td> U+00145 </td> <td> <span class="glyph" title="">&#325;</span> </td> <tr id="entity-Ncy"><td> <code title="">Ncy;</code> </td> <td> U+0041D </td> <td> <span class="glyph" title="">&#1053;</span> </td> <tr id="entity-NegativeMediumSpace"><td> <code title="">NegativeMediumSpace;</code> </td> <td> U+0200B </td> <td> <span class="glyph" title="">&#8203;</span> </td> <tr id="entity-NegativeThickSpace"><td> <code title="">NegativeThickSpace;</code> </td> <td> U+0200B </td> <td> <span class="glyph" title="">&#8203;</span> </td> <tr id="entity-NegativeThinSpace"><td> <code title="">NegativeThinSpace;</code> </td> <td> U+0200B </td> <td> <span class="glyph" title="">&#8203;</span> </td> <tr id="entity-NegativeVeryThinSpace"><td> <code title="">NegativeVeryThinSpace;</code> </td> <td> U+0200B </td> <td> <span class="glyph" title="">&#8203;</span> </td> <tr id="entity-NestedGreaterGreater"><td> <code title="">NestedGreaterGreater;</code> </td> <td> U+0226B </td> <td> <span class="glyph" title="">&#8811;</span> </td> <tr id="entity-NestedLessLess"><td> <code title="">NestedLessLess;</code> </td> <td> U+0226A </td> <td> <span class="glyph" title="">&#8810;</span> </td> <tr id="entity-NewLine"><td> <code title="">NewLine;</code> </td> <td> U+0000A </td> <td> <span class="glyph control" title="">&#9226;</span> </td> <tr id="entity-Nfr"><td> <code title="">Nfr;</code> </td> <td> U+1D511 </td> <td> <span class="glyph" title="">&#120081;</span> </td> <tr id="entity-NoBreak"><td> <code title="">NoBreak;</code> </td> <td> U+02060 </td> <td> <span class="glyph" title="">&#8288;</span> </td> <tr id="entity-NonBreakingSpace"><td> <code title="">NonBreakingSpace;</code> </td> <td> U+000A0 </td> <td> <span class="glyph" title="">&nbsp;</span> </td> <tr id="entity-Nopf"><td> <code title="">Nopf;</code> </td> <td> U+02115 </td> <td> <span class="glyph" title="">&#8469;</span> </td> <tr id="entity-Not"><td> <code title="">Not;</code> </td> <td> U+02AEC </td> <td> <span class="glyph" title="">&#10988;</span> </td> <tr id="entity-NotCongruent"><td> <code title="">NotCongruent;</code> </td> <td> U+02262 </td> <td> <span class="glyph" title="">&#8802;</span> </td> <tr id="entity-NotCupCap"><td> <code title="">NotCupCap;</code> </td> <td> U+0226D </td> <td> <span class="glyph" title="">&#8813;</span> </td> <tr id="entity-NotDoubleVerticalBar"><td> <code title="">NotDoubleVerticalBar;</code> </td> <td> U+02226 </td> <td> <span class="glyph" title="">&#8742;</span> </td> <tr id="entity-NotElement"><td> <code title="">NotElement;</code> </td> <td> U+02209 </td> <td> <span class="glyph" title="">&notin;</span> </td> <tr id="entity-NotEqual"><td> <code title="">NotEqual;</code> </td> <td> U+02260 </td> <td> <span class="glyph" title="">&ne;</span> </td> <tr id="entity-NotEqualTilde"><td> <code title="">NotEqualTilde;</code> </td> <td> U+02242 U+00338 </td> <td> <span class="glyph compound" title="">&#8770;&#824;</span> </td> <tr id="entity-NotExists"><td> <code title="">NotExists;</code> </td> <td> U+02204 </td> <td> <span class="glyph" title="">&#8708;</span> </td> <tr id="entity-NotGreater"><td> <code title="">NotGreater;</code> </td> <td> U+0226F </td> <td> <span class="glyph" title="">&#8815;</span> </td> <tr id="entity-NotGreaterEqual"><td> <code title="">NotGreaterEqual;</code> </td> <td> U+02271 </td> <td> <span class="glyph" title="">&#8817;</span> </td> <tr id="entity-NotGreaterFullEqual"><td> <code title="">NotGreaterFullEqual;</code> </td> <td> U+02267 U+00338 </td> <td> <span class="glyph compound" title="">&#8807;&#824;</span> </td> <tr id="entity-NotGreaterGreater"><td> <code title="">NotGreaterGreater;</code> </td> <td> U+0226B U+00338 </td> <td> <span class="glyph compound" title="">&#8811;&#824;</span> </td> <tr id="entity-NotGreaterLess"><td> <code title="">NotGreaterLess;</code> </td> <td> U+02279 </td> <td> <span class="glyph" title="">&#8825;</span> </td> <tr id="entity-NotGreaterSlantEqual"><td> <code title="">NotGreaterSlantEqual;</code> </td> <td> U+02A7E U+00338 </td> <td> <span class="glyph compound" title="">&#10878;&#824;</span> </td> <tr id="entity-NotGreaterTilde"><td> <code title="">NotGreaterTilde;</code> </td> <td> U+02275 </td> <td> <span class="glyph" title="">&#8821;</span> </td> <tr id="entity-NotHumpDownHump"><td> <code title="">NotHumpDownHump;</code> </td> <td> U+0224E U+00338 </td> <td> <span class="glyph compound" title="">&#8782;&#824;</span> </td> <tr id="entity-NotHumpEqual"><td> <code title="">NotHumpEqual;</code> </td> <td> U+0224F U+00338 </td> <td> <span class="glyph compound" title="">&#8783;&#824;</span> </td> <tr id="entity-NotLeftTriangle"><td> <code title="">NotLeftTriangle;</code> </td> <td> U+022EA </td> <td> <span class="glyph" title="">&#8938;</span> </td> <tr id="entity-NotLeftTriangleBar"><td> <code title="">NotLeftTriangleBar;</code> </td> <td> U+029CF U+00338 </td> <td> <span class="glyph compound" title="">&#10703;&#824;</span> </td> <tr id="entity-NotLeftTriangleEqual"><td> <code title="">NotLeftTriangleEqual;</code> </td> <td> U+022EC </td> <td> <span class="glyph" title="">&#8940;</span> </td> <tr id="entity-NotLess"><td> <code title="">NotLess;</code> </td> <td> U+0226E </td> <td> <span class="glyph" title="">&#8814;</span> </td> <tr id="entity-NotLessEqual"><td> <code title="">NotLessEqual;</code> </td> <td> U+02270 </td> <td> <span class="glyph" title="">&#8816;</span> </td> <tr id="entity-NotLessGreater"><td> <code title="">NotLessGreater;</code> </td> <td> U+02278 </td> <td> <span class="glyph" title="">&#8824;</span> </td> <tr id="entity-NotLessLess"><td> <code title="">NotLessLess;</code> </td> <td> U+0226A U+00338 </td> <td> <span class="glyph compound" title="">&#8810;&#824;</span> </td> <tr id="entity-NotLessSlantEqual"><td> <code title="">NotLessSlantEqual;</code> </td> <td> U+02A7D U+00338 </td> <td> <span class="glyph compound" title="">&#10877;&#824;</span> </td> <tr id="entity-NotLessTilde"><td> <code title="">NotLessTilde;</code> </td> <td> U+02274 </td> <td> <span class="glyph" title="">&#8820;</span> </td> <tr id="entity-NotNestedGreaterGreater"><td> <code title="">NotNestedGreaterGreater;</code> </td> <td> U+02AA2 U+00338 </td> <td> <span class="glyph compound" title="">&#10914;&#824;</span> </td> <tr id="entity-NotNestedLessLess"><td> <code title="">NotNestedLessLess;</code> </td> <td> U+02AA1 U+00338 </td> <td> <span class="glyph compound" title="">&#10913;&#824;</span> </td> <tr id="entity-NotPrecedes"><td> <code title="">NotPrecedes;</code> </td> <td> U+02280 </td> <td> <span class="glyph" title="">&#8832;</span> </td> <tr id="entity-NotPrecedesEqual"><td> <code title="">NotPrecedesEqual;</code> </td> <td> U+02AAF U+00338 </td> <td> <span class="glyph compound" title="">&#10927;&#824;</span> </td> <tr id="entity-NotPrecedesSlantEqual"><td> <code title="">NotPrecedesSlantEqual;</code> </td> <td> U+022E0 </td> <td> <span class="glyph" title="">&#8928;</span> </td> <tr id="entity-NotReverseElement"><td> <code title="">NotReverseElement;</code> </td> <td> U+0220C </td> <td> <span class="glyph" title="">&#8716;</span> </td> <tr id="entity-NotRightTriangle"><td> <code title="">NotRightTriangle;</code> </td> <td> U+022EB </td> <td> <span class="glyph" title="">&#8939;</span> </td> <tr id="entity-NotRightTriangleBar"><td> <code title="">NotRightTriangleBar;</code> </td> <td> U+029D0 U+00338 </td> <td> <span class="glyph compound" title="">&#10704;&#824;</span> </td> <tr id="entity-NotRightTriangleEqual"><td> <code title="">NotRightTriangleEqual;</code> </td> <td> U+022ED </td> <td> <span class="glyph" title="">&#8941;</span> </td> <tr id="entity-NotSquareSubset"><td> <code title="">NotSquareSubset;</code> </td> <td> U+0228F U+00338 </td> <td> <span class="glyph compound" title="">&#8847;&#824;</span> </td> <tr id="entity-NotSquareSubsetEqual"><td> <code title="">NotSquareSubsetEqual;</code> </td> <td> U+022E2 </td> <td> <span class="glyph" title="">&#8930;</span> </td> <tr id="entity-NotSquareSuperset"><td> <code title="">NotSquareSuperset;</code> </td> <td> U+02290 U+00338 </td> <td> <span class="glyph compound" title="">&#8848;&#824;</span> </td> <tr id="entity-NotSquareSupersetEqual"><td> <code title="">NotSquareSupersetEqual;</code> </td> <td> U+022E3 </td> <td> <span class="glyph" title="">&#8931;</span> </td> <tr id="entity-NotSubset"><td> <code title="">NotSubset;</code> </td> <td> U+02282 U+020D2 </td> <td> <span class="glyph compound" title="">&sub;&#8402;</span> </td> <tr id="entity-NotSubsetEqual"><td> <code title="">NotSubsetEqual;</code> </td> <td> U+02288 </td> <td> <span class="glyph" title="">&#8840;</span> </td> <tr id="entity-NotSucceeds"><td> <code title="">NotSucceeds;</code> </td> <td> U+02281 </td> <td> <span class="glyph" title="">&#8833;</span> </td> <tr id="entity-NotSucceedsEqual"><td> <code title="">NotSucceedsEqual;</code> </td> <td> U+02AB0 U+00338 </td> <td> <span class="glyph compound" title="">&#10928;&#824;</span> </td> <tr id="entity-NotSucceedsSlantEqual"><td> <code title="">NotSucceedsSlantEqual;</code> </td> <td> U+022E1 </td> <td> <span class="glyph" title="">&#8929;</span> </td> <tr id="entity-NotSucceedsTilde"><td> <code title="">NotSucceedsTilde;</code> </td> <td> U+0227F U+00338 </td> <td> <span class="glyph compound" title="">&#8831;&#824;</span> </td> <tr id="entity-NotSuperset"><td> <code title="">NotSuperset;</code> </td> <td> U+02283 U+020D2 </td> <td> <span class="glyph compound" title="">&sup;&#8402;</span> </td> <tr id="entity-NotSupersetEqual"><td> <code title="">NotSupersetEqual;</code> </td> <td> U+02289 </td> <td> <span class="glyph" title="">&#8841;</span> </td> <tr id="entity-NotTilde"><td> <code title="">NotTilde;</code> </td> <td> U+02241 </td> <td> <span class="glyph" title="">&#8769;</span> </td> <tr id="entity-NotTildeEqual"><td> <code title="">NotTildeEqual;</code> </td> <td> U+02244 </td> <td> <span class="glyph" title="">&#8772;</span> </td> <tr id="entity-NotTildeFullEqual"><td> <code title="">NotTildeFullEqual;</code> </td> <td> U+02247 </td> <td> <span class="glyph" title="">&#8775;</span> </td> <tr id="entity-NotTildeTilde"><td> <code title="">NotTildeTilde;</code> </td> <td> U+02249 </td> <td> <span class="glyph" title="">&#8777;</span> </td> <tr id="entity-NotVerticalBar"><td> <code title="">NotVerticalBar;</code> </td> <td> U+02224 </td> <td> <span class="glyph" title="">&#8740;</span> </td> <tr id="entity-Nscr"><td> <code title="">Nscr;</code> </td> <td> U+1D4A9 </td> <td> <span class="glyph" title="">&#119977;</span> </td> <tr id="entity-Ntilde"><td> <code title="">Ntilde;</code> </td> <td> U+000D1 </td> <td> <span class="glyph" title="">&Ntilde;</span> </td> <tr id="entity-Nu"><td> <code title="">Nu;</code> </td> <td> U+0039D </td> <td> <span class="glyph" title="">&Nu;</span> </td> <tr id="entity-OElig"><td> <code title="">OElig;</code> </td> <td> U+00152 </td> <td> <span class="glyph" title="">&OElig;</span> </td> <tr id="entity-Oacute"><td> <code title="">Oacute;</code> </td> <td> U+000D3 </td> <td> <span class="glyph" title="">&Oacute;</span> </td> <tr id="entity-Ocirc"><td> <code title="">Ocirc;</code> </td> <td> U+000D4 </td> <td> <span class="glyph" title="">&Ocirc;</span> </td> <tr id="entity-Ocy"><td> <code title="">Ocy;</code> </td> <td> U+0041E </td> <td> <span class="glyph" title="">&#1054;</span> </td> <tr id="entity-Odblac"><td> <code title="">Odblac;</code> </td> <td> U+00150 </td> <td> <span class="glyph" title="">&#336;</span> </td> <tr id="entity-Ofr"><td> <code title="">Ofr;</code> </td> <td> U+1D512 </td> <td> <span class="glyph" title="">&#120082;</span> </td> <tr id="entity-Ograve"><td> <code title="">Ograve;</code> </td> <td> U+000D2 </td> <td> <span class="glyph" title="">&Ograve;</span> </td> <tr id="entity-Omacr"><td> <code title="">Omacr;</code> </td> <td> U+0014C </td> <td> <span class="glyph" title="">&#332;</span> </td> <tr id="entity-Omega"><td> <code title="">Omega;</code> </td> <td> U+003A9 </td> <td> <span class="glyph" title="">&Omega;</span> </td> <tr id="entity-Omicron"><td> <code title="">Omicron;</code> </td> <td> U+0039F </td> <td> <span class="glyph" title="">&Omicron;</span> </td> <tr id="entity-Oopf"><td> <code title="">Oopf;</code> </td> <td> U+1D546 </td> <td> <span class="glyph" title="">&#120134;</span> </td> <tr id="entity-OpenCurlyDoubleQuote"><td> <code title="">OpenCurlyDoubleQuote;</code> </td> <td> U+0201C </td> <td> <span class="glyph" title="">&ldquo;</span> </td> <tr id="entity-OpenCurlyQuote"><td> <code title="">OpenCurlyQuote;</code> </td> <td> U+02018 </td> <td> <span class="glyph" title="">&lsquo;</span> </td> <tr id="entity-Or"><td> <code title="">Or;</code> </td> <td> U+02A54 </td> <td> <span class="glyph" title="">&#10836;</span> </td> <tr id="entity-Oscr"><td> <code title="">Oscr;</code> </td> <td> U+1D4AA </td> <td> <span class="glyph" title="">&#119978;</span> </td> <tr id="entity-Oslash"><td> <code title="">Oslash;</code> </td> <td> U+000D8 </td> <td> <span class="glyph" title="">&Oslash;</span> </td> <tr id="entity-Otilde"><td> <code title="">Otilde;</code> </td> <td> U+000D5 </td> <td> <span class="glyph" title="">&Otilde;</span> </td> <tr id="entity-Otimes"><td> <code title="">Otimes;</code> </td> <td> U+02A37 </td> <td> <span class="glyph" title="">&#10807;</span> </td> <tr id="entity-Ouml"><td> <code title="">Ouml;</code> </td> <td> U+000D6 </td> <td> <span class="glyph" title="">&Ouml;</span> </td> <tr id="entity-OverBar"><td> <code title="">OverBar;</code> </td> <td> U+0203E </td> <td> <span class="glyph" title="">&oline;</span> </td> <tr id="entity-OverBrace"><td> <code title="">OverBrace;</code> </td> <td> U+023DE </td> <td> <span class="glyph" title="">&#9182;</span> </td> <tr id="entity-OverBracket"><td> <code title="">OverBracket;</code> </td> <td> U+023B4 </td> <td> <span class="glyph" title="">&#9140;</span> </td> <tr id="entity-OverParenthesis"><td> <code title="">OverParenthesis;</code> </td> <td> U+023DC </td> <td> <span class="glyph" title="">&#9180;</span> </td> <tr id="entity-PartialD"><td> <code title="">PartialD;</code> </td> <td> U+02202 </td> <td> <span class="glyph" title="">&part;</span> </td> <tr id="entity-Pcy"><td> <code title="">Pcy;</code> </td> <td> U+0041F </td> <td> <span class="glyph" title="">&#1055;</span> </td> <tr id="entity-Pfr"><td> <code title="">Pfr;</code> </td> <td> U+1D513 </td> <td> <span class="glyph" title="">&#120083;</span> </td> <tr id="entity-Phi"><td> <code title="">Phi;</code> </td> <td> U+003A6 </td> <td> <span class="glyph" title="">&Phi;</span> </td> <tr id="entity-Pi"><td> <code title="">Pi;</code> </td> <td> U+003A0 </td> <td> <span class="glyph" title="">&Pi;</span> </td> <tr id="entity-PlusMinus"><td> <code title="">PlusMinus;</code> </td> <td> U+000B1 </td> <td> <span class="glyph" title="">&plusmn;</span> </td> <tr id="entity-Poincareplane"><td> <code title="">Poincareplane;</code> </td> <td> U+0210C </td> <td> <span class="glyph" title="">&#8460;</span> </td> <tr id="entity-Popf"><td> <code title="">Popf;</code> </td> <td> U+02119 </td> <td> <span class="glyph" title="">&#8473;</span> </td> <tr id="entity-Pr"><td> <code title="">Pr;</code> </td> <td> U+02ABB </td> <td> <span class="glyph" title="">&#10939;</span> </td> <tr id="entity-Precedes"><td> <code title="">Precedes;</code> </td> <td> U+0227A </td> <td> <span class="glyph" title="">&#8826;</span> </td> <tr id="entity-PrecedesEqual"><td> <code title="">PrecedesEqual;</code> </td> <td> U+02AAF </td> <td> <span class="glyph" title="">&#10927;</span> </td> <tr id="entity-PrecedesSlantEqual"><td> <code title="">PrecedesSlantEqual;</code> </td> <td> U+0227C </td> <td> <span class="glyph" title="">&#8828;</span> </td> <tr id="entity-PrecedesTilde"><td> <code title="">PrecedesTilde;</code> </td> <td> U+0227E </td> <td> <span class="glyph" title="">&#8830;</span> </td> <tr id="entity-Prime"><td> <code title="">Prime;</code> </td> <td> U+02033 </td> <td> <span class="glyph" title="">&Prime;</span> </td> <tr id="entity-Product"><td> <code title="">Product;</code> </td> <td> U+0220F </td> <td> <span class="glyph" title="">&prod;</span> </td> <tr id="entity-Proportion"><td> <code title="">Proportion;</code> </td> <td> U+02237 </td> <td> <span class="glyph" title="">&#8759;</span> </td> <tr id="entity-Proportional"><td> <code title="">Proportional;</code> </td> <td> U+0221D </td> <td> <span class="glyph" title="">&prop;</span> </td> <tr id="entity-Pscr"><td> <code title="">Pscr;</code> </td> <td> U+1D4AB </td> <td> <span class="glyph" title="">&#119979;</span> </td> <tr id="entity-Psi"><td> <code title="">Psi;</code> </td> <td> U+003A8 </td> <td> <span class="glyph" title="">&Psi;</span> </td> <tr id="entity-QUOT"><td> <code title="">QUOT;</code> </td> <td> U+00022 </td> <td> <span class="glyph" title="">"</span> </td> <tr id="entity-Qfr"><td> <code title="">Qfr;</code> </td> <td> U+1D514 </td> <td> <span class="glyph" title="">&#120084;</span> </td> <tr id="entity-Qopf"><td> <code title="">Qopf;</code> </td> <td> U+0211A </td> <td> <span class="glyph" title="">&#8474;</span> </td> <tr id="entity-Qscr"><td> <code title="">Qscr;</code> </td> <td> U+1D4AC </td> <td> <span class="glyph" title="">&#119980;</span> </td> <tr id="entity-RBarr"><td> <code title="">RBarr;</code> </td> <td> U+02910 </td> <td> <span class="glyph" title="">&#10512;</span> </td> <tr id="entity-REG"><td> <code title="">REG;</code> </td> <td> U+000AE </td> <td> <span class="glyph" title="">&reg;</span> </td> <tr id="entity-Racute"><td> <code title="">Racute;</code> </td> <td> U+00154 </td> <td> <span class="glyph" title="">&#340;</span> </td> <tr id="entity-Rang"><td> <code title="">Rang;</code> </td> <td> U+027EB </td> <td> <span class="glyph" title="">&#10219;</span> </td> <tr id="entity-Rarr"><td> <code title="">Rarr;</code> </td> <td> U+021A0 </td> <td> <span class="glyph" title="">&#8608;</span> </td> <tr id="entity-Rarrtl"><td> <code title="">Rarrtl;</code> </td> <td> U+02916 </td> <td> <span class="glyph" title="">&#10518;</span> </td> <tr id="entity-Rcaron"><td> <code title="">Rcaron;</code> </td> <td> U+00158 </td> <td> <span class="glyph" title="">&#344;</span> </td> <tr id="entity-Rcedil"><td> <code title="">Rcedil;</code> </td> <td> U+00156 </td> <td> <span class="glyph" title="">&#342;</span> </td> <tr id="entity-Rcy"><td> <code title="">Rcy;</code> </td> <td> U+00420 </td> <td> <span class="glyph" title="">&#1056;</span> </td> <tr id="entity-Re"><td> <code title="">Re;</code> </td> <td> U+0211C </td> <td> <span class="glyph" title="">&real;</span> </td> <tr id="entity-ReverseElement"><td> <code title="">ReverseElement;</code> </td> <td> U+0220B </td> <td> <span class="glyph" title="">&ni;</span> </td> <tr id="entity-ReverseEquilibrium"><td> <code title="">ReverseEquilibrium;</code> </td> <td> U+021CB </td> <td> <span class="glyph" title="">&#8651;</span> </td> <tr id="entity-ReverseUpEquilibrium"><td> <code title="">ReverseUpEquilibrium;</code> </td> <td> U+0296F </td> <td> <span class="glyph" title="">&#10607;</span> </td> <tr id="entity-Rfr"><td> <code title="">Rfr;</code> </td> <td> U+0211C </td> <td> <span class="glyph" title="">&real;</span> </td> <tr id="entity-Rho"><td> <code title="">Rho;</code> </td> <td> U+003A1 </td> <td> <span class="glyph" title="">&Rho;</span> </td> <tr id="entity-RightAngleBracket"><td> <code title="">RightAngleBracket;</code> </td> <td> U+027E9 </td> <td> <span class="glyph" title="">&#9002;</span> </td> <tr id="entity-RightArrow"><td> <code title="">RightArrow;</code> </td> <td> U+02192 </td> <td> <span class="glyph" title="">&rarr;</span> </td> <tr id="entity-RightArrowBar"><td> <code title="">RightArrowBar;</code> </td> <td> U+021E5 </td> <td> <span class="glyph" title="">&#8677;</span> </td> <tr id="entity-RightArrowLeftArrow"><td> <code title="">RightArrowLeftArrow;</code> </td> <td> U+021C4 </td> <td> <span class="glyph" title="">&#8644;</span> </td> <tr id="entity-RightCeiling"><td> <code title="">RightCeiling;</code> </td> <td> U+02309 </td> <td> <span class="glyph" title="">&rceil;</span> </td> <tr id="entity-RightDoubleBracket"><td> <code title="">RightDoubleBracket;</code> </td> <td> U+027E7 </td> <td> <span class="glyph" title="">&#10215;</span> </td> <tr id="entity-RightDownTeeVector"><td> <code title="">RightDownTeeVector;</code> </td> <td> U+0295D </td> <td> <span class="glyph" title="">&#10589;</span> </td> <tr id="entity-RightDownVector"><td> <code title="">RightDownVector;</code> </td> <td> U+021C2 </td> <td> <span class="glyph" title="">&#8642;</span> </td> <tr id="entity-RightDownVectorBar"><td> <code title="">RightDownVectorBar;</code> </td> <td> U+02955 </td> <td> <span class="glyph" title="">&#10581;</span> </td> <tr id="entity-RightFloor"><td> <code title="">RightFloor;</code> </td> <td> U+0230B </td> <td> <span class="glyph" title="">&rfloor;</span> </td> <tr id="entity-RightTee"><td> <code title="">RightTee;</code> </td> <td> U+022A2 </td> <td> <span class="glyph" title="">&#8866;</span> </td> <tr id="entity-RightTeeArrow"><td> <code title="">RightTeeArrow;</code> </td> <td> U+021A6 </td> <td> <span class="glyph" title="">&#8614;</span> </td> <tr id="entity-RightTeeVector"><td> <code title="">RightTeeVector;</code> </td> <td> U+0295B </td> <td> <span class="glyph" title="">&#10587;</span> </td> <tr id="entity-RightTriangle"><td> <code title="">RightTriangle;</code> </td> <td> U+022B3 </td> <td> <span class="glyph" title="">&#8883;</span> </td> <tr id="entity-RightTriangleBar"><td> <code title="">RightTriangleBar;</code> </td> <td> U+029D0 </td> <td> <span class="glyph" title="">&#10704;</span> </td> <tr id="entity-RightTriangleEqual"><td> <code title="">RightTriangleEqual;</code> </td> <td> U+022B5 </td> <td> <span class="glyph" title="">&#8885;</span> </td> <tr id="entity-RightUpDownVector"><td> <code title="">RightUpDownVector;</code> </td> <td> U+0294F </td> <td> <span class="glyph" title="">&#10575;</span> </td> <tr id="entity-RightUpTeeVector"><td> <code title="">RightUpTeeVector;</code> </td> <td> U+0295C </td> <td> <span class="glyph" title="">&#10588;</span> </td> <tr id="entity-RightUpVector"><td> <code title="">RightUpVector;</code> </td> <td> U+021BE </td> <td> <span class="glyph" title="">&#8638;</span> </td> <tr id="entity-RightUpVectorBar"><td> <code title="">RightUpVectorBar;</code> </td> <td> U+02954 </td> <td> <span class="glyph" title="">&#10580;</span> </td> <tr id="entity-RightVector"><td> <code title="">RightVector;</code> </td> <td> U+021C0 </td> <td> <span class="glyph" title="">&#8640;</span> </td> <tr id="entity-RightVectorBar"><td> <code title="">RightVectorBar;</code> </td> <td> U+02953 </td> <td> <span class="glyph" title="">&#10579;</span> </td> <tr id="entity-Rightarrow"><td> <code title="">Rightarrow;</code> </td> <td> U+021D2 </td> <td> <span class="glyph" title="">&rArr;</span> </td> <tr id="entity-Ropf"><td> <code title="">Ropf;</code> </td> <td> U+0211D </td> <td> <span class="glyph" title="">&#8477;</span> </td> <tr id="entity-RoundImplies"><td> <code title="">RoundImplies;</code> </td> <td> U+02970 </td> <td> <span class="glyph" title="">&#10608;</span> </td> <tr id="entity-Rrightarrow"><td> <code title="">Rrightarrow;</code> </td> <td> U+021DB </td> <td> <span class="glyph" title="">&#8667;</span> </td> <tr id="entity-Rscr"><td> <code title="">Rscr;</code> </td> <td> U+0211B </td> <td> <span class="glyph" title="">&#8475;</span> </td> <tr id="entity-Rsh"><td> <code title="">Rsh;</code> </td> <td> U+021B1 </td> <td> <span class="glyph" title="">&#8625;</span> </td> <tr id="entity-RuleDelayed"><td> <code title="">RuleDelayed;</code> </td> <td> U+029F4 </td> <td> <span class="glyph" title="">&#10740;</span> </td> <tr id="entity-SHCHcy"><td> <code title="">SHCHcy;</code> </td> <td> U+00429 </td> <td> <span class="glyph" title="">&#1065;</span> </td> <tr id="entity-SHcy"><td> <code title="">SHcy;</code> </td> <td> U+00428 </td> <td> <span class="glyph" title="">&#1064;</span> </td> <tr id="entity-SOFTcy"><td> <code title="">SOFTcy;</code> </td> <td> U+0042C </td> <td> <span class="glyph" title="">&#1068;</span> </td> <tr id="entity-Sacute"><td> <code title="">Sacute;</code> </td> <td> U+0015A </td> <td> <span class="glyph" title="">&#346;</span> </td> <tr id="entity-Sc"><td> <code title="">Sc;</code> </td> <td> U+02ABC </td> <td> <span class="glyph" title="">&#10940;</span> </td> <tr id="entity-Scaron"><td> <code title="">Scaron;</code> </td> <td> U+00160 </td> <td> <span class="glyph" title="">&Scaron;</span> </td> <tr id="entity-Scedil"><td> <code title="">Scedil;</code> </td> <td> U+0015E </td> <td> <span class="glyph" title="">&#350;</span> </td> <tr id="entity-Scirc"><td> <code title="">Scirc;</code> </td> <td> U+0015C </td> <td> <span class="glyph" title="">&#348;</span> </td> <tr id="entity-Scy"><td> <code title="">Scy;</code> </td> <td> U+00421 </td> <td> <span class="glyph" title="">&#1057;</span> </td> <tr id="entity-Sfr"><td> <code title="">Sfr;</code> </td> <td> U+1D516 </td> <td> <span class="glyph" title="">&#120086;</span> </td> <tr id="entity-ShortDownArrow"><td> <code title="">ShortDownArrow;</code> </td> <td> U+02193 </td> <td> <span class="glyph" title="">&darr;</span> </td> <tr id="entity-ShortLeftArrow"><td> <code title="">ShortLeftArrow;</code> </td> <td> U+02190 </td> <td> <span class="glyph" title="">&larr;</span> </td> <tr id="entity-ShortRightArrow"><td> <code title="">ShortRightArrow;</code> </td> <td> U+02192 </td> <td> <span class="glyph" title="">&rarr;</span> </td> <tr id="entity-ShortUpArrow"><td> <code title="">ShortUpArrow;</code> </td> <td> U+02191 </td> <td> <span class="glyph" title="">&uarr;</span> </td> <tr id="entity-Sigma"><td> <code title="">Sigma;</code> </td> <td> U+003A3 </td> <td> <span class="glyph" title="">&Sigma;</span> </td> <tr id="entity-SmallCircle"><td> <code title="">SmallCircle;</code> </td> <td> U+02218 </td> <td> <span class="glyph" title="">&#8728;</span> </td> <tr id="entity-Sopf"><td> <code title="">Sopf;</code> </td> <td> U+1D54A </td> <td> <span class="glyph" title="">&#120138;</span> </td> <tr id="entity-Sqrt"><td> <code title="">Sqrt;</code> </td> <td> U+0221A </td> <td> <span class="glyph" title="">&radic;</span> </td> <tr id="entity-Square"><td> <code title="">Square;</code> </td> <td> U+025A1 </td> <td> <span class="glyph" title="">&#9633;</span> </td> <tr id="entity-SquareIntersection"><td> <code title="">SquareIntersection;</code> </td> <td> U+02293 </td> <td> <span class="glyph" title="">&#8851;</span> </td> <tr id="entity-SquareSubset"><td> <code title="">SquareSubset;</code> </td> <td> U+0228F </td> <td> <span class="glyph" title="">&#8847;</span> </td> <tr id="entity-SquareSubsetEqual"><td> <code title="">SquareSubsetEqual;</code> </td> <td> U+02291 </td> <td> <span class="glyph" title="">&#8849;</span> </td> <tr id="entity-SquareSuperset"><td> <code title="">SquareSuperset;</code> </td> <td> U+02290 </td> <td> <span class="glyph" title="">&#8848;</span> </td> <tr id="entity-SquareSupersetEqual"><td> <code title="">SquareSupersetEqual;</code> </td> <td> U+02292 </td> <td> <span class="glyph" title="">&#8850;</span> </td> <tr id="entity-SquareUnion"><td> <code title="">SquareUnion;</code> </td> <td> U+02294 </td> <td> <span class="glyph" title="">&#8852;</span> </td> <tr id="entity-Sscr"><td> <code title="">Sscr;</code> </td> <td> U+1D4AE </td> <td> <span class="glyph" title="">&#119982;</span> </td> <tr id="entity-Star"><td> <code title="">Star;</code> </td> <td> U+022C6 </td> <td> <span class="glyph" title="">&#8902;</span> </td> <tr id="entity-Sub"><td> <code title="">Sub;</code> </td> <td> U+022D0 </td> <td> <span class="glyph" title="">&#8912;</span> </td> <tr id="entity-Subset"><td> <code title="">Subset;</code> </td> <td> U+022D0 </td> <td> <span class="glyph" title="">&#8912;</span> </td> <tr id="entity-SubsetEqual"><td> <code title="">SubsetEqual;</code> </td> <td> U+02286 </td> <td> <span class="glyph" title="">&sube;</span> </td> <tr id="entity-Succeeds"><td> <code title="">Succeeds;</code> </td> <td> U+0227B </td> <td> <span class="glyph" title="">&#8827;</span> </td> <tr id="entity-SucceedsEqual"><td> <code title="">SucceedsEqual;</code> </td> <td> U+02AB0 </td> <td> <span class="glyph" title="">&#10928;</span> </td> <tr id="entity-SucceedsSlantEqual"><td> <code title="">SucceedsSlantEqual;</code> </td> <td> U+0227D </td> <td> <span class="glyph" title="">&#8829;</span> </td> <tr id="entity-SucceedsTilde"><td> <code title="">SucceedsTilde;</code> </td> <td> U+0227F </td> <td> <span class="glyph" title="">&#8831;</span> </td> <tr id="entity-SuchThat"><td> <code title="">SuchThat;</code> </td> <td> U+0220B </td> <td> <span class="glyph" title="">&ni;</span> </td> <tr id="entity-Sum"><td> <code title="">Sum;</code> </td> <td> U+02211 </td> <td> <span class="glyph" title="">&sum;</span> </td> <tr id="entity-Sup"><td> <code title="">Sup;</code> </td> <td> U+022D1 </td> <td> <span class="glyph" title="">&#8913;</span> </td> <tr id="entity-Superset"><td> <code title="">Superset;</code> </td> <td> U+02283 </td> <td> <span class="glyph" title="">&sup;</span> </td> <tr id="entity-SupersetEqual"><td> <code title="">SupersetEqual;</code> </td> <td> U+02287 </td> <td> <span class="glyph" title="">&supe;</span> </td> <tr id="entity-Supset"><td> <code title="">Supset;</code> </td> <td> U+022D1 </td> <td> <span class="glyph" title="">&#8913;</span> </td> <tr id="entity-THORN"><td> <code title="">THORN;</code> </td> <td> U+000DE </td> <td> <span class="glyph" title="">&THORN;</span> </td> <tr id="entity-TRADE"><td> <code title="">TRADE;</code> </td> <td> U+02122 </td> <td> <span class="glyph" title="">&trade;</span> </td> <tr id="entity-TSHcy"><td> <code title="">TSHcy;</code> </td> <td> U+0040B </td> <td> <span class="glyph" title="">&#1035;</span> </td> <tr id="entity-TScy"><td> <code title="">TScy;</code> </td> <td> U+00426 </td> <td> <span class="glyph" title="">&#1062;</span> </td> <tr id="entity-Tab"><td> <code title="">Tab;</code> </td> <td> U+00009 </td> <td> <span class="glyph control" title="">&#9225;</span> </td> <tr id="entity-Tau"><td> <code title="">Tau;</code> </td> <td> U+003A4 </td> <td> <span class="glyph" title="">&Tau;</span> </td> <tr id="entity-Tcaron"><td> <code title="">Tcaron;</code> </td> <td> U+00164 </td> <td> <span class="glyph" title="">&#356;</span> </td> <tr id="entity-Tcedil"><td> <code title="">Tcedil;</code> </td> <td> U+00162 </td> <td> <span class="glyph" title="">&#354;</span> </td> <tr id="entity-Tcy"><td> <code title="">Tcy;</code> </td> <td> U+00422 </td> <td> <span class="glyph" title="">&#1058;</span> </td> <tr id="entity-Tfr"><td> <code title="">Tfr;</code> </td> <td> U+1D517 </td> <td> <span class="glyph" title="">&#120087;</span> </td> <tr id="entity-Therefore"><td> <code title="">Therefore;</code> </td> <td> U+02234 </td> <td> <span class="glyph" title="">&there4;</span> </td> <tr id="entity-Theta"><td> <code title="">Theta;</code> </td> <td> U+00398 </td> <td> <span class="glyph" title="">&Theta;</span> </td> <tr id="entity-ThickSpace"><td> <code title="">ThickSpace;</code> </td> <td> U+0205F U+0200A </td> <td> <span class="glyph compound" title="">&#8287;&#8202;</span> </td> <tr id="entity-ThinSpace"><td> <code title="">ThinSpace;</code> </td> <td> U+02009 </td> <td> <span class="glyph" title="">&thinsp;</span> </td> <tr id="entity-Tilde"><td> <code title="">Tilde;</code> </td> <td> U+0223C </td> <td> <span class="glyph" title="">&sim;</span> </td> <tr id="entity-TildeEqual"><td> <code title="">TildeEqual;</code> </td> <td> U+02243 </td> <td> <span class="glyph" title="">&#8771;</span> </td> <tr id="entity-TildeFullEqual"><td> <code title="">TildeFullEqual;</code> </td> <td> U+02245 </td> <td> <span class="glyph" title="">&cong;</span> </td> <tr id="entity-TildeTilde"><td> <code title="">TildeTilde;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-Topf"><td> <code title="">Topf;</code> </td> <td> U+1D54B </td> <td> <span class="glyph" title="">&#120139;</span> </td> <tr id="entity-TripleDot"><td> <code title="">TripleDot;</code> </td> <td> U+020DB </td> <td> <span class="glyph composition" title="">&#9676;&#8411;</span> </td> <tr id="entity-Tscr"><td> <code title="">Tscr;</code> </td> <td> U+1D4AF </td> <td> <span class="glyph" title="">&#119983;</span> </td> <tr id="entity-Tstrok"><td> <code title="">Tstrok;</code> </td> <td> U+00166 </td> <td> <span class="glyph" title="">&#358;</span> </td> <tr id="entity-Uacute"><td> <code title="">Uacute;</code> </td> <td> U+000DA </td> <td> <span class="glyph" title="">&Uacute;</span> </td> <tr id="entity-Uarr"><td> <code title="">Uarr;</code> </td> <td> U+0219F </td> <td> <span class="glyph" title="">&#8607;</span> </td> <tr id="entity-Uarrocir"><td> <code title="">Uarrocir;</code> </td> <td> U+02949 </td> <td> <span class="glyph" title="">&#10569;</span> </td> <tr id="entity-Ubrcy"><td> <code title="">Ubrcy;</code> </td> <td> U+0040E </td> <td> <span class="glyph" title="">&#1038;</span> </td> <tr id="entity-Ubreve"><td> <code title="">Ubreve;</code> </td> <td> U+0016C </td> <td> <span class="glyph" title="">&#364;</span> </td> <tr id="entity-Ucirc"><td> <code title="">Ucirc;</code> </td> <td> U+000DB </td> <td> <span class="glyph" title="">&Ucirc;</span> </td> <tr id="entity-Ucy"><td> <code title="">Ucy;</code> </td> <td> U+00423 </td> <td> <span class="glyph" title="">&#1059;</span> </td> <tr id="entity-Udblac"><td> <code title="">Udblac;</code> </td> <td> U+00170 </td> <td> <span class="glyph" title="">&#368;</span> </td> <tr id="entity-Ufr"><td> <code title="">Ufr;</code> </td> <td> U+1D518 </td> <td> <span class="glyph" title="">&#120088;</span> </td> <tr id="entity-Ugrave"><td> <code title="">Ugrave;</code> </td> <td> U+000D9 </td> <td> <span class="glyph" title="">&Ugrave;</span> </td> <tr id="entity-Umacr"><td> <code title="">Umacr;</code> </td> <td> U+0016A </td> <td> <span class="glyph" title="">&#362;</span> </td> <tr id="entity-UnderBar"><td> <code title="">UnderBar;</code> </td> <td> U+0005F </td> <td> <span class="glyph" title="">_</span> </td> <tr id="entity-UnderBrace"><td> <code title="">UnderBrace;</code> </td> <td> U+023DF </td> <td> <span class="glyph" title="">&#9183;</span> </td> <tr id="entity-UnderBracket"><td> <code title="">UnderBracket;</code> </td> <td> U+023B5 </td> <td> <span class="glyph" title="">&#9141;</span> </td> <tr id="entity-UnderParenthesis"><td> <code title="">UnderParenthesis;</code> </td> <td> U+023DD </td> <td> <span class="glyph" title="">&#9181;</span> </td> <tr id="entity-Union"><td> <code title="">Union;</code> </td> <td> U+022C3 </td> <td> <span class="glyph" title="">&#8899;</span> </td> <tr id="entity-UnionPlus"><td> <code title="">UnionPlus;</code> </td> <td> U+0228E </td> <td> <span class="glyph" title="">&#8846;</span> </td> <tr id="entity-Uogon"><td> <code title="">Uogon;</code> </td> <td> U+00172 </td> <td> <span class="glyph" title="">&#370;</span> </td> <tr id="entity-Uopf"><td> <code title="">Uopf;</code> </td> <td> U+1D54C </td> <td> <span class="glyph" title="">&#120140;</span> </td> <tr id="entity-UpArrow"><td> <code title="">UpArrow;</code> </td> <td> U+02191 </td> <td> <span class="glyph" title="">&uarr;</span> </td> <tr id="entity-UpArrowBar"><td> <code title="">UpArrowBar;</code> </td> <td> U+02912 </td> <td> <span class="glyph" title="">&#10514;</span> </td> <tr id="entity-UpArrowDownArrow"><td> <code title="">UpArrowDownArrow;</code> </td> <td> U+021C5 </td> <td> <span class="glyph" title="">&#8645;</span> </td> <tr id="entity-UpDownArrow"><td> <code title="">UpDownArrow;</code> </td> <td> U+02195 </td> <td> <span class="glyph" title="">&#8597;</span> </td> <tr id="entity-UpEquilibrium"><td> <code title="">UpEquilibrium;</code> </td> <td> U+0296E </td> <td> <span class="glyph" title="">&#10606;</span> </td> <tr id="entity-UpTee"><td> <code title="">UpTee;</code> </td> <td> U+022A5 </td> <td> <span class="glyph" title="">&perp;</span> </td> <tr id="entity-UpTeeArrow"><td> <code title="">UpTeeArrow;</code> </td> <td> U+021A5 </td> <td> <span class="glyph" title="">&#8613;</span> </td> <tr id="entity-Uparrow"><td> <code title="">Uparrow;</code> </td> <td> U+021D1 </td> <td> <span class="glyph" title="">&uArr;</span> </td> <tr id="entity-Updownarrow"><td> <code title="">Updownarrow;</code> </td> <td> U+021D5 </td> <td> <span class="glyph" title="">&#8661;</span> </td> <tr id="entity-UpperLeftArrow"><td> <code title="">UpperLeftArrow;</code> </td> <td> U+02196 </td> <td> <span class="glyph" title="">&#8598;</span> </td> <tr id="entity-UpperRightArrow"><td> <code title="">UpperRightArrow;</code> </td> <td> U+02197 </td> <td> <span class="glyph" title="">&#8599;</span> </td> <tr id="entity-Upsi"><td> <code title="">Upsi;</code> </td> <td> U+003D2 </td> <td> <span class="glyph" title="">&upsih;</span> </td> <tr id="entity-Upsilon"><td> <code title="">Upsilon;</code> </td> <td> U+003A5 </td> <td> <span class="glyph" title="">&Upsilon;</span> </td> <tr id="entity-Uring"><td> <code title="">Uring;</code> </td> <td> U+0016E </td> <td> <span class="glyph" title="">&#366;</span> </td> <tr id="entity-Uscr"><td> <code title="">Uscr;</code> </td> <td> U+1D4B0 </td> <td> <span class="glyph" title="">&#119984;</span> </td> <tr id="entity-Utilde"><td> <code title="">Utilde;</code> </td> <td> U+00168 </td> <td> <span class="glyph" title="">&#360;</span> </td> <tr id="entity-Uuml"><td> <code title="">Uuml;</code> </td> <td> U+000DC </td> <td> <span class="glyph" title="">&Uuml;</span> </td> <tr id="entity-VDash"><td> <code title="">VDash;</code> </td> <td> U+022AB </td> <td> <span class="glyph" title="">&#8875;</span> </td> <tr id="entity-Vbar"><td> <code title="">Vbar;</code> </td> <td> U+02AEB </td> <td> <span class="glyph" title="">&#10987;</span> </td> <tr id="entity-Vcy"><td> <code title="">Vcy;</code> </td> <td> U+00412 </td> <td> <span class="glyph" title="">&#1042;</span> </td> <tr id="entity-Vdash"><td> <code title="">Vdash;</code> </td> <td> U+022A9 </td> <td> <span class="glyph" title="">&#8873;</span> </td> <tr id="entity-Vdashl"><td> <code title="">Vdashl;</code> </td> <td> U+02AE6 </td> <td> <span class="glyph" title="">&#10982;</span> </td> <tr id="entity-Vee"><td> <code title="">Vee;</code> </td> <td> U+022C1 </td> <td> <span class="glyph" title="">&#8897;</span> </td> <tr id="entity-Verbar"><td> <code title="">Verbar;</code> </td> <td> U+02016 </td> <td> <span class="glyph" title="">&#8214;</span> </td> <tr id="entity-Vert"><td> <code title="">Vert;</code> </td> <td> U+02016 </td> <td> <span class="glyph" title="">&#8214;</span> </td> <tr id="entity-VerticalBar"><td> <code title="">VerticalBar;</code> </td> <td> U+02223 </td> <td> <span class="glyph" title="">&#8739;</span> </td> <tr id="entity-VerticalLine"><td> <code title="">VerticalLine;</code> </td> <td> U+0007C </td> <td> <span class="glyph" title="">|</span> </td> <tr id="entity-VerticalSeparator"><td> <code title="">VerticalSeparator;</code> </td> <td> U+02758 </td> <td> <span class="glyph" title="">&#10072;</span> </td> <tr id="entity-VerticalTilde"><td> <code title="">VerticalTilde;</code> </td> <td> U+02240 </td> <td> <span class="glyph" title="">&#8768;</span> </td> <tr id="entity-VeryThinSpace"><td> <code title="">VeryThinSpace;</code> </td> <td> U+0200A </td> <td> <span class="glyph" title="">&#8202;</span> </td> <tr id="entity-Vfr"><td> <code title="">Vfr;</code> </td> <td> U+1D519 </td> <td> <span class="glyph" title="">&#120089;</span> </td> <tr id="entity-Vopf"><td> <code title="">Vopf;</code> </td> <td> U+1D54D </td> <td> <span class="glyph" title="">&#120141;</span> </td> <tr id="entity-Vscr"><td> <code title="">Vscr;</code> </td> <td> U+1D4B1 </td> <td> <span class="glyph" title="">&#119985;</span> </td> <tr id="entity-Vvdash"><td> <code title="">Vvdash;</code> </td> <td> U+022AA </td> <td> <span class="glyph" title="">&#8874;</span> </td> <tr id="entity-Wcirc"><td> <code title="">Wcirc;</code> </td> <td> U+00174 </td> <td> <span class="glyph" title="">&#372;</span> </td> <tr id="entity-Wedge"><td> <code title="">Wedge;</code> </td> <td> U+022C0 </td> <td> <span class="glyph" title="">&#8896;</span> </td> <tr id="entity-Wfr"><td> <code title="">Wfr;</code> </td> <td> U+1D51A </td> <td> <span class="glyph" title="">&#120090;</span> </td> <tr id="entity-Wopf"><td> <code title="">Wopf;</code> </td> <td> U+1D54E </td> <td> <span class="glyph" title="">&#120142;</span> </td> <tr id="entity-Wscr"><td> <code title="">Wscr;</code> </td> <td> U+1D4B2 </td> <td> <span class="glyph" title="">&#119986;</span> </td> <tr id="entity-Xfr"><td> <code title="">Xfr;</code> </td> <td> U+1D51B </td> <td> <span class="glyph" title="">&#120091;</span> </td> <tr id="entity-Xi"><td> <code title="">Xi;</code> </td> <td> U+0039E </td> <td> <span class="glyph" title="">&Xi;</span> </td> <tr id="entity-Xopf"><td> <code title="">Xopf;</code> </td> <td> U+1D54F </td> <td> <span class="glyph" title="">&#120143;</span> </td> <tr id="entity-Xscr"><td> <code title="">Xscr;</code> </td> <td> U+1D4B3 </td> <td> <span class="glyph" title="">&#119987;</span> </td> <tr id="entity-YAcy"><td> <code title="">YAcy;</code> </td> <td> U+0042F </td> <td> <span class="glyph" title="">&#1071;</span> </td> <tr id="entity-YIcy"><td> <code title="">YIcy;</code> </td> <td> U+00407 </td> <td> <span class="glyph" title="">&#1031;</span> </td> <tr id="entity-YUcy"><td> <code title="">YUcy;</code> </td> <td> U+0042E </td> <td> <span class="glyph" title="">&#1070;</span> </td> <tr id="entity-Yacute"><td> <code title="">Yacute;</code> </td> <td> U+000DD </td> <td> <span class="glyph" title="">&Yacute;</span> </td> <tr id="entity-Ycirc"><td> <code title="">Ycirc;</code> </td> <td> U+00176 </td> <td> <span class="glyph" title="">&#374;</span> </td> <tr id="entity-Ycy"><td> <code title="">Ycy;</code> </td> <td> U+0042B </td> <td> <span class="glyph" title="">&#1067;</span> </td> <tr id="entity-Yfr"><td> <code title="">Yfr;</code> </td> <td> U+1D51C </td> <td> <span class="glyph" title="">&#120092;</span> </td> <tr id="entity-Yopf"><td> <code title="">Yopf;</code> </td> <td> U+1D550 </td> <td> <span class="glyph" title="">&#120144;</span> </td> <tr id="entity-Yscr"><td> <code title="">Yscr;</code> </td> <td> U+1D4B4 </td> <td> <span class="glyph" title="">&#119988;</span> </td> <tr id="entity-Yuml"><td> <code title="">Yuml;</code> </td> <td> U+00178 </td> <td> <span class="glyph" title="">&Yuml;</span> </td> <tr id="entity-ZHcy"><td> <code title="">ZHcy;</code> </td> <td> U+00416 </td> <td> <span class="glyph" title="">&#1046;</span> </td> <tr id="entity-Zacute"><td> <code title="">Zacute;</code> </td> <td> U+00179 </td> <td> <span class="glyph" title="">&#377;</span> </td> <tr id="entity-Zcaron"><td> <code title="">Zcaron;</code> </td> <td> U+0017D </td> <td> <span class="glyph" title="">&#381;</span> </td> <tr id="entity-Zcy"><td> <code title="">Zcy;</code> </td> <td> U+00417 </td> <td> <span class="glyph" title="">&#1047;</span> </td> <tr id="entity-Zdot"><td> <code title="">Zdot;</code> </td> <td> U+0017B </td> <td> <span class="glyph" title="">&#379;</span> </td> <tr id="entity-ZeroWidthSpace"><td> <code title="">ZeroWidthSpace;</code> </td> <td> U+0200B </td> <td> <span class="glyph" title="">&#8203;</span> </td> <tr id="entity-Zeta"><td> <code title="">Zeta;</code> </td> <td> U+00396 </td> <td> <span class="glyph" title="">&Zeta;</span> </td> <tr id="entity-Zfr"><td> <code title="">Zfr;</code> </td> <td> U+02128 </td> <td> <span class="glyph" title="">&#8488;</span> </td> <tr id="entity-Zopf"><td> <code title="">Zopf;</code> </td> <td> U+02124 </td> <td> <span class="glyph" title="">&#8484;</span> </td> <tr id="entity-Zscr"><td> <code title="">Zscr;</code> </td> <td> U+1D4B5 </td> <td> <span class="glyph" title="">&#119989;</span> </td> <tr id="entity-aacute"><td> <code title="">aacute;</code> </td> <td> U+000E1 </td> <td> <span class="glyph" title="">&aacute;</span> </td> <tr id="entity-abreve"><td> <code title="">abreve;</code> </td> <td> U+00103 </td> <td> <span class="glyph" title="">&#259;</span> </td> <tr id="entity-ac"><td> <code title="">ac;</code> </td> <td> U+0223E </td> <td> <span class="glyph" title="">&#8766;</span> </td> <tr id="entity-acE"><td> <code title="">acE;</code> </td> <td> U+0223E U+00333 </td> <td> <span class="glyph compound" title="">&#8766;&#819;</span> </td> <tr id="entity-acd"><td> <code title="">acd;</code> </td> <td> U+0223F </td> <td> <span class="glyph" title="">&#8767;</span> </td> <tr id="entity-acirc"><td> <code title="">acirc;</code> </td> <td> U+000E2 </td> <td> <span class="glyph" title="">&acirc;</span> </td> <tr id="entity-acute"><td> <code title="">acute;</code> </td> <td> U+000B4 </td> <td> <span class="glyph" title="">&acute;</span> </td> <tr id="entity-acy"><td> <code title="">acy;</code> </td> <td> U+00430 </td> <td> <span class="glyph" title="">&#1072;</span> </td> <tr id="entity-aelig"><td> <code title="">aelig;</code> </td> <td> U+000E6 </td> <td> <span class="glyph" title="">&aelig;</span> </td> <tr id="entity-af"><td> <code title="">af;</code> </td> <td> U+02061 </td> <td> <span class="glyph" title="">&#8289;</span> </td> <tr id="entity-afr"><td> <code title="">afr;</code> </td> <td> U+1D51E </td> <td> <span class="glyph" title="">&#120094;</span> </td> <tr id="entity-agrave"><td> <code title="">agrave;</code> </td> <td> U+000E0 </td> <td> <span class="glyph" title="">&agrave;</span> </td> <tr id="entity-alefsym"><td> <code title="">alefsym;</code> </td> <td> U+02135 </td> <td> <span class="glyph" title="">&alefsym;</span> </td> <tr id="entity-aleph"><td> <code title="">aleph;</code> </td> <td> U+02135 </td> <td> <span class="glyph" title="">&alefsym;</span> </td> <tr id="entity-alpha"><td> <code title="">alpha;</code> </td> <td> U+003B1 </td> <td> <span class="glyph" title="">&alpha;</span> </td> <tr id="entity-amacr"><td> <code title="">amacr;</code> </td> <td> U+00101 </td> <td> <span class="glyph" title="">&#257;</span> </td> <tr id="entity-amalg"><td> <code title="">amalg;</code> </td> <td> U+02A3F </td> <td> <span class="glyph" title="">&#10815;</span> </td> <tr id="entity-amp"><td> <code title="">amp;</code> </td> <td> U+00026 </td> <td> <span class="glyph" title="">&amp;</span> </td> <tr id="entity-and"><td> <code title="">and;</code> </td> <td> U+02227 </td> <td> <span class="glyph" title="">&and;</span> </td> <tr id="entity-andand"><td> <code title="">andand;</code> </td> <td> U+02A55 </td> <td> <span class="glyph" title="">&#10837;</span> </td> <tr id="entity-andd"><td> <code title="">andd;</code> </td> <td> U+02A5C </td> <td> <span class="glyph" title="">&#10844;</span> </td> <tr id="entity-andslope"><td> <code title="">andslope;</code> </td> <td> U+02A58 </td> <td> <span class="glyph" title="">&#10840;</span> </td> <tr id="entity-andv"><td> <code title="">andv;</code> </td> <td> U+02A5A </td> <td> <span class="glyph" title="">&#10842;</span> </td> <tr id="entity-ang"><td> <code title="">ang;</code> </td> <td> U+02220 </td> <td> <span class="glyph" title="">&ang;</span> </td> <tr id="entity-ange"><td> <code title="">ange;</code> </td> <td> U+029A4 </td> <td> <span class="glyph" title="">&#10660;</span> </td> <tr id="entity-angle"><td> <code title="">angle;</code> </td> <td> U+02220 </td> <td> <span class="glyph" title="">&ang;</span> </td> <tr id="entity-angmsd"><td> <code title="">angmsd;</code> </td> <td> U+02221 </td> <td> <span class="glyph" title="">&#8737;</span> </td> <tr id="entity-angmsdaa"><td> <code title="">angmsdaa;</code> </td> <td> U+029A8 </td> <td> <span class="glyph" title="">&#10664;</span> </td> <tr id="entity-angmsdab"><td> <code title="">angmsdab;</code> </td> <td> U+029A9 </td> <td> <span class="glyph" title="">&#10665;</span> </td> <tr id="entity-angmsdac"><td> <code title="">angmsdac;</code> </td> <td> U+029AA </td> <td> <span class="glyph" title="">&#10666;</span> </td> <tr id="entity-angmsdad"><td> <code title="">angmsdad;</code> </td> <td> U+029AB </td> <td> <span class="glyph" title="">&#10667;</span> </td> <tr id="entity-angmsdae"><td> <code title="">angmsdae;</code> </td> <td> U+029AC </td> <td> <span class="glyph" title="">&#10668;</span> </td> <tr id="entity-angmsdaf"><td> <code title="">angmsdaf;</code> </td> <td> U+029AD </td> <td> <span class="glyph" title="">&#10669;</span> </td> <tr id="entity-angmsdag"><td> <code title="">angmsdag;</code> </td> <td> U+029AE </td> <td> <span class="glyph" title="">&#10670;</span> </td> <tr id="entity-angmsdah"><td> <code title="">angmsdah;</code> </td> <td> U+029AF </td> <td> <span class="glyph" title="">&#10671;</span> </td> <tr id="entity-angrt"><td> <code title="">angrt;</code> </td> <td> U+0221F </td> <td> <span class="glyph" title="">&#8735;</span> </td> <tr id="entity-angrtvb"><td> <code title="">angrtvb;</code> </td> <td> U+022BE </td> <td> <span class="glyph" title="">&#8894;</span> </td> <tr id="entity-angrtvbd"><td> <code title="">angrtvbd;</code> </td> <td> U+0299D </td> <td> <span class="glyph" title="">&#10653;</span> </td> <tr id="entity-angsph"><td> <code title="">angsph;</code> </td> <td> U+02222 </td> <td> <span class="glyph" title="">&#8738;</span> </td> <tr id="entity-angst"><td> <code title="">angst;</code> </td> <td> U+000C5 </td> <td> <span class="glyph" title="">&Aring;</span> </td> <tr id="entity-angzarr"><td> <code title="">angzarr;</code> </td> <td> U+0237C </td> <td> <span class="glyph" title="">&#9084;</span> </td> <tr id="entity-aogon"><td> <code title="">aogon;</code> </td> <td> U+00105 </td> <td> <span class="glyph" title="">&#261;</span> </td> <tr id="entity-aopf"><td> <code title="">aopf;</code> </td> <td> U+1D552 </td> <td> <span class="glyph" title="">&#120146;</span> </td> <tr id="entity-ap"><td> <code title="">ap;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-apE"><td> <code title="">apE;</code> </td> <td> U+02A70 </td> <td> <span class="glyph" title="">&#10864;</span> </td> <tr id="entity-apacir"><td> <code title="">apacir;</code> </td> <td> U+02A6F </td> <td> <span class="glyph" title="">&#10863;</span> </td> <tr id="entity-ape"><td> <code title="">ape;</code> </td> <td> U+0224A </td> <td> <span class="glyph" title="">&#8778;</span> </td> <tr id="entity-apid"><td> <code title="">apid;</code> </td> <td> U+0224B </td> <td> <span class="glyph" title="">&#8779;</span> </td> <tr id="entity-apos"><td> <code title="">apos;</code> </td> <td> U+00027 </td> <td> <span class="glyph" title="">'</span> </td> <tr id="entity-approx"><td> <code title="">approx;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-approxeq"><td> <code title="">approxeq;</code> </td> <td> U+0224A </td> <td> <span class="glyph" title="">&#8778;</span> </td> <tr id="entity-aring"><td> <code title="">aring;</code> </td> <td> U+000E5 </td> <td> <span class="glyph" title="">&aring;</span> </td> <tr id="entity-ascr"><td> <code title="">ascr;</code> </td> <td> U+1D4B6 </td> <td> <span class="glyph" title="">&#119990;</span> </td> <tr id="entity-ast"><td> <code title="">ast;</code> </td> <td> U+0002A </td> <td> <span class="glyph" title="">*</span> </td> <tr id="entity-asymp"><td> <code title="">asymp;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-asympeq"><td> <code title="">asympeq;</code> </td> <td> U+0224D </td> <td> <span class="glyph" title="">&#8781;</span> </td> <tr id="entity-atilde"><td> <code title="">atilde;</code> </td> <td> U+000E3 </td> <td> <span class="glyph" title="">&atilde;</span> </td> <tr id="entity-auml"><td> <code title="">auml;</code> </td> <td> U+000E4 </td> <td> <span class="glyph" title="">&auml;</span> </td> <tr id="entity-awconint"><td> <code title="">awconint;</code> </td> <td> U+02233 </td> <td> <span class="glyph" title="">&#8755;</span> </td> <tr id="entity-awint"><td> <code title="">awint;</code> </td> <td> U+02A11 </td> <td> <span class="glyph" title="">&#10769;</span> </td> <tr id="entity-bNot"><td> <code title="">bNot;</code> </td> <td> U+02AED </td> <td> <span class="glyph" title="">&#10989;</span> </td> <tr id="entity-backcong"><td> <code title="">backcong;</code> </td> <td> U+0224C </td> <td> <span class="glyph" title="">&#8780;</span> </td> <tr id="entity-backepsilon"><td> <code title="">backepsilon;</code> </td> <td> U+003F6 </td> <td> <span class="glyph" title="">&#1014;</span> </td> <tr id="entity-backprime"><td> <code title="">backprime;</code> </td> <td> U+02035 </td> <td> <span class="glyph" title="">&#8245;</span> </td> <tr id="entity-backsim"><td> <code title="">backsim;</code> </td> <td> U+0223D </td> <td> <span class="glyph" title="">&#8765;</span> </td> <tr id="entity-backsimeq"><td> <code title="">backsimeq;</code> </td> <td> U+022CD </td> <td> <span class="glyph" title="">&#8909;</span> </td> <tr id="entity-barvee"><td> <code title="">barvee;</code> </td> <td> U+022BD </td> <td> <span class="glyph" title="">&#8893;</span> </td> <tr id="entity-barwed"><td> <code title="">barwed;</code> </td> <td> U+02305 </td> <td> <span class="glyph" title="">&#8965;</span> </td> <tr id="entity-barwedge"><td> <code title="">barwedge;</code> </td> <td> U+02305 </td> <td> <span class="glyph" title="">&#8965;</span> </td> <tr id="entity-bbrk"><td> <code title="">bbrk;</code> </td> <td> U+023B5 </td> <td> <span class="glyph" title="">&#9141;</span> </td> <tr id="entity-bbrktbrk"><td> <code title="">bbrktbrk;</code> </td> <td> U+023B6 </td> <td> <span class="glyph" title="">&#9142;</span> </td> <tr id="entity-bcong"><td> <code title="">bcong;</code> </td> <td> U+0224C </td> <td> <span class="glyph" title="">&#8780;</span> </td> <tr id="entity-bcy"><td> <code title="">bcy;</code> </td> <td> U+00431 </td> <td> <span class="glyph" title="">&#1073;</span> </td> <tr id="entity-bdquo"><td> <code title="">bdquo;</code> </td> <td> U+0201E </td> <td> <span class="glyph" title="">&bdquo;</span> </td> <tr id="entity-becaus"><td> <code title="">becaus;</code> </td> <td> U+02235 </td> <td> <span class="glyph" title="">&#8757;</span> </td> <tr id="entity-because"><td> <code title="">because;</code> </td> <td> U+02235 </td> <td> <span class="glyph" title="">&#8757;</span> </td> <tr id="entity-bemptyv"><td> <code title="">bemptyv;</code> </td> <td> U+029B0 </td> <td> <span class="glyph" title="">&#10672;</span> </td> <tr id="entity-bepsi"><td> <code title="">bepsi;</code> </td> <td> U+003F6 </td> <td> <span class="glyph" title="">&#1014;</span> </td> <tr id="entity-bernou"><td> <code title="">bernou;</code> </td> <td> U+0212C </td> <td> <span class="glyph" title="">&#8492;</span> </td> <tr id="entity-beta"><td> <code title="">beta;</code> </td> <td> U+003B2 </td> <td> <span class="glyph" title="">&beta;</span> </td> <tr id="entity-beth"><td> <code title="">beth;</code> </td> <td> U+02136 </td> <td> <span class="glyph" title="">&#8502;</span> </td> <tr id="entity-between"><td> <code title="">between;</code> </td> <td> U+0226C </td> <td> <span class="glyph" title="">&#8812;</span> </td> <tr id="entity-bfr"><td> <code title="">bfr;</code> </td> <td> U+1D51F </td> <td> <span class="glyph" title="">&#120095;</span> </td> <tr id="entity-bigcap"><td> <code title="">bigcap;</code> </td> <td> U+022C2 </td> <td> <span class="glyph" title="">&#8898;</span> </td> <tr id="entity-bigcirc"><td> <code title="">bigcirc;</code> </td> <td> U+025EF </td> <td> <span class="glyph" title="">&#9711;</span> </td> <tr id="entity-bigcup"><td> <code title="">bigcup;</code> </td> <td> U+022C3 </td> <td> <span class="glyph" title="">&#8899;</span> </td> <tr id="entity-bigodot"><td> <code title="">bigodot;</code> </td> <td> U+02A00 </td> <td> <span class="glyph" title="">&#10752;</span> </td> <tr id="entity-bigoplus"><td> <code title="">bigoplus;</code> </td> <td> U+02A01 </td> <td> <span class="glyph" title="">&#10753;</span> </td> <tr id="entity-bigotimes"><td> <code title="">bigotimes;</code> </td> <td> U+02A02 </td> <td> <span class="glyph" title="">&#10754;</span> </td> <tr id="entity-bigsqcup"><td> <code title="">bigsqcup;</code> </td> <td> U+02A06 </td> <td> <span class="glyph" title="">&#10758;</span> </td> <tr id="entity-bigstar"><td> <code title="">bigstar;</code> </td> <td> U+02605 </td> <td> <span class="glyph" title="">&#9733;</span> </td> <tr id="entity-bigtriangledown"><td> <code title="">bigtriangledown;</code> </td> <td> U+025BD </td> <td> <span class="glyph" title="">&#9661;</span> </td> <tr id="entity-bigtriangleup"><td> <code title="">bigtriangleup;</code> </td> <td> U+025B3 </td> <td> <span class="glyph" title="">&#9651;</span> </td> <tr id="entity-biguplus"><td> <code title="">biguplus;</code> </td> <td> U+02A04 </td> <td> <span class="glyph" title="">&#10756;</span> </td> <tr id="entity-bigvee"><td> <code title="">bigvee;</code> </td> <td> U+022C1 </td> <td> <span class="glyph" title="">&#8897;</span> </td> <tr id="entity-bigwedge"><td> <code title="">bigwedge;</code> </td> <td> U+022C0 </td> <td> <span class="glyph" title="">&#8896;</span> </td> <tr id="entity-bkarow"><td> <code title="">bkarow;</code> </td> <td> U+0290D </td> <td> <span class="glyph" title="">&#10509;</span> </td> <tr id="entity-blacklozenge"><td> <code title="">blacklozenge;</code> </td> <td> U+029EB </td> <td> <span class="glyph" title="">&#10731;</span> </td> <tr id="entity-blacksquare"><td> <code title="">blacksquare;</code> </td> <td> U+025AA </td> <td> <span class="glyph" title="">&#9642;</span> </td> <tr id="entity-blacktriangle"><td> <code title="">blacktriangle;</code> </td> <td> U+025B4 </td> <td> <span class="glyph" title="">&#9652;</span> </td> <tr id="entity-blacktriangledown"><td> <code title="">blacktriangledown;</code> </td> <td> U+025BE </td> <td> <span class="glyph" title="">&#9662;</span> </td> <tr id="entity-blacktriangleleft"><td> <code title="">blacktriangleleft;</code> </td> <td> U+025C2 </td> <td> <span class="glyph" title="">&#9666;</span> </td> <tr id="entity-blacktriangleright"><td> <code title="">blacktriangleright;</code> </td> <td> U+025B8 </td> <td> <span class="glyph" title="">&#9656;</span> </td> <tr id="entity-blank"><td> <code title="">blank;</code> </td> <td> U+02423 </td> <td> <span class="glyph" title="">&#9251;</span> </td> <tr id="entity-blk12"><td> <code title="">blk12;</code> </td> <td> U+02592 </td> <td> <span class="glyph" title="">&#9618;</span> </td> <tr id="entity-blk14"><td> <code title="">blk14;</code> </td> <td> U+02591 </td> <td> <span class="glyph" title="">&#9617;</span> </td> <tr id="entity-blk34"><td> <code title="">blk34;</code> </td> <td> U+02593 </td> <td> <span class="glyph" title="">&#9619;</span> </td> <tr id="entity-block"><td> <code title="">block;</code> </td> <td> U+02588 </td> <td> <span class="glyph" title="">&#9608;</span> </td> <tr id="entity-bne"><td> <code title="">bne;</code> </td> <td> U+0003D U+020E5 </td> <td> <span class="glyph compound" title="">=&#8421;</span> </td> <tr id="entity-bnequiv"><td> <code title="">bnequiv;</code> </td> <td> U+02261 U+020E5 </td> <td> <span class="glyph compound" title="">&equiv;&#8421;</span> </td> <tr id="entity-bnot"><td> <code title="">bnot;</code> </td> <td> U+02310 </td> <td> <span class="glyph" title="">&#8976;</span> </td> <tr id="entity-bopf"><td> <code title="">bopf;</code> </td> <td> U+1D553 </td> <td> <span class="glyph" title="">&#120147;</span> </td> <tr id="entity-bot"><td> <code title="">bot;</code> </td> <td> U+022A5 </td> <td> <span class="glyph" title="">&perp;</span> </td> <tr id="entity-bottom"><td> <code title="">bottom;</code> </td> <td> U+022A5 </td> <td> <span class="glyph" title="">&perp;</span> </td> <tr id="entity-bowtie"><td> <code title="">bowtie;</code> </td> <td> U+022C8 </td> <td> <span class="glyph" title="">&#8904;</span> </td> <tr id="entity-boxDL"><td> <code title="">boxDL;</code> </td> <td> U+02557 </td> <td> <span class="glyph" title="">&#9559;</span> </td> <tr id="entity-boxDR"><td> <code title="">boxDR;</code> </td> <td> U+02554 </td> <td> <span class="glyph" title="">&#9556;</span> </td> <tr id="entity-boxDl"><td> <code title="">boxDl;</code> </td> <td> U+02556 </td> <td> <span class="glyph" title="">&#9558;</span> </td> <tr id="entity-boxDr"><td> <code title="">boxDr;</code> </td> <td> U+02553 </td> <td> <span class="glyph" title="">&#9555;</span> </td> <tr id="entity-boxH"><td> <code title="">boxH;</code> </td> <td> U+02550 </td> <td> <span class="glyph" title="">&#9552;</span> </td> <tr id="entity-boxHD"><td> <code title="">boxHD;</code> </td> <td> U+02566 </td> <td> <span class="glyph" title="">&#9574;</span> </td> <tr id="entity-boxHU"><td> <code title="">boxHU;</code> </td> <td> U+02569 </td> <td> <span class="glyph" title="">&#9577;</span> </td> <tr id="entity-boxHd"><td> <code title="">boxHd;</code> </td> <td> U+02564 </td> <td> <span class="glyph" title="">&#9572;</span> </td> <tr id="entity-boxHu"><td> <code title="">boxHu;</code> </td> <td> U+02567 </td> <td> <span class="glyph" title="">&#9575;</span> </td> <tr id="entity-boxUL"><td> <code title="">boxUL;</code> </td> <td> U+0255D </td> <td> <span class="glyph" title="">&#9565;</span> </td> <tr id="entity-boxUR"><td> <code title="">boxUR;</code> </td> <td> U+0255A </td> <td> <span class="glyph" title="">&#9562;</span> </td> <tr id="entity-boxUl"><td> <code title="">boxUl;</code> </td> <td> U+0255C </td> <td> <span class="glyph" title="">&#9564;</span> </td> <tr id="entity-boxUr"><td> <code title="">boxUr;</code> </td> <td> U+02559 </td> <td> <span class="glyph" title="">&#9561;</span> </td> <tr id="entity-boxV"><td> <code title="">boxV;</code> </td> <td> U+02551 </td> <td> <span class="glyph" title="">&#9553;</span> </td> <tr id="entity-boxVH"><td> <code title="">boxVH;</code> </td> <td> U+0256C </td> <td> <span class="glyph" title="">&#9580;</span> </td> <tr id="entity-boxVL"><td> <code title="">boxVL;</code> </td> <td> U+02563 </td> <td> <span class="glyph" title="">&#9571;</span> </td> <tr id="entity-boxVR"><td> <code title="">boxVR;</code> </td> <td> U+02560 </td> <td> <span class="glyph" title="">&#9568;</span> </td> <tr id="entity-boxVh"><td> <code title="">boxVh;</code> </td> <td> U+0256B </td> <td> <span class="glyph" title="">&#9579;</span> </td> <tr id="entity-boxVl"><td> <code title="">boxVl;</code> </td> <td> U+02562 </td> <td> <span class="glyph" title="">&#9570;</span> </td> <tr id="entity-boxVr"><td> <code title="">boxVr;</code> </td> <td> U+0255F </td> <td> <span class="glyph" title="">&#9567;</span> </td> <tr id="entity-boxbox"><td> <code title="">boxbox;</code> </td> <td> U+029C9 </td> <td> <span class="glyph" title="">&#10697;</span> </td> <tr id="entity-boxdL"><td> <code title="">boxdL;</code> </td> <td> U+02555 </td> <td> <span class="glyph" title="">&#9557;</span> </td> <tr id="entity-boxdR"><td> <code title="">boxdR;</code> </td> <td> U+02552 </td> <td> <span class="glyph" title="">&#9554;</span> </td> <tr id="entity-boxdl"><td> <code title="">boxdl;</code> </td> <td> U+02510 </td> <td> <span class="glyph" title="">&#9488;</span> </td> <tr id="entity-boxdr"><td> <code title="">boxdr;</code> </td> <td> U+0250C </td> <td> <span class="glyph" title="">&#9484;</span> </td> <tr id="entity-boxh"><td> <code title="">boxh;</code> </td> <td> U+02500 </td> <td> <span class="glyph" title="">&#9472;</span> </td> <tr id="entity-boxhD"><td> <code title="">boxhD;</code> </td> <td> U+02565 </td> <td> <span class="glyph" title="">&#9573;</span> </td> <tr id="entity-boxhU"><td> <code title="">boxhU;</code> </td> <td> U+02568 </td> <td> <span class="glyph" title="">&#9576;</span> </td> <tr id="entity-boxhd"><td> <code title="">boxhd;</code> </td> <td> U+0252C </td> <td> <span class="glyph" title="">&#9516;</span> </td> <tr id="entity-boxhu"><td> <code title="">boxhu;</code> </td> <td> U+02534 </td> <td> <span class="glyph" title="">&#9524;</span> </td> <tr id="entity-boxminus"><td> <code title="">boxminus;</code> </td> <td> U+0229F </td> <td> <span class="glyph" title="">&#8863;</span> </td> <tr id="entity-boxplus"><td> <code title="">boxplus;</code> </td> <td> U+0229E </td> <td> <span class="glyph" title="">&#8862;</span> </td> <tr id="entity-boxtimes"><td> <code title="">boxtimes;</code> </td> <td> U+022A0 </td> <td> <span class="glyph" title="">&#8864;</span> </td> <tr id="entity-boxuL"><td> <code title="">boxuL;</code> </td> <td> U+0255B </td> <td> <span class="glyph" title="">&#9563;</span> </td> <tr id="entity-boxuR"><td> <code title="">boxuR;</code> </td> <td> U+02558 </td> <td> <span class="glyph" title="">&#9560;</span> </td> <tr id="entity-boxul"><td> <code title="">boxul;</code> </td> <td> U+02518 </td> <td> <span class="glyph" title="">&#9496;</span> </td> <tr id="entity-boxur"><td> <code title="">boxur;</code> </td> <td> U+02514 </td> <td> <span class="glyph" title="">&#9492;</span> </td> <tr id="entity-boxv"><td> <code title="">boxv;</code> </td> <td> U+02502 </td> <td> <span class="glyph" title="">&#9474;</span> </td> <tr id="entity-boxvH"><td> <code title="">boxvH;</code> </td> <td> U+0256A </td> <td> <span class="glyph" title="">&#9578;</span> </td> <tr id="entity-boxvL"><td> <code title="">boxvL;</code> </td> <td> U+02561 </td> <td> <span class="glyph" title="">&#9569;</span> </td> <tr id="entity-boxvR"><td> <code title="">boxvR;</code> </td> <td> U+0255E </td> <td> <span class="glyph" title="">&#9566;</span> </td> <tr id="entity-boxvh"><td> <code title="">boxvh;</code> </td> <td> U+0253C </td> <td> <span class="glyph" title="">&#9532;</span> </td> <tr id="entity-boxvl"><td> <code title="">boxvl;</code> </td> <td> U+02524 </td> <td> <span class="glyph" title="">&#9508;</span> </td> <tr id="entity-boxvr"><td> <code title="">boxvr;</code> </td> <td> U+0251C </td> <td> <span class="glyph" title="">&#9500;</span> </td> <tr id="entity-bprime"><td> <code title="">bprime;</code> </td> <td> U+02035 </td> <td> <span class="glyph" title="">&#8245;</span> </td> <tr id="entity-breve"><td> <code title="">breve;</code> </td> <td> U+002D8 </td> <td> <span class="glyph" title="">&#728;</span> </td> <tr id="entity-brvbar"><td> <code title="">brvbar;</code> </td> <td> U+000A6 </td> <td> <span class="glyph" title="">&brvbar;</span> </td> <tr id="entity-bscr"><td> <code title="">bscr;</code> </td> <td> U+1D4B7 </td> <td> <span class="glyph" title="">&#119991;</span> </td> <tr id="entity-bsemi"><td> <code title="">bsemi;</code> </td> <td> U+0204F </td> <td> <span class="glyph" title="">&#8271;</span> </td> <tr id="entity-bsim"><td> <code title="">bsim;</code> </td> <td> U+0223D </td> <td> <span class="glyph" title="">&#8765;</span> </td> <tr id="entity-bsime"><td> <code title="">bsime;</code> </td> <td> U+022CD </td> <td> <span class="glyph" title="">&#8909;</span> </td> <tr id="entity-bsol"><td> <code title="">bsol;</code> </td> <td> U+0005C </td> <td> <span class="glyph" title="">\</span> </td> <tr id="entity-bsolb"><td> <code title="">bsolb;</code> </td> <td> U+029C5 </td> <td> <span class="glyph" title="">&#10693;</span> </td> <tr id="entity-bsolhsub"><td> <code title="">bsolhsub;</code> </td> <td> U+027C8 </td> <td> <span class="glyph" title="">&#10184;</span> </td> <tr id="entity-bull"><td> <code title="">bull;</code> </td> <td> U+02022 </td> <td> <span class="glyph" title="">&bull;</span> </td> <tr id="entity-bullet"><td> <code title="">bullet;</code> </td> <td> U+02022 </td> <td> <span class="glyph" title="">&bull;</span> </td> <tr id="entity-bump"><td> <code title="">bump;</code> </td> <td> U+0224E </td> <td> <span class="glyph" title="">&#8782;</span> </td> <tr id="entity-bumpE"><td> <code title="">bumpE;</code> </td> <td> U+02AAE </td> <td> <span class="glyph" title="">&#10926;</span> </td> <tr id="entity-bumpe"><td> <code title="">bumpe;</code> </td> <td> U+0224F </td> <td> <span class="glyph" title="">&#8783;</span> </td> <tr id="entity-bumpeq"><td> <code title="">bumpeq;</code> </td> <td> U+0224F </td> <td> <span class="glyph" title="">&#8783;</span> </td> <tr id="entity-cacute"><td> <code title="">cacute;</code> </td> <td> U+00107 </td> <td> <span class="glyph" title="">&#263;</span> </td> <tr id="entity-cap"><td> <code title="">cap;</code> </td> <td> U+02229 </td> <td> <span class="glyph" title="">&cap;</span> </td> <tr id="entity-capand"><td> <code title="">capand;</code> </td> <td> U+02A44 </td> <td> <span class="glyph" title="">&#10820;</span> </td> <tr id="entity-capbrcup"><td> <code title="">capbrcup;</code> </td> <td> U+02A49 </td> <td> <span class="glyph" title="">&#10825;</span> </td> <tr id="entity-capcap"><td> <code title="">capcap;</code> </td> <td> U+02A4B </td> <td> <span class="glyph" title="">&#10827;</span> </td> <tr id="entity-capcup"><td> <code title="">capcup;</code> </td> <td> U+02A47 </td> <td> <span class="glyph" title="">&#10823;</span> </td> <tr id="entity-capdot"><td> <code title="">capdot;</code> </td> <td> U+02A40 </td> <td> <span class="glyph" title="">&#10816;</span> </td> <tr id="entity-caps"><td> <code title="">caps;</code> </td> <td> U+02229 U+0FE00 </td> <td> <span class="glyph compound" title="">&cap;&#65024;</span> </td> <tr id="entity-caret"><td> <code title="">caret;</code> </td> <td> U+02041 </td> <td> <span class="glyph" title="">&#8257;</span> </td> <tr id="entity-caron"><td> <code title="">caron;</code> </td> <td> U+002C7 </td> <td> <span class="glyph" title="">&#711;</span> </td> <tr id="entity-ccaps"><td> <code title="">ccaps;</code> </td> <td> U+02A4D </td> <td> <span class="glyph" title="">&#10829;</span> </td> <tr id="entity-ccaron"><td> <code title="">ccaron;</code> </td> <td> U+0010D </td> <td> <span class="glyph" title="">&#269;</span> </td> <tr id="entity-ccedil"><td> <code title="">ccedil;</code> </td> <td> U+000E7 </td> <td> <span class="glyph" title="">&ccedil;</span> </td> <tr id="entity-ccirc"><td> <code title="">ccirc;</code> </td> <td> U+00109 </td> <td> <span class="glyph" title="">&#265;</span> </td> <tr id="entity-ccups"><td> <code title="">ccups;</code> </td> <td> U+02A4C </td> <td> <span class="glyph" title="">&#10828;</span> </td> <tr id="entity-ccupssm"><td> <code title="">ccupssm;</code> </td> <td> U+02A50 </td> <td> <span class="glyph" title="">&#10832;</span> </td> <tr id="entity-cdot"><td> <code title="">cdot;</code> </td> <td> U+0010B </td> <td> <span class="glyph" title="">&#267;</span> </td> <tr id="entity-cedil"><td> <code title="">cedil;</code> </td> <td> U+000B8 </td> <td> <span class="glyph" title="">&cedil;</span> </td> <tr id="entity-cemptyv"><td> <code title="">cemptyv;</code> </td> <td> U+029B2 </td> <td> <span class="glyph" title="">&#10674;</span> </td> <tr id="entity-cent"><td> <code title="">cent;</code> </td> <td> U+000A2 </td> <td> <span class="glyph" title="">&cent;</span> </td> <tr id="entity-centerdot"><td> <code title="">centerdot;</code> </td> <td> U+000B7 </td> <td> <span class="glyph" title="">&middot;</span> </td> <tr id="entity-cfr"><td> <code title="">cfr;</code> </td> <td> U+1D520 </td> <td> <span class="glyph" title="">&#120096;</span> </td> <tr id="entity-chcy"><td> <code title="">chcy;</code> </td> <td> U+00447 </td> <td> <span class="glyph" title="">&#1095;</span> </td> <tr id="entity-check"><td> <code title="">check;</code> </td> <td> U+02713 </td> <td> <span class="glyph" title="">&#10003;</span> </td> <tr id="entity-checkmark"><td> <code title="">checkmark;</code> </td> <td> U+02713 </td> <td> <span class="glyph" title="">&#10003;</span> </td> <tr id="entity-chi"><td> <code title="">chi;</code> </td> <td> U+003C7 </td> <td> <span class="glyph" title="">&chi;</span> </td> <tr id="entity-cir"><td> <code title="">cir;</code> </td> <td> U+025CB </td> <td> <span class="glyph" title="">&#9675;</span> </td> <tr id="entity-cirE"><td> <code title="">cirE;</code> </td> <td> U+029C3 </td> <td> <span class="glyph" title="">&#10691;</span> </td> <tr id="entity-circ"><td> <code title="">circ;</code> </td> <td> U+002C6 </td> <td> <span class="glyph" title="">&circ;</span> </td> <tr id="entity-circeq"><td> <code title="">circeq;</code> </td> <td> U+02257 </td> <td> <span class="glyph" title="">&#8791;</span> </td> <tr id="entity-circlearrowleft"><td> <code title="">circlearrowleft;</code> </td> <td> U+021BA </td> <td> <span class="glyph" title="">&#8634;</span> </td> <tr id="entity-circlearrowright"><td> <code title="">circlearrowright;</code> </td> <td> U+021BB </td> <td> <span class="glyph" title="">&#8635;</span> </td> <tr id="entity-circledR"><td> <code title="">circledR;</code> </td> <td> U+000AE </td> <td> <span class="glyph" title="">&reg;</span> </td> <tr id="entity-circledS"><td> <code title="">circledS;</code> </td> <td> U+024C8 </td> <td> <span class="glyph" title="">&#9416;</span> </td> <tr id="entity-circledast"><td> <code title="">circledast;</code> </td> <td> U+0229B </td> <td> <span class="glyph" title="">&#8859;</span> </td> <tr id="entity-circledcirc"><td> <code title="">circledcirc;</code> </td> <td> U+0229A </td> <td> <span class="glyph" title="">&#8858;</span> </td> <tr id="entity-circleddash"><td> <code title="">circleddash;</code> </td> <td> U+0229D </td> <td> <span class="glyph" title="">&#8861;</span> </td> <tr id="entity-cire"><td> <code title="">cire;</code> </td> <td> U+02257 </td> <td> <span class="glyph" title="">&#8791;</span> </td> <tr id="entity-cirfnint"><td> <code title="">cirfnint;</code> </td> <td> U+02A10 </td> <td> <span class="glyph" title="">&#10768;</span> </td> <tr id="entity-cirmid"><td> <code title="">cirmid;</code> </td> <td> U+02AEF </td> <td> <span class="glyph" title="">&#10991;</span> </td> <tr id="entity-cirscir"><td> <code title="">cirscir;</code> </td> <td> U+029C2 </td> <td> <span class="glyph" title="">&#10690;</span> </td> <tr id="entity-clubs"><td> <code title="">clubs;</code> </td> <td> U+02663 </td> <td> <span class="glyph" title="">&clubs;</span> </td> <tr id="entity-clubsuit"><td> <code title="">clubsuit;</code> </td> <td> U+02663 </td> <td> <span class="glyph" title="">&clubs;</span> </td> <tr id="entity-colon"><td> <code title="">colon;</code> </td> <td> U+0003A </td> <td> <span class="glyph" title="">:</span> </td> <tr id="entity-colone"><td> <code title="">colone;</code> </td> <td> U+02254 </td> <td> <span class="glyph" title="">&#8788;</span> </td> <tr id="entity-coloneq"><td> <code title="">coloneq;</code> </td> <td> U+02254 </td> <td> <span class="glyph" title="">&#8788;</span> </td> <tr id="entity-comma"><td> <code title="">comma;</code> </td> <td> U+0002C </td> <td> <span class="glyph" title="">,</span> </td> <tr id="entity-commat"><td> <code title="">commat;</code> </td> <td> U+00040 </td> <td> <span class="glyph" title="">@</span> </td> <tr id="entity-comp"><td> <code title="">comp;</code> </td> <td> U+02201 </td> <td> <span class="glyph" title="">&#8705;</span> </td> <tr id="entity-compfn"><td> <code title="">compfn;</code> </td> <td> U+02218 </td> <td> <span class="glyph" title="">&#8728;</span> </td> <tr id="entity-complement"><td> <code title="">complement;</code> </td> <td> U+02201 </td> <td> <span class="glyph" title="">&#8705;</span> </td> <tr id="entity-complexes"><td> <code title="">complexes;</code> </td> <td> U+02102 </td> <td> <span class="glyph" title="">&#8450;</span> </td> <tr id="entity-cong"><td> <code title="">cong;</code> </td> <td> U+02245 </td> <td> <span class="glyph" title="">&cong;</span> </td> <tr id="entity-congdot"><td> <code title="">congdot;</code> </td> <td> U+02A6D </td> <td> <span class="glyph" title="">&#10861;</span> </td> <tr id="entity-conint"><td> <code title="">conint;</code> </td> <td> U+0222E </td> <td> <span class="glyph" title="">&#8750;</span> </td> <tr id="entity-copf"><td> <code title="">copf;</code> </td> <td> U+1D554 </td> <td> <span class="glyph" title="">&#120148;</span> </td> <tr id="entity-coprod"><td> <code title="">coprod;</code> </td> <td> U+02210 </td> <td> <span class="glyph" title="">&#8720;</span> </td> <tr id="entity-copy"><td> <code title="">copy;</code> </td> <td> U+000A9 </td> <td> <span class="glyph" title="">&copy;</span> </td> <tr id="entity-copysr"><td> <code title="">copysr;</code> </td> <td> U+02117 </td> <td> <span class="glyph" title="">&#8471;</span> </td> <tr id="entity-crarr"><td> <code title="">crarr;</code> </td> <td> U+021B5 </td> <td> <span class="glyph" title="">&crarr;</span> </td> <tr id="entity-cross"><td> <code title="">cross;</code> </td> <td> U+02717 </td> <td> <span class="glyph" title="">&#10007;</span> </td> <tr id="entity-cscr"><td> <code title="">cscr;</code> </td> <td> U+1D4B8 </td> <td> <span class="glyph" title="">&#119992;</span> </td> <tr id="entity-csub"><td> <code title="">csub;</code> </td> <td> U+02ACF </td> <td> <span class="glyph" title="">&#10959;</span> </td> <tr id="entity-csube"><td> <code title="">csube;</code> </td> <td> U+02AD1 </td> <td> <span class="glyph" title="">&#10961;</span> </td> <tr id="entity-csup"><td> <code title="">csup;</code> </td> <td> U+02AD0 </td> <td> <span class="glyph" title="">&#10960;</span> </td> <tr id="entity-csupe"><td> <code title="">csupe;</code> </td> <td> U+02AD2 </td> <td> <span class="glyph" title="">&#10962;</span> </td> <tr id="entity-ctdot"><td> <code title="">ctdot;</code> </td> <td> U+022EF </td> <td> <span class="glyph" title="">&#8943;</span> </td> <tr id="entity-cudarrl"><td> <code title="">cudarrl;</code> </td> <td> U+02938 </td> <td> <span class="glyph" title="">&#10552;</span> </td> <tr id="entity-cudarrr"><td> <code title="">cudarrr;</code> </td> <td> U+02935 </td> <td> <span class="glyph" title="">&#10549;</span> </td> <tr id="entity-cuepr"><td> <code title="">cuepr;</code> </td> <td> U+022DE </td> <td> <span class="glyph" title="">&#8926;</span> </td> <tr id="entity-cuesc"><td> <code title="">cuesc;</code> </td> <td> U+022DF </td> <td> <span class="glyph" title="">&#8927;</span> </td> <tr id="entity-cularr"><td> <code title="">cularr;</code> </td> <td> U+021B6 </td> <td> <span class="glyph" title="">&#8630;</span> </td> <tr id="entity-cularrp"><td> <code title="">cularrp;</code> </td> <td> U+0293D </td> <td> <span class="glyph" title="">&#10557;</span> </td> <tr id="entity-cup"><td> <code title="">cup;</code> </td> <td> U+0222A </td> <td> <span class="glyph" title="">&cup;</span> </td> <tr id="entity-cupbrcap"><td> <code title="">cupbrcap;</code> </td> <td> U+02A48 </td> <td> <span class="glyph" title="">&#10824;</span> </td> <tr id="entity-cupcap"><td> <code title="">cupcap;</code> </td> <td> U+02A46 </td> <td> <span class="glyph" title="">&#10822;</span> </td> <tr id="entity-cupcup"><td> <code title="">cupcup;</code> </td> <td> U+02A4A </td> <td> <span class="glyph" title="">&#10826;</span> </td> <tr id="entity-cupdot"><td> <code title="">cupdot;</code> </td> <td> U+0228D </td> <td> <span class="glyph" title="">&#8845;</span> </td> <tr id="entity-cupor"><td> <code title="">cupor;</code> </td> <td> U+02A45 </td> <td> <span class="glyph" title="">&#10821;</span> </td> <tr id="entity-cups"><td> <code title="">cups;</code> </td> <td> U+0222A U+0FE00 </td> <td> <span class="glyph compound" title="">&cup;&#65024;</span> </td> <tr id="entity-curarr"><td> <code title="">curarr;</code> </td> <td> U+021B7 </td> <td> <span class="glyph" title="">&#8631;</span> </td> <tr id="entity-curarrm"><td> <code title="">curarrm;</code> </td> <td> U+0293C </td> <td> <span class="glyph" title="">&#10556;</span> </td> <tr id="entity-curlyeqprec"><td> <code title="">curlyeqprec;</code> </td> <td> U+022DE </td> <td> <span class="glyph" title="">&#8926;</span> </td> <tr id="entity-curlyeqsucc"><td> <code title="">curlyeqsucc;</code> </td> <td> U+022DF </td> <td> <span class="glyph" title="">&#8927;</span> </td> <tr id="entity-curlyvee"><td> <code title="">curlyvee;</code> </td> <td> U+022CE </td> <td> <span class="glyph" title="">&#8910;</span> </td> <tr id="entity-curlywedge"><td> <code title="">curlywedge;</code> </td> <td> U+022CF </td> <td> <span class="glyph" title="">&#8911;</span> </td> <tr id="entity-curren"><td> <code title="">curren;</code> </td> <td> U+000A4 </td> <td> <span class="glyph" title="">&curren;</span> </td> <tr id="entity-curvearrowleft"><td> <code title="">curvearrowleft;</code> </td> <td> U+021B6 </td> <td> <span class="glyph" title="">&#8630;</span> </td> <tr id="entity-curvearrowright"><td> <code title="">curvearrowright;</code> </td> <td> U+021B7 </td> <td> <span class="glyph" title="">&#8631;</span> </td> <tr id="entity-cuvee"><td> <code title="">cuvee;</code> </td> <td> U+022CE </td> <td> <span class="glyph" title="">&#8910;</span> </td> <tr id="entity-cuwed"><td> <code title="">cuwed;</code> </td> <td> U+022CF </td> <td> <span class="glyph" title="">&#8911;</span> </td> <tr id="entity-cwconint"><td> <code title="">cwconint;</code> </td> <td> U+02232 </td> <td> <span class="glyph" title="">&#8754;</span> </td> <tr id="entity-cwint"><td> <code title="">cwint;</code> </td> <td> U+02231 </td> <td> <span class="glyph" title="">&#8753;</span> </td> <tr id="entity-cylcty"><td> <code title="">cylcty;</code> </td> <td> U+0232D </td> <td> <span class="glyph" title="">&#9005;</span> </td> <tr id="entity-dArr"><td> <code title="">dArr;</code> </td> <td> U+021D3 </td> <td> <span class="glyph" title="">&dArr;</span> </td> <tr id="entity-dHar"><td> <code title="">dHar;</code> </td> <td> U+02965 </td> <td> <span class="glyph" title="">&#10597;</span> </td> <tr id="entity-dagger"><td> <code title="">dagger;</code> </td> <td> U+02020 </td> <td> <span class="glyph" title="">&dagger;</span> </td> <tr id="entity-daleth"><td> <code title="">daleth;</code> </td> <td> U+02138 </td> <td> <span class="glyph" title="">&#8504;</span> </td> <tr id="entity-darr"><td> <code title="">darr;</code> </td> <td> U+02193 </td> <td> <span class="glyph" title="">&darr;</span> </td> <tr id="entity-dash"><td> <code title="">dash;</code> </td> <td> U+02010 </td> <td> <span class="glyph" title="">&#8208;</span> </td> <tr id="entity-dashv"><td> <code title="">dashv;</code> </td> <td> U+022A3 </td> <td> <span class="glyph" title="">&#8867;</span> </td> <tr id="entity-dbkarow"><td> <code title="">dbkarow;</code> </td> <td> U+0290F </td> <td> <span class="glyph" title="">&#10511;</span> </td> <tr id="entity-dblac"><td> <code title="">dblac;</code> </td> <td> U+002DD </td> <td> <span class="glyph" title="">&#733;</span> </td> <tr id="entity-dcaron"><td> <code title="">dcaron;</code> </td> <td> U+0010F </td> <td> <span class="glyph" title="">&#271;</span> </td> <tr id="entity-dcy"><td> <code title="">dcy;</code> </td> <td> U+00434 </td> <td> <span class="glyph" title="">&#1076;</span> </td> <tr id="entity-dd"><td> <code title="">dd;</code> </td> <td> U+02146 </td> <td> <span class="glyph" title="">&#8518;</span> </td> <tr id="entity-ddagger"><td> <code title="">ddagger;</code> </td> <td> U+02021 </td> <td> <span class="glyph" title="">&Dagger;</span> </td> <tr id="entity-ddarr"><td> <code title="">ddarr;</code> </td> <td> U+021CA </td> <td> <span class="glyph" title="">&#8650;</span> </td> <tr id="entity-ddotseq"><td> <code title="">ddotseq;</code> </td> <td> U+02A77 </td> <td> <span class="glyph" title="">&#10871;</span> </td> <tr id="entity-deg"><td> <code title="">deg;</code> </td> <td> U+000B0 </td> <td> <span class="glyph" title="">&deg;</span> </td> <tr id="entity-delta"><td> <code title="">delta;</code> </td> <td> U+003B4 </td> <td> <span class="glyph" title="">&delta;</span> </td> <tr id="entity-demptyv"><td> <code title="">demptyv;</code> </td> <td> U+029B1 </td> <td> <span class="glyph" title="">&#10673;</span> </td> <tr id="entity-dfisht"><td> <code title="">dfisht;</code> </td> <td> U+0297F </td> <td> <span class="glyph" title="">&#10623;</span> </td> <tr id="entity-dfr"><td> <code title="">dfr;</code> </td> <td> U+1D521 </td> <td> <span class="glyph" title="">&#120097;</span> </td> <tr id="entity-dharl"><td> <code title="">dharl;</code> </td> <td> U+021C3 </td> <td> <span class="glyph" title="">&#8643;</span> </td> <tr id="entity-dharr"><td> <code title="">dharr;</code> </td> <td> U+021C2 </td> <td> <span class="glyph" title="">&#8642;</span> </td> <tr id="entity-diam"><td> <code title="">diam;</code> </td> <td> U+022C4 </td> <td> <span class="glyph" title="">&#8900;</span> </td> <tr id="entity-diamond"><td> <code title="">diamond;</code> </td> <td> U+022C4 </td> <td> <span class="glyph" title="">&#8900;</span> </td> <tr id="entity-diamondsuit"><td> <code title="">diamondsuit;</code> </td> <td> U+02666 </td> <td> <span class="glyph" title="">&diams;</span> </td> <tr id="entity-diams"><td> <code title="">diams;</code> </td> <td> U+02666 </td> <td> <span class="glyph" title="">&diams;</span> </td> <tr id="entity-die"><td> <code title="">die;</code> </td> <td> U+000A8 </td> <td> <span class="glyph" title="">&uml;</span> </td> <tr id="entity-digamma"><td> <code title="">digamma;</code> </td> <td> U+003DD </td> <td> <span class="glyph" title="">&#989;</span> </td> <tr id="entity-disin"><td> <code title="">disin;</code> </td> <td> U+022F2 </td> <td> <span class="glyph" title="">&#8946;</span> </td> <tr id="entity-div"><td> <code title="">div;</code> </td> <td> U+000F7 </td> <td> <span class="glyph" title="">&divide;</span> </td> <tr id="entity-divide"><td> <code title="">divide;</code> </td> <td> U+000F7 </td> <td> <span class="glyph" title="">&divide;</span> </td> <tr id="entity-divideontimes"><td> <code title="">divideontimes;</code> </td> <td> U+022C7 </td> <td> <span class="glyph" title="">&#8903;</span> </td> <tr id="entity-divonx"><td> <code title="">divonx;</code> </td> <td> U+022C7 </td> <td> <span class="glyph" title="">&#8903;</span> </td> <tr id="entity-djcy"><td> <code title="">djcy;</code> </td> <td> U+00452 </td> <td> <span class="glyph" title="">&#1106;</span> </td> <tr id="entity-dlcorn"><td> <code title="">dlcorn;</code> </td> <td> U+0231E </td> <td> <span class="glyph" title="">&#8990;</span> </td> <tr id="entity-dlcrop"><td> <code title="">dlcrop;</code> </td> <td> U+0230D </td> <td> <span class="glyph" title="">&#8973;</span> </td> <tr id="entity-dollar"><td> <code title="">dollar;</code> </td> <td> U+00024 </td> <td> <span class="glyph" title="">$</span> </td> <tr id="entity-dopf"><td> <code title="">dopf;</code> </td> <td> U+1D555 </td> <td> <span class="glyph" title="">&#120149;</span> </td> <tr id="entity-dot"><td> <code title="">dot;</code> </td> <td> U+002D9 </td> <td> <span class="glyph" title="">&#729;</span> </td> <tr id="entity-doteq"><td> <code title="">doteq;</code> </td> <td> U+02250 </td> <td> <span class="glyph" title="">&#8784;</span> </td> <tr id="entity-doteqdot"><td> <code title="">doteqdot;</code> </td> <td> U+02251 </td> <td> <span class="glyph" title="">&#8785;</span> </td> <tr id="entity-dotminus"><td> <code title="">dotminus;</code> </td> <td> U+02238 </td> <td> <span class="glyph" title="">&#8760;</span> </td> <tr id="entity-dotplus"><td> <code title="">dotplus;</code> </td> <td> U+02214 </td> <td> <span class="glyph" title="">&#8724;</span> </td> <tr id="entity-dotsquare"><td> <code title="">dotsquare;</code> </td> <td> U+022A1 </td> <td> <span class="glyph" title="">&#8865;</span> </td> <tr id="entity-doublebarwedge"><td> <code title="">doublebarwedge;</code> </td> <td> U+02306 </td> <td> <span class="glyph" title="">&#8966;</span> </td> <tr id="entity-downarrow"><td> <code title="">downarrow;</code> </td> <td> U+02193 </td> <td> <span class="glyph" title="">&darr;</span> </td> <tr id="entity-downdownarrows"><td> <code title="">downdownarrows;</code> </td> <td> U+021CA </td> <td> <span class="glyph" title="">&#8650;</span> </td> <tr id="entity-downharpoonleft"><td> <code title="">downharpoonleft;</code> </td> <td> U+021C3 </td> <td> <span class="glyph" title="">&#8643;</span> </td> <tr id="entity-downharpoonright"><td> <code title="">downharpoonright;</code> </td> <td> U+021C2 </td> <td> <span class="glyph" title="">&#8642;</span> </td> <tr id="entity-drbkarow"><td> <code title="">drbkarow;</code> </td> <td> U+02910 </td> <td> <span class="glyph" title="">&#10512;</span> </td> <tr id="entity-drcorn"><td> <code title="">drcorn;</code> </td> <td> U+0231F </td> <td> <span class="glyph" title="">&#8991;</span> </td> <tr id="entity-drcrop"><td> <code title="">drcrop;</code> </td> <td> U+0230C </td> <td> <span class="glyph" title="">&#8972;</span> </td> <tr id="entity-dscr"><td> <code title="">dscr;</code> </td> <td> U+1D4B9 </td> <td> <span class="glyph" title="">&#119993;</span> </td> <tr id="entity-dscy"><td> <code title="">dscy;</code> </td> <td> U+00455 </td> <td> <span class="glyph" title="">&#1109;</span> </td> <tr id="entity-dsol"><td> <code title="">dsol;</code> </td> <td> U+029F6 </td> <td> <span class="glyph" title="">&#10742;</span> </td> <tr id="entity-dstrok"><td> <code title="">dstrok;</code> </td> <td> U+00111 </td> <td> <span class="glyph" title="">&#273;</span> </td> <tr id="entity-dtdot"><td> <code title="">dtdot;</code> </td> <td> U+022F1 </td> <td> <span class="glyph" title="">&#8945;</span> </td> <tr id="entity-dtri"><td> <code title="">dtri;</code> </td> <td> U+025BF </td> <td> <span class="glyph" title="">&#9663;</span> </td> <tr id="entity-dtrif"><td> <code title="">dtrif;</code> </td> <td> U+025BE </td> <td> <span class="glyph" title="">&#9662;</span> </td> <tr id="entity-duarr"><td> <code title="">duarr;</code> </td> <td> U+021F5 </td> <td> <span class="glyph" title="">&#8693;</span> </td> <tr id="entity-duhar"><td> <code title="">duhar;</code> </td> <td> U+0296F </td> <td> <span class="glyph" title="">&#10607;</span> </td> <tr id="entity-dwangle"><td> <code title="">dwangle;</code> </td> <td> U+029A6 </td> <td> <span class="glyph" title="">&#10662;</span> </td> <tr id="entity-dzcy"><td> <code title="">dzcy;</code> </td> <td> U+0045F </td> <td> <span class="glyph" title="">&#1119;</span> </td> <tr id="entity-dzigrarr"><td> <code title="">dzigrarr;</code> </td> <td> U+027FF </td> <td> <span class="glyph" title="">&#10239;</span> </td> <tr id="entity-eDDot"><td> <code title="">eDDot;</code> </td> <td> U+02A77 </td> <td> <span class="glyph" title="">&#10871;</span> </td> <tr id="entity-eDot"><td> <code title="">eDot;</code> </td> <td> U+02251 </td> <td> <span class="glyph" title="">&#8785;</span> </td> <tr id="entity-eacute"><td> <code title="">eacute;</code> </td> <td> U+000E9 </td> <td> <span class="glyph" title="">&eacute;</span> </td> <tr id="entity-easter"><td> <code title="">easter;</code> </td> <td> U+02A6E </td> <td> <span class="glyph" title="">&#10862;</span> </td> <tr id="entity-ecaron"><td> <code title="">ecaron;</code> </td> <td> U+0011B </td> <td> <span class="glyph" title="">&#283;</span> </td> <tr id="entity-ecir"><td> <code title="">ecir;</code> </td> <td> U+02256 </td> <td> <span class="glyph" title="">&#8790;</span> </td> <tr id="entity-ecirc"><td> <code title="">ecirc;</code> </td> <td> U+000EA </td> <td> <span class="glyph" title="">&ecirc;</span> </td> <tr id="entity-ecolon"><td> <code title="">ecolon;</code> </td> <td> U+02255 </td> <td> <span class="glyph" title="">&#8789;</span> </td> <tr id="entity-ecy"><td> <code title="">ecy;</code> </td> <td> U+0044D </td> <td> <span class="glyph" title="">&#1101;</span> </td> <tr id="entity-edot"><td> <code title="">edot;</code> </td> <td> U+00117 </td> <td> <span class="glyph" title="">&#279;</span> </td> <tr id="entity-ee"><td> <code title="">ee;</code> </td> <td> U+02147 </td> <td> <span class="glyph" title="">&#8519;</span> </td> <tr id="entity-efDot"><td> <code title="">efDot;</code> </td> <td> U+02252 </td> <td> <span class="glyph" title="">&#8786;</span> </td> <tr id="entity-efr"><td> <code title="">efr;</code> </td> <td> U+1D522 </td> <td> <span class="glyph" title="">&#120098;</span> </td> <tr id="entity-eg"><td> <code title="">eg;</code> </td> <td> U+02A9A </td> <td> <span class="glyph" title="">&#10906;</span> </td> <tr id="entity-egrave"><td> <code title="">egrave;</code> </td> <td> U+000E8 </td> <td> <span class="glyph" title="">&egrave;</span> </td> <tr id="entity-egs"><td> <code title="">egs;</code> </td> <td> U+02A96 </td> <td> <span class="glyph" title="">&#10902;</span> </td> <tr id="entity-egsdot"><td> <code title="">egsdot;</code> </td> <td> U+02A98 </td> <td> <span class="glyph" title="">&#10904;</span> </td> <tr id="entity-el"><td> <code title="">el;</code> </td> <td> U+02A99 </td> <td> <span class="glyph" title="">&#10905;</span> </td> <tr id="entity-elinters"><td> <code title="">elinters;</code> </td> <td> U+023E7 </td> <td> <span class="glyph" title="">&#9191;</span> </td> <tr id="entity-ell"><td> <code title="">ell;</code> </td> <td> U+02113 </td> <td> <span class="glyph" title="">&#8467;</span> </td> <tr id="entity-els"><td> <code title="">els;</code> </td> <td> U+02A95 </td> <td> <span class="glyph" title="">&#10901;</span> </td> <tr id="entity-elsdot"><td> <code title="">elsdot;</code> </td> <td> U+02A97 </td> <td> <span class="glyph" title="">&#10903;</span> </td> <tr id="entity-emacr"><td> <code title="">emacr;</code> </td> <td> U+00113 </td> <td> <span class="glyph" title="">&#275;</span> </td> <tr id="entity-empty"><td> <code title="">empty;</code> </td> <td> U+02205 </td> <td> <span class="glyph" title="">&empty;</span> </td> <tr id="entity-emptyset"><td> <code title="">emptyset;</code> </td> <td> U+02205 </td> <td> <span class="glyph" title="">&empty;</span> </td> <tr id="entity-emptyv"><td> <code title="">emptyv;</code> </td> <td> U+02205 </td> <td> <span class="glyph" title="">&empty;</span> </td> <tr id="entity-emsp"><td> <code title="">emsp;</code> </td> <td> U+02003 </td> <td> <span class="glyph" title="">&emsp;</span> </td> <tr id="entity-emsp13"><td> <code title="">emsp13;</code> </td> <td> U+02004 </td> <td> <span class="glyph" title="">&#8196;</span> </td> <tr id="entity-emsp14"><td> <code title="">emsp14;</code> </td> <td> U+02005 </td> <td> <span class="glyph" title="">&#8197;</span> </td> <tr id="entity-eng"><td> <code title="">eng;</code> </td> <td> U+0014B </td> <td> <span class="glyph" title="">&#331;</span> </td> <tr id="entity-ensp"><td> <code title="">ensp;</code> </td> <td> U+02002 </td> <td> <span class="glyph" title="">&ensp;</span> </td> <tr id="entity-eogon"><td> <code title="">eogon;</code> </td> <td> U+00119 </td> <td> <span class="glyph" title="">&#281;</span> </td> <tr id="entity-eopf"><td> <code title="">eopf;</code> </td> <td> U+1D556 </td> <td> <span class="glyph" title="">&#120150;</span> </td> <tr id="entity-epar"><td> <code title="">epar;</code> </td> <td> U+022D5 </td> <td> <span class="glyph" title="">&#8917;</span> </td> <tr id="entity-eparsl"><td> <code title="">eparsl;</code> </td> <td> U+029E3 </td> <td> <span class="glyph" title="">&#10723;</span> </td> <tr id="entity-eplus"><td> <code title="">eplus;</code> </td> <td> U+02A71 </td> <td> <span class="glyph" title="">&#10865;</span> </td> <tr id="entity-epsi"><td> <code title="">epsi;</code> </td> <td> U+003B5 </td> <td> <span class="glyph" title="">&epsilon;</span> </td> <tr id="entity-epsilon"><td> <code title="">epsilon;</code> </td> <td> U+003B5 </td> <td> <span class="glyph" title="">&epsilon;</span> </td> <tr id="entity-epsiv"><td> <code title="">epsiv;</code> </td> <td> U+003F5 </td> <td> <span class="glyph" title="">&#1013;</span> </td> <tr id="entity-eqcirc"><td> <code title="">eqcirc;</code> </td> <td> U+02256 </td> <td> <span class="glyph" title="">&#8790;</span> </td> <tr id="entity-eqcolon"><td> <code title="">eqcolon;</code> </td> <td> U+02255 </td> <td> <span class="glyph" title="">&#8789;</span> </td> <tr id="entity-eqsim"><td> <code title="">eqsim;</code> </td> <td> U+02242 </td> <td> <span class="glyph" title="">&#8770;</span> </td> <tr id="entity-eqslantgtr"><td> <code title="">eqslantgtr;</code> </td> <td> U+02A96 </td> <td> <span class="glyph" title="">&#10902;</span> </td> <tr id="entity-eqslantless"><td> <code title="">eqslantless;</code> </td> <td> U+02A95 </td> <td> <span class="glyph" title="">&#10901;</span> </td> <tr id="entity-equals"><td> <code title="">equals;</code> </td> <td> U+0003D </td> <td> <span class="glyph" title="">=</span> </td> <tr id="entity-equest"><td> <code title="">equest;</code> </td> <td> U+0225F </td> <td> <span class="glyph" title="">&#8799;</span> </td> <tr id="entity-equiv"><td> <code title="">equiv;</code> </td> <td> U+02261 </td> <td> <span class="glyph" title="">&equiv;</span> </td> <tr id="entity-equivDD"><td> <code title="">equivDD;</code> </td> <td> U+02A78 </td> <td> <span class="glyph" title="">&#10872;</span> </td> <tr id="entity-eqvparsl"><td> <code title="">eqvparsl;</code> </td> <td> U+029E5 </td> <td> <span class="glyph" title="">&#10725;</span> </td> <tr id="entity-erDot"><td> <code title="">erDot;</code> </td> <td> U+02253 </td> <td> <span class="glyph" title="">&#8787;</span> </td> <tr id="entity-erarr"><td> <code title="">erarr;</code> </td> <td> U+02971 </td> <td> <span class="glyph" title="">&#10609;</span> </td> <tr id="entity-escr"><td> <code title="">escr;</code> </td> <td> U+0212F </td> <td> <span class="glyph" title="">&#8495;</span> </td> <tr id="entity-esdot"><td> <code title="">esdot;</code> </td> <td> U+02250 </td> <td> <span class="glyph" title="">&#8784;</span> </td> <tr id="entity-esim"><td> <code title="">esim;</code> </td> <td> U+02242 </td> <td> <span class="glyph" title="">&#8770;</span> </td> <tr id="entity-eta"><td> <code title="">eta;</code> </td> <td> U+003B7 </td> <td> <span class="glyph" title="">&eta;</span> </td> <tr id="entity-eth"><td> <code title="">eth;</code> </td> <td> U+000F0 </td> <td> <span class="glyph" title="">&eth;</span> </td> <tr id="entity-euml"><td> <code title="">euml;</code> </td> <td> U+000EB </td> <td> <span class="glyph" title="">&euml;</span> </td> <tr id="entity-euro"><td> <code title="">euro;</code> </td> <td> U+020AC </td> <td> <span class="glyph" title="">&euro;</span> </td> <tr id="entity-excl"><td> <code title="">excl;</code> </td> <td> U+00021 </td> <td> <span class="glyph" title="">!</span> </td> <tr id="entity-exist"><td> <code title="">exist;</code> </td> <td> U+02203 </td> <td> <span class="glyph" title="">&exist;</span> </td> <tr id="entity-expectation"><td> <code title="">expectation;</code> </td> <td> U+02130 </td> <td> <span class="glyph" title="">&#8496;</span> </td> <tr id="entity-exponentiale"><td> <code title="">exponentiale;</code> </td> <td> U+02147 </td> <td> <span class="glyph" title="">&#8519;</span> </td> <tr id="entity-fallingdotseq"><td> <code title="">fallingdotseq;</code> </td> <td> U+02252 </td> <td> <span class="glyph" title="">&#8786;</span> </td> <tr id="entity-fcy"><td> <code title="">fcy;</code> </td> <td> U+00444 </td> <td> <span class="glyph" title="">&#1092;</span> </td> <tr id="entity-female"><td> <code title="">female;</code> </td> <td> U+02640 </td> <td> <span class="glyph" title="">&#9792;</span> </td> <tr id="entity-ffilig"><td> <code title="">ffilig;</code> </td> <td> U+0FB03 </td> <td> <span class="glyph" title="">&#64259;</span> </td> <tr id="entity-fflig"><td> <code title="">fflig;</code> </td> <td> U+0FB00 </td> <td> <span class="glyph" title="">&#64256;</span> </td> <tr id="entity-ffllig"><td> <code title="">ffllig;</code> </td> <td> U+0FB04 </td> <td> <span class="glyph" title="">&#64260;</span> </td> <tr id="entity-ffr"><td> <code title="">ffr;</code> </td> <td> U+1D523 </td> <td> <span class="glyph" title="">&#120099;</span> </td> <tr id="entity-filig"><td> <code title="">filig;</code> </td> <td> U+0FB01 </td> <td> <span class="glyph" title="">&#64257;</span> </td> <tr id="entity-fjlig"><td> <code title="">fjlig;</code> </td> <td> U+00066 U+0006A </td> <td> <span class="glyph compound" title="">fj</span> </td> <tr id="entity-flat"><td> <code title="">flat;</code> </td> <td> U+0266D </td> <td> <span class="glyph" title="">&#9837;</span> </td> <tr id="entity-fllig"><td> <code title="">fllig;</code> </td> <td> U+0FB02 </td> <td> <span class="glyph" title="">&#64258;</span> </td> <tr id="entity-fltns"><td> <code title="">fltns;</code> </td> <td> U+025B1 </td> <td> <span class="glyph" title="">&#9649;</span> </td> <tr id="entity-fnof"><td> <code title="">fnof;</code> </td> <td> U+00192 </td> <td> <span class="glyph" title="">&fnof;</span> </td> <tr id="entity-fopf"><td> <code title="">fopf;</code> </td> <td> U+1D557 </td> <td> <span class="glyph" title="">&#120151;</span> </td> <tr id="entity-forall"><td> <code title="">forall;</code> </td> <td> U+02200 </td> <td> <span class="glyph" title="">&forall;</span> </td> <tr id="entity-fork"><td> <code title="">fork;</code> </td> <td> U+022D4 </td> <td> <span class="glyph" title="">&#8916;</span> </td> <tr id="entity-forkv"><td> <code title="">forkv;</code> </td> <td> U+02AD9 </td> <td> <span class="glyph" title="">&#10969;</span> </td> <tr id="entity-fpartint"><td> <code title="">fpartint;</code> </td> <td> U+02A0D </td> <td> <span class="glyph" title="">&#10765;</span> </td> <tr id="entity-frac12"><td> <code title="">frac12;</code> </td> <td> U+000BD </td> <td> <span class="glyph" title="">&frac12;</span> </td> <tr id="entity-frac13"><td> <code title="">frac13;</code> </td> <td> U+02153 </td> <td> <span class="glyph" title="">&#8531;</span> </td> <tr id="entity-frac14"><td> <code title="">frac14;</code> </td> <td> U+000BC </td> <td> <span class="glyph" title="">&frac14;</span> </td> <tr id="entity-frac15"><td> <code title="">frac15;</code> </td> <td> U+02155 </td> <td> <span class="glyph" title="">&#8533;</span> </td> <tr id="entity-frac16"><td> <code title="">frac16;</code> </td> <td> U+02159 </td> <td> <span class="glyph" title="">&#8537;</span> </td> <tr id="entity-frac18"><td> <code title="">frac18;</code> </td> <td> U+0215B </td> <td> <span class="glyph" title="">&#8539;</span> </td> <tr id="entity-frac23"><td> <code title="">frac23;</code> </td> <td> U+02154 </td> <td> <span class="glyph" title="">&#8532;</span> </td> <tr id="entity-frac25"><td> <code title="">frac25;</code> </td> <td> U+02156 </td> <td> <span class="glyph" title="">&#8534;</span> </td> <tr id="entity-frac34"><td> <code title="">frac34;</code> </td> <td> U+000BE </td> <td> <span class="glyph" title="">&frac34;</span> </td> <tr id="entity-frac35"><td> <code title="">frac35;</code> </td> <td> U+02157 </td> <td> <span class="glyph" title="">&#8535;</span> </td> <tr id="entity-frac38"><td> <code title="">frac38;</code> </td> <td> U+0215C </td> <td> <span class="glyph" title="">&#8540;</span> </td> <tr id="entity-frac45"><td> <code title="">frac45;</code> </td> <td> U+02158 </td> <td> <span class="glyph" title="">&#8536;</span> </td> <tr id="entity-frac56"><td> <code title="">frac56;</code> </td> <td> U+0215A </td> <td> <span class="glyph" title="">&#8538;</span> </td> <tr id="entity-frac58"><td> <code title="">frac58;</code> </td> <td> U+0215D </td> <td> <span class="glyph" title="">&#8541;</span> </td> <tr id="entity-frac78"><td> <code title="">frac78;</code> </td> <td> U+0215E </td> <td> <span class="glyph" title="">&#8542;</span> </td> <tr id="entity-frasl"><td> <code title="">frasl;</code> </td> <td> U+02044 </td> <td> <span class="glyph" title="">&frasl;</span> </td> <tr id="entity-frown"><td> <code title="">frown;</code> </td> <td> U+02322 </td> <td> <span class="glyph" title="">&#8994;</span> </td> <tr id="entity-fscr"><td> <code title="">fscr;</code> </td> <td> U+1D4BB </td> <td> <span class="glyph" title="">&#119995;</span> </td> <tr id="entity-gE"><td> <code title="">gE;</code> </td> <td> U+02267 </td> <td> <span class="glyph" title="">&#8807;</span> </td> <tr id="entity-gEl"><td> <code title="">gEl;</code> </td> <td> U+02A8C </td> <td> <span class="glyph" title="">&#10892;</span> </td> <tr id="entity-gacute"><td> <code title="">gacute;</code> </td> <td> U+001F5 </td> <td> <span class="glyph" title="">&#501;</span> </td> <tr id="entity-gamma"><td> <code title="">gamma;</code> </td> <td> U+003B3 </td> <td> <span class="glyph" title="">&gamma;</span> </td> <tr id="entity-gammad"><td> <code title="">gammad;</code> </td> <td> U+003DD </td> <td> <span class="glyph" title="">&#989;</span> </td> <tr id="entity-gap"><td> <code title="">gap;</code> </td> <td> U+02A86 </td> <td> <span class="glyph" title="">&#10886;</span> </td> <tr id="entity-gbreve"><td> <code title="">gbreve;</code> </td> <td> U+0011F </td> <td> <span class="glyph" title="">&#287;</span> </td> <tr id="entity-gcirc"><td> <code title="">gcirc;</code> </td> <td> U+0011D </td> <td> <span class="glyph" title="">&#285;</span> </td> <tr id="entity-gcy"><td> <code title="">gcy;</code> </td> <td> U+00433 </td> <td> <span class="glyph" title="">&#1075;</span> </td> <tr id="entity-gdot"><td> <code title="">gdot;</code> </td> <td> U+00121 </td> <td> <span class="glyph" title="">&#289;</span> </td> <tr id="entity-ge"><td> <code title="">ge;</code> </td> <td> U+02265 </td> <td> <span class="glyph" title="">&ge;</span> </td> <tr id="entity-gel"><td> <code title="">gel;</code> </td> <td> U+022DB </td> <td> <span class="glyph" title="">&#8923;</span> </td> <tr id="entity-geq"><td> <code title="">geq;</code> </td> <td> U+02265 </td> <td> <span class="glyph" title="">&ge;</span> </td> <tr id="entity-geqq"><td> <code title="">geqq;</code> </td> <td> U+02267 </td> <td> <span class="glyph" title="">&#8807;</span> </td> <tr id="entity-geqslant"><td> <code title="">geqslant;</code> </td> <td> U+02A7E </td> <td> <span class="glyph" title="">&#10878;</span> </td> <tr id="entity-ges"><td> <code title="">ges;</code> </td> <td> U+02A7E </td> <td> <span class="glyph" title="">&#10878;</span> </td> <tr id="entity-gescc"><td> <code title="">gescc;</code> </td> <td> U+02AA9 </td> <td> <span class="glyph" title="">&#10921;</span> </td> <tr id="entity-gesdot"><td> <code title="">gesdot;</code> </td> <td> U+02A80 </td> <td> <span class="glyph" title="">&#10880;</span> </td> <tr id="entity-gesdoto"><td> <code title="">gesdoto;</code> </td> <td> U+02A82 </td> <td> <span class="glyph" title="">&#10882;</span> </td> <tr id="entity-gesdotol"><td> <code title="">gesdotol;</code> </td> <td> U+02A84 </td> <td> <span class="glyph" title="">&#10884;</span> </td> <tr id="entity-gesl"><td> <code title="">gesl;</code> </td> <td> U+022DB U+0FE00 </td> <td> <span class="glyph compound" title="">&#8923;&#65024;</span> </td> <tr id="entity-gesles"><td> <code title="">gesles;</code> </td> <td> U+02A94 </td> <td> <span class="glyph" title="">&#10900;</span> </td> <tr id="entity-gfr"><td> <code title="">gfr;</code> </td> <td> U+1D524 </td> <td> <span class="glyph" title="">&#120100;</span> </td> <tr id="entity-gg"><td> <code title="">gg;</code> </td> <td> U+0226B </td> <td> <span class="glyph" title="">&#8811;</span> </td> <tr id="entity-ggg"><td> <code title="">ggg;</code> </td> <td> U+022D9 </td> <td> <span class="glyph" title="">&#8921;</span> </td> <tr id="entity-gimel"><td> <code title="">gimel;</code> </td> <td> U+02137 </td> <td> <span class="glyph" title="">&#8503;</span> </td> <tr id="entity-gjcy"><td> <code title="">gjcy;</code> </td> <td> U+00453 </td> <td> <span class="glyph" title="">&#1107;</span> </td> <tr id="entity-gl"><td> <code title="">gl;</code> </td> <td> U+02277 </td> <td> <span class="glyph" title="">&#8823;</span> </td> <tr id="entity-glE"><td> <code title="">glE;</code> </td> <td> U+02A92 </td> <td> <span class="glyph" title="">&#10898;</span> </td> <tr id="entity-gla"><td> <code title="">gla;</code> </td> <td> U+02AA5 </td> <td> <span class="glyph" title="">&#10917;</span> </td> <tr id="entity-glj"><td> <code title="">glj;</code> </td> <td> U+02AA4 </td> <td> <span class="glyph" title="">&#10916;</span> </td> <tr id="entity-gnE"><td> <code title="">gnE;</code> </td> <td> U+02269 </td> <td> <span class="glyph" title="">&#8809;</span> </td> <tr id="entity-gnap"><td> <code title="">gnap;</code> </td> <td> U+02A8A </td> <td> <span class="glyph" title="">&#10890;</span> </td> <tr id="entity-gnapprox"><td> <code title="">gnapprox;</code> </td> <td> U+02A8A </td> <td> <span class="glyph" title="">&#10890;</span> </td> <tr id="entity-gne"><td> <code title="">gne;</code> </td> <td> U+02A88 </td> <td> <span class="glyph" title="">&#10888;</span> </td> <tr id="entity-gneq"><td> <code title="">gneq;</code> </td> <td> U+02A88 </td> <td> <span class="glyph" title="">&#10888;</span> </td> <tr id="entity-gneqq"><td> <code title="">gneqq;</code> </td> <td> U+02269 </td> <td> <span class="glyph" title="">&#8809;</span> </td> <tr id="entity-gnsim"><td> <code title="">gnsim;</code> </td> <td> U+022E7 </td> <td> <span class="glyph" title="">&#8935;</span> </td> <tr id="entity-gopf"><td> <code title="">gopf;</code> </td> <td> U+1D558 </td> <td> <span class="glyph" title="">&#120152;</span> </td> <tr id="entity-grave"><td> <code title="">grave;</code> </td> <td> U+00060 </td> <td> <span class="glyph" title="">`</span> </td> <tr id="entity-gscr"><td> <code title="">gscr;</code> </td> <td> U+0210A </td> <td> <span class="glyph" title="">&#8458;</span> </td> <tr id="entity-gsim"><td> <code title="">gsim;</code> </td> <td> U+02273 </td> <td> <span class="glyph" title="">&#8819;</span> </td> <tr id="entity-gsime"><td> <code title="">gsime;</code> </td> <td> U+02A8E </td> <td> <span class="glyph" title="">&#10894;</span> </td> <tr id="entity-gsiml"><td> <code title="">gsiml;</code> </td> <td> U+02A90 </td> <td> <span class="glyph" title="">&#10896;</span> </td> <tr id="entity-gt"><td> <code title="">gt;</code> </td> <td> U+0003E </td> <td> <span class="glyph" title="">&gt;</span> </td> <tr id="entity-gtcc"><td> <code title="">gtcc;</code> </td> <td> U+02AA7 </td> <td> <span class="glyph" title="">&#10919;</span> </td> <tr id="entity-gtcir"><td> <code title="">gtcir;</code> </td> <td> U+02A7A </td> <td> <span class="glyph" title="">&#10874;</span> </td> <tr id="entity-gtdot"><td> <code title="">gtdot;</code> </td> <td> U+022D7 </td> <td> <span class="glyph" title="">&#8919;</span> </td> <tr id="entity-gtlPar"><td> <code title="">gtlPar;</code> </td> <td> U+02995 </td> <td> <span class="glyph" title="">&#10645;</span> </td> <tr id="entity-gtquest"><td> <code title="">gtquest;</code> </td> <td> U+02A7C </td> <td> <span class="glyph" title="">&#10876;</span> </td> <tr id="entity-gtrapprox"><td> <code title="">gtrapprox;</code> </td> <td> U+02A86 </td> <td> <span class="glyph" title="">&#10886;</span> </td> <tr id="entity-gtrarr"><td> <code title="">gtrarr;</code> </td> <td> U+02978 </td> <td> <span class="glyph" title="">&#10616;</span> </td> <tr id="entity-gtrdot"><td> <code title="">gtrdot;</code> </td> <td> U+022D7 </td> <td> <span class="glyph" title="">&#8919;</span> </td> <tr id="entity-gtreqless"><td> <code title="">gtreqless;</code> </td> <td> U+022DB </td> <td> <span class="glyph" title="">&#8923;</span> </td> <tr id="entity-gtreqqless"><td> <code title="">gtreqqless;</code> </td> <td> U+02A8C </td> <td> <span class="glyph" title="">&#10892;</span> </td> <tr id="entity-gtrless"><td> <code title="">gtrless;</code> </td> <td> U+02277 </td> <td> <span class="glyph" title="">&#8823;</span> </td> <tr id="entity-gtrsim"><td> <code title="">gtrsim;</code> </td> <td> U+02273 </td> <td> <span class="glyph" title="">&#8819;</span> </td> <tr id="entity-gvertneqq"><td> <code title="">gvertneqq;</code> </td> <td> U+02269 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8809;&#65024;</span> </td> <tr id="entity-gvnE"><td> <code title="">gvnE;</code> </td> <td> U+02269 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8809;&#65024;</span> </td> <tr id="entity-hArr"><td> <code title="">hArr;</code> </td> <td> U+021D4 </td> <td> <span class="glyph" title="">&hArr;</span> </td> <tr id="entity-hairsp"><td> <code title="">hairsp;</code> </td> <td> U+0200A </td> <td> <span class="glyph" title="">&#8202;</span> </td> <tr id="entity-half"><td> <code title="">half;</code> </td> <td> U+000BD </td> <td> <span class="glyph" title="">&frac12;</span> </td> <tr id="entity-hamilt"><td> <code title="">hamilt;</code> </td> <td> U+0210B </td> <td> <span class="glyph" title="">&#8459;</span> </td> <tr id="entity-hardcy"><td> <code title="">hardcy;</code> </td> <td> U+0044A </td> <td> <span class="glyph" title="">&#1098;</span> </td> <tr id="entity-harr"><td> <code title="">harr;</code> </td> <td> U+02194 </td> <td> <span class="glyph" title="">&harr;</span> </td> <tr id="entity-harrcir"><td> <code title="">harrcir;</code> </td> <td> U+02948 </td> <td> <span class="glyph" title="">&#10568;</span> </td> <tr id="entity-harrw"><td> <code title="">harrw;</code> </td> <td> U+021AD </td> <td> <span class="glyph" title="">&#8621;</span> </td> <tr id="entity-hbar"><td> <code title="">hbar;</code> </td> <td> U+0210F </td> <td> <span class="glyph" title="">&#8463;</span> </td> <tr id="entity-hcirc"><td> <code title="">hcirc;</code> </td> <td> U+00125 </td> <td> <span class="glyph" title="">&#293;</span> </td> <tr id="entity-hearts"><td> <code title="">hearts;</code> </td> <td> U+02665 </td> <td> <span class="glyph" title="">&hearts;</span> </td> <tr id="entity-heartsuit"><td> <code title="">heartsuit;</code> </td> <td> U+02665 </td> <td> <span class="glyph" title="">&hearts;</span> </td> <tr id="entity-hellip"><td> <code title="">hellip;</code> </td> <td> U+02026 </td> <td> <span class="glyph" title="">&hellip;</span> </td> <tr id="entity-hercon"><td> <code title="">hercon;</code> </td> <td> U+022B9 </td> <td> <span class="glyph" title="">&#8889;</span> </td> <tr id="entity-hfr"><td> <code title="">hfr;</code> </td> <td> U+1D525 </td> <td> <span class="glyph" title="">&#120101;</span> </td> <tr id="entity-hksearow"><td> <code title="">hksearow;</code> </td> <td> U+02925 </td> <td> <span class="glyph" title="">&#10533;</span> </td> <tr id="entity-hkswarow"><td> <code title="">hkswarow;</code> </td> <td> U+02926 </td> <td> <span class="glyph" title="">&#10534;</span> </td> <tr id="entity-hoarr"><td> <code title="">hoarr;</code> </td> <td> U+021FF </td> <td> <span class="glyph" title="">&#8703;</span> </td> <tr id="entity-homtht"><td> <code title="">homtht;</code> </td> <td> U+0223B </td> <td> <span class="glyph" title="">&#8763;</span> </td> <tr id="entity-hookleftarrow"><td> <code title="">hookleftarrow;</code> </td> <td> U+021A9 </td> <td> <span class="glyph" title="">&#8617;</span> </td> <tr id="entity-hookrightarrow"><td> <code title="">hookrightarrow;</code> </td> <td> U+021AA </td> <td> <span class="glyph" title="">&#8618;</span> </td> <tr id="entity-hopf"><td> <code title="">hopf;</code> </td> <td> U+1D559 </td> <td> <span class="glyph" title="">&#120153;</span> </td> <tr id="entity-horbar"><td> <code title="">horbar;</code> </td> <td> U+02015 </td> <td> <span class="glyph" title="">&#8213;</span> </td> <tr id="entity-hscr"><td> <code title="">hscr;</code> </td> <td> U+1D4BD </td> <td> <span class="glyph" title="">&#119997;</span> </td> <tr id="entity-hslash"><td> <code title="">hslash;</code> </td> <td> U+0210F </td> <td> <span class="glyph" title="">&#8463;</span> </td> <tr id="entity-hstrok"><td> <code title="">hstrok;</code> </td> <td> U+00127 </td> <td> <span class="glyph" title="">&#295;</span> </td> <tr id="entity-hybull"><td> <code title="">hybull;</code> </td> <td> U+02043 </td> <td> <span class="glyph" title="">&#8259;</span> </td> <tr id="entity-hyphen"><td> <code title="">hyphen;</code> </td> <td> U+02010 </td> <td> <span class="glyph" title="">&#8208;</span> </td> <tr id="entity-iacute"><td> <code title="">iacute;</code> </td> <td> U+000ED </td> <td> <span class="glyph" title="">&iacute;</span> </td> <tr id="entity-ic"><td> <code title="">ic;</code> </td> <td> U+02063 </td> <td> <span class="glyph" title="">&#8291;</span> </td> <tr id="entity-icirc"><td> <code title="">icirc;</code> </td> <td> U+000EE </td> <td> <span class="glyph" title="">&icirc;</span> </td> <tr id="entity-icy"><td> <code title="">icy;</code> </td> <td> U+00438 </td> <td> <span class="glyph" title="">&#1080;</span> </td> <tr id="entity-iecy"><td> <code title="">iecy;</code> </td> <td> U+00435 </td> <td> <span class="glyph" title="">&#1077;</span> </td> <tr id="entity-iexcl"><td> <code title="">iexcl;</code> </td> <td> U+000A1 </td> <td> <span class="glyph" title="">&iexcl;</span> </td> <tr id="entity-iff"><td> <code title="">iff;</code> </td> <td> U+021D4 </td> <td> <span class="glyph" title="">&hArr;</span> </td> <tr id="entity-ifr"><td> <code title="">ifr;</code> </td> <td> U+1D526 </td> <td> <span class="glyph" title="">&#120102;</span> </td> <tr id="entity-igrave"><td> <code title="">igrave;</code> </td> <td> U+000EC </td> <td> <span class="glyph" title="">&igrave;</span> </td> <tr id="entity-ii"><td> <code title="">ii;</code> </td> <td> U+02148 </td> <td> <span class="glyph" title="">&#8520;</span> </td> <tr id="entity-iiiint"><td> <code title="">iiiint;</code> </td> <td> U+02A0C </td> <td> <span class="glyph" title="">&#10764;</span> </td> <tr id="entity-iiint"><td> <code title="">iiint;</code> </td> <td> U+0222D </td> <td> <span class="glyph" title="">&#8749;</span> </td> <tr id="entity-iinfin"><td> <code title="">iinfin;</code> </td> <td> U+029DC </td> <td> <span class="glyph" title="">&#10716;</span> </td> <tr id="entity-iiota"><td> <code title="">iiota;</code> </td> <td> U+02129 </td> <td> <span class="glyph" title="">&#8489;</span> </td> <tr id="entity-ijlig"><td> <code title="">ijlig;</code> </td> <td> U+00133 </td> <td> <span class="glyph" title="">&#307;</span> </td> <tr id="entity-imacr"><td> <code title="">imacr;</code> </td> <td> U+0012B </td> <td> <span class="glyph" title="">&#299;</span> </td> <tr id="entity-image"><td> <code title="">image;</code> </td> <td> U+02111 </td> <td> <span class="glyph" title="">&image;</span> </td> <tr id="entity-imagline"><td> <code title="">imagline;</code> </td> <td> U+02110 </td> <td> <span class="glyph" title="">&#8464;</span> </td> <tr id="entity-imagpart"><td> <code title="">imagpart;</code> </td> <td> U+02111 </td> <td> <span class="glyph" title="">&image;</span> </td> <tr id="entity-imath"><td> <code title="">imath;</code> </td> <td> U+00131 </td> <td> <span class="glyph" title="">&#305;</span> </td> <tr id="entity-imof"><td> <code title="">imof;</code> </td> <td> U+022B7 </td> <td> <span class="glyph" title="">&#8887;</span> </td> <tr id="entity-imped"><td> <code title="">imped;</code> </td> <td> U+001B5 </td> <td> <span class="glyph" title="">&#437;</span> </td> <tr id="entity-in"><td> <code title="">in;</code> </td> <td> U+02208 </td> <td> <span class="glyph" title="">&isin;</span> </td> <tr id="entity-incare"><td> <code title="">incare;</code> </td> <td> U+02105 </td> <td> <span class="glyph" title="">&#8453;</span> </td> <tr id="entity-infin"><td> <code title="">infin;</code> </td> <td> U+0221E </td> <td> <span class="glyph" title="">&infin;</span> </td> <tr id="entity-infintie"><td> <code title="">infintie;</code> </td> <td> U+029DD </td> <td> <span class="glyph" title="">&#10717;</span> </td> <tr id="entity-inodot"><td> <code title="">inodot;</code> </td> <td> U+00131 </td> <td> <span class="glyph" title="">&#305;</span> </td> <tr id="entity-int"><td> <code title="">int;</code> </td> <td> U+0222B </td> <td> <span class="glyph" title="">&int;</span> </td> <tr id="entity-intcal"><td> <code title="">intcal;</code> </td> <td> U+022BA </td> <td> <span class="glyph" title="">&#8890;</span> </td> <tr id="entity-integers"><td> <code title="">integers;</code> </td> <td> U+02124 </td> <td> <span class="glyph" title="">&#8484;</span> </td> <tr id="entity-intercal"><td> <code title="">intercal;</code> </td> <td> U+022BA </td> <td> <span class="glyph" title="">&#8890;</span> </td> <tr id="entity-intlarhk"><td> <code title="">intlarhk;</code> </td> <td> U+02A17 </td> <td> <span class="glyph" title="">&#10775;</span> </td> <tr id="entity-intprod"><td> <code title="">intprod;</code> </td> <td> U+02A3C </td> <td> <span class="glyph" title="">&#10812;</span> </td> <tr id="entity-iocy"><td> <code title="">iocy;</code> </td> <td> U+00451 </td> <td> <span class="glyph" title="">&#1105;</span> </td> <tr id="entity-iogon"><td> <code title="">iogon;</code> </td> <td> U+0012F </td> <td> <span class="glyph" title="">&#303;</span> </td> <tr id="entity-iopf"><td> <code title="">iopf;</code> </td> <td> U+1D55A </td> <td> <span class="glyph" title="">&#120154;</span> </td> <tr id="entity-iota"><td> <code title="">iota;</code> </td> <td> U+003B9 </td> <td> <span class="glyph" title="">&iota;</span> </td> <tr id="entity-iprod"><td> <code title="">iprod;</code> </td> <td> U+02A3C </td> <td> <span class="glyph" title="">&#10812;</span> </td> <tr id="entity-iquest"><td> <code title="">iquest;</code> </td> <td> U+000BF </td> <td> <span class="glyph" title="">&iquest;</span> </td> <tr id="entity-iscr"><td> <code title="">iscr;</code> </td> <td> U+1D4BE </td> <td> <span class="glyph" title="">&#119998;</span> </td> <tr id="entity-isin"><td> <code title="">isin;</code> </td> <td> U+02208 </td> <td> <span class="glyph" title="">&isin;</span> </td> <tr id="entity-isinE"><td> <code title="">isinE;</code> </td> <td> U+022F9 </td> <td> <span class="glyph" title="">&#8953;</span> </td> <tr id="entity-isindot"><td> <code title="">isindot;</code> </td> <td> U+022F5 </td> <td> <span class="glyph" title="">&#8949;</span> </td> <tr id="entity-isins"><td> <code title="">isins;</code> </td> <td> U+022F4 </td> <td> <span class="glyph" title="">&#8948;</span> </td> <tr id="entity-isinsv"><td> <code title="">isinsv;</code> </td> <td> U+022F3 </td> <td> <span class="glyph" title="">&#8947;</span> </td> <tr id="entity-isinv"><td> <code title="">isinv;</code> </td> <td> U+02208 </td> <td> <span class="glyph" title="">&isin;</span> </td> <tr id="entity-it"><td> <code title="">it;</code> </td> <td> U+02062 </td> <td> <span class="glyph" title="">&#8290;</span> </td> <tr id="entity-itilde"><td> <code title="">itilde;</code> </td> <td> U+00129 </td> <td> <span class="glyph" title="">&#297;</span> </td> <tr id="entity-iukcy"><td> <code title="">iukcy;</code> </td> <td> U+00456 </td> <td> <span class="glyph" title="">&#1110;</span> </td> <tr id="entity-iuml"><td> <code title="">iuml;</code> </td> <td> U+000EF </td> <td> <span class="glyph" title="">&iuml;</span> </td> <tr id="entity-jcirc"><td> <code title="">jcirc;</code> </td> <td> U+00135 </td> <td> <span class="glyph" title="">&#309;</span> </td> <tr id="entity-jcy"><td> <code title="">jcy;</code> </td> <td> U+00439 </td> <td> <span class="glyph" title="">&#1081;</span> </td> <tr id="entity-jfr"><td> <code title="">jfr;</code> </td> <td> U+1D527 </td> <td> <span class="glyph" title="">&#120103;</span> </td> <tr id="entity-jmath"><td> <code title="">jmath;</code> </td> <td> U+00237 </td> <td> <span class="glyph" title="">&#567;</span> </td> <tr id="entity-jopf"><td> <code title="">jopf;</code> </td> <td> U+1D55B </td> <td> <span class="glyph" title="">&#120155;</span> </td> <tr id="entity-jscr"><td> <code title="">jscr;</code> </td> <td> U+1D4BF </td> <td> <span class="glyph" title="">&#119999;</span> </td> <tr id="entity-jsercy"><td> <code title="">jsercy;</code> </td> <td> U+00458 </td> <td> <span class="glyph" title="">&#1112;</span> </td> <tr id="entity-jukcy"><td> <code title="">jukcy;</code> </td> <td> U+00454 </td> <td> <span class="glyph" title="">&#1108;</span> </td> <tr id="entity-kappa"><td> <code title="">kappa;</code> </td> <td> U+003BA </td> <td> <span class="glyph" title="">&kappa;</span> </td> <tr id="entity-kappav"><td> <code title="">kappav;</code> </td> <td> U+003F0 </td> <td> <span class="glyph" title="">&#1008;</span> </td> <tr id="entity-kcedil"><td> <code title="">kcedil;</code> </td> <td> U+00137 </td> <td> <span class="glyph" title="">&#311;</span> </td> <tr id="entity-kcy"><td> <code title="">kcy;</code> </td> <td> U+0043A </td> <td> <span class="glyph" title="">&#1082;</span> </td> <tr id="entity-kfr"><td> <code title="">kfr;</code> </td> <td> U+1D528 </td> <td> <span class="glyph" title="">&#120104;</span> </td> <tr id="entity-kgreen"><td> <code title="">kgreen;</code> </td> <td> U+00138 </td> <td> <span class="glyph" title="">&#312;</span> </td> <tr id="entity-khcy"><td> <code title="">khcy;</code> </td> <td> U+00445 </td> <td> <span class="glyph" title="">&#1093;</span> </td> <tr id="entity-kjcy"><td> <code title="">kjcy;</code> </td> <td> U+0045C </td> <td> <span class="glyph" title="">&#1116;</span> </td> <tr id="entity-kopf"><td> <code title="">kopf;</code> </td> <td> U+1D55C </td> <td> <span class="glyph" title="">&#120156;</span> </td> <tr id="entity-kscr"><td> <code title="">kscr;</code> </td> <td> U+1D4C0 </td> <td> <span class="glyph" title="">&#120000;</span> </td> <tr id="entity-lAarr"><td> <code title="">lAarr;</code> </td> <td> U+021DA </td> <td> <span class="glyph" title="">&#8666;</span> </td> <tr id="entity-lArr"><td> <code title="">lArr;</code> </td> <td> U+021D0 </td> <td> <span class="glyph" title="">&lArr;</span> </td> <tr id="entity-lAtail"><td> <code title="">lAtail;</code> </td> <td> U+0291B </td> <td> <span class="glyph" title="">&#10523;</span> </td> <tr id="entity-lBarr"><td> <code title="">lBarr;</code> </td> <td> U+0290E </td> <td> <span class="glyph" title="">&#10510;</span> </td> <tr id="entity-lE"><td> <code title="">lE;</code> </td> <td> U+02266 </td> <td> <span class="glyph" title="">&#8806;</span> </td> <tr id="entity-lEg"><td> <code title="">lEg;</code> </td> <td> U+02A8B </td> <td> <span class="glyph" title="">&#10891;</span> </td> <tr id="entity-lHar"><td> <code title="">lHar;</code> </td> <td> U+02962 </td> <td> <span class="glyph" title="">&#10594;</span> </td> <tr id="entity-lacute"><td> <code title="">lacute;</code> </td> <td> U+0013A </td> <td> <span class="glyph" title="">&#314;</span> </td> <tr id="entity-laemptyv"><td> <code title="">laemptyv;</code> </td> <td> U+029B4 </td> <td> <span class="glyph" title="">&#10676;</span> </td> <tr id="entity-lagran"><td> <code title="">lagran;</code> </td> <td> U+02112 </td> <td> <span class="glyph" title="">&#8466;</span> </td> <tr id="entity-lambda"><td> <code title="">lambda;</code> </td> <td> U+003BB </td> <td> <span class="glyph" title="">&lambda;</span> </td> <tr id="entity-lang"><td> <code title="">lang;</code> </td> <td> U+027E8 </td> <td> <span class="glyph" title="">&#9001;</span> </td> <tr id="entity-langd"><td> <code title="">langd;</code> </td> <td> U+02991 </td> <td> <span class="glyph" title="">&#10641;</span> </td> <tr id="entity-langle"><td> <code title="">langle;</code> </td> <td> U+027E8 </td> <td> <span class="glyph" title="">&#9001;</span> </td> <tr id="entity-lap"><td> <code title="">lap;</code> </td> <td> U+02A85 </td> <td> <span class="glyph" title="">&#10885;</span> </td> <tr id="entity-laquo"><td> <code title="">laquo;</code> </td> <td> U+000AB </td> <td> <span class="glyph" title="">&laquo;</span> </td> <tr id="entity-larr"><td> <code title="">larr;</code> </td> <td> U+02190 </td> <td> <span class="glyph" title="">&larr;</span> </td> <tr id="entity-larrb"><td> <code title="">larrb;</code> </td> <td> U+021E4 </td> <td> <span class="glyph" title="">&#8676;</span> </td> <tr id="entity-larrbfs"><td> <code title="">larrbfs;</code> </td> <td> U+0291F </td> <td> <span class="glyph" title="">&#10527;</span> </td> <tr id="entity-larrfs"><td> <code title="">larrfs;</code> </td> <td> U+0291D </td> <td> <span class="glyph" title="">&#10525;</span> </td> <tr id="entity-larrhk"><td> <code title="">larrhk;</code> </td> <td> U+021A9 </td> <td> <span class="glyph" title="">&#8617;</span> </td> <tr id="entity-larrlp"><td> <code title="">larrlp;</code> </td> <td> U+021AB </td> <td> <span class="glyph" title="">&#8619;</span> </td> <tr id="entity-larrpl"><td> <code title="">larrpl;</code> </td> <td> U+02939 </td> <td> <span class="glyph" title="">&#10553;</span> </td> <tr id="entity-larrsim"><td> <code title="">larrsim;</code> </td> <td> U+02973 </td> <td> <span class="glyph" title="">&#10611;</span> </td> <tr id="entity-larrtl"><td> <code title="">larrtl;</code> </td> <td> U+021A2 </td> <td> <span class="glyph" title="">&#8610;</span> </td> <tr id="entity-lat"><td> <code title="">lat;</code> </td> <td> U+02AAB </td> <td> <span class="glyph" title="">&#10923;</span> </td> <tr id="entity-latail"><td> <code title="">latail;</code> </td> <td> U+02919 </td> <td> <span class="glyph" title="">&#10521;</span> </td> <tr id="entity-late"><td> <code title="">late;</code> </td> <td> U+02AAD </td> <td> <span class="glyph" title="">&#10925;</span> </td> <tr id="entity-lates"><td> <code title="">lates;</code> </td> <td> U+02AAD U+0FE00 </td> <td> <span class="glyph compound" title="">&#10925;&#65024;</span> </td> <tr id="entity-lbarr"><td> <code title="">lbarr;</code> </td> <td> U+0290C </td> <td> <span class="glyph" title="">&#10508;</span> </td> <tr id="entity-lbbrk"><td> <code title="">lbbrk;</code> </td> <td> U+02772 </td> <td> <span class="glyph" title="">&#10098;</span> </td> <tr id="entity-lbrace"><td> <code title="">lbrace;</code> </td> <td> U+0007B </td> <td> <span class="glyph" title="">{</span> </td> <tr id="entity-lbrack"><td> <code title="">lbrack;</code> </td> <td> U+0005B </td> <td> <span class="glyph" title="">[</span> </td> <tr id="entity-lbrke"><td> <code title="">lbrke;</code> </td> <td> U+0298B </td> <td> <span class="glyph" title="">&#10635;</span> </td> <tr id="entity-lbrksld"><td> <code title="">lbrksld;</code> </td> <td> U+0298F </td> <td> <span class="glyph" title="">&#10639;</span> </td> <tr id="entity-lbrkslu"><td> <code title="">lbrkslu;</code> </td> <td> U+0298D </td> <td> <span class="glyph" title="">&#10637;</span> </td> <tr id="entity-lcaron"><td> <code title="">lcaron;</code> </td> <td> U+0013E </td> <td> <span class="glyph" title="">&#318;</span> </td> <tr id="entity-lcedil"><td> <code title="">lcedil;</code> </td> <td> U+0013C </td> <td> <span class="glyph" title="">&#316;</span> </td> <tr id="entity-lceil"><td> <code title="">lceil;</code> </td> <td> U+02308 </td> <td> <span class="glyph" title="">&lceil;</span> </td> <tr id="entity-lcub"><td> <code title="">lcub;</code> </td> <td> U+0007B </td> <td> <span class="glyph" title="">{</span> </td> <tr id="entity-lcy"><td> <code title="">lcy;</code> </td> <td> U+0043B </td> <td> <span class="glyph" title="">&#1083;</span> </td> <tr id="entity-ldca"><td> <code title="">ldca;</code> </td> <td> U+02936 </td> <td> <span class="glyph" title="">&#10550;</span> </td> <tr id="entity-ldquo"><td> <code title="">ldquo;</code> </td> <td> U+0201C </td> <td> <span class="glyph" title="">&ldquo;</span> </td> <tr id="entity-ldquor"><td> <code title="">ldquor;</code> </td> <td> U+0201E </td> <td> <span class="glyph" title="">&bdquo;</span> </td> <tr id="entity-ldrdhar"><td> <code title="">ldrdhar;</code> </td> <td> U+02967 </td> <td> <span class="glyph" title="">&#10599;</span> </td> <tr id="entity-ldrushar"><td> <code title="">ldrushar;</code> </td> <td> U+0294B </td> <td> <span class="glyph" title="">&#10571;</span> </td> <tr id="entity-ldsh"><td> <code title="">ldsh;</code> </td> <td> U+021B2 </td> <td> <span class="glyph" title="">&#8626;</span> </td> <tr id="entity-le"><td> <code title="">le;</code> </td> <td> U+02264 </td> <td> <span class="glyph" title="">&le;</span> </td> <tr id="entity-leftarrow"><td> <code title="">leftarrow;</code> </td> <td> U+02190 </td> <td> <span class="glyph" title="">&larr;</span> </td> <tr id="entity-leftarrowtail"><td> <code title="">leftarrowtail;</code> </td> <td> U+021A2 </td> <td> <span class="glyph" title="">&#8610;</span> </td> <tr id="entity-leftharpoondown"><td> <code title="">leftharpoondown;</code> </td> <td> U+021BD </td> <td> <span class="glyph" title="">&#8637;</span> </td> <tr id="entity-leftharpoonup"><td> <code title="">leftharpoonup;</code> </td> <td> U+021BC </td> <td> <span class="glyph" title="">&#8636;</span> </td> <tr id="entity-leftleftarrows"><td> <code title="">leftleftarrows;</code> </td> <td> U+021C7 </td> <td> <span class="glyph" title="">&#8647;</span> </td> <tr id="entity-leftrightarrow"><td> <code title="">leftrightarrow;</code> </td> <td> U+02194 </td> <td> <span class="glyph" title="">&harr;</span> </td> <tr id="entity-leftrightarrows"><td> <code title="">leftrightarrows;</code> </td> <td> U+021C6 </td> <td> <span class="glyph" title="">&#8646;</span> </td> <tr id="entity-leftrightharpoons"><td> <code title="">leftrightharpoons;</code> </td> <td> U+021CB </td> <td> <span class="glyph" title="">&#8651;</span> </td> <tr id="entity-leftrightsquigarrow"><td> <code title="">leftrightsquigarrow;</code> </td> <td> U+021AD </td> <td> <span class="glyph" title="">&#8621;</span> </td> <tr id="entity-leftthreetimes"><td> <code title="">leftthreetimes;</code> </td> <td> U+022CB </td> <td> <span class="glyph" title="">&#8907;</span> </td> <tr id="entity-leg"><td> <code title="">leg;</code> </td> <td> U+022DA </td> <td> <span class="glyph" title="">&#8922;</span> </td> <tr id="entity-leq"><td> <code title="">leq;</code> </td> <td> U+02264 </td> <td> <span class="glyph" title="">&le;</span> </td> <tr id="entity-leqq"><td> <code title="">leqq;</code> </td> <td> U+02266 </td> <td> <span class="glyph" title="">&#8806;</span> </td> <tr id="entity-leqslant"><td> <code title="">leqslant;</code> </td> <td> U+02A7D </td> <td> <span class="glyph" title="">&#10877;</span> </td> <tr id="entity-les"><td> <code title="">les;</code> </td> <td> U+02A7D </td> <td> <span class="glyph" title="">&#10877;</span> </td> <tr id="entity-lescc"><td> <code title="">lescc;</code> </td> <td> U+02AA8 </td> <td> <span class="glyph" title="">&#10920;</span> </td> <tr id="entity-lesdot"><td> <code title="">lesdot;</code> </td> <td> U+02A7F </td> <td> <span class="glyph" title="">&#10879;</span> </td> <tr id="entity-lesdoto"><td> <code title="">lesdoto;</code> </td> <td> U+02A81 </td> <td> <span class="glyph" title="">&#10881;</span> </td> <tr id="entity-lesdotor"><td> <code title="">lesdotor;</code> </td> <td> U+02A83 </td> <td> <span class="glyph" title="">&#10883;</span> </td> <tr id="entity-lesg"><td> <code title="">lesg;</code> </td> <td> U+022DA U+0FE00 </td> <td> <span class="glyph compound" title="">&#8922;&#65024;</span> </td> <tr id="entity-lesges"><td> <code title="">lesges;</code> </td> <td> U+02A93 </td> <td> <span class="glyph" title="">&#10899;</span> </td> <tr id="entity-lessapprox"><td> <code title="">lessapprox;</code> </td> <td> U+02A85 </td> <td> <span class="glyph" title="">&#10885;</span> </td> <tr id="entity-lessdot"><td> <code title="">lessdot;</code> </td> <td> U+022D6 </td> <td> <span class="glyph" title="">&#8918;</span> </td> <tr id="entity-lesseqgtr"><td> <code title="">lesseqgtr;</code> </td> <td> U+022DA </td> <td> <span class="glyph" title="">&#8922;</span> </td> <tr id="entity-lesseqqgtr"><td> <code title="">lesseqqgtr;</code> </td> <td> U+02A8B </td> <td> <span class="glyph" title="">&#10891;</span> </td> <tr id="entity-lessgtr"><td> <code title="">lessgtr;</code> </td> <td> U+02276 </td> <td> <span class="glyph" title="">&#8822;</span> </td> <tr id="entity-lesssim"><td> <code title="">lesssim;</code> </td> <td> U+02272 </td> <td> <span class="glyph" title="">&#8818;</span> </td> <tr id="entity-lfisht"><td> <code title="">lfisht;</code> </td> <td> U+0297C </td> <td> <span class="glyph" title="">&#10620;</span> </td> <tr id="entity-lfloor"><td> <code title="">lfloor;</code> </td> <td> U+0230A </td> <td> <span class="glyph" title="">&lfloor;</span> </td> <tr id="entity-lfr"><td> <code title="">lfr;</code> </td> <td> U+1D529 </td> <td> <span class="glyph" title="">&#120105;</span> </td> <tr id="entity-lg"><td> <code title="">lg;</code> </td> <td> U+02276 </td> <td> <span class="glyph" title="">&#8822;</span> </td> <tr id="entity-lgE"><td> <code title="">lgE;</code> </td> <td> U+02A91 </td> <td> <span class="glyph" title="">&#10897;</span> </td> <tr id="entity-lhard"><td> <code title="">lhard;</code> </td> <td> U+021BD </td> <td> <span class="glyph" title="">&#8637;</span> </td> <tr id="entity-lharu"><td> <code title="">lharu;</code> </td> <td> U+021BC </td> <td> <span class="glyph" title="">&#8636;</span> </td> <tr id="entity-lharul"><td> <code title="">lharul;</code> </td> <td> U+0296A </td> <td> <span class="glyph" title="">&#10602;</span> </td> <tr id="entity-lhblk"><td> <code title="">lhblk;</code> </td> <td> U+02584 </td> <td> <span class="glyph" title="">&#9604;</span> </td> <tr id="entity-ljcy"><td> <code title="">ljcy;</code> </td> <td> U+00459 </td> <td> <span class="glyph" title="">&#1113;</span> </td> <tr id="entity-ll"><td> <code title="">ll;</code> </td> <td> U+0226A </td> <td> <span class="glyph" title="">&#8810;</span> </td> <tr id="entity-llarr"><td> <code title="">llarr;</code> </td> <td> U+021C7 </td> <td> <span class="glyph" title="">&#8647;</span> </td> <tr id="entity-llcorner"><td> <code title="">llcorner;</code> </td> <td> U+0231E </td> <td> <span class="glyph" title="">&#8990;</span> </td> <tr id="entity-llhard"><td> <code title="">llhard;</code> </td> <td> U+0296B </td> <td> <span class="glyph" title="">&#10603;</span> </td> <tr id="entity-lltri"><td> <code title="">lltri;</code> </td> <td> U+025FA </td> <td> <span class="glyph" title="">&#9722;</span> </td> <tr id="entity-lmidot"><td> <code title="">lmidot;</code> </td> <td> U+00140 </td> <td> <span class="glyph" title="">&#320;</span> </td> <tr id="entity-lmoust"><td> <code title="">lmoust;</code> </td> <td> U+023B0 </td> <td> <span class="glyph" title="">&#9136;</span> </td> <tr id="entity-lmoustache"><td> <code title="">lmoustache;</code> </td> <td> U+023B0 </td> <td> <span class="glyph" title="">&#9136;</span> </td> <tr id="entity-lnE"><td> <code title="">lnE;</code> </td> <td> U+02268 </td> <td> <span class="glyph" title="">&#8808;</span> </td> <tr id="entity-lnap"><td> <code title="">lnap;</code> </td> <td> U+02A89 </td> <td> <span class="glyph" title="">&#10889;</span> </td> <tr id="entity-lnapprox"><td> <code title="">lnapprox;</code> </td> <td> U+02A89 </td> <td> <span class="glyph" title="">&#10889;</span> </td> <tr id="entity-lne"><td> <code title="">lne;</code> </td> <td> U+02A87 </td> <td> <span class="glyph" title="">&#10887;</span> </td> <tr id="entity-lneq"><td> <code title="">lneq;</code> </td> <td> U+02A87 </td> <td> <span class="glyph" title="">&#10887;</span> </td> <tr id="entity-lneqq"><td> <code title="">lneqq;</code> </td> <td> U+02268 </td> <td> <span class="glyph" title="">&#8808;</span> </td> <tr id="entity-lnsim"><td> <code title="">lnsim;</code> </td> <td> U+022E6 </td> <td> <span class="glyph" title="">&#8934;</span> </td> <tr id="entity-loang"><td> <code title="">loang;</code> </td> <td> U+027EC </td> <td> <span class="glyph" title="">&#10220;</span> </td> <tr id="entity-loarr"><td> <code title="">loarr;</code> </td> <td> U+021FD </td> <td> <span class="glyph" title="">&#8701;</span> </td> <tr id="entity-lobrk"><td> <code title="">lobrk;</code> </td> <td> U+027E6 </td> <td> <span class="glyph" title="">&#10214;</span> </td> <tr id="entity-longleftarrow"><td> <code title="">longleftarrow;</code> </td> <td> U+027F5 </td> <td> <span class="glyph" title="">&#10229;</span> </td> <tr id="entity-longleftrightarrow"><td> <code title="">longleftrightarrow;</code> </td> <td> U+027F7 </td> <td> <span class="glyph" title="">&#10231;</span> </td> <tr id="entity-longmapsto"><td> <code title="">longmapsto;</code> </td> <td> U+027FC </td> <td> <span class="glyph" title="">&#10236;</span> </td> <tr id="entity-longrightarrow"><td> <code title="">longrightarrow;</code> </td> <td> U+027F6 </td> <td> <span class="glyph" title="">&#10230;</span> </td> <tr id="entity-looparrowleft"><td> <code title="">looparrowleft;</code> </td> <td> U+021AB </td> <td> <span class="glyph" title="">&#8619;</span> </td> <tr id="entity-looparrowright"><td> <code title="">looparrowright;</code> </td> <td> U+021AC </td> <td> <span class="glyph" title="">&#8620;</span> </td> <tr id="entity-lopar"><td> <code title="">lopar;</code> </td> <td> U+02985 </td> <td> <span class="glyph" title="">&#10629;</span> </td> <tr id="entity-lopf"><td> <code title="">lopf;</code> </td> <td> U+1D55D </td> <td> <span class="glyph" title="">&#120157;</span> </td> <tr id="entity-loplus"><td> <code title="">loplus;</code> </td> <td> U+02A2D </td> <td> <span class="glyph" title="">&#10797;</span> </td> <tr id="entity-lotimes"><td> <code title="">lotimes;</code> </td> <td> U+02A34 </td> <td> <span class="glyph" title="">&#10804;</span> </td> <tr id="entity-lowast"><td> <code title="">lowast;</code> </td> <td> U+02217 </td> <td> <span class="glyph" title="">&lowast;</span> </td> <tr id="entity-lowbar"><td> <code title="">lowbar;</code> </td> <td> U+0005F </td> <td> <span class="glyph" title="">_</span> </td> <tr id="entity-loz"><td> <code title="">loz;</code> </td> <td> U+025CA </td> <td> <span class="glyph" title="">&loz;</span> </td> <tr id="entity-lozenge"><td> <code title="">lozenge;</code> </td> <td> U+025CA </td> <td> <span class="glyph" title="">&loz;</span> </td> <tr id="entity-lozf"><td> <code title="">lozf;</code> </td> <td> U+029EB </td> <td> <span class="glyph" title="">&#10731;</span> </td> <tr id="entity-lpar"><td> <code title="">lpar;</code> </td> <td> U+00028 </td> <td> <span class="glyph" title="">(</span> </td> <tr id="entity-lparlt"><td> <code title="">lparlt;</code> </td> <td> U+02993 </td> <td> <span class="glyph" title="">&#10643;</span> </td> <tr id="entity-lrarr"><td> <code title="">lrarr;</code> </td> <td> U+021C6 </td> <td> <span class="glyph" title="">&#8646;</span> </td> <tr id="entity-lrcorner"><td> <code title="">lrcorner;</code> </td> <td> U+0231F </td> <td> <span class="glyph" title="">&#8991;</span> </td> <tr id="entity-lrhar"><td> <code title="">lrhar;</code> </td> <td> U+021CB </td> <td> <span class="glyph" title="">&#8651;</span> </td> <tr id="entity-lrhard"><td> <code title="">lrhard;</code> </td> <td> U+0296D </td> <td> <span class="glyph" title="">&#10605;</span> </td> <tr id="entity-lrm"><td> <code title="">lrm;</code> </td> <td> U+0200E </td> <td> <span class="glyph" title="">&lrm;</span> </td> <tr id="entity-lrtri"><td> <code title="">lrtri;</code> </td> <td> U+022BF </td> <td> <span class="glyph" title="">&#8895;</span> </td> <tr id="entity-lsaquo"><td> <code title="">lsaquo;</code> </td> <td> U+02039 </td> <td> <span class="glyph" title="">&lsaquo;</span> </td> <tr id="entity-lscr"><td> <code title="">lscr;</code> </td> <td> U+1D4C1 </td> <td> <span class="glyph" title="">&#120001;</span> </td> <tr id="entity-lsh"><td> <code title="">lsh;</code> </td> <td> U+021B0 </td> <td> <span class="glyph" title="">&#8624;</span> </td> <tr id="entity-lsim"><td> <code title="">lsim;</code> </td> <td> U+02272 </td> <td> <span class="glyph" title="">&#8818;</span> </td> <tr id="entity-lsime"><td> <code title="">lsime;</code> </td> <td> U+02A8D </td> <td> <span class="glyph" title="">&#10893;</span> </td> <tr id="entity-lsimg"><td> <code title="">lsimg;</code> </td> <td> U+02A8F </td> <td> <span class="glyph" title="">&#10895;</span> </td> <tr id="entity-lsqb"><td> <code title="">lsqb;</code> </td> <td> U+0005B </td> <td> <span class="glyph" title="">[</span> </td> <tr id="entity-lsquo"><td> <code title="">lsquo;</code> </td> <td> U+02018 </td> <td> <span class="glyph" title="">&lsquo;</span> </td> <tr id="entity-lsquor"><td> <code title="">lsquor;</code> </td> <td> U+0201A </td> <td> <span class="glyph" title="">&sbquo;</span> </td> <tr id="entity-lstrok"><td> <code title="">lstrok;</code> </td> <td> U+00142 </td> <td> <span class="glyph" title="">&#322;</span> </td> <tr id="entity-lt"><td> <code title="">lt;</code> </td> <td> U+0003C </td> <td> <span class="glyph" title="">&lt;</span> </td> <tr id="entity-ltcc"><td> <code title="">ltcc;</code> </td> <td> U+02AA6 </td> <td> <span class="glyph" title="">&#10918;</span> </td> <tr id="entity-ltcir"><td> <code title="">ltcir;</code> </td> <td> U+02A79 </td> <td> <span class="glyph" title="">&#10873;</span> </td> <tr id="entity-ltdot"><td> <code title="">ltdot;</code> </td> <td> U+022D6 </td> <td> <span class="glyph" title="">&#8918;</span> </td> <tr id="entity-lthree"><td> <code title="">lthree;</code> </td> <td> U+022CB </td> <td> <span class="glyph" title="">&#8907;</span> </td> <tr id="entity-ltimes"><td> <code title="">ltimes;</code> </td> <td> U+022C9 </td> <td> <span class="glyph" title="">&#8905;</span> </td> <tr id="entity-ltlarr"><td> <code title="">ltlarr;</code> </td> <td> U+02976 </td> <td> <span class="glyph" title="">&#10614;</span> </td> <tr id="entity-ltquest"><td> <code title="">ltquest;</code> </td> <td> U+02A7B </td> <td> <span class="glyph" title="">&#10875;</span> </td> <tr id="entity-ltrPar"><td> <code title="">ltrPar;</code> </td> <td> U+02996 </td> <td> <span class="glyph" title="">&#10646;</span> </td> <tr id="entity-ltri"><td> <code title="">ltri;</code> </td> <td> U+025C3 </td> <td> <span class="glyph" title="">&#9667;</span> </td> <tr id="entity-ltrie"><td> <code title="">ltrie;</code> </td> <td> U+022B4 </td> <td> <span class="glyph" title="">&#8884;</span> </td> <tr id="entity-ltrif"><td> <code title="">ltrif;</code> </td> <td> U+025C2 </td> <td> <span class="glyph" title="">&#9666;</span> </td> <tr id="entity-lurdshar"><td> <code title="">lurdshar;</code> </td> <td> U+0294A </td> <td> <span class="glyph" title="">&#10570;</span> </td> <tr id="entity-luruhar"><td> <code title="">luruhar;</code> </td> <td> U+02966 </td> <td> <span class="glyph" title="">&#10598;</span> </td> <tr id="entity-lvertneqq"><td> <code title="">lvertneqq;</code> </td> <td> U+02268 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8808;&#65024;</span> </td> <tr id="entity-lvnE"><td> <code title="">lvnE;</code> </td> <td> U+02268 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8808;&#65024;</span> </td> <tr id="entity-mDDot"><td> <code title="">mDDot;</code> </td> <td> U+0223A </td> <td> <span class="glyph" title="">&#8762;</span> </td> <tr id="entity-macr"><td> <code title="">macr;</code> </td> <td> U+000AF </td> <td> <span class="glyph" title="">&macr;</span> </td> <tr id="entity-male"><td> <code title="">male;</code> </td> <td> U+02642 </td> <td> <span class="glyph" title="">&#9794;</span> </td> <tr id="entity-malt"><td> <code title="">malt;</code> </td> <td> U+02720 </td> <td> <span class="glyph" title="">&#10016;</span> </td> <tr id="entity-maltese"><td> <code title="">maltese;</code> </td> <td> U+02720 </td> <td> <span class="glyph" title="">&#10016;</span> </td> <tr id="entity-map"><td> <code title="">map;</code> </td> <td> U+021A6 </td> <td> <span class="glyph" title="">&#8614;</span> </td> <tr id="entity-mapsto"><td> <code title="">mapsto;</code> </td> <td> U+021A6 </td> <td> <span class="glyph" title="">&#8614;</span> </td> <tr id="entity-mapstodown"><td> <code title="">mapstodown;</code> </td> <td> U+021A7 </td> <td> <span class="glyph" title="">&#8615;</span> </td> <tr id="entity-mapstoleft"><td> <code title="">mapstoleft;</code> </td> <td> U+021A4 </td> <td> <span class="glyph" title="">&#8612;</span> </td> <tr id="entity-mapstoup"><td> <code title="">mapstoup;</code> </td> <td> U+021A5 </td> <td> <span class="glyph" title="">&#8613;</span> </td> <tr id="entity-marker"><td> <code title="">marker;</code> </td> <td> U+025AE </td> <td> <span class="glyph" title="">&#9646;</span> </td> <tr id="entity-mcomma"><td> <code title="">mcomma;</code> </td> <td> U+02A29 </td> <td> <span class="glyph" title="">&#10793;</span> </td> <tr id="entity-mcy"><td> <code title="">mcy;</code> </td> <td> U+0043C </td> <td> <span class="glyph" title="">&#1084;</span> </td> <tr id="entity-mdash"><td> <code title="">mdash;</code> </td> <td> U+02014 </td> <td> <span class="glyph" title="">&mdash;</span> </td> <tr id="entity-measuredangle"><td> <code title="">measuredangle;</code> </td> <td> U+02221 </td> <td> <span class="glyph" title="">&#8737;</span> </td> <tr id="entity-mfr"><td> <code title="">mfr;</code> </td> <td> U+1D52A </td> <td> <span class="glyph" title="">&#120106;</span> </td> <tr id="entity-mho"><td> <code title="">mho;</code> </td> <td> U+02127 </td> <td> <span class="glyph" title="">&#8487;</span> </td> <tr id="entity-micro"><td> <code title="">micro;</code> </td> <td> U+000B5 </td> <td> <span class="glyph" title="">&micro;</span> </td> <tr id="entity-mid"><td> <code title="">mid;</code> </td> <td> U+02223 </td> <td> <span class="glyph" title="">&#8739;</span> </td> <tr id="entity-midast"><td> <code title="">midast;</code> </td> <td> U+0002A </td> <td> <span class="glyph" title="">*</span> </td> <tr id="entity-midcir"><td> <code title="">midcir;</code> </td> <td> U+02AF0 </td> <td> <span class="glyph" title="">&#10992;</span> </td> <tr id="entity-middot"><td> <code title="">middot;</code> </td> <td> U+000B7 </td> <td> <span class="glyph" title="">&middot;</span> </td> <tr id="entity-minus"><td> <code title="">minus;</code> </td> <td> U+02212 </td> <td> <span class="glyph" title="">&minus;</span> </td> <tr id="entity-minusb"><td> <code title="">minusb;</code> </td> <td> U+0229F </td> <td> <span class="glyph" title="">&#8863;</span> </td> <tr id="entity-minusd"><td> <code title="">minusd;</code> </td> <td> U+02238 </td> <td> <span class="glyph" title="">&#8760;</span> </td> <tr id="entity-minusdu"><td> <code title="">minusdu;</code> </td> <td> U+02A2A </td> <td> <span class="glyph" title="">&#10794;</span> </td> <tr id="entity-mlcp"><td> <code title="">mlcp;</code> </td> <td> U+02ADB </td> <td> <span class="glyph" title="">&#10971;</span> </td> <tr id="entity-mldr"><td> <code title="">mldr;</code> </td> <td> U+02026 </td> <td> <span class="glyph" title="">&hellip;</span> </td> <tr id="entity-mnplus"><td> <code title="">mnplus;</code> </td> <td> U+02213 </td> <td> <span class="glyph" title="">&#8723;</span> </td> <tr id="entity-models"><td> <code title="">models;</code> </td> <td> U+022A7 </td> <td> <span class="glyph" title="">&#8871;</span> </td> <tr id="entity-mopf"><td> <code title="">mopf;</code> </td> <td> U+1D55E </td> <td> <span class="glyph" title="">&#120158;</span> </td> <tr id="entity-mp"><td> <code title="">mp;</code> </td> <td> U+02213 </td> <td> <span class="glyph" title="">&#8723;</span> </td> <tr id="entity-mscr"><td> <code title="">mscr;</code> </td> <td> U+1D4C2 </td> <td> <span class="glyph" title="">&#120002;</span> </td> <tr id="entity-mstpos"><td> <code title="">mstpos;</code> </td> <td> U+0223E </td> <td> <span class="glyph" title="">&#8766;</span> </td> <tr id="entity-mu"><td> <code title="">mu;</code> </td> <td> U+003BC </td> <td> <span class="glyph" title="">&mu;</span> </td> <tr id="entity-multimap"><td> <code title="">multimap;</code> </td> <td> U+022B8 </td> <td> <span class="glyph" title="">&#8888;</span> </td> <tr id="entity-mumap"><td> <code title="">mumap;</code> </td> <td> U+022B8 </td> <td> <span class="glyph" title="">&#8888;</span> </td> <tr id="entity-nGg"><td> <code title="">nGg;</code> </td> <td> U+022D9 U+00338 </td> <td> <span class="glyph compound" title="">&#8921;&#824;</span> </td> <tr id="entity-nGt"><td> <code title="">nGt;</code> </td> <td> U+0226B U+020D2 </td> <td> <span class="glyph compound" title="">&#8811;&#8402;</span> </td> <tr id="entity-nGtv"><td> <code title="">nGtv;</code> </td> <td> U+0226B U+00338 </td> <td> <span class="glyph compound" title="">&#8811;&#824;</span> </td> <tr id="entity-nLeftarrow"><td> <code title="">nLeftarrow;</code> </td> <td> U+021CD </td> <td> <span class="glyph" title="">&#8653;</span> </td> <tr id="entity-nLeftrightarrow"><td> <code title="">nLeftrightarrow;</code> </td> <td> U+021CE </td> <td> <span class="glyph" title="">&#8654;</span> </td> <tr id="entity-nLl"><td> <code title="">nLl;</code> </td> <td> U+022D8 U+00338 </td> <td> <span class="glyph compound" title="">&#8920;&#824;</span> </td> <tr id="entity-nLt"><td> <code title="">nLt;</code> </td> <td> U+0226A U+020D2 </td> <td> <span class="glyph compound" title="">&#8810;&#8402;</span> </td> <tr id="entity-nLtv"><td> <code title="">nLtv;</code> </td> <td> U+0226A U+00338 </td> <td> <span class="glyph compound" title="">&#8810;&#824;</span> </td> <tr id="entity-nRightarrow"><td> <code title="">nRightarrow;</code> </td> <td> U+021CF </td> <td> <span class="glyph" title="">&#8655;</span> </td> <tr id="entity-nVDash"><td> <code title="">nVDash;</code> </td> <td> U+022AF </td> <td> <span class="glyph" title="">&#8879;</span> </td> <tr id="entity-nVdash"><td> <code title="">nVdash;</code> </td> <td> U+022AE </td> <td> <span class="glyph" title="">&#8878;</span> </td> <tr id="entity-nabla"><td> <code title="">nabla;</code> </td> <td> U+02207 </td> <td> <span class="glyph" title="">&nabla;</span> </td> <tr id="entity-nacute"><td> <code title="">nacute;</code> </td> <td> U+00144 </td> <td> <span class="glyph" title="">&#324;</span> </td> <tr id="entity-nang"><td> <code title="">nang;</code> </td> <td> U+02220 U+020D2 </td> <td> <span class="glyph compound" title="">&ang;&#8402;</span> </td> <tr id="entity-nap"><td> <code title="">nap;</code> </td> <td> U+02249 </td> <td> <span class="glyph" title="">&#8777;</span> </td> <tr id="entity-napE"><td> <code title="">napE;</code> </td> <td> U+02A70 U+00338 </td> <td> <span class="glyph compound" title="">&#10864;&#824;</span> </td> <tr id="entity-napid"><td> <code title="">napid;</code> </td> <td> U+0224B U+00338 </td> <td> <span class="glyph compound" title="">&#8779;&#824;</span> </td> <tr id="entity-napos"><td> <code title="">napos;</code> </td> <td> U+00149 </td> <td> <span class="glyph" title="">&#329;</span> </td> <tr id="entity-napprox"><td> <code title="">napprox;</code> </td> <td> U+02249 </td> <td> <span class="glyph" title="">&#8777;</span> </td> <tr id="entity-natur"><td> <code title="">natur;</code> </td> <td> U+0266E </td> <td> <span class="glyph" title="">&#9838;</span> </td> <tr id="entity-natural"><td> <code title="">natural;</code> </td> <td> U+0266E </td> <td> <span class="glyph" title="">&#9838;</span> </td> <tr id="entity-naturals"><td> <code title="">naturals;</code> </td> <td> U+02115 </td> <td> <span class="glyph" title="">&#8469;</span> </td> <tr id="entity-nbsp"><td> <code title="">nbsp;</code> </td> <td> U+000A0 </td> <td> <span class="glyph" title="">&nbsp;</span> </td> <tr id="entity-nbump"><td> <code title="">nbump;</code> </td> <td> U+0224E U+00338 </td> <td> <span class="glyph compound" title="">&#8782;&#824;</span> </td> <tr id="entity-nbumpe"><td> <code title="">nbumpe;</code> </td> <td> U+0224F U+00338 </td> <td> <span class="glyph compound" title="">&#8783;&#824;</span> </td> <tr id="entity-ncap"><td> <code title="">ncap;</code> </td> <td> U+02A43 </td> <td> <span class="glyph" title="">&#10819;</span> </td> <tr id="entity-ncaron"><td> <code title="">ncaron;</code> </td> <td> U+00148 </td> <td> <span class="glyph" title="">&#328;</span> </td> <tr id="entity-ncedil"><td> <code title="">ncedil;</code> </td> <td> U+00146 </td> <td> <span class="glyph" title="">&#326;</span> </td> <tr id="entity-ncong"><td> <code title="">ncong;</code> </td> <td> U+02247 </td> <td> <span class="glyph" title="">&#8775;</span> </td> <tr id="entity-ncongdot"><td> <code title="">ncongdot;</code> </td> <td> U+02A6D U+00338 </td> <td> <span class="glyph compound" title="">&#10861;&#824;</span> </td> <tr id="entity-ncup"><td> <code title="">ncup;</code> </td> <td> U+02A42 </td> <td> <span class="glyph" title="">&#10818;</span> </td> <tr id="entity-ncy"><td> <code title="">ncy;</code> </td> <td> U+0043D </td> <td> <span class="glyph" title="">&#1085;</span> </td> <tr id="entity-ndash"><td> <code title="">ndash;</code> </td> <td> U+02013 </td> <td> <span class="glyph" title="">&ndash;</span> </td> <tr id="entity-ne"><td> <code title="">ne;</code> </td> <td> U+02260 </td> <td> <span class="glyph" title="">&ne;</span> </td> <tr id="entity-neArr"><td> <code title="">neArr;</code> </td> <td> U+021D7 </td> <td> <span class="glyph" title="">&#8663;</span> </td> <tr id="entity-nearhk"><td> <code title="">nearhk;</code> </td> <td> U+02924 </td> <td> <span class="glyph" title="">&#10532;</span> </td> <tr id="entity-nearr"><td> <code title="">nearr;</code> </td> <td> U+02197 </td> <td> <span class="glyph" title="">&#8599;</span> </td> <tr id="entity-nearrow"><td> <code title="">nearrow;</code> </td> <td> U+02197 </td> <td> <span class="glyph" title="">&#8599;</span> </td> <tr id="entity-nedot"><td> <code title="">nedot;</code> </td> <td> U+02250 U+00338 </td> <td> <span class="glyph compound" title="">&#8784;&#824;</span> </td> <tr id="entity-nequiv"><td> <code title="">nequiv;</code> </td> <td> U+02262 </td> <td> <span class="glyph" title="">&#8802;</span> </td> <tr id="entity-nesear"><td> <code title="">nesear;</code> </td> <td> U+02928 </td> <td> <span class="glyph" title="">&#10536;</span> </td> <tr id="entity-nesim"><td> <code title="">nesim;</code> </td> <td> U+02242 U+00338 </td> <td> <span class="glyph compound" title="">&#8770;&#824;</span> </td> <tr id="entity-nexist"><td> <code title="">nexist;</code> </td> <td> U+02204 </td> <td> <span class="glyph" title="">&#8708;</span> </td> <tr id="entity-nexists"><td> <code title="">nexists;</code> </td> <td> U+02204 </td> <td> <span class="glyph" title="">&#8708;</span> </td> <tr id="entity-nfr"><td> <code title="">nfr;</code> </td> <td> U+1D52B </td> <td> <span class="glyph" title="">&#120107;</span> </td> <tr id="entity-ngE"><td> <code title="">ngE;</code> </td> <td> U+02267 U+00338 </td> <td> <span class="glyph compound" title="">&#8807;&#824;</span> </td> <tr id="entity-nge"><td> <code title="">nge;</code> </td> <td> U+02271 </td> <td> <span class="glyph" title="">&#8817;</span> </td> <tr id="entity-ngeq"><td> <code title="">ngeq;</code> </td> <td> U+02271 </td> <td> <span class="glyph" title="">&#8817;</span> </td> <tr id="entity-ngeqq"><td> <code title="">ngeqq;</code> </td> <td> U+02267 U+00338 </td> <td> <span class="glyph compound" title="">&#8807;&#824;</span> </td> <tr id="entity-ngeqslant"><td> <code title="">ngeqslant;</code> </td> <td> U+02A7E U+00338 </td> <td> <span class="glyph compound" title="">&#10878;&#824;</span> </td> <tr id="entity-nges"><td> <code title="">nges;</code> </td> <td> U+02A7E U+00338 </td> <td> <span class="glyph compound" title="">&#10878;&#824;</span> </td> <tr id="entity-ngsim"><td> <code title="">ngsim;</code> </td> <td> U+02275 </td> <td> <span class="glyph" title="">&#8821;</span> </td> <tr id="entity-ngt"><td> <code title="">ngt;</code> </td> <td> U+0226F </td> <td> <span class="glyph" title="">&#8815;</span> </td> <tr id="entity-ngtr"><td> <code title="">ngtr;</code> </td> <td> U+0226F </td> <td> <span class="glyph" title="">&#8815;</span> </td> <tr id="entity-nhArr"><td> <code title="">nhArr;</code> </td> <td> U+021CE </td> <td> <span class="glyph" title="">&#8654;</span> </td> <tr id="entity-nharr"><td> <code title="">nharr;</code> </td> <td> U+021AE </td> <td> <span class="glyph" title="">&#8622;</span> </td> <tr id="entity-nhpar"><td> <code title="">nhpar;</code> </td> <td> U+02AF2 </td> <td> <span class="glyph" title="">&#10994;</span> </td> <tr id="entity-ni"><td> <code title="">ni;</code> </td> <td> U+0220B </td> <td> <span class="glyph" title="">&ni;</span> </td> <tr id="entity-nis"><td> <code title="">nis;</code> </td> <td> U+022FC </td> <td> <span class="glyph" title="">&#8956;</span> </td> <tr id="entity-nisd"><td> <code title="">nisd;</code> </td> <td> U+022FA </td> <td> <span class="glyph" title="">&#8954;</span> </td> <tr id="entity-niv"><td> <code title="">niv;</code> </td> <td> U+0220B </td> <td> <span class="glyph" title="">&ni;</span> </td> <tr id="entity-njcy"><td> <code title="">njcy;</code> </td> <td> U+0045A </td> <td> <span class="glyph" title="">&#1114;</span> </td> <tr id="entity-nlArr"><td> <code title="">nlArr;</code> </td> <td> U+021CD </td> <td> <span class="glyph" title="">&#8653;</span> </td> <tr id="entity-nlE"><td> <code title="">nlE;</code> </td> <td> U+02266 U+00338 </td> <td> <span class="glyph compound" title="">&#8806;&#824;</span> </td> <tr id="entity-nlarr"><td> <code title="">nlarr;</code> </td> <td> U+0219A </td> <td> <span class="glyph" title="">&#8602;</span> </td> <tr id="entity-nldr"><td> <code title="">nldr;</code> </td> <td> U+02025 </td> <td> <span class="glyph" title="">&#8229;</span> </td> <tr id="entity-nle"><td> <code title="">nle;</code> </td> <td> U+02270 </td> <td> <span class="glyph" title="">&#8816;</span> </td> <tr id="entity-nleftarrow"><td> <code title="">nleftarrow;</code> </td> <td> U+0219A </td> <td> <span class="glyph" title="">&#8602;</span> </td> <tr id="entity-nleftrightarrow"><td> <code title="">nleftrightarrow;</code> </td> <td> U+021AE </td> <td> <span class="glyph" title="">&#8622;</span> </td> <tr id="entity-nleq"><td> <code title="">nleq;</code> </td> <td> U+02270 </td> <td> <span class="glyph" title="">&#8816;</span> </td> <tr id="entity-nleqq"><td> <code title="">nleqq;</code> </td> <td> U+02266 U+00338 </td> <td> <span class="glyph compound" title="">&#8806;&#824;</span> </td> <tr id="entity-nleqslant"><td> <code title="">nleqslant;</code> </td> <td> U+02A7D U+00338 </td> <td> <span class="glyph compound" title="">&#10877;&#824;</span> </td> <tr id="entity-nles"><td> <code title="">nles;</code> </td> <td> U+02A7D U+00338 </td> <td> <span class="glyph compound" title="">&#10877;&#824;</span> </td> <tr id="entity-nless"><td> <code title="">nless;</code> </td> <td> U+0226E </td> <td> <span class="glyph" title="">&#8814;</span> </td> <tr id="entity-nlsim"><td> <code title="">nlsim;</code> </td> <td> U+02274 </td> <td> <span class="glyph" title="">&#8820;</span> </td> <tr id="entity-nlt"><td> <code title="">nlt;</code> </td> <td> U+0226E </td> <td> <span class="glyph" title="">&#8814;</span> </td> <tr id="entity-nltri"><td> <code title="">nltri;</code> </td> <td> U+022EA </td> <td> <span class="glyph" title="">&#8938;</span> </td> <tr id="entity-nltrie"><td> <code title="">nltrie;</code> </td> <td> U+022EC </td> <td> <span class="glyph" title="">&#8940;</span> </td> <tr id="entity-nmid"><td> <code title="">nmid;</code> </td> <td> U+02224 </td> <td> <span class="glyph" title="">&#8740;</span> </td> <tr id="entity-nopf"><td> <code title="">nopf;</code> </td> <td> U+1D55F </td> <td> <span class="glyph" title="">&#120159;</span> </td> <tr id="entity-not"><td> <code title="">not;</code> </td> <td> U+000AC </td> <td> <span class="glyph" title="">&not;</span> </td> <tr id="entity-notin"><td> <code title="">notin;</code> </td> <td> U+02209 </td> <td> <span class="glyph" title="">&notin;</span> </td> <tr id="entity-notinE"><td> <code title="">notinE;</code> </td> <td> U+022F9 U+00338 </td> <td> <span class="glyph compound" title="">&#8953;&#824;</span> </td> <tr id="entity-notindot"><td> <code title="">notindot;</code> </td> <td> U+022F5 U+00338 </td> <td> <span class="glyph compound" title="">&#8949;&#824;</span> </td> <tr id="entity-notinva"><td> <code title="">notinva;</code> </td> <td> U+02209 </td> <td> <span class="glyph" title="">&notin;</span> </td> <tr id="entity-notinvb"><td> <code title="">notinvb;</code> </td> <td> U+022F7 </td> <td> <span class="glyph" title="">&#8951;</span> </td> <tr id="entity-notinvc"><td> <code title="">notinvc;</code> </td> <td> U+022F6 </td> <td> <span class="glyph" title="">&#8950;</span> </td> <tr id="entity-notni"><td> <code title="">notni;</code> </td> <td> U+0220C </td> <td> <span class="glyph" title="">&#8716;</span> </td> <tr id="entity-notniva"><td> <code title="">notniva;</code> </td> <td> U+0220C </td> <td> <span class="glyph" title="">&#8716;</span> </td> <tr id="entity-notnivb"><td> <code title="">notnivb;</code> </td> <td> U+022FE </td> <td> <span class="glyph" title="">&#8958;</span> </td> <tr id="entity-notnivc"><td> <code title="">notnivc;</code> </td> <td> U+022FD </td> <td> <span class="glyph" title="">&#8957;</span> </td> <tr id="entity-npar"><td> <code title="">npar;</code> </td> <td> U+02226 </td> <td> <span class="glyph" title="">&#8742;</span> </td> <tr id="entity-nparallel"><td> <code title="">nparallel;</code> </td> <td> U+02226 </td> <td> <span class="glyph" title="">&#8742;</span> </td> <tr id="entity-nparsl"><td> <code title="">nparsl;</code> </td> <td> U+02AFD U+020E5 </td> <td> <span class="glyph compound" title="">&#11005;&#8421;</span> </td> <tr id="entity-npart"><td> <code title="">npart;</code> </td> <td> U+02202 U+00338 </td> <td> <span class="glyph compound" title="">&part;&#824;</span> </td> <tr id="entity-npolint"><td> <code title="">npolint;</code> </td> <td> U+02A14 </td> <td> <span class="glyph" title="">&#10772;</span> </td> <tr id="entity-npr"><td> <code title="">npr;</code> </td> <td> U+02280 </td> <td> <span class="glyph" title="">&#8832;</span> </td> <tr id="entity-nprcue"><td> <code title="">nprcue;</code> </td> <td> U+022E0 </td> <td> <span class="glyph" title="">&#8928;</span> </td> <tr id="entity-npre"><td> <code title="">npre;</code> </td> <td> U+02AAF U+00338 </td> <td> <span class="glyph compound" title="">&#10927;&#824;</span> </td> <tr id="entity-nprec"><td> <code title="">nprec;</code> </td> <td> U+02280 </td> <td> <span class="glyph" title="">&#8832;</span> </td> <tr id="entity-npreceq"><td> <code title="">npreceq;</code> </td> <td> U+02AAF U+00338 </td> <td> <span class="glyph compound" title="">&#10927;&#824;</span> </td> <tr id="entity-nrArr"><td> <code title="">nrArr;</code> </td> <td> U+021CF </td> <td> <span class="glyph" title="">&#8655;</span> </td> <tr id="entity-nrarr"><td> <code title="">nrarr;</code> </td> <td> U+0219B </td> <td> <span class="glyph" title="">&#8603;</span> </td> <tr id="entity-nrarrc"><td> <code title="">nrarrc;</code> </td> <td> U+02933 U+00338 </td> <td> <span class="glyph compound" title="">&#10547;&#824;</span> </td> <tr id="entity-nrarrw"><td> <code title="">nrarrw;</code> </td> <td> U+0219D U+00338 </td> <td> <span class="glyph compound" title="">&#8605;&#824;</span> </td> <tr id="entity-nrightarrow"><td> <code title="">nrightarrow;</code> </td> <td> U+0219B </td> <td> <span class="glyph" title="">&#8603;</span> </td> <tr id="entity-nrtri"><td> <code title="">nrtri;</code> </td> <td> U+022EB </td> <td> <span class="glyph" title="">&#8939;</span> </td> <tr id="entity-nrtrie"><td> <code title="">nrtrie;</code> </td> <td> U+022ED </td> <td> <span class="glyph" title="">&#8941;</span> </td> <tr id="entity-nsc"><td> <code title="">nsc;</code> </td> <td> U+02281 </td> <td> <span class="glyph" title="">&#8833;</span> </td> <tr id="entity-nsccue"><td> <code title="">nsccue;</code> </td> <td> U+022E1 </td> <td> <span class="glyph" title="">&#8929;</span> </td> <tr id="entity-nsce"><td> <code title="">nsce;</code> </td> <td> U+02AB0 U+00338 </td> <td> <span class="glyph compound" title="">&#10928;&#824;</span> </td> <tr id="entity-nscr"><td> <code title="">nscr;</code> </td> <td> U+1D4C3 </td> <td> <span class="glyph" title="">&#120003;</span> </td> <tr id="entity-nshortmid"><td> <code title="">nshortmid;</code> </td> <td> U+02224 </td> <td> <span class="glyph" title="">&#8740;</span> </td> <tr id="entity-nshortparallel"><td> <code title="">nshortparallel;</code> </td> <td> U+02226 </td> <td> <span class="glyph" title="">&#8742;</span> </td> <tr id="entity-nsim"><td> <code title="">nsim;</code> </td> <td> U+02241 </td> <td> <span class="glyph" title="">&#8769;</span> </td> <tr id="entity-nsime"><td> <code title="">nsime;</code> </td> <td> U+02244 </td> <td> <span class="glyph" title="">&#8772;</span> </td> <tr id="entity-nsimeq"><td> <code title="">nsimeq;</code> </td> <td> U+02244 </td> <td> <span class="glyph" title="">&#8772;</span> </td> <tr id="entity-nsmid"><td> <code title="">nsmid;</code> </td> <td> U+02224 </td> <td> <span class="glyph" title="">&#8740;</span> </td> <tr id="entity-nspar"><td> <code title="">nspar;</code> </td> <td> U+02226 </td> <td> <span class="glyph" title="">&#8742;</span> </td> <tr id="entity-nsqsube"><td> <code title="">nsqsube;</code> </td> <td> U+022E2 </td> <td> <span class="glyph" title="">&#8930;</span> </td> <tr id="entity-nsqsupe"><td> <code title="">nsqsupe;</code> </td> <td> U+022E3 </td> <td> <span class="glyph" title="">&#8931;</span> </td> <tr id="entity-nsub"><td> <code title="">nsub;</code> </td> <td> U+02284 </td> <td> <span class="glyph" title="">&nsub;</span> </td> <tr id="entity-nsubE"><td> <code title="">nsubE;</code> </td> <td> U+02AC5 U+00338 </td> <td> <span class="glyph compound" title="">&#10949;&#824;</span> </td> <tr id="entity-nsube"><td> <code title="">nsube;</code> </td> <td> U+02288 </td> <td> <span class="glyph" title="">&#8840;</span> </td> <tr id="entity-nsubset"><td> <code title="">nsubset;</code> </td> <td> U+02282 U+020D2 </td> <td> <span class="glyph compound" title="">&sub;&#8402;</span> </td> <tr id="entity-nsubseteq"><td> <code title="">nsubseteq;</code> </td> <td> U+02288 </td> <td> <span class="glyph" title="">&#8840;</span> </td> <tr id="entity-nsubseteqq"><td> <code title="">nsubseteqq;</code> </td> <td> U+02AC5 U+00338 </td> <td> <span class="glyph compound" title="">&#10949;&#824;</span> </td> <tr id="entity-nsucc"><td> <code title="">nsucc;</code> </td> <td> U+02281 </td> <td> <span class="glyph" title="">&#8833;</span> </td> <tr id="entity-nsucceq"><td> <code title="">nsucceq;</code> </td> <td> U+02AB0 U+00338 </td> <td> <span class="glyph compound" title="">&#10928;&#824;</span> </td> <tr id="entity-nsup"><td> <code title="">nsup;</code> </td> <td> U+02285 </td> <td> <span class="glyph" title="">&#8837;</span> </td> <tr id="entity-nsupE"><td> <code title="">nsupE;</code> </td> <td> U+02AC6 U+00338 </td> <td> <span class="glyph compound" title="">&#10950;&#824;</span> </td> <tr id="entity-nsupe"><td> <code title="">nsupe;</code> </td> <td> U+02289 </td> <td> <span class="glyph" title="">&#8841;</span> </td> <tr id="entity-nsupset"><td> <code title="">nsupset;</code> </td> <td> U+02283 U+020D2 </td> <td> <span class="glyph compound" title="">&sup;&#8402;</span> </td> <tr id="entity-nsupseteq"><td> <code title="">nsupseteq;</code> </td> <td> U+02289 </td> <td> <span class="glyph" title="">&#8841;</span> </td> <tr id="entity-nsupseteqq"><td> <code title="">nsupseteqq;</code> </td> <td> U+02AC6 U+00338 </td> <td> <span class="glyph compound" title="">&#10950;&#824;</span> </td> <tr id="entity-ntgl"><td> <code title="">ntgl;</code> </td> <td> U+02279 </td> <td> <span class="glyph" title="">&#8825;</span> </td> <tr id="entity-ntilde"><td> <code title="">ntilde;</code> </td> <td> U+000F1 </td> <td> <span class="glyph" title="">&ntilde;</span> </td> <tr id="entity-ntlg"><td> <code title="">ntlg;</code> </td> <td> U+02278 </td> <td> <span class="glyph" title="">&#8824;</span> </td> <tr id="entity-ntriangleleft"><td> <code title="">ntriangleleft;</code> </td> <td> U+022EA </td> <td> <span class="glyph" title="">&#8938;</span> </td> <tr id="entity-ntrianglelefteq"><td> <code title="">ntrianglelefteq;</code> </td> <td> U+022EC </td> <td> <span class="glyph" title="">&#8940;</span> </td> <tr id="entity-ntriangleright"><td> <code title="">ntriangleright;</code> </td> <td> U+022EB </td> <td> <span class="glyph" title="">&#8939;</span> </td> <tr id="entity-ntrianglerighteq"><td> <code title="">ntrianglerighteq;</code> </td> <td> U+022ED </td> <td> <span class="glyph" title="">&#8941;</span> </td> <tr id="entity-nu"><td> <code title="">nu;</code> </td> <td> U+003BD </td> <td> <span class="glyph" title="">&nu;</span> </td> <tr id="entity-num"><td> <code title="">num;</code> </td> <td> U+00023 </td> <td> <span class="glyph" title="">#</span> </td> <tr id="entity-numero"><td> <code title="">numero;</code> </td> <td> U+02116 </td> <td> <span class="glyph" title="">&#8470;</span> </td> <tr id="entity-numsp"><td> <code title="">numsp;</code> </td> <td> U+02007 </td> <td> <span class="glyph" title="">&#8199;</span> </td> <tr id="entity-nvDash"><td> <code title="">nvDash;</code> </td> <td> U+022AD </td> <td> <span class="glyph" title="">&#8877;</span> </td> <tr id="entity-nvHarr"><td> <code title="">nvHarr;</code> </td> <td> U+02904 </td> <td> <span class="glyph" title="">&#10500;</span> </td> <tr id="entity-nvap"><td> <code title="">nvap;</code> </td> <td> U+0224D U+020D2 </td> <td> <span class="glyph compound" title="">&#8781;&#8402;</span> </td> <tr id="entity-nvdash"><td> <code title="">nvdash;</code> </td> <td> U+022AC </td> <td> <span class="glyph" title="">&#8876;</span> </td> <tr id="entity-nvge"><td> <code title="">nvge;</code> </td> <td> U+02265 U+020D2 </td> <td> <span class="glyph compound" title="">&ge;&#8402;</span> </td> <tr id="entity-nvgt"><td> <code title="">nvgt;</code> </td> <td> U+0003E U+020D2 </td> <td> <span class="glyph compound" title="">&gt;&#8402;</span> </td> <tr id="entity-nvinfin"><td> <code title="">nvinfin;</code> </td> <td> U+029DE </td> <td> <span class="glyph" title="">&#10718;</span> </td> <tr id="entity-nvlArr"><td> <code title="">nvlArr;</code> </td> <td> U+02902 </td> <td> <span class="glyph" title="">&#10498;</span> </td> <tr id="entity-nvle"><td> <code title="">nvle;</code> </td> <td> U+02264 U+020D2 </td> <td> <span class="glyph compound" title="">&le;&#8402;</span> </td> <tr id="entity-nvlt"><td> <code title="">nvlt;</code> </td> <td> U+0003C U+020D2 </td> <td> <span class="glyph compound" title="">&lt;&#8402;</span> </td> <tr id="entity-nvltrie"><td> <code title="">nvltrie;</code> </td> <td> U+022B4 U+020D2 </td> <td> <span class="glyph compound" title="">&#8884;&#8402;</span> </td> <tr id="entity-nvrArr"><td> <code title="">nvrArr;</code> </td> <td> U+02903 </td> <td> <span class="glyph" title="">&#10499;</span> </td> <tr id="entity-nvrtrie"><td> <code title="">nvrtrie;</code> </td> <td> U+022B5 U+020D2 </td> <td> <span class="glyph compound" title="">&#8885;&#8402;</span> </td> <tr id="entity-nvsim"><td> <code title="">nvsim;</code> </td> <td> U+0223C U+020D2 </td> <td> <span class="glyph compound" title="">&sim;&#8402;</span> </td> <tr id="entity-nwArr"><td> <code title="">nwArr;</code> </td> <td> U+021D6 </td> <td> <span class="glyph" title="">&#8662;</span> </td> <tr id="entity-nwarhk"><td> <code title="">nwarhk;</code> </td> <td> U+02923 </td> <td> <span class="glyph" title="">&#10531;</span> </td> <tr id="entity-nwarr"><td> <code title="">nwarr;</code> </td> <td> U+02196 </td> <td> <span class="glyph" title="">&#8598;</span> </td> <tr id="entity-nwarrow"><td> <code title="">nwarrow;</code> </td> <td> U+02196 </td> <td> <span class="glyph" title="">&#8598;</span> </td> <tr id="entity-nwnear"><td> <code title="">nwnear;</code> </td> <td> U+02927 </td> <td> <span class="glyph" title="">&#10535;</span> </td> <tr id="entity-oS"><td> <code title="">oS;</code> </td> <td> U+024C8 </td> <td> <span class="glyph" title="">&#9416;</span> </td> <tr id="entity-oacute"><td> <code title="">oacute;</code> </td> <td> U+000F3 </td> <td> <span class="glyph" title="">&oacute;</span> </td> <tr id="entity-oast"><td> <code title="">oast;</code> </td> <td> U+0229B </td> <td> <span class="glyph" title="">&#8859;</span> </td> <tr id="entity-ocir"><td> <code title="">ocir;</code> </td> <td> U+0229A </td> <td> <span class="glyph" title="">&#8858;</span> </td> <tr id="entity-ocirc"><td> <code title="">ocirc;</code> </td> <td> U+000F4 </td> <td> <span class="glyph" title="">&ocirc;</span> </td> <tr id="entity-ocy"><td> <code title="">ocy;</code> </td> <td> U+0043E </td> <td> <span class="glyph" title="">&#1086;</span> </td> <tr id="entity-odash"><td> <code title="">odash;</code> </td> <td> U+0229D </td> <td> <span class="glyph" title="">&#8861;</span> </td> <tr id="entity-odblac"><td> <code title="">odblac;</code> </td> <td> U+00151 </td> <td> <span class="glyph" title="">&#337;</span> </td> <tr id="entity-odiv"><td> <code title="">odiv;</code> </td> <td> U+02A38 </td> <td> <span class="glyph" title="">&#10808;</span> </td> <tr id="entity-odot"><td> <code title="">odot;</code> </td> <td> U+02299 </td> <td> <span class="glyph" title="">&#8857;</span> </td> <tr id="entity-odsold"><td> <code title="">odsold;</code> </td> <td> U+029BC </td> <td> <span class="glyph" title="">&#10684;</span> </td> <tr id="entity-oelig"><td> <code title="">oelig;</code> </td> <td> U+00153 </td> <td> <span class="glyph" title="">&oelig;</span> </td> <tr id="entity-ofcir"><td> <code title="">ofcir;</code> </td> <td> U+029BF </td> <td> <span class="glyph" title="">&#10687;</span> </td> <tr id="entity-ofr"><td> <code title="">ofr;</code> </td> <td> U+1D52C </td> <td> <span class="glyph" title="">&#120108;</span> </td> <tr id="entity-ogon"><td> <code title="">ogon;</code> </td> <td> U+002DB </td> <td> <span class="glyph" title="">&#731;</span> </td> <tr id="entity-ograve"><td> <code title="">ograve;</code> </td> <td> U+000F2 </td> <td> <span class="glyph" title="">&ograve;</span> </td> <tr id="entity-ogt"><td> <code title="">ogt;</code> </td> <td> U+029C1 </td> <td> <span class="glyph" title="">&#10689;</span> </td> <tr id="entity-ohbar"><td> <code title="">ohbar;</code> </td> <td> U+029B5 </td> <td> <span class="glyph" title="">&#10677;</span> </td> <tr id="entity-ohm"><td> <code title="">ohm;</code> </td> <td> U+003A9 </td> <td> <span class="glyph" title="">&Omega;</span> </td> <tr id="entity-oint"><td> <code title="">oint;</code> </td> <td> U+0222E </td> <td> <span class="glyph" title="">&#8750;</span> </td> <tr id="entity-olarr"><td> <code title="">olarr;</code> </td> <td> U+021BA </td> <td> <span class="glyph" title="">&#8634;</span> </td> <tr id="entity-olcir"><td> <code title="">olcir;</code> </td> <td> U+029BE </td> <td> <span class="glyph" title="">&#10686;</span> </td> <tr id="entity-olcross"><td> <code title="">olcross;</code> </td> <td> U+029BB </td> <td> <span class="glyph" title="">&#10683;</span> </td> <tr id="entity-oline"><td> <code title="">oline;</code> </td> <td> U+0203E </td> <td> <span class="glyph" title="">&oline;</span> </td> <tr id="entity-olt"><td> <code title="">olt;</code> </td> <td> U+029C0 </td> <td> <span class="glyph" title="">&#10688;</span> </td> <tr id="entity-omacr"><td> <code title="">omacr;</code> </td> <td> U+0014D </td> <td> <span class="glyph" title="">&#333;</span> </td> <tr id="entity-omega"><td> <code title="">omega;</code> </td> <td> U+003C9 </td> <td> <span class="glyph" title="">&omega;</span> </td> <tr id="entity-omicron"><td> <code title="">omicron;</code> </td> <td> U+003BF </td> <td> <span class="glyph" title="">&omicron;</span> </td> <tr id="entity-omid"><td> <code title="">omid;</code> </td> <td> U+029B6 </td> <td> <span class="glyph" title="">&#10678;</span> </td> <tr id="entity-ominus"><td> <code title="">ominus;</code> </td> <td> U+02296 </td> <td> <span class="glyph" title="">&#8854;</span> </td> <tr id="entity-oopf"><td> <code title="">oopf;</code> </td> <td> U+1D560 </td> <td> <span class="glyph" title="">&#120160;</span> </td> <tr id="entity-opar"><td> <code title="">opar;</code> </td> <td> U+029B7 </td> <td> <span class="glyph" title="">&#10679;</span> </td> <tr id="entity-operp"><td> <code title="">operp;</code> </td> <td> U+029B9 </td> <td> <span class="glyph" title="">&#10681;</span> </td> <tr id="entity-oplus"><td> <code title="">oplus;</code> </td> <td> U+02295 </td> <td> <span class="glyph" title="">&oplus;</span> </td> <tr id="entity-or"><td> <code title="">or;</code> </td> <td> U+02228 </td> <td> <span class="glyph" title="">&or;</span> </td> <tr id="entity-orarr"><td> <code title="">orarr;</code> </td> <td> U+021BB </td> <td> <span class="glyph" title="">&#8635;</span> </td> <tr id="entity-ord"><td> <code title="">ord;</code> </td> <td> U+02A5D </td> <td> <span class="glyph" title="">&#10845;</span> </td> <tr id="entity-order"><td> <code title="">order;</code> </td> <td> U+02134 </td> <td> <span class="glyph" title="">&#8500;</span> </td> <tr id="entity-orderof"><td> <code title="">orderof;</code> </td> <td> U+02134 </td> <td> <span class="glyph" title="">&#8500;</span> </td> <tr id="entity-ordf"><td> <code title="">ordf;</code> </td> <td> U+000AA </td> <td> <span class="glyph" title="">&ordf;</span> </td> <tr id="entity-ordm"><td> <code title="">ordm;</code> </td> <td> U+000BA </td> <td> <span class="glyph" title="">&ordm;</span> </td> <tr id="entity-origof"><td> <code title="">origof;</code> </td> <td> U+022B6 </td> <td> <span class="glyph" title="">&#8886;</span> </td> <tr id="entity-oror"><td> <code title="">oror;</code> </td> <td> U+02A56 </td> <td> <span class="glyph" title="">&#10838;</span> </td> <tr id="entity-orslope"><td> <code title="">orslope;</code> </td> <td> U+02A57 </td> <td> <span class="glyph" title="">&#10839;</span> </td> <tr id="entity-orv"><td> <code title="">orv;</code> </td> <td> U+02A5B </td> <td> <span class="glyph" title="">&#10843;</span> </td> <tr id="entity-oscr"><td> <code title="">oscr;</code> </td> <td> U+02134 </td> <td> <span class="glyph" title="">&#8500;</span> </td> <tr id="entity-oslash"><td> <code title="">oslash;</code> </td> <td> U+000F8 </td> <td> <span class="glyph" title="">&oslash;</span> </td> <tr id="entity-osol"><td> <code title="">osol;</code> </td> <td> U+02298 </td> <td> <span class="glyph" title="">&#8856;</span> </td> <tr id="entity-otilde"><td> <code title="">otilde;</code> </td> <td> U+000F5 </td> <td> <span class="glyph" title="">&otilde;</span> </td> <tr id="entity-otimes"><td> <code title="">otimes;</code> </td> <td> U+02297 </td> <td> <span class="glyph" title="">&otimes;</span> </td> <tr id="entity-otimesas"><td> <code title="">otimesas;</code> </td> <td> U+02A36 </td> <td> <span class="glyph" title="">&#10806;</span> </td> <tr id="entity-ouml"><td> <code title="">ouml;</code> </td> <td> U+000F6 </td> <td> <span class="glyph" title="">&ouml;</span> </td> <tr id="entity-ovbar"><td> <code title="">ovbar;</code> </td> <td> U+0233D </td> <td> <span class="glyph" title="">&#9021;</span> </td> <tr id="entity-par"><td> <code title="">par;</code> </td> <td> U+02225 </td> <td> <span class="glyph" title="">&#8741;</span> </td> <tr id="entity-para"><td> <code title="">para;</code> </td> <td> U+000B6 </td> <td> <span class="glyph" title="">&para;</span> </td> <tr id="entity-parallel"><td> <code title="">parallel;</code> </td> <td> U+02225 </td> <td> <span class="glyph" title="">&#8741;</span> </td> <tr id="entity-parsim"><td> <code title="">parsim;</code> </td> <td> U+02AF3 </td> <td> <span class="glyph" title="">&#10995;</span> </td> <tr id="entity-parsl"><td> <code title="">parsl;</code> </td> <td> U+02AFD </td> <td> <span class="glyph" title="">&#11005;</span> </td> <tr id="entity-part"><td> <code title="">part;</code> </td> <td> U+02202 </td> <td> <span class="glyph" title="">&part;</span> </td> <tr id="entity-pcy"><td> <code title="">pcy;</code> </td> <td> U+0043F </td> <td> <span class="glyph" title="">&#1087;</span> </td> <tr id="entity-percnt"><td> <code title="">percnt;</code> </td> <td> U+00025 </td> <td> <span class="glyph" title="">%</span> </td> <tr id="entity-period"><td> <code title="">period;</code> </td> <td> U+0002E </td> <td> <span class="glyph" title="">.</span> </td> <tr id="entity-permil"><td> <code title="">permil;</code> </td> <td> U+02030 </td> <td> <span class="glyph" title="">&permil;</span> </td> <tr id="entity-perp"><td> <code title="">perp;</code> </td> <td> U+022A5 </td> <td> <span class="glyph" title="">&perp;</span> </td> <tr id="entity-pertenk"><td> <code title="">pertenk;</code> </td> <td> U+02031 </td> <td> <span class="glyph" title="">&#8241;</span> </td> <tr id="entity-pfr"><td> <code title="">pfr;</code> </td> <td> U+1D52D </td> <td> <span class="glyph" title="">&#120109;</span> </td> <tr id="entity-phi"><td> <code title="">phi;</code> </td> <td> U+003C6 </td> <td> <span class="glyph" title="">&phi;</span> </td> <tr id="entity-phiv"><td> <code title="">phiv;</code> </td> <td> U+003D5 </td> <td> <span class="glyph" title="">&#981;</span> </td> <tr id="entity-phmmat"><td> <code title="">phmmat;</code> </td> <td> U+02133 </td> <td> <span class="glyph" title="">&#8499;</span> </td> <tr id="entity-phone"><td> <code title="">phone;</code> </td> <td> U+0260E </td> <td> <span class="glyph" title="">&#9742;</span> </td> <tr id="entity-pi"><td> <code title="">pi;</code> </td> <td> U+003C0 </td> <td> <span class="glyph" title="">&pi;</span> </td> <tr id="entity-pitchfork"><td> <code title="">pitchfork;</code> </td> <td> U+022D4 </td> <td> <span class="glyph" title="">&#8916;</span> </td> <tr id="entity-piv"><td> <code title="">piv;</code> </td> <td> U+003D6 </td> <td> <span class="glyph" title="">&piv;</span> </td> <tr id="entity-planck"><td> <code title="">planck;</code> </td> <td> U+0210F </td> <td> <span class="glyph" title="">&#8463;</span> </td> <tr id="entity-planckh"><td> <code title="">planckh;</code> </td> <td> U+0210E </td> <td> <span class="glyph" title="">&#8462;</span> </td> <tr id="entity-plankv"><td> <code title="">plankv;</code> </td> <td> U+0210F </td> <td> <span class="glyph" title="">&#8463;</span> </td> <tr id="entity-plus"><td> <code title="">plus;</code> </td> <td> U+0002B </td> <td> <span class="glyph" title="">+</span> </td> <tr id="entity-plusacir"><td> <code title="">plusacir;</code> </td> <td> U+02A23 </td> <td> <span class="glyph" title="">&#10787;</span> </td> <tr id="entity-plusb"><td> <code title="">plusb;</code> </td> <td> U+0229E </td> <td> <span class="glyph" title="">&#8862;</span> </td> <tr id="entity-pluscir"><td> <code title="">pluscir;</code> </td> <td> U+02A22 </td> <td> <span class="glyph" title="">&#10786;</span> </td> <tr id="entity-plusdo"><td> <code title="">plusdo;</code> </td> <td> U+02214 </td> <td> <span class="glyph" title="">&#8724;</span> </td> <tr id="entity-plusdu"><td> <code title="">plusdu;</code> </td> <td> U+02A25 </td> <td> <span class="glyph" title="">&#10789;</span> </td> <tr id="entity-pluse"><td> <code title="">pluse;</code> </td> <td> U+02A72 </td> <td> <span class="glyph" title="">&#10866;</span> </td> <tr id="entity-plusmn"><td> <code title="">plusmn;</code> </td> <td> U+000B1 </td> <td> <span class="glyph" title="">&plusmn;</span> </td> <tr id="entity-plussim"><td> <code title="">plussim;</code> </td> <td> U+02A26 </td> <td> <span class="glyph" title="">&#10790;</span> </td> <tr id="entity-plustwo"><td> <code title="">plustwo;</code> </td> <td> U+02A27 </td> <td> <span class="glyph" title="">&#10791;</span> </td> <tr id="entity-pm"><td> <code title="">pm;</code> </td> <td> U+000B1 </td> <td> <span class="glyph" title="">&plusmn;</span> </td> <tr id="entity-pointint"><td> <code title="">pointint;</code> </td> <td> U+02A15 </td> <td> <span class="glyph" title="">&#10773;</span> </td> <tr id="entity-popf"><td> <code title="">popf;</code> </td> <td> U+1D561 </td> <td> <span class="glyph" title="">&#120161;</span> </td> <tr id="entity-pound"><td> <code title="">pound;</code> </td> <td> U+000A3 </td> <td> <span class="glyph" title="">&pound;</span> </td> <tr id="entity-pr"><td> <code title="">pr;</code> </td> <td> U+0227A </td> <td> <span class="glyph" title="">&#8826;</span> </td> <tr id="entity-prE"><td> <code title="">prE;</code> </td> <td> U+02AB3 </td> <td> <span class="glyph" title="">&#10931;</span> </td> <tr id="entity-prap"><td> <code title="">prap;</code> </td> <td> U+02AB7 </td> <td> <span class="glyph" title="">&#10935;</span> </td> <tr id="entity-prcue"><td> <code title="">prcue;</code> </td> <td> U+0227C </td> <td> <span class="glyph" title="">&#8828;</span> </td> <tr id="entity-pre"><td> <code title="">pre;</code> </td> <td> U+02AAF </td> <td> <span class="glyph" title="">&#10927;</span> </td> <tr id="entity-prec"><td> <code title="">prec;</code> </td> <td> U+0227A </td> <td> <span class="glyph" title="">&#8826;</span> </td> <tr id="entity-precapprox"><td> <code title="">precapprox;</code> </td> <td> U+02AB7 </td> <td> <span class="glyph" title="">&#10935;</span> </td> <tr id="entity-preccurlyeq"><td> <code title="">preccurlyeq;</code> </td> <td> U+0227C </td> <td> <span class="glyph" title="">&#8828;</span> </td> <tr id="entity-preceq"><td> <code title="">preceq;</code> </td> <td> U+02AAF </td> <td> <span class="glyph" title="">&#10927;</span> </td> <tr id="entity-precnapprox"><td> <code title="">precnapprox;</code> </td> <td> U+02AB9 </td> <td> <span class="glyph" title="">&#10937;</span> </td> <tr id="entity-precneqq"><td> <code title="">precneqq;</code> </td> <td> U+02AB5 </td> <td> <span class="glyph" title="">&#10933;</span> </td> <tr id="entity-precnsim"><td> <code title="">precnsim;</code> </td> <td> U+022E8 </td> <td> <span class="glyph" title="">&#8936;</span> </td> <tr id="entity-precsim"><td> <code title="">precsim;</code> </td> <td> U+0227E </td> <td> <span class="glyph" title="">&#8830;</span> </td> <tr id="entity-prime"><td> <code title="">prime;</code> </td> <td> U+02032 </td> <td> <span class="glyph" title="">&prime;</span> </td> <tr id="entity-primes"><td> <code title="">primes;</code> </td> <td> U+02119 </td> <td> <span class="glyph" title="">&#8473;</span> </td> <tr id="entity-prnE"><td> <code title="">prnE;</code> </td> <td> U+02AB5 </td> <td> <span class="glyph" title="">&#10933;</span> </td> <tr id="entity-prnap"><td> <code title="">prnap;</code> </td> <td> U+02AB9 </td> <td> <span class="glyph" title="">&#10937;</span> </td> <tr id="entity-prnsim"><td> <code title="">prnsim;</code> </td> <td> U+022E8 </td> <td> <span class="glyph" title="">&#8936;</span> </td> <tr id="entity-prod"><td> <code title="">prod;</code> </td> <td> U+0220F </td> <td> <span class="glyph" title="">&prod;</span> </td> <tr id="entity-profalar"><td> <code title="">profalar;</code> </td> <td> U+0232E </td> <td> <span class="glyph" title="">&#9006;</span> </td> <tr id="entity-profline"><td> <code title="">profline;</code> </td> <td> U+02312 </td> <td> <span class="glyph" title="">&#8978;</span> </td> <tr id="entity-profsurf"><td> <code title="">profsurf;</code> </td> <td> U+02313 </td> <td> <span class="glyph" title="">&#8979;</span> </td> <tr id="entity-prop"><td> <code title="">prop;</code> </td> <td> U+0221D </td> <td> <span class="glyph" title="">&prop;</span> </td> <tr id="entity-propto"><td> <code title="">propto;</code> </td> <td> U+0221D </td> <td> <span class="glyph" title="">&prop;</span> </td> <tr id="entity-prsim"><td> <code title="">prsim;</code> </td> <td> U+0227E </td> <td> <span class="glyph" title="">&#8830;</span> </td> <tr id="entity-prurel"><td> <code title="">prurel;</code> </td> <td> U+022B0 </td> <td> <span class="glyph" title="">&#8880;</span> </td> <tr id="entity-pscr"><td> <code title="">pscr;</code> </td> <td> U+1D4C5 </td> <td> <span class="glyph" title="">&#120005;</span> </td> <tr id="entity-psi"><td> <code title="">psi;</code> </td> <td> U+003C8 </td> <td> <span class="glyph" title="">&psi;</span> </td> <tr id="entity-puncsp"><td> <code title="">puncsp;</code> </td> <td> U+02008 </td> <td> <span class="glyph" title="">&#8200;</span> </td> <tr id="entity-qfr"><td> <code title="">qfr;</code> </td> <td> U+1D52E </td> <td> <span class="glyph" title="">&#120110;</span> </td> <tr id="entity-qint"><td> <code title="">qint;</code> </td> <td> U+02A0C </td> <td> <span class="glyph" title="">&#10764;</span> </td> <tr id="entity-qopf"><td> <code title="">qopf;</code> </td> <td> U+1D562 </td> <td> <span class="glyph" title="">&#120162;</span> </td> <tr id="entity-qprime"><td> <code title="">qprime;</code> </td> <td> U+02057 </td> <td> <span class="glyph" title="">&#8279;</span> </td> <tr id="entity-qscr"><td> <code title="">qscr;</code> </td> <td> U+1D4C6 </td> <td> <span class="glyph" title="">&#120006;</span> </td> <tr id="entity-quaternions"><td> <code title="">quaternions;</code> </td> <td> U+0210D </td> <td> <span class="glyph" title="">&#8461;</span> </td> <tr id="entity-quatint"><td> <code title="">quatint;</code> </td> <td> U+02A16 </td> <td> <span class="glyph" title="">&#10774;</span> </td> <tr id="entity-quest"><td> <code title="">quest;</code> </td> <td> U+0003F </td> <td> <span class="glyph" title="">?</span> </td> <tr id="entity-questeq"><td> <code title="">questeq;</code> </td> <td> U+0225F </td> <td> <span class="glyph" title="">&#8799;</span> </td> <tr id="entity-quot"><td> <code title="">quot;</code> </td> <td> U+00022 </td> <td> <span class="glyph" title="">"</span> </td> <tr id="entity-rAarr"><td> <code title="">rAarr;</code> </td> <td> U+021DB </td> <td> <span class="glyph" title="">&#8667;</span> </td> <tr id="entity-rArr"><td> <code title="">rArr;</code> </td> <td> U+021D2 </td> <td> <span class="glyph" title="">&rArr;</span> </td> <tr id="entity-rAtail"><td> <code title="">rAtail;</code> </td> <td> U+0291C </td> <td> <span class="glyph" title="">&#10524;</span> </td> <tr id="entity-rBarr"><td> <code title="">rBarr;</code> </td> <td> U+0290F </td> <td> <span class="glyph" title="">&#10511;</span> </td> <tr id="entity-rHar"><td> <code title="">rHar;</code> </td> <td> U+02964 </td> <td> <span class="glyph" title="">&#10596;</span> </td> <tr id="entity-race"><td> <code title="">race;</code> </td> <td> U+0223D U+00331 </td> <td> <span class="glyph compound" title="">&#8765;&#817;</span> </td> <tr id="entity-racute"><td> <code title="">racute;</code> </td> <td> U+00155 </td> <td> <span class="glyph" title="">&#341;</span> </td> <tr id="entity-radic"><td> <code title="">radic;</code> </td> <td> U+0221A </td> <td> <span class="glyph" title="">&radic;</span> </td> <tr id="entity-raemptyv"><td> <code title="">raemptyv;</code> </td> <td> U+029B3 </td> <td> <span class="glyph" title="">&#10675;</span> </td> <tr id="entity-rang"><td> <code title="">rang;</code> </td> <td> U+027E9 </td> <td> <span class="glyph" title="">&#9002;</span> </td> <tr id="entity-rangd"><td> <code title="">rangd;</code> </td> <td> U+02992 </td> <td> <span class="glyph" title="">&#10642;</span> </td> <tr id="entity-range"><td> <code title="">range;</code> </td> <td> U+029A5 </td> <td> <span class="glyph" title="">&#10661;</span> </td> <tr id="entity-rangle"><td> <code title="">rangle;</code> </td> <td> U+027E9 </td> <td> <span class="glyph" title="">&#9002;</span> </td> <tr id="entity-raquo"><td> <code title="">raquo;</code> </td> <td> U+000BB </td> <td> <span class="glyph" title="">&raquo;</span> </td> <tr id="entity-rarr"><td> <code title="">rarr;</code> </td> <td> U+02192 </td> <td> <span class="glyph" title="">&rarr;</span> </td> <tr id="entity-rarrap"><td> <code title="">rarrap;</code> </td> <td> U+02975 </td> <td> <span class="glyph" title="">&#10613;</span> </td> <tr id="entity-rarrb"><td> <code title="">rarrb;</code> </td> <td> U+021E5 </td> <td> <span class="glyph" title="">&#8677;</span> </td> <tr id="entity-rarrbfs"><td> <code title="">rarrbfs;</code> </td> <td> U+02920 </td> <td> <span class="glyph" title="">&#10528;</span> </td> <tr id="entity-rarrc"><td> <code title="">rarrc;</code> </td> <td> U+02933 </td> <td> <span class="glyph" title="">&#10547;</span> </td> <tr id="entity-rarrfs"><td> <code title="">rarrfs;</code> </td> <td> U+0291E </td> <td> <span class="glyph" title="">&#10526;</span> </td> <tr id="entity-rarrhk"><td> <code title="">rarrhk;</code> </td> <td> U+021AA </td> <td> <span class="glyph" title="">&#8618;</span> </td> <tr id="entity-rarrlp"><td> <code title="">rarrlp;</code> </td> <td> U+021AC </td> <td> <span class="glyph" title="">&#8620;</span> </td> <tr id="entity-rarrpl"><td> <code title="">rarrpl;</code> </td> <td> U+02945 </td> <td> <span class="glyph" title="">&#10565;</span> </td> <tr id="entity-rarrsim"><td> <code title="">rarrsim;</code> </td> <td> U+02974 </td> <td> <span class="glyph" title="">&#10612;</span> </td> <tr id="entity-rarrtl"><td> <code title="">rarrtl;</code> </td> <td> U+021A3 </td> <td> <span class="glyph" title="">&#8611;</span> </td> <tr id="entity-rarrw"><td> <code title="">rarrw;</code> </td> <td> U+0219D </td> <td> <span class="glyph" title="">&#8605;</span> </td> <tr id="entity-ratail"><td> <code title="">ratail;</code> </td> <td> U+0291A </td> <td> <span class="glyph" title="">&#10522;</span> </td> <tr id="entity-ratio"><td> <code title="">ratio;</code> </td> <td> U+02236 </td> <td> <span class="glyph" title="">&#8758;</span> </td> <tr id="entity-rationals"><td> <code title="">rationals;</code> </td> <td> U+0211A </td> <td> <span class="glyph" title="">&#8474;</span> </td> <tr id="entity-rbarr"><td> <code title="">rbarr;</code> </td> <td> U+0290D </td> <td> <span class="glyph" title="">&#10509;</span> </td> <tr id="entity-rbbrk"><td> <code title="">rbbrk;</code> </td> <td> U+02773 </td> <td> <span class="glyph" title="">&#10099;</span> </td> <tr id="entity-rbrace"><td> <code title="">rbrace;</code> </td> <td> U+0007D </td> <td> <span class="glyph" title="">}</span> </td> <tr id="entity-rbrack"><td> <code title="">rbrack;</code> </td> <td> U+0005D </td> <td> <span class="glyph" title="">]</span> </td> <tr id="entity-rbrke"><td> <code title="">rbrke;</code> </td> <td> U+0298C </td> <td> <span class="glyph" title="">&#10636;</span> </td> <tr id="entity-rbrksld"><td> <code title="">rbrksld;</code> </td> <td> U+0298E </td> <td> <span class="glyph" title="">&#10638;</span> </td> <tr id="entity-rbrkslu"><td> <code title="">rbrkslu;</code> </td> <td> U+02990 </td> <td> <span class="glyph" title="">&#10640;</span> </td> <tr id="entity-rcaron"><td> <code title="">rcaron;</code> </td> <td> U+00159 </td> <td> <span class="glyph" title="">&#345;</span> </td> <tr id="entity-rcedil"><td> <code title="">rcedil;</code> </td> <td> U+00157 </td> <td> <span class="glyph" title="">&#343;</span> </td> <tr id="entity-rceil"><td> <code title="">rceil;</code> </td> <td> U+02309 </td> <td> <span class="glyph" title="">&rceil;</span> </td> <tr id="entity-rcub"><td> <code title="">rcub;</code> </td> <td> U+0007D </td> <td> <span class="glyph" title="">}</span> </td> <tr id="entity-rcy"><td> <code title="">rcy;</code> </td> <td> U+00440 </td> <td> <span class="glyph" title="">&#1088;</span> </td> <tr id="entity-rdca"><td> <code title="">rdca;</code> </td> <td> U+02937 </td> <td> <span class="glyph" title="">&#10551;</span> </td> <tr id="entity-rdldhar"><td> <code title="">rdldhar;</code> </td> <td> U+02969 </td> <td> <span class="glyph" title="">&#10601;</span> </td> <tr id="entity-rdquo"><td> <code title="">rdquo;</code> </td> <td> U+0201D </td> <td> <span class="glyph" title="">&rdquo;</span> </td> <tr id="entity-rdquor"><td> <code title="">rdquor;</code> </td> <td> U+0201D </td> <td> <span class="glyph" title="">&rdquo;</span> </td> <tr id="entity-rdsh"><td> <code title="">rdsh;</code> </td> <td> U+021B3 </td> <td> <span class="glyph" title="">&#8627;</span> </td> <tr id="entity-real"><td> <code title="">real;</code> </td> <td> U+0211C </td> <td> <span class="glyph" title="">&real;</span> </td> <tr id="entity-realine"><td> <code title="">realine;</code> </td> <td> U+0211B </td> <td> <span class="glyph" title="">&#8475;</span> </td> <tr id="entity-realpart"><td> <code title="">realpart;</code> </td> <td> U+0211C </td> <td> <span class="glyph" title="">&real;</span> </td> <tr id="entity-reals"><td> <code title="">reals;</code> </td> <td> U+0211D </td> <td> <span class="glyph" title="">&#8477;</span> </td> <tr id="entity-rect"><td> <code title="">rect;</code> </td> <td> U+025AD </td> <td> <span class="glyph" title="">&#9645;</span> </td> <tr id="entity-reg"><td> <code title="">reg;</code> </td> <td> U+000AE </td> <td> <span class="glyph" title="">&reg;</span> </td> <tr id="entity-rfisht"><td> <code title="">rfisht;</code> </td> <td> U+0297D </td> <td> <span class="glyph" title="">&#10621;</span> </td> <tr id="entity-rfloor"><td> <code title="">rfloor;</code> </td> <td> U+0230B </td> <td> <span class="glyph" title="">&rfloor;</span> </td> <tr id="entity-rfr"><td> <code title="">rfr;</code> </td> <td> U+1D52F </td> <td> <span class="glyph" title="">&#120111;</span> </td> <tr id="entity-rhard"><td> <code title="">rhard;</code> </td> <td> U+021C1 </td> <td> <span class="glyph" title="">&#8641;</span> </td> <tr id="entity-rharu"><td> <code title="">rharu;</code> </td> <td> U+021C0 </td> <td> <span class="glyph" title="">&#8640;</span> </td> <tr id="entity-rharul"><td> <code title="">rharul;</code> </td> <td> U+0296C </td> <td> <span class="glyph" title="">&#10604;</span> </td> <tr id="entity-rho"><td> <code title="">rho;</code> </td> <td> U+003C1 </td> <td> <span class="glyph" title="">&rho;</span> </td> <tr id="entity-rhov"><td> <code title="">rhov;</code> </td> <td> U+003F1 </td> <td> <span class="glyph" title="">&#1009;</span> </td> <tr id="entity-rightarrow"><td> <code title="">rightarrow;</code> </td> <td> U+02192 </td> <td> <span class="glyph" title="">&rarr;</span> </td> <tr id="entity-rightarrowtail"><td> <code title="">rightarrowtail;</code> </td> <td> U+021A3 </td> <td> <span class="glyph" title="">&#8611;</span> </td> <tr id="entity-rightharpoondown"><td> <code title="">rightharpoondown;</code> </td> <td> U+021C1 </td> <td> <span class="glyph" title="">&#8641;</span> </td> <tr id="entity-rightharpoonup"><td> <code title="">rightharpoonup;</code> </td> <td> U+021C0 </td> <td> <span class="glyph" title="">&#8640;</span> </td> <tr id="entity-rightleftarrows"><td> <code title="">rightleftarrows;</code> </td> <td> U+021C4 </td> <td> <span class="glyph" title="">&#8644;</span> </td> <tr id="entity-rightleftharpoons"><td> <code title="">rightleftharpoons;</code> </td> <td> U+021CC </td> <td> <span class="glyph" title="">&#8652;</span> </td> <tr id="entity-rightrightarrows"><td> <code title="">rightrightarrows;</code> </td> <td> U+021C9 </td> <td> <span class="glyph" title="">&#8649;</span> </td> <tr id="entity-rightsquigarrow"><td> <code title="">rightsquigarrow;</code> </td> <td> U+0219D </td> <td> <span class="glyph" title="">&#8605;</span> </td> <tr id="entity-rightthreetimes"><td> <code title="">rightthreetimes;</code> </td> <td> U+022CC </td> <td> <span class="glyph" title="">&#8908;</span> </td> <tr id="entity-ring"><td> <code title="">ring;</code> </td> <td> U+002DA </td> <td> <span class="glyph" title="">&#730;</span> </td> <tr id="entity-risingdotseq"><td> <code title="">risingdotseq;</code> </td> <td> U+02253 </td> <td> <span class="glyph" title="">&#8787;</span> </td> <tr id="entity-rlarr"><td> <code title="">rlarr;</code> </td> <td> U+021C4 </td> <td> <span class="glyph" title="">&#8644;</span> </td> <tr id="entity-rlhar"><td> <code title="">rlhar;</code> </td> <td> U+021CC </td> <td> <span class="glyph" title="">&#8652;</span> </td> <tr id="entity-rlm"><td> <code title="">rlm;</code> </td> <td> U+0200F </td> <td> <span class="glyph" title="">&rlm;</span> </td> <tr id="entity-rmoust"><td> <code title="">rmoust;</code> </td> <td> U+023B1 </td> <td> <span class="glyph" title="">&#9137;</span> </td> <tr id="entity-rmoustache"><td> <code title="">rmoustache;</code> </td> <td> U+023B1 </td> <td> <span class="glyph" title="">&#9137;</span> </td> <tr id="entity-rnmid"><td> <code title="">rnmid;</code> </td> <td> U+02AEE </td> <td> <span class="glyph" title="">&#10990;</span> </td> <tr id="entity-roang"><td> <code title="">roang;</code> </td> <td> U+027ED </td> <td> <span class="glyph" title="">&#10221;</span> </td> <tr id="entity-roarr"><td> <code title="">roarr;</code> </td> <td> U+021FE </td> <td> <span class="glyph" title="">&#8702;</span> </td> <tr id="entity-robrk"><td> <code title="">robrk;</code> </td> <td> U+027E7 </td> <td> <span class="glyph" title="">&#10215;</span> </td> <tr id="entity-ropar"><td> <code title="">ropar;</code> </td> <td> U+02986 </td> <td> <span class="glyph" title="">&#10630;</span> </td> <tr id="entity-ropf"><td> <code title="">ropf;</code> </td> <td> U+1D563 </td> <td> <span class="glyph" title="">&#120163;</span> </td> <tr id="entity-roplus"><td> <code title="">roplus;</code> </td> <td> U+02A2E </td> <td> <span class="glyph" title="">&#10798;</span> </td> <tr id="entity-rotimes"><td> <code title="">rotimes;</code> </td> <td> U+02A35 </td> <td> <span class="glyph" title="">&#10805;</span> </td> <tr id="entity-rpar"><td> <code title="">rpar;</code> </td> <td> U+00029 </td> <td> <span class="glyph" title="">)</span> </td> <tr id="entity-rpargt"><td> <code title="">rpargt;</code> </td> <td> U+02994 </td> <td> <span class="glyph" title="">&#10644;</span> </td> <tr id="entity-rppolint"><td> <code title="">rppolint;</code> </td> <td> U+02A12 </td> <td> <span class="glyph" title="">&#10770;</span> </td> <tr id="entity-rrarr"><td> <code title="">rrarr;</code> </td> <td> U+021C9 </td> <td> <span class="glyph" title="">&#8649;</span> </td> <tr id="entity-rsaquo"><td> <code title="">rsaquo;</code> </td> <td> U+0203A </td> <td> <span class="glyph" title="">&rsaquo;</span> </td> <tr id="entity-rscr"><td> <code title="">rscr;</code> </td> <td> U+1D4C7 </td> <td> <span class="glyph" title="">&#120007;</span> </td> <tr id="entity-rsh"><td> <code title="">rsh;</code> </td> <td> U+021B1 </td> <td> <span class="glyph" title="">&#8625;</span> </td> <tr id="entity-rsqb"><td> <code title="">rsqb;</code> </td> <td> U+0005D </td> <td> <span class="glyph" title="">]</span> </td> <tr id="entity-rsquo"><td> <code title="">rsquo;</code> </td> <td> U+02019 </td> <td> <span class="glyph" title="">&rsquo;</span> </td> <tr id="entity-rsquor"><td> <code title="">rsquor;</code> </td> <td> U+02019 </td> <td> <span class="glyph" title="">&rsquo;</span> </td> <tr id="entity-rthree"><td> <code title="">rthree;</code> </td> <td> U+022CC </td> <td> <span class="glyph" title="">&#8908;</span> </td> <tr id="entity-rtimes"><td> <code title="">rtimes;</code> </td> <td> U+022CA </td> <td> <span class="glyph" title="">&#8906;</span> </td> <tr id="entity-rtri"><td> <code title="">rtri;</code> </td> <td> U+025B9 </td> <td> <span class="glyph" title="">&#9657;</span> </td> <tr id="entity-rtrie"><td> <code title="">rtrie;</code> </td> <td> U+022B5 </td> <td> <span class="glyph" title="">&#8885;</span> </td> <tr id="entity-rtrif"><td> <code title="">rtrif;</code> </td> <td> U+025B8 </td> <td> <span class="glyph" title="">&#9656;</span> </td> <tr id="entity-rtriltri"><td> <code title="">rtriltri;</code> </td> <td> U+029CE </td> <td> <span class="glyph" title="">&#10702;</span> </td> <tr id="entity-ruluhar"><td> <code title="">ruluhar;</code> </td> <td> U+02968 </td> <td> <span class="glyph" title="">&#10600;</span> </td> <tr id="entity-rx"><td> <code title="">rx;</code> </td> <td> U+0211E </td> <td> <span class="glyph" title="">&#8478;</span> </td> <tr id="entity-sacute"><td> <code title="">sacute;</code> </td> <td> U+0015B </td> <td> <span class="glyph" title="">&#347;</span> </td> <tr id="entity-sbquo"><td> <code title="">sbquo;</code> </td> <td> U+0201A </td> <td> <span class="glyph" title="">&sbquo;</span> </td> <tr id="entity-sc"><td> <code title="">sc;</code> </td> <td> U+0227B </td> <td> <span class="glyph" title="">&#8827;</span> </td> <tr id="entity-scE"><td> <code title="">scE;</code> </td> <td> U+02AB4 </td> <td> <span class="glyph" title="">&#10932;</span> </td> <tr id="entity-scap"><td> <code title="">scap;</code> </td> <td> U+02AB8 </td> <td> <span class="glyph" title="">&#10936;</span> </td> <tr id="entity-scaron"><td> <code title="">scaron;</code> </td> <td> U+00161 </td> <td> <span class="glyph" title="">&scaron;</span> </td> <tr id="entity-sccue"><td> <code title="">sccue;</code> </td> <td> U+0227D </td> <td> <span class="glyph" title="">&#8829;</span> </td> <tr id="entity-sce"><td> <code title="">sce;</code> </td> <td> U+02AB0 </td> <td> <span class="glyph" title="">&#10928;</span> </td> <tr id="entity-scedil"><td> <code title="">scedil;</code> </td> <td> U+0015F </td> <td> <span class="glyph" title="">&#351;</span> </td> <tr id="entity-scirc"><td> <code title="">scirc;</code> </td> <td> U+0015D </td> <td> <span class="glyph" title="">&#349;</span> </td> <tr id="entity-scnE"><td> <code title="">scnE;</code> </td> <td> U+02AB6 </td> <td> <span class="glyph" title="">&#10934;</span> </td> <tr id="entity-scnap"><td> <code title="">scnap;</code> </td> <td> U+02ABA </td> <td> <span class="glyph" title="">&#10938;</span> </td> <tr id="entity-scnsim"><td> <code title="">scnsim;</code> </td> <td> U+022E9 </td> <td> <span class="glyph" title="">&#8937;</span> </td> <tr id="entity-scpolint"><td> <code title="">scpolint;</code> </td> <td> U+02A13 </td> <td> <span class="glyph" title="">&#10771;</span> </td> <tr id="entity-scsim"><td> <code title="">scsim;</code> </td> <td> U+0227F </td> <td> <span class="glyph" title="">&#8831;</span> </td> <tr id="entity-scy"><td> <code title="">scy;</code> </td> <td> U+00441 </td> <td> <span class="glyph" title="">&#1089;</span> </td> <tr id="entity-sdot"><td> <code title="">sdot;</code> </td> <td> U+022C5 </td> <td> <span class="glyph" title="">&sdot;</span> </td> <tr id="entity-sdotb"><td> <code title="">sdotb;</code> </td> <td> U+022A1 </td> <td> <span class="glyph" title="">&#8865;</span> </td> <tr id="entity-sdote"><td> <code title="">sdote;</code> </td> <td> U+02A66 </td> <td> <span class="glyph" title="">&#10854;</span> </td> <tr id="entity-seArr"><td> <code title="">seArr;</code> </td> <td> U+021D8 </td> <td> <span class="glyph" title="">&#8664;</span> </td> <tr id="entity-searhk"><td> <code title="">searhk;</code> </td> <td> U+02925 </td> <td> <span class="glyph" title="">&#10533;</span> </td> <tr id="entity-searr"><td> <code title="">searr;</code> </td> <td> U+02198 </td> <td> <span class="glyph" title="">&#8600;</span> </td> <tr id="entity-searrow"><td> <code title="">searrow;</code> </td> <td> U+02198 </td> <td> <span class="glyph" title="">&#8600;</span> </td> <tr id="entity-sect"><td> <code title="">sect;</code> </td> <td> U+000A7 </td> <td> <span class="glyph" title="">&sect;</span> </td> <tr id="entity-semi"><td> <code title="">semi;</code> </td> <td> U+0003B </td> <td> <span class="glyph" title="">;</span> </td> <tr id="entity-seswar"><td> <code title="">seswar;</code> </td> <td> U+02929 </td> <td> <span class="glyph" title="">&#10537;</span> </td> <tr id="entity-setminus"><td> <code title="">setminus;</code> </td> <td> U+02216 </td> <td> <span class="glyph" title="">&#8726;</span> </td> <tr id="entity-setmn"><td> <code title="">setmn;</code> </td> <td> U+02216 </td> <td> <span class="glyph" title="">&#8726;</span> </td> <tr id="entity-sext"><td> <code title="">sext;</code> </td> <td> U+02736 </td> <td> <span class="glyph" title="">&#10038;</span> </td> <tr id="entity-sfr"><td> <code title="">sfr;</code> </td> <td> U+1D530 </td> <td> <span class="glyph" title="">&#120112;</span> </td> <tr id="entity-sfrown"><td> <code title="">sfrown;</code> </td> <td> U+02322 </td> <td> <span class="glyph" title="">&#8994;</span> </td> <tr id="entity-sharp"><td> <code title="">sharp;</code> </td> <td> U+0266F </td> <td> <span class="glyph" title="">&#9839;</span> </td> <tr id="entity-shchcy"><td> <code title="">shchcy;</code> </td> <td> U+00449 </td> <td> <span class="glyph" title="">&#1097;</span> </td> <tr id="entity-shcy"><td> <code title="">shcy;</code> </td> <td> U+00448 </td> <td> <span class="glyph" title="">&#1096;</span> </td> <tr id="entity-shortmid"><td> <code title="">shortmid;</code> </td> <td> U+02223 </td> <td> <span class="glyph" title="">&#8739;</span> </td> <tr id="entity-shortparallel"><td> <code title="">shortparallel;</code> </td> <td> U+02225 </td> <td> <span class="glyph" title="">&#8741;</span> </td> <tr id="entity-shy"><td> <code title="">shy;</code> </td> <td> U+000AD </td> <td> <span class="glyph" title="">&shy;</span> </td> <tr id="entity-sigma"><td> <code title="">sigma;</code> </td> <td> U+003C3 </td> <td> <span class="glyph" title="">&sigma;</span> </td> <tr id="entity-sigmaf"><td> <code title="">sigmaf;</code> </td> <td> U+003C2 </td> <td> <span class="glyph" title="">&sigmaf;</span> </td> <tr id="entity-sigmav"><td> <code title="">sigmav;</code> </td> <td> U+003C2 </td> <td> <span class="glyph" title="">&sigmaf;</span> </td> <tr id="entity-sim"><td> <code title="">sim;</code> </td> <td> U+0223C </td> <td> <span class="glyph" title="">&sim;</span> </td> <tr id="entity-simdot"><td> <code title="">simdot;</code> </td> <td> U+02A6A </td> <td> <span class="glyph" title="">&#10858;</span> </td> <tr id="entity-sime"><td> <code title="">sime;</code> </td> <td> U+02243 </td> <td> <span class="glyph" title="">&#8771;</span> </td> <tr id="entity-simeq"><td> <code title="">simeq;</code> </td> <td> U+02243 </td> <td> <span class="glyph" title="">&#8771;</span> </td> <tr id="entity-simg"><td> <code title="">simg;</code> </td> <td> U+02A9E </td> <td> <span class="glyph" title="">&#10910;</span> </td> <tr id="entity-simgE"><td> <code title="">simgE;</code> </td> <td> U+02AA0 </td> <td> <span class="glyph" title="">&#10912;</span> </td> <tr id="entity-siml"><td> <code title="">siml;</code> </td> <td> U+02A9D </td> <td> <span class="glyph" title="">&#10909;</span> </td> <tr id="entity-simlE"><td> <code title="">simlE;</code> </td> <td> U+02A9F </td> <td> <span class="glyph" title="">&#10911;</span> </td> <tr id="entity-simne"><td> <code title="">simne;</code> </td> <td> U+02246 </td> <td> <span class="glyph" title="">&#8774;</span> </td> <tr id="entity-simplus"><td> <code title="">simplus;</code> </td> <td> U+02A24 </td> <td> <span class="glyph" title="">&#10788;</span> </td> <tr id="entity-simrarr"><td> <code title="">simrarr;</code> </td> <td> U+02972 </td> <td> <span class="glyph" title="">&#10610;</span> </td> <tr id="entity-slarr"><td> <code title="">slarr;</code> </td> <td> U+02190 </td> <td> <span class="glyph" title="">&larr;</span> </td> <tr id="entity-smallsetminus"><td> <code title="">smallsetminus;</code> </td> <td> U+02216 </td> <td> <span class="glyph" title="">&#8726;</span> </td> <tr id="entity-smashp"><td> <code title="">smashp;</code> </td> <td> U+02A33 </td> <td> <span class="glyph" title="">&#10803;</span> </td> <tr id="entity-smeparsl"><td> <code title="">smeparsl;</code> </td> <td> U+029E4 </td> <td> <span class="glyph" title="">&#10724;</span> </td> <tr id="entity-smid"><td> <code title="">smid;</code> </td> <td> U+02223 </td> <td> <span class="glyph" title="">&#8739;</span> </td> <tr id="entity-smile"><td> <code title="">smile;</code> </td> <td> U+02323 </td> <td> <span class="glyph" title="">&#8995;</span> </td> <tr id="entity-smt"><td> <code title="">smt;</code> </td> <td> U+02AAA </td> <td> <span class="glyph" title="">&#10922;</span> </td> <tr id="entity-smte"><td> <code title="">smte;</code> </td> <td> U+02AAC </td> <td> <span class="glyph" title="">&#10924;</span> </td> <tr id="entity-smtes"><td> <code title="">smtes;</code> </td> <td> U+02AAC U+0FE00 </td> <td> <span class="glyph compound" title="">&#10924;&#65024;</span> </td> <tr id="entity-softcy"><td> <code title="">softcy;</code> </td> <td> U+0044C </td> <td> <span class="glyph" title="">&#1100;</span> </td> <tr id="entity-sol"><td> <code title="">sol;</code> </td> <td> U+0002F </td> <td> <span class="glyph" title="">/</span> </td> <tr id="entity-solb"><td> <code title="">solb;</code> </td> <td> U+029C4 </td> <td> <span class="glyph" title="">&#10692;</span> </td> <tr id="entity-solbar"><td> <code title="">solbar;</code> </td> <td> U+0233F </td> <td> <span class="glyph" title="">&#9023;</span> </td> <tr id="entity-sopf"><td> <code title="">sopf;</code> </td> <td> U+1D564 </td> <td> <span class="glyph" title="">&#120164;</span> </td> <tr id="entity-spades"><td> <code title="">spades;</code> </td> <td> U+02660 </td> <td> <span class="glyph" title="">&spades;</span> </td> <tr id="entity-spadesuit"><td> <code title="">spadesuit;</code> </td> <td> U+02660 </td> <td> <span class="glyph" title="">&spades;</span> </td> <tr id="entity-spar"><td> <code title="">spar;</code> </td> <td> U+02225 </td> <td> <span class="glyph" title="">&#8741;</span> </td> <tr id="entity-sqcap"><td> <code title="">sqcap;</code> </td> <td> U+02293 </td> <td> <span class="glyph" title="">&#8851;</span> </td> <tr id="entity-sqcaps"><td> <code title="">sqcaps;</code> </td> <td> U+02293 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8851;&#65024;</span> </td> <tr id="entity-sqcup"><td> <code title="">sqcup;</code> </td> <td> U+02294 </td> <td> <span class="glyph" title="">&#8852;</span> </td> <tr id="entity-sqcups"><td> <code title="">sqcups;</code> </td> <td> U+02294 U+0FE00 </td> <td> <span class="glyph compound" title="">&#8852;&#65024;</span> </td> <tr id="entity-sqsub"><td> <code title="">sqsub;</code> </td> <td> U+0228F </td> <td> <span class="glyph" title="">&#8847;</span> </td> <tr id="entity-sqsube"><td> <code title="">sqsube;</code> </td> <td> U+02291 </td> <td> <span class="glyph" title="">&#8849;</span> </td> <tr id="entity-sqsubset"><td> <code title="">sqsubset;</code> </td> <td> U+0228F </td> <td> <span class="glyph" title="">&#8847;</span> </td> <tr id="entity-sqsubseteq"><td> <code title="">sqsubseteq;</code> </td> <td> U+02291 </td> <td> <span class="glyph" title="">&#8849;</span> </td> <tr id="entity-sqsup"><td> <code title="">sqsup;</code> </td> <td> U+02290 </td> <td> <span class="glyph" title="">&#8848;</span> </td> <tr id="entity-sqsupe"><td> <code title="">sqsupe;</code> </td> <td> U+02292 </td> <td> <span class="glyph" title="">&#8850;</span> </td> <tr id="entity-sqsupset"><td> <code title="">sqsupset;</code> </td> <td> U+02290 </td> <td> <span class="glyph" title="">&#8848;</span> </td> <tr id="entity-sqsupseteq"><td> <code title="">sqsupseteq;</code> </td> <td> U+02292 </td> <td> <span class="glyph" title="">&#8850;</span> </td> <tr id="entity-squ"><td> <code title="">squ;</code> </td> <td> U+025A1 </td> <td> <span class="glyph" title="">&#9633;</span> </td> <tr id="entity-square"><td> <code title="">square;</code> </td> <td> U+025A1 </td> <td> <span class="glyph" title="">&#9633;</span> </td> <tr id="entity-squarf"><td> <code title="">squarf;</code> </td> <td> U+025AA </td> <td> <span class="glyph" title="">&#9642;</span> </td> <tr id="entity-squf"><td> <code title="">squf;</code> </td> <td> U+025AA </td> <td> <span class="glyph" title="">&#9642;</span> </td> <tr id="entity-srarr"><td> <code title="">srarr;</code> </td> <td> U+02192 </td> <td> <span class="glyph" title="">&rarr;</span> </td> <tr id="entity-sscr"><td> <code title="">sscr;</code> </td> <td> U+1D4C8 </td> <td> <span class="glyph" title="">&#120008;</span> </td> <tr id="entity-ssetmn"><td> <code title="">ssetmn;</code> </td> <td> U+02216 </td> <td> <span class="glyph" title="">&#8726;</span> </td> <tr id="entity-ssmile"><td> <code title="">ssmile;</code> </td> <td> U+02323 </td> <td> <span class="glyph" title="">&#8995;</span> </td> <tr id="entity-sstarf"><td> <code title="">sstarf;</code> </td> <td> U+022C6 </td> <td> <span class="glyph" title="">&#8902;</span> </td> <tr id="entity-star"><td> <code title="">star;</code> </td> <td> U+02606 </td> <td> <span class="glyph" title="">&#9734;</span> </td> <tr id="entity-starf"><td> <code title="">starf;</code> </td> <td> U+02605 </td> <td> <span class="glyph" title="">&#9733;</span> </td> <tr id="entity-straightepsilon"><td> <code title="">straightepsilon;</code> </td> <td> U+003F5 </td> <td> <span class="glyph" title="">&#1013;</span> </td> <tr id="entity-straightphi"><td> <code title="">straightphi;</code> </td> <td> U+003D5 </td> <td> <span class="glyph" title="">&#981;</span> </td> <tr id="entity-strns"><td> <code title="">strns;</code> </td> <td> U+000AF </td> <td> <span class="glyph" title="">&macr;</span> </td> <tr id="entity-sub"><td> <code title="">sub;</code> </td> <td> U+02282 </td> <td> <span class="glyph" title="">&sub;</span> </td> <tr id="entity-subE"><td> <code title="">subE;</code> </td> <td> U+02AC5 </td> <td> <span class="glyph" title="">&#10949;</span> </td> <tr id="entity-subdot"><td> <code title="">subdot;</code> </td> <td> U+02ABD </td> <td> <span class="glyph" title="">&#10941;</span> </td> <tr id="entity-sube"><td> <code title="">sube;</code> </td> <td> U+02286 </td> <td> <span class="glyph" title="">&sube;</span> </td> <tr id="entity-subedot"><td> <code title="">subedot;</code> </td> <td> U+02AC3 </td> <td> <span class="glyph" title="">&#10947;</span> </td> <tr id="entity-submult"><td> <code title="">submult;</code> </td> <td> U+02AC1 </td> <td> <span class="glyph" title="">&#10945;</span> </td> <tr id="entity-subnE"><td> <code title="">subnE;</code> </td> <td> U+02ACB </td> <td> <span class="glyph" title="">&#10955;</span> </td> <tr id="entity-subne"><td> <code title="">subne;</code> </td> <td> U+0228A </td> <td> <span class="glyph" title="">&#8842;</span> </td> <tr id="entity-subplus"><td> <code title="">subplus;</code> </td> <td> U+02ABF </td> <td> <span class="glyph" title="">&#10943;</span> </td> <tr id="entity-subrarr"><td> <code title="">subrarr;</code> </td> <td> U+02979 </td> <td> <span class="glyph" title="">&#10617;</span> </td> <tr id="entity-subset"><td> <code title="">subset;</code> </td> <td> U+02282 </td> <td> <span class="glyph" title="">&sub;</span> </td> <tr id="entity-subseteq"><td> <code title="">subseteq;</code> </td> <td> U+02286 </td> <td> <span class="glyph" title="">&sube;</span> </td> <tr id="entity-subseteqq"><td> <code title="">subseteqq;</code> </td> <td> U+02AC5 </td> <td> <span class="glyph" title="">&#10949;</span> </td> <tr id="entity-subsetneq"><td> <code title="">subsetneq;</code> </td> <td> U+0228A </td> <td> <span class="glyph" title="">&#8842;</span> </td> <tr id="entity-subsetneqq"><td> <code title="">subsetneqq;</code> </td> <td> U+02ACB </td> <td> <span class="glyph" title="">&#10955;</span> </td> <tr id="entity-subsim"><td> <code title="">subsim;</code> </td> <td> U+02AC7 </td> <td> <span class="glyph" title="">&#10951;</span> </td> <tr id="entity-subsub"><td> <code title="">subsub;</code> </td> <td> U+02AD5 </td> <td> <span class="glyph" title="">&#10965;</span> </td> <tr id="entity-subsup"><td> <code title="">subsup;</code> </td> <td> U+02AD3 </td> <td> <span class="glyph" title="">&#10963;</span> </td> <tr id="entity-succ"><td> <code title="">succ;</code> </td> <td> U+0227B </td> <td> <span class="glyph" title="">&#8827;</span> </td> <tr id="entity-succapprox"><td> <code title="">succapprox;</code> </td> <td> U+02AB8 </td> <td> <span class="glyph" title="">&#10936;</span> </td> <tr id="entity-succcurlyeq"><td> <code title="">succcurlyeq;</code> </td> <td> U+0227D </td> <td> <span class="glyph" title="">&#8829;</span> </td> <tr id="entity-succeq"><td> <code title="">succeq;</code> </td> <td> U+02AB0 </td> <td> <span class="glyph" title="">&#10928;</span> </td> <tr id="entity-succnapprox"><td> <code title="">succnapprox;</code> </td> <td> U+02ABA </td> <td> <span class="glyph" title="">&#10938;</span> </td> <tr id="entity-succneqq"><td> <code title="">succneqq;</code> </td> <td> U+02AB6 </td> <td> <span class="glyph" title="">&#10934;</span> </td> <tr id="entity-succnsim"><td> <code title="">succnsim;</code> </td> <td> U+022E9 </td> <td> <span class="glyph" title="">&#8937;</span> </td> <tr id="entity-succsim"><td> <code title="">succsim;</code> </td> <td> U+0227F </td> <td> <span class="glyph" title="">&#8831;</span> </td> <tr id="entity-sum"><td> <code title="">sum;</code> </td> <td> U+02211 </td> <td> <span class="glyph" title="">&sum;</span> </td> <tr id="entity-sung"><td> <code title="">sung;</code> </td> <td> U+0266A </td> <td> <span class="glyph" title="">&#9834;</span> </td> <tr id="entity-sup"><td> <code title="">sup;</code> </td> <td> U+02283 </td> <td> <span class="glyph" title="">&sup;</span> </td> <tr id="entity-sup1"><td> <code title="">sup1;</code> </td> <td> U+000B9 </td> <td> <span class="glyph" title="">&sup1;</span> </td> <tr id="entity-sup2"><td> <code title="">sup2;</code> </td> <td> U+000B2 </td> <td> <span class="glyph" title="">&sup2;</span> </td> <tr id="entity-sup3"><td> <code title="">sup3;</code> </td> <td> U+000B3 </td> <td> <span class="glyph" title="">&sup3;</span> </td> <tr id="entity-supE"><td> <code title="">supE;</code> </td> <td> U+02AC6 </td> <td> <span class="glyph" title="">&#10950;</span> </td> <tr id="entity-supdot"><td> <code title="">supdot;</code> </td> <td> U+02ABE </td> <td> <span class="glyph" title="">&#10942;</span> </td> <tr id="entity-supdsub"><td> <code title="">supdsub;</code> </td> <td> U+02AD8 </td> <td> <span class="glyph" title="">&#10968;</span> </td> <tr id="entity-supe"><td> <code title="">supe;</code> </td> <td> U+02287 </td> <td> <span class="glyph" title="">&supe;</span> </td> <tr id="entity-supedot"><td> <code title="">supedot;</code> </td> <td> U+02AC4 </td> <td> <span class="glyph" title="">&#10948;</span> </td> <tr id="entity-suphsol"><td> <code title="">suphsol;</code> </td> <td> U+027C9 </td> <td> <span class="glyph" title="">&#10185;</span> </td> <tr id="entity-suphsub"><td> <code title="">suphsub;</code> </td> <td> U+02AD7 </td> <td> <span class="glyph" title="">&#10967;</span> </td> <tr id="entity-suplarr"><td> <code title="">suplarr;</code> </td> <td> U+0297B </td> <td> <span class="glyph" title="">&#10619;</span> </td> <tr id="entity-supmult"><td> <code title="">supmult;</code> </td> <td> U+02AC2 </td> <td> <span class="glyph" title="">&#10946;</span> </td> <tr id="entity-supnE"><td> <code title="">supnE;</code> </td> <td> U+02ACC </td> <td> <span class="glyph" title="">&#10956;</span> </td> <tr id="entity-supne"><td> <code title="">supne;</code> </td> <td> U+0228B </td> <td> <span class="glyph" title="">&#8843;</span> </td> <tr id="entity-supplus"><td> <code title="">supplus;</code> </td> <td> U+02AC0 </td> <td> <span class="glyph" title="">&#10944;</span> </td> <tr id="entity-supset"><td> <code title="">supset;</code> </td> <td> U+02283 </td> <td> <span class="glyph" title="">&sup;</span> </td> <tr id="entity-supseteq"><td> <code title="">supseteq;</code> </td> <td> U+02287 </td> <td> <span class="glyph" title="">&supe;</span> </td> <tr id="entity-supseteqq"><td> <code title="">supseteqq;</code> </td> <td> U+02AC6 </td> <td> <span class="glyph" title="">&#10950;</span> </td> <tr id="entity-supsetneq"><td> <code title="">supsetneq;</code> </td> <td> U+0228B </td> <td> <span class="glyph" title="">&#8843;</span> </td> <tr id="entity-supsetneqq"><td> <code title="">supsetneqq;</code> </td> <td> U+02ACC </td> <td> <span class="glyph" title="">&#10956;</span> </td> <tr id="entity-supsim"><td> <code title="">supsim;</code> </td> <td> U+02AC8 </td> <td> <span class="glyph" title="">&#10952;</span> </td> <tr id="entity-supsub"><td> <code title="">supsub;</code> </td> <td> U+02AD4 </td> <td> <span class="glyph" title="">&#10964;</span> </td> <tr id="entity-supsup"><td> <code title="">supsup;</code> </td> <td> U+02AD6 </td> <td> <span class="glyph" title="">&#10966;</span> </td> <tr id="entity-swArr"><td> <code title="">swArr;</code> </td> <td> U+021D9 </td> <td> <span class="glyph" title="">&#8665;</span> </td> <tr id="entity-swarhk"><td> <code title="">swarhk;</code> </td> <td> U+02926 </td> <td> <span class="glyph" title="">&#10534;</span> </td> <tr id="entity-swarr"><td> <code title="">swarr;</code> </td> <td> U+02199 </td> <td> <span class="glyph" title="">&#8601;</span> </td> <tr id="entity-swarrow"><td> <code title="">swarrow;</code> </td> <td> U+02199 </td> <td> <span class="glyph" title="">&#8601;</span> </td> <tr id="entity-swnwar"><td> <code title="">swnwar;</code> </td> <td> U+0292A </td> <td> <span class="glyph" title="">&#10538;</span> </td> <tr id="entity-szlig"><td> <code title="">szlig;</code> </td> <td> U+000DF </td> <td> <span class="glyph" title="">&szlig;</span> </td> <tr id="entity-target"><td> <code title="">target;</code> </td> <td> U+02316 </td> <td> <span class="glyph" title="">&#8982;</span> </td> <tr id="entity-tau"><td> <code title="">tau;</code> </td> <td> U+003C4 </td> <td> <span class="glyph" title="">&tau;</span> </td> <tr id="entity-tbrk"><td> <code title="">tbrk;</code> </td> <td> U+023B4 </td> <td> <span class="glyph" title="">&#9140;</span> </td> <tr id="entity-tcaron"><td> <code title="">tcaron;</code> </td> <td> U+00165 </td> <td> <span class="glyph" title="">&#357;</span> </td> <tr id="entity-tcedil"><td> <code title="">tcedil;</code> </td> <td> U+00163 </td> <td> <span class="glyph" title="">&#355;</span> </td> <tr id="entity-tcy"><td> <code title="">tcy;</code> </td> <td> U+00442 </td> <td> <span class="glyph" title="">&#1090;</span> </td> <tr id="entity-tdot"><td> <code title="">tdot;</code> </td> <td> U+020DB </td> <td> <span class="glyph composition" title="">&#9676;&#8411;</span> </td> <tr id="entity-telrec"><td> <code title="">telrec;</code> </td> <td> U+02315 </td> <td> <span class="glyph" title="">&#8981;</span> </td> <tr id="entity-tfr"><td> <code title="">tfr;</code> </td> <td> U+1D531 </td> <td> <span class="glyph" title="">&#120113;</span> </td> <tr id="entity-there4"><td> <code title="">there4;</code> </td> <td> U+02234 </td> <td> <span class="glyph" title="">&there4;</span> </td> <tr id="entity-therefore"><td> <code title="">therefore;</code> </td> <td> U+02234 </td> <td> <span class="glyph" title="">&there4;</span> </td> <tr id="entity-theta"><td> <code title="">theta;</code> </td> <td> U+003B8 </td> <td> <span class="glyph" title="">&theta;</span> </td> <tr id="entity-thetasym"><td> <code title="">thetasym;</code> </td> <td> U+003D1 </td> <td> <span class="glyph" title="">&thetasym;</span> </td> <tr id="entity-thetav"><td> <code title="">thetav;</code> </td> <td> U+003D1 </td> <td> <span class="glyph" title="">&thetasym;</span> </td> <tr id="entity-thickapprox"><td> <code title="">thickapprox;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-thicksim"><td> <code title="">thicksim;</code> </td> <td> U+0223C </td> <td> <span class="glyph" title="">&sim;</span> </td> <tr id="entity-thinsp"><td> <code title="">thinsp;</code> </td> <td> U+02009 </td> <td> <span class="glyph" title="">&thinsp;</span> </td> <tr id="entity-thkap"><td> <code title="">thkap;</code> </td> <td> U+02248 </td> <td> <span class="glyph" title="">&asymp;</span> </td> <tr id="entity-thksim"><td> <code title="">thksim;</code> </td> <td> U+0223C </td> <td> <span class="glyph" title="">&sim;</span> </td> <tr id="entity-thorn"><td> <code title="">thorn;</code> </td> <td> U+000FE </td> <td> <span class="glyph" title="">&thorn;</span> </td> <tr id="entity-tilde"><td> <code title="">tilde;</code> </td> <td> U+002DC </td> <td> <span class="glyph" title="">&tilde;</span> </td> <tr id="entity-times"><td> <code title="">times;</code> </td> <td> U+000D7 </td> <td> <span class="glyph" title="">&times;</span> </td> <tr id="entity-timesb"><td> <code title="">timesb;</code> </td> <td> U+022A0 </td> <td> <span class="glyph" title="">&#8864;</span> </td> <tr id="entity-timesbar"><td> <code title="">timesbar;</code> </td> <td> U+02A31 </td> <td> <span class="glyph" title="">&#10801;</span> </td> <tr id="entity-timesd"><td> <code title="">timesd;</code> </td> <td> U+02A30 </td> <td> <span class="glyph" title="">&#10800;</span> </td> <tr id="entity-tint"><td> <code title="">tint;</code> </td> <td> U+0222D </td> <td> <span class="glyph" title="">&#8749;</span> </td> <tr id="entity-toea"><td> <code title="">toea;</code> </td> <td> U+02928 </td> <td> <span class="glyph" title="">&#10536;</span> </td> <tr id="entity-top"><td> <code title="">top;</code> </td> <td> U+022A4 </td> <td> <span class="glyph" title="">&#8868;</span> </td> <tr id="entity-topbot"><td> <code title="">topbot;</code> </td> <td> U+02336 </td> <td> <span class="glyph" title="">&#9014;</span> </td> <tr id="entity-topcir"><td> <code title="">topcir;</code> </td> <td> U+02AF1 </td> <td> <span class="glyph" title="">&#10993;</span> </td> <tr id="entity-topf"><td> <code title="">topf;</code> </td> <td> U+1D565 </td> <td> <span class="glyph" title="">&#120165;</span> </td> <tr id="entity-topfork"><td> <code title="">topfork;</code> </td> <td> U+02ADA </td> <td> <span class="glyph" title="">&#10970;</span> </td> <tr id="entity-tosa"><td> <code title="">tosa;</code> </td> <td> U+02929 </td> <td> <span class="glyph" title="">&#10537;</span> </td> <tr id="entity-tprime"><td> <code title="">tprime;</code> </td> <td> U+02034 </td> <td> <span class="glyph" title="">&#8244;</span> </td> <tr id="entity-trade"><td> <code title="">trade;</code> </td> <td> U+02122 </td> <td> <span class="glyph" title="">&trade;</span> </td> <tr id="entity-triangle"><td> <code title="">triangle;</code> </td> <td> U+025B5 </td> <td> <span class="glyph" title="">&#9653;</span> </td> <tr id="entity-triangledown"><td> <code title="">triangledown;</code> </td> <td> U+025BF </td> <td> <span class="glyph" title="">&#9663;</span> </td> <tr id="entity-triangleleft"><td> <code title="">triangleleft;</code> </td> <td> U+025C3 </td> <td> <span class="glyph" title="">&#9667;</span> </td> <tr id="entity-trianglelefteq"><td> <code title="">trianglelefteq;</code> </td> <td> U+022B4 </td> <td> <span class="glyph" title="">&#8884;</span> </td> <tr id="entity-triangleq"><td> <code title="">triangleq;</code> </td> <td> U+0225C </td> <td> <span class="glyph" title="">&#8796;</span> </td> <tr id="entity-triangleright"><td> <code title="">triangleright;</code> </td> <td> U+025B9 </td> <td> <span class="glyph" title="">&#9657;</span> </td> <tr id="entity-trianglerighteq"><td> <code title="">trianglerighteq;</code> </td> <td> U+022B5 </td> <td> <span class="glyph" title="">&#8885;</span> </td> <tr id="entity-tridot"><td> <code title="">tridot;</code> </td> <td> U+025EC </td> <td> <span class="glyph" title="">&#9708;</span> </td> <tr id="entity-trie"><td> <code title="">trie;</code> </td> <td> U+0225C </td> <td> <span class="glyph" title="">&#8796;</span> </td> <tr id="entity-triminus"><td> <code title="">triminus;</code> </td> <td> U+02A3A </td> <td> <span class="glyph" title="">&#10810;</span> </td> <tr id="entity-triplus"><td> <code title="">triplus;</code> </td> <td> U+02A39 </td> <td> <span class="glyph" title="">&#10809;</span> </td> <tr id="entity-trisb"><td> <code title="">trisb;</code> </td> <td> U+029CD </td> <td> <span class="glyph" title="">&#10701;</span> </td> <tr id="entity-tritime"><td> <code title="">tritime;</code> </td> <td> U+02A3B </td> <td> <span class="glyph" title="">&#10811;</span> </td> <tr id="entity-trpezium"><td> <code title="">trpezium;</code> </td> <td> U+023E2 </td> <td> <span class="glyph" title="">&#9186;</span> </td> <tr id="entity-tscr"><td> <code title="">tscr;</code> </td> <td> U+1D4C9 </td> <td> <span class="glyph" title="">&#120009;</span> </td> <tr id="entity-tscy"><td> <code title="">tscy;</code> </td> <td> U+00446 </td> <td> <span class="glyph" title="">&#1094;</span> </td> <tr id="entity-tshcy"><td> <code title="">tshcy;</code> </td> <td> U+0045B </td> <td> <span class="glyph" title="">&#1115;</span> </td> <tr id="entity-tstrok"><td> <code title="">tstrok;</code> </td> <td> U+00167 </td> <td> <span class="glyph" title="">&#359;</span> </td> <tr id="entity-twixt"><td> <code title="">twixt;</code> </td> <td> U+0226C </td> <td> <span class="glyph" title="">&#8812;</span> </td> <tr id="entity-twoheadleftarrow"><td> <code title="">twoheadleftarrow;</code> </td> <td> U+0219E </td> <td> <span class="glyph" title="">&#8606;</span> </td> <tr id="entity-twoheadrightarrow"><td> <code title="">twoheadrightarrow;</code> </td> <td> U+021A0 </td> <td> <span class="glyph" title="">&#8608;</span> </td> <tr id="entity-uArr"><td> <code title="">uArr;</code> </td> <td> U+021D1 </td> <td> <span class="glyph" title="">&uArr;</span> </td> <tr id="entity-uHar"><td> <code title="">uHar;</code> </td> <td> U+02963 </td> <td> <span class="glyph" title="">&#10595;</span> </td> <tr id="entity-uacute"><td> <code title="">uacute;</code> </td> <td> U+000FA </td> <td> <span class="glyph" title="">&uacute;</span> </td> <tr id="entity-uarr"><td> <code title="">uarr;</code> </td> <td> U+02191 </td> <td> <span class="glyph" title="">&uarr;</span> </td> <tr id="entity-ubrcy"><td> <code title="">ubrcy;</code> </td> <td> U+0045E </td> <td> <span class="glyph" title="">&#1118;</span> </td> <tr id="entity-ubreve"><td> <code title="">ubreve;</code> </td> <td> U+0016D </td> <td> <span class="glyph" title="">&#365;</span> </td> <tr id="entity-ucirc"><td> <code title="">ucirc;</code> </td> <td> U+000FB </td> <td> <span class="glyph" title="">&ucirc;</span> </td> <tr id="entity-ucy"><td> <code title="">ucy;</code> </td> <td> U+00443 </td> <td> <span class="glyph" title="">&#1091;</span> </td> <tr id="entity-udarr"><td> <code title="">udarr;</code> </td> <td> U+021C5 </td> <td> <span class="glyph" title="">&#8645;</span> </td> <tr id="entity-udblac"><td> <code title="">udblac;</code> </td> <td> U+00171 </td> <td> <span class="glyph" title="">&#369;</span> </td> <tr id="entity-udhar"><td> <code title="">udhar;</code> </td> <td> U+0296E </td> <td> <span class="glyph" title="">&#10606;</span> </td> <tr id="entity-ufisht"><td> <code title="">ufisht;</code> </td> <td> U+0297E </td> <td> <span class="glyph" title="">&#10622;</span> </td> <tr id="entity-ufr"><td> <code title="">ufr;</code> </td> <td> U+1D532 </td> <td> <span class="glyph" title="">&#120114;</span> </td> <tr id="entity-ugrave"><td> <code title="">ugrave;</code> </td> <td> U+000F9 </td> <td> <span class="glyph" title="">&ugrave;</span> </td> <tr id="entity-uharl"><td> <code title="">uharl;</code> </td> <td> U+021BF </td> <td> <span class="glyph" title="">&#8639;</span> </td> <tr id="entity-uharr"><td> <code title="">uharr;</code> </td> <td> U+021BE </td> <td> <span class="glyph" title="">&#8638;</span> </td> <tr id="entity-uhblk"><td> <code title="">uhblk;</code> </td> <td> U+02580 </td> <td> <span class="glyph" title="">&#9600;</span> </td> <tr id="entity-ulcorn"><td> <code title="">ulcorn;</code> </td> <td> U+0231C </td> <td> <span class="glyph" title="">&#8988;</span> </td> <tr id="entity-ulcorner"><td> <code title="">ulcorner;</code> </td> <td> U+0231C </td> <td> <span class="glyph" title="">&#8988;</span> </td> <tr id="entity-ulcrop"><td> <code title="">ulcrop;</code> </td> <td> U+0230F </td> <td> <span class="glyph" title="">&#8975;</span> </td> <tr id="entity-ultri"><td> <code title="">ultri;</code> </td> <td> U+025F8 </td> <td> <span class="glyph" title="">&#9720;</span> </td> <tr id="entity-umacr"><td> <code title="">umacr;</code> </td> <td> U+0016B </td> <td> <span class="glyph" title="">&#363;</span> </td> <tr id="entity-uml"><td> <code title="">uml;</code> </td> <td> U+000A8 </td> <td> <span class="glyph" title="">&uml;</span> </td> <tr id="entity-uogon"><td> <code title="">uogon;</code> </td> <td> U+00173 </td> <td> <span class="glyph" title="">&#371;</span> </td> <tr id="entity-uopf"><td> <code title="">uopf;</code> </td> <td> U+1D566 </td> <td> <span class="glyph" title="">&#120166;</span> </td> <tr id="entity-uparrow"><td> <code title="">uparrow;</code> </td> <td> U+02191 </td> <td> <span class="glyph" title="">&uarr;</span> </td> <tr id="entity-updownarrow"><td> <code title="">updownarrow;</code> </td> <td> U+02195 </td> <td> <span class="glyph" title="">&#8597;</span> </td> <tr id="entity-upharpoonleft"><td> <code title="">upharpoonleft;</code> </td> <td> U+021BF </td> <td> <span class="glyph" title="">&#8639;</span> </td> <tr id="entity-upharpoonright"><td> <code title="">upharpoonright;</code> </td> <td> U+021BE </td> <td> <span class="glyph" title="">&#8638;</span> </td> <tr id="entity-uplus"><td> <code title="">uplus;</code> </td> <td> U+0228E </td> <td> <span class="glyph" title="">&#8846;</span> </td> <tr id="entity-upsi"><td> <code title="">upsi;</code> </td> <td> U+003C5 </td> <td> <span class="glyph" title="">&upsilon;</span> </td> <tr id="entity-upsih"><td> <code title="">upsih;</code> </td> <td> U+003D2 </td> <td> <span class="glyph" title="">&upsih;</span> </td> <tr id="entity-upsilon"><td> <code title="">upsilon;</code> </td> <td> U+003C5 </td> <td> <span class="glyph" title="">&upsilon;</span> </td> <tr id="entity-upuparrows"><td> <code title="">upuparrows;</code> </td> <td> U+021C8 </td> <td> <span class="glyph" title="">&#8648;</span> </td> <tr id="entity-urcorn"><td> <code title="">urcorn;</code> </td> <td> U+0231D </td> <td> <span class="glyph" title="">&#8989;</span> </td> <tr id="entity-urcorner"><td> <code title="">urcorner;</code> </td> <td> U+0231D </td> <td> <span class="glyph" title="">&#8989;</span> </td> <tr id="entity-urcrop"><td> <code title="">urcrop;</code> </td> <td> U+0230E </td> <td> <span class="glyph" title="">&#8974;</span> </td> <tr id="entity-uring"><td> <code title="">uring;</code> </td> <td> U+0016F </td> <td> <span class="glyph" title="">&#367;</span> </td> <tr id="entity-urtri"><td> <code title="">urtri;</code> </td> <td> U+025F9 </td> <td> <span class="glyph" title="">&#9721;</span> </td> <tr id="entity-uscr"><td> <code title="">uscr;</code> </td> <td> U+1D4CA </td> <td> <span class="glyph" title="">&#120010;</span> </td> <tr id="entity-utdot"><td> <code title="">utdot;</code> </td> <td> U+022F0 </td> <td> <span class="glyph" title="">&#8944;</span> </td> <tr id="entity-utilde"><td> <code title="">utilde;</code> </td> <td> U+00169 </td> <td> <span class="glyph" title="">&#361;</span> </td> <tr id="entity-utri"><td> <code title="">utri;</code> </td> <td> U+025B5 </td> <td> <span class="glyph" title="">&#9653;</span> </td> <tr id="entity-utrif"><td> <code title="">utrif;</code> </td> <td> U+025B4 </td> <td> <span class="glyph" title="">&#9652;</span> </td> <tr id="entity-uuarr"><td> <code title="">uuarr;</code> </td> <td> U+021C8 </td> <td> <span class="glyph" title="">&#8648;</span> </td> <tr id="entity-uuml"><td> <code title="">uuml;</code> </td> <td> U+000FC </td> <td> <span class="glyph" title="">&uuml;</span> </td> <tr id="entity-uwangle"><td> <code title="">uwangle;</code> </td> <td> U+029A7 </td> <td> <span class="glyph" title="">&#10663;</span> </td> <tr id="entity-vArr"><td> <code title="">vArr;</code> </td> <td> U+021D5 </td> <td> <span class="glyph" title="">&#8661;</span> </td> <tr id="entity-vBar"><td> <code title="">vBar;</code> </td> <td> U+02AE8 </td> <td> <span class="glyph" title="">&#10984;</span> </td> <tr id="entity-vBarv"><td> <code title="">vBarv;</code> </td> <td> U+02AE9 </td> <td> <span class="glyph" title="">&#10985;</span> </td> <tr id="entity-vDash"><td> <code title="">vDash;</code> </td> <td> U+022A8 </td> <td> <span class="glyph" title="">&#8872;</span> </td> <tr id="entity-vangrt"><td> <code title="">vangrt;</code> </td> <td> U+0299C </td> <td> <span class="glyph" title="">&#10652;</span> </td> <tr id="entity-varepsilon"><td> <code title="">varepsilon;</code> </td> <td> U+003F5 </td> <td> <span class="glyph" title="">&#1013;</span> </td> <tr id="entity-varkappa"><td> <code title="">varkappa;</code> </td> <td> U+003F0 </td> <td> <span class="glyph" title="">&#1008;</span> </td> <tr id="entity-varnothing"><td> <code title="">varnothing;</code> </td> <td> U+02205 </td> <td> <span class="glyph" title="">&empty;</span> </td> <tr id="entity-varphi"><td> <code title="">varphi;</code> </td> <td> U+003D5 </td> <td> <span class="glyph" title="">&#981;</span> </td> <tr id="entity-varpi"><td> <code title="">varpi;</code> </td> <td> U+003D6 </td> <td> <span class="glyph" title="">&piv;</span> </td> <tr id="entity-varpropto"><td> <code title="">varpropto;</code> </td> <td> U+0221D </td> <td> <span class="glyph" title="">&prop;</span> </td> <tr id="entity-varr"><td> <code title="">varr;</code> </td> <td> U+02195 </td> <td> <span class="glyph" title="">&#8597;</span> </td> <tr id="entity-varrho"><td> <code title="">varrho;</code> </td> <td> U+003F1 </td> <td> <span class="glyph" title="">&#1009;</span> </td> <tr id="entity-varsigma"><td> <code title="">varsigma;</code> </td> <td> U+003C2 </td> <td> <span class="glyph" title="">&sigmaf;</span> </td> <tr id="entity-varsubsetneq"><td> <code title="">varsubsetneq;</code> </td> <td> U+0228A U+0FE00 </td> <td> <span class="glyph compound" title="">&#8842;&#65024;</span> </td> <tr id="entity-varsubsetneqq"><td> <code title="">varsubsetneqq;</code> </td> <td> U+02ACB U+0FE00 </td> <td> <span class="glyph compound" title="">&#10955;&#65024;</span> </td> <tr id="entity-varsupsetneq"><td> <code title="">varsupsetneq;</code> </td> <td> U+0228B U+0FE00 </td> <td> <span class="glyph compound" title="">&#8843;&#65024;</span> </td> <tr id="entity-varsupsetneqq"><td> <code title="">varsupsetneqq;</code> </td> <td> U+02ACC U+0FE00 </td> <td> <span class="glyph compound" title="">&#10956;&#65024;</span> </td> <tr id="entity-vartheta"><td> <code title="">vartheta;</code> </td> <td> U+003D1 </td> <td> <span class="glyph" title="">&thetasym;</span> </td> <tr id="entity-vartriangleleft"><td> <code title="">vartriangleleft;</code> </td> <td> U+022B2 </td> <td> <span class="glyph" title="">&#8882;</span> </td> <tr id="entity-vartriangleright"><td> <code title="">vartriangleright;</code> </td> <td> U+022B3 </td> <td> <span class="glyph" title="">&#8883;</span> </td> <tr id="entity-vcy"><td> <code title="">vcy;</code> </td> <td> U+00432 </td> <td> <span class="glyph" title="">&#1074;</span> </td> <tr id="entity-vdash"><td> <code title="">vdash;</code> </td> <td> U+022A2 </td> <td> <span class="glyph" title="">&#8866;</span> </td> <tr id="entity-vee"><td> <code title="">vee;</code> </td> <td> U+02228 </td> <td> <span class="glyph" title="">&or;</span> </td> <tr id="entity-veebar"><td> <code title="">veebar;</code> </td> <td> U+022BB </td> <td> <span class="glyph" title="">&#8891;</span> </td> <tr id="entity-veeeq"><td> <code title="">veeeq;</code> </td> <td> U+0225A </td> <td> <span class="glyph" title="">&#8794;</span> </td> <tr id="entity-vellip"><td> <code title="">vellip;</code> </td> <td> U+022EE </td> <td> <span class="glyph" title="">&#8942;</span> </td> <tr id="entity-verbar"><td> <code title="">verbar;</code> </td> <td> U+0007C </td> <td> <span class="glyph" title="">|</span> </td> <tr id="entity-vert"><td> <code title="">vert;</code> </td> <td> U+0007C </td> <td> <span class="glyph" title="">|</span> </td> <tr id="entity-vfr"><td> <code title="">vfr;</code> </td> <td> U+1D533 </td> <td> <span class="glyph" title="">&#120115;</span> </td> <tr id="entity-vltri"><td> <code title="">vltri;</code> </td> <td> U+022B2 </td> <td> <span class="glyph" title="">&#8882;</span> </td> <tr id="entity-vnsub"><td> <code title="">vnsub;</code> </td> <td> U+02282 U+020D2 </td> <td> <span class="glyph compound" title="">&sub;&#8402;</span> </td> <tr id="entity-vnsup"><td> <code title="">vnsup;</code> </td> <td> U+02283 U+020D2 </td> <td> <span class="glyph compound" title="">&sup;&#8402;</span> </td> <tr id="entity-vopf"><td> <code title="">vopf;</code> </td> <td> U+1D567 </td> <td> <span class="glyph" title="">&#120167;</span> </td> <tr id="entity-vprop"><td> <code title="">vprop;</code> </td> <td> U+0221D </td> <td> <span class="glyph" title="">&prop;</span> </td> <tr id="entity-vrtri"><td> <code title="">vrtri;</code> </td> <td> U+022B3 </td> <td> <span class="glyph" title="">&#8883;</span> </td> <tr id="entity-vscr"><td> <code title="">vscr;</code> </td> <td> U+1D4CB </td> <td> <span class="glyph" title="">&#120011;</span> </td> <tr id="entity-vsubnE"><td> <code title="">vsubnE;</code> </td> <td> U+02ACB U+0FE00 </td> <td> <span class="glyph compound" title="">&#10955;&#65024;</span> </td> <tr id="entity-vsubne"><td> <code title="">vsubne;</code> </td> <td> U+0228A U+0FE00 </td> <td> <span class="glyph compound" title="">&#8842;&#65024;</span> </td> <tr id="entity-vsupnE"><td> <code title="">vsupnE;</code> </td> <td> U+02ACC U+0FE00 </td> <td> <span class="glyph compound" title="">&#10956;&#65024;</span> </td> <tr id="entity-vsupne"><td> <code title="">vsupne;</code> </td> <td> U+0228B U+0FE00 </td> <td> <span class="glyph compound" title="">&#8843;&#65024;</span> </td> <tr id="entity-vzigzag"><td> <code title="">vzigzag;</code> </td> <td> U+0299A </td> <td> <span class="glyph" title="">&#10650;</span> </td> <tr id="entity-wcirc"><td> <code title="">wcirc;</code> </td> <td> U+00175 </td> <td> <span class="glyph" title="">&#373;</span> </td> <tr id="entity-wedbar"><td> <code title="">wedbar;</code> </td> <td> U+02A5F </td> <td> <span class="glyph" title="">&#10847;</span> </td> <tr id="entity-wedge"><td> <code title="">wedge;</code> </td> <td> U+02227 </td> <td> <span class="glyph" title="">&and;</span> </td> <tr id="entity-wedgeq"><td> <code title="">wedgeq;</code> </td> <td> U+02259 </td> <td> <span class="glyph" title="">&#8793;</span> </td> <tr id="entity-weierp"><td> <code title="">weierp;</code> </td> <td> U+02118 </td> <td> <span class="glyph" title="">&weierp;</span> </td> <tr id="entity-wfr"><td> <code title="">wfr;</code> </td> <td> U+1D534 </td> <td> <span class="glyph" title="">&#120116;</span> </td> <tr id="entity-wopf"><td> <code title="">wopf;</code> </td> <td> U+1D568 </td> <td> <span class="glyph" title="">&#120168;</span> </td> <tr id="entity-wp"><td> <code title="">wp;</code> </td> <td> U+02118 </td> <td> <span class="glyph" title="">&weierp;</span> </td> <tr id="entity-wr"><td> <code title="">wr;</code> </td> <td> U+02240 </td> <td> <span class="glyph" title="">&#8768;</span> </td> <tr id="entity-wreath"><td> <code title="">wreath;</code> </td> <td> U+02240 </td> <td> <span class="glyph" title="">&#8768;</span> </td> <tr id="entity-wscr"><td> <code title="">wscr;</code> </td> <td> U+1D4CC </td> <td> <span class="glyph" title="">&#120012;</span> </td> <tr id="entity-xcap"><td> <code title="">xcap;</code> </td> <td> U+022C2 </td> <td> <span class="glyph" title="">&#8898;</span> </td> <tr id="entity-xcirc"><td> <code title="">xcirc;</code> </td> <td> U+025EF </td> <td> <span class="glyph" title="">&#9711;</span> </td> <tr id="entity-xcup"><td> <code title="">xcup;</code> </td> <td> U+022C3 </td> <td> <span class="glyph" title="">&#8899;</span> </td> <tr id="entity-xdtri"><td> <code title="">xdtri;</code> </td> <td> U+025BD </td> <td> <span class="glyph" title="">&#9661;</span> </td> <tr id="entity-xfr"><td> <code title="">xfr;</code> </td> <td> U+1D535 </td> <td> <span class="glyph" title="">&#120117;</span> </td> <tr id="entity-xhArr"><td> <code title="">xhArr;</code> </td> <td> U+027FA </td> <td> <span class="glyph" title="">&#10234;</span> </td> <tr id="entity-xharr"><td> <code title="">xharr;</code> </td> <td> U+027F7 </td> <td> <span class="glyph" title="">&#10231;</span> </td> <tr id="entity-xi"><td> <code title="">xi;</code> </td> <td> U+003BE </td> <td> <span class="glyph" title="">&xi;</span> </td> <tr id="entity-xlArr"><td> <code title="">xlArr;</code> </td> <td> U+027F8 </td> <td> <span class="glyph" title="">&#10232;</span> </td> <tr id="entity-xlarr"><td> <code title="">xlarr;</code> </td> <td> U+027F5 </td> <td> <span class="glyph" title="">&#10229;</span> </td> <tr id="entity-xmap"><td> <code title="">xmap;</code> </td> <td> U+027FC </td> <td> <span class="glyph" title="">&#10236;</span> </td> <tr id="entity-xnis"><td> <code title="">xnis;</code> </td> <td> U+022FB </td> <td> <span class="glyph" title="">&#8955;</span> </td> <tr id="entity-xodot"><td> <code title="">xodot;</code> </td> <td> U+02A00 </td> <td> <span class="glyph" title="">&#10752;</span> </td> <tr id="entity-xopf"><td> <code title="">xopf;</code> </td> <td> U+1D569 </td> <td> <span class="glyph" title="">&#120169;</span> </td> <tr id="entity-xoplus"><td> <code title="">xoplus;</code> </td> <td> U+02A01 </td> <td> <span class="glyph" title="">&#10753;</span> </td> <tr id="entity-xotime"><td> <code title="">xotime;</code> </td> <td> U+02A02 </td> <td> <span class="glyph" title="">&#10754;</span> </td> <tr id="entity-xrArr"><td> <code title="">xrArr;</code> </td> <td> U+027F9 </td> <td> <span class="glyph" title="">&#10233;</span> </td> <tr id="entity-xrarr"><td> <code title="">xrarr;</code> </td> <td> U+027F6 </td> <td> <span class="glyph" title="">&#10230;</span> </td> <tr id="entity-xscr"><td> <code title="">xscr;</code> </td> <td> U+1D4CD </td> <td> <span class="glyph" title="">&#120013;</span> </td> <tr id="entity-xsqcup"><td> <code title="">xsqcup;</code> </td> <td> U+02A06 </td> <td> <span class="glyph" title="">&#10758;</span> </td> <tr id="entity-xuplus"><td> <code title="">xuplus;</code> </td> <td> U+02A04 </td> <td> <span class="glyph" title="">&#10756;</span> </td> <tr id="entity-xutri"><td> <code title="">xutri;</code> </td> <td> U+025B3 </td> <td> <span class="glyph" title="">&#9651;</span> </td> <tr id="entity-xvee"><td> <code title="">xvee;</code> </td> <td> U+022C1 </td> <td> <span class="glyph" title="">&#8897;</span> </td> <tr id="entity-xwedge"><td> <code title="">xwedge;</code> </td> <td> U+022C0 </td> <td> <span class="glyph" title="">&#8896;</span> </td> <tr id="entity-yacute"><td> <code title="">yacute;</code> </td> <td> U+000FD </td> <td> <span class="glyph" title="">&yacute;</span> </td> <tr id="entity-yacy"><td> <code title="">yacy;</code> </td> <td> U+0044F </td> <td> <span class="glyph" title="">&#1103;</span> </td> <tr id="entity-ycirc"><td> <code title="">ycirc;</code> </td> <td> U+00177 </td> <td> <span class="glyph" title="">&#375;</span> </td> <tr id="entity-ycy"><td> <code title="">ycy;</code> </td> <td> U+0044B </td> <td> <span class="glyph" title="">&#1099;</span> </td> <tr id="entity-yen"><td> <code title="">yen;</code> </td> <td> U+000A5 </td> <td> <span class="glyph" title="">&yen;</span> </td> <tr id="entity-yfr"><td> <code title="">yfr;</code> </td> <td> U+1D536 </td> <td> <span class="glyph" title="">&#120118;</span> </td> <tr id="entity-yicy"><td> <code title="">yicy;</code> </td> <td> U+00457 </td> <td> <span class="glyph" title="">&#1111;</span> </td> <tr id="entity-yopf"><td> <code title="">yopf;</code> </td> <td> U+1D56A </td> <td> <span class="glyph" title="">&#120170;</span> </td> <tr id="entity-yscr"><td> <code title="">yscr;</code> </td> <td> U+1D4CE </td> <td> <span class="glyph" title="">&#120014;</span> </td> <tr id="entity-yucy"><td> <code title="">yucy;</code> </td> <td> U+0044E </td> <td> <span class="glyph" title="">&#1102;</span> </td> <tr id="entity-yuml"><td> <code title="">yuml;</code> </td> <td> U+000FF </td> <td> <span class="glyph" title="">&yuml;</span> </td> <tr id="entity-zacute"><td> <code title="">zacute;</code> </td> <td> U+0017A </td> <td> <span class="glyph" title="">&#378;</span> </td> <tr id="entity-zcaron"><td> <code title="">zcaron;</code> </td> <td> U+0017E </td> <td> <span class="glyph" title="">&#382;</span> </td> <tr id="entity-zcy"><td> <code title="">zcy;</code> </td> <td> U+00437 </td> <td> <span class="glyph" title="">&#1079;</span> </td> <tr id="entity-zdot"><td> <code title="">zdot;</code> </td> <td> U+0017C </td> <td> <span class="glyph" title="">&#380;</span> </td> <tr id="entity-zeetrf"><td> <code title="">zeetrf;</code> </td> <td> U+02128 </td> <td> <span class="glyph" title="">&#8488;</span> </td> <tr id="entity-zeta"><td> <code title="">zeta;</code> </td> <td> U+003B6 </td> <td> <span class="glyph" title="">&zeta;</span> </td> <tr id="entity-zfr"><td> <code title="">zfr;</code> </td> <td> U+1D537 </td> <td> <span class="glyph" title="">&#120119;</span> </td> <tr id="entity-zhcy"><td> <code title="">zhcy;</code> </td> <td> U+00436 </td> <td> <span class="glyph" title="">&#1078;</span> </td> <tr id="entity-zigrarr"><td> <code title="">zigrarr;</code> </td> <td> U+021DD </td> <td> <span class="glyph" title="">&#8669;</span> </td> <tr id="entity-zopf"><td> <code title="">zopf;</code> </td> <td> U+1D56B </td> <td> <span class="glyph" title="">&#120171;</span> </td> <tr id="entity-zscr"><td> <code title="">zscr;</code> </td> <td> U+1D4CF </td> <td> <span class="glyph" title="">&#120015;</span> </td> <tr id="entity-zwj"><td> <code title="">zwj;</code> </td> <td> U+0200D </td> <td> <span class="glyph" title="">&zwj;</span> </td> <tr id="entity-zwnj"><td> <code title="">zwnj;</code> </td> <td> U+0200C </td> <td> <span class="glyph" title="">&zwnj;</span> </td> <tr class="impl"><td> <code title="">AElig</code> </td> <td> U+000C6 </td> <td> <span title="">&AElig;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">AMP</code> </td> <td> U+00026 </td> <td> <span title="">&amp;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Aacute</code> </td> <td> U+000C1 </td> <td> <span title="">&Aacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Acirc</code> </td> <td> U+000C2 </td> <td> <span title="">&Acirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Agrave</code> </td> <td> U+000C0 </td> <td> <span title="">&Agrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Aring</code> </td> <td> U+000C5 </td> <td> <span title="">&Aring;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Atilde</code> </td> <td> U+000C3 </td> <td> <span title="">&Atilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Auml</code> </td> <td> U+000C4 </td> <td> <span title="">&Auml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">COPY</code> </td> <td> U+000A9 </td> <td> <span title="">&copy;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ccedil</code> </td> <td> U+000C7 </td> <td> <span title="">&Ccedil;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ETH</code> </td> <td> U+000D0 </td> <td> <span title="">&ETH;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Eacute</code> </td> <td> U+000C9 </td> <td> <span title="">&Eacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ecirc</code> </td> <td> U+000CA </td> <td> <span title="">&Ecirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Egrave</code> </td> <td> U+000C8 </td> <td> <span title="">&Egrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Euml</code> </td> <td> U+000CB </td> <td> <span title="">&Euml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">GT</code> </td> <td> U+0003E </td> <td> <span title="">&gt;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Iacute</code> </td> <td> U+000CD </td> <td> <span title="">&Iacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Icirc</code> </td> <td> U+000CE </td> <td> <span title="">&Icirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Igrave</code> </td> <td> U+000CC </td> <td> <span title="">&Igrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Iuml</code> </td> <td> U+000CF </td> <td> <span title="">&Iuml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">LT</code> </td> <td> U+0003C </td> <td> <span title="">&lt;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ntilde</code> </td> <td> U+000D1 </td> <td> <span title="">&Ntilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Oacute</code> </td> <td> U+000D3 </td> <td> <span title="">&Oacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ocirc</code> </td> <td> U+000D4 </td> <td> <span title="">&Ocirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ograve</code> </td> <td> U+000D2 </td> <td> <span title="">&Ograve;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Oslash</code> </td> <td> U+000D8 </td> <td> <span title="">&Oslash;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Otilde</code> </td> <td> U+000D5 </td> <td> <span title="">&Otilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ouml</code> </td> <td> U+000D6 </td> <td> <span title="">&Ouml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">QUOT</code> </td> <td> U+00022 </td> <td> <span title="">"</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">REG</code> </td> <td> U+000AE </td> <td> <span title="">&reg;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">THORN</code> </td> <td> U+000DE </td> <td> <span title="">&THORN;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Uacute</code> </td> <td> U+000DA </td> <td> <span title="">&Uacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ucirc</code> </td> <td> U+000DB </td> <td> <span title="">&Ucirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Ugrave</code> </td> <td> U+000D9 </td> <td> <span title="">&Ugrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Uuml</code> </td> <td> U+000DC </td> <td> <span title="">&Uuml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">Yacute</code> </td> <td> U+000DD </td> <td> <span title="">&Yacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">aacute</code> </td> <td> U+000E1 </td> <td> <span title="">&aacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">acirc</code> </td> <td> U+000E2 </td> <td> <span title="">&acirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">acute</code> </td> <td> U+000B4 </td> <td> <span title="">&acute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">aelig</code> </td> <td> U+000E6 </td> <td> <span title="">&aelig;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">agrave</code> </td> <td> U+000E0 </td> <td> <span title="">&agrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">amp</code> </td> <td> U+00026 </td> <td> <span title="">&amp;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">aring</code> </td> <td> U+000E5 </td> <td> <span title="">&aring;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">atilde</code> </td> <td> U+000E3 </td> <td> <span title="">&atilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">auml</code> </td> <td> U+000E4 </td> <td> <span title="">&auml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">brvbar</code> </td> <td> U+000A6 </td> <td> <span title="">&brvbar;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ccedil</code> </td> <td> U+000E7 </td> <td> <span title="">&ccedil;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">cedil</code> </td> <td> U+000B8 </td> <td> <span title="">&cedil;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">cent</code> </td> <td> U+000A2 </td> <td> <span title="">&cent;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">copy</code> </td> <td> U+000A9 </td> <td> <span title="">&copy;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">curren</code> </td> <td> U+000A4 </td> <td> <span title="">&curren;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">deg</code> </td> <td> U+000B0 </td> <td> <span title="">&deg;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">divide</code> </td> <td> U+000F7 </td> <td> <span title="">&divide;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">eacute</code> </td> <td> U+000E9 </td> <td> <span title="">&eacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ecirc</code> </td> <td> U+000EA </td> <td> <span title="">&ecirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">egrave</code> </td> <td> U+000E8 </td> <td> <span title="">&egrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">eth</code> </td> <td> U+000F0 </td> <td> <span title="">&eth;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">euml</code> </td> <td> U+000EB </td> <td> <span title="">&euml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">frac12</code> </td> <td> U+000BD </td> <td> <span title="">&frac12;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">frac14</code> </td> <td> U+000BC </td> <td> <span title="">&frac14;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">frac34</code> </td> <td> U+000BE </td> <td> <span title="">&frac34;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">gt</code> </td> <td> U+0003E </td> <td> <span title="">&gt;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">iacute</code> </td> <td> U+000ED </td> <td> <span title="">&iacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">icirc</code> </td> <td> U+000EE </td> <td> <span title="">&icirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">iexcl</code> </td> <td> U+000A1 </td> <td> <span title="">&iexcl;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">igrave</code> </td> <td> U+000EC </td> <td> <span title="">&igrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">iquest</code> </td> <td> U+000BF </td> <td> <span title="">&iquest;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">iuml</code> </td> <td> U+000EF </td> <td> <span title="">&iuml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">laquo</code> </td> <td> U+000AB </td> <td> <span title="">&laquo;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">lt</code> </td> <td> U+0003C </td> <td> <span title="">&lt;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">macr</code> </td> <td> U+000AF </td> <td> <span title="">&macr;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">micro</code> </td> <td> U+000B5 </td> <td> <span title="">&micro;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">middot</code> </td> <td> U+000B7 </td> <td> <span title="">&middot;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">nbsp</code> </td> <td> U+000A0 </td> <td> <span title="">&nbsp;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">not</code> </td> <td> U+000AC </td> <td> <span title="">&not;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ntilde</code> </td> <td> U+000F1 </td> <td> <span title="">&ntilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">oacute</code> </td> <td> U+000F3 </td> <td> <span title="">&oacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ocirc</code> </td> <td> U+000F4 </td> <td> <span title="">&ocirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ograve</code> </td> <td> U+000F2 </td> <td> <span title="">&ograve;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ordf</code> </td> <td> U+000AA </td> <td> <span title="">&ordf;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ordm</code> </td> <td> U+000BA </td> <td> <span title="">&ordm;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">oslash</code> </td> <td> U+000F8 </td> <td> <span title="">&oslash;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">otilde</code> </td> <td> U+000F5 </td> <td> <span title="">&otilde;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ouml</code> </td> <td> U+000F6 </td> <td> <span title="">&ouml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">para</code> </td> <td> U+000B6 </td> <td> <span title="">&para;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">plusmn</code> </td> <td> U+000B1 </td> <td> <span title="">&plusmn;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">pound</code> </td> <td> U+000A3 </td> <td> <span title="">&pound;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">quot</code> </td> <td> U+00022 </td> <td> <span title="">"</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">raquo</code> </td> <td> U+000BB </td> <td> <span title="">&raquo;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">reg</code> </td> <td> U+000AE </td> <td> <span title="">&reg;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">sect</code> </td> <td> U+000A7 </td> <td> <span title="">&sect;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">shy</code> </td> <td> U+000AD </td> <td> <span title="">&shy;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">sup1</code> </td> <td> U+000B9 </td> <td> <span title="">&sup1;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">sup2</code> </td> <td> U+000B2 </td> <td> <span title="">&sup2;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">sup3</code> </td> <td> U+000B3 </td> <td> <span title="">&sup3;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">szlig</code> </td> <td> U+000DF </td> <td> <span title="">&szlig;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">thorn</code> </td> <td> U+000FE </td> <td> <span title="">&thorn;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">times</code> </td> <td> U+000D7 </td> <td> <span title="">&times;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">uacute</code> </td> <td> U+000FA </td> <td> <span title="">&uacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ucirc</code> </td> <td> U+000FB </td> <td> <span title="">&ucirc;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">ugrave</code> </td> <td> U+000F9 </td> <td> <span title="">&ugrave;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">uml</code> </td> <td> U+000A8 </td> <td> <span title="">&uml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">uuml</code> </td> <td> U+000FC </td> <td> <span title="">&uuml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">yacute</code> </td> <td> U+000FD </td> <td> <span title="">&yacute;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">yen</code> </td> <td> U+000A5 </td> <td> <span title="">&yen;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr class="impl"><td> <code title="">yuml</code> </td> <td> U+000FF </td> <td> <span title="">&yuml;</span> </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --></table><!--
-
diff --git a/doc/tokenization.txt b/doc/tokenization.txt
deleted file mode 100644
index 21cd7f6e..00000000
--- a/doc/tokenization.txt
+++ /dev/null
@@ -1,1147 +0,0 @@
-   #8.2 Parsing HTML documents Table of contents 8.2.5 Tree construction
-
-   WHATWG
-
-HTML 5
-
-Draft Recommendation — 7 February 2009
-
-   ← 8.2 Parsing HTML documents – Table of contents – 8.2.5 Tree
-   construction →
-
-    8.2.4 Tokenization
-
-   Implementations must act as if they used the following state machine to
-   tokenise HTML. The state machine must start in the data state. Most
-   states consume a single character, which may have various side-effects,
-   and either switches the state machine to a new state to reconsume the
-   same character, or switches it to a new state (to consume the next
-   character), or repeats the same state (to consume the next character).
-   Some states have more complicated behavior and can consume several
-   characters before switching to another state.
-
-   The exact behavior of certain states depends on a content model flag
-   that is set after certain tokens are emitted. The flag has several
-   states: PCDATA, RCDATA, CDATA, and PLAINTEXT. Initially it must be in
-   the PCDATA state. In the RCDATA and CDATA states, a further escape flag
-   is used to control the behavior of the tokeniser. It is either true or
-   false, and initially must be set to the false state. The insertion mode
-   and the stack of open elements also affects tokenization.
-
-   The output of the tokenization step is a series of zero or more of the
-   following tokens: DOCTYPE, start tag, end tag, comment, character,
-   end-of-file. DOCTYPE tokens have a name, a public identifier, a system
-   identifier, and a force-quirks flag. When a DOCTYPE token is created,
-   its name, public identifier, and system identifier must be marked as
-   missing (which is a distinct state from the empty string), and the
-   force-quirks flag must be set to off (its other state is on). Start and
-   end tag tokens have a tag name, a self-closing flag, and a list of
-   attributes, each of which has a name and a value. When a start or end
-   tag token is created, its self-closing flag must be unset (its other
-   state is that it be set), and its attributes list must be empty.
-   Comment and character tokens have data.
-
-   When a token is emitted, it must immediately be handled by the tree
-   construction stage. The tree construction stage can affect the state of
-   the content model flag, and can insert additional characters into the
-   stream. (For example, the script element can result in scripts
-   executing and using the dynamic markup insertion APIs to insert
-   characters into the stream being tokenised.)
-
-   When a start tag token is emitted with its self-closing flag set, if
-   the flag is not acknowledged when it is processed by the tree
-   construction stage, that is a parse error.
-
-   When an end tag token is emitted, the content model flag must be
-   switched to the PCDATA state.
-
-   When an end tag token is emitted with attributes, that is a parse
-   error.
-
-   When an end tag token is emitted with its self-closing flag set, that
-   is a parse error.
-
-   Before each step of the tokeniser, the user agent must first check the
-   parser pause flag. If it is true, then the tokeniser must abort the
-   processing of any nested invocations of the tokeniser, yielding control
-   back to the caller. If it is false, then the user agent may then check
-   to see if either one of the scripts in the list of scripts that will
-   execute as soon as possible or the first script in the list of scripts
-   that will execute asynchronously, has completed loading. If one has,
-   then it must be executed and removed from its list.
-
-   The tokeniser state machine consists of the states defined in the
-   following subsections.
-
-      8.2.4.1 Data state
-
-   Consume the next input character:
-
-   U+0026 AMPERSAND (&)
-          When the content model flag is set to one of the PCDATA or
-          RCDATA states and the escape flag is false: switch to the
-          character reference data state.
-          Otherwise: treat it as per the "anything else" entry below.
-
-   U+002D HYPHEN-MINUS (-)
-          If the content model flag is set to either the RCDATA state or
-          the CDATA state, and the escape flag is false, and there are at
-          least three characters before this one in the input stream, and
-          the last four characters in the input stream, including this
-          one, are U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D
-          HYPHEN-MINUS, and U+002D HYPHEN-MINUS ("<!--"), then set the
-          escape flag to true.
-
-          In any case, emit the input character as a character token. Stay
-          in the data state.
-
-   U+003C LESS-THAN SIGN (<)
-          When the content model flag is set to the PCDATA state: switch
-          to the tag open state.
-          When the content model flag is set to either the RCDATA state or
-          the CDATA state, and the escape flag is false: switch to the tag
-          open state.
-          Otherwise: treat it as per the "anything else" entry below.
-
-   U+003E GREATER-THAN SIGN (>)
-          If the content model flag is set to either the RCDATA state or
-          the CDATA state, and the escape flag is true, and the last three
-          characters in the input stream including this one are U+002D
-          HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN
-          ("-->"), set the escape flag to false.
-
-          In any case, emit the input character as a character token. Stay
-          in the data state.
-
-   EOF
-          Emit an end-of-file token.
-
-   Anything else
-          Emit the input character as a character token. Stay in the data
-          state.
-
-      8.2.4.2 Character reference data state
-
-   (This cannot happen if the content model flag is set to the CDATA
-   state.)
-
-   Attempt to consume a character reference, with no additional allowed
-   character.
-
-   If nothing is returned, emit a U+0026 AMPERSAND character token.
-
-   Otherwise, emit the character token that was returned.
-
-   Finally, switch to the data state.
-
-      8.2.4.3 Tag open state
-
-   The behavior of this state depends on the content model flag.
-
-   If the content model flag is set to the RCDATA or CDATA states
-          Consume the next input character. If it is a U+002F SOLIDUS (/)
-          character, switch to the close tag open state. Otherwise, emit a
-          U+003C LESS-THAN SIGN character token and reconsume the current
-          input character in the data state.
-
-   If the content model flag is set to the PCDATA state
-          Consume the next input character:
-
-        U+0021 EXCLAMATION MARK (!)
-                Switch to the markup declaration open state.
-
-        U+002F SOLIDUS (/)
-                Switch to the close tag open state.
-
-        U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL
-                LETTER Z
-                Create a new start tag token, set its tag name to the
-                lowercase version of the input character (add 0x0020 to
-                the character's code point), then switch to the tag name
-                state. (Don't emit the token yet; further details will be
-                filled in before it is emitted.)
-
-        U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z
-                Create a new start tag token, set its tag name to the
-                input character, then switch to the tag name state. (Don't
-                emit the token yet; further details will be filled in
-                before it is emitted.)
-
-        U+003E GREATER-THAN SIGN (>)
-                Parse error. Emit a U+003C LESS-THAN SIGN character token
-                and a U+003E GREATER-THAN SIGN character token. Switch to
-                the data state.
-
-        U+003F QUESTION MARK (?)
-                Parse error. Switch to the bogus comment state.
-
-        Anything else
-                Parse error. Emit a U+003C LESS-THAN SIGN character token
-                and reconsume the current input character in the data
-                state.
-
-      8.2.4.4 Close tag open state
-
-   If the content model flag is set to the RCDATA or CDATA states but no
-   start tag token has ever been emitted by this instance of the tokeniser
-   (fragment case), or, if the content model flag is set to the RCDATA or
-   CDATA states and the next few characters do not match the tag name of
-   the last start tag token emitted (compared in an ASCII case-insensitive
-   manner), or if they do but they are not immediately followed by one of
-   the following characters:
-     * U+0009 CHARACTER TABULATION
-     * U+000A LINE FEED (LF)
-     * U+000C FORM FEED (FF)
-     * U+0020 SPACE
-     * U+003E GREATER-THAN SIGN (>)
-     * U+002F SOLIDUS (/)
-     * EOF
-
-   ...then emit a U+003C LESS-THAN SIGN character token, a U+002F SOLIDUS
-   character token, and switch to the data state to process the next input
-   character.
-
-   Otherwise, if the content model flag is set to the PCDATA state, or if
-   the next few characters do match that tag name, consume the next input
-   character:
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Create a new end tag token, set its tag name to the lowercase
-          version of the input character (add 0x0020 to the character's
-          code point), then switch to the tag name state. (Don't emit the
-          token yet; further details will be filled in before it is
-          emitted.)
-
-   U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z
-          Create a new end tag token, set its tag name to the input
-          character, then switch to the tag name state. (Don't emit the
-          token yet; further details will be filled in before it is
-          emitted.)
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Switch to the data state.
-
-   EOF
-          Parse error. Emit a U+003C LESS-THAN SIGN character token and a
-          U+002F SOLIDUS character token. Reconsume the EOF character in
-          the data state.
-
-   Anything else
-          Parse error. Switch to the bogus comment state.
-
-      8.2.4.5 Tag name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the before attribute name state.
-
-   U+002F SOLIDUS (/)
-          Switch to the self-closing start tag state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Append the lowercase version of the current input character (add
-          0x0020 to the character's code point) to the current tag token's
-          tag name. Stay in the tag name state.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Append the current input character to the current tag token's
-          tag name. Stay in the tag name state.
-
-      8.2.4.6 Before attribute name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the before attribute name state.
-
-   U+002F SOLIDUS (/)
-          Switch to the self-closing start tag state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Start a new attribute in the current tag token. Set that
-          attribute's name to the lowercase version of the current input
-          character (add 0x0020 to the character's code point), and its
-          value to the empty string. Switch to the attribute name state.
-
-   U+0022 QUOTATION MARK (")
-   U+0027 APOSTROPHE (')
-   U+003D EQUALS SIGN (=)
-          Parse error. Treat it as per the "anything else" entry below.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Start a new attribute in the current tag token. Set that
-          attribute's name to the current input character, and its value
-          to the empty string. Switch to the attribute name state.
-
-      8.2.4.7 Attribute name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the after attribute name state.
-
-   U+002F SOLIDUS (/)
-          Switch to the self-closing start tag state.
-
-   U+003D EQUALS SIGN (=)
-          Switch to the before attribute value state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Append the lowercase version of the current input character (add
-          0x0020 to the character's code point) to the current attribute's
-          name. Stay in the attribute name state.
-
-   U+0022 QUOTATION MARK (")
-   U+0027 APOSTROPHE (')
-          Parse error. Treat it as per the "anything else" entry below.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Append the current input character to the current attribute's
-          name. Stay in the attribute name state.
-
-   When the user agent leaves the attribute name state (and before
-   emitting the tag token, if appropriate), the complete attribute's name
-   must be compared to the other attributes on the same token; if there is
-   already an attribute on the token with the exact same name, then this
-   is a parse error and the new attribute must be dropped, along with the
-   value that gets associated with it (if any).
-
-      8.2.4.8 After attribute name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the after attribute name state.
-
-   U+002F SOLIDUS (/)
-          Switch to the self-closing start tag state.
-
-   U+003D EQUALS SIGN (=)
-          Switch to the before attribute value state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Start a new attribute in the current tag token. Set that
-          attribute's name to the lowercase version of the current input
-          character (add 0x0020 to the character's code point), and its
-          value to the empty string. Switch to the attribute name state.
-
-   U+0022 QUOTATION MARK (")
-   U+0027 APOSTROPHE (')
-          Parse error. Treat it as per the "anything else" entry below.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Start a new attribute in the current tag token. Set that
-          attribute's name to the current input character, and its value
-          to the empty string. Switch to the attribute name state.
-
-      8.2.4.9 Before attribute value state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the before attribute value state.
-
-   U+0022 QUOTATION MARK (")
-          Switch to the attribute value (double-quoted) state.
-
-   U+0026 AMPERSAND (&)
-          Switch to the attribute value (unquoted) state and reconsume
-          this input character.
-
-   U+0027 APOSTROPHE (')
-          Switch to the attribute value (single-quoted) state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Emit the current tag token. Switch to the data
-          state.
-
-   U+003D EQUALS SIGN (=)
-          Parse error. Treat it as per the "anything else" entry below.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the character
-          in the data state.
-
-   Anything else
-          Append the current input character to the current attribute's
-          value. Switch to the attribute value (unquoted) state.
-
-      8.2.4.10 Attribute value (double-quoted) state
-
-   Consume the next input character:
-
-   U+0022 QUOTATION MARK (")
-          Switch to the after attribute value (quoted) state.
-
-   U+0026 AMPERSAND (&)
-          Switch to the character reference in attribute value state, with
-          the additional allowed character being U+0022 QUOTATION MARK
-          (").
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the character
-          in the data state.
-
-   Anything else
-          Append the current input character to the current attribute's
-          value. Stay in the attribute value (double-quoted) state.
-
-      8.2.4.11 Attribute value (single-quoted) state
-
-   Consume the next input character:
-
-   U+0027 APOSTROPHE (')
-          Switch to the after attribute value (quoted) state.
-
-   U+0026 AMPERSAND (&)
-          Switch to the character reference in attribute value state, with
-          the additional allowed character being U+0027 APOSTROPHE (').
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the character
-          in the data state.
-
-   Anything else
-          Append the current input character to the current attribute's
-          value. Stay in the attribute value (single-quoted) state.
-
-      8.2.4.12 Attribute value (unquoted) state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the before attribute name state.
-
-   U+0026 AMPERSAND (&)
-          Switch to the character reference in attribute value state, with
-          no additional allowed character.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   U+0022 QUOTATION MARK (")
-   U+0027 APOSTROPHE (')
-   U+003D EQUALS SIGN (=)
-          Parse error. Treat it as per the "anything else" entry below.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the character
-          in the data state.
-
-   Anything else
-          Append the current input character to the current attribute's
-          value. Stay in the attribute value (unquoted) state.
-
-      8.2.4.13 Character reference in attribute value state
-
-   Attempt to consume a character reference.
-
-   If nothing is returned, append a U+0026 AMPERSAND character to the
-   current attribute's value.
-
-   Otherwise, append the returned character token to the current
-   attribute's value.
-
-   Finally, switch back to the attribute value state that you were in when
-   were switched into this state.
-
-      8.2.4.14 After attribute value (quoted) state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the before attribute name state.
-
-   U+002F SOLIDUS (/)
-          Switch to the self-closing start tag state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current tag token. Switch to the data state.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Parse error. Reconsume the character in the before attribute
-          name state.
-
-      8.2.4.15 Self-closing start tag state
-
-   Consume the next input character:
-
-   U+003E GREATER-THAN SIGN (>)
-          Set the self-closing flag of the current tag token. Emit the
-          current tag token. Switch to the data state.
-
-   EOF
-          Parse error. Emit the current tag token. Reconsume the EOF
-          character in the data state.
-
-   Anything else
-          Parse error. Reconsume the character in the before attribute
-          name state.
-
-      8.2.4.16 Bogus comment state
-
-   (This can only happen if the content model flag is set to the PCDATA
-   state.)
-
-   Consume every character up to and including the first U+003E
-   GREATER-THAN SIGN character (>) or the end of the file (EOF), whichever
-   comes first. Emit a comment token whose data is the concatenation of
-   all the characters starting from and including the character that
-   caused the state machine to switch into the bogus comment state, up to
-   and including the character immediately before the last consumed
-   character (i.e. up to the character just before the U+003E or EOF
-   character). (If the comment was started by the end of the file (EOF),
-   the token is empty.)
-
-   Switch to the data state.
-
-   If the end of the file was reached, reconsume the EOF character.
-
-      8.2.4.17 Markup declaration open state
-
-   (This can only happen if the content model flag is set to the PCDATA
-   state.)
-
-   If the next two characters are both U+002D HYPHEN-MINUS (-) characters,
-   consume those two characters, create a comment token whose data is the
-   empty string, and switch to the comment start state.
-
-   Otherwise, if the next seven characters are an ASCII case-insensitive
-   match for the word "DOCTYPE", then consume those characters and switch
-   to the DOCTYPE state.
-
-   Otherwise, if the insertion mode is "in foreign content" and the
-   current node is not an element in the HTML namespace and the next seven
-   characters are an ASCII case-sensitive match for the string "[CDATA["
-   (the five uppercase letters "CDATA" with a U+005B LEFT SQUARE BRACKET
-   character before and after), then consume those characters and switch
-   to the CDATA section state (which is unrelated to the content model
-   flag's CDATA state).
-
-   Otherwise, this is a parse error. Switch to the bogus comment state.
-   The next character that is consumed, if any, is the first character
-   that will be in the comment.
-
-      8.2.4.18 Comment start state
-
-   Consume the next input character:
-
-   U+002D HYPHEN-MINUS (-)
-          Switch to the comment start dash state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Emit the comment token. Switch to the data state.
-
-   EOF
-          Parse error. Emit the comment token. Reconsume the EOF character
-          in the data state.
-
-   Anything else
-          Append the input character to the comment token's data. Switch
-          to the comment state.
-
-      8.2.4.19 Comment start dash state
-
-   Consume the next input character:
-
-   U+002D HYPHEN-MINUS (-)
-          Switch to the comment end state
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Emit the comment token. Switch to the data state.
-
-   EOF
-          Parse error. Emit the comment token. Reconsume the EOF character
-          in the data state.
-
-   Anything else
-          Append a U+002D HYPHEN-MINUS (-) character and the input
-          character to the comment token's data. Switch to the comment
-          state.
-
-      8.2.4.20 Comment state
-
-   Consume the next input character:
-
-   U+002D HYPHEN-MINUS (-)
-          Switch to the comment end dash state
-
-   EOF
-          Parse error. Emit the comment token. Reconsume the EOF character
-          in the data state.
-
-   Anything else
-          Append the input character to the comment token's data. Stay in
-          the comment state.
-
-      8.2.4.21 Comment end dash state
-
-   Consume the next input character:
-
-   U+002D HYPHEN-MINUS (-)
-          Switch to the comment end state
-
-   EOF
-          Parse error. Emit the comment token. Reconsume the EOF character
-          in the data state.
-
-   Anything else
-          Append a U+002D HYPHEN-MINUS (-) character and the input
-          character to the comment token's data. Switch to the comment
-          state.
-
-      8.2.4.22 Comment end state
-
-   Consume the next input character:
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the comment token. Switch to the data state.
-
-   U+002D HYPHEN-MINUS (-)
-          Parse error. Append a U+002D HYPHEN-MINUS (-) character to the
-          comment token's data. Stay in the comment end state.
-
-   EOF
-          Parse error. Emit the comment token. Reconsume the EOF character
-          in the data state.
-
-   Anything else
-          Parse error. Append two U+002D HYPHEN-MINUS (-) characters and
-          the input character to the comment token's data. Switch to the
-          comment state.
-
-      8.2.4.23 DOCTYPE state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the before DOCTYPE name state.
-
-   Anything else
-          Parse error. Reconsume the current character in the before
-          DOCTYPE name state.
-
-      8.2.4.24 Before DOCTYPE name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the before DOCTYPE name state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Create a new DOCTYPE token. Set its force-quirks
-          flag to on. Emit the token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Create a new DOCTYPE token. Set the token's name to the
-          lowercase version of the input character (add 0x0020 to the
-          character's code point). Switch to the DOCTYPE name state.
-
-   EOF
-          Parse error. Create a new DOCTYPE token. Set its force-quirks
-          flag to on. Emit the token. Reconsume the EOF character in the
-          data state.
-
-   Anything else
-          Create a new DOCTYPE token. Set the token's name to the current
-          input character. Switch to the DOCTYPE name state.
-
-      8.2.4.25 DOCTYPE name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Switch to the after DOCTYPE name state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current DOCTYPE token. Switch to the data state.
-
-   U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z
-          Append the lowercase version of the input character (add 0x0020
-          to the character's code point) to the current DOCTYPE token's
-          name. Stay in the DOCTYPE name state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Append the current input character to the current DOCTYPE
-          token's name. Stay in the DOCTYPE name state.
-
-      8.2.4.26 After DOCTYPE name state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the after DOCTYPE name state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          If the six characters starting from the current input character
-          are an ASCII case-insensitive match for the word "PUBLIC", then
-          consume those characters and switch to the before DOCTYPE public
-          identifier state.
-
-          Otherwise, if the six characters starting from the current input
-          character are an ASCII case-insensitive match for the word
-          "SYSTEM", then consume those characters and switch to the before
-          DOCTYPE system identifier state.
-
-          Otherwise, this is the parse error. Set the DOCTYPE token's
-          force-quirks flag to on. Switch to the bogus DOCTYPE state.
-
-      8.2.4.27 Before DOCTYPE public identifier state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the before DOCTYPE public identifier state.
-
-   U+0022 QUOTATION MARK (")
-          Set the DOCTYPE token's public identifier to the empty string
-          (not missing), then switch to the DOCTYPE public identifier
-          (double-quoted) state.
-
-   U+0027 APOSTROPHE (')
-          Set the DOCTYPE token's public identifier to the empty string
-          (not missing), then switch to the DOCTYPE public identifier
-          (single-quoted) state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Switch to the bogus DOCTYPE state.
-
-      8.2.4.28 DOCTYPE public identifier (double-quoted) state
-
-   Consume the next input character:
-
-   U+0022 QUOTATION MARK (")
-          Switch to the after DOCTYPE public identifier state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Append the current input character to the current DOCTYPE
-          token's public identifier. Stay in the DOCTYPE public identifier
-          (double-quoted) state.
-
-      8.2.4.29 DOCTYPE public identifier (single-quoted) state
-
-   Consume the next input character:
-
-   U+0027 APOSTROPHE (')
-          Switch to the after DOCTYPE public identifier state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Append the current input character to the current DOCTYPE
-          token's public identifier. Stay in the DOCTYPE public identifier
-          (single-quoted) state.
-
-      8.2.4.30 After DOCTYPE public identifier state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the after DOCTYPE public identifier state.
-
-   U+0022 QUOTATION MARK (")
-          Set the DOCTYPE token's system identifier to the empty string
-          (not missing), then switch to the DOCTYPE system identifier
-          (double-quoted) state.
-
-   U+0027 APOSTROPHE (')
-          Set the DOCTYPE token's system identifier to the empty string
-          (not missing), then switch to the DOCTYPE system identifier
-          (single-quoted) state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Switch to the bogus DOCTYPE state.
-
-      8.2.4.31 Before DOCTYPE system identifier state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the before DOCTYPE system identifier state.
-
-   U+0022 QUOTATION MARK (")
-          Set the DOCTYPE token's system identifier to the empty string
-          (not missing), then switch to the DOCTYPE system identifier
-          (double-quoted) state.
-
-   U+0027 APOSTROPHE (')
-          Set the DOCTYPE token's system identifier to the empty string
-          (not missing), then switch to the DOCTYPE system identifier
-          (single-quoted) state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Switch to the bogus DOCTYPE state.
-
-      8.2.4.32 DOCTYPE system identifier (double-quoted) state
-
-   Consume the next input character:
-
-   U+0022 QUOTATION MARK (")
-          Switch to the after DOCTYPE system identifier state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Append the current input character to the current DOCTYPE
-          token's system identifier. Stay in the DOCTYPE system identifier
-          (double-quoted) state.
-
-      8.2.4.33 DOCTYPE system identifier (single-quoted) state
-
-   Consume the next input character:
-
-   U+0027 APOSTROPHE (')
-          Switch to the after DOCTYPE system identifier state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Append the current input character to the current DOCTYPE
-          token's system identifier. Stay in the DOCTYPE system identifier
-          (single-quoted) state.
-
-      8.2.4.34 After DOCTYPE system identifier state
-
-   Consume the next input character:
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-          Stay in the after DOCTYPE system identifier state.
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the current DOCTYPE token. Switch to the data state.
-
-   EOF
-          Parse error. Set the DOCTYPE token's force-quirks flag to on.
-          Emit that DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Parse error. Switch to the bogus DOCTYPE state. (This does not
-          set the DOCTYPE token's force-quirks flag to on.)
-
-      8.2.4.35 Bogus DOCTYPE state
-
-   Consume the next input character:
-
-   U+003E GREATER-THAN SIGN (>)
-          Emit the DOCTYPE token. Switch to the data state.
-
-   EOF
-          Emit the DOCTYPE token. Reconsume the EOF character in the data
-          state.
-
-   Anything else
-          Stay in the bogus DOCTYPE state.
-
-      8.2.4.36 CDATA section state
-
-   (This can only happen if the content model flag is set to the PCDATA
-   state, and is unrelated to the content model flag's CDATA state.)
-
-   Consume every character up to the next occurrence of the three
-   character sequence U+005D RIGHT SQUARE BRACKET U+005D RIGHT SQUARE
-   BRACKET U+003E GREATER-THAN SIGN (]]>), or the end of the file (EOF),
-   whichever comes first. Emit a series of character tokens consisting of
-   all the characters consumed except the matching three character
-   sequence at the end (if one was found before the end of the file).
-
-   Switch to the data state.
-
-   If the end of the file was reached, reconsume the EOF character.
-
-      8.2.4.37 Tokenizing character references
-
-   This section defines how to consume a character reference. This
-   definition is used when parsing character references in text and in
-   attributes.
-
-   The behavior depends on the identity of the next character (the one
-   immediately after the U+0026 AMPERSAND character):
-
-   U+0009 CHARACTER TABULATION
-   U+000A LINE FEED (LF)
-   U+000C FORM FEED (FF)
-   U+0020 SPACE
-   U+003C LESS-THAN SIGN
-   U+0026 AMPERSAND
-   EOF
-   The additional allowed character, if there is one
-          Not a character reference. No characters are consumed, and
-          nothing is returned. (This is not an error, either.)
-
-   U+0023 NUMBER SIGN (#)
-          Consume the U+0023 NUMBER SIGN.
-
-          The behavior further depends on the character after the U+0023
-          NUMBER SIGN:
-
-        U+0078 LATIN SMALL LETTER X
-        U+0058 LATIN CAPITAL LETTER X
-                Consume the X.
-
-                Follow the steps below, but using the range of characters
-                U+0030 DIGIT ZERO through to U+0039 DIGIT NINE, U+0061
-                LATIN SMALL LETTER A through to U+0066 LATIN SMALL LETTER
-                F, and U+0041 LATIN CAPITAL LETTER A, through to U+0046
-                LATIN CAPITAL LETTER F (in other words, 0-9, A-F, a-f).
-
-                When it comes to interpreting the number, interpret it as
-                a hexadecimal number.
-
-        Anything else
-                Follow the steps below, but using the range of characters
-                U+0030 DIGIT ZERO through to U+0039 DIGIT NINE (i.e. just
-                0-9).
-
-                When it comes to interpreting the number, interpret it as
-                a decimal number.
-
-          Consume as many characters as match the range of characters
-          given above.
-
-          If no characters match the range, then don't consume any
-          characters (and unconsume the U+0023 NUMBER SIGN character and,
-          if appropriate, the X character). This is a parse error; nothing
-          is returned.
-
-          Otherwise, if the next character is a U+003B SEMICOLON, consume
-          that too. If it isn't, there is a parse error.
-
-          If one or more characters match the range, then take them all
-          and interpret the string of characters as a number (either
-          hexadecimal or decimal as appropriate).
-
-          If that number is one of the numbers in the first column of the
-          following table, then this is a parse error. Find the row with
-          that number in the first column, and return a character token
-          for the Unicode character given in the second column of that
-          row.
-
-          Number                   Unicode character
-          0x0D   U+000A LINE FEED (LF)
-          0x80   U+20AC EURO SIGN ('€')
-          0x81   U+FFFD REPLACEMENT CHARACTER
-          0x82   U+201A SINGLE LOW-9 QUOTATION MARK ('‚')
-          0x83   U+0192 LATIN SMALL LETTER F WITH HOOK ('ƒ')
-          0x84   U+201E DOUBLE LOW-9 QUOTATION MARK ('„')
-          0x85   U+2026 HORIZONTAL ELLIPSIS ('…')
-          0x86   U+2020 DAGGER ('†')
-          0x87   U+2021 DOUBLE DAGGER ('‡')
-          0x88   U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT ('ˆ')
-          0x89   U+2030 PER MILLE SIGN ('‰')
-          0x8A   U+0160 LATIN CAPITAL LETTER S WITH CARON ('Š')
-          0x8B   U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK ('‹')
-          0x8C   U+0152 LATIN CAPITAL LIGATURE OE ('Œ')
-          0x8D   U+FFFD REPLACEMENT CHARACTER
-          0x8E   U+017D LATIN CAPITAL LETTER Z WITH CARON ('Ž')
-          0x8F   U+FFFD REPLACEMENT CHARACTER
-          0x90   U+FFFD REPLACEMENT CHARACTER
-          0x91   U+2018 LEFT SINGLE QUOTATION MARK ('‘')
-          0x92   U+2019 RIGHT SINGLE QUOTATION MARK ('’')
-          0x93   U+201C LEFT DOUBLE QUOTATION MARK ('“')
-          0x94   U+201D RIGHT DOUBLE QUOTATION MARK ('”')
-          0x95   U+2022 BULLET ('•')
-          0x96   U+2013 EN DASH ('–')
-          0x97   U+2014 EM DASH ('—')
-          0x98   U+02DC SMALL TILDE ('˜')
-          0x99   U+2122 TRADE MARK SIGN ('™')
-          0x9A   U+0161 LATIN SMALL LETTER S WITH CARON ('š')
-          0x9B   U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK ('›')
-          0x9C   U+0153 LATIN SMALL LIGATURE OE ('œ')
-          0x9D   U+FFFD REPLACEMENT CHARACTER
-          0x9E   U+017E LATIN SMALL LETTER Z WITH CARON ('ž')
-          0x9F   U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS ('Ÿ')
-
-          Otherwise, if the number is in the range 0x0000 to 0x0008,
-          0x000E to 0x001F, 0x007F to 0x009F, 0xD800 to 0xDFFF, 0xFDD0 to
-          0xFDEF, or is one of 0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF,
-          0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE,
-          0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF,
-          0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE,
-          0xCFFFF, 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF,
-          0x10FFFE, or 0x10FFFF, or is higher than 0x10FFFF, then this is
-          a parse error; return a character token for the U+FFFD
-          REPLACEMENT CHARACTER character instead.
-
-          Otherwise, return a character token for the Unicode character
-          whose code point is that number.
-
-   Anything else
-          Consume the maximum number of characters possible, with the
-          consumed characters matching one of the identifiers in the first
-          column of the named character references table (in a
-          case-sensitive manner).
-
-          If no match can be made, then this is a parse error. No
-          characters are consumed, and nothing is returned.
-
-          If the last character matched is not a U+003B SEMICOLON (;),
-          there is a parse error.
-
-          If the character reference is being consumed as part of an
-          attribute, and the last character matched is not a U+003B
-          SEMICOLON (;), and the next character is in the range U+0030
-          DIGIT ZERO to U+0039 DIGIT NINE, U+0041 LATIN CAPITAL LETTER A
-          to U+005A LATIN CAPITAL LETTER Z, or U+0061 LATIN SMALL LETTER A
-          to U+007A LATIN SMALL LETTER Z, then, for historical reasons,
-          all the characters that were matched after the U+0026 AMPERSAND
-          (&) must be unconsumed, and nothing is returned.
-
-          Otherwise, return a character token for the character
-          corresponding to the character reference name (as given by the
-          second column of the named character references table).
-
-          If the markup contains I'm &notit; I tell you, the character
-          reference is parsed as "not", as in, I'm ¬it; I tell you. But if
-          the markup was I'm &notin; I tell you, the character reference
-          would be parsed as "notin;", resulting in I'm ∉ I tell you.
diff --git a/doc/tree-construction.txt b/doc/tree-construction.txt
deleted file mode 100644
index 0febf147..00000000
--- a/doc/tree-construction.txt
+++ /dev/null
@@ -1,2201 +0,0 @@
-   #8.2.4 Tokenization Table of contents 8.4 Serializing HTML fragments
-
-   WHATWG
-
-HTML 5
-
-Draft Recommendation — 13 January 2009
-
-   ← 8.2.4 Tokenization – Table of contents – 8.4 Serializing HTML
-   fragments →
-
-    8.2.5 Tree construction
-
-   The input to the tree construction stage is a sequence of tokens from
-   the tokenization stage. The tree construction stage is associated with
-   a DOM Document object when a parser is created. The "output" of this
-   stage consists of dynamically modifying or extending that document's
-   DOM tree.
-
-   This specification does not define when an interactive user agent has
-   to render the Document so that it is available to the user, or when it
-   has to begin accepting user input.
-
-   As each token is emitted from the tokeniser, the user agent must
-   process the token according to the rules given in the section
-   corresponding to the current insertion mode.
-
-   When the steps below require the UA to insert a character into a node,
-   if that node has a child immediately before where the character is to
-   be inserted, and that child is a Text node, and that Text node was the
-   last node that the parser inserted into the document, then the
-   character must be appended to that Text node; otherwise, a new Text
-   node whose data is just that character must be inserted in the
-   appropriate place.
-
-   DOM mutation events must not fire for changes caused by the UA parsing
-   the document. (Conceptually, the parser is not mutating the DOM, it is
-   constructing it.) This includes the parsing of any content inserted
-   using document.write() and document.writeln() calls. [DOM3EVENTS]
-
-   Not all of the tag names mentioned below are conformant tag names in
-   this specification; many are included to handle legacy content. They
-   still form part of the algorithm that implementations are required to
-   implement to claim conformance.
-
-   The algorithm described below places no limit on the depth of the DOM
-   tree generated, or on the length of tag names, attribute names,
-   attribute values, text nodes, etc. While implementors are encouraged to
-   avoid arbitrary limits, it is recognized that practical concerns will
-   likely force user agents to impose nesting depths.
-
-      8.2.5.1 Creating and inserting elements
-
-   When the steps below require the UA to create an element for a token in
-   a particular namespace, the UA must create a node implementing the
-   interface appropriate for the element type corresponding to the tag
-   name of the token in the given namespace (as given in the specification
-   that defines that element, e.g. for an a element in the HTML namespace,
-   this specification defines it to be the HTMLAnchorElement interface),
-   with the tag name being the name of that element, with the node being
-   in the given namespace, and with the attributes on the node being those
-   given in the given token.
-
-   The interface appropriate for an element in the HTML namespace that is
-   not defined in this specification is HTMLElement. The interface
-   appropriate for an element in another namespace that is not defined by
-   that namespace's specification is Element.
-
-   When a resettable element is created in this manner, its reset
-   algorithm must be invoked once the attributes are set. (This
-   initializes the element's value and checkedness based on the element's
-   attributes.)
-     __________________________________________________________________
-
-   When the steps below require the UA to insert an HTML element for a
-   token, the UA must first create an element for the token in the HTML
-   namespace, and then append this node to the current node, and push it
-   onto the stack of open elements so that it is the new current node.
-
-   The steps below may also require that the UA insert an HTML element in
-   a particular place, in which case the UA must follow the same steps
-   except that it must insert or append the new node in the location
-   specified instead of appending it to the current node. (This happens in
-   particular during the parsing of tables with invalid content.)
-
-   If an element created by the insert an HTML element algorithm is a
-   form-associated element, and the form element pointer is not null, and
-   the newly created element doesn't have a form attribute, the user agent
-   must associate the newly created element with the form element pointed
-   to by the form element pointer before inserting it wherever it is to be
-   inserted.
-     __________________________________________________________________
-
-   When the steps below require the UA to insert a foreign element for a
-   token, the UA must first create an element for the token in the given
-   namespace, and then append this node to the current node, and push it
-   onto the stack of open elements so that it is the new current node. If
-   the newly created element has an xmlns attribute in the XMLNS namespace
-   whose value is not exactly the same as the element's namespace, that is
-   a parse error.
-
-   When the steps below require the user agent to adjust MathML attributes
-   for a token, then, if the token has an attribute named definitionurl,
-   change its name to definitionURL (note the case difference).
-
-   When the steps below require the user agent to adjust foreign
-   attributes for a token, then, if any of the attributes on the token
-   match the strings given in the first column of the following table, let
-   the attribute be a namespaced attribute, with the prefix being the
-   string given in the corresponding cell in the second column, the local
-   name being the string given in the corresponding cell in the third
-   column, and the namespace being the namespace given in the
-   corresponding cell in the fourth column. (This fixes the use of
-   namespaced attributes, in particular xml:lang.)
-
-   Attribute name Prefix Local name    Namespace
-   xlink:actuate  xlink  actuate    XLink namespace
-   xlink:arcrole  xlink  arcrole    XLink namespace
-   xlink:href     xlink  href       XLink namespace
-   xlink:role     xlink  role       XLink namespace
-   xlink:show     xlink  show       XLink namespace
-   xlink:title    xlink  title      XLink namespace
-   xlink:type     xlink  type       XLink namespace
-   xml:base       xml    base       XML namespace
-   xml:lang       xml    lang       XML namespace
-   xml:space      xml    space      XML namespace
-   xmlns          (none) xmlns      XMLNS namespace
-   xmlns:xlink    xmlns  xlink      XMLNS namespace
-     __________________________________________________________________
-
-   The generic CDATA element parsing algorithm and the generic RCDATA
-   element parsing algorithm consist of the following steps. These
-   algorithms are always invoked in response to a start tag token.
-    1. Insert an HTML element for the token.
-    2. If the algorithm that was invoked is the generic CDATA element
-       parsing algorithm, switch the tokeniser's content model flag to the
-       CDATA state; otherwise the algorithm invoked was the generic RCDATA
-       element parsing algorithm, switch the tokeniser's content model
-       flag to the RCDATA state.
-    3. Let the original insertion mode be the current insertion mode.
-    4. Then, switch the insertion mode to "in CDATA/RCDATA".
-
-      8.2.5.2 Closing elements that have implied end tags
-
-   When the steps below require the UA to generate implied end tags, then,
-   while the current node is a dd element, a dt element, an li element, an
-   option element, an optgroup element, a p element, an rp element, or an
-   rt element, the UA must pop the current node off the stack of open
-   elements.
-
-   If a step requires the UA to generate implied end tags but lists an
-   element to exclude from the process, then the UA must perform the above
-   steps as if that element was not in the above list.
-
-      8.2.5.3 Foster parenting
-
-   Foster parenting happens when content is misnested in tables.
-
-   When a node node is to be foster parented, the node node must be
-   inserted into the foster parent element, and the current table must be
-   marked as tainted. (Once the current table has been tainted, whitespace
-   characters are inserted into the foster parent element instead of the
-   current node.)
-
-   The foster parent element is the parent element of the last table
-   element in the stack of open elements, if there is a table element and
-   it has such a parent element. If there is no table element in the stack
-   of open elements (fragment case), then the foster parent element is the
-   first element in the stack of open elements (the html element).
-   Otherwise, if there is a table element in the stack of open elements,
-   but the last table element in the stack of open elements has no parent,
-   or its parent node is not an element, then the foster parent element is
-   the element before the last table element in the stack of open
-   elements.
-
-   If the foster parent element is the parent element of the last table
-   element in the stack of open elements, then node must be inserted
-   immediately before the last table element in the stack of open elements
-   in the foster parent element; otherwise, node must be appended to the
-   foster parent element.
-
-      8.2.5.4 The "initial" insertion mode
-
-   When the insertion mode is "initial", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Ignore the token.
-
-   A comment token
-          Append a Comment node to the Document object with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          If the DOCTYPE token's name is not a case-sensitive match for
-          the string "html", or if the token's public identifier is
-          neither missing nor a case-sensitive match for the string
-          "XSLT-compat", or if the token's system identifier is not
-          missing, then there is a parse error (this is the DOCTYPE parse
-          error). Conformance checkers may, instead of reporting this
-          error, switch to a conformance checking mode for another
-          language (e.g. based on the DOCTYPE token a conformance checker
-          could recognize that the document is an HTML4-era document, and
-          defer to an HTML4 conformance checker.)
-
-          Append a DocumentType node to the Document node, with the name
-          attribute set to the name given in the DOCTYPE token; the
-          publicId attribute set to the public identifier given in the
-          DOCTYPE token, or the empty string if the public identifier was
-          missing; the systemId attribute set to the system identifier
-          given in the DOCTYPE token, or the empty string if the system
-          identifier was missing; and the other attributes specific to
-          DocumentType objects set to null and empty lists as appropriate.
-          Associate the DocumentType node with the Document object so that
-          it is returned as the value of the doctype attribute of the
-          Document object.
-
-          Then, if the DOCTYPE token matches one of the conditions in the
-          following list, then set the document to quirks mode:
-
-          + The force-quirks flag is set to on.
-          + The name is set to anything other than "HTML".
-          + The public identifier starts with: "+//Silmaril//dtd html Pro
-            v0r11 19970101//"
-          + The public identifier starts with: "-//AdvaSoft Ltd//DTD HTML
-            3.0 asWedit + extensions//"
-          + The public identifier starts with: "-//AS//DTD HTML 3.0
-            asWedit + extensions//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0
-            Level 1//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0
-            Level 2//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0
-            Strict Level 1//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0
-            Strict Level 2//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0
-            Strict//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.0//"
-          + The public identifier starts with: "-//IETF//DTD HTML 2.1E//"
-          + The public identifier starts with: "-//IETF//DTD HTML 3.0//"
-          + The public identifier starts with: "-//IETF//DTD HTML 3.2
-            Final//"
-          + The public identifier starts with: "-//IETF//DTD HTML 3.2//"
-          + The public identifier starts with: "-//IETF//DTD HTML 3//"
-          + The public identifier starts with: "-//IETF//DTD HTML Level
-            0//"
-          + The public identifier starts with: "-//IETF//DTD HTML Level
-            1//"
-          + The public identifier starts with: "-//IETF//DTD HTML Level
-            2//"
-          + The public identifier starts with: "-//IETF//DTD HTML Level
-            3//"
-          + The public identifier starts with: "-//IETF//DTD HTML Strict
-            Level 0//"
-          + The public identifier starts with: "-//IETF//DTD HTML Strict
-            Level 1//"
-          + The public identifier starts with: "-//IETF//DTD HTML Strict
-            Level 2//"
-          + The public identifier starts with: "-//IETF//DTD HTML Strict
-            Level 3//"
-          + The public identifier starts with: "-//IETF//DTD HTML
-            Strict//"
-          + The public identifier starts with: "-//IETF//DTD HTML//"
-          + The public identifier starts with: "-//Metrius//DTD Metrius
-            Presentational//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 2.0 HTML Strict//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 2.0 HTML//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 2.0 Tables//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 3.0 HTML Strict//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 3.0 HTML//"
-          + The public identifier starts with: "-//Microsoft//DTD Internet
-            Explorer 3.0 Tables//"
-          + The public identifier starts with: "-//Netscape Comm.
-            Corp.//DTD HTML//"
-          + The public identifier starts with: "-//Netscape Comm.
-            Corp.//DTD Strict HTML//"
-          + The public identifier starts with: "-//O'Reilly and
-            Associates//DTD HTML 2.0//"
-          + The public identifier starts with: "-//O'Reilly and
-            Associates//DTD HTML Extended 1.0//"
-          + The public identifier starts with: "-//O'Reilly and
-            Associates//DTD HTML Extended Relaxed 1.0//"
-          + The public identifier starts with: "-//SoftQuad Software//DTD
-            HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//"
-          + The public identifier starts with: "-//SoftQuad//DTD HoTMetaL
-            PRO 4.0::19971010::extensions to HTML 4.0//"
-          + The public identifier starts with: "-//Spyglass//DTD HTML 2.0
-            Extended//"
-          + The public identifier starts with: "-//SQ//DTD HTML 2.0
-            HoTMetaL + extensions//"
-          + The public identifier starts with: "-//Sun Microsystems
-            Corp.//DTD HotJava HTML//"
-          + The public identifier starts with: "-//Sun Microsystems
-            Corp.//DTD HotJava Strict HTML//"
-          + The public identifier starts with: "-//W3C//DTD HTML 3
-            1995-03-24//"
-          + The public identifier starts with: "-//W3C//DTD HTML 3.2
-            Draft//"
-          + The public identifier starts with: "-//W3C//DTD HTML 3.2
-            Final//"
-          + The public identifier starts with: "-//W3C//DTD HTML 3.2//"
-          + The public identifier starts with: "-//W3C//DTD HTML 3.2S
-            Draft//"
-          + The public identifier starts with: "-//W3C//DTD HTML 4.0
-            Frameset//"
-          + The public identifier starts with: "-//W3C//DTD HTML 4.0
-            Transitional//"
-          + The public identifier starts with: "-//W3C//DTD HTML
-            Experimental 19960712//"
-          + The public identifier starts with: "-//W3C//DTD HTML
-            Experimental 970421//"
-          + The public identifier starts with: "-//W3C//DTD W3 HTML//"
-          + The public identifier starts with: "-//W3O//DTD W3 HTML 3.0//"
-          + The public identifier is set to: "-//W3O//DTD W3 HTML Strict
-            3.0//EN//"
-          + The public identifier starts with: "-//WebTechs//DTD Mozilla
-            HTML 2.0//"
-          + The public identifier starts with: "-//WebTechs//DTD Mozilla
-            HTML//"
-          + The public identifier is set to: "-/W3C/DTD HTML 4.0
-            Transitional/EN"
-          + The public identifier is set to: "HTML"
-          + The system identifier is set to:
-            "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"
-          + The system identifier is missing and the public identifier
-            starts with: "-//W3C//DTD HTML 4.01 Frameset//"
-          + The system identifier is missing and the public identifier
-            starts with: "-//W3C//DTD HTML 4.01 Transitional//"
-
-          Otherwise, if the DOCTYPE token matches one of the conditions in
-          the following list, then set the document to limited quirks
-          mode:
-
-          + The public identifier starts with: "-//W3C//DTD XHTML 1.0
-            Frameset//"
-          + The public identifier starts with: "-//W3C//DTD XHTML 1.0
-            Transitional//"
-          + The system identifier is not missing and the public identifier
-            starts with: "-//W3C//DTD HTML 4.01 Frameset//"
-          + The system identifier is not missing and the public identifier
-            starts with: "-//W3C//DTD HTML 4.01 Transitional//"
-
-          The name, system identifier, and public identifier strings must
-          be compared to the values given in the lists above in an ASCII
-          case-insensitive manner. A system identifier whose value is the
-          empty string is not considered missing for the purposes of the
-          conditions above.
-
-          Then, switch the insertion mode to "before html".
-
-   Anything else
-          Parse error.
-
-          Set the document to quirks mode.
-
-          Switch the insertion mode to "before html", then reprocess the
-          current token.
-
-      8.2.5.5 The "before html" insertion mode
-
-   When the insertion mode is "before html", tokens must be handled as
-   follows:
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A comment token
-          Append a Comment node to the Document object with the data
-          attribute set to the data given in the comment token.
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Ignore the token.
-
-   A start tag whose tag name is "html"
-          Create an element for the token in the HTML namespace. Append it
-          to the Document object. Put this element in the stack of open
-          elements.
-
-          If the token has an attribute "manifest", then resolve the value
-          of that attribute to an absolute URL, and if that is successful,
-          run the application cache selection algorithm with the resulting
-          absolute URL. Otherwise, if there is no such attribute or
-          resolving it fails, run the application cache selection
-          algorithm with no manifest. The algorithm must be passed the
-          Document object.
-
-          Switch the insertion mode to "before head".
-
-   Anything else
-          Create an HTMLElement node with the tag name html, in the HTML
-          namespace. Append it to the Document object. Put this element in
-          the stack of open elements.
-
-          Run the application cache selection algorithm with no manifest,
-          passing it the Document object.
-
-          Switch the insertion mode to "before head", then reprocess the
-          current token.
-
-          Should probably make end tags be ignored, so that "</head><!--
-          --><html>" puts the comment before the root node (or should we?)
-
-   The root element can end up being removed from the Document object,
-   e.g. by scripts; nothing in particular happens in such cases, content
-   continues being appended to the nodes as described in the next section.
-
-      8.2.5.6 The "before head" insertion mode
-
-   When the insertion mode is "before head", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Ignore the token.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is "head"
-          Insert an HTML element for the token.
-
-          Set the head element pointer to the newly created head element.
-
-          Switch the insertion mode to "in head".
-
-   An end tag whose tag name is one of: "head", "br"
-          Act as if a start tag token with the tag name "head" and no
-          attributes had been seen, then reprocess the current token.
-
-   Any other end tag
-          Parse error. Ignore the token.
-
-   Anything else
-          Act as if a start tag token with the tag name "head" and no
-          attributes had been seen, then reprocess the current token.
-
-          This will result in an empty head element being generated, with
-          the current token being reprocessed in the "after head"
-          insertion mode.
-
-      8.2.5.7 The "in head" insertion mode
-
-   When the insertion mode is "in head", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is one of: "base", "command", "eventsource",
-          "link"
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   A start tag whose tag name is "meta"
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-          If the element has a charset attribute, and its value is a
-          supported encoding, and the confidence is currently tentative,
-          then change the encoding to the encoding given by the value of
-          the charset attribute.
-
-          Otherwise, if the element has a content attribute, and applying
-          the algorithm for extracting an encoding from a Content-Type to
-          its value returns a supported encoding encoding, and the
-          confidence is currently tentative, then change the encoding to
-          the encoding encoding.
-
-   A start tag whose tag name is "title"
-          Follow the generic RCDATA element parsing algorithm.
-
-   A start tag whose tag name is "noscript", if the scripting flag is
-          enabled
-
-   A start tag whose tag name is one of: "noframes", "style"
-          Follow the generic CDATA element parsing algorithm.
-
-   A start tag whose tag name is "noscript", if the scripting flag is
-          disabled
-          Insert an HTML element for the token.
-
-          Switch the insertion mode to "in head noscript".
-
-   A start tag whose tag name is "script"
-
-         1. Create an element for the token in the HTML namespace.
-         2. Mark the element as being "parser-inserted".
-            This ensures that, if the script is external, any
-            document.write() calls in the script will execute in-line,
-            instead of blowing the document away, as would happen in most
-            other cases. It also prevents the script from executing until
-            the end tag is seen.
-         3. If the parser was originally created for the HTML fragment
-            parsing algorithm, then mark the script element as "already
-            executed". (fragment case)
-         4. Append the new element to the current node.
-         5. Switch the tokeniser's content model flag to the CDATA state.
-         6. Let the original insertion mode be the current insertion mode.
-         7. Switch the insertion mode to "in CDATA/RCDATA".
-
-   An end tag whose tag name is "head"
-          Pop the current node (which will be the head element) off the
-          stack of open elements.
-
-          Switch the insertion mode to "after head".
-
-   An end tag whose tag name is "br"
-          Act as described in the "anything else" entry below.
-
-   A start tag whose tag name is "head"
-   Any other end tag
-          Parse error. Ignore the token.
-
-   Anything else
-          Act as if an end tag token with the tag name "head" had been
-          seen, and reprocess the current token.
-
-          In certain UAs, some elements don't trigger the "in body" mode
-          straight away, but instead get put into the head. Do we want to
-          copy that?
-
-      8.2.5.8 The "in head noscript" insertion mode
-
-   When the insertion mode is "in head noscript", tokens must be handled
-   as follows:
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   An end tag whose tag name is "noscript"
-          Pop the current node (which will be a noscript element) from the
-          stack of open elements; the new current node will be a head
-          element.
-
-          Switch the insertion mode to "in head".
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-
-   A comment token
-   A start tag whose tag name is one of: "link", "meta", "noframes",
-          "style"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   An end tag whose tag name is "br"
-          Act as described in the "anything else" entry below.
-
-   A start tag whose tag name is one of: "head", "noscript"
-   Any other end tag
-          Parse error. Ignore the token.
-
-   Anything else
-          Parse error. Act as if an end tag with the tag name "noscript"
-          had been seen and reprocess the current token.
-
-      8.2.5.9 The "after head" insertion mode
-
-   When the insertion mode is "after head", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is "body"
-          Insert an HTML element for the token.
-
-          Switch the insertion mode to "in body".
-
-   A start tag whose tag name is "frameset"
-          Insert an HTML element for the token.
-
-          Switch the insertion mode to "in frameset".
-
-   A start tag token whose tag name is one of: "base", "link", "meta",
-          "noframes", "script", "style", "title"
-          Parse error.
-
-          Push the node pointed to by the head element pointer onto the
-          stack of open elements.
-
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-          Remove the node pointed to by the head element pointer from the
-          stack of open elements.
-
-   An end tag whose tag name is "br"
-          Act as described in the "anything else" entry below.
-
-   A start tag whose tag name is "head"
-   Any other end tag
-          Parse error. Ignore the token.
-
-   Anything else
-          Act as if a start tag token with the tag name "body" and no
-          attributes had been seen, and then reprocess the current token.
-
-      8.2.5.10 The "in body" insertion mode
-
-   When the insertion mode is "in body", tokens must be handled as
-   follows:
-
-   A character token
-          Reconstruct the active formatting elements, if any.
-
-          Insert the token's character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Parse error. For each attribute on the token, check to see if
-          the attribute is already present on the top element of the stack
-          of open elements. If it is not, add the attribute and its
-          corresponding value to that element.
-
-   A start tag token whose tag name is one of: "base", "command",
-          "eventsource", "link", "meta", "noframes", "script", "style",
-          "title"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   A start tag whose tag name is "body"
-          Parse error.
-
-          If the second element on the stack of open elements is not a
-          body element, or, if the stack of open elements has only one
-          node on it, then ignore the token. (fragment case)
-
-          Otherwise, for each attribute on the token, check to see if the
-          attribute is already present on the body element (the second
-          element) on the stack of open elements. If it is not, add the
-          attribute and its corresponding value to that element.
-
-   An end-of-file token
-          If there is a node in the stack of open elements that is not
-          either a dd element, a dt element, an li element, a p element, a
-          tbody element, a td element, a tfoot element, a th element, a
-          thead element, a tr element, the body element, or the html
-          element, then this is a parse error.
-
-          Stop parsing.
-
-   An end tag whose tag name is "body"
-          If the stack of open elements does not have a body element in
-          scope, this is a parse error; ignore the token.
-
-          Otherwise, if there is a node in the stack of open elements that
-          is not either a dd element, a dt element, an li element, a p
-          element, a tbody element, a td element, a tfoot element, a th
-          element, a thead element, a tr element, the body element, or the
-          html element, then this is a parse error.
-
-          Switch the insertion mode to "after body".
-
-   An end tag whose tag name is "html"
-          Act as if an end tag with tag name "body" had been seen, then,
-          if that token wasn't ignored, reprocess the current token.
-
-          The fake end tag token here can only be ignored in the fragment
-          case.
-
-   A start tag whose tag name is one of: "address", "article", "aside",
-          "blockquote", "center", "datagrid", "details", "dialog", "dir",
-          "div", "dl", "fieldset", "figure", "footer", "header", "menu",
-          "nav", "ol", "p", "section", "ul"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token.
-
-   A start tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5",
-          "h6"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          If the current node is an element whose tag name is one of "h1",
-          "h2", "h3", "h4", "h5", or "h6", then this is a parse error; pop
-          the current node off the stack of open elements.
-
-          Insert an HTML element for the token.
-
-   A start tag whose tag name is one of: "pre", "listing"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token.
-
-          If the next token is a U+000A LINE FEED (LF) character token,
-          then ignore that token and move on to the next one. (Newlines at
-          the start of pre blocks are ignored as an authoring
-          convenience.)
-
-   A start tag whose tag name is "form"
-          If the form element pointer is not null, then this is a parse
-          error; ignore the token.
-
-          Otherwise:
-
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token, and set the form element
-          pointer to point to the element created.
-
-   A start tag whose tag name is "li"
-          Run the following algorithm:
-
-         1. Initialize node to be the current node (the bottommost node of
-            the stack).
-         2. If node is an li element, then act as if an end tag with the
-            tag name "li" had been seen, then jump to the last step.
-         3. If node is not in the formatting category, and is not in the
-            phrasing category, and is not an address, div, or p element,
-            then jump to the last step.
-         4. Otherwise, set node to the previous entry in the stack of open
-            elements and return to step 2.
-         5. This is the last step.
-            If the stack of open elements has a p element in scope, then
-            act as if an end tag with the tag name "p" had been seen.
-            Finally, insert an HTML element for the token.
-
-   A start tag whose tag name is one of: "dd", "dt"
-          Run the following algorithm:
-
-         1. Initialize node to be the current node (the bottommost node of
-            the stack).
-         2. If node is a dd or dt element, then act as if an end tag with
-            the same tag name as node had been seen, then jump to the last
-            step.
-         3. If node is not in the formatting category, and is not in the
-            phrasing category, and is not an address, div, or p element,
-            then jump to the last step.
-         4. Otherwise, set node to the previous entry in the stack of open
-            elements and return to step 2.
-         5. This is the last step.
-            If the stack of open elements has a p element in scope, then
-            act as if an end tag with the tag name "p" had been seen.
-            Finally, insert an HTML element for the token.
-
-   A start tag whose tag name is "plaintext"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token.
-
-          Switch the content model flag to the PLAINTEXT state.
-
-          Once a start tag with the tag name "plaintext" has been seen,
-          that will be the last token ever seen other than character
-          tokens (and the end-of-file token), because there is no way to
-          switch the content model flag out of the PLAINTEXT state.
-
-   An end tag whose tag name is one of: "address", "article", "aside",
-          "blockquote", "center", "datagrid", "details", "dialog", "dir",
-          "div", "dl", "fieldset", "figure", "footer", "header",
-          "listing", "menu", "nav", "ol", "pre", "section", "ul"
-          If the stack of open elements does not have an element in scope
-          with the same tag name as that of the token, then this is a
-          parse error; ignore the token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags.
-         2. If the current node is not an element with the same tag name
-            as that of the token, then this is a parse error.
-         3. Pop elements from the stack of open elements until an element
-            with the same tag name as the token has been popped from the
-            stack.
-
-   An end tag whose tag name is "form"
-          Let node be the element that the form element pointer is set to.
-
-          Set the form element pointer to null.
-
-          If node is null or the stack of open elements does not have node
-          in scope, then this is a parse error; ignore the token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags.
-         2. If the current node is not node, then this is a parse error.
-         3. Remove node from the stack of open elements.
-
-   An end tag whose tag name is "p"
-          If the stack of open elements does not have an element in scope
-          with the same tag name as that of the token, then this is a
-          parse error; act as if a start tag with the tag name p had been
-          seen, then reprocess the current token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags, except for elements with the same
-            tag name as the token.
-         2. If the current node is not an element with the same tag name
-            as that of the token, then this is a parse error.
-         3. Pop elements from the stack of open elements until an element
-            with the same tag name as the token has been popped from the
-            stack.
-
-   An end tag whose tag name is one of: "dd", "dt", "li"
-          If the stack of open elements does not have an element in scope
-          with the same tag name as that of the token, then this is a
-          parse error; ignore the token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags, except for elements with the same
-            tag name as the token.
-         2. If the current node is not an element with the same tag name
-            as that of the token, then this is a parse error.
-         3. Pop elements from the stack of open elements until an element
-            with the same tag name as the token has been popped from the
-            stack.
-
-   An end tag whose tag name is one of: "h1", "h2", "h3", "h4", "h5", "h6"
-          If the stack of open elements does not have an element in scope
-          whose tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6",
-          then this is a parse error; ignore the token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags.
-         2. If the current node is not an element with the same tag name
-            as that of the token, then this is a parse error.
-         3. Pop elements from the stack of open elements until an element
-            whose tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6"
-            has been popped from the stack.
-
-   An end tag whose tag name is "sarcasm"
-          Take a deep breath, then act as described in the "any other end
-          tag" entry below.
-
-   A start tag whose tag name is "a"
-          If the list of active formatting elements contains an element
-          whose tag name is "a" between the end of the list and the last
-          marker on the list (or the start of the list if there is no
-          marker on the list), then this is a parse error; act as if an
-          end tag with the tag name "a" had been seen, then remove that
-          element from the list of active formatting elements and the
-          stack of open elements if the end tag didn't already remove it
-          (it might not have if the element is not in table scope).
-
-          In the non-conforming stream
-          <a href="a">a<table><a href="b">b</table>x, the first a element
-          would be closed upon seeing the second one, and the "x"
-          character would be inside a link to "b", not to "a". This is
-          despite the fact that the outer a element is not in table scope
-          (meaning that a regular </a> end tag at the start of the table
-          wouldn't close the outer a element).
-
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token. Add that element to the
-          list of active formatting elements.
-
-   A start tag whose tag name is one of: "b", "big", "em", "font", "i",
-          "s", "small", "strike", "strong", "tt", "u"
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token. Add that element to the
-          list of active formatting elements.
-
-   A start tag whose tag name is "nobr"
-          Reconstruct the active formatting elements, if any.
-
-          If the stack of open elements has a nobr element in scope, then
-          this is a parse error; act as if an end tag with the tag name
-          "nobr" had been seen, then once again reconstruct the active
-          formatting elements, if any.
-
-          Insert an HTML element for the token. Add that element to the
-          list of active formatting elements.
-
-   An end tag whose tag name is one of: "a", "b", "big", "em", "font",
-          "i", "nobr", "s", "small", "strike", "strong", "tt", "u"
-          Follow these steps:
-
-         1. Let the formatting element be the last element in the list of
-            active formatting elements that:
-               o is between the end of the list and the last scope marker
-                 in the list, if any, or the start of the list otherwise,
-                 and
-               o has the same tag name as the token.
-            If there is no such node, or, if that node is also in the
-            stack of open elements but the element is not in scope, then
-            this is a parse error; ignore the token, and abort these
-            steps.
-            Otherwise, if there is such a node, but that node is not in
-            the stack of open elements, then this is a parse error; remove
-            the element from the list, and abort these steps.
-            Otherwise, there is a formatting element and that element is
-            in the stack and is in scope. If the element is not the
-            current node, this is a parse error. In any case, proceed with
-            the algorithm as written in the following steps.
-         2. Let the furthest block be the topmost node in the stack of
-            open elements that is lower in the stack than the formatting
-            element, and is not an element in the phrasing or formatting
-            categories. There might not be one.
-         3. If there is no furthest block, then the UA must skip the
-            subsequent steps and instead just pop all the nodes from the
-            bottom of the stack of open elements, from the current node up
-            to and including the formatting element, and remove the
-            formatting element from the list of active formatting
-            elements.
-         4. Let the common ancestor be the element immediately above the
-            formatting element in the stack of open elements.
-         5. If the furthest block has a parent node, then remove the
-            furthest block from its parent node.
-         6. Let a bookmark note the position of the formatting element in
-            the list of active formatting elements relative to the
-            elements on either side of it in the list.
-         7. Let node and last node be the furthest block. Follow these
-            steps:
-              1. Let node be the element immediately above node in the
-                 stack of open elements.
-              2. If node is not in the list of active formatting elements,
-                 then remove node from the stack of open elements and then
-                 go back to step 1.
-              3. Otherwise, if node is the formatting element, then go to
-                 the next step in the overall algorithm.
-              4. Otherwise, if last node is the furthest block, then move
-                 the aforementioned bookmark to be immediately after the
-                 node in the list of active formatting elements.
-              5. If node has any children, perform a shallow clone of
-                 node, replace the entry for node in the list of active
-                 formatting elements with an entry for the clone, replace
-                 the entry for node in the stack of open elements with an
-                 entry for the clone, and let node be the clone.
-              6. Insert last node into node, first removing it from its
-                 previous parent node if any.
-              7. Let last node be node.
-              8. Return to step 1 of this inner set of steps.
-         8. If the common ancestor node is a table, tbody, tfoot, thead,
-            or tr element, then, foster parent whatever last node ended up
-            being in the previous step.
-            Otherwise, append whatever last node ended up being in the
-            previous step to the common ancestor node, first removing it
-            from its previous parent node if any.
-         9. Perform a shallow clone of the formatting element.
-        10. Take all of the child nodes of the furthest block and append
-            them to the clone created in the last step.
-        11. Append that clone to the furthest block.
-        12. Remove the formatting element from the list of active
-            formatting elements, and insert the clone into the list of
-            active formatting elements at the position of the
-            aforementioned bookmark.
-        13. Remove the formatting element from the stack of open elements,
-            and insert the clone into the stack of open elements
-            immediately below the position of the furthest block in that
-            stack.
-        14. Jump back to step 1 in this series of steps.
-
-          The way these steps are defined, only elements in the formatting
-          category ever get cloned by this algorithm.
-
-          Because of the way this algorithm causes elements to change
-          parents, it has been dubbed the "adoption agency algorithm" (in
-          contrast with other possibly algorithms for dealing with
-          misnested content, which included the "incest algorithm", the
-          "secret affair algorithm", and the "Heisenberg algorithm").
-
-   A start tag whose tag name is "button"
-          If the stack of open elements has a button element in scope,
-          then this is a parse error; act as if an end tag with the tag
-          name "button" had been seen, then reprocess the token.
-
-          Otherwise:
-
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token.
-
-          Insert a marker at the end of the list of active formatting
-          elements.
-
-   A start tag token whose tag name is one of: "applet", "marquee",
-          "object"
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token.
-
-          Insert a marker at the end of the list of active formatting
-          elements.
-
-   An end tag token whose tag name is one of: "applet", "button",
-          "marquee", "object"
-          If the stack of open elements does not have an element in scope
-          with the same tag name as that of the token, then this is a
-          parse error; ignore the token.
-
-          Otherwise, run these steps:
-
-         1. Generate implied end tags.
-         2. If the current node is not an element with the same tag name
-            as that of the token, then this is a parse error.
-         3. Pop elements from the stack of open elements until an element
-            with the same tag name as the token has been popped from the
-            stack.
-         4. Clear the list of active formatting elements up to the last
-            marker.
-
-   A start tag whose tag name is "xmp"
-          Reconstruct the active formatting elements, if any.
-
-          Follow the generic CDATA element parsing algorithm.
-
-   A start tag whose tag name is "table"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token.
-
-          Switch the insertion mode to "in table".
-
-   A start tag whose tag name is one of: "area", "basefont", "bgsound",
-          "br", "embed", "img", "input", "spacer", "wbr"
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   A start tag whose tag name is one of: "param", "source"
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   A start tag whose tag name is "hr"
-          If the stack of open elements has a p element in scope, then act
-          as if an end tag with the tag name "p" had been seen.
-
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   A start tag whose tag name is "image"
-          Parse error. Change the token's tag name to "img" and reprocess
-          it. (Don't ask.)
-
-   A start tag whose tag name is "isindex"
-          Parse error.
-
-          If the form element pointer is not null, then ignore the token.
-
-          Otherwise:
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-          Act as if a start tag token with the tag name "form" had been
-          seen.
-
-          If the token has an attribute called "action", set the action
-          attribute on the resulting form element to the value of the
-          "action" attribute of the token.
-
-          Act as if a start tag token with the tag name "hr" had been
-          seen.
-
-          Act as if a start tag token with the tag name "p" had been seen.
-
-          Act as if a start tag token with the tag name "label" had been
-          seen.
-
-          Act as if a stream of character tokens had been seen (see below
-          for what they should say).
-
-          Act as if a start tag token with the tag name "input" had been
-          seen, with all the attributes from the "isindex" token except
-          "name", "action", and "prompt". Set the name attribute of the
-          resulting input element to the value "isindex".
-
-          Act as if a stream of character tokens had been seen (see below
-          for what they should say).
-
-          Act as if an end tag token with the tag name "label" had been
-          seen.
-
-          Act as if an end tag token with the tag name "p" had been seen.
-
-          Act as if a start tag token with the tag name "hr" had been
-          seen.
-
-          Act as if an end tag token with the tag name "form" had been
-          seen.
-
-          If the token has an attribute with the name "prompt", then the
-          first stream of characters must be the same string as given in
-          that attribute, and the second stream of characters must be
-          empty. Otherwise, the two streams of character tokens together
-          should, together with the input element, express the equivalent
-          of "This is a searchable index. Insert your search keywords
-          here: (input field)" in the user's preferred language.
-
-   A start tag whose tag name is "textarea"
-
-         1. Insert an HTML element for the token.
-         2. If the next token is a U+000A LINE FEED (LF) character token,
-            then ignore that token and move on to the next one. (Newlines
-            at the start of textarea elements are ignored as an authoring
-            convenience.)
-         3. Switch the tokeniser's content model flag to the RCDATA state.
-         4. Let the original insertion mode be the current insertion mode.
-         5. Switch the insertion mode to "in CDATA/RCDATA".
-
-   A start tag whose tag name is one of: "iframe", "noembed"
-   A start tag whose tag name is "noscript", if the scripting flag is
-          enabled
-          Follow the generic CDATA element parsing algorithm.
-
-   A start tag whose tag name is "select"
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token.
-
-          If the insertion mode is one of in table", "in caption", "in
-          column group", "in table body", "in row", or "in cell", then
-          switch the insertion mode to "in select in table". Otherwise,
-          switch the insertion mode to "in select".
-
-   A start tag whose tag name is one of: "optgroup", "option"
-          If the stack of open elements has an option element in scope,
-          then act as if an end tag with the tag name "option" had been
-          seen.
-
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token.
-
-   A start tag whose tag name is one of: "rp", "rt"
-          If the stack of open elements has a ruby element in scope, then
-          generate implied end tags. If the current node is not then a
-          ruby element, this is a parse error; pop all the nodes from the
-          current node up to the node immediately before the bottommost
-          ruby element on the stack of open elements.
-
-          Insert an HTML element for the token.
-
-   An end tag whose tag name is "br"
-          Parse error. Act as if a start tag token with the tag name "br"
-          had been seen. Ignore the end tag token.
-
-   A start tag whose tag name is "math"
-          Reconstruct the active formatting elements, if any.
-
-          Adjust MathML attributes for the token. (This fixes the case of
-          MathML attributes that are not all lowercase.)
-
-          Adjust foreign attributes for the token. (This fixes the use of
-          namespaced attributes, in particular XLink.)
-
-          Insert a foreign element for the token, in the MathML namespace.
-
-          If the token has its self-closing flag set, pop the current node
-          off the stack of open elements and acknowledge the token's
-          self-closing flag.
-
-          Otherwise, let the secondary insertion mode be the current
-          insertion mode, and then switch the insertion mode to "in
-          foreign content".
-
-   A start tag whose tag name is one of: "caption", "col", "colgroup",
-          "frame", "frameset", "head", "tbody", "td", "tfoot", "th",
-          "thead", "tr"
-          Parse error. Ignore the token.
-
-   Any other start tag
-          Reconstruct the active formatting elements, if any.
-
-          Insert an HTML element for the token.
-
-          This element will be a phrasing element.
-
-   Any other end tag
-          Run the following steps:
-
-         1. Initialize node to be the current node (the bottommost node of
-            the stack).
-         2. If node has the same tag name as the end tag token, then:
-              1. Generate implied end tags.
-              2. If the tag name of the end tag token does not match the
-                 tag name of the current node, this is a parse error.
-              3. Pop all the nodes from the current node up to node,
-                 including node, then stop these steps.
-         3. Otherwise, if node is in neither the formatting category nor
-            the phrasing category, then this is a parse error; ignore the
-            token, and abort these steps.
-         4. Set node to the previous entry in the stack of open elements.
-         5. Return to step 2.
-
-      8.2.5.11 The "in CDATA/RCDATA" insertion mode
-
-   When the insertion mode is "in CDATA/RCDATA", tokens must be handled as
-   follows:
-
-   A character token
-          Insert the token's character into the current node.
-
-   An end-of-file token
-          Parse error.
-
-          If the current node is a script element, mark the script element
-          as "already executed".
-
-          Pop the current node off the stack of open elements.
-
-          Switch the insertion mode to the original insertion mode and
-          reprocess the current token.
-
-   An end tag whose tag name is "script"
-          Let script be the current node (which will be a script element).
-
-          Pop the current node off the stack of open elements.
-
-          Switch the insertion mode to the original insertion mode.
-
-          Let the old insertion point have the same value as the current
-          insertion point. Let the insertion point be just before the next
-          input character.
-
-          Increment the parser's script nesting level by one.
-
-          Run the script. This might cause some script to execute, which
-          might cause new characters to be inserted into the tokeniser,
-          and might cause the tokeniser to output more tokens, resulting
-          in a reentrant invocation of the parser.
-
-          Decrement the parser's script nesting level by one. If the
-          parser's script nesting level is zero, then set the parser pause
-          flag to false.
-
-          Let the insertion point have the value of the old insertion
-          point. (In other words, restore the insertion point to the value
-          it had before the previous paragraph. This value might be the
-          "undefined" value.)
-
-          At this stage, if there is a pending external script, then:
-
-        If the tree construction stage is being called reentrantly, say
-                from a call to document.write():
-                Set the parser pause flag to true, and abort the
-                processing of any nested invocations of the tokeniser,
-                yielding control back to the caller. (Tokenization will
-                resume when the caller returns to the "outer" tree
-                construction stage.)
-
-        Otherwise:
-                Follow these steps:
-
-              1. Let the script be the pending external script. There is
-                 no longer a pending external script.
-              2. Pause until the script has completed loading.
-              3. Let the insertion point be just before the next input
-                 character.
-              4. Execute the script.
-              5. Let the insertion point be undefined again.
-              6. If there is once again a pending external script, then
-                 repeat these steps from step 1.
-
-   Any other end tag
-          Pop the current node off the stack of open elements.
-
-          Switch the insertion mode to the original insertion mode.
-
-      8.2.5.12 The "in table" insertion mode
-
-   When the insertion mode is "in table", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          If the current table is tainted, then act as described in the
-          "anything else" entry below.
-
-          Otherwise, insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "caption"
-          Clear the stack back to a table context. (See below.)
-
-          Insert a marker at the end of the list of active formatting
-          elements.
-
-          Insert an HTML element for the token, then switch the insertion
-          mode to "in caption".
-
-   A start tag whose tag name is "colgroup"
-          Clear the stack back to a table context. (See below.)
-
-          Insert an HTML element for the token, then switch the insertion
-          mode to "in column group".
-
-   A start tag whose tag name is "col"
-          Act as if a start tag token with the tag name "colgroup" had
-          been seen, then reprocess the current token.
-
-   A start tag whose tag name is one of: "tbody", "tfoot", "thead"
-          Clear the stack back to a table context. (See below.)
-
-          Insert an HTML element for the token, then switch the insertion
-          mode to "in table body".
-
-   A start tag whose tag name is one of: "td", "th", "tr"
-          Act as if a start tag token with the tag name "tbody" had been
-          seen, then reprocess the current token.
-
-   A start tag whose tag name is "table"
-          Parse error. Act as if an end tag token with the tag name
-          "table" had been seen, then, if that token wasn't ignored,
-          reprocess the current token.
-
-          The fake end tag token here can only be ignored in the fragment
-          case.
-
-   An end tag whose tag name is "table"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token. (fragment case)
-
-          Otherwise:
-
-          Pop elements from this stack until a table element has been
-          popped from the stack.
-
-          Reset the insertion mode appropriately.
-
-   An end tag whose tag name is one of: "body", "caption", "col",
-          "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr"
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is one of: "style", "script"
-          If the current table is tainted then act as described in the
-          "anything else" entry below.
-
-          Otherwise, process the token using the rules for the "in head"
-          insertion mode.
-
-   A start tag whose tag name is "input"
-          If the token does not have an attribute with the name "type", or
-          if it does, but that attribute's value is not an ASCII
-          case-insensitive match for the string "hidden", or, if the
-          current table is tainted, then: act as described in the
-          "anything else" entry below.
-
-          Otherwise:
-
-          Parse error.
-
-          Insert an HTML element for the token.
-
-          Pop that input element off the stack of open elements.
-
-   An end-of-file token
-          If the current node is not the root html element, then this is a
-          parse error.
-
-          It can only be the current node in the fragment case.
-
-          Stop parsing.
-
-   Anything else
-          Parse error. Process the token using the rules for the "in body"
-          insertion mode, except that if the current node is a table,
-          tbody, tfoot, thead, or tr element, then, whenever a node would
-          be inserted into the current node, it must instead be foster
-          parented.
-
-   When the steps above require the UA to clear the stack back to a table
-   context, it means that the UA must, while the current node is not a
-   table element or an html element, pop elements from the stack of open
-   elements.
-
-   The current node being an html element after this process is a fragment
-   case.
-
-      8.2.5.13 The "in caption" insertion mode
-
-   When the insertion mode is "in caption", tokens must be handled as
-   follows:
-
-   An end tag whose tag name is "caption"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token. (fragment case)
-
-          Otherwise:
-
-          Generate implied end tags.
-
-          Now, if the current node is not a caption element, then this is
-          a parse error.
-
-          Pop elements from this stack until a caption element has been
-          popped from the stack.
-
-          Clear the list of active formatting elements up to the last
-          marker.
-
-          Switch the insertion mode to "in table".
-
-   A start tag whose tag name is one of: "caption", "col", "colgroup",
-          "tbody", "td", "tfoot", "th", "thead", "tr"
-
-   An end tag whose tag name is "table"
-          Parse error. Act as if an end tag with the tag name "caption"
-          had been seen, then, if that token wasn't ignored, reprocess the
-          current token.
-
-          The fake end tag token here can only be ignored in the fragment
-          case.
-
-   An end tag whose tag name is one of: "body", "col", "colgroup", "html",
-          "tbody", "td", "tfoot", "th", "thead", "tr"
-          Parse error. Ignore the token.
-
-   Anything else
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-      8.2.5.14 The "in column group" insertion mode
-
-   When the insertion mode is "in column group", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is "col"
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   An end tag whose tag name is "colgroup"
-          If the current node is the root html element, then this is a
-          parse error; ignore the token. (fragment case)
-
-          Otherwise, pop the current node (which will be a colgroup
-          element) from the stack of open elements. Switch the insertion
-          mode to "in table".
-
-   An end tag whose tag name is "col"
-          Parse error. Ignore the token.
-
-   An end-of-file token
-          If the current node is the root html element, then stop parsing.
-          (fragment case)
-
-          Otherwise, act as described in the "anything else" entry below.
-
-   Anything else
-          Act as if an end tag with the tag name "colgroup" had been seen,
-          and then, if that token wasn't ignored, reprocess the current
-          token.
-
-          The fake end tag token here can only be ignored in the fragment
-          case.
-
-      8.2.5.15 The "in table body" insertion mode
-
-   When the insertion mode is "in table body", tokens must be handled as
-   follows:
-
-   A start tag whose tag name is "tr"
-          Clear the stack back to a table body context. (See below.)
-
-          Insert an HTML element for the token, then switch the insertion
-          mode to "in row".
-
-   A start tag whose tag name is one of: "th", "td"
-          Parse error. Act as if a start tag with the tag name "tr" had
-          been seen, then reprocess the current token.
-
-   An end tag whose tag name is one of: "tbody", "tfoot", "thead"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token.
-
-          Otherwise:
-
-          Clear the stack back to a table body context. (See below.)
-
-          Pop the current node from the stack of open elements. Switch the
-          insertion mode to "in table".
-
-   A start tag whose tag name is one of: "caption", "col", "colgroup",
-          "tbody", "tfoot", "thead"
-
-   An end tag whose tag name is "table"
-          If the stack of open elements does not have a tbody, thead, or
-          tfoot element in table scope, this is a parse error. Ignore the
-          token. (fragment case)
-
-          Otherwise:
-
-          Clear the stack back to a table body context. (See below.)
-
-          Act as if an end tag with the same tag name as the current node
-          ("tbody", "tfoot", or "thead") had been seen, then reprocess the
-          current token.
-
-   An end tag whose tag name is one of: "body", "caption", "col",
-          "colgroup", "html", "td", "th", "tr"
-          Parse error. Ignore the token.
-
-   Anything else
-          Process the token using the rules for the "in table" insertion
-          mode.
-
-   When the steps above require the UA to clear the stack back to a table
-   body context, it means that the UA must, while the current node is not
-   a tbody, tfoot, thead, or html element, pop elements from the stack of
-   open elements.
-
-   The current node being an html element after this process is a fragment
-   case.
-
-      8.2.5.16 The "in row" insertion mode
-
-   When the insertion mode is "in row", tokens must be handled as follows:
-
-   A start tag whose tag name is one of: "th", "td"
-          Clear the stack back to a table row context. (See below.)
-
-          Insert an HTML element for the token, then switch the insertion
-          mode to "in cell".
-
-          Insert a marker at the end of the list of active formatting
-          elements.
-
-   An end tag whose tag name is "tr"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token. (fragment case)
-
-          Otherwise:
-
-          Clear the stack back to a table row context. (See below.)
-
-          Pop the current node (which will be a tr element) from the stack
-          of open elements. Switch the insertion mode to "in table body".
-
-   A start tag whose tag name is one of: "caption", "col", "colgroup",
-          "tbody", "tfoot", "thead", "tr"
-
-   An end tag whose tag name is "table"
-          Act as if an end tag with the tag name "tr" had been seen, then,
-          if that token wasn't ignored, reprocess the current token.
-
-          The fake end tag token here can only be ignored in the fragment
-          case.
-
-   An end tag whose tag name is one of: "tbody", "tfoot", "thead"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token.
-
-          Otherwise, act as if an end tag with the tag name "tr" had been
-          seen, then reprocess the current token.
-
-   An end tag whose tag name is one of: "body", "caption", "col",
-          "colgroup", "html", "td", "th"
-          Parse error. Ignore the token.
-
-   Anything else
-          Process the token using the rules for the "in table" insertion
-          mode.
-
-   When the steps above require the UA to clear the stack back to a table
-   row context, it means that the UA must, while the current node is not a
-   tr element or an html element, pop elements from the stack of open
-   elements.
-
-   The current node being an html element after this process is a fragment
-   case.
-
-      8.2.5.17 The "in cell" insertion mode
-
-   When the insertion mode is "in cell", tokens must be handled as
-   follows:
-
-   An end tag whose tag name is one of: "td", "th"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as that of the token, then this is
-          a parse error and the token must be ignored.
-
-          Otherwise:
-
-          Generate implied end tags.
-
-          Now, if the current node is not an element with the same tag
-          name as the token, then this is a parse error.
-
-          Pop elements from this stack until an element with the same tag
-          name as the token has been popped from the stack.
-
-          Clear the list of active formatting elements up to the last
-          marker.
-
-          Switch the insertion mode to "in row". (The current node will be
-          a tr element at this point.)
-
-   A start tag whose tag name is one of: "caption", "col", "colgroup",
-          "tbody", "td", "tfoot", "th", "thead", "tr"
-          If the stack of open elements does not have a td or th element
-          in table scope, then this is a parse error; ignore the token.
-          (fragment case)
-
-          Otherwise, close the cell (see below) and reprocess the current
-          token.
-
-   An end tag whose tag name is one of: "body", "caption", "col",
-          "colgroup", "html"
-          Parse error. Ignore the token.
-
-   An end tag whose tag name is one of: "table", "tbody", "tfoot",
-          "thead", "tr"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as that of the token (which can
-          only happen for "tbody", "tfoot" and "thead", or, in the
-          fragment case), then this is a parse error and the token must be
-          ignored.
-
-          Otherwise, close the cell (see below) and reprocess the current
-          token.
-
-   Anything else
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   Where the steps above say to close the cell, they mean to run the
-   following algorithm:
-    1. If the stack of open elements has a td element in table scope, then
-       act as if an end tag token with the tag name "td" had been seen.
-    2. Otherwise, the stack of open elements will have a th element in
-       table scope; act as if an end tag token with the tag name "th" had
-       been seen.
-
-   The stack of open elements cannot have both a td and a th element in
-   table scope at the same time, nor can it have neither when the
-   insertion mode is "in cell".
-
-      8.2.5.18 The "in select" insertion mode
-
-   When the insertion mode is "in select", tokens must be handled as
-   follows:
-
-   A character token
-          Insert the token's character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is "option"
-          If the current node is an option element, act as if an end tag
-          with the tag name "option" had been seen.
-
-          Insert an HTML element for the token.
-
-   A start tag whose tag name is "optgroup"
-          If the current node is an option element, act as if an end tag
-          with the tag name "option" had been seen.
-
-          If the current node is an optgroup element, act as if an end tag
-          with the tag name "optgroup" had been seen.
-
-          Insert an HTML element for the token.
-
-   An end tag whose tag name is "optgroup"
-          First, if the current node is an option element, and the node
-          immediately before it in the stack of open elements is an
-          optgroup element, then act as if an end tag with the tag name
-          "option" had been seen.
-
-          If the current node is an optgroup element, then pop that node
-          from the stack of open elements. Otherwise, this is a parse
-          error; ignore the token.
-
-   An end tag whose tag name is "option"
-          If the current node is an option element, then pop that node
-          from the stack of open elements. Otherwise, this is a parse
-          error; ignore the token.
-
-   An end tag whose tag name is "select"
-          If the stack of open elements does not have an element in table
-          scope with the same tag name as the token, this is a parse
-          error. Ignore the token. (fragment case)
-
-          Otherwise:
-
-          Pop elements from the stack of open elements until a select
-          element has been popped from the stack.
-
-          Reset the insertion mode appropriately.
-
-   A start tag whose tag name is "select"
-          Parse error. Act as if the token had been an end tag with the
-          tag name "select" instead.
-
-   A start tag whose tag name is one of: "input", "textarea"
-          Parse error. Act as if an end tag with the tag name "select" had
-          been seen, and reprocess the token.
-
-   A start tag token whose tag name is "script"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   An end-of-file token
-          If the current node is not the root html element, then this is a
-          parse error.
-
-          It can only be the current node in the fragment case.
-
-          Stop parsing.
-
-   Anything else
-          Parse error. Ignore the token.
-
-      8.2.5.19 The "in select in table" insertion mode
-
-   When the insertion mode is "in select in table", tokens must be handled
-   as follows:
-
-   A start tag whose tag name is one of: "caption", "table", "tbody",
-          "tfoot", "thead", "tr", "td", "th"
-          Parse error. Act as if an end tag with the tag name "select" had
-          been seen, and reprocess the token.
-
-   An end tag whose tag name is one of: "caption", "table", "tbody",
-          "tfoot", "thead", "tr", "td", "th"
-          Parse error.
-
-          If the stack of open elements has an element in table scope with
-          the same tag name as that of the token, then act as if an end
-          tag with the tag name "select" had been seen, and reprocess the
-          token. Otherwise, ignore the token.
-
-   Anything else
-          Process the token using the rules for the "in select" insertion
-          mode.
-
-      8.2.5.20 The "in foreign content" insertion mode
-
-   When the insertion mode is "in foreign content", tokens must be handled
-   as follows:
-
-   A character token
-          Insert the token's character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is neither "mglyph" nor "malignmark", if the
-          current node is an mi element in the MathML namespace.
-
-   A start tag whose tag name is neither "mglyph" nor "malignmark", if the
-          current node is an mo element in the MathML namespace.
-
-   A start tag whose tag name is neither "mglyph" nor "malignmark", if the
-          current node is an mn element in the MathML namespace.
-
-   A start tag whose tag name is neither "mglyph" nor "malignmark", if the
-          current node is an ms element in the MathML namespace.
-
-   A start tag whose tag name is neither "mglyph" nor "malignmark", if the
-          current node is an mtext element in the MathML namespace.
-
-   A start tag, if the current node is an element in the HTML namespace.
-   An end tag
-          Process the token using the rules for the secondary insertion
-          mode.
-
-          If, after doing so, the insertion mode is still "in foreign
-          content", but there is no element in scope that has a namespace
-          other than the HTML namespace, switch the insertion mode to the
-          secondary insertion mode.
-
-   A start tag whose tag name is one of: "b", "big", "blockquote", "body",
-          "br", "center", "code", "dd", "div", "dl", "dt", "em", "embed",
-          "h1", "h2", "h3", "h4", "h5", "h6", "head", "hr", "i", "img",
-          "li", "listing", "menu", "meta", "nobr", "ol", "p", "pre",
-          "ruby", "s", "small", "span", "strong", "strike", "sub", "sup",
-          "table", "tt", "u", "ul", "var"
-
-   A start tag whose tag name is "font", if the token has any attributes
-          named "color", "face", or "size"
-
-   An end-of-file token
-          Parse error.
-
-          Pop elements from the stack of open elements until the current
-          node is in the HTML namespace.
-
-          Switch the insertion mode to the secondary insertion mode, and
-          reprocess the token.
-
-   Any other start tag
-          If the current node is an element in the MathML namespace,
-          adjust MathML attributes for the token. (This fixes the case of
-          MathML attributes that are not all lowercase.)
-
-          Adjust foreign attributes for the token. (This fixes the use of
-          namespaced attributes, in particular XLink in SVG.)
-
-          Insert a foreign element for the token, in the same namespace as
-          the current node.
-
-          If the token has its self-closing flag set, pop the current node
-          off the stack of open elements and acknowledge the token's
-          self-closing flag.
-
-      8.2.5.21 The "after body" insertion mode
-
-   When the insertion mode is "after body", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A comment token
-          Append a Comment node to the first element in the stack of open
-          elements (the html element), with the data attribute set to the
-          data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   An end tag whose tag name is "html"
-          If the parser was originally created as part of the HTML
-          fragment parsing algorithm, this is a parse error; ignore the
-          token. (fragment case)
-
-          Otherwise, switch the insertion mode to "after after body".
-
-   An end-of-file token
-          Stop parsing.
-
-   Anything else
-          Parse error. Switch the insertion mode to "in body" and
-          reprocess the token.
-
-      8.2.5.22 The "in frameset" insertion mode
-
-   When the insertion mode is "in frameset", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   A start tag whose tag name is "frameset"
-          Insert an HTML element for the token.
-
-   An end tag whose tag name is "frameset"
-          If the current node is the root html element, then this is a
-          parse error; ignore the token. (fragment case)
-
-          Otherwise, pop the current node from the stack of open elements.
-
-          If the parser was not originally created as part of the HTML
-          fragment parsing algorithm (fragment case), and the current node
-          is no longer a frameset element, then switch the insertion mode
-          to "after frameset".
-
-   A start tag whose tag name is "frame"
-          Insert an HTML element for the token. Immediately pop the
-          current node off the stack of open elements.
-
-          Acknowledge the token's self-closing flag, if it is set.
-
-   A start tag whose tag name is "noframes"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   An end-of-file token
-          If the current node is not the root html element, then this is a
-          parse error.
-
-          It can only be the current node in the fragment case.
-
-          Stop parsing.
-
-   Anything else
-          Parse error. Ignore the token.
-
-      8.2.5.23 The "after frameset" insertion mode
-
-   When the insertion mode is "after frameset", tokens must be handled as
-   follows:
-
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-          Insert the character into the current node.
-
-   A comment token
-          Append a Comment node to the current node with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-          Parse error. Ignore the token.
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   An end tag whose tag name is "html"
-          Switch the insertion mode to "after after frameset".
-
-   A start tag whose tag name is "noframes"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   An end-of-file token
-          Stop parsing.
-
-   Anything else
-          Parse error. Ignore the token.
-
-   This doesn't handle UAs that don't support frames, or that do support
-   frames but want to show the NOFRAMES content. Supporting the former is
-   easy; supporting the latter is harder.
-
-      8.2.5.24 The "after after body" insertion mode
-
-   When the insertion mode is "after after body", tokens must be handled
-   as follows:
-
-   A comment token
-          Append a Comment node to the Document object with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   An end-of-file token
-          Stop parsing.
-
-   Anything else
-          Parse error. Switch the insertion mode to "in body" and
-          reprocess the token.
-
-      8.2.5.25 The "after after frameset" insertion mode
-
-   When the insertion mode is "after after frameset", tokens must be
-   handled as follows:
-
-   A comment token
-          Append a Comment node to the Document object with the data
-          attribute set to the data given in the comment token.
-
-   A DOCTYPE token
-   A character token that is one of one of U+0009 CHARACTER TABULATION,
-          U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE
-
-   A start tag whose tag name is "html"
-          Process the token using the rules for the "in body" insertion
-          mode.
-
-   An end-of-file token
-          Stop parsing.
-
-   A start tag whose tag name is "noframes"
-          Process the token using the rules for the "in head" insertion
-          mode.
-
-   Anything else
-          Parse error. Ignore the token.
-
-    8.2.6 The end
-
-   Once the user agent stops parsing the document, the user agent must
-   follow the steps in this section.
-
-   First, the current document readiness must be set to "interactive".
-
-   Then, the rules for when a script completes loading start applying
-   (script execution is no longer managed by the parser).
-
-   If any of the scripts in the list of scripts that will execute as soon
-   as possible have completed loading, or if the list of scripts that will
-   execute asynchronously is not empty and the first script in that list
-   has completed loading, then the user agent must act as if those scripts
-   just completed loading, following the rules given for that in the
-   script element definition.
-
-   Then, if the list of scripts that will execute when the document has
-   finished parsing is not empty, and the first item in this list has
-   already completed loading, then the user agent must act as if that
-   script just finished loading.
-
-   By this point, there will be no scripts that have loaded but have not
-   yet been executed.
-
-   The user agent must then fire a simple event called DOMContentLoaded at
-   the Document.
-
-   Once everything that delays the load event has completed, the user
-   agent must set the current document readiness to "complete", and then
-   fire a load event at the body element.
-
-   delaying the load event for things like image loads allows for intranet
-   port scans (even without javascript!). Should we really encode that
-   into the spec?
-
-    8.2.7 Coercing an HTML DOM into an infoset
-
-   When an application uses an HTML parser in conjunction with an XML
-   pipeline, it is possible that the constructed DOM is not compatible
-   with the XML tool chain in certain subtle ways. For example, an XML
-   toolchain might not be able to represent attributes with the name
-   xmlns, since they conflict with the Namespaces in XML syntax. There is
-   also some data that the HTML parser generates that isn't included in
-   the DOM itself. This section specifies some rules for handling these
-   issues.
-
-   If the XML API being used doesn't support DOCTYPEs, the tool may drop
-   DOCTYPEs altogether.
-
-   If the XML API doesn't support attributes in no namespace that are
-   named "xmlns", attributes whose names start with "xmlns:", or
-   attributes in the XMLNS namespace, then the tool may drop such
-   attributes.
-
-   The tool may annotate the output with any namespace declarations
-   required for proper operation.
-
-   If the XML API being used restricts the allowable characters in the
-   local names of elements and attributes, then the tool may map all
-   element and attribute local names that the API wouldn't support to a
-   set of names that are allowed, by replacing any character that isn't
-   supported with the uppercase letter U and the five digits of the
-   character's Unicode codepoint when expressed in hexadecimal, using
-   digits 0-9 and capital letters A-F as the symbols, in increasing
-   numeric order.
-
-   For example, the element name foo<bar, which can be output by the HTML
-   parser, though it is neither a legal HTML element name nor a
-   well-formed XML element name, would be converted into fooU0003Cbar,
-   which is a well-formed XML element name (though it's still not legal in
-   HTML by any means).
-
-   As another example, consider the attribute xlink:href. Used on a MathML
-   element, it becomes, after being adjusted, an attribute with a prefix
-   "xlink" and a local name "href". However, used on an HTML element, it
-   becomes an attribute with no prefix and the local name "xlink:href",
-   which is not a valid NCName, and thus might not be accepted by an XML
-   API. It could thus get converted, becoming "xlinkU0003Ahref".
-
-   The resulting names from this conversion conveniently can't clash with
-   any attribute generated by the HTML parser, since those are all either
-   lowercase or those listed in the adjust foreign attributes algorithm's
-   table.
-
-   If the XML API restricts comments from having two consecutive U+002D
-   HYPHEN-MINUS characters (--), the tool may insert a single U+0020 SPACE
-   character between any such offending characters.
-
-   If the XML API restricts comments from ending in a U+002D HYPHEN-MINUS
-   character (-), the tool may insert a single U+0020 SPACE character at
-   the end of such comments.
-
-   If the XML API restricts allowed characters in character data, the tool
-   may replace any U+000C FORM FEED (FF) character with a U+0020 SPACE
-   character, and any other literal non-XML character with a U+FFFD
-   REPLACEMENT CHARACTER.
-
-   If the tool has no way to convey out-of-band information, then the tool
-   may drop the following information:
-     * Whether the document is set to no quirks mode, limited quirks mode,
-       or quirks mode
-     * The association between form controls and forms that aren't their
-       nearest form element ancestor (use of the form element pointer in
-       the parser)
-
-   The mutations allowed by this section apply after the HTML parser's
-   rules have been applied. For example, a <a::> start tag will be closed
-   by a </a::> end tag, and never by a </aU0003AU0003A> end tag, even if
-   the user agent is using the rules above to then generate an actual
-   element in the DOM with the name aU0003AU0003A for that start tag.
-
-  8.3 Namespaces
-
-   The HTML namespace is: http://www.w3.org/1999/xhtml
-
-   The MathML namespace is: http://www.w3.org/1998/Math/MathML
-
-   The SVG namespace is: http://www.w3.org/2000/svg
-
-   The XLink namespace is: http://www.w3.org/1999/xlink
-
-   The XML namespace is: http://www.w3.org/XML/1998/namespace
-
-   The XMLNS namespace is: http://www.w3.org/2000/xmlns/
diff --git a/gwt-src/nu/validator/htmlparser/HtmlParser.gwt.xml b/gwt-src/nu/validator/htmlparser/HtmlParser.gwt.xml
deleted file mode 100644
index 1eab09c2..00000000
--- a/gwt-src/nu/validator/htmlparser/HtmlParser.gwt.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<module>
-	<inherits name="com.google.gwt.core.Core"/>
-	<inherits name="com.google.gwt.user.User"/>
-	<super-source path="translatable"/>
-	<source path="annotation"/>
-	<source path="common"/>
-	<source path="impl"/>	
-	<source path="gwt"/>
-	<set-property name="user.agent" value="gecko1_8"/>
-	<entry-point class="nu.validator.htmlparser.gwt.HtmlParserModule"/>
-	<add-linker name="sso"/>		
-</module>
diff --git a/gwt-src/nu/validator/htmlparser/gwt/BrowserTreeBuilder.java b/gwt-src/nu/validator/htmlparser/gwt/BrowserTreeBuilder.java
deleted file mode 100644
index 2eaa6764..00000000
--- a/gwt-src/nu/validator/htmlparser/gwt/BrowserTreeBuilder.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2008-2017 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.gwt;
-
-import java.util.LinkedList;
-
-import nu.validator.htmlparser.common.DocumentMode;
-import nu.validator.htmlparser.impl.CoalescingTreeBuilder;
-import nu.validator.htmlparser.impl.HtmlAttributes;
-
-import org.xml.sax.SAXException;
-
-import com.google.gwt.core.client.JavaScriptException;
-import com.google.gwt.core.client.JavaScriptObject;
-
-class BrowserTreeBuilder extends CoalescingTreeBuilder<JavaScriptObject> {
-
-    private JavaScriptObject document;
-
-    private JavaScriptObject script;
-
-    private JavaScriptObject placeholder;
-
-    private boolean readyToRun;
-
-    private final LinkedList<ScriptHolder> scriptStack = new LinkedList<ScriptHolder>();
-
-    private class ScriptHolder {
-        private final JavaScriptObject script;
-
-        private final JavaScriptObject placeholder;
-
-        /**
-         * @param script
-         * @param placeholder
-         */
-        public ScriptHolder(JavaScriptObject script,
-                JavaScriptObject placeholder) {
-            this.script = script;
-            this.placeholder = placeholder;
-        }
-
-        /**
-         * Returns the script.
-         * 
-         * @return the script
-         */
-        public JavaScriptObject getScript() {
-            return script;
-        }
-
-        /**
-         * Returns the placeholder.
-         * 
-         * @return the placeholder
-         */
-        public JavaScriptObject getPlaceholder() {
-            return placeholder;
-        }
-    }
-
-    protected BrowserTreeBuilder(JavaScriptObject document) {
-        super();
-        this.document = document;
-        installExplorerCreateElementNS(document);
-    }
-
-    private static native boolean installExplorerCreateElementNS(
-            JavaScriptObject doc) /*-{
-                  if (!doc.createElementNS) {
-                      doc.createElementNS = function (uri, local) {
-                          if ("http://www.w3.org/1999/xhtml" == uri) {
-                              return doc.createElement(local);
-                          } else if ("http://www.w3.org/1998/Math/MathML" == uri) {
-                              if (!doc.mathplayerinitialized) {
-                                  var obj = document.createElement("object");
-                                  obj.setAttribute("id", "mathplayer");
-                                  obj.setAttribute("classid", "clsid:32F66A20-7614-11D4-BD11-00104BD3F987");
-                                  document.getElementsByTagName("head")[0].appendChild(obj);
-                                  document.namespaces.add("m", "http://www.w3.org/1998/Math/MathML", "#mathplayer");  
-                                  doc.mathplayerinitialized = true;
-                              }
-                              return doc.createElement("m:" + local);
-                          } else if ("http://www.w3.org/2000/svg" == uri) {
-                              if (!doc.renesisinitialized) {
-                                  var obj = document.createElement("object");
-                                  obj.setAttribute("id", "renesis");
-                                  obj.setAttribute("classid", "clsid:AC159093-1683-4BA2-9DCF-0C350141D7F2");
-                                  document.getElementsByTagName("head")[0].appendChild(obj);
-                                  document.namespaces.add("s", "http://www.w3.org/2000/svg", "#renesis");  
-                                  doc.renesisinitialized = true;
-                              }
-                              return doc.createElement("s:" + local);
-                          } else {
-                              // throw
-                          }
-                      }
-                  }
-              }-*/;
-
-    private static native boolean hasAttributeNS(JavaScriptObject element,
-            String uri, String localName) /*-{
-                        return element.hasAttributeNS(uri, localName); 
-                    }-*/;
-
-    private static native void setAttributeNS(JavaScriptObject element,
-            String uri, String localName, String value) /*-{
-                        element.setAttributeNS(uri, localName, value); 
-                    }-*/;
-
-    @Override protected void addAttributesToElement(JavaScriptObject element,
-            HtmlAttributes attributes) throws SAXException {
-        try {
-            for (int i = 0; i < attributes.getLength(); i++) {
-                String localName = attributes.getLocalNameNoBoundsCheck(i);
-                String uri = attributes.getURINoBoundsCheck(i);
-                if (!hasAttributeNS(element, uri, localName)) {
-                    setAttributeNS(element, uri, localName,
-                            attributes.getValueNoBoundsCheck(i));
-                }
-            }
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    private static native void appendChild(JavaScriptObject parent,
-            JavaScriptObject child) /*-{
-                        parent.appendChild(child); 
-                    }-*/;
-
-    private static native JavaScriptObject createTextNode(JavaScriptObject doc,
-            String text) /*-{
-                        return doc.createTextNode(text); 
-                    }-*/;
-
-    private static native JavaScriptObject getLastChild(JavaScriptObject node) /*-{
-                        return node.lastChild; 
-                    }-*/;
-
-    private static native void extendTextNode(JavaScriptObject node, String text) /*-{
-                        node.data += text;
-                    }-*/;
-    
-    @Override protected void appendCharacters(JavaScriptObject parent,
-            String text) throws SAXException {
-        try {
-            if (parent == placeholder) {
-                appendChild(script, createTextNode(document, text));
-
-            }
-            JavaScriptObject lastChild = getLastChild(parent);
-            if (lastChild != null && getNodeType(lastChild) == 3) {
-                extendTextNode(lastChild, text);
-                return;
-            }
-            appendChild(parent, createTextNode(document, text));
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    private static native boolean hasChildNodes(JavaScriptObject element) /*-{
-                        return element.hasChildNodes(); 
-                    }-*/;
-
-    private static native JavaScriptObject getFirstChild(
-            JavaScriptObject element) /*-{
-                        return element.firstChild; 
-                    }-*/;
-
-    @Override protected void appendChildrenToNewParent(
-            JavaScriptObject oldParent, JavaScriptObject newParent)
-            throws SAXException {
-        try {
-            while (hasChildNodes(oldParent)) {
-                appendChild(newParent, getFirstChild(oldParent));
-            }
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    private static native JavaScriptObject createComment(JavaScriptObject doc,
-            String text) /*-{
-                        return doc.createComment(text); 
-                    }-*/;
-
-    @Override protected void appendComment(JavaScriptObject parent,
-            String comment) throws SAXException {
-        try {
-            if (parent == placeholder) {
-                appendChild(script, createComment(document, comment));
-            }
-            appendChild(parent, createComment(document, comment));
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    @Override protected void appendCommentToDocument(String comment)
-            throws SAXException {
-        try {
-            appendChild(document, createComment(document, comment));
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    private static native JavaScriptObject createElementNS(
-            JavaScriptObject doc, String ns, String local) /*-{
-                        return doc.createElementNS(ns, local); 
-                    }-*/;
-
-    @Override protected JavaScriptObject createElement(String ns, String name,
-            HtmlAttributes attributes) throws SAXException {
-        try {
-            JavaScriptObject rv = createElementNS(document, ns, name);
-            for (int i = 0; i < attributes.getLength(); i++) {
-                setAttributeNS(rv, attributes.getURINoBoundsCheck(i),
-                        attributes.getLocalNameNoBoundsCheck(i),
-                        attributes.getValueNoBoundsCheck(i));
-            }
-
-            if ("script" == name) {
-                if (placeholder != null) {
-                    scriptStack.addLast(new ScriptHolder(script, placeholder));
-                }
-                script = rv;
-                placeholder = createElementNS(document,
-                        "http://n.validator.nu/placeholder/", "script");
-                rv = placeholder;
-                for (int i = 0; i < attributes.getLength(); i++) {
-                    setAttributeNS(rv, attributes.getURINoBoundsCheck(i),
-                            attributes.getLocalNameNoBoundsCheck(i),
-                            attributes.getValueNoBoundsCheck(i));
-                }
-            }
-
-            return rv;
-        } catch (JavaScriptException e) {
-            fatal(e);
-            throw new RuntimeException("Unreachable");
-        }
-    }
-
-    @Override protected JavaScriptObject createHtmlElementSetAsRoot(
-            HtmlAttributes attributes) throws SAXException {
-        try {
-            JavaScriptObject rv = createElementNS(document,
-                    "http://www.w3.org/1999/xhtml", "html");
-            for (int i = 0; i < attributes.getLength(); i++) {
-                setAttributeNS(rv, attributes.getURINoBoundsCheck(i),
-                        attributes.getLocalNameNoBoundsCheck(i),
-                        attributes.getValueNoBoundsCheck(i));
-            }
-            appendChild(document, rv);
-            return rv;
-        } catch (JavaScriptException e) {
-            fatal(e);
-            throw new RuntimeException("Unreachable");
-        }
-    }
-
-    private static native JavaScriptObject getParentNode(
-            JavaScriptObject element) /*-{
-                        return element.parentNode; 
-                    }-*/;
-
-    @Override protected void appendElement(JavaScriptObject child,
-            JavaScriptObject newParent) throws SAXException {
-        try {
-            if (newParent == placeholder) {
-                appendChild(script, cloneNodeDeep(child));
-            }
-            appendChild(newParent, child);
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    @Override protected boolean hasChildren(JavaScriptObject element)
-            throws SAXException {
-        try {
-            return hasChildNodes(element);
-        } catch (JavaScriptException e) {
-            fatal(e);
-            throw new RuntimeException("Unreachable");
-        }
-    }
-
-    private static native void insertBeforeNative(JavaScriptObject parent,
-            JavaScriptObject child, JavaScriptObject sibling) /*-{
-                        parent.insertBefore(child, sibling);
-                    }-*/;
-
-    private static native int getNodeType(JavaScriptObject node) /*-{
-                        return node.nodeType;
-                    }-*/;
-
-    private static native JavaScriptObject cloneNodeDeep(JavaScriptObject node) /*-{
-              return node.cloneNode(true);
-           }-*/;
-
-    /**
-     * Returns the document.
-     * 
-     * @return the document
-     */
-    JavaScriptObject getDocument() {
-        JavaScriptObject rv = document;
-        document = null;
-        return rv;
-    }
-
-    private static native JavaScriptObject createDocumentFragment(
-            JavaScriptObject doc) /*-{
-                        return doc.createDocumentFragment(); 
-                    }-*/;
-
-    JavaScriptObject getDocumentFragment() {
-        JavaScriptObject rv = createDocumentFragment(document);
-        JavaScriptObject rootElt = getFirstChild(document);
-        while (hasChildNodes(rootElt)) {
-            appendChild(rv, getFirstChild(rootElt));
-        }
-        document = null;
-        return rv;
-    }
-
-    /**
-     * @see nu.validator.htmlparser.impl.TreeBuilder#createJavaScriptObject(String,
-     *      java.lang.String, org.xml.sax.Attributes, java.lang.Object)
-     */
-    @Override protected JavaScriptObject createElement(String ns, String name,
-            HtmlAttributes attributes, JavaScriptObject form)
-            throws SAXException {
-        try {
-            JavaScriptObject rv = createElement(ns, name, attributes);
-            // rv.setUserData("nu.validator.form-pointer", form, null);
-            return rv;
-        } catch (JavaScriptException e) {
-            fatal(e);
-            return null;
-        }
-    }
-
-    /**
-     * @see nu.validator.htmlparser.impl.TreeBuilder#start()
-     */
-    @Override protected void start(boolean fragment) throws SAXException {
-        script = null;
-        placeholder = null;
-        readyToRun = false;
-    }
-
-    protected void documentMode(DocumentMode mode, String publicIdentifier,
-            String systemIdentifier)
-            throws SAXException {
-        // document.setUserData("nu.validator.document-mode", mode, null);
-    }
-
-    /**
-     * @see nu.validator.htmlparser.impl.TreeBuilder#elementPopped(java.lang.String,
-     *      java.lang.String, java.lang.Object)
-     */
-    @Override protected void elementPopped(String ns, String name,
-            JavaScriptObject node) throws SAXException {
-        if (node == placeholder) {
-            readyToRun = true;
-            requestSuspension();
-        }
-    }
-
-    private static native void replace(JavaScriptObject oldNode,
-            JavaScriptObject newNode) /*-{
-                        oldNode.parentNode.replaceChild(newNode, oldNode);
-                    }-*/;
-
-    private static native JavaScriptObject getPreviousSibling(JavaScriptObject node) /*-{
-                        return node.previousSibling;
-                    }-*/;
-
-    void maybeRunScript() {
-        if (readyToRun) {
-            readyToRun = false;
-            replace(placeholder, script);
-            if (scriptStack.isEmpty()) {
-                script = null;
-                placeholder = null;
-            } else {
-                ScriptHolder scriptHolder = scriptStack.removeLast();
-                script = scriptHolder.getScript();
-                placeholder = scriptHolder.getPlaceholder();
-            }
-        }
-    }
-
-    @Override protected void insertFosterParentedCharacters(String text,
-            JavaScriptObject table, JavaScriptObject stackParent)
-            throws SAXException {
-        try {
-            JavaScriptObject parent = getParentNode(table);
-            if (parent != null) { // always an element if not null
-                JavaScriptObject previousSibling = getPreviousSibling(table);
-                if (previousSibling != null
-                        && getNodeType(previousSibling) == 3) {
-                    extendTextNode(previousSibling, text);
-                    return;
-                }
-                insertBeforeNative(parent, createTextNode(document, text), table);
-                return;
-            }
-            JavaScriptObject lastChild = getLastChild(stackParent);
-            if (lastChild != null && getNodeType(lastChild) == 3) {
-                extendTextNode(lastChild, text);
-                return;
-            }
-            appendChild(stackParent, createTextNode(document, text));
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    @Override protected void insertFosterParentedChild(JavaScriptObject child,
-            JavaScriptObject table, JavaScriptObject stackParent)
-            throws SAXException {
-        JavaScriptObject parent = getParentNode(table);
-        try {
-            if (parent != null && getNodeType(parent) == 1) {
-                insertBeforeNative(parent, child, table);
-            } else {
-                appendChild(stackParent, child);
-            }
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-
-    private static native void removeChild(JavaScriptObject parent,
-            JavaScriptObject child) /*-{
-                        parent.removeChild(child);
-                    }-*/;
-
-    @Override protected void detachFromParent(JavaScriptObject element)
-            throws SAXException {
-        try {
-            JavaScriptObject parent = getParentNode(element);
-            if (parent != null) {
-                removeChild(parent, element);
-            }
-        } catch (JavaScriptException e) {
-            fatal(e);
-        }
-    }
-}
diff --git a/gwt-src/nu/validator/htmlparser/gwt/HtmlParser.java b/gwt-src/nu/validator/htmlparser/gwt/HtmlParser.java
deleted file mode 100644
index 1d71cdfd..00000000
--- a/gwt-src/nu/validator/htmlparser/gwt/HtmlParser.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2007-2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.gwt;
-
-import java.util.LinkedList;
-
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.impl.ErrorReportingTokenizer;
-import nu.validator.htmlparser.impl.Tokenizer;
-import nu.validator.htmlparser.impl.UTF16Buffer;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.user.client.Timer;
-
-/**
- * This class implements an HTML5 parser that exposes data through the DOM 
- * interface. 
- * 
- * <p>By default, when using the constructor without arguments, the 
- * this parser treats XML 1.0-incompatible infosets as fatal errors. 
- * This corresponds to 
- * <code>FATAL</code> as the general XML violation policy. To make the parser 
- * support non-conforming HTML fully per the HTML 5 spec while on the other 
- * hand potentially violating the DOM API contract, set the general XML 
- * violation policy to <code>ALLOW</code>. This does not work with a standard 
- * DOM implementation. Handling all input without fatal errors and without 
- * violating the DOM API contract is possible by setting 
- * the general XML violation policy to <code>ALTER_INFOSET</code>. <em>This 
- * makes the parser non-conforming</em> but is probably the most useful 
- * setting for most applications.
- * 
- * <p>The doctype is not represented in the tree.
- * 
- * <p>The document mode is represented as user data <code>DocumentMode</code> 
- * object with the key <code>nu.validator.document-mode</code> on the document 
- * node. 
- * 
- * <p>The form pointer is also stored as user data with the key 
- * <code>nu.validator.form-pointer</code>.
- * 
- * @version $Id: HtmlDocumentBuilder.java 255 2008-05-29 08:57:38Z hsivonen $
- * @author hsivonen
- */
-public class HtmlParser {
-
-    private static final int CHUNK_SIZE = 512;
-    
-    private final Tokenizer tokenizer;
-
-    private final BrowserTreeBuilder domTreeBuilder;
-
-    private final StringBuilder documentWriteBuffer = new StringBuilder();
-
-    private ErrorHandler errorHandler;
-
-    private UTF16Buffer stream;
-
-    private int streamLength;
-
-    private boolean lastWasCR;
-
-    private boolean ending;
-
-    private ParseEndListener parseEndListener;
-
-    private final LinkedList<UTF16Buffer> bufferStack = new LinkedList<UTF16Buffer>();
-
-    /**
-     * Instantiates the parser
-     * 
-     * @param implementation
-     *            the DOM implementation
-     *            @param xmlPolicy the policy
-     */
-    public HtmlParser(JavaScriptObject document) {
-        this.domTreeBuilder = new BrowserTreeBuilder(document);
-        this.tokenizer = new ErrorReportingTokenizer(domTreeBuilder);
-        this.domTreeBuilder.setNamePolicy(XmlViolationPolicy.ALTER_INFOSET);
-        this.tokenizer.setCommentPolicy(XmlViolationPolicy.ALTER_INFOSET);
-        this.tokenizer.setContentNonXmlCharPolicy(XmlViolationPolicy.ALTER_INFOSET);
-        this.tokenizer.setContentSpacePolicy(XmlViolationPolicy.ALTER_INFOSET);
-        this.tokenizer.setNamePolicy(XmlViolationPolicy.ALTER_INFOSET);
-        this.tokenizer.setXmlnsPolicy(XmlViolationPolicy.ALTER_INFOSET);
-    }
-
-    /**
-     * Parses a document from a SAX <code>InputSource</code>.
-     * @param is the source
-     * @return the doc
-     * @see javax.xml.parsers.DocumentBuilder#parse(org.xml.sax.InputSource)
-     */
-    public void parse(String source, ParseEndListener callback) throws SAXException {
-        parseEndListener = callback;
-        domTreeBuilder.setFragmentContext(null);
-        tokenize(source, null);   
-    }
-
-    /**
-     * @param is
-     * @throws SAXException
-     * @throws IOException
-     * @throws MalformedURLException
-     */
-    private void tokenize(String source, String context) throws SAXException {
-        lastWasCR = false;
-        ending = false;
-        documentWriteBuffer.setLength(0);
-        streamLength = source.length();
-        stream = new UTF16Buffer(source.toCharArray(), 0,
-                (streamLength < CHUNK_SIZE ? streamLength : CHUNK_SIZE));
-        bufferStack.clear();
-        push(stream);
-        domTreeBuilder.setFragmentContext(context == null ? null : context.intern());
-        tokenizer.start();
-        pump();
-    }
-
-    private void pump() throws SAXException {
-        if (ending) {
-            tokenizer.end();
-            domTreeBuilder.getDocument(); // drops the internal reference
-            parseEndListener.parseComplete();
-            // Don't schedule timeout
-            return;
-        }
-
-        int docWriteLen = documentWriteBuffer.length();
-        if (docWriteLen > 0) {
-            char[] newBuf = new char[docWriteLen];
-            documentWriteBuffer.getChars(0, docWriteLen, newBuf, 0);
-            push(new UTF16Buffer(newBuf, 0, docWriteLen));
-            documentWriteBuffer.setLength(0);
-        }
-
-        for (;;) {
-            UTF16Buffer buffer = peek();
-            if (!buffer.hasMore()) {
-                if (buffer == stream) {
-                    if (buffer.getEnd() == streamLength) {
-                        // Stop parsing
-                        tokenizer.eof();
-                        ending = true;
-                        break;
-                    } else {
-                        int newEnd = buffer.getStart() + CHUNK_SIZE;
-                        buffer.setEnd(newEnd < streamLength ? newEnd
-                                : streamLength);
-                        continue;
-                    }
-                } else {
-                    pop();
-                    continue;
-                }
-            }
-            // now we have a non-empty buffer
-            buffer.adjust(lastWasCR);
-            lastWasCR = false;
-            if (buffer.hasMore()) {
-                lastWasCR = tokenizer.tokenizeBuffer(buffer);
-                domTreeBuilder.maybeRunScript();
-                break;
-            } else {
-                continue;
-            }
-        }
-
-        // schedule
-        Timer timer = new Timer() {
-
-            @Override public void run() {
-                try {
-                    pump();
-                } catch (SAXException e) {
-                    ending = true;
-                    if (errorHandler != null) {
-                        try {
-                            errorHandler.fatalError(new SAXParseException(
-                                    e.getMessage(), null, null, -1, -1, e));
-                        } catch (SAXException e1) {
-                        }
-                    }
-                }
-            }
-
-        };
-        timer.schedule(1);
-    }
-
-    private void push(UTF16Buffer buffer) {
-        bufferStack.addLast(buffer);
-    }
-
-    private UTF16Buffer peek() {
-        return bufferStack.getLast();
-    }
-
-    private void pop() {
-        bufferStack.removeLast();
-    }
-
-    public void documentWrite(String text) throws SAXException {
-        UTF16Buffer buffer = new UTF16Buffer(text.toCharArray(), 0, text.length());
-        while (buffer.hasMore()) {
-            buffer.adjust(lastWasCR);
-            lastWasCR = false;
-            if (buffer.hasMore()) {
-                lastWasCR = tokenizer.tokenizeBuffer(buffer);            
-                domTreeBuilder.maybeRunScript();
-            }
-        }
-    }
-
-    /**
-     * @see javax.xml.parsers.DocumentBuilder#setErrorHandler(org.xml.sax.ErrorHandler)
-     */
-    public void setErrorHandler(ErrorHandler errorHandler) {
-        this.errorHandler = errorHandler;
-        domTreeBuilder.setErrorHandler(errorHandler);
-        tokenizer.setErrorHandler(errorHandler);
-    }
-
-    /**
-     * Sets whether comment nodes appear in the tree.
-     * @param ignoreComments <code>true</code> to ignore comments
-     * @see nu.validator.htmlparser.impl.TreeBuilder#setIgnoringComments(boolean)
-     */
-    public void setIgnoringComments(boolean ignoreComments) {
-        domTreeBuilder.setIgnoringComments(ignoreComments);
-    }
-
-    /**
-     * Sets whether the parser considers scripting to be enabled for noscript treatment.
-     * @param scriptingEnabled <code>true</code> to enable
-     * @see nu.validator.htmlparser.impl.TreeBuilder#setScriptingEnabled(boolean)
-     */
-    public void setScriptingEnabled(boolean scriptingEnabled) {
-        domTreeBuilder.setScriptingEnabled(scriptingEnabled);
-    }
-
-}
diff --git a/gwt-src/nu/validator/htmlparser/gwt/HtmlParserModule.java b/gwt-src/nu/validator/htmlparser/gwt/HtmlParserModule.java
deleted file mode 100644
index 255a02d1..00000000
--- a/gwt-src/nu/validator/htmlparser/gwt/HtmlParserModule.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.gwt;
-
-import org.xml.sax.SAXException;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class HtmlParserModule implements EntryPoint {
-
-    private static native void zapChildren(JavaScriptObject node) /*-{
-        while (node.hasChildNodes()) {
-            node.removeChild(node.lastChild);
-        }
-    }-*/;
-    
-    private static native void installDocWrite(JavaScriptObject doc, HtmlParser parser) /*-{
-        doc.write = function() {
-            if (arguments.length == 0) {
-                return;
-            }
-            var text = arguments[0];
-            for (var i = 1; i < arguments.length; i++) {
-                text += arguments[i];
-            }
-            parser.@nu.validator.htmlparser.gwt.HtmlParser::documentWrite(Ljava/lang/String;)(text);
-        }
-        doc.writeln = function() {
-            if (arguments.length == 0) {
-                parser.@nu.validator.htmlparser.gwt.HtmlParser::documentWrite(Ljava/lang/String;)("\n");
-                return;
-            }
-            var text = arguments[0];
-            for (var i = 1; i < arguments.length; i++) {
-                text += arguments[i];
-            }
-            text += "\n";
-            parser.@nu.validator.htmlparser.gwt.HtmlParser::documentWrite(Ljava/lang/String;)(text);
-        }
-    }-*/;
-    
-    @SuppressWarnings("unused")
-    private static void parseHtmlDocument(String source, JavaScriptObject document, JavaScriptObject readyCallback, JavaScriptObject errorHandler) throws SAXException {
-        if (readyCallback == null) {
-            readyCallback = JavaScriptObject.createFunction();
-        }
-        zapChildren(document);
-        HtmlParser parser = new HtmlParser(document);
-        parser.setScriptingEnabled(true);
-        // XXX error handler
-        
-        installDocWrite(document, parser);
-        
-        parser.parse(source, new ParseEndListener(readyCallback));
-    }
-    
-    private static native void exportEntryPoints() /*-{
-        $wnd.parseHtmlDocument = @nu.validator.htmlparser.gwt.HtmlParserModule::parseHtmlDocument(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;);
-    }-*/;
-
-    
-    public void onModuleLoad() {
-        exportEntryPoints();        
-    }
-
-}
diff --git a/gwt-src/nu/validator/htmlparser/public/HtmlParser.html b/gwt-src/nu/validator/htmlparser/public/HtmlParser.html
deleted file mode 100644
index 4d9cde81..00000000
--- a/gwt-src/nu/validator/htmlparser/public/HtmlParser.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
-  <title>Live DOM Viewer</title>
-   <script type="text/javascript" language="javascript" src="nu.validator.htmlparser.HtmlParser.nocache.js"></script>
-  <style>
-   h1 { margin: 0; }
-   h2 { font-size: small; margin: 1em 0 0; }
-   p, ul, pre { margin: 0; }
-   p { border: inset thin; }
-   textarea { width: 100%; -width: 99%; height: 8em; border: 0; }
-   iframe { width: 100%; height: 12em; border: 0; }
-/* iframe.large { height: 24em; } */
-   pre { border: inset thin; padding: 0.5em; color: gray; }
-   pre samp { color: black; }
-   #dom { border: inset thin; padding: 0.5em 0.5em 0.5em 1em; color: black; min-height: 5em; font-family: monospace; background: white; }
-   #dom ul { padding: 0 0 0 1em; margin: 0; }
-   #dom li { padding: 0; margin: 0; list-style: none; position: relative; }
-   #dom li li { list-style: disc; }
-   #dom .t1 code { color: purple; font-weight: bold; }
-   #dom .t2 { font-style: normal; font-family: monospace; }
-   #dom .t2 .name { color: black; font-weight: bold; }
-   #dom .t2 .value { color: blue; font-weight: normal; }
-   #dom .t3 code, #dom .t4 code, #dom .t5 code { color: gray; }
-   #dom .t7 code, #dom .t8 code { color: green; }
-   #dom span { font-style: italic; font-family: serif; }
-   #dom .t10 code { color: teal; }
-   #dom .misparented, #dom .misparented code { color: red; font-weight: bold; }
-   #dom.hidden, .hidden { visibility: hidden; margin: 0.5em 0; padding: 0; height: 0; min-height: 0; }
-   pre#log { color: black; font: small monospace; }
-   script + p { border: none; font-size: smaller; margin: 0.8em 0.3em; }
-  </style>
-  <style title="Tree View">
-   #dom li li { list-style: none; }
-   #dom li:first-child::before { position: absolute; top: 0; height: 0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
-   #dom li:not(:last-child)::after { position: absolute; top: 0; bottom: -0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
-  </style>
-  <script>
-   if (navigator.userAgent.match('Gecko/(\\d+)') && RegExp.$1 == '20060217' && RegExp.$1 != '00000000') {
-     var style = document.getElementsByTagName('style')[1];
-     style.parentNode.removeChild(style);
-   }
-  </script>
- </head>
- <body onload="init()">
-  <h1>Live DOM Viewer</h1>
-  <h2>Markup to test (<a href="data:," id="permalink" rel="bookmark">permalink</a>, <a href="javascript:up()">upload</a>, <a href="javascript:down()">download</a>, <a href="#" onclick="toggleVisibility(this); return false">hide</a>): <span id="updown-status"></span></h2>
-  <p><textarea oninput="updateInput(event)" onkeydown="updateInput(event)">&lt;!DOCTYPE html>
-...</textarea></p>
-  <h2><a href="data:," id="domview">DOM view</a> (<a href="#" onclick="toggleVisibility(this); return false;">hide</a>, <a href="#" onclick="updateDOM()">refresh</a>):</h2>
-  <ul id="dom"></ul>
-  <h2><a href="data:," id="link">Rendered view</a>: (<a href="#" onclick="toggleVisibility(this); return false;">hide</a><!--, <a href="#" onclick="grow(this)">grow</a>-->):</h2>
-  <p><iframe src="blank.html"></iframe></p> <!-- data:, -->
-  <h2>innerHTML view: (<a href="#" onclick="toggleVisibility(this); return false;">show</a>, <a href="#" onclick="updateDOM()">refresh</a>):</h2>
-  <pre class="hidden">&lt;!DOCTYPE HTML>&lt;html><samp></samp>&lt;/html></pre>
-  <h2>Log: (<a href="#" onclick="toggleVisibility(this); return false;">hide</a>):</h2>
-  <pre id="log">Script not loaded.</pre>
-  <script>
-   var iframe = document.getElementsByTagName('iframe')[0];
-   var textarea = document.getElementsByTagName('textarea')[0];
-   var pre = document.getElementsByTagName('samp')[0];
-   var dom = document.getElementsByTagName('ul')[0];
-   var log = document.getElementById('log');
-   var updownStatus = document.getElementById('updown-status');
-   var delayedUpdater = 0;
-   var lastString = '';
-   var logBuffer = '';
-   var logBuffering = false;
-   function updateInput(event) {
-     if (delayedUpdater) {
-       clearTimeout(delayedUpdater);
-       delayedUpdater = 0;
-     }
-     delayedUpdater = setTimeout(update, 100);
-   }
-   function afterParse() {
-       lastString = textarea.value;
-       setTimeout(updateDOM, 100);
-       updown('');
-   }
-   function update() {
-     if (lastString != textarea.value) {
-       logBuffering = true;
-       document.getElementById('link').href = 'data:text/html;charset=utf-8,' + encodeURIComponent(textarea.value);
-       iframe.contentWindow.onerror = function (a, b, c) {
-         record('error: ' + a + ' on line ' + c);
-       }
-       iframe.contentWindow.w = function (s) {
-         record('log: ' + s);
-       }
-       window.parseHtmlDocument(textarea.value, iframe.contentWindow.document, afterParse, null);
-     }
-   }
-   function updateDOM() {
-     while (pre.firstChild) pre.removeChild(pre.firstChild);
-     pre.appendChild(document.createTextNode(iframe.contentWindow.document.documentElement.innerHTML));
-     printDOM(dom, iframe.contentWindow.document);
-     document.getElementById('domview').href = 'data:text/plain;charset=utf-8,<ul class="domTree">' + encodeURIComponent(dom.innerHTML + '</ul>');
-     document.getElementById('permalink').href = '?' + encodeURIComponent(textarea.value);
-     record('rendering mode: ' + iframe.contentWindow.document.compatMode);
-     if (iframe.contentWindow.document.title)
-       record('document.title: ' + iframe.contentWindow.document.title);
-     else
-       record('document has no title');
-     while (log.firstChild != log.lastChild)
-       log.removeChild(log.lastChild);
-     log.firstChild.data = logBuffer;
-     logBuffering = false;
-     logBuffer = '';
-   }
-   function printDOM(ul, node) {
-     while (ul.firstChild) ul.removeChild(ul.firstChild);
-     for (var i = 0; i < node.childNodes.length; i += 1) {
-       var li = document.createElement('li');
-       li.className = 't' + node.childNodes[i].nodeType;
-       if (node.childNodes[i].nodeType == 10) {
-         li.appendChild(document.createTextNode('DOCTYPE: '));
-       }
-       var code = document.createElement('code');
-       code.appendChild(document.createTextNode(node.childNodes[i].nodeName));
-       li.appendChild(code);
-       if (node.childNodes[i].nodeValue) {
-                 var span = document.createElement('span');
-         span.appendChild(document.createTextNode(node.childNodes[i].nodeValue));
-         li.appendChild(document.createTextNode(': '));
-         li.appendChild(span);
-       }
-       if (node.childNodes[i].attributes)
-         for (var j = 0; j < node.childNodes[i].attributes.length; j += 1) {
-           if (node.childNodes[i].attributes[j].specified) {
-             var attName = document.createElement('code');
-             attName.appendChild(document.createTextNode(node.childNodes[i].attributes[j].nodeName));
-             attName.className = 'attribute name';
-             var attValue = document.createElement('code');
-             attValue.appendChild(document.createTextNode(node.childNodes[i].attributes[j].nodeValue));
-             attValue.className = 'attribute value';
-             var att = document.createElement('span');
-             att.className = 't2';
-             att.appendChild(attName);
-             att.appendChild(document.createTextNode('="'));
-             att.appendChild(attValue);
-             att.appendChild(document.createTextNode('"'));
-             li.appendChild(document.createTextNode(' '));
-             li.appendChild(att);
-           }
-         }
-       if (node.childNodes[i].parentNode == node) {
-         if (node.childNodes[i].childNodes.length) {
-           var ul2 = document.createElement('ul');
-           li.appendChild(ul2);
-           printDOM(ul2, node.childNodes[i]);
-         }
-       } else {
-         li.className += ' misparented';
-       }
-       ul.appendChild(li);
-     }
-   }
-   function toggleVisibility(link) {
-     var n = link.parentNode.nextSibling;
-     if (n.nodeType == 3 /* text node */) n = n.nextSibling; // we should always do this but in IE, text nodes vanish
-     n.className = (n.className == "hidden") ? '' : 'hidden';
-     link.firstChild.data = n.className == "hidden" ? "show" : "hide";
-   }
-/*
-   function grow(link) {
-     var n = link.parentNode.nextSibling;
-     if (n.nodeType == 3 /-* text node *-/) n = n.nextSibling; // we should always do this but in IE, text nodes vanish
-     n.className = (n.className == "large") ? '' : 'large';
-     link.firstChild.data = n.className == "grow" ? "shrink" : "grow";
-   }
-*/
-   function down() {
-     updown('downloading...');
-     var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
-     request.onreadystatechange = function () {
-       updown('downloading... ' + request.readyState + '/4');
-       if (request.readyState == 4) {
-         textarea.value = request.responseText;
-         update();
-         updown('downloaded');
-       }
-     };
-     request.open('GET', 'clipboard.cgi', true);
-     request.send(null);
-   }
-   function up() {
-     updown('uploading...');
-     var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
-     request.onreadystatechange = function () {
-       updown('uploading... ' + request.readyState + '/4');
-       if (request.readyState == 4) {
-         updown('uploaded');
-       }
-     };
-     request.open('POST', 'clipboard.cgi', true);
-     request.setRequestHeader('Content-Type', 'text/plain');
-     request.send(textarea.value);
-   }
-   function init() {
-     var uri = location.search;
-     if (uri)
-       textarea.value = decodeURIComponent(uri.substring(1, uri.length));
-     update();
-   }
-   function record(s) {
-     if (logBuffering)
-       logBuffer += s + '\r\n';
-     else
-       log.appendChild(document.createTextNode(s + '\r\n'));
-   }
-   function updown(s) {
-     while (updownStatus.firstChild) updownStatus.removeChild(updownStatus.firstChild);
-     updownStatus.appendChild(document.createTextNode(s));
-   }
-  </script>
-  <p>This script puts a function <code>w(<var>s</var>)</code> into the
-  global scope of the test page, where <var>s</vaR> is a string to
-  output to the log. Also, five files are accessible in the current
-  directory for test purposes: <code>image</code> (a GIF image),
-  <code>flash</code> (a Flash file), <code>script</code> (a JS file),
-  <code>style</code> (a CSS file), and <code>document</code> (an HTML
-  file).</p>
- </body>
-</html>
\ No newline at end of file
diff --git a/gwt-src/nu/validator/htmlparser/public/LICENSE.Live-DOM-viewer.txt b/gwt-src/nu/validator/htmlparser/public/LICENSE.Live-DOM-viewer.txt
deleted file mode 100644
index bd2f4fcf..00000000
--- a/gwt-src/nu/validator/htmlparser/public/LICENSE.Live-DOM-viewer.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-From:
-http://software.hixie.ch/utilities/js/live-dom-viewer/LICENSE
-regarding the upstream of HtmlParser.html:
-
-The MIT License
-
-Copyright (c) 2000, 2006, 2008 Ian Hickson and various contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/gwt-src/nu/validator/htmlparser/public/blank.html b/gwt-src/nu/validator/htmlparser/public/blank.html
deleted file mode 100644
index a8756c9f..00000000
--- a/gwt-src/nu/validator/htmlparser/public/blank.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<title></title>
\ No newline at end of file
diff --git a/htmlparser/pom.xml b/htmlparser/pom.xml
new file mode 100644
index 00000000..3922ae75
--- /dev/null
+++ b/htmlparser/pom.xml
@@ -0,0 +1,134 @@
+<!--
+ * Copyright (c) 2007-2012 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>nu.validator.htmlparser</groupId>
+    <artifactId>parent</artifactId>
+    <version>2.0</version>
+  </parent>
+
+  <artifactId>htmlparser</artifactId>
+
+  <name>htmlparser</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>nu.validator.htmlparser</groupId>
+      <artifactId>saxtree</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sdicons.jsontools</groupId>
+      <artifactId>jsontools-core</artifactId>
+      <version>1.7</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>backup-tokenizer</id>
+            <phase>process-sources</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <overwrite>true</overwrite>
+              <outputDirectory>${project.build.directory}/hotspot-backup</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>src/main/java/nu/validator/htmlparser/impl</directory>
+                  <includes>
+                    <li>Tokenizer.java</li>
+                  </includes>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+          <execution>
+            <id>restore-tokenizer</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <overwrite>true</overwrite>
+              <outputDirectory>src/main/java/nu/validator/htmlparser/impl</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>${project.build.directory}/hotspot-backup</directory>
+                  <includes>
+                    <li>Tokenizer.java</li>
+                  </includes>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>exec-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>tokenizer-hotspot-workaround-javac</id>
+            <phase>process-sources</phase>
+            <goals>
+              <goal>exec</goal>
+            </goals>
+            <configuration>
+              <executable>javac</executable>
+              <arguments>
+                <arg>${project.basedir}/src/hotspot/java/nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java</arg>
+                <arg>-d</arg>
+                <arg>${project.build.directory}/hotspot-classes</arg>
+              </arguments>
+            </configuration>
+          </execution>
+          <execution>
+            <id>tokenizer-hotspot-workaround-java</id>
+            <phase>process-sources</phase>
+            <goals>
+              <goal>exec</goal>
+            </goals>
+            <configuration>
+              <executable>java</executable>
+              <arguments>
+                <arg>-cp</arg>
+                <arg>${project.build.directory}/hotspot-classes</arg>
+                <arg>nu.validator.htmlparser.generator.ApplyHotSpotWorkaround</arg>
+                <arg>${project.build.sourceDirectory}/nu/validator/htmlparser/impl/Tokenizer.java</arg>
+                <arg>${project.basedir}/src/hotspot/resources/HotSpotWorkaround.txt</arg>
+              </arguments>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/translator-src/nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java b/htmlparser/src/hotspot/java/nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java
similarity index 100%
rename from translator-src/nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java
rename to htmlparser/src/hotspot/java/nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java
diff --git a/src/nu/validator/htmlparser/impl/HotSpotWorkaround.txt b/htmlparser/src/hotspot/resources/HotSpotWorkaround.txt
similarity index 100%
rename from src/nu/validator/htmlparser/impl/HotSpotWorkaround.txt
rename to htmlparser/src/hotspot/resources/HotSpotWorkaround.txt
diff --git a/htmlparser/src/main/java/module-info.java b/htmlparser/src/main/java/module-info.java
new file mode 100644
index 00000000..a9e5f2ef
--- /dev/null
+++ b/htmlparser/src/main/java/module-info.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2020 Anthony Vanelverdinghe
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Provides an implementation of the HTML5 parsing algorithm in Java for applications.
+ * The parser is designed to work as a drop-in replacement for the XML parser in applications
+ * that already support XHTML 1.x content with an XML parser and use SAX or DOM to interface with the parser.
+ */
+module nu.validator.htmlparser {
+    requires transitive java.xml;
+    requires nu.validator.saxtree;
+
+    exports nu.validator.htmlparser.annotation;
+    exports nu.validator.htmlparser.common;
+    exports nu.validator.htmlparser.dom;
+    exports nu.validator.htmlparser.extra;
+    exports nu.validator.htmlparser.impl;
+    exports nu.validator.htmlparser.io;
+    exports nu.validator.htmlparser.rewindable;
+    exports nu.validator.htmlparser.sax;
+}
diff --git a/src/nu/validator/htmlparser/annotation/Auto.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Auto.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Auto.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Auto.java
diff --git a/src/nu/validator/htmlparser/annotation/CharacterName.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/CharacterName.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/CharacterName.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/CharacterName.java
diff --git a/src/nu/validator/htmlparser/annotation/Const.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Const.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Const.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Const.java
diff --git a/src/nu/validator/htmlparser/annotation/Creator.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Creator.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Creator.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Creator.java
diff --git a/src/nu/validator/htmlparser/annotation/HtmlCreator.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/HtmlCreator.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/HtmlCreator.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/HtmlCreator.java
diff --git a/src/nu/validator/htmlparser/annotation/IdType.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/IdType.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/IdType.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/IdType.java
diff --git a/src/nu/validator/htmlparser/annotation/Inline.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Inline.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Inline.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Inline.java
diff --git a/src/nu/validator/htmlparser/annotation/Literal.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Literal.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Literal.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Literal.java
diff --git a/src/nu/validator/htmlparser/annotation/Local.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Local.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Local.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Local.java
diff --git a/src/nu/validator/htmlparser/annotation/NoLength.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/NoLength.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/NoLength.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/NoLength.java
diff --git a/src/nu/validator/htmlparser/annotation/NsUri.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/NsUri.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/NsUri.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/NsUri.java
diff --git a/src/nu/validator/htmlparser/annotation/Prefix.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Prefix.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Prefix.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Prefix.java
diff --git a/src/nu/validator/htmlparser/annotation/QName.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/QName.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/QName.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/QName.java
diff --git a/src/nu/validator/htmlparser/annotation/SvgCreator.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/SvgCreator.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/SvgCreator.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/SvgCreator.java
diff --git a/src/nu/validator/htmlparser/annotation/Unsigned.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Unsigned.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Unsigned.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Unsigned.java
diff --git a/src/nu/validator/htmlparser/annotation/Virtual.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/Virtual.java
similarity index 100%
rename from src/nu/validator/htmlparser/annotation/Virtual.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/annotation/Virtual.java
diff --git a/htmlparser/src/main/java/nu/validator/htmlparser/annotation/package-info.java b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/package-info.java
new file mode 100644
index 00000000..ca70c00b
--- /dev/null
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/annotation/package-info.java
@@ -0,0 +1,27 @@
+/*
+ Copyright (c) 2008 Mozilla Foundation
+
+ Permission is hereby granted, free of charge, to any person obtaining a 
+ copy of this software and associated documentation files (the "Software"), 
+ to deal in the Software without restriction, including without limitation 
+ the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ and/or sell copies of the Software, and to permit persons to whom the 
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in 
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * This package provides annotations for facilitating automated translation
+ * of the source code into other programming languages.
+ */
+package nu.validator.htmlparser.annotation;
diff --git a/src/nu/validator/htmlparser/common/ByteReadable.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/ByteReadable.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/common/ByteReadable.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/ByteReadable.java
diff --git a/src/nu/validator/htmlparser/common/CharacterHandler.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/CharacterHandler.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/CharacterHandler.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/CharacterHandler.java
diff --git a/src/nu/validator/htmlparser/common/DocumentMode.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/DocumentMode.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/DocumentMode.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/DocumentMode.java
diff --git a/src/nu/validator/htmlparser/common/DocumentModeHandler.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/DocumentModeHandler.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/DocumentModeHandler.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/DocumentModeHandler.java
diff --git a/src/nu/validator/htmlparser/common/EncodingDeclarationHandler.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/EncodingDeclarationHandler.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/EncodingDeclarationHandler.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/EncodingDeclarationHandler.java
diff --git a/src/nu/validator/htmlparser/common/Heuristics.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/Heuristics.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/Heuristics.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/Heuristics.java
diff --git a/src/nu/validator/htmlparser/common/Interner.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/Interner.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/Interner.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/Interner.java
diff --git a/src/nu/validator/htmlparser/common/TokenHandler.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/TokenHandler.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/common/TokenHandler.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/TokenHandler.java
diff --git a/src/nu/validator/htmlparser/common/TransitionHandler.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/TransitionHandler.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/TransitionHandler.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/TransitionHandler.java
diff --git a/src/nu/validator/htmlparser/common/XmlViolationPolicy.java b/htmlparser/src/main/java/nu/validator/htmlparser/common/XmlViolationPolicy.java
similarity index 100%
rename from src/nu/validator/htmlparser/common/XmlViolationPolicy.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/XmlViolationPolicy.java
diff --git a/test-src/nu/validator/htmlparser/tools/package.html b/htmlparser/src/main/java/nu/validator/htmlparser/common/package-info.java
similarity index 86%
rename from test-src/nu/validator/htmlparser/tools/package.html
rename to htmlparser/src/main/java/nu/validator/htmlparser/common/package-info.java
index a04bf3cd..0d04ee70 100644
--- a/test-src/nu/validator/htmlparser/tools/package.html
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/common/package-info.java
@@ -1,7 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
+/*
  Copyright (c) 2007 Henri Sivonen
 
  Permission is hereby granted, free of charge, to any person obtaining a 
@@ -21,9 +18,9 @@
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>Demo apps.</p>
-</body>
-</html>
\ No newline at end of file
+ */
+
+/**
+ * This package provides common interfaces and enumerations.
+ */
+package nu.validator.htmlparser.common;
diff --git a/src/nu/validator/htmlparser/dom/DOMTreeBuilder.java b/htmlparser/src/main/java/nu/validator/htmlparser/dom/DOMTreeBuilder.java
similarity index 100%
rename from src/nu/validator/htmlparser/dom/DOMTreeBuilder.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/dom/DOMTreeBuilder.java
diff --git a/src/nu/validator/htmlparser/dom/Dom2Sax.java b/htmlparser/src/main/java/nu/validator/htmlparser/dom/Dom2Sax.java
similarity index 100%
rename from src/nu/validator/htmlparser/dom/Dom2Sax.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/dom/Dom2Sax.java
diff --git a/src/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java b/htmlparser/src/main/java/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java
similarity index 98%
rename from src/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java
index 1674aa72..cbeccb51 100644
--- a/src/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/dom/HtmlDocumentBuilder.java
@@ -375,7 +375,7 @@ public void setTransitionHander(TransitionHandler handler) {
     /**
      * Indicates whether NFC normalization of source is being checked.
      * @return <code>true</code> if NFC normalization of source is being checked.
-     * @see nu.validator.htmlparser.impl.Tokenizer#isCheckingNormalization()
+     * @see nu.validator.htmlparser.io.Driver#isCheckingNormalization()
      */
     public boolean isCheckingNormalization() {
         return checkingNormalization;
@@ -384,7 +384,7 @@ public boolean isCheckingNormalization() {
     /**
      * Toggles the checking of the NFC normalization of source.
      * @param enable <code>true</code> to check normalization
-     * @see nu.validator.htmlparser.impl.Tokenizer#setCheckingNormalization(boolean)
+     * @see nu.validator.htmlparser.io.Driver#setCheckingNormalization(boolean)
      */
     public void setCheckingNormalization(boolean enable) {
         this.checkingNormalization = enable;
@@ -609,7 +609,7 @@ public void setNamePolicy(XmlViolationPolicy namePolicy) {
      * Sets the encoding sniffing heuristics.
      * 
      * @param heuristics the heuristics to set
-     * @see nu.validator.htmlparser.impl.Tokenizer#setHeuristics(nu.validator.htmlparser.common.Heuristics)
+     * @see nu.validator.htmlparser.io.Driver#setHeuristics(nu.validator.htmlparser.common.Heuristics)
      */
     public void setHeuristics(Heuristics heuristics) {
         this.heuristics = heuristics;
@@ -650,6 +650,7 @@ public XmlViolationPolicy getNamePolicy() {
      * Does nothing.
      * @deprecated
      */
+    @Deprecated
     public void setBogusXmlnsPolicy(
             XmlViolationPolicy bogusXmlnsPolicy) {
     }
@@ -659,6 +660,7 @@ public void setBogusXmlnsPolicy(
      * @deprecated
      * @return <code>XmlViolationPolicy.ALTER_INFOSET</code>
      */
+    @Deprecated
     public XmlViolationPolicy getBogusXmlnsPolicy() {
         return XmlViolationPolicy.ALTER_INFOSET;
     }
diff --git a/test-src/nu/validator/htmlparser/test/package.html b/htmlparser/src/main/java/nu/validator/htmlparser/dom/package-info.java
similarity index 85%
rename from test-src/nu/validator/htmlparser/test/package.html
rename to htmlparser/src/main/java/nu/validator/htmlparser/dom/package-info.java
index 57809b84..8d874fd0 100644
--- a/test-src/nu/validator/htmlparser/test/package.html
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/dom/package-info.java
@@ -1,7 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
+/*
  Copyright (c) 2007 Henri Sivonen
 
  Permission is hereby granted, free of charge, to any person obtaining a 
@@ -21,9 +18,9 @@
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>Test drivers.</p>
-</body>
-</html>
\ No newline at end of file
+ */
+
+/**
+ * This package provides an HTML5 parser that exposes the document using the DOM API.
+ */
+package nu.validator.htmlparser.dom;
diff --git a/htmlparser/src/main/java/nu/validator/htmlparser/extra/NormalizationChecker.java b/htmlparser/src/main/java/nu/validator/htmlparser/extra/NormalizationChecker.java
new file mode 100644
index 00000000..44016348
--- /dev/null
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/extra/NormalizationChecker.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 2006, 2007 Henri Sivonen
+ * Copyright (c) 2007 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.extra;
+
+import nu.validator.htmlparser.common.CharacterHandler;
+
+import java.text.Normalizer;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * @version $Id$
+ * @author hsivonen
+ */
+public final class NormalizationChecker implements CharacterHandler {
+
+    private ErrorHandler errorHandler;
+
+    private Locator locator;
+
+    /**
+     * A set of composing characters as per Charmod Norm.
+     * 
+     * Generated with ICU4J 67.1 using: new UnicodeSet("[[:nfc_qc=maybe:][:^ccc=0:]]").freeze()
+     */
+    private static final Set<Integer> COMPOSING_CHARACTERS = new HashSet<Integer>(Arrays.asList(
+        768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785,
+        786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803,
+        804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821,
+        822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839,
+        840, 841, 842, 843, 844, 845, 846, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858,
+        859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876,
+        877, 878, 879, 1155, 1156, 1157, 1158, 1159, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432,
+        1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447,
+        1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462,
+        1463, 1464, 1465, 1466, 1467, 1468, 1469, 1471, 1473, 1474, 1476, 1477, 1479, 1552, 1553,
+        1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1611, 1612, 1613, 1614, 1615, 1616,
+        1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631,
+        1648, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1759, 1760, 1761, 1762, 1763, 1764, 1767,
+        1768, 1770, 1771, 1772, 1773, 1809, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848,
+        1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863,
+        1864, 1865, 1866, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2045, 2070, 2071,
+        2072, 2073, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2085, 2086, 2087, 2089,
+        2090, 2091, 2092, 2093, 2137, 2138, 2139, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266,
+        2267, 2268, 2269, 2270, 2271, 2272, 2273, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282,
+        2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297,
+        2298, 2299, 2300, 2301, 2302, 2303, 2364, 2381, 2385, 2386, 2387, 2388, 2492, 2494, 2509,
+        2519, 2558, 2620, 2637, 2748, 2765, 2876, 2878, 2893, 2902, 2903, 3006, 3021, 3031, 3149,
+        3157, 3158, 3260, 3266, 3277, 3285, 3286, 3387, 3388, 3390, 3405, 3415, 3530, 3535, 3551,
+        3640, 3641, 3642, 3656, 3657, 3658, 3659, 3768, 3769, 3770, 3784, 3785, 3786, 3787, 3864,
+        3865, 3893, 3895, 3897, 3953, 3954, 3956, 3962, 3963, 3964, 3965, 3968, 3970, 3971, 3972,
+        3974, 3975, 4038, 4142, 4151, 4153, 4154, 4237, 4449, 4450, 4451, 4452, 4453, 4454, 4455,
+        4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4520,
+        4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535,
+        4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4957, 4958, 4959, 5908,
+        5940, 6098, 6109, 6313, 6457, 6458, 6459, 6679, 6680, 6752, 6773, 6774, 6775, 6776, 6777,
+        6778, 6779, 6780, 6783, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842,
+        6843, 6844, 6845, 6847, 6848, 6964, 6965, 6980, 7019, 7020, 7021, 7022, 7023, 7024, 7025,
+        7026, 7027, 7082, 7083, 7142, 7154, 7155, 7223, 7376, 7377, 7378, 7380, 7381, 7382, 7383,
+        7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7394, 7395, 7396, 7397, 7398, 7399,
+        7400, 7405, 7412, 7416, 7417, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7625,
+        7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640,
+        7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7654, 7655,
+        7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670,
+        7671, 7672, 7673, 7675, 7676, 7677, 7678, 7679, 8400, 8401, 8402, 8403, 8404, 8405, 8406,
+        8407, 8408, 8409, 8410, 8411, 8412, 8417, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428,
+        8429, 8430, 8431, 8432, 11503, 11504, 11505, 11647, 11744, 11745, 11746, 11747, 11748, 11749,
+        11750, 11751, 11752, 11753, 11754, 11755, 11756, 11757, 11758, 11759, 11760, 11761, 11762,
+        11763, 11764, 11765, 11766, 11767, 11768, 11769, 11770, 11771, 11772, 11773, 11774, 11775,
+        12330, 12331, 12332, 12333, 12334, 12335, 12441, 12442, 42607, 42612, 42613, 42614, 42615,
+        42616, 42617, 42618, 42619, 42620, 42621, 42654, 42655, 42736, 42737, 43014, 43052, 43204,
+        43232, 43233, 43234, 43235, 43236, 43237, 43238, 43239, 43240, 43241, 43242, 43243, 43244,
+        43245, 43246, 43247, 43248, 43249, 43307, 43308, 43309, 43347, 43443, 43456, 43696, 43698,
+        43699, 43700, 43703, 43704, 43710, 43711, 43713, 43766, 44013, 64286, 65056, 65057, 65058,
+        65059, 65060, 65061, 65062, 65063, 65064, 65065, 65066, 65067, 65068, 65069, 65070, 65071,
+        66045, 66272, 66422, 66423, 66424, 66425, 66426, 68109, 68111, 68152, 68153, 68154, 68159,
+        68325, 68326, 68900, 68901, 68902, 68903, 69291, 69292, 69446, 69447, 69448, 69449, 69450,
+        69451, 69452, 69453, 69454, 69455, 69456, 69702, 69759, 69817, 69818, 69888, 69889, 69890,
+        69927, 69939, 69940, 70003, 70080, 70090, 70197, 70198, 70377, 70378, 70459, 70460, 70462,
+        70477, 70487, 70502, 70503, 70504, 70505, 70506, 70507, 70508, 70512, 70513, 70514, 70515,
+        70516, 70722, 70726, 70750, 70832, 70842, 70845, 70850, 70851, 71087, 71103, 71104, 71231,
+        71350, 71351, 71467, 71737, 71738, 71984, 71997, 71998, 72003, 72160, 72244, 72263, 72345,
+        72767, 73026, 73028, 73029, 73111, 92912, 92913, 92914, 92915, 92916, 92976, 92977, 92978,
+        92979, 92980, 92981, 92982, 94192, 94193, 113822, 119141, 119142, 119143, 119144, 119145,
+        119149, 119150, 119151, 119152, 119153, 119154, 119163, 119164, 119165, 119166, 119167,
+        119168, 119169, 119170, 119173, 119174, 119175, 119176, 119177, 119178, 119179, 119210,
+        119211, 119212, 119213, 119362, 119363, 119364, 122880, 122881, 122882, 122883, 122884,
+        122885, 122886, 122888, 122889, 122890, 122891, 122892, 122893, 122894, 122895, 122896,
+        122897, 122898, 122899, 122900, 122901, 122902, 122903, 122904, 122907, 122908, 122909,
+        122910, 122911, 122912, 122913, 122915, 122916, 122918, 122919, 122920, 122921, 122922,
+        123184, 123185, 123186, 123187, 123188, 123189, 123190, 123628, 123629, 123630, 123631,
+        125136, 125137, 125138, 125139, 125140, 125141, 125142, 125252, 125253, 125254, 125255,
+        125256, 125257, 125258
+    ));
+
+    // see http://sourceforge.net/mailarchive/message.php?msg_id=37279908
+
+    /**
+     * A buffer for holding sequences overlap the SAX buffer boundary.
+     */
+    private char[] buf = new char[128];
+
+    /**
+     * A holder for the original buffer (for the memory leak prevention 
+     * mechanism).
+     */
+    private char[] bufHolder = null;
+
+    /**
+     * The current used length of the buffer, i.e. the index of the first slot 
+     * that does not hold current data.
+     */
+    private int pos;
+
+    /**
+     * Indicates whether the checker the next call to <code>characters()</code> 
+     * is the first call in a run.
+     */
+    private boolean atStartOfRun;
+
+    /**
+     * Indicates whether the current run has already caused an error.
+     */
+    private boolean alreadyComplainedAboutThisRun;
+
+    /**
+     * Emit an error. The locator is used.
+     * 
+     * @param message the error message
+     * @throws SAXException if something goes wrong
+     */
+    public void err(String message) throws SAXException {
+        if (errorHandler != null) {
+            SAXParseException spe = new SAXParseException(message, locator);
+            errorHandler.error(spe);
+        }
+    }
+
+    /**
+     * Returns <code>true</code> if the argument is a composing BMP character 
+     * or a surrogate and <code>false</code> otherwise.
+     * 
+     * @param c a UTF-16 code unit
+     * @return <code>true</code> if the argument is a composing BMP character 
+     * or a surrogate and <code>false</code> otherwise
+     */
+    private static boolean isComposingCharOrSurrogate(char c) {
+        if (Character.isHighSurrogate(c) || Character.isLowSurrogate(c)) {
+            return true;
+        }
+        return isComposingChar(c);
+    }
+
+    /**
+     * Returns <code>true</code> if the argument is a composing character 
+     * and <code>false</code> otherwise.
+     * 
+     * @param c a Unicode code point
+     * @return <code>true</code> if the argument is a composing character 
+     * <code>false</code> otherwise
+     */
+    private static boolean isComposingChar(int c) {
+        return COMPOSING_CHARACTERS.contains(c);
+    }
+
+    /**
+     * Constructor with locator.
+     * 
+     * @param locator
+     */
+    public NormalizationChecker(Locator locator) {
+        super();
+        start();
+    }
+
+    /**
+     * @see nu.validator.htmlparser.common.CharacterHandler#start()
+     */
+    public void start() {
+        atStartOfRun = true;
+        alreadyComplainedAboutThisRun = false;
+        pos = 0;
+    }
+
+    /**
+     * @see nu.validator.htmlparser.common.CharacterHandler#characters(char[], int, int)
+     */
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+        if (alreadyComplainedAboutThisRun) {
+            return;
+        }
+        if (atStartOfRun) {
+            char c = ch[start];
+            if (pos == 1) {
+                // there's a single high surrogate in buf
+                if (isComposingChar(getCodePoint(buf[0], c))) {
+                    err("Text run starts with a composing character.");
+                }
+                atStartOfRun = false;
+            } else {
+                if (length == 1 && Character.isHighSurrogate(c)) {
+                    buf[0] = c;
+                    pos = 1;
+                    return;
+                } else {
+                    if (Character.isHighSurrogate(c)) {
+                        if (isComposingChar(getCodePoint(c, ch[start + 1]))) {
+                            err("Text run starts with a composing character.");
+                        }
+                    } else {
+                        if (isComposingCharOrSurrogate(c)) {
+                            err("Text run starts with a composing character.");
+                        }
+                    }
+                    atStartOfRun = false;
+                }
+            }
+        }
+        int i = start;
+        int stop = start + length;
+        if (pos > 0) {
+            // there's stuff in buf
+            while (i < stop && isComposingCharOrSurrogate(ch[i])) {
+                i++;
+            }
+            appendToBuf(ch, start, i);
+            if (i == stop) {
+                return;
+            } else {
+                if (!Normalizer.isNormalized(new String(buf, 0, pos), Normalizer.Form.NFC)) {
+                    errAboutTextRun();
+                }
+                pos = 0;
+            }
+        }
+        if (i < stop) {
+            start = i;
+            i = stop - 1;
+            while (i > start && isComposingCharOrSurrogate(ch[i])) {
+                i--;
+            }
+            if (i > start) {
+                if (!Normalizer.isNormalized(new String(ch, start, i), Normalizer.Form.NFC)) {
+                    errAboutTextRun();
+                }
+            }
+            appendToBuf(ch, i, stop);
+        }
+    }
+
+    private static int getCodePoint(char lead, char trail) {
+        if (Character.isSurrogatePair(lead, trail)) {
+            return Character.toCodePoint(lead, trail);
+        }
+        throw new IllegalArgumentException("Illegal surrogate characters");
+    }
+
+    /**
+     * Emits an error stating that the current text run or the source 
+     * text is not in NFC.
+     * 
+     * @throws SAXException if the <code>ErrorHandler</code> throws
+     */
+    private void errAboutTextRun() throws SAXException {
+        err("Source text is not in Unicode Normalization Form C.");
+        alreadyComplainedAboutThisRun = true;
+    }
+
+    /**
+     * Appends a slice of an UTF-16 code unit array to the internal 
+     * buffer.
+     * 
+     * @param ch the array from which to copy
+     * @param start the index of the first element that is copied
+     * @param end the index of the first element that is not copied
+     */
+    private void appendToBuf(char[] ch, int start, int end) {
+        if (start == end) {
+            return;
+        }
+        int neededBufLen = pos + (end - start);
+        if (neededBufLen > buf.length) {
+            char[] newBuf = new char[neededBufLen];
+            System.arraycopy(buf, 0, newBuf, 0, pos);
+            if (bufHolder == null) {
+                bufHolder = buf; // keep the original around
+            }
+            buf = newBuf;
+        }
+        System.arraycopy(ch, start, buf, pos, end - start);
+        pos += (end - start);
+    }
+
+    /**
+     * @see nu.validator.htmlparser.common.CharacterHandler#end()
+     */
+    public void end() throws SAXException {
+        if (!alreadyComplainedAboutThisRun
+                && !Normalizer.isNormalized(new String(buf, 0, pos), Normalizer.Form.NFC)) {
+            errAboutTextRun();
+        }
+        if (bufHolder != null) {
+            // restore the original small buffer to avoid leaking
+            // memory if this checker is recycled
+            buf = bufHolder;
+            bufHolder = null;
+        }
+    }
+
+    public void setErrorHandler(ErrorHandler errorHandler) {
+        this.errorHandler = errorHandler;
+    }
+
+}
diff --git a/src/nu/validator/htmlparser/impl/AttributeName.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/AttributeName.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/AttributeName.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/AttributeName.java
index ca748713..1f8ce5e4 100644
--- a/src/nu/validator/htmlparser/impl/AttributeName.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/AttributeName.java
@@ -22,11 +22,6 @@
 
 package nu.validator.htmlparser.impl;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
 import nu.validator.htmlparser.annotation.Inline;
 import nu.validator.htmlparser.annotation.Local;
 import nu.validator.htmlparser.annotation.NoLength;
diff --git a/src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java
diff --git a/src/nu/validator/htmlparser/impl/ElementName.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/ElementName.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/ElementName.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/ElementName.java
diff --git a/src/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java
index 19fbe7a6..4c41e33a 100644
--- a/src/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/ErrorReportingTokenizer.java
@@ -128,7 +128,7 @@ public void setContentNonXmlCharPolicy(
     /**
      * Sets the errorProfile.
      *
-     * @param errorProfile
+     * @param errorProfileMap
      */
     public void setErrorProfile(HashMap<String, String> errorProfileMap) {
         this.errorProfileMap = errorProfileMap;
@@ -225,6 +225,7 @@ public boolean isNextCharOnNewLine() {
         cstart = 0x7fffffff;
     }
 
+    @SuppressWarnings("fallthrough")
     @Override protected char checkChar(@NoLength char[] buf, int pos)
             throws SAXException {
         linePrev = line;
@@ -564,6 +565,7 @@ private boolean isAstralPrivateUse(int c) {
         }
     }
 
+    @SuppressWarnings("fallthrough")
     @Override protected char errNcrNonCharacter(char ch) throws SAXException {
         switch (contentNonXmlCharPolicy) {
             case FATAL:
@@ -592,6 +594,7 @@ private boolean isAstralPrivateUse(int c) {
         err("Character reference expands to a surrogate.");
     }
 
+    @SuppressWarnings("fallthrough")
     @Override protected char errNcrControlChar(char ch) throws SAXException {
         switch (contentNonXmlCharPolicy) {
             case FATAL:
diff --git a/src/nu/validator/htmlparser/impl/HtmlAttributes.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/HtmlAttributes.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/HtmlAttributes.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/HtmlAttributes.java
index 7f747c3a..5401f233 100644
--- a/src/nu/validator/htmlparser/impl/HtmlAttributes.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/HtmlAttributes.java
@@ -31,7 +31,6 @@
 import nu.validator.htmlparser.annotation.NsUri;
 import nu.validator.htmlparser.annotation.Prefix;
 import nu.validator.htmlparser.annotation.QName;
-import nu.validator.htmlparser.common.Interner;
 import nu.validator.htmlparser.common.XmlViolationPolicy;
 
 /**
@@ -482,6 +481,7 @@ public boolean equalsAnother(HtmlAttributes other) {
         return true;
     }
 
+    @SuppressWarnings("fallthrough")
     void processNonNcNames(TreeBuilder<?> treeBuilder, XmlViolationPolicy namePolicy) throws SAXException {
         for (int i = 0; i < length; i++) {
             AttributeName attName = names[i];
diff --git a/src/nu/validator/htmlparser/impl/LocatorImpl.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/LocatorImpl.java
similarity index 97%
rename from src/nu/validator/htmlparser/impl/LocatorImpl.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/LocatorImpl.java
index b334aa6a..29bb8c72 100644
--- a/src/nu/validator/htmlparser/impl/LocatorImpl.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/LocatorImpl.java
@@ -26,7 +26,7 @@
 import org.xml.sax.Locator;
 import org.xml.sax.ext.Locator2;
 
-public class LocatorImpl implements Locator, Locator2 {
+public class LocatorImpl implements Locator2 {
 
     private final String systemId;
 
diff --git a/src/nu/validator/htmlparser/impl/MetaScanner.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/MetaScanner.java
old mode 100755
new mode 100644
similarity index 99%
rename from src/nu/validator/htmlparser/impl/MetaScanner.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/MetaScanner.java
index a1c8eb80..10c24e40
--- a/src/nu/validator/htmlparser/impl/MetaScanner.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/MetaScanner.java
@@ -208,6 +208,7 @@ protected int read() throws IOException {
     /**
      * The runs the meta scanning algorithm.
      */
+    @SuppressWarnings("fallthrough")
     protected final void stateLoop(int state)
             throws SAXException, IOException {
         int c = -1;
diff --git a/src/nu/validator/htmlparser/impl/NCName.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/NCName.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/NCName.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/NCName.java
diff --git a/src/nu/validator/htmlparser/impl/NamedCharacters.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/NamedCharacters.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/impl/NamedCharacters.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/NamedCharacters.java
diff --git a/src/nu/validator/htmlparser/impl/NamedCharactersAccel.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/NamedCharactersAccel.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/NamedCharactersAccel.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/NamedCharactersAccel.java
diff --git a/src/nu/validator/htmlparser/impl/Portability.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/Portability.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/Portability.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/Portability.java
diff --git a/src/nu/validator/htmlparser/impl/PushedLocation.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/PushedLocation.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/PushedLocation.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/PushedLocation.java
diff --git a/src/nu/validator/htmlparser/impl/StackNode.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/StackNode.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/StackNode.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/StackNode.java
diff --git a/src/nu/validator/htmlparser/impl/StateSnapshot.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/StateSnapshot.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/StateSnapshot.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/StateSnapshot.java
index cba711f7..f6c3359a 100644
--- a/src/nu/validator/htmlparser/impl/StateSnapshot.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/StateSnapshot.java
@@ -25,6 +25,7 @@
 import nu.validator.htmlparser.annotation.Auto;
 
 
+@SuppressWarnings("exports")
 public class StateSnapshot<T> implements TreeBuilderState<T> {
 
     private final @Auto StackNode<T>[] stack;
diff --git a/src/nu/validator/htmlparser/impl/TaintableLocatorImpl.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/TaintableLocatorImpl.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/TaintableLocatorImpl.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/TaintableLocatorImpl.java
diff --git a/src/nu/validator/htmlparser/impl/Tokenizer.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/Tokenizer.java
old mode 100755
new mode 100644
similarity index 99%
rename from src/nu/validator/htmlparser/impl/Tokenizer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/Tokenizer.java
index 13fd56b1..db6257e1
--- a/src/nu/validator/htmlparser/impl/Tokenizer.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/Tokenizer.java
@@ -36,7 +36,6 @@
 package nu.validator.htmlparser.impl;
 
 import org.xml.sax.ErrorHandler;
-import org.xml.sax.Locator;
 import org.xml.sax.ext.Locator2;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
@@ -67,7 +66,8 @@
  * @version $Id$
  * @author hsivonen
  */
-public class Tokenizer implements Locator, Locator2 {
+@SuppressWarnings("fallthrough")
+public class Tokenizer implements Locator2 {
 
     private static final int DATA_AND_RCDATA_MASK = ~1;
 
diff --git a/src/nu/validator/htmlparser/impl/TreeBuilder.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilder.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/TreeBuilder.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilder.java
index 7b78b1b7..784ab921 100644
--- a/src/nu/validator/htmlparser/impl/TreeBuilder.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilder.java
@@ -35,7 +35,6 @@
 
 package nu.validator.htmlparser.impl;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -54,10 +53,10 @@
 import nu.validator.htmlparser.annotation.NsUri;
 import nu.validator.htmlparser.common.DocumentMode;
 import nu.validator.htmlparser.common.DocumentModeHandler;
-import nu.validator.htmlparser.common.Interner;
 import nu.validator.htmlparser.common.TokenHandler;
 import nu.validator.htmlparser.common.XmlViolationPolicy;
 
+@SuppressWarnings("exports")
 public abstract class TreeBuilder<T> implements TokenHandler,
         TreeBuilderState<T> {
 
@@ -577,7 +576,7 @@ final void warn(String message, Locator locator) throws SAXException {
 
     // ]NOCPP]
 
-    @SuppressWarnings("unchecked") public final void startTokenization(Tokenizer self) throws SAXException {
+    @SuppressWarnings({"rawtypes", "unchecked"}) public final void startTokenization(Tokenizer self) throws SAXException {
         tokenizer = self;
         stackNodes = new StackNode[64];
         stack = new StackNode[64];
@@ -844,6 +843,7 @@ public final void comment(@NoLength char[] buf, int start, int length)
      * @see nu.validator.htmlparser.common.TokenHandler#characters(char[], int,
      *      int)
      */
+    @SuppressWarnings("fallthrough")
     public final void characters(@Const @NoLength char[] buf, int start, int length)
             throws SAXException {
         // Note: Can't attach error messages to EOF in C++ yet
@@ -1241,6 +1241,7 @@ public void zeroOriginatingReplacementCharacter() throws SAXException {
         }
     }
 
+    @SuppressWarnings("fallthrough")
     public final void eof() throws SAXException {
         flushCharacters();
         // Note: Can't attach error messages to EOF in C++ yet
@@ -1448,6 +1449,7 @@ public final void endTokenization() throws SAXException {
         end();
     }
 
+    @SuppressWarnings("fallthrough")
     public final void startTag(ElementName elementName,
             HtmlAttributes attributes, boolean selfClosing) throws SAXException {
         flushCharacters();
@@ -2898,8 +2900,6 @@ private boolean isSpecialParentInForeign(StackNode<T> stackNode) {
      * C++ memory note: The return value must be released.
      *
      * @return
-     * @throws SAXException
-     * @throws StopSniffingException
      */
     public static String extractCharsetFromContent(String attributeValue
         // CPPONLY: , TreeBuilder tb
@@ -3095,6 +3095,7 @@ private void checkMetaCharset(HtmlAttributes attributes)
         }
     }
 
+    @SuppressWarnings("fallthrough")
     public final void endTag(ElementName elementName) throws SAXException {
         flushCharacters();
         needToDropLF = false;
@@ -4292,7 +4293,7 @@ private void pushTemplateMode(int mode) {
         templateModeStack[templateModePtr] = mode;
     }
 
-    @SuppressWarnings("unchecked") private void push(StackNode<T> node) throws SAXException {
+    @SuppressWarnings({"rawtypes", "unchecked"}) private void push(StackNode<T> node) throws SAXException {
         currentPtr++;
         if (currentPtr == stack.length) {
             StackNode<T>[] newStack = new StackNode[stack.length + 64];
@@ -4303,7 +4304,7 @@ private void pushTemplateMode(int mode) {
         elementPushed(node.ns, node.popName, node.node);
     }
 
-    @SuppressWarnings("unchecked") private void silentPush(StackNode<T> node) throws SAXException {
+    @SuppressWarnings({"rawtypes", "unchecked"}) private void silentPush(StackNode<T> node) throws SAXException {
         currentPtr++;
         if (currentPtr == stack.length) {
             StackNode<T>[] newStack = new StackNode[stack.length + 64];
@@ -4313,7 +4314,7 @@ private void pushTemplateMode(int mode) {
         stack[currentPtr] = node;
     }
 
-    @SuppressWarnings("unchecked") private void append(StackNode<T> node) {
+    @SuppressWarnings({"rawtypes", "unchecked"}) private void append(StackNode<T> node) {
         listPtr++;
         if (listPtr == listOfActiveFormattingElements.length) {
             StackNode<T>[] newList = new StackNode[listOfActiveFormattingElements.length + 64];
@@ -4787,7 +4788,7 @@ void notifyUnusedStackNode(int idxInStackNodes) {
         }
     }
 
-    @SuppressWarnings("unchecked") private StackNode<T> getUnusedStackNode() {
+    @SuppressWarnings({"rawtypes", "unchecked"}) private StackNode<T> getUnusedStackNode() {
         // Search for an unused stack node.
         while (stackNodesIdx < numStackNodes) {
             if (stackNodes[stackNodesIdx].isUnused()) {
@@ -5871,7 +5872,7 @@ private boolean charBufferContainsNonWhitespace() {
      * @return a snapshot.
      * @throws SAXException
      */
-    @SuppressWarnings("unchecked") public TreeBuilderState<T> newSnapshot()
+    @SuppressWarnings({"rawtypes", "unchecked"}) public TreeBuilderState<T> newSnapshot()
             throws SAXException {
         StackNode<T>[] listCopy = new StackNode[listPtr + 1];
         for (int i = 0; i < listCopy.length; i++) {
@@ -5965,7 +5966,7 @@ public boolean snapshotMatches(TreeBuilderState<T> snapshot) {
         return true;
     }
 
-    @SuppressWarnings("unchecked") public void loadState(
+    @SuppressWarnings({"rawtypes", "unchecked"}) public void loadState(
             TreeBuilderState<T> snapshot)
             throws SAXException {
         // CPPONLY: mCurrentHtmlScriptIsAsyncOrDefer = false;
diff --git a/src/nu/validator/htmlparser/impl/TreeBuilderState.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilderState.java
similarity index 99%
rename from src/nu/validator/htmlparser/impl/TreeBuilderState.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilderState.java
index 5b7a9dcf..42c019fc 100644
--- a/src/nu/validator/htmlparser/impl/TreeBuilderState.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/TreeBuilderState.java
@@ -29,6 +29,7 @@
  * @version $Id$
  * @author hsivonen
  */
+@SuppressWarnings("exports")
 public interface TreeBuilderState<T> {
 
     /**
diff --git a/src/nu/validator/htmlparser/impl/UTF16Buffer.java b/htmlparser/src/main/java/nu/validator/htmlparser/impl/UTF16Buffer.java
similarity index 100%
rename from src/nu/validator/htmlparser/impl/UTF16Buffer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/UTF16Buffer.java
diff --git a/src/nu/validator/htmlparser/common/package.html b/htmlparser/src/main/java/nu/validator/htmlparser/impl/package-info.java
similarity index 83%
rename from src/nu/validator/htmlparser/common/package.html
rename to htmlparser/src/main/java/nu/validator/htmlparser/impl/package-info.java
index 43f141cd..dfa43eec 100644
--- a/src/nu/validator/htmlparser/common/package.html
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/impl/package-info.java
@@ -1,7 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
+/*
  Copyright (c) 2007 Henri Sivonen
 
  Permission is hereby granted, free of charge, to any person obtaining a 
@@ -21,9 +18,10 @@
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides common interfaces and enumerations.</p>
-</body>
-</html>
\ No newline at end of file
+ */
+
+/**
+ * This package contains the bulk of parser internals.
+ * Only implementors of additional tree builders or token handlers should look here.
+ */
+package nu.validator.htmlparser.impl;
diff --git a/src/nu/validator/htmlparser/io/BomSniffer.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/BomSniffer.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/io/BomSniffer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/BomSniffer.java
diff --git a/src/nu/validator/htmlparser/io/Confidence.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/Confidence.java
similarity index 100%
rename from src/nu/validator/htmlparser/io/Confidence.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/Confidence.java
diff --git a/src/nu/validator/htmlparser/io/Driver.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/Driver.java
similarity index 99%
rename from src/nu/validator/htmlparser/io/Driver.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/Driver.java
index aa2354c9..0c971eef 100644
--- a/src/nu/validator/htmlparser/io/Driver.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/io/Driver.java
@@ -497,6 +497,7 @@ protected Encoding whineAboutEncodingAndReturnActual(String encoding,
         }
     }
 
+    @SuppressWarnings("serial")
     private class ReparseException extends SAXException {
 
     }
diff --git a/src/nu/validator/htmlparser/io/Encoding.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/Encoding.java
similarity index 100%
rename from src/nu/validator/htmlparser/io/Encoding.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/Encoding.java
diff --git a/src/nu/validator/htmlparser/io/HtmlInputStreamReader.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/HtmlInputStreamReader.java
old mode 100755
new mode 100644
similarity index 96%
rename from src/nu/validator/htmlparser/io/HtmlInputStreamReader.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/HtmlInputStreamReader.java
index 3de1af2a..b7d7e14b
--- a/src/nu/validator/htmlparser/io/HtmlInputStreamReader.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/io/HtmlInputStreamReader.java
@@ -35,19 +35,15 @@
 
 import nu.validator.htmlparser.common.ByteReadable;
 import nu.validator.htmlparser.common.Heuristics;
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.extra.ChardetSniffer;
-import nu.validator.htmlparser.extra.IcuDetectorSniffer;
 import nu.validator.htmlparser.impl.Tokenizer;
 
 import org.xml.sax.ErrorHandler;
-import org.xml.sax.Locator;
 import org.xml.sax.ext.Locator2;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
 /**
- * Be very careful with this class. It is not a general-purpose subclass of of
+ * Be very careful with this class. It is not a general-purpose subclass of
  * <code>Reader</code>. Instead, it is the minimal implementation that does
  * what <code>Tokenizer</code> needs while being an instance of
  * <code>Reader</code>.
@@ -58,8 +54,7 @@
  * @version $Id$
  * @author hsivonen
  */
-public final class HtmlInputStreamReader extends Reader implements
-        ByteReadable, Locator, Locator2 {
+public final class HtmlInputStreamReader extends Reader implements ByteReadable, Locator2 {
 
     private static final int SNIFFING_LIMIT = 1024;
 
@@ -112,7 +107,9 @@ public final class HtmlInputStreamReader extends Reader implements
     /**
      * @param inputStream
      * @param errorHandler
-     * @param locator
+     * @param tokenizer
+     * @param driver
+     * @param heuristics
      * @throws IOException
      * @throws SAXException
      */
@@ -136,15 +133,6 @@ public HtmlInputStreamReader(InputStream inputStream,
                         + encoding.getCanonName()
                         + "\u201D used. Documents must use UTF-8.");
             }
-            if (encoding == null
-                    && (heuristics == Heuristics.CHARDET || heuristics == Heuristics.ALL)) {
-                encoding = (new ChardetSniffer(byteArray, limit)).sniff();
-            }
-            if (encoding == null
-                    && (heuristics == Heuristics.ICU || heuristics == Heuristics.ALL)) {
-                position = 0;
-                encoding = (new IcuDetectorSniffer(this)).sniff();
-            }
             sniffing = false;
             if (encoding == null) {
                 encoding = Encoding.WINDOWS1252;
diff --git a/src/nu/validator/htmlparser/io/MetaSniffer.java b/htmlparser/src/main/java/nu/validator/htmlparser/io/MetaSniffer.java
old mode 100755
new mode 100644
similarity index 98%
rename from src/nu/validator/htmlparser/io/MetaSniffer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/io/MetaSniffer.java
index 9deaef7a..dd4dee9f
--- a/src/nu/validator/htmlparser/io/MetaSniffer.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/io/MetaSniffer.java
@@ -34,7 +34,7 @@
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
-public class MetaSniffer extends MetaScanner implements Locator, Locator2 {
+public class MetaSniffer extends MetaScanner implements Locator2 {
     
     private Encoding characterEncoding = null;
 
@@ -91,7 +91,6 @@ protected int read() throws IOException {
      * 
      * @throws SAXException
      * @throws IOException
-     * @throws
      */
     public Encoding sniff(ByteReadable readable) throws SAXException, IOException {
         this.readable = readable;
diff --git a/src/nu/validator/htmlparser/rewindable/Rewindable.java b/htmlparser/src/main/java/nu/validator/htmlparser/rewindable/Rewindable.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/rewindable/Rewindable.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/rewindable/Rewindable.java
diff --git a/src/nu/validator/htmlparser/rewindable/RewindableInputStream.java b/htmlparser/src/main/java/nu/validator/htmlparser/rewindable/RewindableInputStream.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/nu/validator/htmlparser/rewindable/RewindableInputStream.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/rewindable/RewindableInputStream.java
diff --git a/src/nu/validator/htmlparser/sax/HtmlParser.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/HtmlParser.java
similarity index 98%
rename from src/nu/validator/htmlparser/sax/HtmlParser.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/HtmlParser.java
index ad17e892..c7751761 100644
--- a/src/nu/validator/htmlparser/sax/HtmlParser.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/sax/HtmlParser.java
@@ -552,6 +552,7 @@ public void setTransitionHandler(TransitionHandler handler) {
      * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
      * @deprecated For Validator.nu internal use
      */
+    @Deprecated
     public void setTreeBuilderErrorHandlerOverride(ErrorHandler handler) {
         treeBuilderErrorHandler = handler;
         if (driver != null) {
@@ -714,7 +715,7 @@ public void setProperty(String name, Object value)
     /**
      * Indicates whether NFC normalization of source is being checked.
      * @return <code>true</code> if NFC normalization of source is being checked.
-     * @see nu.validator.htmlparser.impl.Tokenizer#isCheckingNormalization()
+     * @see nu.validator.htmlparser.io.Driver#isCheckingNormalization()
      */
     public boolean isCheckingNormalization() {
         return checkingNormalization;
@@ -723,7 +724,7 @@ public boolean isCheckingNormalization() {
     /**
      * Toggles the checking of the NFC normalization of source.
      * @param enable <code>true</code> to check normalization
-     * @see nu.validator.htmlparser.impl.Tokenizer#setCheckingNormalization(boolean)
+     * @see nu.validator.htmlparser.io.Driver#setCheckingNormalization(boolean)
      */
     public void setCheckingNormalization(boolean enable) {
         this.checkingNormalization = enable;
@@ -941,8 +942,8 @@ public boolean isReportingDoctype() {
     }
 
     /**
-     * @param errorProfile
-     * @see nu.validator.htmlparser.impl.errorReportingTokenizer#setErrorProfile(set)
+     * @param errorProfileMap
+     * @see nu.validator.htmlparser.impl.ErrorReportingTokenizer#setErrorProfile(HashMap)
      */
     public void setErrorProfile(HashMap<String, String> errorProfileMap) {
         this.errorProfileMap = errorProfileMap;
@@ -965,7 +966,7 @@ public void setNamePolicy(XmlViolationPolicy namePolicy) {
      * Sets the encoding sniffing heuristics.
      * 
      * @param heuristics the heuristics to set
-     * @see nu.validator.htmlparser.impl.Tokenizer#setHeuristics(nu.validator.htmlparser.common.Heuristics)
+     * @see nu.validator.htmlparser.io.Driver#setHeuristics(nu.validator.htmlparser.common.Heuristics)
      */
     public void setHeuristics(Heuristics heuristics) {
         this.heuristics = heuristics;
@@ -1006,6 +1007,7 @@ public XmlViolationPolicy getNamePolicy() {
      * Does nothing.
      * @deprecated
      */
+    @Deprecated
     public void setBogusXmlnsPolicy(
             XmlViolationPolicy bogusXmlnsPolicy) {
     }
@@ -1015,6 +1017,7 @@ public void setBogusXmlnsPolicy(
      * @deprecated
      * @return <code>XmlViolationPolicy.ALTER_INFOSET</code>
      */
+    @Deprecated
     public XmlViolationPolicy getBogusXmlnsPolicy() {
         return XmlViolationPolicy.ALTER_INFOSET;
     }
diff --git a/src/nu/validator/htmlparser/sax/HtmlSerializer.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/HtmlSerializer.java
similarity index 100%
rename from src/nu/validator/htmlparser/sax/HtmlSerializer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/HtmlSerializer.java
diff --git a/src/nu/validator/htmlparser/sax/InfosetCoercingHtmlParser.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/InfosetCoercingHtmlParser.java
similarity index 100%
rename from src/nu/validator/htmlparser/sax/InfosetCoercingHtmlParser.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/InfosetCoercingHtmlParser.java
diff --git a/src/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java
similarity index 99%
rename from src/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java
index b6cb2f87..bacbbfce 100644
--- a/src/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/sax/NameCheckingXmlSerializer.java
@@ -40,7 +40,7 @@ public NameCheckingXmlSerializer(Writer out) {
     }
 
     /**
-     * @see nu.validator.htmlparser.sax.XmlSerializer#checkNCName()
+     * @see nu.validator.htmlparser.sax.XmlSerializer#checkNCName(String)
      */
     @Override protected void checkNCName(String name) throws SAXException {
         if (!NCName.isNCName(name)) {
diff --git a/src/nu/validator/htmlparser/sax/SAXStreamer.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/SAXStreamer.java
similarity index 100%
rename from src/nu/validator/htmlparser/sax/SAXStreamer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/SAXStreamer.java
diff --git a/src/nu/validator/htmlparser/sax/SAXTreeBuilder.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/SAXTreeBuilder.java
similarity index 100%
rename from src/nu/validator/htmlparser/sax/SAXTreeBuilder.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/SAXTreeBuilder.java
diff --git a/src/nu/validator/htmlparser/sax/XmlSerializer.java b/htmlparser/src/main/java/nu/validator/htmlparser/sax/XmlSerializer.java
similarity index 100%
rename from src/nu/validator/htmlparser/sax/XmlSerializer.java
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/XmlSerializer.java
diff --git a/test-src/nu/validator/saxtree/test/package.html b/htmlparser/src/main/java/nu/validator/htmlparser/sax/package-info.java
similarity index 85%
rename from test-src/nu/validator/saxtree/test/package.html
rename to htmlparser/src/main/java/nu/validator/htmlparser/sax/package-info.java
index 57809b84..7ade27d9 100644
--- a/test-src/nu/validator/saxtree/test/package.html
+++ b/htmlparser/src/main/java/nu/validator/htmlparser/sax/package-info.java
@@ -1,7 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
+/*
  Copyright (c) 2007 Henri Sivonen
 
  Permission is hereby granted, free of charge, to any person obtaining a 
@@ -21,9 +18,9 @@
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>Test drivers.</p>
-</body>
-</html>
\ No newline at end of file
+ */
+
+/**
+ * This package provides an HTML5 parser that exposes the document through the SAX API.
+ */
+package nu.validator.htmlparser.sax;
diff --git a/test-src/nu/validator/htmlparser/test/DecoderLoopTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/DecoderLoopTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/DecoderLoopTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/DecoderLoopTester.java
diff --git a/test-src/nu/validator/htmlparser/test/DomIdTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/DomIdTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/DomIdTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/DomIdTester.java
diff --git a/test-src/nu/validator/htmlparser/test/DomTest.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/DomTest.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/DomTest.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/DomTest.java
diff --git a/test-src/nu/validator/htmlparser/test/EncodingTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/EncodingTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/EncodingTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/EncodingTester.java
diff --git a/test-src/nu/validator/htmlparser/test/JSONArrayTokenHandler.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/JSONArrayTokenHandler.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/JSONArrayTokenHandler.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/JSONArrayTokenHandler.java
diff --git a/test-src/nu/validator/htmlparser/test/ListErrorHandler.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/ListErrorHandler.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/ListErrorHandler.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/ListErrorHandler.java
diff --git a/test-src/nu/validator/htmlparser/test/SystemErrErrorHandler.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/SystemErrErrorHandler.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/SystemErrErrorHandler.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/SystemErrErrorHandler.java
diff --git a/test-src/nu/validator/htmlparser/test/TokenPrinter.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/TokenPrinter.java
old mode 100755
new mode 100644
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/TokenPrinter.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/TokenPrinter.java
diff --git a/test-src/nu/validator/htmlparser/test/TokenizerTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/TokenizerTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/TokenizerTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/TokenizerTester.java
diff --git a/test-src/nu/validator/htmlparser/test/TreeDumpContentHandler.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/TreeDumpContentHandler.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/TreeDumpContentHandler.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/TreeDumpContentHandler.java
diff --git a/test-src/nu/validator/htmlparser/test/TreePrinter.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/TreePrinter.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/TreePrinter.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/TreePrinter.java
diff --git a/test-src/nu/validator/htmlparser/test/TreeTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/TreeTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/TreeTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/TreeTester.java
diff --git a/test-src/nu/validator/htmlparser/test/UntilHashInputStream.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/UntilHashInputStream.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/UntilHashInputStream.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/UntilHashInputStream.java
diff --git a/test-src/nu/validator/htmlparser/test/XmlSerializerTester.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/XmlSerializerTester.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/XmlSerializerTester.java
rename to htmlparser/src/test/java/nu/validator/htmlparser/test/XmlSerializerTester.java
diff --git a/htmlparser/src/test/java/nu/validator/htmlparser/test/package-info.java b/htmlparser/src/test/java/nu/validator/htmlparser/test/package-info.java
new file mode 100644
index 00000000..82d43a7d
--- /dev/null
+++ b/htmlparser/src/test/java/nu/validator/htmlparser/test/package-info.java
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2007 Henri Sivonen
+
+ Permission is hereby granted, free of charge, to any person obtaining a 
+ copy of this software and associated documentation files (the "Software"), 
+ to deal in the Software without restriction, including without limitation 
+ the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ and/or sell copies of the Software, and to permit persons to whom the 
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in 
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Test drivers.
+ */
+package nu.validator.htmlparser.test;
diff --git a/test-src/nu/validator/saxtree/test/PassThruPrinter.java b/htmlparser/src/test/java/nu/validator/saxtree/test/PassThruPrinter.java
similarity index 100%
rename from test-src/nu/validator/saxtree/test/PassThruPrinter.java
rename to htmlparser/src/test/java/nu/validator/saxtree/test/PassThruPrinter.java
diff --git a/htmlparser/src/test/java/nu/validator/saxtree/test/package-info.java b/htmlparser/src/test/java/nu/validator/saxtree/test/package-info.java
new file mode 100644
index 00000000..ad8ce418
--- /dev/null
+++ b/htmlparser/src/test/java/nu/validator/saxtree/test/package-info.java
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2007 Henri Sivonen
+
+ Permission is hereby granted, free of charge, to any person obtaining a 
+ copy of this software and associated documentation files (the "Software"), 
+ to deal in the Software without restriction, including without limitation 
+ the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ and/or sell copies of the Software, and to permit persons to whom the 
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in 
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Test drivers.
+ */
+package nu.validator.saxtree.test;
diff --git a/mozilla-export-scripts/README.txt b/mozilla-export-scripts/README.txt
deleted file mode 100644
index 3567b846..00000000
--- a/mozilla-export-scripts/README.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-These scripts export the Java-to-C++ translator and the java source files that
-implement the HTML5 parser.  The exported translator may be used (with no
-external dependencies) to translate the exported java source files into Gecko-
-compatible C++.
-
-Hacking the translator itself still requires a working copy of the Java HTML5
-parser repository, but hacking the parser (modifying the Java source files and
-performing the translation) should now be possible using only files committed
-to the mozilla source tree.
-
-Run any of these scripts without arguments to receive usage instructions.
-
-  make-translator-jar.sh: compiles the Java-to-C++ translator into a .jar file
-  export-java-srcs.sh:    exports minimal java source files implementing the
-                          HTML5 parser
-  export-translator.sh:   exports the compiled translator and javaparser.jar
-  export-all.sh:          runs the previous two scripts
-  util.sh:                provides various shell utility functions to the
-                          scripts listed above (does nothing if run directly)
-
-All path arguments may be either absolute or relative.  This includes the path
-to the script itself ($0), so the directory from which you run these scripts
-doesn't matter.
-
-Ben Newman (7 July 2009)
diff --git a/mozilla-export-scripts/export-all.sh b/mozilla-export-scripts/export-all.sh
deleted file mode 100644
index 9ae07d33..00000000
--- a/mozilla-export-scripts/export-all.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env sh
-
-SCRIPT_DIR=`dirname $0`
-source $SCRIPT_DIR/util.sh
-SCRIPT_DIR=`abs $SCRIPT_DIR`
-
-if [ $# -eq 1 ]
-then
-    MOZ_PARSER_PATH=`abs $1`
-else
-    echo
-    echo "Usage: sh `basename $0` /path/to/mozilla-central/parser/html"
-    echo "Note that relative paths will work just fine."
-    echo
-    exit 1
-fi
-
-$SCRIPT_DIR/export-translator.sh $MOZ_PARSER_PATH
-$SCRIPT_DIR/export-java-srcs.sh  $MOZ_PARSER_PATH
-
-echo
-echo "Now go to $MOZ_PARSER_PATH and run"
-echo "  java -jar javalib/translator.jar javasrc . nsHtml5AtomList.h"
-echo
diff --git a/mozilla-export-scripts/export-java-srcs.sh b/mozilla-export-scripts/export-java-srcs.sh
deleted file mode 100644
index 6d32b07d..00000000
--- a/mozilla-export-scripts/export-java-srcs.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env sh
-
-SCRIPT_DIR=`dirname $0`
-source $SCRIPT_DIR/util.sh
-SCRIPT_DIR=`abs $SCRIPT_DIR`
-
-SRCDIR=`abs $SCRIPT_DIR/../src/nu/validator/htmlparser/impl`
-
-if [ $# -eq 1 ]
-then
-    MOZ_PARSER_PATH=`abs $1`
-else
-    echo
-    echo "Usage: sh `basename $0` /path/to/mozilla-central/parser/html"
-    echo "Note that relative paths will work just fine."
-    echo
-    exit 1
-fi
-
-SRCTARGET=$MOZ_PARSER_PATH/javasrc
-
-rm -rf $SRCTARGET
-mkdir $SRCTARGET
-# Avoid copying the .svn directory:
-cp -rv $SRCDIR/*.java $SRCTARGET
diff --git a/mozilla-export-scripts/export-translator.sh b/mozilla-export-scripts/export-translator.sh
deleted file mode 100644
index d1f4f1c3..00000000
--- a/mozilla-export-scripts/export-translator.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env sh
-
-SCRIPT_DIR=`dirname $0`
-source $SCRIPT_DIR/util.sh
-SCRIPT_DIR=`abs $SCRIPT_DIR`
-
-LIBDIR=`abs $SCRIPT_DIR/../translator-lib`
-
-if [ $# -eq 1 ]
-then
-    MOZ_PARSER_PATH=`abs $1`
-else
-    echo
-    echo "Usage: sh `basename $0` /path/to/mozilla-central/parser/html"
-    echo "Note that relative paths will work just fine."
-    echo "Be sure that you have run `dirname $0`/make-translator-jar.sh before running this script."
-    echo
-    exit 1
-fi
-
-LIBTARGET=$MOZ_PARSER_PATH/javalib
-
-rm -rf $LIBTARGET
-cp -rv $LIBDIR $LIBTARGET
diff --git a/mozilla-export-scripts/make-translator-jar.sh b/mozilla-export-scripts/make-translator-jar.sh
deleted file mode 100644
index 4f21ae66..00000000
--- a/mozilla-export-scripts/make-translator-jar.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env sh
-
-SCRIPT_DIR=`dirname $0`
-source $SCRIPT_DIR/util.sh
-SCRIPT_DIR=`abs $SCRIPT_DIR`
-
-SRCDIR=`abs $SCRIPT_DIR/../translator-src`
-BINDIR=`abs $SCRIPT_DIR/../translator-bin`
-LIBDIR=`abs $SCRIPT_DIR/../translator-lib`
-
-if [ $# -eq 1 ]
-then
-    JAVAPARSER_JAR_PATH=`abs $1`
-else
-    echo
-    echo "Usage: sh `basename $0` /path/to/javaparser-1.0.7.jar"
-    echo "Note that relative paths will work just fine."
-    echo "Obtain javaparser-1.0.7.jar from http://code.google.com/p/javaparser"
-    echo
-    exit 1
-fi
-
-set_up() {
-    rm -rf $BINDIR; mkdir $BINDIR
-    rm -rf $LIBDIR; mkdir $LIBDIR
-    cp $JAVAPARSER_JAR_PATH $LIBDIR/javaparser.jar
-}
-
-write_manifest() {
-    rm -f $LIBDIR/manifest
-    echo "Main-Class: nu.validator.htmlparser.cpptranslate.Main" > $LIBDIR/manifest
-    echo "Class-Path: javaparser.jar" >> $LIBDIR/manifest
-}
-
-compile_translator() {
-    find $SRCDIR -name "*.java" | \
-        xargs javac -cp $LIBDIR/javaparser.jar -g -d $BINDIR
-}
-
-generate_jar() {
-    jar cvfm $LIBDIR/translator.jar $LIBDIR/manifest -C $BINDIR .
-}
-
-clean_up() {
-    rm -f $LIBDIR/manifest
-}
-
-success_message() {
-    echo
-    echo "Successfully generated directory \"$LIBDIR\" with contents:"
-    echo
-    ls -al $LIBDIR
-    echo
-    echo "Now run `dirname $0`/export-all.sh with no arguments and follow the usage instructions."
-    echo
-}
-
-set_up && \
-    compile_translator && \
-    write_manifest && \
-    generate_jar && \
-    clean_up && \
-    success_message
diff --git a/mozilla-export-scripts/util.sh b/mozilla-export-scripts/util.sh
deleted file mode 100644
index 348ca14f..00000000
--- a/mozilla-export-scripts/util.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env sh
-
-abs() {
-    local rel
-    local p
-    if [ $# -ne 1 ]
-    then
-        rel=.
-    else
-        rel=$1
-    fi
-    if [ -d $rel ]
-    then
-        pushd $rel > /dev/null
-        p=`pwd`
-        popd > /dev/null
-    else
-        pushd `dirname $rel` > /dev/null
-        p=`pwd`/`basename $rel`
-        popd > /dev/null
-    fi
-    echo $p
-}
diff --git a/pom.xml b/pom.xml
index 41f46725..8720018f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,221 +20,140 @@
  * DEALINGS IN THE SOFTWARE.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>nu.validator.htmlparser</groupId>
-  <artifactId>htmlparser</artifactId>
-  <packaging>bundle</packaging>
-  <version>1.4</version>
-  <name>htmlparser</name>
-  <url>http://about.validator.nu/htmlparser/</url>
-  <description>The Validator.nu HTML Parser is an implementation of the HTML5 parsing algorithm in Java for applications. The parser is designed to work as a drop-in replacement for the XML parser in applications that already support XHTML 1.x content with an XML parser and use SAX, DOM or XOM to interface with the parser.</description>
   <!--
     Usage notes for this POM:
 
     To build without signing, run:
-    mvn clean source:jar javadoc:jar repository:bundle-create
-    (enter 0 <return> when prompted)
+    mvn clean source:jar javadoc:jar
 
     To build and sign, run:
-    mvn clean source:jar javadoc:jar package gpg:sign repository:bundle-create
-    (enter 0 <return> when prompted)
+    mvn clean source:jar javadoc:jar package gpg:sign
 
-    This POM file is used for creating the bundle for distribution via the
+    This POM file is used for creating the JARs for distribution via the
     Maven Central Repository. It is not used as part of the normal development
     process of the parser and the maintainer of the parser (Henri Sivonen) 
     isn't experienced in POM tweaking. If you need this POM to do something
     that it currently does not do or do something better, you need to write
     the changes you need yourself and contribute a patch via
-    http://bugzilla.validator.nu/
+    https://github.com/validator/htmlparser/issues
   -->
-  <developers>
-    <developer>
-      <id>hsivonen</id>
-      <name>Henri Sivonen</name>
-      <email>hsivonen@iki.fi</email>
-      <url>http://hsivonen.iki.fi/</url>
-    </developer>
-  </developers>
+
+  <groupId>nu.validator.htmlparser</groupId>
+  <artifactId>parent</artifactId>
+  <version>2.0</version>
+  <packaging>pom</packaging>
+
+  <name>parent</name>
+  <description>The Validator.nu HTML Parser is an implementation of the HTML5 parsing algorithm in Java for applications. The parser is designed to work as a drop-in replacement for the XML parser in applications that already support XHTML 1.x content with an XML parser and use SAX, DOM or XOM to interface with the parser.</description>
+  <url>https://about.validator.nu/htmlparser/</url>
   <licenses>
     <license>
       <name>The MIT License</name>
-      <url>http://www.opensource.org/licenses/mit-license.php</url>
+      <url>https://opensource.org/licenses/mit-license.php</url>
       <distribution>repo</distribution>
     </license>
     <license>
       <name>The (New) BSD License</name>
-      <url>http://www.opensource.org/licenses/bsd-license.php</url>
+      <url>https://opensource.org/licenses/bsd-license.php</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
+
+  <developers>
+    <developer>
+      <id>hsivonen</id>
+      <name>Henri Sivonen</name>
+      <email>hsivonen@iki.fi</email>
+      <url>https://hsivonen.fi/</url>
+    </developer>
+  </developers>
+
+  <modules>
+    <module>htmlparser</module>
+    <module>saxtree</module>
+    <module>xom</module>
+  </modules>
+
   <scm>
-    <connection>scm:hg:http://hg.mozilla.org/projects/htmlparser/</connection>
-    <url>http://hg.mozilla.org/projects/htmlparser/</url>
+    <connection>scm:git:https://github.com/validator/htmlparser.git</connection>
+    <url>https://github.com/validator/htmlparser</url>
   </scm>
-  <build>
-    <sourceDirectory>${project.build.directory}/src</sourceDirectory>
-    <testSourceDirectory>${basedir}/test-src</testSourceDirectory>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <version>1.7</version>
-        <dependencies>
-          <dependency>
-            <groupId>com.sun</groupId>
-            <artifactId>tools</artifactId>
-            <version>1.5.0</version>
-            <scope>system</scope>
-            <systemPath>${java.home}/../lib/tools.jar</systemPath>
-          </dependency>
-        </dependencies>
-        <executions>
-          <execution>
-            <id>intitialize-sources</id>
-            <phase>initialize</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <target>
-                <delete dir="${project.build.sourceDirectory}"/>
-                <mkdir dir="${project.build.sourceDirectory}"/>
-                <copy todir="${project.build.sourceDirectory}">
-                  <fileset dir="${basedir}/src"/>
-                </copy>
-              </target>
-            </configuration>
-          </execution>
-          <execution>
-            <id>tokenizer-hotspot-workaround</id>
-            <phase>process-sources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <target>
-                <property name="translator.sources" value="${basedir}/translator-src"/>
-                <property name="translator.classes" value="${project.build.directory}/translator-classes"/>
-                <mkdir dir="${translator.classes}"/>
-                <javac srcdir="${translator.sources}" includes="nu/validator/htmlparser/generator/ApplyHotSpotWorkaround.java" destdir="${translator.classes}" includeantruntime="false"/>
-                <java classname="nu.validator.htmlparser.generator.ApplyHotSpotWorkaround">
-                  <classpath>
-                    <pathelement location="${translator.classes}"/>
-                  </classpath>
-                  <arg value="${project.build.sourceDirectory}/nu/validator/htmlparser/impl/Tokenizer.java"/>
-                  <arg value="${project.build.sourceDirectory}/nu/validator/htmlparser/impl/HotSpotWorkaround.txt"/>
-                </java>
-              </target>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>2.3.7</version>
-        <extensions>true</extensions>
-        <configuration>
-          <archive>
-            <addMavenDescriptor>false</addMavenDescriptor>
-          </archive>
-          <instructions>
-            <Bundle-Name>${project.name}</Bundle-Name>
-            <Bundle-SymbolicName>nu.validator.htmlparser</Bundle-SymbolicName>
-            <Bundle-Version>${project.version}</Bundle-Version>
-            <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment>
-            <_removeheaders>Built-By,Bnd-LastModified</_removeheaders>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>rpm-maven-plugin</artifactId>
-        <configuration>
-          <release>1</release>
-          <copyright>The MIT License</copyright>
-          <group>Development/Java</group>
-          <workarea>/var/tmp/${project.build.finalName}</workarea>
-          <defineStatements>
-            <defineStatement>_javadir ${rpm.java.dir}</defineStatement>
-            <defineStatement>_javadocdir ${rpm.javadoc.dir}</defineStatement>
-          </defineStatements>
-          <mappings>
-            <mapping>
-              <directory>${rpm.java.dir}</directory>
-              <filemode>644</filemode>
-              <username>root</username>
-              <groupname>root</groupname>
-              <sources>
-                <source>
-                  <location>${project.build.directory}/${project.build.finalName}.jar</location>
-                </source>
-              </sources>
-            </mapping>
-            <mapping>
-              <directory>${rpm.javadoc.dir}/${project.build.finalName}</directory>
-              <filemode>644</filemode>
-              <username>root</username>
-              <groupname>root</groupname>
-              <sources>
-                <source>
-                  <location>${project.build.directory}/apidocs</location>
-                </source>
-              </sources>
-            </mapping>
-          </mappings>
-          <install>%__ln_s ${project.build.finalName}.jar %{buildroot}%{_javadir}/${project.name}.jar</install>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>com.ibm.icu</groupId>
-      <artifactId>icu4j</artifactId>
-      <version>4.0.1</version>
-      <scope>compile</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>xom</groupId>
-      <artifactId>xom</artifactId>
-      <version>1.1</version>
-      <scope>compile</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>net.sourceforge.jchardet</groupId>
-      <artifactId>jchardet</artifactId>
-      <version>1.0</version>
-      <scope>compile</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>com.sdicons.jsontools</groupId>
-      <artifactId>jsontools-core</artifactId>
-      <version>1.4</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
+
   <properties>
-    <rpm.java.dir>/usr/share/java</rpm.java.dir>
-    <rpm.javadoc.dir>/usr/share/javadoc</rpm.javadoc.dir>
+    <maven.compiler.release>11</maven.compiler.release>
+    <skipTests>true</skipTests>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>nu.validator.htmlparser</groupId>
+        <artifactId>htmlparser</artifactId>
+        <version>2.0</version>
+      </dependency>
+      <dependency>
+        <groupId>nu.validator.htmlparser</groupId>
+        <artifactId>saxtree</artifactId>
+        <version>2.0</version>
+      </dependency>
+      <dependency>
+        <groupId>nu.validator.htmlparser</groupId>
+        <artifactId>xom</artifactId>
+        <version>2.0</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>3.1.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.8.1</version>
+          <executions>
+            <execution>
+              <id>base-compile</id>
+              <goals>
+                <goal>compile</goal>
+              </goals>
+              <configuration>
+                <release>8</release>
+                <excludes>
+                  <exclude>module-info.java</exclude>
+                </excludes>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
+          <artifactId>maven-javadoc-plugin</artifactId>
+          <version>3.2.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>3.2.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-source-plugin</artifactId>
+          <version>3.2.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.22.2</version>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>exec-maven-plugin</artifactId>
+          <version>3.0.0</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
 </project>
diff --git a/ruby-gcj/DomUtils.java b/ruby-gcj/DomUtils.java
deleted file mode 100644
index dc43da83..00000000
--- a/ruby-gcj/DomUtils.java
+++ /dev/null
@@ -1,36 +0,0 @@
-import java.util.HashSet;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.Element;
-
-public class DomUtils {
-
-  private static HashSet<Document> pinned_list = new HashSet<Document>();
-
-  public static synchronized void pin(Document d) {
-    pinned_list.add(d);
-  }
-
-  public static synchronized void unpin(Document d) {
-    pinned_list.remove(d);
-  }
-
-  // return all the text content contained by a single element 
-  public static void getElementContent(Element e, StringBuffer b) {
-    for (Node n = e.getFirstChild(); n!=null; n=n.getNextSibling()) {
-      if (n.getNodeType() == n.TEXT_NODE) {
-        b.append(n.getNodeValue());
-      } else if (n.getNodeType() == n.ELEMENT_NODE) {
-        getElementContent((Element) e, b);
-      }
-    }
-  }
-
-  // replace all child nodes of a given element with a single text element
-  public static void setElementContent(Element e, String s) {
-    while (e.hasChildNodes()) {
-      e.removeChild(e.getFirstChild());
-    }
-    e.appendChild(e.getOwnerDocument().createTextNode(s));
-  }
-}
diff --git a/ruby-gcj/README b/ruby-gcj/README
deleted file mode 100644
index b368437f..00000000
--- a/ruby-gcj/README
+++ /dev/null
@@ -1,65 +0,0 @@
-Disclaimer:
-
-  This code is experimental.
-
-  When some people say experimental, they mean "it may not do what it is
-  intended to do; in fact, it might even wipe out your hard drive".  I mean
-  that too.  But I mean something more than that.
-
-  In this case, experimental means that I don't even know what it is intended
-  to do.  I just have a vague vision, and I am trying out various things in
-  the hopes that one of them will work out.
-
-Vision:
-
-  My vague vision is that I would like to see HTML 5 be a success.  For me to
-  consider it to be a success, it needs to be a standard, be interoperable,
-  and be ubiquitous.
-
-  I believe that the Validator.nu parser can be used to bootstrap that
-  process.  It is written in Java.  Has been compiled into JavaScript.  Has
-  been translated into C++ based on the Mozilla libraries with the intent of
-  being included in Firefox.  It very closely tracks to the standard.
-
-  For the moment, the effort is on extending that to another language (Ruby)
-  on a single environment (i.e., Linux).  Once that is complete, intent is to
-  evaluate the results, decide what needs to be changed, and what needs to be
-  done to support other languages and environments.
-
-  The bar I'm setting for myself isn't just another SWIG generated low level
-  interface to a DOM, but rather a best of breed interface; which for Ruby
-  seems to be the one pioneered by Hpricot and adopted by Nokogiri.  Success
-  will mean passing all of the tests from one of those two parsers as well as
-  all of the HTML5 tests.
-
-Build instructions:
-
-  You'll need icu4j and chardet jars.  If you checked out and ran dldeps you
-  are already all set:
-
-    svn co http://svn.versiondude.net/whattf/build/trunk/ build
-    python build/build.py checkout dldeps
-
-  Fedora 11:
-
-    yum install ruby-devel rubygem-rake java-1.5.0-gcj-devel gcc-c++ 
-
-  Ubuntu 9.04:
-
-    apt-get install ruby ruby1.8-dev rake gcj g++
-
-    Also at this time, you need to install a jdk (e.g. sun-java6-jdk), simply
-    because the javac that comes with gcj doesn't support -sourcepath, and
-    I haven't spent the time to find a replacement.
-
-    Finally, make sure that libjaxp1.3-java is *not* installed.
-
-      http://gcc.gnu.org/ml/java/2009-06/msg00055.html
-
-  If this is done, you should be all set.
- 
-    cd htmlparser/ruby-gcj
-    rake test
-
-  If things are successful, the last lines of the output will list the
-  font attributes and values found in the test/google.html file.
diff --git a/ruby-gcj/Rakefile b/ruby-gcj/Rakefile
deleted file mode 100644
index 7b518025..00000000
--- a/ruby-gcj/Rakefile
+++ /dev/null
@@ -1,77 +0,0 @@
-deps    = ENV['deps'] || '../../dependencies'
-icu4j   = "#{deps}/icu4j-4_0.jar"
-chardet = "#{deps}/mozilla/intl/chardet/java/dist/lib/chardet.jar"
-libgcj  = Dir['/usr/share/java/libgcj*.jar'].grep(/gcj[-\d.]*jar$/).sort.last
-
-task :default => %w(headers libs Makefile validator.so)
-
-# headers
-
-hdb = 'nu/validator/htmlparser/dom/HtmlDocumentBuilder'
-task :headers => %W(headers/DomUtils.h headers/#{hdb}.h)
-
-file 'headers/DomUtils.h' => 'DomUtils.java' do |t|
-  mkdir_p %w(classes headers), :verbose => false
-  sh "javac -d classes #{t.prerequisites.first}"
-  sh "gcjh -force -o #{t.name} -cp #{libgcj}:classes DomUtils"
-end
-
-file "headers/#{hdb}.h" => "../src/#{hdb}.java" do |t|
-  mkdir_p %w(classes headers), :verbose => false
-  sh "javac -cp #{icu4j}:#{chardet} -d classes -sourcepath ../src " +
-    t.prerequisites.first
-  sh "gcjh -force -cp classes -o #{t.name} -cp #{libgcj}:classes " + 
-    hdb.gsub('/','.')
-end
-
-# libs
-
-task :libs => %w(htmlparser chardet icu).map {|name| "lib/libnu-#{name}.so"}
-
-htmlparser = Dir['../src/**/*.java'].reject {|name| name.include? '/xom/'}
-file 'lib/libnu-htmlparser.so' => htmlparser + ['DomUtils.java'] do |t|
-  mkdir_p 'lib', :verbose => false
-  sh "gcj -shared --classpath=#{icu4j}:#{chardet} -fPIC " +
-    "-o #{t.name} #{t.prerequisites.join(' ')}"
-end
-
-file 'lib/libnu-chardet.so' => chardet do |t|
-  mkdir_p 'lib', :verbose => false
-  sh "gcj -shared -fPIC -o #{t.name} #{t.prerequisites.join(' ')}"
-end
-
-file 'lib/libnu-icu.so' => icu4j do |t|
-  mkdir_p 'lib', :verbose => false
-  sh "gcj -shared -fPIC -o #{t.name} #{t.prerequisites.join(' ')}"
-end
-
-# module
-
-file 'Makefile' do
-  sh "ruby extconf.rb --with-gcj=#{libgcj}"
-end
-
-file 'validator.so' => %w(Makefile validator.cpp headers/DomUtils.h) do
-  system 'make'
-end
-
-file 'nu/validator.so' do
-  mkdir_p 'nu', :verbose => false
-  system 'ln -s -t nu ../validator.so'
-end
-
-# tasks
-
-task :test => [:default, 'nu/validator.so'] do
-  ENV['LD_LIBRARY_PATH']='lib'
-  sh 'ruby test/fonts.rb test/google.html'
-end
-
-task :clean do
-  rm_rf %W(classes lib nu mkmf.log headers/DomUtils.h headers/#{hdb}.h) + 
-    Dir['*.o'] + Dir['*.so']
-end
-
-task :clobber => :clean do
-  rm_rf %w(headers Makefile)
-end
diff --git a/ruby-gcj/extconf.rb b/ruby-gcj/extconf.rb
deleted file mode 100644
index 415cf430..00000000
--- a/ruby-gcj/extconf.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'mkmf'
-
-# system dependencies
-gcj  = with_config('gcj', '/usr/share/java/libgcj.jar')
-
-# headers for JAXP
-CONFIG['CC'] = 'g++'
-with_cppflags('-xc++') do
-
-  unless find_header('org/w3c/dom/Document.h', 'headers')
-  
-    `jar tf #{gcj}`.split.each do |file|
-      next unless file =~ /\.class$/
-      next unless file =~ /^(javax|org)\/(w3c|xml)/
-      next if file.include? '$'
-    
-      dest = 'headers/' + file.sub(/\.class$/,'.h')
-      name = file.sub(/\.class$/,'').gsub('/','.')
-    
-      next if File.exist? dest
-    
-      cmd = "gcjh -cp #{gcj} -o #{dest} #{name}"
-      puts cmd
-      break unless system cmd
-      system "ruby -pi -e '$_.sub!(/namespace namespace$/," +
-        "\"namespace namespace$\")' #{dest}"
-      system "ruby -pi -e '$_.sub!(/::namespace::/," +
-        "\"::namespace$::\")' #{dest}"
-    end
-
-    exit unless find_header('org/w3c/dom/Document.h', 'headers')
-  end
-
-  find_header 'nu/validator/htmlparser/dom/HtmlDocumentBuilder.h', 'headers'
-end
-
-# Java libraries
-Config::CONFIG['CC'] = 'g++ -shared'
-dir_config('nu-htmlparser', nil, 'lib')
-have_library 'nu-htmlparser'
-have_library 'nu-icu'
-have_library 'nu-chardet'
-
-# Ruby library
-create_makefile 'nu/validator'
diff --git a/ruby-gcj/test/domencoding.rb b/ruby-gcj/test/domencoding.rb
deleted file mode 100644
index 1beb94c1..00000000
--- a/ruby-gcj/test/domencoding.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'nu/validator'
-
-ARGV.each do |arg|
-  puts Nu::Validator::parse(open(arg)).root.name
-end
diff --git a/ruby-gcj/test/fonts.rb b/ruby-gcj/test/fonts.rb
deleted file mode 100644
index 595e3ae0..00000000
--- a/ruby-gcj/test/fonts.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-require 'nu/validator'
-require 'open-uri'
-
-ARGV.each do |arg|
-  doc = Nu::Validator::parse(open(arg))
-  doc.xpath("//*[local-name()='font']").each do |font|
-    font.attributes.each do |name, attr|
-      puts "#{name} => #{attr.value}"
-    end
-  end
-end
diff --git a/ruby-gcj/test/google.html b/ruby-gcj/test/google.html
deleted file mode 100644
index 8d2183b2..00000000
--- a/ruby-gcj/test/google.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>window.google={kEI:"vLhASujeGpTU9QT2iOnWAQ",kEXPI:"17259",kCSIE:"17259",kHL:"en"};
-window.google.sn="webhp";window.google.timers={load:{t:{start:(new Date).getTime()}}};try{window.google.pt=window.gtbExternal&&window.gtbExternal.pageT()||window.external&&window.external.pageT}catch(b){}
-window.google.jsrt_kill=1;
-var _gjwl=location;function _gjuc(){var e=_gjwl.href.indexOf("#");if(e>=0){var a=_gjwl.href.substring(e);if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var f=a.substring(d,b);if(f.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(f=="cad=h")return 0;c=b}_gjwl.href="/search?"+a+"&cad=h";return 1}}}return 0}function _gjp(){!(window._gjwl.hash&&
-window._gjuc())&&setTimeout(_gjp,500)};
-window._gjp && _gjp();</script><style>td{line-height:.8em;}.gac_c{line-height:normal;}form{margin-bottom:20px;}body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}#gbar{height:22px;padding-left:0px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#guser{padding-bottom:7px !important;text-align:right}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb3{color:#00c !important}.gb3{text-decoration:none}</style><script>google.y={};google.x=function(e,g){google.y[e.id]=[e,g];return false};</script></head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="document.f.q.focus();if(document.images)new Image().src='/images/nav_logo4.png'" topmargin=3 marginheight=3><textarea id=csi style=display:none></textarea><iframe name=wgjf style="display:none"></iframe><div id=gbar><nobr><b class=gb1>Web</b> <a href="http://images.google.com/imghp?hl=en&tab=wi" class=gb1>Images</a> <a href="http://video.google.com/?hl=en&tab=wv" class=gb1>Video</a> <a href="http://maps.google.com/maps?hl=en&tab=wl" class=gb1>Maps</a> <a href="http://news.google.com/nwshp?hl=en&tab=wn" class=gb1>News</a> <a href="http://www.google.com/prdhp?hl=en&tab=wf" class=gb1>Shopping</a> <a href="http://mail.google.com/mail/?hl=en&tab=wm" class=gb1>Gmail</a> <a href="http://www.google.com/intl/en/options/" class=gb3><u>more</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Den%26source%3Diglk&usg=AFQjCNFA18XPfgb7dKnXfKz7x7g1GDH1tg">iGoogle</a> | <a href="https://www.google.com/accounts/Login?hl=en&continue=http://www.google.com/">Sign in</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><center><br clear=all id=lgpd><img alt="Google" height=110 src="/intl/en_ALL/images/logo.gif" width=276 id=logo onload="window.lol&&lol()"><br><br><form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%>&nbsp;</td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25% align=left><font size=-2>&nbsp;&nbsp;<a href=/advanced_search?hl=en>Advanced Search</a><br>&nbsp;&nbsp;<a href=/preferences?hl=en>Preferences</a><br>&nbsp;&nbsp;<a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><font size=-1><a href="/aclk?sa=L&ai=CqVchLbNASrv7IZa68gS13KTwAc3__IMB29PoogzB2ZzZExABIMFUUK_O0JX______wFgyQaqBAlP0BcDOBRYhqw&num=1&sig=AGiWqty21CD7ixNXZILwCnH7c_3n9v2-tg&q=http://www.allforgood.org#source=hpp">Find an opportunity to volunteer</a> in your community today.</font><br><br><br><font size=-1><a href="/intl/en/ads/">Advertising&nbsp;Programs</a> - <a href="/services/">Business Solutions</a> - <a href="/intl/en/about.html">About Google</a></font><p><font size=-2>&copy;2009 - <a href="/intl/en/privacy.html">Privacy</a></font></p></center><div id=xjsd></div><div id=xjsi><script>if(google.y)google.y.first=[];if(google.y)google.y.first=[];google.dstr=[];google.rein=[];window.setTimeout(function(){var a=document.createElement("script");a.src="/extern_js/f/CgJlbhICdXMgACswCjggQAgsKzAOOAUsKzAYOAQsKzAlOMmIASwrMCY4BCwrMCc4ACw/1t0T7hspHT4.js";(document.getElementById("xjsd")||document.body).appendChild(a)},0);
-;google.y.first.push(function(){google.ac.i(document.f,document.f.q,'','')});google.xjs&&google.j&&google.j.xi&&google.j.xi()</script></div><script>(function(){
-function a(){google.timers.load.t.ol=(new Date).getTime();google.report&&google.report(google.timers.load,{ei:google.kEI,e:google.kCSIE})}if(window.addEventListener)window.addEventListener("load",a,false);else if(window.attachEvent)window.attachEvent("onload",a);google.timers.load.t.prt=(new Date).getTime();
-})();
-</script>
\ No newline at end of file
diff --git a/ruby-gcj/test/greek.xml b/ruby-gcj/test/greek.xml
deleted file mode 100644
index a14d23eb..00000000
--- a/ruby-gcj/test/greek.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='iso-8859-7'?>
-<root/>
diff --git a/ruby-gcj/validator.cpp b/ruby-gcj/validator.cpp
deleted file mode 100644
index aadd24ab..00000000
--- a/ruby-gcj/validator.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-#include <gcj/cni.h>
-
-#include <java/io/ByteArrayInputStream.h>
-#include <java/lang/System.h>
-#include <java/lang/Throwable.h>
-#include <java/util/ArrayList.h>
-#include <javax/xml/xpath/XPath.h>
-#include <javax/xml/xpath/XPathFactory.h>
-#include <javax/xml/xpath/XPathExpression.h>
-#include <javax/xml/xpath/XPathConstants.h>
-#include <javax/xml/parsers/DocumentBuilderFactory.h>
-#include <javax/xml/parsers/DocumentBuilder.h>
-#include <org/w3c/dom/Attr.h>
-#include <org/w3c/dom/Document.h>
-#include <org/w3c/dom/Element.h>
-#include <org/w3c/dom/NodeList.h>
-#include <org/w3c/dom/NamedNodeMap.h>
-#include <org/xml/sax/InputSource.h>
-
-#include "nu/validator/htmlparser/dom/HtmlDocumentBuilder.h"
-
-#include "DomUtils.h"
-
-#include "ruby.h"
-
-using namespace java::io;
-using namespace java::lang;
-using namespace java::util;
-using namespace javax::xml::parsers;
-using namespace javax::xml::xpath;
-using namespace nu::validator::htmlparser::dom;
-using namespace org::w3c::dom;
-using namespace org::xml::sax;
-
-static VALUE jaxp_Document;
-static VALUE jaxp_Attr;
-static VALUE jaxp_Element;
-static ID ID_read;
-static ID ID_doc;
-static ID ID_element;
-
-// convert a Java string into a Ruby string
-static VALUE j2r(String *string) {
-  if (string == NULL) return Qnil;
-  jint len = JvGetStringUTFLength(string);
-  char buf[len];
-  JvGetStringUTFRegion(string, 0, len, buf);
-  return rb_str_new(buf, len);
-}
-
-// convert a Ruby string into a Java string
-static String *r2j(VALUE string) {
-  return JvNewStringUTF(RSTRING(string)->ptr);
-}
-
-// release the Java Document associated with this Ruby Document
-static void vnu_document_free(Document *doc) {
-  DomUtils::unpin(doc);
-}
-
-// Nu::Validator::parse( string|file )
-static VALUE vnu_parse(VALUE self, VALUE input) {
-  HtmlDocumentBuilder *parser = new HtmlDocumentBuilder();
-  
-  // read file-like objects into memory.  TODO: buffer such objects
-  if (rb_respond_to(input, ID_read))
-    input = rb_funcall(input, ID_read, 0);
-
-  // convert input in to a ByteArrayInputStream
-  jbyteArray bytes = JvNewByteArray(RSTRING(input)->len);
-  memcpy(elements(bytes), RSTRING(input)->ptr, RSTRING(input)->len);
-  InputSource *source = new InputSource(new ByteArrayInputStream(bytes));
-
-  // parse, pin, and wrap
-  Document *doc = parser->parse(source);
-  DomUtils::pin(doc);
-  return Data_Wrap_Struct(jaxp_Document, NULL, vnu_document_free, doc);
-}
-
-// Jaxp::parse( string|file )
-static VALUE jaxp_parse(VALUE self, VALUE input) {
-  DocumentBuilderFactory *factory = DocumentBuilderFactory::newInstance();
-  DocumentBuilder *parser = factory->newDocumentBuilder();
-   
-  // read file-like objects into memory.  TODO: buffer such objects
-  if (rb_respond_to(input, ID_read))
-    input = rb_funcall(input, ID_read, 0);
- 
-  try {
-    jbyteArray bytes = JvNewByteArray(RSTRING(input)->len);
-    memcpy(elements(bytes), RSTRING(input)->ptr, RSTRING(input)->len);
-    Document *doc = parser->parse(new ByteArrayInputStream(bytes));
-    DomUtils::pin(doc);
-    return Data_Wrap_Struct(jaxp_Document, NULL, vnu_document_free, doc);
-  } catch (java::lang::Throwable *ex) {
-    ex->printStackTrace();
-    return Qnil;
-  }
-}
-
-
-// Nu::Validator::Document#encoding
-static VALUE jaxp_document_encoding(VALUE rdoc) {
-  Document *jdoc;
-  Data_Get_Struct(rdoc, Document, jdoc);
-  return j2r(jdoc->getXmlEncoding());
-}
-
-// Nu::Validator::Document#root
-static VALUE jaxp_document_root(VALUE rdoc) {
-  Document *jdoc;
-  Data_Get_Struct(rdoc, Document, jdoc);
-
-  Element *jelement = jdoc->getDocumentElement();
-  if (jelement==NULL) return Qnil;
-
-  VALUE relement = Data_Wrap_Struct(jaxp_Element, NULL, NULL, jelement);
-  rb_ivar_set(relement, ID_doc, rdoc);
-  return relement;
-}
-
-// Nu::Validator::Document#xpath
-static VALUE jaxp_document_xpath(VALUE rdoc, VALUE path) {
-  Document *jdoc;
-  Data_Get_Struct(rdoc, Document, jdoc);
-
-  Element *jelement = jdoc->getDocumentElement();
-  if (jelement==NULL) return Qnil;
-
-  XPath *xpath = XPathFactory::newInstance()->newXPath();
-  XPathExpression *expr = xpath->compile(r2j(path));
-  NodeList *list = (NodeList*) expr->evaluate(jdoc, XPathConstants::NODESET);
-
-  VALUE result = rb_ary_new();
-  for (int i=0; i<list->getLength(); i++) {
-    VALUE relement = Data_Wrap_Struct(jaxp_Element, NULL, NULL, list->item(i));
-    rb_ivar_set(relement, ID_doc, rdoc);
-    rb_ary_push(result, relement);
-  }
-  return result;
-}
-
-// Nu::Validator::Element#name
-static VALUE jaxp_element_name(VALUE relement) {
-  Element *jelement;
-  Data_Get_Struct(relement, Element, jelement);
-  return j2r(jelement->getNodeName());
-}
-
-// Nu::Validator::Element#attributes
-static VALUE jaxp_element_attributes(VALUE relement) {
-  Element *jelement;
-  Data_Get_Struct(relement, Element, jelement);
-  VALUE result = rb_hash_new();
-  NamedNodeMap *map = jelement->getAttributes();
-  for (int i=0; i<map->getLength(); i++) {
-    Attr *jattr = (Attr *) map->item(i);
-    VALUE rattr = Data_Wrap_Struct(jaxp_Attr, NULL, NULL, jattr);
-    rb_ivar_set(rattr, ID_element, relement);
-    rb_hash_aset(result, j2r(jattr->getName()), rattr);
-  }
-  return result;
-}
-
-// Nu::Validator::Attribute#value
-static VALUE jaxp_attribute_value(VALUE rattribute) {
-  Attr *jattribute;
-  Data_Get_Struct(rattribute, Attr, jattribute);
-  return j2r(jattribute->getValue());
-}
-
-typedef VALUE (ruby_method)(...);
-
-// Nu::Validator module initialization
-extern "C" void Init_validator() {
-  JvCreateJavaVM(NULL);
-  JvAttachCurrentThread(NULL, NULL);
-  JvInitClass(&DomUtils::class$);
-  JvInitClass(&XPathFactory::class$);
-  JvInitClass(&XPathConstants::class$);
-
-  VALUE jaxp = rb_define_module("Jaxp");
-  rb_define_singleton_method(jaxp, "parse", (ruby_method*)&jaxp_parse, 1);
-
-  VALUE nu = rb_define_module("Nu");
-  VALUE validator = rb_define_module_under(nu, "Validator");
-  rb_define_singleton_method(validator, "parse", (ruby_method*)&vnu_parse, 1);
-
-  jaxp_Document = rb_define_class_under(jaxp, "Document", rb_cObject);
-  rb_define_method(jaxp_Document, "encoding", 
-    (ruby_method*)&jaxp_document_encoding, 0);
-  rb_define_method(jaxp_Document, "root", 
-    (ruby_method*)&jaxp_document_root, 0);
-  rb_define_method(jaxp_Document, "xpath", 
-    (ruby_method*)&jaxp_document_xpath, 1);
-
-  jaxp_Element = rb_define_class_under(jaxp, "Element", rb_cObject);
-  rb_define_method(jaxp_Element, "name", 
-    (ruby_method*)&jaxp_element_name, 0);
-  rb_define_method(jaxp_Element, "attributes", 
-    (ruby_method*)&jaxp_element_attributes, 0);
-
-  jaxp_Attr = rb_define_class_under(jaxp, "Attr", rb_cObject);
-  rb_define_method(jaxp_Attr, "value", 
-    (ruby_method*)&jaxp_attribute_value, 0);
-
-  ID_read = rb_intern("read");
-  ID_doc  = rb_intern("@doc");
-  ID_element = rb_intern("@element");
-}
diff --git a/super/nu/validator/htmlparser/translatable/java/io/IOException.java b/saxtree/pom.xml
similarity index 68%
rename from super/nu/validator/htmlparser/translatable/java/io/IOException.java
rename to saxtree/pom.xml
index f323f1e3..fe31a185 100644
--- a/super/nu/validator/htmlparser/translatable/java/io/IOException.java
+++ b/saxtree/pom.xml
@@ -1,5 +1,5 @@
-/*
- * Copyright (c) 2009 Mozilla Foundation
+<!--
+ * Copyright (c) 2007-2012 Mozilla Foundation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a 
  * copy of this software and associated documentation files (the "Software"), 
@@ -18,25 +18,18 @@
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  * DEALINGS IN THE SOFTWARE.
- */
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
 
-package java.io;
+  <parent>
+    <groupId>nu.validator.htmlparser</groupId>
+    <artifactId>parent</artifactId>
+    <version>2.0</version>
+  </parent>
 
-public class IOException extends Exception {
+  <artifactId>saxtree</artifactId>
 
-    public IOException() {
-    }
-
-    public IOException(String arg0) {
-        super(arg0);
-    }
-
-    public IOException(Throwable arg0) {
-        super(arg0);
-    }
-
-    public IOException(String arg0, Throwable arg1) {
-        super(arg0, arg1);
-    }
-
-}
+  <name>saxtree</name>
+</project>
diff --git a/gwt-src/nu/validator/htmlparser/gwt/ParseEndListener.java b/saxtree/src/main/java/module-info.java
similarity index 58%
rename from gwt-src/nu/validator/htmlparser/gwt/ParseEndListener.java
rename to saxtree/src/main/java/module-info.java
index 43235c5b..077e6379 100644
--- a/gwt-src/nu/validator/htmlparser/gwt/ParseEndListener.java
+++ b/saxtree/src/main/java/module-info.java
@@ -1,46 +1,30 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.gwt;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class ParseEndListener {
-
-    private final JavaScriptObject callback;
-    
-    /**
-     * @param callback
-     */
-    public ParseEndListener(JavaScriptObject callback) {
-        this.callback = callback;
-    }
-
-    public void parseComplete() {
-        call(callback);
-    }
-
-    private static native void call(JavaScriptObject callback) /*-{
-        callback();
-    }-*/;
-
-}
+/*
+ * Copyright (c) 2020 Anthony Vanelverdinghe
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Provides SAX Tree: a tree model optimized for creation from SAX events and replay as SAX events.
+ */
+module nu.validator.saxtree {
+    requires transitive java.xml;
+
+    exports nu.validator.saxtree;
+}
diff --git a/src/nu/validator/saxtree/CDATA.java b/saxtree/src/main/java/nu/validator/saxtree/CDATA.java
similarity index 100%
rename from src/nu/validator/saxtree/CDATA.java
rename to saxtree/src/main/java/nu/validator/saxtree/CDATA.java
diff --git a/src/nu/validator/saxtree/CharBufferNode.java b/saxtree/src/main/java/nu/validator/saxtree/CharBufferNode.java
similarity index 100%
rename from src/nu/validator/saxtree/CharBufferNode.java
rename to saxtree/src/main/java/nu/validator/saxtree/CharBufferNode.java
diff --git a/src/nu/validator/saxtree/Characters.java b/saxtree/src/main/java/nu/validator/saxtree/Characters.java
similarity index 100%
rename from src/nu/validator/saxtree/Characters.java
rename to saxtree/src/main/java/nu/validator/saxtree/Characters.java
diff --git a/src/nu/validator/saxtree/Comment.java b/saxtree/src/main/java/nu/validator/saxtree/Comment.java
similarity index 100%
rename from src/nu/validator/saxtree/Comment.java
rename to saxtree/src/main/java/nu/validator/saxtree/Comment.java
diff --git a/src/nu/validator/saxtree/DTD.java b/saxtree/src/main/java/nu/validator/saxtree/DTD.java
similarity index 100%
rename from src/nu/validator/saxtree/DTD.java
rename to saxtree/src/main/java/nu/validator/saxtree/DTD.java
diff --git a/src/nu/validator/saxtree/Document.java b/saxtree/src/main/java/nu/validator/saxtree/Document.java
similarity index 100%
rename from src/nu/validator/saxtree/Document.java
rename to saxtree/src/main/java/nu/validator/saxtree/Document.java
diff --git a/src/nu/validator/saxtree/DocumentFragment.java b/saxtree/src/main/java/nu/validator/saxtree/DocumentFragment.java
similarity index 95%
rename from src/nu/validator/saxtree/DocumentFragment.java
rename to saxtree/src/main/java/nu/validator/saxtree/DocumentFragment.java
index a9e2db84..9f496bf3 100644
--- a/src/nu/validator/saxtree/DocumentFragment.java
+++ b/saxtree/src/main/java/nu/validator/saxtree/DocumentFragment.java
@@ -23,7 +23,7 @@
 
 package nu.validator.saxtree;
 
-import nu.validator.htmlparser.impl.LocatorImpl;
+import org.xml.sax.ext.Locator2Impl;
 
 /**
  * A document fragment.
@@ -37,7 +37,7 @@ public final class DocumentFragment extends ParentNode {
      * The constructor.
      */
     public DocumentFragment() {
-        super(new LocatorImpl());
+        super(new Locator2Impl());
     }
 
     /**
diff --git a/src/nu/validator/saxtree/Element.java b/saxtree/src/main/java/nu/validator/saxtree/Element.java
similarity index 100%
rename from src/nu/validator/saxtree/Element.java
rename to saxtree/src/main/java/nu/validator/saxtree/Element.java
diff --git a/src/nu/validator/saxtree/Entity.java b/saxtree/src/main/java/nu/validator/saxtree/Entity.java
similarity index 100%
rename from src/nu/validator/saxtree/Entity.java
rename to saxtree/src/main/java/nu/validator/saxtree/Entity.java
diff --git a/src/nu/validator/saxtree/IgnorableWhitespace.java b/saxtree/src/main/java/nu/validator/saxtree/IgnorableWhitespace.java
similarity index 100%
rename from src/nu/validator/saxtree/IgnorableWhitespace.java
rename to saxtree/src/main/java/nu/validator/saxtree/IgnorableWhitespace.java
diff --git a/src/nu/validator/saxtree/LocatorImpl.java b/saxtree/src/main/java/nu/validator/saxtree/LocatorImpl.java
similarity index 98%
rename from src/nu/validator/saxtree/LocatorImpl.java
rename to saxtree/src/main/java/nu/validator/saxtree/LocatorImpl.java
index b6416f1a..6a1f81ba 100644
--- a/src/nu/validator/saxtree/LocatorImpl.java
+++ b/saxtree/src/main/java/nu/validator/saxtree/LocatorImpl.java
@@ -31,7 +31,7 @@
  * @version $Id$
  * @author hsivonen
  */
-public final class LocatorImpl implements Locator, Locator2 {
+public final class LocatorImpl implements Locator2 {
 
     /**
      * The system id.
diff --git a/src/nu/validator/saxtree/Node.java b/saxtree/src/main/java/nu/validator/saxtree/Node.java
similarity index 99%
rename from src/nu/validator/saxtree/Node.java
rename to saxtree/src/main/java/nu/validator/saxtree/Node.java
index c9292dd2..1ead08b4 100644
--- a/src/nu/validator/saxtree/Node.java
+++ b/saxtree/src/main/java/nu/validator/saxtree/Node.java
@@ -35,7 +35,7 @@
  * @version $Id$
  * @author hsivonen
  */
-public abstract class Node implements Locator, Locator2 {
+public abstract class Node implements Locator2 {
 
     /**
      * The system id.
diff --git a/src/nu/validator/saxtree/NodeType.java b/saxtree/src/main/java/nu/validator/saxtree/NodeType.java
similarity index 100%
rename from src/nu/validator/saxtree/NodeType.java
rename to saxtree/src/main/java/nu/validator/saxtree/NodeType.java
diff --git a/src/nu/validator/saxtree/NullLexicalHandler.java b/saxtree/src/main/java/nu/validator/saxtree/NullLexicalHandler.java
similarity index 100%
rename from src/nu/validator/saxtree/NullLexicalHandler.java
rename to saxtree/src/main/java/nu/validator/saxtree/NullLexicalHandler.java
diff --git a/src/nu/validator/saxtree/ParentNode.java b/saxtree/src/main/java/nu/validator/saxtree/ParentNode.java
similarity index 100%
rename from src/nu/validator/saxtree/ParentNode.java
rename to saxtree/src/main/java/nu/validator/saxtree/ParentNode.java
diff --git a/src/nu/validator/saxtree/PrefixMapping.java b/saxtree/src/main/java/nu/validator/saxtree/PrefixMapping.java
similarity index 100%
rename from src/nu/validator/saxtree/PrefixMapping.java
rename to saxtree/src/main/java/nu/validator/saxtree/PrefixMapping.java
diff --git a/src/nu/validator/saxtree/ProcessingInstruction.java b/saxtree/src/main/java/nu/validator/saxtree/ProcessingInstruction.java
similarity index 100%
rename from src/nu/validator/saxtree/ProcessingInstruction.java
rename to saxtree/src/main/java/nu/validator/saxtree/ProcessingInstruction.java
diff --git a/src/nu/validator/saxtree/SkippedEntity.java b/saxtree/src/main/java/nu/validator/saxtree/SkippedEntity.java
similarity index 100%
rename from src/nu/validator/saxtree/SkippedEntity.java
rename to saxtree/src/main/java/nu/validator/saxtree/SkippedEntity.java
diff --git a/src/nu/validator/saxtree/TreeBuilder.java b/saxtree/src/main/java/nu/validator/saxtree/TreeBuilder.java
similarity index 100%
rename from src/nu/validator/saxtree/TreeBuilder.java
rename to saxtree/src/main/java/nu/validator/saxtree/TreeBuilder.java
diff --git a/src/nu/validator/saxtree/TreeParser.java b/saxtree/src/main/java/nu/validator/saxtree/TreeParser.java
similarity index 99%
rename from src/nu/validator/saxtree/TreeParser.java
rename to saxtree/src/main/java/nu/validator/saxtree/TreeParser.java
index 6f86f7f0..29792f84 100644
--- a/src/nu/validator/saxtree/TreeParser.java
+++ b/saxtree/src/main/java/nu/validator/saxtree/TreeParser.java
@@ -35,7 +35,7 @@
  * @version $Id$
  * @author hsivonen
  */
-public final class TreeParser implements Locator, Locator2 {
+public final class TreeParser implements Locator2 {
     
     /**
      * The content handler.
diff --git a/src/nu/validator/htmlparser/impl/package.html b/saxtree/src/main/java/nu/validator/saxtree/package-info.java
similarity index 52%
rename from src/nu/validator/htmlparser/impl/package.html
rename to saxtree/src/main/java/nu/validator/saxtree/package-info.java
index 6d029a13..54af5a4c 100644
--- a/src/nu/validator/htmlparser/impl/package.html
+++ b/saxtree/src/main/java/nu/validator/saxtree/package-info.java
@@ -1,7 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
+/*
  Copyright (c) 2007 Henri Sivonen
 
  Permission is hereby granted, free of charge, to any person obtaining a 
@@ -21,10 +18,23 @@
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package contains the bulk of parser internals. Only implementors of 
-additional tree builders or token handlers should look here.</p>
-</body>
-</html>
\ No newline at end of file
+ */
+
+/**
+ * This package provides SAX Tree: a tree model optimized for creation from SAX events and replay as SAX events.
+ * 
+ * <h2>Design Principles</h2>
+ * <ol>
+ * <li>Preserve information exposed through <code>ContentHandler</code>,
+ *     <code>LexicalHandler</code> <em>and</em> <code>Locator</code>.
+ * <li>Creation from SAX events or as part of the parse of a conforming
+ *     HTML5 document should be <em>fast</em>.
+ * <li>Emitting SAX events based on the tree should be <em>fast</em>.
+ * <li>Mutations should be <em>possible</em> but should not make the above "fast" cases slower.
+ * <li>Concurrent reads should work without locking when there are no concurrent mutations.
+ * <li>The user of the API has the responsibility of using the API properly:
+ *     for the sake of performance, the model does not check if it is being used properly.
+ *     Improper use may, therefore, put the model in and inconsistent state.
+ * </ol>
+ */
+package nu.validator.saxtree;
diff --git a/src/nu/validator/htmlparser/annotation/package.html b/src/nu/validator/htmlparser/annotation/package.html
deleted file mode 100644
index af15d382..00000000
--- a/src/nu/validator/htmlparser/annotation/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
- Copyright (c) 2008 Mozilla Foundation
-
- Permission is hereby granted, free of charge, to any person obtaining a 
- copy of this software and associated documentation files (the "Software"), 
- to deal in the Software without restriction, including without limitation 
- the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- and/or sell copies of the Software, and to permit persons to whom the 
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in 
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides annotations for facilitating automated translation 
-of the source code into other programming languages.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/nu/validator/htmlparser/dom/package.html b/src/nu/validator/htmlparser/dom/package.html
deleted file mode 100644
index d793bcf8..00000000
--- a/src/nu/validator/htmlparser/dom/package.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
- Copyright (c) 2007 Henri Sivonen
-
- Permission is hereby granted, free of charge, to any person obtaining a 
- copy of this software and associated documentation files (the "Software"), 
- to deal in the Software without restriction, including without limitation 
- the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- and/or sell copies of the Software, and to permit persons to whom the 
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in 
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides an HTML5 parser that exposes the document using the DOM API.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/nu/validator/htmlparser/extra/ChardetSniffer.java b/src/nu/validator/htmlparser/extra/ChardetSniffer.java
deleted file mode 100644
index a7575039..00000000
--- a/src/nu/validator/htmlparser/extra/ChardetSniffer.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.extra;
-
-import java.io.IOException;
-import java.nio.charset.UnsupportedCharsetException;
-
-import nu.validator.htmlparser.io.Encoding;
-
-import org.mozilla.intl.chardet.nsDetector;
-import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
-import org.mozilla.intl.chardet.nsPSMDetector;
-
-import com.ibm.icu.text.CharsetDetector;
-
-public class ChardetSniffer implements nsICharsetDetectionObserver {
-
-    private final byte[] source;
-
-    private final int length;
-    
-    private Encoding returnValue = null;
-    
-    /**
-     * @param source
-     */
-    public ChardetSniffer(final byte[] source, final int length) {
-        this.source = source;
-        this.length = length;
-    }
-    
-    public Encoding sniff() throws IOException {
-        nsDetector detector = new nsDetector(nsPSMDetector.ALL);
-        detector.Init(this);
-        detector.DoIt(source, length, false);
-        detector.DataEnd();
-        if (returnValue != null && returnValue != Encoding.WINDOWS1252 && returnValue.isAsciiSuperset()) {
-            return returnValue;
-        } else {
-            return null;
-        }
-    }
-    
-    public static void main(String[] args) {
-        String[] detectable = CharsetDetector.getAllDetectableCharsets();
-        for (int i = 0; i < detectable.length; i++) {
-            String charset = detectable[i];
-            System.out.println(charset);
-        }
-    }
-
-    public void Notify(String charsetName) {
-        try {
-            Encoding enc = Encoding.forName(charsetName);
-            Encoding actual = enc.getActualHtmlEncoding();
-            if (actual != null) {
-                enc = actual;
-            }
-            returnValue = enc;
-        } catch (UnsupportedCharsetException e) {
-            returnValue = null;
-        }
-    }
-}
diff --git a/src/nu/validator/htmlparser/extra/IcuDetectorSniffer.java b/src/nu/validator/htmlparser/extra/IcuDetectorSniffer.java
deleted file mode 100644
index f3caab5c..00000000
--- a/src/nu/validator/htmlparser/extra/IcuDetectorSniffer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.extra;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import nu.validator.htmlparser.common.ByteReadable;
-import nu.validator.htmlparser.io.Encoding;
-
-import com.ibm.icu.text.CharsetDetector;
-import com.ibm.icu.text.CharsetMatch;
-
-public class IcuDetectorSniffer extends InputStream {
-
-    private final ByteReadable source;
-
-    /**
-     * @param source
-     */
-    public IcuDetectorSniffer(final ByteReadable source) {
-        this.source = source;
-    }
-    
-    @Override
-    public int read() throws IOException {
-        return source.readByte();
-    }
-    
-    public Encoding sniff() throws IOException {
-        try {
-            CharsetDetector detector = new CharsetDetector();
-            detector.setText(this);
-            CharsetMatch match = detector.detect();
-            Encoding enc = Encoding.forName(match.getName());
-            Encoding actual = enc.getActualHtmlEncoding();
-            if (actual != null) {
-                enc = actual;
-            }
-            if (enc != Encoding.WINDOWS1252 && enc.isAsciiSuperset()) {
-                return enc;
-            } else {
-                return null;
-            }
-        } catch (Exception e) {
-            return null;
-        }
-    }
-    
-    public static void main(String[] args) {
-        String[] detectable = CharsetDetector.getAllDetectableCharsets();
-        for (int i = 0; i < detectable.length; i++) {
-            String charset = detectable[i];
-            System.out.println(charset);
-        }
-    }
-}
diff --git a/src/nu/validator/htmlparser/extra/NormalizationChecker.java b/src/nu/validator/htmlparser/extra/NormalizationChecker.java
deleted file mode 100644
index 45df62fb..00000000
--- a/src/nu/validator/htmlparser/extra/NormalizationChecker.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (c) 2006, 2007 Henri Sivonen
- * Copyright (c) 2007 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.extra;
-
-import nu.validator.htmlparser.common.CharacterHandler;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import com.ibm.icu.lang.UCharacter;
-import com.ibm.icu.text.Normalizer;
-import com.ibm.icu.text.UnicodeSet;
-
-/**
- * @version $Id$
- * @author hsivonen
- */
-public final class NormalizationChecker implements CharacterHandler {
-
-    private ErrorHandler errorHandler;
-
-    private Locator locator;
-
-    /**
-     * A thread-safe set of composing characters as per Charmod Norm.
-     */
-    @SuppressWarnings("deprecation")
-    private static final UnicodeSet COMPOSING_CHARACTERS = (UnicodeSet) new UnicodeSet(
-            "[[:nfc_qc=maybe:][:^ccc=0:]]").freeze();
-
-    // see http://sourceforge.net/mailarchive/message.php?msg_id=37279908
-
-    /**
-     * A buffer for holding sequences overlap the SAX buffer boundary.
-     */
-    private char[] buf = new char[128];
-
-    /**
-     * A holder for the original buffer (for the memory leak prevention 
-     * mechanism).
-     */
-    private char[] bufHolder = null;
-
-    /**
-     * The current used length of the buffer, i.e. the index of the first slot 
-     * that does not hold current data.
-     */
-    private int pos;
-
-    /**
-     * Indicates whether the checker the next call to <code>characters()</code> 
-     * is the first call in a run.
-     */
-    private boolean atStartOfRun;
-
-    /**
-     * Indicates whether the current run has already caused an error.
-     */
-    private boolean alreadyComplainedAboutThisRun;
-
-    /**
-     * Emit an error. The locator is used.
-     * 
-     * @param message the error message
-     * @throws SAXException if something goes wrong
-     */
-    public void err(String message) throws SAXException {
-        if (errorHandler != null) {
-            SAXParseException spe = new SAXParseException(message, locator);
-            errorHandler.error(spe);
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if the argument is a composing BMP character 
-     * or a surrogate and <code>false</code> otherwise.
-     * 
-     * @param c a UTF-16 code unit
-     * @return <code>true</code> if the argument is a composing BMP character 
-     * or a surrogate and <code>false</code> otherwise
-     */
-    private static boolean isComposingCharOrSurrogate(char c) {
-        if (UCharacter.isHighSurrogate(c) || UCharacter.isLowSurrogate(c)) {
-            return true;
-        }
-        return isComposingChar(c);
-    }
-
-    /**
-     * Returns <code>true</code> if the argument is a composing character 
-     * and <code>false</code> otherwise.
-     * 
-     * @param c a Unicode code point
-     * @return <code>true</code> if the argument is a composing character 
-     * <code>false</code> otherwise
-     */
-    private static boolean isComposingChar(int c) {
-        return COMPOSING_CHARACTERS.contains(c);
-    }
-
-    /**
-     * Constructor with mode selection.
-     * 
-     * @param sourceTextMode whether the source text-related messages 
-     * should be enabled.
-     */
-    public NormalizationChecker(Locator locator) {
-        super();
-        start();
-    }
-
-    /**
-     * @see nu.validator.htmlparser.common.CharacterHandler#start()
-     */
-    public void start() {
-        atStartOfRun = true;
-        alreadyComplainedAboutThisRun = false;
-        pos = 0;
-    }
-
-    /**
-     * @see nu.validator.htmlparser.common.CharacterHandler#characters(char[], int, int)
-     */
-    public void characters(char[] ch, int start, int length)
-            throws SAXException {
-        if (alreadyComplainedAboutThisRun) {
-            return;
-        }
-        if (atStartOfRun) {
-            char c = ch[start];
-            if (pos == 1) {
-                // there's a single high surrogate in buf
-                if (isComposingChar(UCharacter.getCodePoint(buf[0], c))) {
-                    err("Text run starts with a composing character.");
-                }
-                atStartOfRun = false;
-            } else {
-                if (length == 1 && UCharacter.isHighSurrogate(c)) {
-                    buf[0] = c;
-                    pos = 1;
-                    return;
-                } else {
-                    if (UCharacter.isHighSurrogate(c)) {
-                        if (isComposingChar(UCharacter.getCodePoint(c,
-                                ch[start + 1]))) {
-                            err("Text run starts with a composing character.");
-                        }
-                    } else {
-                        if (isComposingCharOrSurrogate(c)) {
-                            err("Text run starts with a composing character.");
-                        }
-                    }
-                    atStartOfRun = false;
-                }
-            }
-        }
-        int i = start;
-        int stop = start + length;
-        if (pos > 0) {
-            // there's stuff in buf
-            while (i < stop && isComposingCharOrSurrogate(ch[i])) {
-                i++;
-            }
-            appendToBuf(ch, start, i);
-            if (i == stop) {
-                return;
-            } else {
-                if (!Normalizer.isNormalized(buf, 0, pos, Normalizer.NFC, 0)) {
-                    errAboutTextRun();
-                }
-                pos = 0;
-            }
-        }
-        if (i < stop) {
-            start = i;
-            i = stop - 1;
-            while (i > start && isComposingCharOrSurrogate(ch[i])) {
-                i--;
-            }
-            if (i > start) {
-                if (!Normalizer.isNormalized(ch, start, i, Normalizer.NFC, 0)) {
-                    errAboutTextRun();
-                }
-            }
-            appendToBuf(ch, i, stop);
-        }
-    }
-
-    /**
-     * Emits an error stating that the current text run or the source 
-     * text is not in NFC.
-     * 
-     * @throws SAXException if the <code>ErrorHandler</code> throws
-     */
-    private void errAboutTextRun() throws SAXException {
-        err("Source text is not in Unicode Normalization Form C.");
-        alreadyComplainedAboutThisRun = true;
-    }
-
-    /**
-     * Appends a slice of an UTF-16 code unit array to the internal 
-     * buffer.
-     * 
-     * @param ch the array from which to copy
-     * @param start the index of the first element that is copied
-     * @param end the index of the first element that is not copied
-     */
-    private void appendToBuf(char[] ch, int start, int end) {
-        if (start == end) {
-            return;
-        }
-        int neededBufLen = pos + (end - start);
-        if (neededBufLen > buf.length) {
-            char[] newBuf = new char[neededBufLen];
-            System.arraycopy(buf, 0, newBuf, 0, pos);
-            if (bufHolder == null) {
-                bufHolder = buf; // keep the original around
-            }
-            buf = newBuf;
-        }
-        System.arraycopy(ch, start, buf, pos, end - start);
-        pos += (end - start);
-    }
-
-    /**
-     * @see nu.validator.htmlparser.common.CharacterHandler#end()
-     */
-    public void end() throws SAXException {
-        if (!alreadyComplainedAboutThisRun
-                && !Normalizer.isNormalized(buf, 0, pos, Normalizer.NFC, 0)) {
-            errAboutTextRun();
-        }
-        if (bufHolder != null) {
-            // restore the original small buffer to avoid leaking
-            // memory if this checker is recycled
-            buf = bufHolder;
-            bufHolder = null;
-        }
-    }
-
-    public void setErrorHandler(ErrorHandler errorHandler) {
-        this.errorHandler = errorHandler;
-    }
-
-}
diff --git a/src/nu/validator/htmlparser/sax/package.html b/src/nu/validator/htmlparser/sax/package.html
deleted file mode 100644
index 60532962..00000000
--- a/src/nu/validator/htmlparser/sax/package.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
- Copyright (c) 2007 Henri Sivonen
-
- Permission is hereby granted, free of charge, to any person obtaining a 
- copy of this software and associated documentation files (the "Software"), 
- to deal in the Software without restriction, including without limitation 
- the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- and/or sell copies of the Software, and to permit persons to whom the 
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in 
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides an HTML5 parser that exposes the document through the SAX API.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/nu/validator/htmlparser/xom/package.html b/src/nu/validator/htmlparser/xom/package.html
deleted file mode 100644
index a936d5e3..00000000
--- a/src/nu/validator/htmlparser/xom/package.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
- Copyright (c) 2007 Henri Sivonen
-
- Permission is hereby granted, free of charge, to any person obtaining a 
- copy of this software and associated documentation files (the "Software"), 
- to deal in the Software without restriction, including without limitation 
- the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- and/or sell copies of the Software, and to permit persons to whom the 
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in 
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides an HTML5 parser that exposes the document through the XOM API.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/nu/validator/saxtree/package.html b/src/nu/validator/saxtree/package.html
deleted file mode 100644
index 0c34dad8..00000000
--- a/src/nu/validator/saxtree/package.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head><title>Package Overview</title>
-<!--
- Copyright (c) 2007 Henri Sivonen
-
- Permission is hereby granted, free of charge, to any person obtaining a 
- copy of this software and associated documentation files (the "Software"), 
- to deal in the Software without restriction, including without limitation 
- the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- and/or sell copies of the Software, and to permit persons to whom the 
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in 
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- DEALINGS IN THE SOFTWARE.
--->
-</head>
-<body bgcolor="white">
-<p>This package provides SAX Tree: a tree model optimized for creation from SAX 
-events and replay as SAX events.</p>
-<h2>Design Principles</h2>
-<ol>
-<li>Preserve information exposed through <code>ContentHandler</code>, 
-<code>LexicalHandler</code> <em>and</em> <code>Locator</code>.
-<li>Creation from SAX events or as part of the parse of a conforming 
-HTML5 document should be <em>fast</em>.</li>
-<li>Emitting SAX events based on the tree should be <em>fast</em>.</li>
-<li>Mutations should be <em>possible</em> but should not make the above 
-"fast" cases slower.</li>
-<li>Concurrent reads should work without locking when there are no 
-concurrent mutations.</li>
-<li>The user of the API has the responsibility of using the API properly: 
-for the sake of performance, the model does not check if it is being 
-used properly. Improper use may, therefore, put the model in and 
-inconsistent state.</li>
-</ol>
-</body>
-</html>
\ No newline at end of file
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/Attributes.java b/super/nu/validator/htmlparser/translatable/org/xml/sax/Attributes.java
deleted file mode 100644
index b25432d4..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/Attributes.java
+++ /dev/null
@@ -1,257 +0,0 @@
-// Attributes.java - attribute list with Namespace support
-// http://www.saxproject.org
-// Written by David Megginson
-// NO WARRANTY!  This class is in the public domain.
-// $Id: Attributes.java,v 1.13 2004/03/18 12:28:05 dmegginson Exp $
-
-package org.xml.sax;
-
-
-/**
- * Interface for a list of XML attributes.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>This interface allows access to a list of attributes in
- * three different ways:</p>
- *
- * <ol>
- * <li>by attribute index;</li>
- * <li>by Namespace-qualified name; or</li>
- * <li>by qualified (prefixed) name.</li>
- * </ol>
- *
- * <p>The list will not contain attributes that were declared
- * #IMPLIED but not specified in the start tag.  It will also not
- * contain attributes used as Namespace declarations (xmlns*) unless
- * the <code>http://xml.org/sax/features/namespace-prefixes</code> 
- * feature is set to <var>true</var> (it is <var>false</var> by 
- * default).
- * Because SAX2 conforms to the original "Namespaces in XML"
- * recommendation, it normally does not
- * give namespace declaration attributes a namespace URI.
- * </p>
- *
- * <p>Some SAX2 parsers may support using an optional feature flag
- * (<code>http://xml.org/sax/features/xmlns-uris</code>) to request
- * that those attributes be given URIs, conforming to a later
- * backwards-incompatible revision of that recommendation.  (The
- * attribute's "local name" will be the prefix, or "xmlns" when
- * defining a default element namespace.)  For portability, handler
- * code should always resolve that conflict, rather than requiring
- * parsers that can change the setting of that feature flag.  </p>
- *
- * <p>If the namespace-prefixes feature (see above) is
- * <var>false</var>, access by qualified name may not be available; if
- * the <code>http://xml.org/sax/features/namespaces</code> feature is
- * <var>false</var>, access by Namespace-qualified names may not be
- * available.</p>
- *
- * <p>This interface replaces the now-deprecated SAX1 {@link
- * org.xml.sax.AttributeList AttributeList} interface, which does not 
- * contain Namespace support.  In addition to Namespace support, it 
- * adds the <var>getIndex</var> methods (below).</p>
- *
- * <p>The order of attributes in the list is unspecified, and will
- * vary from implementation to implementation.</p>
- *
- * @since SAX 2.0
- * @author David Megginson
- * @version 2.0.1 (sax2r2)
- * @see org.xml.sax.helpers.AttributesImpl
- * @see org.xml.sax.ext.DeclHandler#attributeDecl
- */
-public interface Attributes
-{
-
-
-    ////////////////////////////////////////////////////////////////////
-    // Indexed access.
-    ////////////////////////////////////////////////////////////////////
-
-
-    /**
-     * Return the number of attributes in the list.
-     *
-     * <p>Once you know the number of attributes, you can iterate
-     * through the list.</p>
-     *
-     * @return The number of attributes in the list.
-     * @see #getURI(int)
-     * @see #getLocalName(int)
-     * @see #getQName(int)
-     * @see #getType(int)
-     * @see #getValue(int)
-     */
-    public abstract int getLength ();
-
-
-    /**
-     * Look up an attribute's Namespace URI by index.
-     *
-     * @param index The attribute index (zero-based).
-     * @return The Namespace URI, or the empty string if none
-     *         is available, or null if the index is out of
-     *         range.
-     * @see #getLength
-     */
-    public abstract String getURI (int index);
-
-
-    /**
-     * Look up an attribute's local name by index.
-     *
-     * @param index The attribute index (zero-based).
-     * @return The local name, or the empty string if Namespace
-     *         processing is not being performed, or null
-     *         if the index is out of range.
-     * @see #getLength
-     */
-    public abstract String getLocalName (int index);
-
-
-    /**
-     * Look up an attribute's XML qualified (prefixed) name by index.
-     *
-     * @param index The attribute index (zero-based).
-     * @return The XML qualified name, or the empty string
-     *         if none is available, or null if the index
-     *         is out of range.
-     * @see #getLength
-     */
-    public abstract String getQName (int index);
-
-
-    /**
-     * Look up an attribute's type by index.
-     *
-     * <p>The attribute type is one of the strings "CDATA", "ID",
-     * "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES",
-     * or "NOTATION" (always in upper case).</p>
-     *
-     * <p>If the parser has not read a declaration for the attribute,
-     * or if the parser does not report attribute types, then it must
-     * return the value "CDATA" as stated in the XML 1.0 Recommendation
-     * (clause 3.3.3, "Attribute-Value Normalization").</p>
-     *
-     * <p>For an enumerated attribute that is not a notation, the
-     * parser will report the type as "NMTOKEN".</p>
-     *
-     * @param index The attribute index (zero-based).
-     * @return The attribute's type as a string, or null if the
-     *         index is out of range.
-     * @see #getLength
-     */
-    public abstract String getType (int index);
-
-
-    /**
-     * Look up an attribute's value by index.
-     *
-     * <p>If the attribute value is a list of tokens (IDREFS,
-     * ENTITIES, or NMTOKENS), the tokens will be concatenated
-     * into a single string with each token separated by a
-     * single space.</p>
-     *
-     * @param index The attribute index (zero-based).
-     * @return The attribute's value as a string, or null if the
-     *         index is out of range.
-     * @see #getLength
-     */
-    public abstract String getValue (int index);
-
-
-
-    ////////////////////////////////////////////////////////////////////
-    // Name-based query.
-    ////////////////////////////////////////////////////////////////////
-
-
-    /**
-     * Look up the index of an attribute by Namespace name.
-     *
-     * @param uri The Namespace URI, or the empty string if
-     *        the name has no Namespace URI.
-     * @param localName The attribute's local name.
-     * @return The index of the attribute, or -1 if it does not
-     *         appear in the list.
-     */
-    public int getIndex (String uri, String localName);
-
-
-    /**
-     * Look up the index of an attribute by XML qualified (prefixed) name.
-     *
-     * @param qName The qualified (prefixed) name.
-     * @return The index of the attribute, or -1 if it does not
-     *         appear in the list.
-     */
-    public int getIndex (String qName);
-
-
-    /**
-     * Look up an attribute's type by Namespace name.
-     *
-     * <p>See {@link #getType(int) getType(int)} for a description
-     * of the possible types.</p>
-     *
-     * @param uri The Namespace URI, or the empty String if the
-     *        name has no Namespace URI.
-     * @param localName The local name of the attribute.
-     * @return The attribute type as a string, or null if the
-     *         attribute is not in the list or if Namespace
-     *         processing is not being performed.
-     */
-    public abstract String getType (String uri, String localName);
-
-
-    /**
-     * Look up an attribute's type by XML qualified (prefixed) name.
-     *
-     * <p>See {@link #getType(int) getType(int)} for a description
-     * of the possible types.</p>
-     *
-     * @param qName The XML qualified name.
-     * @return The attribute type as a string, or null if the
-     *         attribute is not in the list or if qualified names
-     *         are not available.
-     */
-    public abstract String getType (String qName);
-
-
-    /**
-     * Look up an attribute's value by Namespace name.
-     *
-     * <p>See {@link #getValue(int) getValue(int)} for a description
-     * of the possible values.</p>
-     *
-     * @param uri The Namespace URI, or the empty String if the
-     *        name has no Namespace URI.
-     * @param localName The local name of the attribute.
-     * @return The attribute value as a string, or null if the
-     *         attribute is not in the list.
-     */
-    public abstract String getValue (String uri, String localName);
-
-
-    /**
-     * Look up an attribute's value by XML qualified (prefixed) name.
-     *
-     * <p>See {@link #getValue(int) getValue(int)} for a description
-     * of the possible values.</p>
-     *
-     * @param qName The XML qualified name.
-     * @return The attribute value as a string, or null if the
-     *         attribute is not in the list or if qualified names
-     *         are not available.
-     */
-    public abstract String getValue (String qName);
-
-}
-
-// end of Attributes.java
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/ErrorHandler.java b/super/nu/validator/htmlparser/translatable/org/xml/sax/ErrorHandler.java
deleted file mode 100644
index 37d25014..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/ErrorHandler.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// SAX error handler.
-// http://www.saxproject.org
-// No warranty; no copyright -- use this as you will.
-// $Id: ErrorHandler.java,v 1.10 2004/03/08 13:01:00 dmegginson Exp $
-
-package org.xml.sax;
-
-
-/**
- * Basic interface for SAX error handlers.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>If a SAX application needs to implement customized error
- * handling, it must implement this interface and then register an
- * instance with the XML reader using the
- * {@link org.xml.sax.XMLReader#setErrorHandler setErrorHandler}
- * method.  The parser will then report all errors and warnings
- * through this interface.</p>
- *
- * <p><strong>WARNING:</strong> If an application does <em>not</em>
- * register an ErrorHandler, XML parsing errors will go unreported,
- * except that <em>SAXParseException</em>s will be thrown for fatal errors.
- * In order to detect validity errors, an ErrorHandler that does something
- * with {@link #error error()} calls must be registered.</p>
- *
- * <p>For XML processing errors, a SAX driver must use this interface 
- * in preference to throwing an exception: it is up to the application 
- * to decide whether to throw an exception for different types of 
- * errors and warnings.  Note, however, that there is no requirement that 
- * the parser continue to report additional errors after a call to 
- * {@link #fatalError fatalError}.  In other words, a SAX driver class 
- * may throw an exception after reporting any fatalError.
- * Also parsers may throw appropriate exceptions for non-XML errors.
- * For example, {@link XMLReader#parse XMLReader.parse()} would throw
- * an IOException for errors accessing entities or the document.</p>
- *
- * @since SAX 1.0
- * @author David Megginson
- * @version 2.0.1+ (sax2r3pre1)
- * @see org.xml.sax.XMLReader#setErrorHandler
- * @see org.xml.sax.SAXParseException 
- */
-public interface ErrorHandler {
-    
-    
-    /**
-     * Receive notification of a warning.
-     *
-     * <p>SAX parsers will use this method to report conditions that
-     * are not errors or fatal errors as defined by the XML
-     * recommendation.  The default behaviour is to take no
-     * action.</p>
-     *
-     * <p>The SAX parser must continue to provide normal parsing events
-     * after invoking this method: it should still be possible for the
-     * application to process the document through to the end.</p>
-     *
-     * <p>Filters may use this method to report other, non-XML warnings
-     * as well.</p>
-     *
-     * @param exception The warning information encapsulated in a
-     *                  SAX parse exception.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see org.xml.sax.SAXParseException 
-     */
-    public abstract void warning (SAXParseException exception)
-	throws SAXException;
-    
-    
-    /**
-     * Receive notification of a recoverable error.
-     *
-     * <p>This corresponds to the definition of "error" in section 1.2
-     * of the W3C XML 1.0 Recommendation.  For example, a validating
-     * parser would use this callback to report the violation of a
-     * validity constraint.  The default behaviour is to take no
-     * action.</p>
-     *
-     * <p>The SAX parser must continue to provide normal parsing
-     * events after invoking this method: it should still be possible
-     * for the application to process the document through to the end.
-     * If the application cannot do so, then the parser should report
-     * a fatal error even if the XML recommendation does not require
-     * it to do so.</p>
-     *
-     * <p>Filters may use this method to report other, non-XML errors
-     * as well.</p>
-     *
-     * @param exception The error information encapsulated in a
-     *                  SAX parse exception.
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see org.xml.sax.SAXParseException 
-     */
-    public abstract void error (SAXParseException exception)
-	throws SAXException;
-    
-    
-    /**
-     * Receive notification of a non-recoverable error.
-     *
-     * <p><strong>There is an apparent contradiction between the
-     * documentation for this method and the documentation for {@link
-     * org.xml.sax.ContentHandler#endDocument}.  Until this ambiguity
-     * is resolved in a future major release, clients should make no
-     * assumptions about whether endDocument() will or will not be
-     * invoked when the parser has reported a fatalError() or thrown
-     * an exception.</strong></p>
-     *
-     * <p>This corresponds to the definition of "fatal error" in
-     * section 1.2 of the W3C XML 1.0 Recommendation.  For example, a
-     * parser would use this callback to report the violation of a
-     * well-formedness constraint.</p>
-     *
-     * <p>The application must assume that the document is unusable
-     * after the parser has invoked this method, and should continue
-     * (if at all) only for the sake of collecting additional error
-     * messages: in fact, SAX parsers are free to stop reporting any
-     * other events once this method has been invoked.</p>
-     *
-     * @param exception The error information encapsulated in a
-     *                  SAX parse exception.  
-     * @exception org.xml.sax.SAXException Any SAX exception, possibly
-     *            wrapping another exception.
-     * @see org.xml.sax.SAXParseException
-     */
-    public abstract void fatalError (SAXParseException exception)
-	throws SAXException;
-    
-}
-
-// end of ErrorHandler.java
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/Locator.java b/super/nu/validator/htmlparser/translatable/org/xml/sax/Locator.java
deleted file mode 100644
index f8f3484c..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/Locator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// SAX locator interface for document events.
-// http://www.saxproject.org
-// No warranty; no copyright -- use this as you will.
-// $Id: Locator.java,v 1.8 2002/01/30 21:13:47 dbrownell Exp $
-
-package org.xml.sax;
-
-
-/**
- * Interface for associating a SAX event with a document location.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>If a SAX parser provides location information to the SAX
- * application, it does so by implementing this interface and then
- * passing an instance to the application using the content
- * handler's {@link org.xml.sax.ContentHandler#setDocumentLocator
- * setDocumentLocator} method.  The application can use the
- * object to obtain the location of any other SAX event
- * in the XML source document.</p>
- *
- * <p>Note that the results returned by the object will be valid only
- * during the scope of each callback method: the application
- * will receive unpredictable results if it attempts to use the
- * locator at any other time, or after parsing completes.</p>
- *
- * <p>SAX parsers are not required to supply a locator, but they are
- * very strongly encouraged to do so.  If the parser supplies a
- * locator, it must do so before reporting any other document events.
- * If no locator has been set by the time the application receives
- * the {@link org.xml.sax.ContentHandler#startDocument startDocument}
- * event, the application should assume that a locator is not 
- * available.</p>
- *
- * @since SAX 1.0
- * @author David Megginson
- * @version 2.0.1 (sax2r2)
- * @see org.xml.sax.ContentHandler#setDocumentLocator 
- */
-public interface Locator {
-    
-    
-    /**
-     * Return the public identifier for the current document event.
-     *
-     * <p>The return value is the public identifier of the document
-     * entity or of the external parsed entity in which the markup
-     * triggering the event appears.</p>
-     *
-     * @return A string containing the public identifier, or
-     *         null if none is available.
-     * @see #getSystemId
-     */
-    public abstract String getPublicId ();
-    
-    
-    /**
-     * Return the system identifier for the current document event.
-     *
-     * <p>The return value is the system identifier of the document
-     * entity or of the external parsed entity in which the markup
-     * triggering the event appears.</p>
-     *
-     * <p>If the system identifier is a URL, the parser must resolve it
-     * fully before passing it to the application.  For example, a file
-     * name must always be provided as a <em>file:...</em> URL, and other
-     * kinds of relative URI are also resolved against their bases.</p>
-     *
-     * @return A string containing the system identifier, or null
-     *         if none is available.
-     * @see #getPublicId
-     */
-    public abstract String getSystemId ();
-    
-    
-    /**
-     * Return the line number where the current document event ends.
-     * Lines are delimited by line ends, which are defined in
-     * the XML specification.
-     *
-     * <p><strong>Warning:</strong> The return value from the method
-     * is intended only as an approximation for the sake of diagnostics;
-     * it is not intended to provide sufficient information
-     * to edit the character content of the original XML document.
-     * In some cases, these "line" numbers match what would be displayed
-     * as columns, and in others they may not match the source text
-     * due to internal entity expansion.  </p>
-     *
-     * <p>The return value is an approximation of the line number
-     * in the document entity or external parsed entity where the
-     * markup triggering the event appears.</p>
-     *
-     * <p>If possible, the SAX driver should provide the line position 
-     * of the first character after the text associated with the document 
-     * event.  The first line is line 1.</p>
-     *
-     * @return The line number, or -1 if none is available.
-     * @see #getColumnNumber
-     */
-    public abstract int getLineNumber ();
-    
-    
-    /**
-     * Return the column number where the current document event ends.
-     * This is one-based number of Java <code>char</code> values since
-     * the last line end.
-     *
-     * <p><strong>Warning:</strong> The return value from the method
-     * is intended only as an approximation for the sake of diagnostics;
-     * it is not intended to provide sufficient information
-     * to edit the character content of the original XML document.
-     * For example, when lines contain combining character sequences, wide
-     * characters, surrogate pairs, or bi-directional text, the value may
-     * not correspond to the column in a text editor's display. </p>
-     *
-     * <p>The return value is an approximation of the column number
-     * in the document entity or external parsed entity where the
-     * markup triggering the event appears.</p>
-     *
-     * <p>If possible, the SAX driver should provide the line position 
-     * of the first character after the text associated with the document 
-     * event.  The first column in each line is column 1.</p>
-     *
-     * @return The column number, or -1 if none is available.
-     * @see #getLineNumber
-     */
-    public abstract int getColumnNumber ();
-    
-}
-
-// end of Locator.java
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXException.java b/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXException.java
deleted file mode 100644
index 256719ce..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXException.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// SAX exception class.
-// http://www.saxproject.org
-// No warranty; no copyright -- use this as you will.
-// $Id: SAXException.java,v 1.7 2002/01/30 21:13:48 dbrownell Exp $
-
-package org.xml.sax;
-
-/**
- * Encapsulate a general SAX error or warning.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>This class can contain basic error or warning information from
- * either the XML parser or the application: a parser writer or
- * application writer can subclass it to provide additional
- * functionality.  SAX handlers may throw this exception or
- * any exception subclassed from it.</p>
- *
- * <p>If the application needs to pass through other types of
- * exceptions, it must wrap those exceptions in a SAXException
- * or an exception derived from a SAXException.</p>
- *
- * <p>If the parser or application needs to include information about a
- * specific location in an XML document, it should use the
- * {@link org.xml.sax.SAXParseException SAXParseException} subclass.</p>
- *
- * @since SAX 1.0
- * @author David Megginson
- * @version 2.0.1 (sax2r2)
- * @see org.xml.sax.SAXParseException
- */
-public class SAXException extends Exception {
-
-
-    /**
-     * Create a new SAXException.
-     */
-    public SAXException ()
-    {
-	super();
-	this.exception = null;
-    }
-    
-    
-    /**
-     * Create a new SAXException.
-     *
-     * @param message The error or warning message.
-     */
-    public SAXException (String message) {
-	super(message);
-	this.exception = null;
-    }
-    
-    
-    /**
-     * Create a new SAXException wrapping an existing exception.
-     *
-     * <p>The existing exception will be embedded in the new
-     * one, and its message will become the default message for
-     * the SAXException.</p>
-     *
-     * @param e The exception to be wrapped in a SAXException.
-     */
-    public SAXException (Exception e)
-    {
-	super();
-	this.exception = e;
-    }
-    
-    
-    /**
-     * Create a new SAXException from an existing exception.
-     *
-     * <p>The existing exception will be embedded in the new
-     * one, but the new exception will have its own message.</p>
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped in a SAXException.
-     */
-    public SAXException (String message, Exception e)
-    {
-	super(message);
-	this.exception = e;
-    }
-    
-    
-    /**
-     * Return a detail message for this exception.
-     *
-     * <p>If there is an embedded exception, and if the SAXException
-     * has no detail message of its own, this method will return
-     * the detail message from the embedded exception.</p>
-     *
-     * @return The error or warning message.
-     */
-    public String getMessage ()
-    {
-	String message = super.getMessage();
-	
-	if (message == null && exception != null) {
-	    return exception.getMessage();
-	} else {
-	    return message;
-	}
-    }
-    
-    
-    /**
-     * Return the embedded exception, if any.
-     *
-     * @return The embedded exception, or null if there is none.
-     */
-    public Exception getException ()
-    {
-	return exception;
-    }
-
-
-    /**
-     * Override toString to pick up any embedded exception.
-     *
-     * @return A string representation of this exception.
-     */
-    public String toString ()
-    {
-	if (exception != null) {
-	    return exception.toString();
-	} else {
-	    return super.toString();
-	}
-    }
-    
-    
-    
-    //////////////////////////////////////////////////////////////////////
-    // Internal state.
-    //////////////////////////////////////////////////////////////////////
-
-
-    /**
-     * @serial The embedded exception if tunnelling, or null.
-     */    
-    private Exception exception;
-    
-}
-
-// end of SAXException.java
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXParseException.java b/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXParseException.java
deleted file mode 100644
index 1df5e142..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/SAXParseException.java
+++ /dev/null
@@ -1,269 +0,0 @@
-// SAX exception class.
-// http://www.saxproject.org
-// No warranty; no copyright -- use this as you will.
-// $Id: SAXParseException.java,v 1.11 2004/04/21 13:05:02 dmegginson Exp $
-
-package org.xml.sax;
-
-/**
- * Encapsulate an XML parse error or warning.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>This exception may include information for locating the error
- * in the original XML document, as if it came from a {@link Locator}
- * object.  Note that although the application
- * will receive a SAXParseException as the argument to the handlers
- * in the {@link org.xml.sax.ErrorHandler ErrorHandler} interface, 
- * the application is not actually required to throw the exception; 
- * instead, it can simply read the information in it and take a 
- * different action.</p>
- *
- * <p>Since this exception is a subclass of {@link org.xml.sax.SAXException 
- * SAXException}, it inherits the ability to wrap another exception.</p>
- *
- * @since SAX 1.0
- * @author David Megginson
- * @version 2.0.1 (sax2r2)
- * @see org.xml.sax.SAXException
- * @see org.xml.sax.Locator
- * @see org.xml.sax.ErrorHandler
- */
-public class SAXParseException extends SAXException {
-    
-    
-    //////////////////////////////////////////////////////////////////////
-    // Constructors.
-    //////////////////////////////////////////////////////////////////////
-
-
-    /**
-     * Create a new SAXParseException from a message and a Locator.
-     *
-     * <p>This constructor is especially useful when an application is
-     * creating its own exception from within a {@link org.xml.sax.ContentHandler
-     * ContentHandler} callback.</p>
-     *
-     * @param message The error or warning message.
-     * @param locator The locator object for the error or warning (may be
-     *        null).
-     * @see org.xml.sax.Locator
-     */
-    public SAXParseException (String message, Locator locator) {
-	super(message);
-	if (locator != null) {
-	    init(locator.getPublicId(), locator.getSystemId(),
-		 locator.getLineNumber(), locator.getColumnNumber());
-	} else {
-	    init(null, null, -1, -1);
-	}
-    }
-    
-    
-    /**
-     * Wrap an existing exception in a SAXParseException.
-     *
-     * <p>This constructor is especially useful when an application is
-     * creating its own exception from within a {@link org.xml.sax.ContentHandler
-     * ContentHandler} callback, and needs to wrap an existing exception that is not a
-     * subclass of {@link org.xml.sax.SAXException SAXException}.</p>
-     *
-     * @param message The error or warning message, or null to
-     *                use the message from the embedded exception.
-     * @param locator The locator object for the error or warning (may be
-     *        null).
-     * @param e Any exception.
-     * @see org.xml.sax.Locator
-     */
-    public SAXParseException (String message, Locator locator,
-			      Exception e) {
-	super(message, e);
-	if (locator != null) {
-	    init(locator.getPublicId(), locator.getSystemId(),
-		 locator.getLineNumber(), locator.getColumnNumber());
-	} else {
-	    init(null, null, -1, -1);
-	}
-    }
-    
-    
-    /**
-     * Create a new SAXParseException.
-     *
-     * <p>This constructor is most useful for parser writers.</p>
-     *
-     * <p>All parameters except the message are as if
-     * they were provided by a {@link Locator}.  For example, if the
-     * system identifier is a URL (including relative filename), the
-     * caller must resolve it fully before creating the exception.</p>
-     *
-     *
-     * @param message The error or warning message.
-     * @param publicId The public identifier of the entity that generated
-     *                 the error or warning.
-     * @param systemId The system identifier of the entity that generated
-     *                 the error or warning.
-     * @param lineNumber The line number of the end of the text that
-     *                   caused the error or warning.
-     * @param columnNumber The column number of the end of the text that
-     *                     cause the error or warning.
-     */
-    public SAXParseException (String message, String publicId, String systemId,
-			      int lineNumber, int columnNumber)
-    {
-	super(message);
-	init(publicId, systemId, lineNumber, columnNumber);
-    }
-    
-    
-    /**
-     * Create a new SAXParseException with an embedded exception.
-     *
-     * <p>This constructor is most useful for parser writers who
-     * need to wrap an exception that is not a subclass of
-     * {@link org.xml.sax.SAXException SAXException}.</p>
-     *
-     * <p>All parameters except the message and exception are as if
-     * they were provided by a {@link Locator}.  For example, if the
-     * system identifier is a URL (including relative filename), the
-     * caller must resolve it fully before creating the exception.</p>
-     *
-     * @param message The error or warning message, or null to use
-     *                the message from the embedded exception.
-     * @param publicId The public identifier of the entity that generated
-     *                 the error or warning.
-     * @param systemId The system identifier of the entity that generated
-     *                 the error or warning.
-     * @param lineNumber The line number of the end of the text that
-     *                   caused the error or warning.
-     * @param columnNumber The column number of the end of the text that
-     *                     cause the error or warning.
-     * @param e Another exception to embed in this one.
-     */
-    public SAXParseException (String message, String publicId, String systemId,
-			      int lineNumber, int columnNumber, Exception e)
-    {
-	super(message, e);
-	init(publicId, systemId, lineNumber, columnNumber);
-    }
-
-
-    /**
-     * Internal initialization method.
-     *
-     * @param publicId The public identifier of the entity which generated the exception,
-     *        or null.
-     * @param systemId The system identifier of the entity which generated the exception,
-     *        or null.
-     * @param lineNumber The line number of the error, or -1.
-     * @param columnNumber The column number of the error, or -1.
-     */
-    private void init (String publicId, String systemId,
-		       int lineNumber, int columnNumber)
-    {
-	this.publicId = publicId;
-	this.systemId = systemId;
-	this.lineNumber = lineNumber;
-	this.columnNumber = columnNumber;
-    }
-    
-    
-    /**
-     * Get the public identifier of the entity where the exception occurred.
-     *
-     * @return A string containing the public identifier, or null
-     *         if none is available.
-     * @see org.xml.sax.Locator#getPublicId
-     */
-    public String getPublicId ()
-    {
-	return this.publicId;
-    }
-    
-    
-    /**
-     * Get the system identifier of the entity where the exception occurred.
-     *
-     * <p>If the system identifier is a URL, it will have been resolved
-     * fully.</p>
-     *
-     * @return A string containing the system identifier, or null
-     *         if none is available.
-     * @see org.xml.sax.Locator#getSystemId
-     */
-    public String getSystemId ()
-    {
-	return this.systemId;
-    }
-    
-    
-    /**
-     * The line number of the end of the text where the exception occurred.
-     *
-     * <p>The first line is line 1.</p>
-     *
-     * @return An integer representing the line number, or -1
-     *         if none is available.
-     * @see org.xml.sax.Locator#getLineNumber
-     */
-    public int getLineNumber ()
-    {
-	return this.lineNumber;
-    }
-    
-    
-    /**
-     * The column number of the end of the text where the exception occurred.
-     *
-     * <p>The first column in a line is position 1.</p>
-     *
-     * @return An integer representing the column number, or -1
-     *         if none is available.
-     * @see org.xml.sax.Locator#getColumnNumber
-     */
-    public int getColumnNumber ()
-    {
-	return this.columnNumber;
-    }
-    
-    
-    //////////////////////////////////////////////////////////////////////
-    // Internal state.
-    //////////////////////////////////////////////////////////////////////
-
-
-    /**
-     * @serial The public identifier, or null.
-     * @see #getPublicId
-     */    
-    private String publicId;
-
-
-    /**
-     * @serial The system identifier, or null.
-     * @see #getSystemId
-     */
-    private String systemId;
-
-
-    /**
-     * @serial The line number, or -1.
-     * @see #getLineNumber
-     */
-    private int lineNumber;
-
-
-    /**
-     * @serial The column number, or -1.
-     * @see #getColumnNumber
-     */
-    private int columnNumber;
-    
-}
-
-// end of SAXParseException.java
diff --git a/super/nu/validator/htmlparser/translatable/org/xml/sax/package.html b/super/nu/validator/htmlparser/translatable/org/xml/sax/package.html
deleted file mode 100644
index dd7030e2..00000000
--- a/super/nu/validator/htmlparser/translatable/org/xml/sax/package.html
+++ /dev/null
@@ -1,297 +0,0 @@
-<html><head>
-<!-- $Id: package.html,v 1.18 2004/04/21 13:06:01 dmegginson Exp $ -->
-</head><body>
-
-<p> This package provides the core SAX APIs.
-Some SAX1 APIs are deprecated to encourage integration of
-namespace-awareness into designs of new applications
-and into maintenance of existing infrastructure. </p>
-
-<p>See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
-for more information about SAX.</p>
-
-
-<h2> SAX2 Standard Feature Flags </h2>
-
-<p> One of the essential characteristics of SAX2 is that it added
-feature flags which can be used to examine and perhaps modify
-parser modes, in particular modes such as validation.
-Since features are identified by (absolute) URIs, anyone
-can define such features.   
-Currently defined standard feature URIs have the prefix
-<code>http://xml.org/sax/features/</code> before an identifier such as
-<code>validation</code>.  Turn features on or off using
-<em>setFeature</em>.  Those standard identifiers are: </p>
-
-
-<table border="1" cellpadding="3" cellspacing="0" width="100%">
-    <tr align="center" bgcolor="#ccccff">
-	<th>Feature ID</th>
-	<th>Access</th>
-	<th>Default</th>
-	<th>Description</th>
-	</tr>
-
-    <tr>
-	<td>external-general-entities</td>
-	<td><em>read/write</em></td>
-	<td><em>unspecified</em></td>
-	<td> Reports whether this parser processes external
-	    general entities; always true if validating.
-		</td>
-	</tr>
-
-    <tr>
-	<td>external-parameter-entities</td>
-	<td><em>read/write</em></td>
-	<td><em>unspecified</em></td>
-	<td> Reports whether this parser processes external
-	    parameter entities; always true if validating.
-		</td>
-	</tr>
-
-    <tr>
-	<td>is-standalone</td>
-	<td>(parsing) <em>read-only</em>, (not parsing) <em>none</em></td>
-	<td>not applicable</td>
-	<td> May be examined only during a parse, after the
-	    <em>startDocument()</em> callback has been completed; read-only.
-	    The value is true if the document specified standalone="yes" in 
-	    its XML declaration, and otherwise is false.
-		</td>
-	</tr>
-
-    <tr>
-	<td>lexical-handler/parameter-entities</td>
-	<td><em>read/write</em></td>
-	<td><em>unspecified</em></td>
-	<td> A value of "true" indicates that the LexicalHandler will report
-	    the beginning and end of parameter entities.
-		</td>
-	</tr>
-
-    <tr>
-	<td>namespaces</td>
-	<td><em>read/write</em></td>
-	<td>true</td>
-	<td> A value of "true" indicates namespace URIs and unprefixed local names
-	    for element and attribute names will be available.
-		</td>
-	</tr>
-
-    <tr>
-	<td>namespace-prefixes</td>
-	<td><em>read/write</em></td>
-	<td>false</td>
-	<td> A value of "true" indicates that XML qualified names (with prefixes) and
-	    attributes (including <em>xmlns*</em> attributes) will be available.
-		</td>
-	</tr>
-
-    <tr>
-	<td>resolve-dtd-uris</td>
-	<td><em>read/write</em></td>
-	<td><em>true</em></td>
-	<td> A value of "true" indicates that system IDs in declarations will
-	    be absolutized (relative to their base URIs) before reporting.
-	    (That is the default behavior for all SAX2 XML parsers.)
-	    A value of "false" indicates those IDs will not be absolutized;
-	    parsers will provide the base URI from
-	    <em>Locator.getSystemId()</em>.
-	    This applies to system IDs passed in <ul>
-		<li><em>DTDHandler.notationDecl()</em>,
-		<li><em>DTDHandler.unparsedEntityDecl()</em>, and
-		<li><em>DeclHandler.externalEntityDecl()</em>.
-	    </ul>
-	    It does not apply to <em>EntityResolver.resolveEntity()</em>,
-	    which is not used to report declarations, or to
-	    <em>LexicalHandler.startDTD()</em>, which already provides
-	    the non-absolutized URI.
-	    </td>
-	</tr>
-
-    <tr>
-	<td>string-interning</td>
-	<td><em>read/write</em></td>
-	<td><em>unspecified</em></td>
-	<td> Has a value of "true" if all XML names (for elements, prefixes,
-	    attributes, entities, notations, and local names),
-	    as well as Namespace URIs, will have been interned
-	    using <em>java.lang.String.intern</em>. This supports fast
-	    testing of equality/inequality against string constants,
-	    rather than forcing slower calls to <em>String.equals()</em>.
-	    </td>
-	</tr>
-
-    <tr>
-    <td>unicode-normalization-checking</td>
-    <td><em>read/write</em></td>
-    <td><em>false</em></td>
-    <td> Controls whether the parser reports Unicode normalization 
-        errors as described in section 2.13 and Appendix B of the 
-        XML 1.1 Recommendation. If true, Unicode normalization
-        errors are reported using the ErrorHandler.error() callback.
-        Such errors are not fatal in themselves (though, obviously,
-        other Unicode-related encoding errors may be).
-		</td>
-    </tr>
-    
-    <tr>
-	<td>use-attributes2</td>
-	<td><em>read-only</em></td>
-	<td>not applicable</td>
-	<td> Returns "true" if the <em>Attributes</em> objects passed by
-	    this parser in <em>ContentHandler.startElement()</em>
-	    implement the <a href="ext/Attributes2.html"
-	    ><em>org.xml.sax.ext.Attributes2</em></a> interface.
-	    That interface exposes additional DTD-related information,
-	    such as whether the attribute was specified in the
-	    source text rather than defaulted.
-		</td>
-	</tr>
-
-    <tr>
-	<td>use-locator2</td>
-	<td><em>read-only</em></td>
-	<td>not applicable</td>
-	<td> Returns "true" if the <em>Locator</em> objects passed by
-	    this parser in <em>ContentHandler.setDocumentLocator()</em>
-	    implement the <a href="ext/Locator2.html"
-	    ><em>org.xml.sax.ext.Locator2</em></a> interface.
-	    That interface exposes additional entity information,
-	    such as the character encoding and XML version used.
-		</td>
-	</tr>
-
-    <tr>
-	<td>use-entity-resolver2</td>
-	<td><em>read/write</em></td>
-	<td><em>true</em></td>
-	<td> Returns "true" if, when <em>setEntityResolver</em> is given
-	    an object implementing the <a href="ext/EntityResolver2.html"
-	    ><em>org.xml.sax.ext.EntityResolver2</em></a> interface,
-	    those new methods will be used.
-	    Returns "false" to indicate that those methods will not be used.
-		</td>
-	</tr>
-
-    <tr>
-	<td>validation</td>
-	<td><em>read/write</em></td>
-	<td><em>unspecified</em></td>
-	<td> Controls whether the parser is reporting all validity
-	    errors; if true, all external entities will be read.
-		</td>
-	</tr>
-
-    <tr>
-	<td>xmlns-uris</td>
-	<td><em>read/write</em></td>
-	<td><em>false</em></td>
-	<td> Controls whether, when the <em>namespace-prefixes</em> feature
-	    is set, the parser treats namespace declaration attributes as
-	    being in the <em>http://www.w3.org/2000/xmlns/</em> namespace.
-	    By default, SAX2 conforms to the original "Namespaces in XML"
-	    Recommendation, which explicitly states that such attributes are
-	    not in any namespace.
-	    Setting this optional flag to "true" makes the SAX2 events conform to
-	    a later backwards-incompatible revision of that recommendation,
-	    placing those attributes in a namespace.
-		</td>
-	</tr>
-
-    <tr>
-    <td>xml-1.1</td>
-    <td><em>read-only</em></td>
-    <td>not applicable</td>
-    <td> Returns "true" if the parser supports both XML 1.1 and XML 1.0.
-        Returns "false" if the parser supports only XML 1.0.
-		</td>
-    </tr>
-
-</table>
-
-<p> Support for the default values of the
-<em>namespaces</em> and <em>namespace-prefixes</em>
-properties is required.
-Support for any other feature flags is entirely optional.
-</p>
-
-<p> For default values not specified by SAX2,
-each XMLReader implementation specifies its default,
-or may choose not to expose the feature flag.
-Unless otherwise specified here,
-implementations may support changing current values
-of these standard feature flags, but not while parsing.
-</p>
-
-<h2> SAX2 Standard Handler and Property IDs </h2>
-
-<p> For parser interface characteristics that are described
-as objects, a separate namespace is defined.  The
-objects in this namespace are again identified by URI, and
-the standard property URIs have the prefix
-<code>http://xml.org/sax/properties/</code> before an identifier such as
-<code>lexical-handler</code> or
-<code>dom-node</code>.  Manage those properties using
-<em>setProperty()</em>.  Those identifiers are: </p>
-
-<table border="1" cellpadding="3" cellspacing="0" width="100%">
-    <tr align="center" bgcolor="#ccccff">
-	<th>Property ID</th>
-	<th>Description</th>
-	</tr>
-
-    <tr>
-	<td>declaration-handler</td>
-	<td> Used to see most DTD declarations except those treated
-	    as lexical ("document element name is ...") or which are
-	    mandatory for all SAX parsers (<em>DTDHandler</em>).
-	    The Object must implement <a href="ext/DeclHandler.html"
-	    ><em>org.xml.sax.ext.DeclHandler</em></a>.
-	    </td>
-	</tr>
-
-    <tr>
-        <td>document-xml-version</td>
-        <td> May be examined only during a parse, after the startDocument()
-            callback has been completed; read-only. This property is a 
-            literal string describing the actual XML version of the document, 
-            such as "1.0" or "1.1".
-            </td>
-        </tr>
-    
-    <tr>
-	<td>dom-node</td>
-	<td> For "DOM Walker" style parsers, which ignore their
-	    <em>parser.parse()</em> parameters, this is used to
-	    specify the DOM (sub)tree being walked by the parser.
-	    The Object must implement the
-	    <em>org.w3c.dom.Node</em> interface.
-	    </td>
-	</tr>
-
-    <tr>
-	<td>lexical-handler</td>
-	<td> Used to see some syntax events that are essential in some
-	    applications:  comments, CDATA delimiters, selected general
-	    entity inclusions, and the start and end of the DTD
-	    (and declaration of document element name).
-	    The Object must implement <a href="ext/LexicalHandler.html"
-	    ><em>org.xml.sax.ext.LexicalHandler</em></a>.
-	    </td>
-	</tr>
-
-    <tr>
-	<td>xml-string</td>
-	<td> Readable only during a parser callback, this exposes a <b>TBS</b>
-	    chunk of characters responsible for the current event. </td>
-	</tr>
-
-</table>
-
-<p> All of these standard properties are optional;
-XMLReader implementations need not support them.
-</p>
-
-</body></html>
\ No newline at end of file
diff --git a/test-src/nu/validator/htmlparser/tools/HTML2HTML.java b/test-src/nu/validator/htmlparser/tools/HTML2HTML.java
deleted file mode 100644
index 5e2cf1f5..00000000
--- a/test-src/nu/validator/htmlparser/tools/HTML2HTML.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.sax.HtmlParser;
-import nu.validator.htmlparser.sax.HtmlSerializer;
-import nu.validator.htmlparser.sax.XmlSerializer;
-import nu.validator.htmlparser.test.SystemErrErrorHandler;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-public class HTML2HTML {
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) throws SAXException,
-            ParserConfigurationException, MalformedURLException, IOException,
-            TransformerException {
-        InputStream in;
-        OutputStream out;
-
-        switch (args.length) {
-            case 0:
-                in = System.in;
-                out = System.out;
-                break;
-            case 1:
-                in = new FileInputStream(args[0]);
-                out = System.out;
-                break;
-            case 2:
-                in = new FileInputStream(args[0]);
-                out = new FileOutputStream(args[1]);
-                break;
-            default:
-                System.err.println("Too many arguments. No arguments to use stdin/stdout. One argument to reading from file and write to stdout. Two arguments to read from first file and write to second.");
-                System.exit(1);
-                return;
-        }
-
-        ContentHandler serializer = new HtmlSerializer(out);
-
-        HtmlParser parser = new HtmlParser(XmlViolationPolicy.ALLOW);
-
-        parser.setErrorHandler(new SystemErrErrorHandler());
-        parser.setContentHandler(serializer);
-        parser.setProperty("http://xml.org/sax/properties/lexical-handler",
-                serializer);
-        parser.parse(new InputSource(in));
-        out.flush();
-        out.close();
-    }
-}
diff --git a/test-src/nu/validator/htmlparser/tools/HTML2XML.java b/test-src/nu/validator/htmlparser/tools/HTML2XML.java
deleted file mode 100644
index 57666f93..00000000
--- a/test-src/nu/validator/htmlparser/tools/HTML2XML.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.sax.HtmlParser;
-import nu.validator.htmlparser.sax.XmlSerializer;
-import nu.validator.htmlparser.test.SystemErrErrorHandler;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-public class HTML2XML {
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) throws SAXException,
-            ParserConfigurationException, MalformedURLException, IOException,
-            TransformerException {
-        InputStream in;
-        OutputStream out;
-
-        switch (args.length) {
-            case 0:
-                in = System.in;
-                out = System.out;
-                break;
-            case 1:
-                in = new FileInputStream(args[0]);
-                out = System.out;
-                break;
-            case 2:
-                in = new FileInputStream(args[0]);
-                out = new FileOutputStream(args[1]);
-                break;
-            default:
-                System.err.println("Too many arguments. No arguments to use stdin/stdout. One argument to reading from file and write to stdout. Two arguments to read from first file and write to second.");
-                System.exit(1);
-                return;
-        }
-
-        ContentHandler serializer = new XmlSerializer(out);
-
-        HtmlParser parser = new HtmlParser(XmlViolationPolicy.ALTER_INFOSET);
-
-        parser.setErrorHandler(new SystemErrErrorHandler());
-        parser.setContentHandler(serializer);
-        parser.setProperty("http://xml.org/sax/properties/lexical-handler",
-                serializer);
-        parser.parse(new InputSource(in));
-        out.flush();
-        out.close();
-    }
-}
diff --git a/test-src/nu/validator/htmlparser/tools/XML2HTML.java b/test-src/nu/validator/htmlparser/tools/XML2HTML.java
deleted file mode 100644
index dad89a5b..00000000
--- a/test-src/nu/validator/htmlparser/tools/XML2HTML.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.TransformerException;
-
-import nu.validator.htmlparser.sax.HtmlSerializer;
-import nu.validator.htmlparser.sax.XmlSerializer;
-import nu.validator.htmlparser.test.SystemErrErrorHandler;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-public class XML2HTML {
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) throws SAXException,
-            ParserConfigurationException, MalformedURLException, IOException,
-            TransformerException {
-        InputStream in;
-        OutputStream out;
-
-        switch (args.length) {
-            case 0:
-                in = System.in;
-                out = System.out;
-                break;
-            case 1:
-                in = new FileInputStream(args[0]);
-                out = System.out;
-                break;
-            case 2:
-                in = new FileInputStream(args[0]);
-                out = new FileOutputStream(args[1]);
-                break;
-            default:
-                System.err.println("Too many arguments. No arguments to use stdin/stdout. One argument to reading from file and write to stdout. Two arguments to read from first file and write to second.");
-                System.exit(1);
-                return;
-        }
-
-        ContentHandler serializer = new HtmlSerializer(out);
-        
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        XMLReader parser = factory.newSAXParser().getXMLReader();
-        parser.setErrorHandler(new SystemErrErrorHandler());
-        parser.setContentHandler(serializer);
-        parser.setProperty("http://xml.org/sax/properties/lexical-handler",
-                serializer);
-        parser.parse(new InputSource(in));
-        out.flush();
-        out.close();
-    }
-}
diff --git a/test-src/nu/validator/htmlparser/tools/XML2XML.java b/test-src/nu/validator/htmlparser/tools/XML2XML.java
deleted file mode 100644
index 2f6aa24d..00000000
--- a/test-src/nu/validator/htmlparser/tools/XML2XML.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2008 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.TransformerException;
-
-import nu.validator.htmlparser.sax.NameCheckingXmlSerializer;
-import nu.validator.htmlparser.sax.XmlSerializer;
-import nu.validator.htmlparser.test.SystemErrErrorHandler;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-public class XML2XML {
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) throws SAXException,
-            ParserConfigurationException, MalformedURLException, IOException,
-            TransformerException {
-        InputStream in;
-        OutputStream out;
-
-        switch (args.length) {
-            case 0:
-                in = System.in;
-                out = System.out;
-                break;
-            case 1:
-                in = new FileInputStream(args[0]);
-                out = System.out;
-                break;
-            case 2:
-                in = new FileInputStream(args[0]);
-                out = new FileOutputStream(args[1]);
-                break;
-            default:
-                System.err.println("Too many arguments. No arguments to use stdin/stdout. One argument to reading from file and write to stdout. Two arguments to read from first file and write to second.");
-                System.exit(1);
-                return;
-        }
-
-        ContentHandler serializer = new NameCheckingXmlSerializer(out);
-        
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        XMLReader parser = factory.newSAXParser().getXMLReader();
-        parser.setErrorHandler(new SystemErrErrorHandler());
-        parser.setContentHandler(serializer);
-        parser.setProperty("http://xml.org/sax/properties/lexical-handler",
-                serializer);
-        parser.parse(new InputSource(in));
-        out.flush();
-        out.close();
-    }
-}
diff --git a/test-src/nu/validator/htmlparser/tools/XSLT4HTML5.java b/test-src/nu/validator/htmlparser/tools/XSLT4HTML5.java
deleted file mode 100644
index 05d8193c..00000000
--- a/test-src/nu/validator/htmlparser/tools/XSLT4HTML5.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2007 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;
-
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.dom.HtmlDocumentBuilder;
-import nu.validator.htmlparser.sax.HtmlParser;
-import nu.validator.htmlparser.sax.HtmlSerializer;
-import nu.validator.htmlparser.sax.XmlSerializer;
-import nu.validator.htmlparser.test.SystemErrErrorHandler;
-
-import org.w3c.dom.Document;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
-
-public class XSLT4HTML5 {
-
-    private enum Mode {
-        STREAMING_SAX, BUFFERED_SAX, DOM,
-    }
-
-    private static final String TEMPLATE = "--template=";
-
-    private static final String INPUT_HTML = "--input-html=";
-
-    private static final String INPUT_XML = "--input-xml=";
-
-    private static final String OUTPUT_HTML = "--output-html=";
-
-    private static final String OUTPUT_XML = "--output-xml=";
-
-    private static final String MODE = "--mode=";
-
-    /**
-     * @param args
-     * @throws ParserConfigurationException 
-     * @throws SAXException 
-     * @throws IOException 
-     * @throws MalformedURLException 
-     * @throws TransformerException 
-     */
-    public static void main(String[] args) throws SAXException,
-            ParserConfigurationException, MalformedURLException, IOException, TransformerException {
-        if (args.length == 0) {
-            System.out.println("--template=file --input-[html|xml]=file --output-[html|xml]=file --mode=[sax-streaming|sax-buffered|dom]");
-            System.exit(0);
-        }
-        String template = null;
-        String input = null;
-        boolean inputHtml = false;
-        String output = null;
-        boolean outputHtml = false;
-        Mode mode = null;
-        for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.startsWith(TEMPLATE)) {
-                if (template == null) {
-                    template = arg.substring(TEMPLATE.length());
-                } else {
-                    System.err.println("Tried to set template twice.");
-                    System.exit(1);
-                }
-            } else if (arg.startsWith(INPUT_HTML)) {
-                if (input == null) {
-                    input = arg.substring(INPUT_HTML.length());
-                    inputHtml = true;
-                } else {
-                    System.err.println("Tried to set input twice.");
-                    System.exit(2);
-                }
-            } else if (arg.startsWith(INPUT_XML)) {
-                if (input == null) {
-                    input = arg.substring(INPUT_XML.length());
-                    inputHtml = false;
-                } else {
-                    System.err.println("Tried to set input twice.");
-                    System.exit(2);
-                }
-            } else if (arg.startsWith(OUTPUT_HTML)) {
-                if (output == null) {
-                    output = arg.substring(OUTPUT_HTML.length());
-                    outputHtml = true;
-                } else {
-                    System.err.println("Tried to set output twice.");
-                    System.exit(3);
-                }
-            } else if (arg.startsWith(OUTPUT_XML)) {
-                if (output == null) {
-                    output = arg.substring(OUTPUT_XML.length());
-                    outputHtml = false;
-                } else {
-                    System.err.println("Tried to set output twice.");
-                    System.exit(3);
-                }
-            } else if (arg.startsWith(MODE)) {
-                if (mode == null) {
-                    String modeStr = arg.substring(MODE.length());
-                    if ("dom".equals(modeStr)) {
-                        mode = Mode.DOM;
-                    } else if ("sax-buffered".equals(modeStr)) {
-                        mode = Mode.BUFFERED_SAX;
-                    } else if ("sax-streaming".equals(modeStr)) {
-                        mode = Mode.STREAMING_SAX;
-                    } else {
-                        System.err.println("Unrecognized mode.");
-                        System.exit(5);
-                    }
-                } else {
-                    System.err.println("Tried to set mode twice.");
-                    System.exit(4);
-                }
-            }
-        }
-
-        if (template == null) {
-            System.err.println("No template specified.");
-            System.exit(6);
-        }
-        if (input == null) {
-            System.err.println("No input specified.");
-            System.exit(7);
-        }
-        if (output == null) {
-            System.err.println("No output specified.");
-            System.exit(8);
-        }
-        if (mode == null) {
-            mode = Mode.BUFFERED_SAX;
-        }
-        
-        SystemErrErrorHandler errorHandler = new SystemErrErrorHandler();
-
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        XMLReader reader = factory.newSAXParser().getXMLReader();
-        reader.setErrorHandler(errorHandler);
-
-        SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
-        transformerFactory.setErrorListener(errorHandler);
-        TemplatesHandler templatesHandler = transformerFactory.newTemplatesHandler();
-        reader.setContentHandler(templatesHandler);
-        reader.parse(new File(template).toURI().toASCIIString());
-
-        Templates templates = templatesHandler.getTemplates();
-
-        FileOutputStream outputStream = new FileOutputStream(output);
-        ContentHandler serializer;
-        if (outputHtml) {
-            serializer = new HtmlSerializer(outputStream);
-        } else {
-            serializer = new XmlSerializer(outputStream);
-        }
-        SAXResult result = new SAXResult(new XmlnsDropper(serializer));
-        result.setLexicalHandler((LexicalHandler) serializer);
-
-        if (mode == Mode.DOM) {
-            Document inputDoc;
-            DocumentBuilder builder;
-            if (inputHtml) {
-                builder = new HtmlDocumentBuilder(XmlViolationPolicy.ALTER_INFOSET);
-            } else {
-                DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-                factory.setNamespaceAware(true);
-                try {
-                    builder = builderFactory.newDocumentBuilder();
-                } catch (ParserConfigurationException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-            inputDoc = builder.parse(new File(input));
-            DOMSource inputSource = new DOMSource(inputDoc,
-                    new File(input).toURI().toASCIIString());
-            Transformer transformer = templates.newTransformer();
-            transformer.setErrorListener(errorHandler);
-            transformer.transform(inputSource, result);
-        } else {
-            if (inputHtml) {
-                reader = new HtmlParser(XmlViolationPolicy.ALTER_INFOSET);
-                if (mode == Mode.STREAMING_SAX) {
-                    reader.setProperty("http://validator.nu/properties/streamability-violation-policy", XmlViolationPolicy.FATAL);
-                }
-            }
-            TransformerHandler transformerHandler = transformerFactory.newTransformerHandler(templates);
-            transformerHandler.setResult(result);
-            reader.setErrorHandler(errorHandler);
-            reader.setContentHandler(transformerHandler);
-            reader.setProperty("http://xml.org/sax/properties/lexical-handler", transformerHandler);
-            reader.parse(new File(input).toURI().toASCIIString());
-        }
-        outputStream.flush();
-        outputStream.close();
-    }
-
-}
diff --git a/test-src/nu/validator/htmlparser/tools/XSLT4HTML5XOM.java b/test-src/nu/validator/htmlparser/tools/XSLT4HTML5XOM.java
deleted file mode 100644
index b364cc52..00000000
--- a/test-src/nu/validator/htmlparser/tools/XSLT4HTML5XOM.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2007 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-import nu.validator.htmlparser.sax.HtmlSerializer;
-import nu.validator.htmlparser.xom.HtmlBuilder;
-import nu.xom.Builder;
-import nu.xom.Document;
-import nu.xom.Element;
-import nu.xom.Nodes;
-import nu.xom.ParsingException;
-import nu.xom.Serializer;
-import nu.xom.ValidityException;
-import nu.xom.converters.SAXConverter;
-import nu.xom.xslt.XSLException;
-import nu.xom.xslt.XSLTransform;
-
-import org.xml.sax.SAXException;
-
-public class XSLT4HTML5XOM {
-
-    private static final String TEMPLATE = "--template=";
-
-    private static final String INPUT_HTML = "--input-html=";
-
-    private static final String INPUT_XML = "--input-xml=";
-
-    private static final String OUTPUT_HTML = "--output-html=";
-
-    private static final String OUTPUT_XML = "--output-xml=";
-
-    /**
-     * @param args
-     * @throws IOException 
-     * @throws ParsingException 
-     * @throws ValidityException 
-     * @throws XSLException 
-     * @throws SAXException 
-     */
-    public static void main(String[] args) throws ValidityException,
-            ParsingException, IOException, XSLException, SAXException {
-        if (args.length == 0) {
-            System.out.println("--template=file --input-[html|xml]=file --output-[html|xml]=file --mode=[sax-streaming|sax-buffered|dom]");
-            System.exit(0);
-        }
-        String template = null;
-        String input = null;
-        boolean inputHtml = false;
-        String output = null;
-        boolean outputHtml = false;
-        for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.startsWith(TEMPLATE)) {
-                if (template == null) {
-                    template = arg.substring(TEMPLATE.length());
-                } else {
-                    System.err.println("Tried to set template twice.");
-                    System.exit(1);
-                }
-            } else if (arg.startsWith(INPUT_HTML)) {
-                if (input == null) {
-                    input = arg.substring(INPUT_HTML.length());
-                    inputHtml = true;
-                } else {
-                    System.err.println("Tried to set input twice.");
-                    System.exit(2);
-                }
-            } else if (arg.startsWith(INPUT_XML)) {
-                if (input == null) {
-                    input = arg.substring(INPUT_XML.length());
-                    inputHtml = false;
-                } else {
-                    System.err.println("Tried to set input twice.");
-                    System.exit(2);
-                }
-            } else if (arg.startsWith(OUTPUT_HTML)) {
-                if (output == null) {
-                    output = arg.substring(OUTPUT_HTML.length());
-                    outputHtml = true;
-                } else {
-                    System.err.println("Tried to set output twice.");
-                    System.exit(3);
-                }
-            } else if (arg.startsWith(OUTPUT_XML)) {
-                if (output == null) {
-                    output = arg.substring(OUTPUT_XML.length());
-                    outputHtml = false;
-                } else {
-                    System.err.println("Tried to set output twice.");
-                    System.exit(3);
-                }
-            }
-        }
-
-        if (template == null) {
-            System.err.println("No template specified.");
-            System.exit(6);
-        }
-        if (input == null) {
-            System.err.println("No input specified.");
-            System.exit(7);
-        }
-        if (output == null) {
-            System.err.println("No output specified.");
-            System.exit(8);
-        }
-
-        Builder builder = new Builder();
-
-        Document transformationDoc = builder.build(new File(template));
-
-        XSLTransform transform = new XSLTransform(transformationDoc);
-
-        FileOutputStream outputStream = new FileOutputStream(output);
-
-        Document inputDoc;
-        if (inputHtml) {
-            builder = new HtmlBuilder(XmlViolationPolicy.ALTER_INFOSET);
-        }
-        inputDoc = builder.build(new File(input));
-        Nodes result = transform.transform(inputDoc);
-        Document outputDoc = new Document((Element) result.get(0));
-        if (outputHtml) {
-            HtmlSerializer htmlSerializer = new HtmlSerializer(outputStream);
-            SAXConverter converter = new SAXConverter(htmlSerializer);
-            converter.setLexicalHandler(htmlSerializer);
-            converter.convert(outputDoc);
-        } else {
-            Serializer serializer = new Serializer(outputStream);
-            serializer.write(outputDoc);
-        }
-        outputStream.flush();
-        outputStream.close();
-    }
-
-}
diff --git a/test-src/nu/validator/htmlparser/tools/XmlnsDropper.java b/test-src/nu/validator/htmlparser/tools/XmlnsDropper.java
deleted file mode 100644
index 0e6d4b1c..00000000
--- a/test-src/nu/validator/htmlparser/tools/XmlnsDropper.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.tools;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-/**
- * Quick and dirty hack to work around Xalan xmlns weirdness.
- * 
- * @version $Id$
- * @author hsivonen
- */
-class XmlnsDropper implements ContentHandler {
-
-    private final ContentHandler delegate;
-
-    /**
-     * @param delegate
-     */
-    public XmlnsDropper(final ContentHandler delegate) {
-        this.delegate = delegate;
-    }
-
-    /**
-     * @param ch
-     * @param start
-     * @param length
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
-     */
-    public void characters(char[] ch, int start, int length) throws SAXException {
-        delegate.characters(ch, start, length);
-    }
-
-    /**
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#endDocument()
-     */
-    public void endDocument() throws SAXException {
-        delegate.endDocument();
-    }
-
-    /**
-     * @param uri
-     * @param localName
-     * @param qName
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
-     */
-    public void endElement(String uri, String localName, String qName) throws SAXException {
-        delegate.endElement(uri, localName, qName);
-    }
-
-    /**
-     * @param prefix
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
-     */
-    public void endPrefixMapping(String prefix) throws SAXException {
-        delegate.endPrefixMapping(prefix);
-    }
-
-    /**
-     * @param ch
-     * @param start
-     * @param length
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
-     */
-    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
-        delegate.ignorableWhitespace(ch, start, length);
-    }
-
-    /**
-     * @param target
-     * @param data
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
-     */
-    public void processingInstruction(String target, String data) throws SAXException {
-        delegate.processingInstruction(target, data);
-    }
-
-    /**
-     * @param locator
-     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
-     */
-    public void setDocumentLocator(Locator locator) {
-        delegate.setDocumentLocator(locator);
-    }
-
-    /**
-     * @param name
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
-     */
-    public void skippedEntity(String name) throws SAXException {
-        delegate.skippedEntity(name);
-    }
-
-    /**
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#startDocument()
-     */
-    public void startDocument() throws SAXException {
-        delegate.startDocument();
-    }
-
-    /**
-     * @param uri
-     * @param localName
-     * @param qName
-     * @param atts
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
-     */
-    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
-        AttributesImpl ai = new AttributesImpl();
-        for (int i = 0; i < atts.getLength(); i++) {
-            String u = atts.getURI(i);
-            String t = atts.getType(i);
-            String v = atts.getValue(i);
-            String n = atts.getLocalName(i);
-            String q = atts.getQName(i);
-            if (q != null) {
-                if ("xmlns".equals(q) || q.startsWith("xmlns:")) {
-                    continue;
-                }
-            }
-            ai.addAttribute(u, n, q, t, v); 
-        }
-        delegate.startElement(uri, localName, qName, ai);
-    }
-
-    /**
-     * @param prefix
-     * @param uri
-     * @throws SAXException
-     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
-     */
-    public void startPrefixMapping(String prefix, String uri) throws SAXException {
-        delegate.startPrefixMapping(prefix, uri);
-    }
-    
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java
deleted file mode 100644
index 98a0226e..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.util.List;
-
-import japa.parser.ast.expr.AnnotationExpr;
-import japa.parser.ast.expr.MarkerAnnotationExpr;
-import japa.parser.ast.type.ReferenceType;
-import japa.parser.ast.visitor.VoidVisitorAdapter;
-
-public class AnnotationHelperVisitor<T> extends VoidVisitorAdapter<T> {
-
-    protected List<AnnotationExpr> currentAnnotations;
-
-    protected boolean nsUri() {
-        return hasAnnotation("NsUri");
-    }
-
-    protected boolean prefix() {
-        return hasAnnotation("Prefix");
-    }
-
-    protected boolean local() {
-        return hasAnnotation("Local");
-    }
-
-    protected boolean literal() {
-        return hasAnnotation("Literal");
-    }
-
-    protected boolean inline() {
-        return hasAnnotation("Inline");
-    }
-
-    protected boolean noLength() {
-        return hasAnnotation("NoLength");
-    }
-
-    protected boolean unsigned() {
-        return hasAnnotation("Unsigned");
-    }
-
-    protected boolean auto() {
-        return hasAnnotation("Auto");
-    }
-
-    protected boolean virtual() {
-        return hasAnnotation("Virtual");
-    }
-
-    protected boolean override() {
-        return hasAnnotation("Override");
-    }
-
-    protected boolean isConst() {
-        return hasAnnotation("Const");
-    }
-
-    protected boolean characterName() {
-        return hasAnnotation("CharacterName");
-    }
-
-    protected boolean creator() {
-        return hasAnnotation("Creator");
-    }
-
-    protected boolean htmlCreator() {
-        return hasAnnotation("HtmlCreator");
-    }
-
-    protected boolean svgCreator() {
-        return hasAnnotation("SvgCreator");
-    }
-
-    private boolean hasAnnotation(String anno) {
-        if (currentAnnotations == null) {
-            return false;
-        }
-        for (AnnotationExpr ann : currentAnnotations) {
-            if (ann instanceof MarkerAnnotationExpr) {
-                MarkerAnnotationExpr marker = (MarkerAnnotationExpr) ann;
-                if (marker.getName().getName().equals(anno)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    protected Type convertType(japa.parser.ast.type.Type type, int modifiers) {
-        if (type instanceof ReferenceType) {
-            ReferenceType referenceType = (ReferenceType) type;
-            return new Type(convertTypeName(referenceType.getType().toString()), referenceType.getArrayCount(), noLength(), modifiers);
-        } else {
-            return new Type(convertTypeName(type.toString()), 0, false, modifiers);
-        }
-    }
-
-    private String convertTypeName(String name) {
-        if ("String".equals(name)) {
-            if (local()) {
-                return "@Local";
-            }
-            if (nsUri()) {
-                return "@NsUri";
-            }
-            if (prefix()) {
-                return "@Prefix";
-            }
-            if (literal()) {
-                return "@Literal";
-            }
-            if (auto()) {
-                return "@Auto";
-            }
-            if (characterName()) {
-                return "@CharacterName";
-            }
-        }
-        return name;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/CppOnlyInputStream.java b/translator-src/nu/validator/htmlparser/cpptranslate/CppOnlyInputStream.java
deleted file mode 100644
index 587b8160..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/CppOnlyInputStream.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class CppOnlyInputStream extends InputStream {
-
-    private static final String DROP = "// CPPONLY:";
-    
-    private final InputStream delegate;
-    
-    public CppOnlyInputStream(InputStream delegate) {
-        this.delegate = new BufferedInputStream(delegate);
-    }
-
-    @Override public int read() throws IOException {
-        int c = delegate.read();
-        if (c == DROP.charAt(0)) {
-            delegate.mark(DROP.length());
-            for (int i = 1; i < DROP.length(); ++i) {
-                int d = delegate.read();
-                if (d != DROP.charAt(i)) {
-                    delegate.reset();
-                    return c;
-                }
-            }
-            return delegate.read();
-        }
-        return c;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java b/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java
deleted file mode 100644
index d75f8fe0..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008-2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class CppTypes {
-
-    /* Please note we aren't looking for the following Atom definitions:
-       PseudoElementAtom or NonInheritingAnonBoxAtom or InheritingAnonBoxAtom */
-    private static final Pattern ATOM_DEF = Pattern.compile("^\\s*Atom\\(\"([^,]+)\",\\s*\"([^\"]*)\"\\).*$");
-
-    private static Set<String> reservedWords = new HashSet<String>();
-
-    static {
-        reservedWords.add("small");
-        reservedWords.add("for");
-        reservedWords.add("false");
-        reservedWords.add("true");
-        reservedWords.add("default");
-        reservedWords.add("class");
-        reservedWords.add("switch");
-        reservedWords.add("union");
-        reservedWords.add("template");
-        reservedWords.add("int");
-        reservedWords.add("char");
-        reservedWords.add("operator");
-        reservedWords.add("or");
-        reservedWords.add("and");
-        reservedWords.add("not");
-        reservedWords.add("xor");
-        reservedWords.add("unicode");
-    }
-
-	private static final String[] TREE_BUILDER_INCLUDES = { "nsContentUtils", "nsAtom", "nsHtml5AtomTable",
-			"nsHtml5String", "nsNameSpaceManager", "nsIContent", "nsTraceRefcnt", "jArray", "nsHtml5DocumentMode",
-			"nsHtml5ArrayCopy", "nsHtml5Parser", "nsGkAtoms", "nsHtml5TreeOperation", "nsHtml5StateSnapshot",
-			"nsHtml5StackNode", "nsHtml5TreeOpExecutor", "nsHtml5StreamParser", "nsAHtml5TreeBuilderState",
-			"nsHtml5Highlighter", "nsHtml5PlainTextUtils", "nsHtml5ViewSourceUtils", "mozilla/ImportScanner",
-			"mozilla/Likely", "nsIContentHandle", "nsHtml5OplessBuilder", };
-
-    private static final String[] TOKENIZER_INCLUDES = { "nsAtom",
-            "nsHtml5AtomTable", "nsHtml5String", "nsIContent", "nsTraceRefcnt",
-            "jArray", "nsHtml5DocumentMode", "nsHtml5ArrayCopy",
-            "nsHtml5NamedCharacters", "nsHtml5NamedCharactersAccel",
-            "nsGkAtoms", "nsAHtml5TreeBuilderState", "nsHtml5Macros",
-            "nsHtml5Highlighter", "nsHtml5TokenizerLoopPolicies" };
-
-    private static final String[] INCLUDES = { "nsAtom", "nsHtml5AtomTable",
-            "nsHtml5String", "nsNameSpaceManager", "nsIContent",
-            "nsTraceRefcnt", "jArray", "nsHtml5ArrayCopy",
-            "nsAHtml5TreeBuilderState", "nsGkAtoms", "nsHtml5ByteReadable",
-            "nsHtml5Macros", "nsIContentHandle", "nsHtml5Portability",
-            "nsHtml5ContentCreatorFunction"};
-
-    private static final String[] OTHER_DECLATIONS = {};
-
-    private static final String[] TREE_BUILDER_OTHER_DECLATIONS = {};
-
-    private static final String[] NAMED_CHARACTERS_INCLUDES = { "jArray",
-            "nscore", "nsDebug", "mozilla/Logging", "nsMemory" };
-
-    private static final String[] FORWARD_DECLARATIONS = { "nsHtml5StreamParser" };
-
-    private static final String[] CLASSES_THAT_NEED_SUPPLEMENT = {
-            "MetaScanner", "Tokenizer", "TreeBuilder", "UTF16Buffer", };
-
-    private static final String[] STATE_LOOP_POLICIES = {
-            "nsHtml5ViewSourcePolicy", "nsHtml5SilentPolicy" };
-
-    private final Map<String, String> atomMap = new HashMap<String, String>();
-
-    private final Writer atomWriter;
-
-    public CppTypes(File atomList, File generatedAtomFile) {
-        if (atomList == null) {
-            atomWriter = null;
-        } else {
-            try {
-                ingestAtoms(atomList);
-                atomWriter = new OutputStreamWriter(new FileOutputStream(
-                        generatedAtomFile), "utf-8");
-                this.start();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    private void ingestAtoms(File atomList) throws IOException {
-        // This doesn't need to be efficient, so let's make it easy to write.
-        BufferedReader atomReader = new BufferedReader(
-                new InputStreamReader(new FileInputStream(atomList), "utf-8"));
-        try {
-            String line;
-            boolean startedParsing = false;
-            while ((line = atomReader.readLine()) != null) {
-                // only start parsing lines after this comment
-                if (line.trim().startsWith("# START ATOMS")) {
-                    startedParsing = true;
-                } else if (!startedParsing) {
-                    continue;
-                }
-                // stop parsing lines after this comment
-                if (line.trim().startsWith("# END ATOMS")) {
-                    return;
-                }
-                if (!line.trim().startsWith("Atom")) {
-                    continue;
-                }
-                Matcher m = ATOM_DEF.matcher(line);
-                if (!m.matches()) {
-                    throw new RuntimeException("Malformed atom definition: " + line);
-                }
-                atomMap.put(m.group(2), m.group(1));
-            }
-            throw new RuntimeException(
-                    "Atom list did not have a marker for generated section.");
-        } finally {
-            atomReader.close();
-        }
-    }
-
-    public void start() {
-        try {
-
-            if (atomWriter != null) {
-                atomWriter.write("# THIS FILE IS GENERATED BY THE HTML PARSER TRANSLATOR AND WILL BE OVERWRITTEN!\n");
-                atomWriter.write("from Atom import Atom\n\n");
-                atomWriter.write("HTML_PARSER_ATOMS = [\n");
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void finished() {
-        try {
-            if (atomWriter != null) {
-                atomWriter.write("]\n");
-                atomWriter.flush();
-                atomWriter.close();
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public String classPrefix() {
-        return "nsHtml5";
-    }
-
-    public String booleanType() {
-        return "bool";
-    }
-
-    public String byteType() {
-        return "int8_t";
-    }
-
-    public String charType() {
-        return "char16_t";
-    }
-
-    /**
-     * Only used for named characters.
-     *
-     * @return
-     */
-    public String unsignedShortType() {
-        return "uint16_t";
-    }
-
-    public String intType() {
-        return "int32_t";
-    }
-
-    public String unsignedIntType() {
-        return "uint32_t";
-    }
-
-    public String stringType() {
-        return "nsHtml5String";
-    }
-
-    public String weakLocalType() {
-        return "nsAtom*";
-    }
-
-    public String localType() {
-        return "RefPtr<nsAtom>";
-    }
-
-    public String prefixType() {
-        return "nsStaticAtom*";
-    }
-
-    public String nsUriType() {
-        return "int32_t";
-    }
-
-    public String falseLiteral() {
-        return "false";
-    }
-
-    public String trueLiteral() {
-        return "true";
-    }
-
-    public String nullLiteral() {
-        return "nullptr";
-    }
-
-    public String encodingDeclarationHandlerType() {
-        return "nsHtml5StreamParser*";
-    }
-
-    public String nodeType() {
-        return "nsIContentHandle*";
-    }
-
-    public String htmlCreatorType() {
-        return "mozilla::dom::HTMLContentCreatorFunction";
-    }
-
-    public String svgCreatorType() {
-        return "mozilla::dom::SVGContentCreatorFunction";
-    }
-
-    public String creatorType() {
-        return "nsHtml5ContentCreatorFunction";
-    }
-
-    public String xhtmlNamespaceLiteral() {
-        return "kNameSpaceID_XHTML";
-    }
-
-    public String svgNamespaceLiteral() {
-        return "kNameSpaceID_SVG";
-    }
-
-    public String xmlnsNamespaceLiteral() {
-        return "kNameSpaceID_XMLNS";
-    }
-
-    public String xmlNamespaceLiteral() {
-        return "kNameSpaceID_XML";
-    }
-
-    public String noNamespaceLiteral() {
-        return "kNameSpaceID_None";
-    }
-
-    public String xlinkNamespaceLiteral() {
-        return "kNameSpaceID_XLink";
-    }
-
-    public String mathmlNamespaceLiteral() {
-        return "kNameSpaceID_MathML";
-    }
-
-    public String arrayTemplate() {
-        return "jArray";
-    }
-
-    public String autoArrayTemplate() {
-        return "autoJArray";
-    }
-
-    public String localForLiteral(String literal) {
-        String atom = atomMap.get(literal);
-        if (atom == null) {
-            atom = createAtomName(literal);
-            atomMap.put(literal, atom);
-            if (atomWriter != null) {
-                try {
-                    atomWriter.write("    # ATOM GENERATED BY HTML PARSER TRANSLATOR (WILL BE AUTOMATICALLY OVERWRITTEN):\n    Atom(\"" + atom + "\", \"" + literal
-                            + "\"),\n");
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-        return "nsGkAtoms::" + atom;
-    }
-
-    private String createAtomName(String literal) {
-        String candidate = literal.replaceAll("[^a-zA-Z0-9_]", "_");
-        if ("".equals(candidate)) {
-            candidate = "emptystring";
-        }
-        while (atomMap.values().contains(candidate)
-                || reservedWords.contains(candidate)) {
-            candidate = candidate + '_';
-        }
-        return candidate;
-    }
-
-    public String stringForLiteral(String literal) {
-        return '"' + literal + '"';
-    }
-
-    public String staticArrayTemplate() {
-        return "staticJArray";
-    }
-
-    public String newArrayCreator() {
-        return "newJArray";
-    }
-
-    public String[] boilerplateIncludes(String javaClass) {
-        if ("TreeBuilder".equals(javaClass)) {
-            return TREE_BUILDER_INCLUDES;
-        } else if ("Tokenizer".equals(javaClass)) {
-            return TOKENIZER_INCLUDES;
-        } else {
-            return INCLUDES;
-        }
-    }
-
-    public String[] boilerplateDeclarations(String javaClass) {
-        if ("TreeBuilder".equals(javaClass)) {
-            return TREE_BUILDER_OTHER_DECLATIONS;
-        } else {
-            return OTHER_DECLATIONS;
-        }
-    }
-
-    public String[] namedCharactersIncludes() {
-        return NAMED_CHARACTERS_INCLUDES;
-    }
-
-    public String[] boilerplateForwardDeclarations() {
-        return FORWARD_DECLARATIONS;
-    }
-
-    public String documentModeHandlerType() {
-        return "nsHtml5TreeBuilder*";
-    }
-
-    public String documentModeType() {
-        return "nsHtml5DocumentMode";
-    }
-
-    public String arrayCopy() {
-        return "nsHtml5ArrayCopy::arraycopy";
-    }
-
-    public String maxInteger() {
-        return "INT32_MAX";
-    }
-
-    public String constructorBoilerplate(String className) {
-        return "MOZ_COUNT_CTOR(" + className + ");";
-    }
-
-    public String destructorBoilerplate(String className) {
-        return "MOZ_COUNT_DTOR(" + className + ");";
-    }
-
-    public String literalType() {
-        return "const char*";
-    }
-
-    public boolean hasSupplement(String javaClass) {
-        return Arrays.binarySearch(CLASSES_THAT_NEED_SUPPLEMENT, javaClass) > -1;
-    }
-
-    public String internerType() {
-        return "nsHtml5AtomTable*";
-    }
-
-    public String treeBuilderStateInterface() {
-        return "nsAHtml5TreeBuilderState";
-    }
-
-    public String treeBuilderStateType() {
-        return "nsAHtml5TreeBuilderState*";
-    }
-
-    public String arrayLengthMacro() {
-        return "MOZ_ARRAY_LENGTH";
-    }
-
-    public String staticAssert() {
-        return "static_assert";
-    }
-
-    public String continueMacro() {
-        return "NS_HTML5_CONTINUE";
-    }
-
-    public String breakMacro() {
-        return "NS_HTML5_BREAK";
-    }
-
-    public String characterNameType() {
-        return "nsHtml5CharacterName&";
-    }
-
-    public String characterNameTypeDeclaration() {
-        return "nsHtml5CharacterName";
-    }
-
-    public String transition() {
-        return "P::transition";
-    }
-
-    public String tokenizerErrorCondition() {
-        return "P::reportErrors";
-    }
-
-    public String firstTransitionArg() {
-        return "mViewSource.get()";
-    }
-
-    public String errorHandler() {
-        return this.unlikely() + "(mViewSource)";
-    }
-
-    public String unlikely() {
-        return "MOZ_UNLIKELY";
-    }
-
-    public String completedCharacterReference() {
-        return "P::completedNamedCharacterReference(mViewSource.get())";
-    }
-
-    public String[] stateLoopPolicies() {
-        return STATE_LOOP_POLICIES;
-    }
-
-    public String assertionMacro() {
-        return "MOZ_ASSERT";
-    }
-
-    public String releaseAssertionMacro() {
-        return "MOZ_RELEASE_ASSERT";
-    }
-
-    public String crashMacro() {
-        return "MOZ_CRASH";
-    }
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java
deleted file mode 100755
index e832e3bb..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java
+++ /dev/null
@@ -1,2446 +0,0 @@
-/*
- * Copyright (C) 2007 Júlio Vilmar Gesser.
- * Copyright (C) 2008 Mozilla Foundation
- *
- * This file is part of HTML Parser C++ Translator. It was derived from DumpVisitor
- * which was part of Java 1.5 parser and Abstract Syntax Tree and came with the following notice:
- *
- * Java 1.5 parser and Abstract Syntax Tree is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Java 1.5 parser and Abstract Syntax Tree is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Java 1.5 parser and Abstract Syntax Tree.  If not, see <http://www.gnu.org/licenses/>.
- */
-/*
- * Created on 05/10/2006
- */
-package nu.validator.htmlparser.cpptranslate;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import japa.parser.ast.BlockComment;
-import japa.parser.ast.CompilationUnit;
-import japa.parser.ast.ImportDeclaration;
-import japa.parser.ast.LineComment;
-import japa.parser.ast.Node;
-import japa.parser.ast.PackageDeclaration;
-import japa.parser.ast.TypeParameter;
-import japa.parser.ast.body.AnnotationDeclaration;
-import japa.parser.ast.body.AnnotationMemberDeclaration;
-import japa.parser.ast.body.BodyDeclaration;
-import japa.parser.ast.body.ClassOrInterfaceDeclaration;
-import japa.parser.ast.body.ConstructorDeclaration;
-import japa.parser.ast.body.EmptyMemberDeclaration;
-import japa.parser.ast.body.EmptyTypeDeclaration;
-import japa.parser.ast.body.EnumConstantDeclaration;
-import japa.parser.ast.body.EnumDeclaration;
-import japa.parser.ast.body.FieldDeclaration;
-import japa.parser.ast.body.InitializerDeclaration;
-import japa.parser.ast.body.JavadocComment;
-import japa.parser.ast.body.MethodDeclaration;
-import japa.parser.ast.body.ModifierSet;
-import japa.parser.ast.body.Parameter;
-import japa.parser.ast.body.TypeDeclaration;
-import japa.parser.ast.body.VariableDeclarator;
-import japa.parser.ast.body.VariableDeclaratorId;
-import japa.parser.ast.expr.ArrayAccessExpr;
-import japa.parser.ast.expr.ArrayCreationExpr;
-import japa.parser.ast.expr.ArrayInitializerExpr;
-import japa.parser.ast.expr.AssignExpr;
-import japa.parser.ast.expr.BinaryExpr;
-import japa.parser.ast.expr.BooleanLiteralExpr;
-import japa.parser.ast.expr.CastExpr;
-import japa.parser.ast.expr.CharLiteralExpr;
-import japa.parser.ast.expr.ClassExpr;
-import japa.parser.ast.expr.ConditionalExpr;
-import japa.parser.ast.expr.DoubleLiteralExpr;
-import japa.parser.ast.expr.EnclosedExpr;
-import japa.parser.ast.expr.Expression;
-import japa.parser.ast.expr.FieldAccessExpr;
-import japa.parser.ast.expr.InstanceOfExpr;
-import japa.parser.ast.expr.IntegerLiteralExpr;
-import japa.parser.ast.expr.IntegerLiteralMinValueExpr;
-import japa.parser.ast.expr.LongLiteralExpr;
-import japa.parser.ast.expr.LongLiteralMinValueExpr;
-import japa.parser.ast.expr.MarkerAnnotationExpr;
-import japa.parser.ast.expr.MemberValuePair;
-import japa.parser.ast.expr.MethodCallExpr;
-import japa.parser.ast.expr.NameExpr;
-import japa.parser.ast.expr.NormalAnnotationExpr;
-import japa.parser.ast.expr.NullLiteralExpr;
-import japa.parser.ast.expr.ObjectCreationExpr;
-import japa.parser.ast.expr.QualifiedNameExpr;
-import japa.parser.ast.expr.SingleMemberAnnotationExpr;
-import japa.parser.ast.expr.StringLiteralExpr;
-import japa.parser.ast.expr.SuperExpr;
-import japa.parser.ast.expr.ThisExpr;
-import japa.parser.ast.expr.UnaryExpr;
-import japa.parser.ast.expr.VariableDeclarationExpr;
-import japa.parser.ast.stmt.AssertStmt;
-import japa.parser.ast.stmt.BlockStmt;
-import japa.parser.ast.stmt.BreakStmt;
-import japa.parser.ast.stmt.CatchClause;
-import japa.parser.ast.stmt.ContinueStmt;
-import japa.parser.ast.stmt.DoStmt;
-import japa.parser.ast.stmt.EmptyStmt;
-import japa.parser.ast.stmt.ExplicitConstructorInvocationStmt;
-import japa.parser.ast.stmt.ExpressionStmt;
-import japa.parser.ast.stmt.ForStmt;
-import japa.parser.ast.stmt.ForeachStmt;
-import japa.parser.ast.stmt.IfStmt;
-import japa.parser.ast.stmt.LabeledStmt;
-import japa.parser.ast.stmt.ReturnStmt;
-import japa.parser.ast.stmt.Statement;
-import japa.parser.ast.stmt.SwitchEntryStmt;
-import japa.parser.ast.stmt.SwitchStmt;
-import japa.parser.ast.stmt.SynchronizedStmt;
-import japa.parser.ast.stmt.ThrowStmt;
-import japa.parser.ast.stmt.TryStmt;
-import japa.parser.ast.stmt.TypeDeclarationStmt;
-import japa.parser.ast.stmt.WhileStmt;
-import japa.parser.ast.type.ClassOrInterfaceType;
-import japa.parser.ast.type.PrimitiveType;
-import japa.parser.ast.type.ReferenceType;
-import japa.parser.ast.type.Type;
-import japa.parser.ast.type.VoidType;
-import japa.parser.ast.type.WildcardType;
-
-/**
- * @author Julio Vilmar Gesser
- * @author Henri Sivonen
- */
-
-public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> {
-
-    private static final String[] CLASS_NAMES = { "AttributeName",
-            "ElementName", "HtmlAttributes", "LocatorImpl", "MetaScanner",
-            "NamedCharacters", "NamedCharactersAccel", "Portability",
-            "StackNode", "Tokenizer", "TreeBuilder", "UTF16Buffer" };
-
-    private static final String[] METHODS_WITH_UNLIKELY_CONDITIONS = {
-            "appendStrBuf" };
-
-    public class SourcePrinter {
-
-        private int level = 0;
-
-        private boolean indented = false;
-
-        private final StringBuilder buf = new StringBuilder();
-
-        public void indent() {
-            level++;
-        }
-
-        public void unindent() {
-            level--;
-        }
-
-        private void makeIndent() {
-            for (int i = 0; i < level; i++) {
-                buf.append("  ");
-            }
-        }
-
-        public void printWithoutIndent(String arg) {
-            indented = false;
-            buf.append(arg);
-        }
-
-        public void print(String arg) {
-            if (!indented) {
-                makeIndent();
-                indented = true;
-            }
-            buf.append(arg);
-        }
-
-        public void printLn(String arg) {
-            print(arg);
-            printLn();
-        }
-
-        public void printLn() {
-            buf.append("\n");
-            indented = false;
-        }
-
-        public String getSource() {
-            return buf.toString();
-        }
-
-        @Override public String toString() {
-            return getSource();
-        }
-    }
-
-    private boolean supportErrorReporting = true;
-
-    protected SourcePrinter printer = new SourcePrinter();
-
-    private SourcePrinter staticInitializerPrinter = new SourcePrinter();
-
-    private SourcePrinter tempPrinterHolder;
-
-    protected final CppTypes cppTypes;
-
-    protected String className = "";
-
-    protected int currentArrayCount;
-
-    protected Set<String> forLoopsWithCondition = new HashSet<String>();
-
-    protected boolean inPrimitiveNoLengthFieldDeclarator = false;
-
-    protected boolean inField = false;
-
-    protected boolean inArray = false;
-
-    protected final SymbolTable symbolTable;
-
-    protected String definePrefix;
-
-    protected String javaClassName;
-
-    protected boolean suppressPointer = false;
-
-    private final List<String> staticReleases = new LinkedList<String>();
-
-    private boolean inConstructorBody = false;
-
-    private String currentMethod = null;
-
-    private Set<String> labels = null;
-
-    private boolean destructor;
-
-    protected boolean inStatic = false;
-
-    private boolean reportTransitions = false;
-
-    private int stateLoopCallCount = 0;
-
-    /**
-     * @param cppTypes
-     */
-    public CppVisitor(CppTypes cppTypes, SymbolTable symbolTable) {
-        this.cppTypes = cppTypes;
-        this.symbolTable = symbolTable;
-        staticInitializerPrinter.indent();
-    }
-
-    public String getSource() {
-        return printer.getSource();
-    }
-
-    private String classNameFromExpression(Expression e) {
-        if (e instanceof NameExpr) {
-            NameExpr nameExpr = (NameExpr) e;
-            String name = nameExpr.getName();
-            if (Arrays.binarySearch(CLASS_NAMES, name) > -1) {
-                return name;
-            }
-        }
-        return null;
-    }
-
-    protected void printModifiers(int modifiers) {
-    }
-
-    private void printMembers(List<BodyDeclaration> members,
-            LocalSymbolTable arg) {
-        for (BodyDeclaration member : members) {
-            if ("Tokenizer".equals(javaClassName)
-                    && member instanceof MethodDeclaration
-                    && "stateLoop".equals(((MethodDeclaration) member).getName())) {
-                reportTransitions = true;
-            }
-            member.accept(this, arg);
-            reportTransitions = false;
-        }
-    }
-
-    private void printTypeArgs(List<Type> args, LocalSymbolTable arg) {
-        // if (args != null) {
-        // printer.print("<");
-        // for (Iterator<Type> i = args.iterator(); i.hasNext();) {
-        // Type t = i.next();
-        // t.accept(this, arg);
-        // if (i.hasNext()) {
-        // printer.print(", ");
-        // }
-        // }
-        // printer.print(">");
-        // }
-    }
-
-    private void printTypeParameters(List<TypeParameter> args,
-            LocalSymbolTable arg) {
-        // if (args != null) {
-        // printer.print("<");
-        // for (Iterator<TypeParameter> i = args.iterator(); i.hasNext();) {
-        // TypeParameter t = i.next();
-        // t.accept(this, arg);
-        // if (i.hasNext()) {
-        // printer.print(", ");
-        // }
-        // }
-        // printer.print(">");
-        // }
-    }
-
-    public void visit(Node n, LocalSymbolTable arg) {
-        throw new IllegalStateException(n.getClass().getName());
-    }
-
-    public void visit(CompilationUnit n, LocalSymbolTable arg) {
-        if (n.getTypes() != null) {
-            for (Iterator<TypeDeclaration> i = n.getTypes().iterator(); i.hasNext();) {
-                i.next().accept(this, arg);
-                printer.printLn();
-                if (i.hasNext()) {
-                    printer.printLn();
-                }
-            }
-        }
-    }
-
-    public void visit(PackageDeclaration n, LocalSymbolTable arg) {
-        throw new IllegalStateException(n.getClass().getName());
-    }
-
-    public void visit(NameExpr n, LocalSymbolTable arg) {
-        if ("mappingLangToXmlLang".equals(n.getName())) {
-            printer.print("0");
-        } else if ("LANG_NS".equals(n.getName())) {
-            printer.print("ALL_NO_NS");
-        } else if ("LANG_PREFIX".equals(n.getName())) {
-            printer.print("ALL_NO_PREFIX");
-        } else if ("HTML_LOCAL".equals(n.getName())) {
-            printer.print(cppTypes.localForLiteral("html"));
-        } else if ("documentModeHandler".equals(n.getName())) {
-            printer.print("this");
-        } else if ("errorHandler".equals(n.getName())) {
-            printer.print(cppTypes.errorHandler());
-        } else if ("MOZ_FALLTHROUGH".equals(n.getName())) {
-            printer.print("[[fallthrough]]");
-        } else {
-            printer.print(n.getName());
-        }
-    }
-
-    public void visit(QualifiedNameExpr n, LocalSymbolTable arg) {
-        n.getQualifier().accept(this, arg);
-        printer.print(".");
-        printer.print(n.getName());
-    }
-
-    public void visit(ImportDeclaration n, LocalSymbolTable arg) {
-        throw new IllegalStateException(n.getClass().getName());
-    }
-
-    public void visit(ClassOrInterfaceDeclaration n, LocalSymbolTable arg) {
-        javaClassName = n.getName();
-        className = cppTypes.classPrefix() + javaClassName;
-        definePrefix = makeDefinePrefix(className);
-
-        startClassDeclaration();
-
-        if (n.getMembers() != null) {
-            printMembers(n.getMembers(), arg);
-        }
-
-        endClassDeclaration();
-    }
-
-    private String makeDefinePrefix(String name) {
-        StringBuilder sb = new StringBuilder();
-        boolean prevWasLowerCase = true;
-        for (int i = 0; i < name.length(); i++) {
-            char c = name.charAt(i);
-            if (c >= 'a' && c <= 'z') {
-                sb.append((char) (c - 0x20));
-                prevWasLowerCase = true;
-            } else if (c >= 'A' && c <= 'Z') {
-                if (prevWasLowerCase) {
-                    sb.append('_');
-                }
-                sb.append(c);
-                prevWasLowerCase = false;
-            } else if (c >= '0' && c <= '9') {
-                sb.append(c);
-                prevWasLowerCase = false;
-            }
-        }
-        sb.append('_');
-        return sb.toString();
-    }
-
-    protected void endClassDeclaration() {
-        printer.printLn("void");
-        printer.print(className);
-        printer.printLn("::initializeStatics()");
-        printer.printLn("{");
-        printer.print(staticInitializerPrinter.getSource());
-        printer.printLn("}");
-        printer.printLn();
-
-        printer.printLn("void");
-        printer.print(className);
-        printer.printLn("::releaseStatics()");
-        printer.printLn("{");
-        printer.indent();
-        for (String del : staticReleases) {
-            printer.print(del);
-            printer.printLn(";");
-        }
-        printer.unindent();
-        printer.printLn("}");
-        printer.printLn();
-
-        if (cppTypes.hasSupplement(javaClassName)) {
-            printer.printLn();
-            printer.print("#include \"");
-            printer.print(className);
-            printer.printLn("CppSupplement.h\"");
-        }
-    }
-
-    protected void startClassDeclaration() {
-        printer.print("#define ");
-        printer.print(className);
-        printer.printLn("_cpp__");
-        printer.printLn();
-
-        String[] incs = cppTypes.boilerplateIncludes(javaClassName);
-        for (int i = 0; i < incs.length; i++) {
-            String inc = incs[i];
-            printer.print("#include \"");
-            printer.print(inc);
-            printer.printLn(".h\"");
-        }
-
-        printer.printLn();
-
-        for (int i = 0; i < Main.H_LIST.length; i++) {
-            String klazz = Main.H_LIST[i];
-            if (!klazz.equals(javaClassName)) {
-                printer.print("#include \"");
-                printer.print(cppTypes.classPrefix());
-                printer.print(klazz);
-                printer.printLn(".h\"");
-            }
-        }
-
-        printer.printLn();
-        printer.print("#include \"");
-        printer.print(className);
-        printer.printLn(".h\"");
-        printer.printLn();
-    }
-
-    public void visit(EmptyTypeDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        printer.print(";");
-    }
-
-    public void visit(JavadocComment n, LocalSymbolTable arg) {
-        printer.print("/**");
-        printer.print(n.getContent());
-        printer.printLn("*/");
-    }
-
-    public void visit(ClassOrInterfaceType n, LocalSymbolTable arg) {
-        if (n.getScope() != null) {
-            n.getScope().accept(this, arg);
-            printer.print(".");
-            throw new IllegalStateException("Can't translate nested classes.");
-        }
-        String name = n.getName();
-        if ("String".equals(name)) {
-            if (local()) {
-                name = inField || inArray ? cppTypes.localType() : cppTypes.weakLocalType();
-            } else if (prefix()) {
-                name = cppTypes.prefixType();
-            } else if (nsUri()) {
-                name = cppTypes.nsUriType();
-            } else if (literal()) {
-                name = cppTypes.literalType();
-            } else if (characterName()) {
-                name = cppTypes.characterNameType();
-            } else {
-                name = cppTypes.stringType();
-            }
-        } else if ("T".equals(name) || "Object".equals(name)) {
-            if (htmlCreator()) {
-                name = cppTypes.htmlCreatorType();
-            } else if (svgCreator()) {
-                name = cppTypes.svgCreatorType();
-            } else if (creator()) {
-                name = cppTypes.creatorType();
-            } else {
-                name = cppTypes.nodeType();
-            }
-        } else if ("TokenHandler".equals(name)) {
-            name = cppTypes.classPrefix() + "TreeBuilder*";
-        } else if ("EncodingDeclarationHandler".equals(name)) {
-            name = cppTypes.encodingDeclarationHandlerType();
-        } else if ("Interner".equals(name)) {
-            name = cppTypes.internerType();
-        } else if ("TreeBuilderState".equals(name)) {
-            name = cppTypes.treeBuilderStateType();
-        } else if ("DocumentModeHandler".equals(name)) {
-            name = cppTypes.documentModeHandlerType();
-        } else if ("DocumentMode".equals(name)) {
-            name = cppTypes.documentModeType();
-        } else {
-            name = cppTypes.classPrefix() + name + (suppressPointer ? "" : "*");
-        }
-        printer.print(name);
-        printTypeArgs(n.getTypeArgs(), arg);
-    }
-
-    protected boolean inHeader() {
-        return false;
-    }
-
-    public void visit(TypeParameter n, LocalSymbolTable arg) {
-        printer.print(n.getName());
-        if (n.getTypeBound() != null) {
-            printer.print(" extends ");
-            for (Iterator<ClassOrInterfaceType> i = n.getTypeBound().iterator(); i.hasNext();) {
-                ClassOrInterfaceType c = i.next();
-                c.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(" & ");
-                }
-            }
-        }
-    }
-
-    public void visit(PrimitiveType n, LocalSymbolTable arg) {
-        switch (n.getType()) {
-            case Boolean:
-                printer.print(cppTypes.booleanType());
-                break;
-            case Byte:
-                printer.print(cppTypes.byteType());
-                break;
-            case Char:
-                printer.print(cppTypes.charType());
-                break;
-            case Double:
-                throw new IllegalStateException("Unsupported primitive.");
-            case Float:
-                throw new IllegalStateException("Unsupported primitive.");
-            case Int:
-                if (unsigned()) {
-                    printer.print(cppTypes.unsignedIntType());
-                } else {
-                    printer.print(cppTypes.intType());
-                }
-                break;
-            case Long:
-                throw new IllegalStateException("Unsupported primitive.");
-            case Short:
-                throw new IllegalStateException("Unsupported primitive.");
-        }
-    }
-
-    public void visit(ReferenceType n, LocalSymbolTable arg) {
-        if (isConst()) {
-            printer.print("const ");
-        }
-        boolean wasInArray = inArray;
-        if (n.getArrayCount() > 0) {
-            inArray = true;
-        }
-        if (noLength()) {
-            n.getType().accept(this, arg);
-            for (int i = 0; i < n.getArrayCount(); i++) {
-                if (!inPrimitiveNoLengthFieldDeclarator) {
-                    printer.print("*");
-                }
-            }
-        } else {
-            for (int i = 0; i < n.getArrayCount(); i++) {
-                if (inStatic) {
-                    printer.print(cppTypes.staticArrayTemplate());
-                } else {
-                    if (auto()) {
-                        printer.print(cppTypes.autoArrayTemplate());
-                    } else {
-                        printer.print(cppTypes.arrayTemplate());
-                    }
-                }
-                printer.print("<");
-            }
-            n.getType().accept(this, arg);
-            for (int i = 0; i < n.getArrayCount(); i++) {
-                printer.print(", ");
-                printer.print(cppTypes.intType());
-                printer.print(">");
-            }
-        }
-        if (n.getArrayCount() > 0) {
-            inArray = wasInArray;
-        }
-    }
-
-    public void visit(WildcardType n, LocalSymbolTable arg) {
-        printer.print("?");
-        if (n.getExtends() != null) {
-            printer.print(" extends ");
-            n.getExtends().accept(this, arg);
-        }
-        if (n.getSuper() != null) {
-            printer.print(" super ");
-            n.getSuper().accept(this, arg);
-        }
-    }
-
-    public void visit(FieldDeclaration n, LocalSymbolTable arg) {
-        currentAnnotations = n.getAnnotations();
-        fieldDeclaration(n, arg);
-        currentAnnotations = null;
-    }
-
-    protected boolean isNonToCharArrayMethodCall(Expression exp) {
-        if (exp instanceof MethodCallExpr) {
-            MethodCallExpr mce = (MethodCallExpr) exp;
-            return !"toCharArray".equals(mce.getName());
-        } else {
-            return false;
-        }
-    }
-
-    protected void fieldDeclaration(FieldDeclaration n, LocalSymbolTable arg) {
-        inField = true;
-        tempPrinterHolder = printer;
-        printer = staticInitializerPrinter;
-        int modifiers = n.getModifiers();
-        List<VariableDeclarator> variables = n.getVariables();
-        VariableDeclarator declarator = variables.get(0);
-        if (ModifierSet.isStatic(modifiers) && ModifierSet.isFinal(modifiers)
-                && !(n.getType() instanceof PrimitiveType)
-                && declarator.getInit() != null) {
-            if (n.getType() instanceof ReferenceType) {
-                ReferenceType rt = (ReferenceType) n.getType();
-                currentArrayCount = rt.getArrayCount();
-                if (currentArrayCount > 0) {
-                    if (currentArrayCount != 1) {
-                        throw new IllegalStateException(
-                                "Multidimensional arrays not supported. " + n);
-                    }
-                    if (noLength()) {
-                        if (rt.getType() instanceof PrimitiveType) {
-                            inPrimitiveNoLengthFieldDeclarator = true;
-                            printer = tempPrinterHolder;
-                            n.getType().accept(this, arg);
-                            printer.print(" ");
-                            printer.print(className);
-                            printer.print("::");
-                            declarator.getId().accept(this, arg);
-
-                            printer.print(" = ");
-
-                            declarator.getInit().accept(this, arg);
-
-                            printer.printLn(";");
-                            printer = staticInitializerPrinter;
-                        } else {
-                            printer = tempPrinterHolder;
-                            n.getType().accept(this, arg);
-                            printer.print(" ");
-                            printer.print(className);
-                            printer.print("::");
-                            declarator.getId().accept(this, arg);
-
-                            printer.printLn(" = 0;");
-                            printer = staticInitializerPrinter;
-
-                            staticReleases.add("delete[] "
-                                    + declarator.getId().getName());
-
-                            ArrayInitializerExpr aie = (ArrayInitializerExpr) declarator.getInit();
-
-                            declarator.getId().accept(this, arg);
-                            printer.print(" = new ");
-                            // suppressPointer = true;
-                            rt.getType().accept(this, arg);
-                            // suppressPointer = false;
-                            printer.print("[");
-                            printer.print("" + aie.getValues().size());
-                            printer.printLn("];");
-
-                            printArrayInit(declarator.getId(), aie.getValues(),
-                                    arg);
-                        }
-                    } else if ((rt.getType() instanceof PrimitiveType) || "String".equals(rt.getType().toString())) {
-                        printer = tempPrinterHolder;
-                        printer.print("static ");
-                        rt.getType().accept(this, arg);
-                        printer.print(" const ");
-                        declarator.getId().accept(this, arg);
-                        printer.print("_DATA[] = ");
-                        declarator.getInit().accept(this, arg);
-                        printer.printLn(";");
-                        printer.print(cppTypes.staticArrayTemplate());
-                        printer.print("<");
-                        suppressPointer = true;
-                        rt.getType().accept(this, arg);
-                        suppressPointer = false;
-                        printer.print(", ");
-                        printer.print(cppTypes.intType());
-                        printer.print("> ");
-                        printer.print(className);
-                        printer.print("::");
-                        declarator.getId().accept(this, arg);
-                        printer.print(" = { ");
-                        declarator.getId().accept(this, arg);
-                        printer.print("_DATA, ");
-                        printer.print(cppTypes.arrayLengthMacro());
-                        printer.print("(");
-                        declarator.getId().accept(this, arg);
-                        printer.printLn("_DATA) };");
-                        printer = staticInitializerPrinter;
-                    } else if (isNonToCharArrayMethodCall(declarator.getInit())) {
-                        staticReleases.add(declarator.getId().getName()
-                                + ".release()");
-                        declarator.getId().accept(this, arg);
-                        printer.print(" = ");
-                        if (declarator.getInit() instanceof ArrayInitializerExpr) {
-
-                            ArrayInitializerExpr aie = (ArrayInitializerExpr) declarator.getInit();
-                            printer.print(cppTypes.arrayTemplate());
-                            printer.print("<");
-                            suppressPointer = true;
-                            rt.getType().accept(this, arg);
-                            suppressPointer = false;
-                            printer.print(", ");
-                            printer.print(cppTypes.intType());
-                            printer.print(">::");
-                            printer.print(cppTypes.newArrayCreator());
-                            printer.print("(");
-                            printer.print("" + aie.getValues().size());
-                            printer.printLn(");");
-                            printArrayInit(declarator.getId(), aie.getValues(),
-                                    arg);
-                        } else {
-                            declarator.getInit().accept(this, arg);
-                            printer.printLn(";");
-                        }
-                    }
-                } else {
-                    if (ModifierSet.isStatic(modifiers)) {
-                        printer = tempPrinterHolder;
-                        n.getType().accept(this, arg);
-                        printer.print(" ");
-                        printer.print(className);
-                        printer.print("::");
-                        String clazzName = n.getType().toString();
-                        String field = declarator.getId().toString();
-                        if (symbolTable.isAttributeOrElementName(clazzName, field)) {
-                            if ("AttributeName".equals(clazzName)) {
-                                printer.print("ATTR_");
-                            } else if ("ElementName".equals(clazzName)) {
-                                printer.print("ELT_");
-                            }
-                        }
-                        declarator.getId().accept(this, arg);
-                        printer.print(" = ");
-                        printer.print(cppTypes.nullLiteral());
-                        printer.printLn(";");
-                        printer = staticInitializerPrinter;
-                    }
-
-                    if ("AttributeName".equals(n.getType().toString())) {
-                        printer.print("ATTR_");
-                        staticReleases.add("delete ATTR_"
-                                + declarator.getId().getName());
-                    } else if ("ElementName".equals(n.getType().toString())) {
-                        printer.print("ELT_");
-                        staticReleases.add("delete ELT_"
-                                + declarator.getId().getName());
-                    } else {
-                        staticReleases.add("delete "
-                                + declarator.getId().getName());
-                    }
-                    declarator.accept(this, arg);
-                    printer.printLn(";");
-                }
-            } else {
-                throw new IllegalStateException(
-                        "Non-reference, non-primitive fields not supported.");
-            }
-        }
-        currentArrayCount = 0;
-        printer = tempPrinterHolder;
-        inPrimitiveNoLengthFieldDeclarator = false;
-        inField = false;
-    }
-
-    private void printArrayInit(VariableDeclaratorId variableDeclaratorId,
-            List<Expression> values, LocalSymbolTable arg) {
-        for (int i = 0; i < values.size(); i++) {
-            Expression exp = values.get(i);
-            variableDeclaratorId.accept(this, arg);
-            printer.print("[");
-            printer.print("" + i);
-            printer.print("] = ");
-            if (exp instanceof NameExpr) {
-                if ("AttributeName".equals(javaClassName)) {
-                    printer.print("ATTR_");
-                } else if ("ElementName".equals(javaClassName)) {
-                    printer.print("ELT_");
-                }
-            }
-            exp.accept(this, arg);
-            printer.printLn(";");
-        }
-    }
-
-    public void visit(VariableDeclarator n, LocalSymbolTable arg) {
-        n.getId().accept(this, arg);
-
-        if (n.getInit() != null) {
-            printer.print(" = ");
-            n.getInit().accept(this, arg);
-        }
-    }
-
-    public void visit(VariableDeclaratorId n, LocalSymbolTable arg) {
-        printer.print(n.getName());
-        if (noLength()) {
-            for (int i = 0; i < currentArrayCount; i++) {
-                if (inPrimitiveNoLengthFieldDeclarator) {
-                    printer.print("[]");
-                }
-            }
-        }
-        for (int i = 0; i < n.getArrayCount(); i++) {
-            printer.print("[]");
-        }
-    }
-
-    public void visit(ArrayInitializerExpr n, LocalSymbolTable arg) {
-        printer.print("{");
-        if (n.getValues() != null) {
-            printer.print(" ");
-            for (Iterator<Expression> i = n.getValues().iterator(); i.hasNext();) {
-                Expression expr = i.next();
-                expr.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-            printer.print(" ");
-        }
-        printer.print("}");
-    }
-
-    public void visit(VoidType n, LocalSymbolTable arg) {
-        printer.print("void");
-    }
-
-    public void visit(ArrayAccessExpr n, LocalSymbolTable arg) {
-        n.getName().accept(this, arg);
-        printer.print("[");
-        n.getIndex().accept(this, arg);
-        printer.print("]");
-    }
-
-    public void visit(ArrayCreationExpr n, LocalSymbolTable arg) {
-        // printer.print("new ");
-        // n.getType().accept(this, arg);
-        // printTypeArgs(n.getTypeArgs(), arg);
-
-        inArray = true;
-        if (n.getDimensions() != null) {
-            if (noLength()) {
-                for (Expression dim : n.getDimensions()) {
-                    printer.print("new ");
-                    n.getType().accept(this, arg);
-                    printer.print("[");
-                    dim.accept(this, arg);
-                    printer.print("]");
-                }
-            } else {
-                for (Expression dim : n.getDimensions()) {
-                    printer.print(cppTypes.arrayTemplate());
-                    printer.print("<");
-                    n.getType().accept(this, arg);
-                    printer.print(", ");
-                    printer.print(cppTypes.intType());
-                    printer.print(">::");
-                    printer.print(cppTypes.newArrayCreator());
-                    printer.print("(");
-                    dim.accept(this, arg);
-                    printer.print(")");
-                }
-            }
-            if (n.getArrayCount() > 0) {
-                throw new IllegalStateException(
-                        "Nested array allocation not supported. "
-                                + n.toString());
-            }
-        } else {
-            throw new IllegalStateException(
-                    "Array initializer as part of array creation not supported. "
-                            + n.toString());
-        }
-        inArray = false;
-    }
-
-    public void visit(AssignExpr n, LocalSymbolTable arg) {
-        if (inConstructorBody) {
-            n.getTarget().accept(this, arg);
-            printer.print("(");
-            n.getValue().accept(this, arg);
-            printer.print(")");
-        } else {
-            n.getTarget().accept(this, arg);
-            printer.print(" ");
-            switch (n.getOperator()) {
-                case assign:
-                    printer.print("=");
-                    break;
-                case and:
-                    printer.print("&=");
-                    break;
-                case or:
-                    printer.print("|=");
-                    break;
-                case xor:
-                    printer.print("^=");
-                    break;
-                case plus:
-                    printer.print("+=");
-                    break;
-                case minus:
-                    printer.print("-=");
-                    break;
-                case rem:
-                    printer.print("%=");
-                    break;
-                case slash:
-                    printer.print("/=");
-                    break;
-                case star:
-                    printer.print("*=");
-                    break;
-                case lShift:
-                    printer.print("<<=");
-                    break;
-                case rSignedShift:
-                    printer.print(">>=");
-                    break;
-                case rUnsignedShift:
-                    printer.print(">>>=");
-                    break;
-            }
-            printer.print(" ");
-            n.getValue().accept(this, arg);
-        }
-    }
-
-    public void visit(BinaryExpr n, LocalSymbolTable arg) {
-        Expression right = n.getRight();
-        switch (n.getOperator()) {
-            case notEquals:
-                if (right instanceof NullLiteralExpr) {
-                    printer.print("!!");
-                    n.getLeft().accept(this, arg);
-                    return;
-                } else if (right instanceof IntegerLiteralExpr) {
-                    IntegerLiteralExpr ile = (IntegerLiteralExpr) right;
-                    if ("0".equals(ile.getValue())) {
-                        n.getLeft().accept(this, arg);
-                        return;
-                    }
-                }
-            case equals:
-                if (right instanceof NullLiteralExpr) {
-                    printer.print("!");
-                    n.getLeft().accept(this, arg);
-                    return;
-                } else if (right instanceof IntegerLiteralExpr) {
-                    IntegerLiteralExpr ile = (IntegerLiteralExpr) right;
-                    if ("0".equals(ile.getValue())) {
-                        printer.print("!");
-                        n.getLeft().accept(this, arg);
-                        return;
-                    }
-                }
-            default:
-                // fall thru
-        }
-
-        n.getLeft().accept(this, arg);
-        printer.print(" ");
-        switch (n.getOperator()) {
-            case or:
-                printer.print("||");
-                break;
-            case and:
-                printer.print("&&");
-                break;
-            case binOr:
-                printer.print("|");
-                break;
-            case binAnd:
-                printer.print("&");
-                break;
-            case xor:
-                printer.print("^");
-                break;
-            case equals:
-                printer.print("==");
-                break;
-            case notEquals:
-                printer.print("!=");
-                break;
-            case less:
-                printer.print("<");
-                break;
-            case greater:
-                printer.print(">");
-                break;
-            case lessEquals:
-                printer.print("<=");
-                break;
-            case greaterEquals:
-                printer.print(">=");
-                break;
-            case lShift:
-                printer.print("<<");
-                break;
-            case rSignedShift:
-                printer.print(">>");
-                break;
-            case rUnsignedShift:
-                printer.print(">>>");
-                break;
-            case plus:
-                printer.print("+");
-                break;
-            case minus:
-                printer.print("-");
-                break;
-            case times:
-                printer.print("*");
-                break;
-            case divide:
-                printer.print("/");
-                break;
-            case remainder:
-                printer.print("%");
-                break;
-        }
-        printer.print(" ");
-        n.getRight().accept(this, arg);
-    }
-
-    public void visit(CastExpr n, LocalSymbolTable arg) {
-        printer.print("(");
-        n.getType().accept(this, arg);
-        printer.print(") ");
-        n.getExpr().accept(this, arg);
-    }
-
-    public void visit(ClassExpr n, LocalSymbolTable arg) {
-        n.getType().accept(this, arg);
-        printer.print(".class");
-    }
-
-    public void visit(ConditionalExpr n, LocalSymbolTable arg) {
-        n.getCondition().accept(this, arg);
-        printer.print(" ? ");
-        n.getThenExpr().accept(this, arg);
-        printer.print(" : ");
-        n.getElseExpr().accept(this, arg);
-    }
-
-    public void visit(EnclosedExpr n, LocalSymbolTable arg) {
-        printer.print("(");
-        n.getInner().accept(this, arg);
-        printer.print(")");
-    }
-
-    public void visit(FieldAccessExpr n, LocalSymbolTable arg) {
-        Expression scope = n.getScope();
-        String field = n.getField();
-        if (inConstructorBody && (scope instanceof ThisExpr)) {
-            printer.print(field);
-        } else if ("length".equals(field) && !(scope instanceof ThisExpr)) {
-            scope.accept(this, arg);
-            printer.print(".length");
-        } else if ("MAX_VALUE".equals(field)
-                && "Integer".equals(scope.toString())) {
-            printer.print(cppTypes.maxInteger());
-        } else {
-            String clazzName = classNameFromExpression(scope);
-            if (clazzName == null) {
-                if ("DocumentMode".equals(scope.toString())) {
-                    // printer.print(cppTypes.documentModeType());
-                    // printer.print(".");
-                } else if ("creator".equals(scope.toString()) || "this.creator".equals(scope.toString())) {
-                    scope.accept(this, arg);
-                    printer.print(".");
-                } else {
-                    scope.accept(this, arg);
-                    printer.print("->");
-                }
-            } else {
-                printer.print(cppTypes.classPrefix());
-                printer.print(clazzName);
-                printer.print("::");
-                if (symbolTable.isAttributeOrElementName(clazzName, field)) {
-                    if ("AttributeName".equals(clazzName)) {
-                        printer.print("ATTR_");
-                    } else if ("ElementName".equals(clazzName)) {
-                        printer.print("ELT_");
-                    }
-                }
-            }
-            printer.print(field);
-        }
-    }
-
-    public void visit(InstanceOfExpr n, LocalSymbolTable arg) {
-        n.getExpr().accept(this, arg);
-        printer.print(" instanceof ");
-        n.getType().accept(this, arg);
-    }
-
-    public void visit(CharLiteralExpr n, LocalSymbolTable arg) {
-        printCharLiteral(n.getValue());
-    }
-
-    private void printCharLiteral(String val) {
-        if (val.length() != 1) {
-            printer.print("'");
-            printer.print(val);
-            printer.print("'");
-            return;
-        }
-        char c = val.charAt(0);
-        switch (c) {
-            case 0:
-                printer.print("'\\0'");
-                break;
-            case '\n':
-                printer.print("'\\n'");
-                break;
-            case '\t':
-                printer.print("'\\t'");
-                break;
-            case 0xB:
-                printer.print("'\\v'");
-                break;
-            case '\b':
-                printer.print("'\\b'");
-                break;
-            case '\r':
-                printer.print("'\\r'");
-                break;
-            case 0xC:
-                printer.print("'\\f'");
-                break;
-            case 0x7:
-                printer.print("'\\a'");
-                break;
-            case '\\':
-                printer.print("'\\\\'");
-                break;
-            case '?':
-                printer.print("'\\?'");
-                break;
-            case '\'':
-                printer.print("'\\''");
-                break;
-            case '"':
-                printer.print("'\\\"'");
-                break;
-            default:
-                if (c >= 0x20 && c <= 0x7F) {
-                    printer.print("'" + c);
-                    printer.print("'");
-                } else {
-                    printer.print("0x");
-                    printer.print(Integer.toHexString(c));
-                }
-                break;
-        }
-    }
-
-    public void visit(DoubleLiteralExpr n, LocalSymbolTable arg) {
-        printer.print(n.getValue());
-    }
-
-    public void visit(IntegerLiteralExpr n, LocalSymbolTable arg) {
-        printer.print(n.getValue());
-    }
-
-    public void visit(LongLiteralExpr n, LocalSymbolTable arg) {
-        printer.print(n.getValue());
-    }
-
-    public void visit(IntegerLiteralMinValueExpr n, LocalSymbolTable arg) {
-        printer.print(n.getValue());
-    }
-
-    public void visit(LongLiteralMinValueExpr n, LocalSymbolTable arg) {
-        printer.print(n.getValue());
-    }
-
-    public void visit(StringLiteralExpr n, LocalSymbolTable arg) {
-        String val = n.getValue();
-        if ("http://www.w3.org/1999/xhtml".equals(val)) {
-            printer.print(cppTypes.xhtmlNamespaceLiteral());
-        } else if ("http://www.w3.org/2000/svg".equals(val)) {
-            printer.print(cppTypes.svgNamespaceLiteral());
-        } else if ("http://www.w3.org/2000/xmlns/".equals(val)) {
-            printer.print(cppTypes.xmlnsNamespaceLiteral());
-        } else if ("http://www.w3.org/XML/1998/namespace".equals(val)) {
-            printer.print(cppTypes.xmlNamespaceLiteral());
-        } else if ("http://www.w3.org/1999/xlink".equals(val)) {
-            printer.print(cppTypes.xlinkNamespaceLiteral());
-        } else if ("http://www.w3.org/1998/Math/MathML".equals(val)) {
-            printer.print(cppTypes.mathmlNamespaceLiteral());
-        } else if ("".equals(val) && "AttributeName".equals(javaClassName)) {
-            printer.print(cppTypes.noNamespaceLiteral());
-        } else if (val.startsWith("-/") || val.startsWith("+//")
-                || val.startsWith("http://") || val.startsWith("XSLT")) {
-            printer.print(cppTypes.stringForLiteral(val));
-        } else if (("hidden".equals(val) || "isindex".equals(val)
-                || "text/html".equals(val)
-                || "application/xhtml+xml".equals(val) || "content-type".equals(val))
-                && "TreeBuilder".equals(javaClassName)) {
-            printer.print(cppTypes.stringForLiteral(val));
-        } else if ("isQuirky".equals(currentMethod) && "html".equals(val)) {
-            printer.print(cppTypes.stringForLiteral(val));
-        } else {
-            printer.print(cppTypes.localForLiteral(val));
-        }
-    }
-
-    public void visit(BooleanLiteralExpr n, LocalSymbolTable arg) {
-        if (n.getValue()) {
-            printer.print(cppTypes.trueLiteral());
-        } else {
-            printer.print(cppTypes.falseLiteral());
-        }
-    }
-
-    public void visit(NullLiteralExpr n, LocalSymbolTable arg) {
-        printer.print(cppTypes.nullLiteral());
-    }
-
-    public void visit(ThisExpr n, LocalSymbolTable arg) {
-        if (n.getClassExpr() != null) {
-            n.getClassExpr().accept(this, arg);
-            printer.print(".");
-        }
-        printer.print("this");
-    }
-
-    public void visit(SuperExpr n, LocalSymbolTable arg) {
-        if (n.getClassExpr() != null) {
-            n.getClassExpr().accept(this, arg);
-            printer.print(".");
-        }
-        printer.print("super");
-    }
-
-    public void visit(MethodCallExpr n, LocalSymbolTable arg) {
-        if ("releaseArray".equals(n.getName())
-                && "Portability".equals(n.getScope().toString())) {
-            n.getArgs().get(0).accept(this, arg);
-            printer.print(".release()");
-        } else if ("releaseString".equals(n.getName())
-                && "Portability".equals(n.getScope().toString())) {
-            n.getArgs().get(0).accept(this, arg);
-            printer.print(".Release()");
-        } else if ("deleteArray".equals(n.getName())
-                && "Portability".equals(n.getScope().toString())) {
-            printer.print("delete[] ");
-            n.getArgs().get(0).accept(this, arg);
-        } else if ("delete".equals(n.getName())
-                && "Portability".equals(n.getScope().toString())) {
-            printer.print("delete ");
-            n.getArgs().get(0).accept(this, arg);
-        } else if (("retainElement".equals(n.getName()) || "releaseElement".equals(n.getName()))
-                && "Portability".equals(n.getScope().toString())) {
-            // ignore for now
-        } else if ("transition".equals(n.getName())
-                && n.getScope() == null) {
-            visitTransition(n, arg);
-        } else if ("arraycopy".equals(n.getName())
-                && "System".equals(n.getScope().toString())) {
-            printer.print(cppTypes.arrayCopy());
-            printer.print("(");
-            if (n.getArgs().get(0).toString().equals(
-                    n.getArgs().get(2).toString())) {
-                n.getArgs().get(0).accept(this, arg);
-                printer.print(", ");
-                n.getArgs().get(1).accept(this, arg);
-                printer.print(", ");
-                n.getArgs().get(3).accept(this, arg);
-                printer.print(", ");
-                n.getArgs().get(4).accept(this, arg);
-            } else if (n.getArgs().get(1).toString().equals("0")
-                    && n.getArgs().get(3).toString().equals("0")) {
-                n.getArgs().get(0).accept(this, arg);
-                printer.print(", ");
-                n.getArgs().get(2).accept(this, arg);
-                printer.print(", ");
-                n.getArgs().get(4).accept(this, arg);
-            } else {
-                for (Iterator<Expression> i = n.getArgs().iterator(); i.hasNext();) {
-                    Expression e = i.next();
-                    e.accept(this, arg);
-                    if (i.hasNext()) {
-                        printer.print(", ");
-                    }
-                }
-            }
-            printer.print(")");
-        } else if ("binarySearch".equals(n.getName())
-                && "Arrays".equals(n.getScope().toString())) {
-            n.getArgs().get(0).accept(this, arg);
-            printer.print(".binarySearch(");
-            n.getArgs().get(1).accept(this, arg);
-            printer.print(")");
-        } else {
-            Expression scope = n.getScope();
-            if (scope != null) {
-                if (scope instanceof StringLiteralExpr) {
-                    StringLiteralExpr strLit = (StringLiteralExpr) scope;
-                    String str = strLit.getValue();
-                    if (!"toCharArray".equals(n.getName())) {
-                        throw new IllegalStateException(
-                                "Unsupported method call on string literal: "
-                                        + n.getName());
-                    }
-                    printer.print("{ ");
-                    for (int i = 0; i < str.length(); i++) {
-                        char c = str.charAt(i);
-                        if (i != 0) {
-                            printer.print(", ");
-                        }
-                        printCharLiteral("" + c);
-                    }
-                    printer.print(" }");
-                    return;
-                } else {
-                    String clazzName = classNameFromExpression(scope);
-                    if (clazzName == null) {
-                        scope.accept(this, arg);
-                        if ("length".equals(n.getName())
-                                || "charAt".equals(n.getName())
-                                || "creator".equals(scope.toString())) {
-                            printer.print(".");
-                        } else {
-                            printer.print("->");
-                        }
-                    } else {
-                        printer.print(cppTypes.classPrefix());
-                        printer.print(clazzName);
-                        printer.print("::");
-                    }
-                }
-            }
-            printTypeArgs(n.getTypeArgs(), arg);
-            printer.print(n.getName());
-            if ("stateLoop".equals(n.getName())
-                    && "Tokenizer".equals(javaClassName)
-                    && cppTypes.stateLoopPolicies().length > 0) {
-                printer.print("<");
-                printer.print(cppTypes.stateLoopPolicies()[stateLoopCallCount]);
-                printer.print(">");
-                stateLoopCallCount++;
-            }
-            printer.print("(");
-            if (n.getArgs() != null) {
-                for (Iterator<Expression> i = n.getArgs().iterator(); i.hasNext();) {
-                    Expression e = i.next();
-                    e.accept(this, arg);
-                    if (i.hasNext()) {
-                        printer.print(", ");
-                    }
-                }
-            }
-            printer.print(")");
-        }
-    }
-
-    public void visit(ObjectCreationExpr n, LocalSymbolTable arg) {
-        if (n.getScope() != null) {
-            n.getScope().accept(this, arg);
-            printer.print(".");
-        }
-
-        printer.print("new ");
-
-        suppressPointer = true;
-        printTypeArgs(n.getTypeArgs(), arg);
-        n.getType().accept(this, arg);
-        suppressPointer = false;
-
-        if ("AttributeName".equals(n.getType().getName())) {
-            List<Expression> args = n.getArgs();
-            while (args != null && args.size() > 3) {
-                args.remove(3);
-            }
-        }
-
-        printer.print("(");
-        if (n.getArgs() != null) {
-            for (Iterator<Expression> i = n.getArgs().iterator(); i.hasNext();) {
-                Expression e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(")");
-
-        if (n.getAnonymousClassBody() != null) {
-            printer.printLn(" {");
-            printer.indent();
-            printMembers(n.getAnonymousClassBody(), arg);
-            printer.unindent();
-            printer.print("}");
-        }
-    }
-
-    public void visit(UnaryExpr n, LocalSymbolTable arg) {
-        switch (n.getOperator()) {
-            case positive:
-                printer.print("+");
-                break;
-            case negative:
-                printer.print("-");
-                break;
-            case inverse:
-                printer.print("~");
-                break;
-            case not:
-                printer.print("!");
-                break;
-            case preIncrement:
-                printer.print("++");
-                break;
-            case preDecrement:
-                printer.print("--");
-                break;
-        }
-
-        n.getExpr().accept(this, arg);
-
-        switch (n.getOperator()) {
-            case posIncrement:
-                printer.print("++");
-                break;
-            case posDecrement:
-                printer.print("--");
-                break;
-        }
-    }
-
-    public void visit(ConstructorDeclaration n, LocalSymbolTable arg) {
-        if ("TreeBuilder".equals(javaClassName)) {
-            return;
-        }
-
-        arg = new LocalSymbolTable(javaClassName, symbolTable);
-
-        // if (n.getJavaDoc() != null) {
-        // n.getJavaDoc().accept(this, arg);
-        // }
-        currentAnnotations = n.getAnnotations();
-
-        printModifiers(n.getModifiers());
-
-        printMethodNamespace();
-        printConstructorExplicit(n.getParameters());
-        printer.print(className);
-        currentAnnotations = null;
-
-        printer.print("(");
-        if (n.getParameters() != null) {
-            for (Iterator<Parameter> i = n.getParameters().iterator(); i.hasNext();) {
-                Parameter p = i.next();
-                p.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(")");
-
-        printConstructorBody(n.getBlock(), arg);
-    }
-
-    protected void printConstructorExplicit(List<Parameter> params) {
-    }
-
-    protected void printConstructorBody(BlockStmt block, LocalSymbolTable arg) {
-        inConstructorBody = true;
-        List<Statement> statements = block.getStmts();
-        List<Statement> nonAssigns = new LinkedList<Statement>();
-        int i = 0;
-        boolean needOutdent = false;
-        for (Statement statement : statements) {
-            if (statement instanceof ExpressionStmt
-                    && ((ExpressionStmt) statement).getExpression() instanceof AssignExpr) {
-                printer.printLn();
-                if (i == 0) {
-                    // : firstMember(arg)
-                    printer.indent();
-                    printer.print(": ");
-                    needOutdent = true;
-                } else {
-                    // , secondMember(arg)
-                    printer.print(", ");
-                }
-                statement.accept(this, arg);
-                i++;
-            } else {
-                nonAssigns.add(statement);
-            }
-        }
-        if (needOutdent) {
-            printer.unindent();
-        }
-        inConstructorBody = false;
-        printer.printLn();
-        printer.printLn("{");
-        printer.indent();
-        String boilerplate = cppTypes.constructorBoilerplate(className);
-        if (boilerplate != null) {
-            printer.printLn(boilerplate);
-        }
-        for (Statement statement : nonAssigns) {
-            statement.accept(this, arg);
-            printer.printLn();
-        }
-        printer.unindent();
-        printer.printLn("}");
-        printer.printLn();
-    }
-
-    public void visit(MethodDeclaration n, LocalSymbolTable arg) {
-        arg = new LocalSymbolTable(javaClassName, symbolTable);
-        if (isPrintableMethod(n.getModifiers())
-                && !(n.getName().equals("endCoalescing") || n.getName().equals(
-                        "startCoalescing"))) {
-            printMethodDeclaration(n, arg);
-        }
-    }
-
-    private boolean isPrintableMethod(int modifiers) {
-        return !(ModifierSet.isAbstract(modifiers) || (ModifierSet.isProtected(modifiers) && !(ModifierSet.isFinal(modifiers) || "Tokenizer".equals(javaClassName))));
-    }
-
-    protected void printMethodDeclaration(MethodDeclaration n,
-            LocalSymbolTable arg) {
-        if (n.getName().startsWith("fatal") || n.getName().startsWith("err")
-                || n.getName().startsWith("warn")
-                || n.getName().startsWith("maybeErr")
-                || n.getName().startsWith("maybeWarn")
-                || n.getName().startsWith("note")
-                || "releaseArray".equals(n.getName())
-                || "releaseString".equals(n.getName())
-                || "deleteArray".equals(n.getName())
-                || "delete".equals(n.getName())) {
-            return;
-        }
-
-        currentMethod = n.getName();
-
-        destructor = "destructor".equals(currentMethod);
-
-        // if (n.getJavaDoc() != null) {
-        // n.getJavaDoc().accept(this, arg);
-        // }
-        currentAnnotations = n.getAnnotations();
-        boolean isInline = inline();
-        if (isInline && !inHeader()) {
-            return;
-        }
-
-        if (destructor) {
-            printModifiers(ModifierSet.PUBLIC);
-        } else {
-            printModifiers(n.getModifiers());
-        }
-
-        if ("stateLoop".equals(currentMethod)
-                && "Tokenizer".equals(javaClassName)
-                && cppTypes.stateLoopPolicies().length > 0) {
-            printer.print("template<class P>");
-            if (inHeader()) {
-                printer.print(" ");
-            } else {
-                printer.printLn();
-            }
-        }
-
-        printTypeParameters(n.getTypeParameters(), arg);
-        if (n.getTypeParameters() != null) {
-            printer.print(" ");
-        }
-        if (!destructor) {
-            n.getType().accept(this, arg);
-            printer.print(" ");
-        }
-        printMethodNamespace();
-        if (destructor) {
-            printer.print("~");
-            printer.print(className);
-        } else {
-            printer.print(n.getName());
-        }
-
-        printer.print("(");
-        if (n.getParameters() != null) {
-            for (Iterator<Parameter> i = n.getParameters().iterator(); i.hasNext();) {
-                Parameter p = i.next();
-                p.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(")");
-
-        for (int i = 0; i < n.getArrayCount(); i++) {
-            printer.print("[]");
-        }
-
-        if (override() && inHeader()) {
-            printer.print(" override");
-        }
-
-        currentAnnotations = null;
-
-        if (inHeader() == isInline) {
-            printMethodBody(n.getBody(), arg);
-        } else {
-            printer.printLn(";");
-        }
-    }
-
-    private void printMethodBody(BlockStmt n, LocalSymbolTable arg) {
-        if (n == null) {
-            printer.print(";");
-        } else {
-            printer.printLn();
-            printer.printLn("{");
-            printer.indent();
-            if (destructor) {
-                String boilerplate = cppTypes.destructorBoilerplate(className);
-                if (boilerplate != null) {
-                    printer.printLn(boilerplate);
-                }
-            }
-            if (n.getStmts() != null) {
-                for (Statement s : n.getStmts()) {
-                    s.accept(this, arg);
-                    printer.printLn();
-                }
-            }
-            printer.unindent();
-            printer.print("}");
-        }
-        printer.printLn();
-        printer.printLn();
-    }
-
-    protected void printMethodNamespace() {
-        printer.printLn();
-        printer.print(className);
-        printer.print("::");
-    }
-
-    public void visit(Parameter n, LocalSymbolTable arg) {
-        currentAnnotations = n.getAnnotations();
-
-        arg.putLocalType(n.getId().getName(), convertType(n.getType(),
-                n.getModifiers()));
-
-        n.getType().accept(this, arg);
-        if (n.isVarArgs()) {
-            printer.print("...");
-        }
-        printer.print(" ");
-        n.getId().accept(this, arg);
-        currentAnnotations = null;
-    }
-
-    public void visit(ExplicitConstructorInvocationStmt n, LocalSymbolTable arg) {
-        if (n.isThis()) {
-            printTypeArgs(n.getTypeArgs(), arg);
-            printer.print("this");
-        } else {
-            if (n.getExpr() != null) {
-                n.getExpr().accept(this, arg);
-                printer.print(".");
-            }
-            printTypeArgs(n.getTypeArgs(), arg);
-            printer.print("super");
-        }
-        printer.print("(");
-        if (n.getArgs() != null) {
-            for (Iterator<Expression> i = n.getArgs().iterator(); i.hasNext();) {
-                Expression e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(");");
-    }
-
-    public void visit(VariableDeclarationExpr n, LocalSymbolTable arg) {
-        currentAnnotations = n.getAnnotations();
-
-        arg.putLocalType(n.getVars().get(0).toString(), convertType(
-                n.getType(), n.getModifiers()));
-
-        n.getType().accept(this, arg);
-        printer.print(" ");
-
-        for (Iterator<VariableDeclarator> i = n.getVars().iterator(); i.hasNext();) {
-            VariableDeclarator v = i.next();
-            v.accept(this, arg);
-            if (i.hasNext()) {
-                printer.print(", ");
-            }
-        }
-        currentAnnotations = null;
-    }
-
-    public void visit(TypeDeclarationStmt n, LocalSymbolTable arg) {
-        n.getTypeDeclaration().accept(this, arg);
-    }
-
-    public void visit(AssertStmt n, LocalSymbolTable arg) {
-        String message = null;
-        Expression msg = n.getMessage();
-        boolean hasCheck = true;
-        if (msg != null) {
-            if (msg instanceof StringLiteralExpr) {
-                StringLiteralExpr sle = (StringLiteralExpr) msg;
-                message = sle.getValue();
-            } else {
-                throw new RuntimeException("Bad assertion message.");
-            }
-        }
-        String macro = cppTypes.assertionMacro();
-        if (message != null && message.startsWith("RELEASE: ")) {
-            message = message.substring("RELEASE: ".length());
-            macro = cppTypes.releaseAssertionMacro();
-            Expression check = n.getCheck();
-            if (check instanceof BooleanLiteralExpr) {
-                BooleanLiteralExpr expr = (BooleanLiteralExpr) check;
-                if (!expr.getValue()) {
-                    hasCheck = false;
-                    macro = cppTypes.crashMacro();
-                }
-            }
-        }
-        if (macro != null) {
-            printer.print(macro);
-            printer.print("(");
-            if (hasCheck) {
-                n.getCheck().accept(this, arg);
-            }
-            if (message != null) {
-                if (hasCheck) {
-                    printer.print(", ");
-                }
-                printer.print("\"");
-                for (int i = 0; i < message.length(); i++) {
-                    char c = message.charAt(i);
-                    if (c == '"') {
-                        printer.print("\"");
-                    } else if (c >= ' ' && c <= '~') {
-                        printer.print("" + c);
-                    } else {
-                        throw new RuntimeException("Bad assertion message string.");
-                    }
-                }
-                printer.print("\"");
-            }
-            printer.print(");");
-        }
-    }
-
-    public void visit(BlockStmt n, LocalSymbolTable arg) {
-        printer.printLn("{");
-        if (n.getStmts() != null) {
-            printer.indent();
-            for (Statement s : n.getStmts()) {
-                s.accept(this, arg);
-                printer.printLn();
-            }
-            printer.unindent();
-        }
-        printer.print("}");
-
-    }
-
-    public void visit(LabeledStmt n, LocalSymbolTable arg) {
-        // Only conditionless for loops are needed and supported
-        // Not implementing general Java continue semantics in order
-        // to keep the generated C++ more readable.
-        Statement stmt = n.getStmt();
-        if (stmt instanceof ForStmt) {
-            ForStmt forLoop = (ForStmt) stmt;
-            if (!(forLoop.getInit() == null && forLoop.getCompare() == null && forLoop.getUpdate() == null)) {
-                forLoopsWithCondition.add(n.getLabel());
-            }
-        } else {
-            throw new IllegalStateException(
-                    "Only for loop supported as labeled statement. Line: "
-                            + n.getBeginLine());
-        }
-        String label = n.getLabel();
-        if (labels.contains(label)) {
-            printer.unindent();
-            printer.print(label);
-            printer.indent();
-            printer.printLn(":");
-        }
-        stmt.accept(this, arg);
-        printer.printLn();
-        label += "_end";
-        if (labels.contains(label)) {
-            printer.unindent();
-            printer.print(label);
-            printer.indent();
-            printer.print(":;");
-        }
-    }
-
-    public void visit(EmptyStmt n, LocalSymbolTable arg) {
-        printer.print(";");
-    }
-
-    public void visit(ExpressionStmt n, LocalSymbolTable arg) {
-        Expression e = n.getExpression();
-        if (isCompletedCharacterReference(e)) {
-            printer.print(cppTypes.completedCharacterReference());
-            printer.print(";");
-            return;
-        }
-        boolean needsCondition = isTokenizerErrorReportingExpression(e);
-        if (!needsCondition && isDroppedExpression(e)) {
-            return;
-        }
-        if (needsCondition) {
-            printer.print("if (");
-            printer.print(cppTypes.tokenizerErrorCondition());
-            printer.printLn(") {");
-            printer.indent();
-        }
-        e.accept(this, arg);
-        if (!inConstructorBody) {
-            printer.print(";");
-        }
-        if (needsCondition) {
-            printer.printLn();
-            printer.unindent();
-            printer.print("}");
-        }
-    }
-
-    private void visitTransition(MethodCallExpr call, LocalSymbolTable arg) {
-        List<Expression> args = call.getArgs();
-        if (reportTransitions) {
-            printer.print(cppTypes.transition());
-            printer.print("(");
-            printer.print(cppTypes.firstTransitionArg());
-            printer.print(", ");
-            args.get(1).accept(this, arg);
-            printer.print(", ");
-            args.get(2).accept(this, arg);
-            printer.print(", ");
-            args.get(3).accept(this, arg);
-            printer.print(")");
-        } else {
-            args.get(1).accept(this, arg);
-        }
-    }
-
-    private boolean isTokenizerErrorReportingExpression(Expression e) {
-        if (!reportTransitions) {
-            return false;
-        }
-        if (e instanceof MethodCallExpr) {
-            MethodCallExpr methodCallExpr = (MethodCallExpr) e;
-            String name = methodCallExpr.getName();
-            if (supportErrorReporting && !name.startsWith("errHtml4")
-                    && ("stateLoop".equals(currentMethod))
-                    && (name.startsWith("err") || name.startsWith("maybeErr"))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean isCompletedCharacterReference(Expression e) {
-        if (!reportTransitions) {
-            return false;
-        }
-        if (e instanceof MethodCallExpr) {
-            MethodCallExpr methodCallExpr = (MethodCallExpr) e;
-            String name = methodCallExpr.getName();
-            if (name.equals("completedNamedCharacterReference")) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean isDroppedExpression(Expression e) {
-        if (e instanceof MethodCallExpr) {
-            MethodCallExpr methodCallExpr = (MethodCallExpr) e;
-            String name = methodCallExpr.getName();
-            if (name.startsWith("fatal") || name.startsWith("note")
-                    || name.startsWith("errHtml4") || name.startsWith("warn")
-                    || name.startsWith("maybeWarn")) {
-                return true;
-            }
-            if (supportErrorReporting
-                    && ("stateLoop".equals(currentMethod) && !reportTransitions)
-                    && (name.startsWith("err") || name.startsWith("maybeErr"))) {
-                return true;
-            }
-            if (name.equals("completedNamedCharacterReference")
-                    && !reportTransitions) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void visit(SwitchStmt n, LocalSymbolTable arg) {
-        printer.print("switch (");
-        n.getSelector().accept(this, arg);
-        printer.printLn(") {");
-        if (n.getEntries() != null) {
-            printer.indent();
-            for (SwitchEntryStmt e : n.getEntries()) {
-                e.accept(this, arg);
-            }
-            printer.unindent();
-        }
-        printer.print("}");
-
-    }
-
-    public void visit(SwitchEntryStmt n, LocalSymbolTable arg) {
-        if (n.getLabel() != null) {
-            boolean isMenuitem = n.getLabel().toString().equals("MENUITEM");
-            if (isMenuitem) {
-                printer.printWithoutIndent("#ifdef ENABLE_VOID_MENUITEM\n");
-            }
-            printer.print("case ");
-            n.getLabel().accept(this, arg);
-            printer.print(":");
-            if (isMenuitem) {
-                printer.printWithoutIndent("\n#endif");
-            }
-        } else {
-            printer.print("default:");
-        }
-        if (isNoStatement(n.getStmts())) {
-            printer.printLn();
-            printer.indent();
-            if (n.getLabel() == null) {
-                printer.printLn("; // fall through");
-            }
-            printer.unindent();
-        } else {
-            printer.printLn(" {");
-            printer.indent();
-            for (Statement s : n.getStmts()) {
-                s.accept(this, arg);
-                printer.printLn();
-            }
-            printer.unindent();
-            printer.printLn("}");
-        }
-    }
-
-    private boolean isNoStatement(List<Statement> stmts) {
-        if (stmts == null) {
-            return true;
-        }
-        for (Statement statement : stmts) {
-            if (!isDroppableStatement(statement)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isDroppableStatement(Statement statement) {
-        if (statement instanceof AssertStmt) {
-            return true;
-        } else if (statement instanceof ExpressionStmt) {
-            ExpressionStmt es = (ExpressionStmt) statement;
-            if (isDroppedExpression(es.getExpression())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void visit(BreakStmt n, LocalSymbolTable arg) {
-        if (n.getId() != null) {
-            printer.print(cppTypes.breakMacro());
-            printer.print("(");
-            printer.print(n.getId());
-            printer.print(")");
-        } else {
-            printer.print("break");
-        }
-        printer.print(";");
-    }
-
-    public void visit(ReturnStmt n, LocalSymbolTable arg) {
-        printer.print("return");
-        if (n.getExpr() != null) {
-            printer.print(" ");
-            n.getExpr().accept(this, arg);
-        }
-        printer.print(";");
-    }
-
-    public void visit(EnumDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        currentAnnotations = n.getAnnotations();
-        // if (annotations != null) {
-        // for (AnnotationExpr a : annotations) {
-        // a.accept(this, arg);
-        // printer.printLn();
-        // }
-        // }
-        printModifiers(n.getModifiers());
-
-        printer.print("enum ");
-        printer.print(n.getName());
-
-        currentAnnotations = null;
-
-        if (n.getImplements() != null) {
-            printer.print(" implements ");
-            for (Iterator<ClassOrInterfaceType> i = n.getImplements().iterator(); i.hasNext();) {
-                ClassOrInterfaceType c = i.next();
-                c.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-
-        printer.printLn(" {");
-        printer.indent();
-        if (n.getEntries() != null) {
-            printer.printLn();
-            for (Iterator<EnumConstantDeclaration> i = n.getEntries().iterator(); i.hasNext();) {
-                EnumConstantDeclaration e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        if (n.getMembers() != null) {
-            printer.printLn(";");
-            printMembers(n.getMembers(), arg);
-        } else {
-            if (n.getEntries() != null) {
-                printer.printLn();
-            }
-        }
-        printer.unindent();
-        printer.print("}");
-    }
-
-    public void visit(EnumConstantDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        currentAnnotations = n.getAnnotations();
-        // if (annotations != null) {
-        // for (AnnotationExpr a : annotations) {
-        // a.accept(this, arg);
-        // printer.printLn();
-        // }
-        // }
-        printer.print(n.getName());
-
-        currentAnnotations = null;
-
-        if (n.getArgs() != null) {
-            printer.print("(");
-            for (Iterator<Expression> i = n.getArgs().iterator(); i.hasNext();) {
-                Expression e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-            printer.print(")");
-        }
-
-        if (n.getClassBody() != null) {
-            printer.printLn(" {");
-            printer.indent();
-            printMembers(n.getClassBody(), arg);
-            printer.unindent();
-            printer.printLn("}");
-        }
-    }
-
-    public void visit(EmptyMemberDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        printer.print(";");
-    }
-
-    public void visit(InitializerDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        if (n.isStatic()) {
-            printer.print("static ");
-        }
-        n.getBlock().accept(this, arg);
-    }
-
-    public void visit(IfStmt n, LocalSymbolTable arg) {
-        if (TranslatorUtils.isDocumentModeHandlerNullCheck(n.getCondition())) {
-            Statement then = n.getThenStmt();
-            if (then instanceof BlockStmt) {
-                BlockStmt block = (BlockStmt) then;
-                List<Statement> statements = block.getStmts();
-                if (statements != null && statements.size() == 1) {
-                    statements.get(0).accept(this, arg);
-                } else {
-                    then.accept(this, arg);
-                }
-            } else {
-                then.accept(this, arg);
-            }
-        } else if (!TranslatorUtils.isErrorHandlerIf(n.getCondition(), supportErrorReporting)) {
-            if (TranslatorUtils.isErrorOnlyBlock(n.getThenStmt(), supportErrorReporting)) {
-                if (n.getElseStmt() != null
-                        && !TranslatorUtils.isErrorOnlyBlock(n.getElseStmt(), supportErrorReporting)) {
-                    printer.print("if (");
-                    if (n.getCondition() instanceof BinaryExpr) {
-                        BinaryExpr binExpr = (BinaryExpr) n.getCondition();
-                        switch (binExpr.getOperator()) {
-                            case equals:
-                                binExpr.getLeft().accept(this, arg);
-                                printer.print(" != ");
-                                binExpr.getRight().accept(this, arg);
-                                break;
-                            case notEquals:
-                                binExpr.getLeft().accept(this, arg);
-                                printer.print(" == ");
-                                binExpr.getRight().accept(this, arg);
-                                break;
-                            default:
-                                printer.print("!(");
-                                formatCondition(n.getCondition(), arg);
-                                printer.print(")");
-                                break;
-                        }
-                    } else {
-                        printer.print("!(");
-                        formatCondition(n.getCondition(), arg);
-                        printer.print(")");
-                    }
-                    printer.print(") ");
-                    n.getElseStmt().accept(this, arg);
-                }
-            } else {
-                boolean unlikely = (currentMethod != null)
-                        && (Arrays.binarySearch(
-                                METHODS_WITH_UNLIKELY_CONDITIONS,
-                                currentMethod) >= 0);
-                printer.print("if (");
-                if (unlikely) {
-                    printer.print(cppTypes.unlikely());
-                    printer.print("(");
-                }
-                formatCondition(n.getCondition(), arg);
-                if (unlikely) {
-                    printer.print(")");
-                }
-                printer.print(") ");
-                n.getThenStmt().accept(this, arg);
-                if (n.getElseStmt() != null
-                        && !TranslatorUtils.isErrorOnlyBlock(n.getElseStmt(), supportErrorReporting)) {
-                    printer.print(" else ");
-                    n.getElseStmt().accept(this, arg);
-                }
-            }
-        }
-    }
-
-    private void formatCondition(Expression expr, LocalSymbolTable arg) {
-        if (expr instanceof BinaryExpr) {
-            BinaryExpr binExpr = (BinaryExpr) expr;
-            switch (binExpr.getOperator()) {
-                case notEquals:
-                    if (binExpr.getRight() instanceof NullLiteralExpr) {
-                        binExpr.getLeft().accept(this, arg);
-                        return;
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-        expr.accept(this, arg);
-    }
-
-
-    public void visit(WhileStmt n, LocalSymbolTable arg) {
-        printer.print("while (");
-        n.getCondition().accept(this, arg);
-        printer.print(") ");
-        n.getBody().accept(this, arg);
-    }
-
-    public void visit(ContinueStmt n, LocalSymbolTable arg) {
-        // Not supporting the general Java continue semantics.
-        // Instead, making the generated code more readable for the
-        // case at hand.
-        if (n.getId() != null) {
-            printer.print(cppTypes.continueMacro());
-            printer.print("(");
-            printer.print(n.getId());
-            printer.print(")");
-            if (forLoopsWithCondition.contains(n.getId())) {
-                throw new IllegalStateException(
-                        "Continue attempted with a loop that has a condition. "
-                                + className + " " + n.getId());
-            }
-        } else {
-            printer.print("continue");
-        }
-        printer.print(";");
-    }
-
-    public void visit(DoStmt n, LocalSymbolTable arg) {
-        printer.print("do ");
-        n.getBody().accept(this, arg);
-        printer.print(" while (");
-        n.getCondition().accept(this, arg);
-        printer.print(");");
-    }
-
-    public void visit(ForeachStmt n, LocalSymbolTable arg) {
-        printer.print("for (");
-        n.getVariable().accept(this, arg);
-        printer.print(" : ");
-        n.getIterable().accept(this, arg);
-        printer.print(") ");
-        n.getBody().accept(this, arg);
-    }
-
-    public void visit(ForStmt n, LocalSymbolTable arg) {
-        printer.print("for (");
-        if (n.getInit() != null) {
-            for (Iterator<Expression> i = n.getInit().iterator(); i.hasNext();) {
-                Expression e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(";");
-        if (n.getCompare() != null) {
-            printer.print(" ");
-            n.getCompare().accept(this, arg);
-        }
-        printer.print(";");
-        if (n.getUpdate() != null) {
-            printer.print(" ");
-            for (Iterator<Expression> i = n.getUpdate().iterator(); i.hasNext();) {
-                Expression e = i.next();
-                e.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(") ");
-        n.getBody().accept(this, arg);
-    }
-
-    public void visit(ThrowStmt n, LocalSymbolTable arg) {
-        printer.print("throw ");
-        n.getExpr().accept(this, arg);
-        printer.print(";");
-    }
-
-    public void visit(SynchronizedStmt n, LocalSymbolTable arg) {
-        printer.print("synchronized (");
-        n.getExpr().accept(this, arg);
-        printer.print(") ");
-        n.getBlock().accept(this, arg);
-    }
-
-    public void visit(TryStmt n, LocalSymbolTable arg) {
-        printer.print("try ");
-        n.getTryBlock().accept(this, arg);
-        if (n.getCatchs() != null) {
-            for (CatchClause c : n.getCatchs()) {
-                c.accept(this, arg);
-            }
-        }
-        if (n.getFinallyBlock() != null) {
-            printer.print(" finally ");
-            n.getFinallyBlock().accept(this, arg);
-        }
-    }
-
-    public void visit(CatchClause n, LocalSymbolTable arg) {
-        printer.print(" catch (");
-        n.getExcept().accept(this, arg);
-        printer.print(") ");
-        n.getCatchBlock().accept(this, arg);
-
-    }
-
-    public void visit(AnnotationDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        currentAnnotations = n.getAnnotations();
-        // if (annotations != null) {
-        // for (AnnotationExpr a : annotations) {
-        // a.accept(this, arg);
-        // printer.printLn();
-        // }
-        // }
-        printModifiers(n.getModifiers());
-
-        printer.print("@interface ");
-        printer.print(n.getName());
-        currentAnnotations = null;
-        printer.printLn(" {");
-        printer.indent();
-        if (n.getMembers() != null) {
-            printMembers(n.getMembers(), arg);
-        }
-        printer.unindent();
-        printer.print("}");
-    }
-
-    public void visit(AnnotationMemberDeclaration n, LocalSymbolTable arg) {
-        if (n.getJavaDoc() != null) {
-            n.getJavaDoc().accept(this, arg);
-        }
-        currentAnnotations = n.getAnnotations();
-        // if (annotations != null) {
-        // for (AnnotationExpr a : annotations) {
-        // a.accept(this, arg);
-        // printer.printLn();
-        // }
-        // }
-        printModifiers(n.getModifiers());
-
-        n.getType().accept(this, arg);
-        printer.print(" ");
-        printer.print(n.getName());
-        currentAnnotations = null;
-        printer.print("()");
-        if (n.getDefaultValue() != null) {
-            printer.print(" default ");
-            n.getDefaultValue().accept(this, arg);
-        }
-        printer.print(";");
-    }
-
-    public void visit(MarkerAnnotationExpr n, LocalSymbolTable arg) {
-        printer.print("@");
-        n.getName().accept(this, arg);
-    }
-
-    public void visit(SingleMemberAnnotationExpr n, LocalSymbolTable arg) {
-        printer.print("@");
-        n.getName().accept(this, arg);
-        printer.print("(");
-        n.getMemberValue().accept(this, arg);
-        printer.print(")");
-    }
-
-    public void visit(NormalAnnotationExpr n, LocalSymbolTable arg) {
-        printer.print("@");
-        n.getName().accept(this, arg);
-        printer.print("(");
-        if (n.getPairs() != null) {
-            for (Iterator<MemberValuePair> i = n.getPairs().iterator(); i.hasNext();) {
-                MemberValuePair m = i.next();
-                m.accept(this, arg);
-                if (i.hasNext()) {
-                    printer.print(", ");
-                }
-            }
-        }
-        printer.print(")");
-    }
-
-    public void visit(MemberValuePair n, LocalSymbolTable arg) {
-        printer.print(n.getName());
-        printer.print(" = ");
-        n.getValue().accept(this, arg);
-    }
-
-    public void visit(LineComment n, LocalSymbolTable arg) {
-        printer.print("//");
-        printer.printLn(n.getContent());
-    }
-
-    public void visit(BlockComment n, LocalSymbolTable arg) {
-        printer.print("/*");
-        printer.print(n.getContent());
-        printer.printLn("*/");
-    }
-
-    public void setLabels(Set<String> labels) {
-        this.labels = labels;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/GkAtomParser.java b/translator-src/nu/validator/htmlparser/cpptranslate/GkAtomParser.java
deleted file mode 100644
index 475a793b..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/GkAtomParser.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class GkAtomParser {
-
-    /* Please note we aren't looking for the following Atom definitions:
-       PseudoElementAtom or NonInheritingAnonBoxAtom or InheritingAnonBoxAtom */
-    private static final Pattern ATOM = Pattern.compile("^Atom\\(\"([^,]+)\",\\s*\"([^\"]*)\"\\).*$");
-    
-    private final BufferedReader reader;
-    
-    public GkAtomParser(Reader reader) {
-        this.reader = new BufferedReader(reader);
-    }
-    
-    public Map<String, String> parse() throws IOException {
-        Map<String, String> map = new HashMap<String, String>();
-        String line;
-        while((line = reader.readLine()) != null) {
-            Matcher m = ATOM.matcher(line.trim());
-            if (m.matches()) {
-                map.put(m.group(2), m.group(1));
-            }
-        }
-        return map;
-    }
-    
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java
deleted file mode 100644
index 6161746d..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.util.List;
-
-import japa.parser.ast.body.FieldDeclaration;
-import japa.parser.ast.body.MethodDeclaration;
-import japa.parser.ast.body.ModifierSet;
-import japa.parser.ast.body.Parameter;
-import japa.parser.ast.body.VariableDeclarator;
-import japa.parser.ast.stmt.BlockStmt;
-import japa.parser.ast.type.PrimitiveType;
-import japa.parser.ast.type.ReferenceType;
-
-public class HVisitor extends CppVisitor {
-
-    private enum Visibility {
-        NONE, PRIVATE, PUBLIC, PROTECTED,
-    }
-
-    private Visibility previousVisibility = Visibility.NONE;
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#printMethodNamespace()
-     */
-    @Override protected void printMethodNamespace() {
-    }
-
-    public HVisitor(CppTypes cppTypes, SymbolTable symbolTable) {
-        super(cppTypes, symbolTable);
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#startClassDeclaration()
-     */
-    @Override protected void startClassDeclaration() {
-        printer.print("#ifndef ");
-        printer.print(className);
-        printer.printLn("_h");
-        printer.print("#define ");
-        printer.print(className);
-        printer.printLn("_h");
-
-        printer.printLn();
-
-        String[] incs = cppTypes.boilerplateIncludes(javaClassName);
-        for (int i = 0; i < incs.length; i++) {
-            String inc = incs[i];
-            if (className.equals(inc)) {
-                continue;
-            }
-            printer.print("#include \"");
-            printer.print(inc);
-            printer.printLn(".h\"");
-        }
-
-        printer.printLn();
-
-        String[] forwDecls = cppTypes.boilerplateForwardDeclarations();
-        for (int i = 0; i < forwDecls.length; i++) {
-            String decl = forwDecls[i];
-            printer.print("class ");
-            printer.print(decl);
-            printer.printLn(";");
-        }
-
-        printer.printLn();
-
-        for (int i = 0; i < Main.H_LIST.length; i++) {
-            String klazz = Main.H_LIST[i];
-            if (!(klazz.equals(javaClassName) || klazz.equals("StackNode"))) {
-                printer.print("class ");
-                printer.print(cppTypes.classPrefix());
-                printer.print(klazz);
-                printer.printLn(";");
-            }
-        }
-
-        printer.printLn();
-
-        String[] otherDecls = cppTypes.boilerplateDeclarations(javaClassName);
-        for (int i = 0; i < otherDecls.length; i++) {
-            String decl = otherDecls[i];
-            printer.printLn(decl);
-        }
-
-        printer.printLn();
-
-        printer.print("class ");
-        printer.print(className);
-        if ("StateSnapshot".equals(javaClassName) || "TreeBuilder".equals(javaClassName)) {
-            printer.print(" : public ");
-            printer.print(cppTypes.treeBuilderStateInterface());
-        }
-        printer.printLn();
-        printer.printLn("{");
-        printer.indent();
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#endClassDeclaration()
-     */
-    @Override protected void endClassDeclaration() {
-        printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC);
-        printer.printLn("void initializeStatics();");
-        printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC);
-        printer.printLn("void releaseStatics();");
-
-        printer.unindent();
-
-        if (cppTypes.hasSupplement(javaClassName)) {
-            printer.printLn();
-            printer.print("#include \"");
-            printer.print(className);
-            printer.printLn("HSupplement.h\"");
-        }
-
-        printer.printLn("};");
-        printer.printLn();
-        printer.print("#endif");
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#printModifiers(int)
-     */
-    @Override protected void printModifiers(int modifiers) {
-        if (ModifierSet.isPrivate(modifiers)) {
-            if (previousVisibility != Visibility.PRIVATE) {
-                printer.unindent();
-                printer.printLn("private:");
-                printer.indent();
-                previousVisibility = Visibility.PRIVATE;
-            }
-        } else if (ModifierSet.isProtected(modifiers)) {
-            if (previousVisibility != Visibility.PROTECTED) {
-                printer.unindent();
-                printer.printLn("protected:");
-                printer.indent();
-                previousVisibility = Visibility.PROTECTED;
-            }
-        } else {
-            if (previousVisibility != Visibility.PUBLIC) {
-                printer.unindent();
-                printer.printLn("public:");
-                printer.indent();
-                previousVisibility = Visibility.PUBLIC;
-            }
-        }
-        if (inline()) {
-            printer.print("inline ");
-        }
-        if (virtual()) {
-            printer.print("virtual ");
-        }
-        if (ModifierSet.isStatic(modifiers)) {
-            printer.print("static ");
-        }
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#fieldDeclaration(japa.parser.ast.body.FieldDeclaration, java.lang.LocalSymbolTable)
-     */
-    @Override protected void fieldDeclaration(FieldDeclaration n, LocalSymbolTable arg) {
-        inField = true;
-        int modifiers = n.getModifiers();
-        List<VariableDeclarator> variables = n.getVariables();
-        VariableDeclarator declarator = variables.get(0);
-        if (ModifierSet.isStatic(modifiers) && ModifierSet.isFinal(modifiers)
-                && n.getType() instanceof PrimitiveType) {
-            PrimitiveType type = (PrimitiveType) n.getType();
-            if (type.getType() != PrimitiveType.Primitive.Int) {
-                throw new IllegalStateException(
-                        "Only int constant #defines supported.");
-            }
-            if (variables.size() != 1) {
-                throw new IllegalStateException(
-                        "More than one variable declared by one declarator.");
-            }
-            printModifiers(modifiers);
-            printer.print("const ");
-            n.getType().accept(this, arg);
-            printer.print(" ");
-            declarator.getId().accept(this, arg);
-            printer.print(" = ");
-            declarator.getInit().accept(this, arg);
-            printer.printLn(";");
-            printer.printLn();
-            symbolTable.addPrimitiveConstant(javaClassName, declarator.getId().toString());
-        } else {
-            if (n.getType() instanceof ReferenceType) {
-                ReferenceType rt = (ReferenceType) n.getType();
-                currentArrayCount = rt.getArrayCount();
-                if (currentArrayCount > 0
-                        && (rt.getType() instanceof PrimitiveType) && declarator.getInit() != null) {
-                    if (!ModifierSet.isStatic(modifiers)) {
-                        throw new IllegalStateException(
-                                "Non-static array case not supported here." + declarator);
-                    }
-                    if (noLength()) {
-                        inPrimitiveNoLengthFieldDeclarator = true;
-                    }
-                }
-            }
-            printModifiers(modifiers);
-            inStatic = ModifierSet.isStatic(modifiers);
-            n.getType().accept(this, arg);
-            printer.print(" ");
-            if (ModifierSet.isStatic(modifiers)) {
-                if ("AttributeName".equals(n.getType().toString())) {
-                    printer.print("ATTR_");
-                } else if ("ElementName".equals(n.getType().toString())) {
-                    printer.print("ELT_");
-                }
-            }
-            declarator.getId().accept(this, arg);
-            printer.printLn(";");
-            currentArrayCount = 0;
-            inStatic = false;
-            inPrimitiveNoLengthFieldDeclarator = false;
-        }
-        inField = false;
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#printConstructorExplicit(java.util.List<japa.parser.ast.body.Parameter>)
-     */
-    @Override protected void printConstructorExplicit(List<Parameter> params) {
-        if (params != null && params.size() == 1) {
-            printer.print("explicit ");
-        }
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#printConstructorBody(japa.parser.ast.stmt.BlockStmt, java.lang.LocalSymbolTable)
-     */
-    @Override protected void printConstructorBody(BlockStmt block, LocalSymbolTable arg) {
-        printer.printLn(";");
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#visit(japa.parser.ast.body.MethodDeclaration, java.lang.LocalSymbolTable)
-     */
-    @Override public void visit(MethodDeclaration n, LocalSymbolTable arg) {
-        arg = new LocalSymbolTable(javaClassName, symbolTable);
-        printMethodDeclaration(n, arg);
-    }
-
-    /**
-     * @see nu.validator.htmlparser.cpptranslate.CppVisitor#inHeader()
-     */
-    @Override protected boolean inHeader() {
-        return true;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/LabelVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/LabelVisitor.java
deleted file mode 100644
index f27d465a..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/LabelVisitor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import japa.parser.ast.stmt.BreakStmt;
-import japa.parser.ast.stmt.ContinueStmt;
-import japa.parser.ast.visitor.VoidVisitorAdapter;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class LabelVisitor extends VoidVisitorAdapter<Object> {
-
-    private final Set<String> labels = new HashSet<String>();
-    
-    public LabelVisitor() {
-    }
-
-    /**
-     * @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.stmt.BreakStmt, java.lang.Object)
-     */
-    @Override
-    public void visit(BreakStmt n, Object arg) {
-        String label = n.getId();
-        if (label != null) {
-            labels.add(label + "_end");
-        }
-    }
-
-    /**
-     * @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.stmt.ContinueStmt, java.lang.Object)
-     */
-    @Override
-    public void visit(ContinueStmt n, Object arg) {
-        String label = n.getId();
-        if (label != null) {
-            labels.add(label);
-        }
-    }
-
-    /**
-     * Returns the labels.
-     * 
-     * @return the labels
-     */
-    public Set<String> getLabels() {
-        return labels;
-    }
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/LicenseExtractor.java b/translator-src/nu/validator/htmlparser/cpptranslate/LicenseExtractor.java
deleted file mode 100644
index e4030f43..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/LicenseExtractor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-public class LicenseExtractor {
-
-    private final Reader reader;
-    
-    public LicenseExtractor(File file) throws IOException {
-        this.reader = new InputStreamReader(new FileInputStream(file), "utf-8");
-    }
-    
-    public String extract() throws IOException {
-        boolean prevWasAsterisk = false;
-        StringBuilder sb = new StringBuilder();
-        int c;
-        while ((c = reader.read()) != -1) {
-            sb.append((char)c);
-            switch (c) {
-                case '*':
-                    prevWasAsterisk = true;
-                    continue;
-                case '/':
-                    if (prevWasAsterisk) {
-                        return sb.toString();                        
-                    }
-                default:
-                    prevWasAsterisk = false;
-                    continue;
-            }
-        }
-        return "";
-    }
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/LocalSymbolTable.java b/translator-src/nu/validator/htmlparser/cpptranslate/LocalSymbolTable.java
deleted file mode 100644
index a9375e88..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/LocalSymbolTable.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class LocalSymbolTable {
-
-    private final Map<String, Type> locals = new HashMap<String, Type>();
-
-    private final String javaClassName;
-    
-    private final SymbolTable delegate;    
-
-    /**
-     * @param javaClassName
-     * @param delegate
-     */
-    public LocalSymbolTable(String javaClassName, SymbolTable delegate) {
-        this.javaClassName = javaClassName;
-        this.delegate = delegate;
-    }
-
-    public void putLocalType(String name, Type type) {
-        locals.put(name, type);
-    }
-
-    /**
-     * @param klazz
-     * @param variable
-     * @return
-     * @see nu.validator.htmlparser.cpptranslate.SymbolTable#getFieldType(java.lang.String, java.lang.String)
-     */
-    public Type getVariableType(String klazz, String variable) {
-        if (klazz == null) {
-            Type type = locals.get(variable);
-            if (type != null) {
-                return type;
-            }
-        }
-        return delegate.getFieldType(((klazz == null || "this".equals(klazz)) ? javaClassName : klazz), variable);
-    }
-
-    /**
-     * @param klazz may be <code>null</code> or "this"
-     * @param method 
-     * @return
-     * @see nu.validator.htmlparser.cpptranslate.SymbolTable#getMethodReturnType(java.lang.String, java.lang.String)
-     */
-    public Type getMethodReturnType(String klazz, String method) {
-        return delegate.getMethodReturnType(((klazz == null || "this".equals(klazz)) ? javaClassName : klazz), method);
-    }
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/Main.java b/translator-src/nu/validator/htmlparser/cpptranslate/Main.java
deleted file mode 100644
index 741b7419..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/Main.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-
-import japa.parser.JavaParser;
-import japa.parser.ParseException;
-import japa.parser.ast.CompilationUnit;
-
-public class Main {
-
-    static final String[] H_LIST = {
-        "AttributeName",
-        "ElementName",
-        "Tokenizer",
-        "TreeBuilder",
-        "MetaScanner",
-        "StackNode",
-        "UTF16Buffer",
-        "StateSnapshot",
-        "Portability",
-    };
-
-    private static final String[] CPP_LIST = {
-        "AttributeName",
-        "ElementName",
-        "Tokenizer",
-        "TreeBuilder",
-        "MetaScanner",
-        "StackNode",
-        "UTF16Buffer",
-        "StateSnapshot",
-    };
-
-    /**
-     * @param args
-     * @throws ParseException
-     * @throws IOException
-     */
-    public static void main(String[] args) throws ParseException, IOException {
-        CppTypes cppTypes = new CppTypes(new File(args[2]), new File(args[3]));
-        SymbolTable symbolTable = new SymbolTable();
-
-        File javaDirectory = new File(args[0]);
-        File targetDirectory = new File(args[1]);
-        File cppDirectory = targetDirectory;
-        File javaCopyDirectory = new File(targetDirectory, "javasrc");
-
-        for (int i = 0; i < H_LIST.length; i++) {
-            parseFile(cppTypes, javaDirectory, cppDirectory, H_LIST[i], ".h", new HVisitor(cppTypes, symbolTable));
-            copyFile(new File(javaDirectory, H_LIST[i] + ".java"), new File(javaCopyDirectory, H_LIST[i] + ".java"));
-        }
-        for (int i = 0; i < CPP_LIST.length; i++) {
-            parseFile(cppTypes, javaDirectory, cppDirectory, CPP_LIST[i], ".cpp", new CppVisitor(cppTypes, symbolTable));
-        }
-        cppTypes.finished();
-    }
-
-    private static void copyFile(File input, File output) throws IOException {
-        if (input.getCanonicalFile().equals(output.getCanonicalFile())) {
-            return; // files are the same!
-        }
-        // This is horribly inefficient, but perf is not really much of a concern here.
-        FileInputStream in = new FileInputStream(input);
-        FileOutputStream out = new FileOutputStream(output);
-        int b;
-        while ((b = in.read()) != -1) {
-            out.write(b);
-        }
-        out.flush();
-        out.close();
-        in.close();
-    }
-
-    private static void parseFile(CppTypes cppTypes, File javaDirectory,
-            File cppDirectory, String className, String fne, CppVisitor visitor)
-            throws FileNotFoundException, UnsupportedEncodingException,
-            IOException {
-        File file = null;
-        try {
-            file = new File(javaDirectory, className + ".java");
-            String license = new LicenseExtractor(file).extract();
-            CompilationUnit cu = JavaParser.parse(new NoCppInputStream(
-                    new CppOnlyInputStream(new FileInputStream(file))), "utf-8");
-            LabelVisitor labelVisitor = new LabelVisitor();
-            cu.accept(labelVisitor, null);
-            visitor.setLabels(labelVisitor.getLabels());
-            cu.accept(visitor, null);
-            FileOutputStream out = new FileOutputStream(new File(cppDirectory,
-                    cppTypes.classPrefix() + className + fne));
-            OutputStreamWriter w = new OutputStreamWriter(out, "utf-8");
-            w.write(license);
-            w.write("\n\n/*\n * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.\n * Please edit "
-                    + className + ".java instead and regenerate.\n */\n\n");
-            w.write(visitor.getSource());
-            w.close();
-        } catch (ParseException e) {
-            System.err.println(file);
-            e.printStackTrace();
-        }
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/NoCppInputStream.java b/translator-src/nu/validator/htmlparser/cpptranslate/NoCppInputStream.java
deleted file mode 100644
index 86f9ae7f..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/NoCppInputStream.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-public class NoCppInputStream extends InputStream {
-
-    private final static char[] START = "[NOCPP[".toCharArray();
-    
-    private final static char[] END = "]NOCPP]".toCharArray();
-    
-    private int state;
-    
-    private final InputStream delegate;
-    
-    
-    
-    /**
-     * @param delegate
-     */
-    public NoCppInputStream(InputStream delegate) {
-        this.delegate = delegate;
-        this.state = 0;
-    }
-
-    @Override public int read() throws IOException {
-        int c;
-        if (state == START.length) {
-            int endState = 0;
-            while (endState != END.length) {
-                c = delegate.read();
-                if (END[endState] == c) {
-                    endState++;
-                } else {
-                    endState = 0;
-                }
-            }
-            state = 0;
-        }
-        c = delegate.read();
-        if (START[state] == c) {
-            state++;
-        } else {
-            state = 0;
-        }
-        return c;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/StringLiteralParser.java b/translator-src/nu/validator/htmlparser/cpptranslate/StringLiteralParser.java
deleted file mode 100644
index 305f516a..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/StringLiteralParser.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class StringLiteralParser {
-
-    private static final Pattern STRING_DECL = Pattern.compile("^.*\\(([^ ]+) = new nsString\\(\\)\\)->Assign\\(NS_LITERAL_STRING\\(\"([^\"]*)\"\\)\\);.*$");
-    
-    private final BufferedReader reader;
-    
-    public StringLiteralParser(Reader reader) {
-        this.reader = new BufferedReader(reader);
-    }
-    
-    public Map<String, String> parse() throws IOException {
-        Map<String, String> map = new HashMap<String, String>();
-        String line;
-        while((line = reader.readLine()) != null) {
-            Matcher m = STRING_DECL.matcher(line);
-            if (m.matches()) {
-                map.put(m.group(2), m.group(1));
-            }
-        }
-        return map;
-    }
-    
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/StringPair.java b/translator-src/nu/validator/htmlparser/cpptranslate/StringPair.java
deleted file mode 100644
index e24247f7..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/StringPair.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-public class StringPair {
-
-    /**
-     * @param first
-     * @param second
-     */
-    public StringPair(String first, String second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    private final String first;
-
-    private final String second;
-
-    /**
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override public boolean equals(Object o) {
-        if (o instanceof StringPair) {
-            StringPair other = (StringPair) o;
-            return first.equals(other.first) && second.equals(other.second);
-        }
-        return false;
-    }
-
-    /**
-     * @see java.lang.Object#hashCode()
-     */
-    @Override public int hashCode() {
-        return first.hashCode() ^ second.hashCode();
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java b/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java
deleted file mode 100644
index 09ba5a00..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class SymbolTable {
-
-    private final Set<StringPair> primitiveConstants = new HashSet<StringPair>();
-
-    private final Map<StringPair, Type> fields = new HashMap<StringPair, Type>();
-
-    private final Map<StringPair, Type> methodReturns = new HashMap<StringPair, Type>();
-
-    /**
-     * This is a sad hack to work around the fact the there's no real symbol
-     * table yet.
-     *
-     * @param field
-     * @return
-     */
-    public boolean isAttributeOrElementName(String klazz, String field) {
-        if (isPrimitiveConstant(klazz, field)) {
-            return false;
-        }
-        return !("ATTRIBUTE_HASHES".equals(field)
-                || "ATTRIBUTE_NAMES".equals(field)
-                || "ELEMENT_HASHES".equals(field)
-                || "ELEMENT_NAMES".equals(field) || "ALL_NO_NS".equals(field));
-    }
-
-    public void addPrimitiveConstant(String klazz, String field) {
-        primitiveConstants.add(new StringPair(klazz, field));
-    }
-
-    public void putFieldType(String klazz, String field, Type type) {
-        fields.put(new StringPair(klazz, field), type);
-    }
-
-    public void putMethodReturnType(String klazz, String method, Type type) {
-        methodReturns.put(new StringPair(klazz, method), type);
-    }
-
-    public boolean isPrimitiveConstant(String klazz, String field) {
-        return primitiveConstants.contains(new StringPair(klazz, field));
-    }
-
-    public Type getFieldType(String klazz, String field) {
-        return fields.get(new StringPair(klazz, field));
-    }
-
-    public Type getMethodReturnType(String klazz, String method) {
-        return methodReturns.get(new StringPair(klazz, method));
-    }
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTableVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTableVisitor.java
deleted file mode 100644
index 00f7c574..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTableVisitor.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-import japa.parser.ast.body.ClassOrInterfaceDeclaration;
-import japa.parser.ast.body.FieldDeclaration;
-import japa.parser.ast.body.MethodDeclaration;
-
-public class SymbolTableVisitor extends AnnotationHelperVisitor<SymbolTable> {
-
-    private String javaClassName;
-    
-    /**
-     * @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.FieldDeclaration, java.lang.Object)
-     */
-    @Override public void visit(FieldDeclaration n, SymbolTable arg) {
-        currentAnnotations = n.getAnnotations();
-        arg.putFieldType(javaClassName, n.getVariables().get(0).getId().getName(), convertType(n.getType(), n.getModifiers()));
-    }
-
-    /**
-     * @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.MethodDeclaration, java.lang.Object)
-     */
-    @Override public void visit(MethodDeclaration n, SymbolTable arg) {
-        currentAnnotations = n.getAnnotations();
-        arg.putMethodReturnType(javaClassName, n.getName(), convertType(n.getType(), n.getModifiers()));
-    }
-
-    /**
-     * @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.ClassOrInterfaceDeclaration, java.lang.Object)
-     */
-    @Override public void visit(ClassOrInterfaceDeclaration n, SymbolTable arg) {
-        javaClassName = n.getName();
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/TranslatorUtils.java b/translator-src/nu/validator/htmlparser/cpptranslate/TranslatorUtils.java
deleted file mode 100644
index 866db093..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/TranslatorUtils.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package nu.validator.htmlparser.cpptranslate;
-
-import japa.parser.ast.expr.BinaryExpr;
-import japa.parser.ast.expr.BinaryExpr.Operator;
-import japa.parser.ast.expr.Expression;
-import japa.parser.ast.expr.MethodCallExpr;
-import japa.parser.ast.expr.NameExpr;
-import japa.parser.ast.expr.NullLiteralExpr;
-import japa.parser.ast.stmt.BlockStmt;
-import japa.parser.ast.stmt.ExpressionStmt;
-import japa.parser.ast.stmt.Statement;
-
-import java.util.List;
-
-public class TranslatorUtils {
-    public static boolean isErrorOnlyBlock(Statement elseStmt, boolean supportErrorReporting) {
-        if (supportErrorReporting) {
-            return false;
-        }
-        if (elseStmt instanceof BlockStmt) {
-            BlockStmt block = (BlockStmt) elseStmt;
-            List<Statement> statements = block.getStmts();
-            if (statements == null) {
-                return false;
-            }
-            if (statements.size() != 1) {
-                return false;
-            }
-            Statement statement = statements.get(0);
-            if (statement instanceof ExpressionStmt) {
-                ExpressionStmt exprStmt = (ExpressionStmt) statement;
-                Expression expr = exprStmt.getExpression();
-                if (expr instanceof MethodCallExpr) {
-                    MethodCallExpr call = (MethodCallExpr) expr;
-                    if (call.getName().startsWith("err")) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    public static boolean isErrorHandlerIf(Expression condition, boolean supportErrorReporting) {
-        if (supportErrorReporting) {
-            return false;
-        }
-        while (condition instanceof BinaryExpr) {
-            BinaryExpr binex = (BinaryExpr) condition;
-            condition = binex.getLeft();
-            if (condition instanceof NameExpr) {
-                NameExpr name = (NameExpr) condition;
-                if ("errorHandler".equals(name.getName())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public static boolean isDocumentModeHandlerNullCheck(Expression condition) {
-        if (condition instanceof BinaryExpr) {
-            BinaryExpr binex = (BinaryExpr) condition;
-            if (binex.getOperator() != Operator.notEquals) {
-                return false;
-            }
-            if (!(binex.getRight() instanceof NullLiteralExpr)) {
-                return false;
-            }
-            Expression left = binex.getLeft();
-            if (left instanceof NameExpr) {
-                NameExpr name = (NameExpr) left;
-                if ("documentModeHandler".equals(name.getName())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/Type.java b/translator-src/nu/validator/htmlparser/cpptranslate/Type.java
deleted file mode 100644
index 783a3bbd..00000000
--- a/translator-src/nu/validator/htmlparser/cpptranslate/Type.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.cpptranslate;
-
-public class Type {
-
-    /**
-     * @param type
-     * @param arrayCount
-     * @param noLength
-     * @param modifiers
-     */
-    public Type(String type, int arrayCount, boolean noLength, int modifiers) {
-        this.type = type;
-        this.arrayCount = arrayCount;
-        this.noLength = noLength;
-        this.modifiers = modifiers;
-    }
-
-    private final String type;
-    
-    private final int arrayCount;
-    
-    private final boolean noLength;
-    
-    private final int modifiers;
-
-    /**
-     * Returns the type.
-     * 
-     * @return the type
-     */
-    public String getType() {
-        return type;
-    }
-
-    /**
-     * Returns the arrayCount.
-     * 
-     * @return the arrayCount
-     */
-    public int getArrayCount() {
-        return arrayCount;
-    }
-
-    /**
-     * Returns the noLength.
-     * 
-     * @return the noLength
-     */
-    public boolean isNoLength() {
-        return noLength;
-    }
-
-    /**
-     * Returns the modifiers.
-     * 
-     * @return the modifiers
-     */
-    public int getModifiers() {
-        return modifiers;
-    }
-    
-}
diff --git a/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharacters.java b/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharacters.java
deleted file mode 100644
index 69ddb318..00000000
--- a/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharacters.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2008-2009 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in 
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.generator;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class GenerateNamedCharacters {
-    
-    private static final int LEAD_OFFSET = 0xD800 - (0x10000 >> 10);
-
-    private static final Pattern LINE_PATTERN = Pattern.compile("<td> <code title=\"\">([^<]*)</code> </td> <td> U\\+(\\S*) (?:U\\+(\\S*) )?</td>");
-
-    private static String toUString(int c) {
-        String hexString = Integer.toHexString(c);
-        switch (hexString.length()) {
-            case 1:
-                return "\\u000" + hexString;
-            case 2:
-                return "\\u00" + hexString;
-            case 3:
-                return "\\u0" + hexString;
-            case 4:
-                return "\\u" + hexString;
-            default:
-                throw new RuntimeException("Unreachable.");
-        }
-    }
-
-    private static int charToIndex(char c) {
-        if (c >= 'a' && c <= 'z') {
-            return c - 'a' + 26;
-        } else if (c >= 'A' && c <= 'Z') {
-            return c - 'A';
-        }
-        throw new IllegalArgumentException("Bad char in named character name: "
-                + c);
-    }
-
-    private static boolean allZero(int[] arr) {
-        for (int i = 0; i < arr.length; i++) {
-            if (arr[i] != 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * @param args
-     * @throws IOException
-     */
-    public static void main(String[] args) throws IOException {
-        TreeMap<String, String> entities = new TreeMap<String, String>();
-        BufferedReader reader = new BufferedReader(new InputStreamReader(
-                System.in, "utf-8"));
-        String line;
-        while ((line = reader.readLine()) != null) {
-            Matcher m = LINE_PATTERN.matcher(line);
-            while (m.find()) {
-                String value;
-                if (m.group(3) != null) {
-                    // two BMP chars
-                    int firstIntVal = Integer.parseInt(m.group(2), 16);
-                    int secondIntVal = Integer.parseInt(m.group(3), 16);
-                    value = ("" + (char)firstIntVal) + (char)secondIntVal;
-                } else {
-                    // one code point
-                    int intVal = Integer.parseInt(m.group(2), 16);
-                    if (intVal <= 0xFFFF) {
-                        value = "" + (char)intVal;
-                    } else {
-                        int high = (LEAD_OFFSET + (intVal >> 10));
-                        int low = (0xDC00 + (intVal & 0x3FF));
-                        value = ("" + (char)high) + (char)low;
-                    }
-                }
-                entities.put(m.group(1), value);
-            }
-        }
-
-        // Java initializes arrays to zero. Zero is our magic value for no hilo
-        // value.
-        int[][] hiLoTable = new int['z' + 1]['Z' - 'A' + 1 + 'z' - 'a' + 1];
-
-        String firstName = entities.entrySet().iterator().next().getKey();
-        int firstKey = charToIndex(firstName.charAt(0));
-        int secondKey = firstName.charAt(1);
-        int row = 0;
-        int lo = 0;
-
-        System.out.print("static final @NoLength @CharacterName String[] NAMES = {\n");
-        for (Map.Entry<String, String> entity : entities.entrySet()) {
-            String name = entity.getKey();
-            int newFirst = charToIndex(name.charAt(0));
-            int newSecond = name.charAt(1);
-            assert !(newFirst == 0 && newSecond == 0) : "Not prepared for name starting with AA";
-            if (firstKey != newFirst || secondKey != newSecond) {
-                hiLoTable[secondKey][firstKey] = ((row - 1) << 16) | lo;
-                lo = row;
-                firstKey = newFirst;
-                secondKey = newSecond;
-            }
-            System.out.print("\"");
-            System.out.print(name.substring(2));
-            System.out.print("\",\n");
-            row++;
-        }
-        System.out.print("};\n");
-
-        hiLoTable[secondKey][firstKey] = ((entities.size() - 1) << 16) | lo;
-
-        System.out.print("static final @NoLength char[][] VALUES = {\n");
-        for (Map.Entry<String, String> entity : entities.entrySet()) {
-            String value = entity.getValue();
-            System.out.print("{");
-            if (value.length() == 1) {
-                char c = value.charAt(0);
-                if (c == '\'') {
-                    System.out.print("\'\\\'\'");
-                } else if (c == '\n') {
-                    System.out.print("\'\\n\'");
-                } else if (c == '\\') {
-                    System.out.print("\'\\\\\'");
-                } else if (c <= 0xFFFF) {
-                    System.out.print("\'");
-                    System.out.print(toUString(c));
-                    System.out.print("\'");
-                }
-            } else {
-                System.out.print("\'");
-                System.out.print(toUString(value.charAt(0)));
-                System.out.print("\', \'");
-                System.out.print(toUString(value.charAt(1)));
-                System.out.print("\'");                
-            }
-            System.out.print("},\n");
-        }
-        System.out.print("};\n");
-
-        System.out.print("static final @NoLength int[][] HILO_ACCEL = {\n");
-        for (int i = 0; i < hiLoTable.length; i++) {
-            if (allZero(hiLoTable[i])) {
-                System.out.print("null,\n");
-            } else {
-                System.out.print("{");
-                for (int j = 0; j < hiLoTable[i].length; j++) {
-                    System.out.print(hiLoTable[i][j]);
-                    System.out.print(", ");
-                }
-                System.out.print("},\n");
-            }
-        }
-        System.out.print("};\n");
-    }
-
-}
diff --git a/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharactersCpp.java b/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharactersCpp.java
deleted file mode 100644
index ea9d47b1..00000000
--- a/translator-src/nu/validator/htmlparser/generator/GenerateNamedCharactersCpp.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is HTML Parser C++ Translator code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Henri Sivonen <hsivonen@iki.fi>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-package nu.validator.htmlparser.generator;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import nu.validator.htmlparser.cpptranslate.CppTypes;
-
-public class GenerateNamedCharactersCpp {
-
-    /**
-     * The license for the output of this program except for data files.
-     */
-    private static final String OUTPUT_LICENSE = "/*\n"
-            + " * Copyright (c) 2008-2010 Mozilla Foundation\n"
-            + " *\n"
-            + " * Permission is hereby granted, free of charge, to any person obtaining a \n"
-            + " * copy of this software and associated documentation files (the \"Software\"), \n"
-            + " * to deal in the Software without restriction, including without limitation \n"
-            + " * the rights to use, copy, modify, merge, publish, distribute, sublicense, \n"
-            + " * and/or sell copies of the Software, and to permit persons to whom the \n"
-            + " * Software is furnished to do so, subject to the following conditions:\n"
-            + " *\n"
-            + " * The above copyright notice and this permission notice shall be included in \n"
-            + " * all copies or substantial portions of the Software.\n"
-            + " *\n"
-            + " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \n"
-            + " * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \n"
-            + " * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL \n"
-            + " * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \n"
-            + " * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \n"
-            + " * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \n"
-            + " * DEALINGS IN THE SOFTWARE.\n" + " */\n\n";
-    
-    /**
-     * The license for the generated data files.
-     */
-    private static final String DATA_LICENSE = "/*\n"
-            + " * Copyright 2004-2010 Apple Computer, Inc., Mozilla Foundation, and Opera \n"
-            + " * Software ASA.\n"
-            + " * \n"
-            + " * You are granted a license to use, reproduce and create derivative works of \n"
-            + " * this document.\n" + " */\n\n";
-
-    private static final int LEAD_OFFSET = 0xD800 - (0x10000 >> 10);
-
-    private static final Pattern LINE_PATTERN = Pattern.compile("<td> <code title=\"\">([^<]*)</code> </td> <td> U\\+(\\S*) (?:U\\+(\\S*) )?</td>");
-
-    private static String toHexString(int c) {
-        String hexString = Integer.toHexString(c);
-        switch (hexString.length()) {
-            case 1:
-                return "0x000" + hexString;
-            case 2:
-                return "0x00" + hexString;
-            case 3:
-                return "0x0" + hexString;
-            case 4:
-                return "0x" + hexString;
-            default:
-                throw new RuntimeException("Unreachable.");
-        }
-    }
-
-    /**
-     * @param args
-     * @throws IOException
-     */
-    public static void main(String[] args) throws IOException {
-        TreeMap<String, String> entities = new TreeMap<String, String>();
-        BufferedReader reader = new BufferedReader(new InputStreamReader(
-                new FileInputStream(args[0]), "utf-8"));
-        String line;
-        while ((line = reader.readLine()) != null) {
-            Matcher m = LINE_PATTERN.matcher(line);
-            while (m.find()) {
-                String value;
-                if (m.group(3) != null) {
-                    // two BMP chars
-                    int firstIntVal = Integer.parseInt(m.group(2), 16);
-                    int secondIntVal = Integer.parseInt(m.group(3), 16);
-                    value = ("" + (char)firstIntVal) + (char)secondIntVal;
-                } else {
-                    // one code point
-                    int intVal = Integer.parseInt(m.group(2), 16);
-                    if (intVal <= 0xFFFF) {
-                        value = "" + (char)intVal;
-                    } else {
-                        int high = (LEAD_OFFSET + (intVal >> 10));
-                        int low = (0xDC00 + (intVal & 0x3FF));
-                        value = ("" + (char)high) + (char)low;
-                    }
-                }
-                entities.put(m.group(1), value);
-            }
-        }
-
-        CppTypes cppTypes = new CppTypes(null, null);
-        File targetDirectory = new File(args[1]);
-
-        generateH(targetDirectory, cppTypes, entities);
-        generateInclude(targetDirectory, cppTypes, entities);
-        generateCpp(targetDirectory, cppTypes, entities);
-        generateAccelH(targetDirectory, cppTypes, entities);
-        generateAccelCpp(targetDirectory, cppTypes, entities);
-    }
-
-    private static void generateAccelCpp(File targetDirectory,
-            CppTypes cppTypes, TreeMap<String, String> entities) throws IOException {
-        String includeFile = cppTypes.classPrefix()
-                + "NamedCharactersInclude.h";
-        File cppFile = new File(targetDirectory, cppTypes.classPrefix()
-                + "NamedCharactersAccel.cpp");
-        Writer out = new OutputStreamWriter(new FileOutputStream(cppFile),
-                "utf-8");
-
-        out.write(DATA_LICENSE);
-        out.write('\n');
-        out.write("#include \"" + cppTypes.classPrefix()
-                + "NamedCharactersAccel.h\"\n");
-        out.write("\n");
-
-        // Java initializes arrays to zero. Zero is our magic value for no hilo
-        // value.
-        int[][] hiLoTable = new int['z' + 1]['Z' - 'A' + 1 + 'z' - 'a' + 1];
-
-        String firstName = entities.entrySet().iterator().next().getKey();
-        int firstKey = charToIndex(firstName.charAt(0));
-        int secondKey = firstName.charAt(1);
-        int row = 0;
-        int lo = 0;
-
-        for (Map.Entry<String, String> entity : entities.entrySet()) {
-            String name = entity.getKey();
-            int newFirst = charToIndex(name.charAt(0));
-            int newSecond = name.charAt(1);
-            assert !(newFirst == 0 && newSecond == 0) : "Not prepared for name starting with AA";
-            if (firstKey != newFirst || secondKey != newSecond) {
-                hiLoTable[secondKey][firstKey] = ((row - 1) << 16) | lo;
-                lo = row;
-                firstKey = newFirst;
-                secondKey = newSecond;
-            }
-            row++;
-        }
-
-        hiLoTable[secondKey][firstKey] = ((entities.size() - 1) << 16) | lo;
-
-        for (int i = 0; i < hiLoTable.length; i++) {
-            if (!allZero(hiLoTable[i])) {
-                out.write("static " + cppTypes.intType() + " const HILO_ACCEL_"
-                        + i + "[] = {\n");
-                for (int j = 0; j < hiLoTable[i].length; j++) {
-                    if (j != 0) {
-                        out.write(", ");
-                    }
-                    out.write("" + hiLoTable[i][j]);
-                }
-                out.write("\n};\n\n");
-            }
-        }
-
-        out.write("const int32_t* const " + cppTypes.classPrefix()
-                + "NamedCharactersAccel::HILO_ACCEL[] = {\n");
-        for (int i = 0; i < hiLoTable.length; i++) {
-            if (i != 0) {
-                out.write(",\n");
-            }
-            if (allZero(hiLoTable[i])) {
-                out.write("  0");
-            } else {
-                out.write("  HILO_ACCEL_" + i);
-            }
-        }
-        out.write("\n};\n\n");
-
-        out.flush();
-        out.close();
-    }
-
-    private static void generateAccelH(File targetDirectory, CppTypes cppTypes,
-            TreeMap<String, String> entities) throws IOException {
-        File hFile = new File(targetDirectory, cppTypes.classPrefix()
-                + "NamedCharactersAccel.h");
-        Writer out = new OutputStreamWriter(new FileOutputStream(hFile),
-                "utf-8");
-        out.write(DATA_LICENSE);
-        out.write("#ifndef " + cppTypes.classPrefix() + "NamedCharactersAccel_h\n");
-        out.write("#define " + cppTypes.classPrefix() + "NamedCharactersAccel_h\n");
-        out.write('\n');
-
-        String[] includes = cppTypes.namedCharactersIncludes();
-        for (int i = 0; i < includes.length; i++) {
-            String include = includes[i];
-            out.write("#include \"" + include + ".h\"\n");
-        }
-
-        out.write('\n');
-
-        out.write("class " + cppTypes.classPrefix() + "NamedCharactersAccel\n");
-        out.write("{\n");
-        out.write("  public:\n");
-        out.write("    static const " + cppTypes.intType()
-                + "* const HILO_ACCEL[];\n");
-        out.write("};\n");
-
-        out.write("\n#endif // " + cppTypes.classPrefix()
-                + "NamedCharactersAccel_h\n");
-        out.flush();
-        out.close();
-    }
-
-    private static void generateH(File targetDirectory, CppTypes cppTypes,
-            Map<String, String> entities) throws IOException {
-        File hFile = new File(targetDirectory, cppTypes.classPrefix()
-                + "NamedCharacters.h");
-        Writer out = new OutputStreamWriter(new FileOutputStream(hFile),
-                "utf-8");
-        out.write(OUTPUT_LICENSE);
-        out.write("#ifndef " + cppTypes.classPrefix() + "NamedCharacters_h\n");
-        out.write("#define " + cppTypes.classPrefix() + "NamedCharacters_h\n");
-        out.write('\n');
-
-        String[] includes = cppTypes.namedCharactersIncludes();
-        for (int i = 0; i < includes.length; i++) {
-            String include = includes[i];
-            out.write("#include \"" + include + ".h\"\n");
-        }
-
-        out.write("\nstruct ");
-        out.write(cppTypes.characterNameTypeDeclaration());
-        out.write(" {\n  ");
-        out.write(cppTypes.unsignedShortType());
-        out.write(" nameStart;\n  ");
-        out.write(cppTypes.unsignedShortType());
-        out.write(" nameLen;\n  #ifdef DEBUG\n  ");
-        out.write(cppTypes.intType());
-        out.write(" n;\n  #endif\n  ");
-        out.write(cppTypes.intType());
-        out.write(" length() const;\n  ");
-        out.write(cppTypes.charType());
-        out.write(" charAt(");
-        out.write(cppTypes.intType());
-        out.write(" index) const;\n};\n\n");
-
-        out.write("class " + cppTypes.classPrefix() + "NamedCharacters\n");
-        out.write("{\n");
-        out.write("  public:\n");
-        out.write("    static const " + cppTypes.characterNameTypeDeclaration() + " NAMES[];\n");
-        out.write("    static const " + cppTypes.charType() + " VALUES[][2];\n");
-        out.write("    static " + cppTypes.charType() + "** WINDOWS_1252;\n");
-        out.write("    static void initializeStatics();\n");
-        out.write("    static void releaseStatics();\n");
-        out.write("};\n");
-
-        out.write("\n#endif // " + cppTypes.classPrefix()
-                + "NamedCharacters_h\n");
-        out.flush();
-        out.close();
-    }
-
-    private static void generateInclude(File targetDirectory,
-            CppTypes cppTypes, Map<String, String> entities) throws IOException {
-        File includeFile = new File(targetDirectory, cppTypes.classPrefix()
-                + "NamedCharactersInclude.h");
-        Writer out = new OutputStreamWriter(new FileOutputStream(includeFile),
-                "utf-8");
-
-        out.write(DATA_LICENSE);
-        out.write("/* Data generated from the table of named character references found at\n");
-        out.write(" *\n");
-        out.write(" *   http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references\n");
-        out.write(" *\n");
-        out.write(" * Files that #include this file must #define NAMED_CHARACTER_REFERENCE as a\n");
-        out.write(" * macro of four parameters:\n");
-        out.write(" *\n");
-        out.write(" *   1.  a unique integer N identifying the Nth [0,1,..] macro expansion in this file,\n");
-        out.write(" *   2.  a comma-separated sequence of characters comprising the character name,\n");
-        out.write(" *       without the first two letters or 0 if the sequence would be empty. \n");
-        out.write(" *       See Tokenizer.java.\n");
-        out.write(" *   3.  the length of this sequence of characters,\n");
-        out.write(" *   4.  placeholder flag (0 if argument #is not a placeholder and 1 if it is),\n");
-        out.write(" *   5.  a comma-separated sequence of char16_t literals corresponding\n");
-        out.write(" *       to the code-point(s) of the named character.\n");
-        out.write(" *\n");
-        out.write(" * The macro expansion doesn't have to refer to all or any of these parameters,\n");
-        out.write(" * but common sense dictates that it should involve at least one of them.\n");
-        out.write(" */\n");
-        out.write("\n");
-        out.write("// This #define allows the NAMED_CHARACTER_REFERENCE macro to accept comma-\n");
-        out.write("// separated sequences as single macro arguments.  Using commas directly would\n");
-        out.write("// split the sequence into multiple macro arguments.\n");
-        out.write("#define _ ,\n");
-        out.write("\n");
-
-        int i = 0;
-        for (Map.Entry<String, String> entity : entities.entrySet()) {
-            out.write("NAMED_CHARACTER_REFERENCE(" + i++ + ", ");
-            String name = entity.getKey();
-            writeNameInitializer(out, name, " _ ");
-            out.write(", " + (name.length() - 2) + ", ");
-            out.write((name.length() == 2 ? "1" : "0") + ", ");
-            writeValueInitializer(out, entity.getValue(), " _ ");
-            out.write(")\n");
-        }
-
-        out.write("\n");
-        out.write("#undef _\n");
-
-        out.flush();
-        out.close();
-    }
-
-    private static void writeNameInitializer(Writer out,
-            String name, String separator)
-            throws IOException {
-        out.write("/* " + name.charAt(0) + " " + name.charAt(1) + " */ ");
-        if (name.length() == 2) {
-            out.write("0");
-        } else {
-            for (int i = 2; i < name.length(); i++) {
-                out.write("'" + name.charAt(i) + "'");
-                if (i < name.length() - 1)
-                    out.write(separator);
-            }            
-        }
-    }
-
-    private static void writeValueInitializer(Writer out,
-            String value, String separator)
-            throws IOException {
-        if (value.length() == 1) {
-            out.write(toHexString(value.charAt(0)));
-            out.write(separator);
-            out.write("0");
-        } else {
-            out.write(toHexString(value.charAt(0)));
-            out.write(separator);
-            out.write(toHexString(value.charAt(1)));
-        }
-    }
-
-    private static void defineMacroAndInclude(Writer out, String expansion,
-            String includeFile) throws IOException {
-        out.write("#define NAMED_CHARACTER_REFERENCE(N, CHARS, LEN, FLAG, VALUE) \\\n"
-                + expansion + "\n");
-        out.write("#include \"" + includeFile + "\"\n");
-        out.write("#undef NAMED_CHARACTER_REFERENCE\n");
-    }
-
-    private static void defineMacroAndInclude(Writer out, String expansion,
-            String debugExpansion, String includeFile) throws IOException {
-        out.write("#ifdef DEBUG\n");
-        out.write("  #define NAMED_CHARACTER_REFERENCE(N, CHARS, LEN, FLAG, VALUE) \\\n"
-                + debugExpansion + "\n");
-        out.write("#else\n");
-        out.write("  #define NAMED_CHARACTER_REFERENCE(N, CHARS, LEN, FLAG, VALUE) \\\n"
-                + expansion + "\n");
-        out.write("#endif\n");
-        out.write("#include \"" + includeFile + "\"\n");
-        out.write("#undef NAMED_CHARACTER_REFERENCE\n");
-    }
-
-    private static void writeStaticMemberDeclaration(Writer out,
-            CppTypes cppTypes, String type, String name) throws IOException {
-        out.write(type + " " + cppTypes.classPrefix() + "NamedCharacters::"
-                + name + ";\n");
-    }
-
-    private static int charToIndex(char c) {
-        if (c >= 'a' && c <= 'z') {
-            return c - 'a' + 26;
-        } else if (c >= 'A' && c <= 'Z') {
-            return c - 'A';
-        }
-        throw new IllegalArgumentException("Bad char in named character name: "
-                + c);
-    }
-
-    private static boolean allZero(int[] arr) {
-        for (int i = 0; i < arr.length; i++) {
-            if (arr[i] != 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private static void generateCpp(File targetDirectory, CppTypes cppTypes,
-            Map<String, String> entities) throws IOException {
-        String includeFile = cppTypes.classPrefix()
-                + "NamedCharactersInclude.h";
-        File cppFile = new File(targetDirectory, cppTypes.classPrefix()
-                + "NamedCharacters.cpp");
-        Writer out = new OutputStreamWriter(new FileOutputStream(cppFile),
-                "utf-8");
-
-        out.write(OUTPUT_LICENSE);
-        out.write("#define " + cppTypes.classPrefix()
-                + "NamedCharacters_cpp_\n");
-
-        String[] includes = cppTypes.namedCharactersIncludes();
-        for (int i = 0; i < includes.length; i++) {
-            String include = includes[i];
-            out.write("#include \"" + include + ".h\"\n");
-        }
-
-        out.write('\n');
-        out.write("#include \"" + cppTypes.classPrefix()
-                + "NamedCharacters.h\"\n");
-        out.write("\n");
-
-        out.write("const " + cppTypes.charType() + " " + cppTypes.classPrefix()
-                + "NamedCharacters::VALUES[][2] = {\n");
-        defineMacroAndInclude(out, "{ VALUE },", includeFile);
-        // The useless terminator entry makes the above macro simpler with
-        // compilers that whine about a comma after the last item
-        out.write("{0, 0} };\n\n");
-
-        String staticMemberType = cppTypes.charType() + "**";
-        writeStaticMemberDeclaration(out, cppTypes, staticMemberType,
-                "WINDOWS_1252");
-
-        out.write("static " + cppTypes.charType()
-                + " const WINDOWS_1252_DATA[] = {\n");
-        out.write("  0x20AC,\n");
-        out.write("  0x0081,\n");
-        out.write("  0x201A,\n");
-        out.write("  0x0192,\n");
-        out.write("  0x201E,\n");
-        out.write("  0x2026,\n");
-        out.write("  0x2020,\n");
-        out.write("  0x2021,\n");
-        out.write("  0x02C6,\n");
-        out.write("  0x2030,\n");
-        out.write("  0x0160,\n");
-        out.write("  0x2039,\n");
-        out.write("  0x0152,\n");
-        out.write("  0x008D,\n");
-        out.write("  0x017D,\n");
-        out.write("  0x008F,\n");
-        out.write("  0x0090,\n");
-        out.write("  0x2018,\n");
-        out.write("  0x2019,\n");
-        out.write("  0x201C,\n");
-        out.write("  0x201D,\n");
-        out.write("  0x2022,\n");
-        out.write("  0x2013,\n");
-        out.write("  0x2014,\n");
-        out.write("  0x02DC,\n");
-        out.write("  0x2122,\n");
-        out.write("  0x0161,\n");
-        out.write("  0x203A,\n");
-        out.write("  0x0153,\n");
-        out.write("  0x009D,\n");
-        out.write("  0x017E,\n");
-        out.write("  0x0178\n");
-        out.write("};\n\n");
-
-        out.write("/**\n");
-        out.write(" * To avoid having lots of pointers in the |charData| array, below,\n");
-        out.write(" * which would cause us to have to do lots of relocations at library\n");
-        out.write(" * load time, store all the string data for the names in one big array.\n");
-        out.write(" * Then use tricks with enums to help us build an array that contains\n");
-        out.write(" * the positions of each within the big arrays.\n");
-        out.write(" */\n\n");
-
-        out.write("static const " + cppTypes.byteType() + " ALL_NAMES[] = {\n");
-
-        defineMacroAndInclude(out, "CHARS ,", includeFile);
-
-        out.write("};\n\n");        
-        
-        out.write("enum NamePositions {\n");
-        out.write("  DUMMY_INITIAL_NAME_POSITION = 0,\n");
-
-        out.write("/* enums don't take up space, so generate _START and _END */\n");
-        defineMacroAndInclude(out,
-                "NAME_##N##_DUMMY, /* automatically one higher than previous */ \\\n"
-                        + "NAME_##N##_START = NAME_##N##_DUMMY - 1, \\\n"
-                        + "NAME_##N##_END = NAME_##N##_START + LEN + FLAG,",
-                includeFile);
-
-        out.write("  DUMMY_FINAL_NAME_VALUE\n");
-        out.write("};\n\n");
-
-        String arrayLengthMacro = cppTypes.arrayLengthMacro();
-        String staticAssert = cppTypes.staticAssert();
-        if (staticAssert != null && arrayLengthMacro != null) {
-            out.write(staticAssert + "(" + arrayLengthMacro
-                    + "(ALL_NAMES) < 0x10000, \"Start positions should fit in 16 bits\");\n\n");
-        }
-
-        out.write("const " + cppTypes.characterNameTypeDeclaration() + " " + cppTypes.classPrefix()
-                + "NamedCharacters::NAMES[] = {\n");
-        defineMacroAndInclude(out, "{ NAME_##N##_START, LEN, },", "{ NAME_##N##_START, LEN, N },", includeFile);
-        out.write("};\n\n");
-
-        out.write(cppTypes.intType());
-        out.write("\n");
-        out.write(cppTypes.characterNameTypeDeclaration());
-        out.write("::length() const\n{\n  return nameLen;\n}\n\n");
-        out.write(cppTypes.charType());
-        out.write("\n");
-        out.write(cppTypes.characterNameTypeDeclaration());
-        out.write("::charAt(");
-        out.write("int32_t");
-        out.write(" index) const\n{\n  return static_cast<");
-        out.write(cppTypes.charType());
-        out.write("> (ALL_NAMES[nameStart + index]);\n}\n\n");
-        
-        out.write("void\n");
-        out.write(cppTypes.classPrefix()
-                + "NamedCharacters::initializeStatics()\n");
-        out.write("{\n");
-        out.write("  WINDOWS_1252 = new " + cppTypes.charType() + "*[32];\n");
-        out.write("  for (" + cppTypes.intType() + " i = 0; i < 32; ++i) {\n");
-        out.write("    WINDOWS_1252[i] = (" + cppTypes.charType()
-                + "*)&(WINDOWS_1252_DATA[i]);\n");
-        out.write("  }\n");
-        out.write("}\n");
-        out.write("\n");
-
-        out.write("void\n");
-        out.write(cppTypes.classPrefix()
-                + "NamedCharacters::releaseStatics()\n");
-        out.write("{\n");
-        out.write("  delete[] WINDOWS_1252;\n");
-        out.write("}\n");
-        out.flush();
-        out.close();
-    }
-}
diff --git a/xom/pom.xml b/xom/pom.xml
new file mode 100644
index 00000000..4f3f6521
--- /dev/null
+++ b/xom/pom.xml
@@ -0,0 +1,53 @@
+<!--
+ * Copyright (c) 2007-2012 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>nu.validator.htmlparser</groupId>
+    <artifactId>parent</artifactId>
+    <version>2.0</version>
+  </parent>
+
+  <artifactId>xom</artifactId>
+
+  <name>xom</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>nu.validator.htmlparser</groupId>
+      <artifactId>htmlparser</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>xom</groupId>
+      <artifactId>xom</artifactId>
+      <version>1.3.5</version>
+      <exclusions>
+        <exclusion>
+          <groupId>xml-apis</groupId>
+          <artifactId>xml-apis</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/xom/src/main/java/module-info.java b/xom/src/main/java/module-info.java
new file mode 100644
index 00000000..b42cd04f
--- /dev/null
+++ b/xom/src/main/java/module-info.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2020 Anthony Vanelverdinghe
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Provides an implementation of the HTML5 parsing algorithm in Java for applications.
+ * The parser is designed to work as a drop-in replacement for the XML parser in applications
+ * that already support XHTML 1.x content with an XML parser and use XOM to interface with the parser.
+ */
+@SuppressWarnings({"requires-automatic", "requires-transitive-automatic"})
+module nu.validator.htmlparser.xom {
+    requires transitive java.xml;
+    requires transitive nu.xom;
+    requires transitive nu.validator.htmlparser;
+
+    exports nu.validator.htmlparser.xom;
+}
diff --git a/src/nu/validator/htmlparser/xom/FormPointer.java b/xom/src/main/java/nu/validator/htmlparser/xom/FormPointer.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/FormPointer.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/FormPointer.java
diff --git a/src/nu/validator/htmlparser/xom/FormPtrElement.java b/xom/src/main/java/nu/validator/htmlparser/xom/FormPtrElement.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/FormPtrElement.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/FormPtrElement.java
diff --git a/src/nu/validator/htmlparser/xom/HtmlBuilder.java b/xom/src/main/java/nu/validator/htmlparser/xom/HtmlBuilder.java
similarity index 96%
rename from src/nu/validator/htmlparser/xom/HtmlBuilder.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/HtmlBuilder.java
index d5884723..2dcb1d76 100644
--- a/src/nu/validator/htmlparser/xom/HtmlBuilder.java
+++ b/xom/src/main/java/nu/validator/htmlparser/xom/HtmlBuilder.java
@@ -233,7 +233,7 @@ private void tokenize(InputSource is) throws ParsingException, IOException,
      * @param is the <code>InputSource</code>
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      */
     public Document build(InputSource is) throws ParsingException, IOException {
         lazyInit();
@@ -249,7 +249,7 @@ public Document build(InputSource is) throws ParsingException, IOException {
      * @param context the name of the context element (HTML namespace assumed)
      * @return the fragment
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      */
     public Nodes buildFragment(InputSource is, String context)
             throws IOException, ParsingException {
@@ -263,10 +263,10 @@ public Nodes buildFragment(InputSource is, String context)
      * Parse a fragment from SAX <code>InputSource</code>.
      * @param is the <code>InputSource</code>
      * @param contextLocal the local name of the context element
-     * @parem contextNamespace the namespace of the context element
+     * @param contextNamespace the namespace of the context element
      * @return the fragment
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      */
     public Nodes buildFragment(InputSource is, String contextLocal, String contextNamespace)
             throws IOException, ParsingException {
@@ -281,7 +281,7 @@ public Nodes buildFragment(InputSource is, String contextLocal, String contextNa
      * @param file the file
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.io.File)
      */
     @Override
@@ -296,7 +296,7 @@ public Document build(File file) throws ParsingException,
      * @param uri the base URI
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.io.InputStream, java.lang.String)
      */
     @Override
@@ -312,7 +312,7 @@ public Document build(InputStream stream, String uri)
      * @param stream the stream
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.io.InputStream)
      */
     @Override
@@ -327,7 +327,7 @@ public Document build(InputStream stream) throws ParsingException,
      * @param uri the base URI
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.io.Reader, java.lang.String)
      */
     @Override
@@ -343,7 +343,7 @@ public Document build(Reader stream, String uri) throws ParsingException,
      * @param stream the reader
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.io.Reader)
      */
     @Override
@@ -358,7 +358,7 @@ public Document build(Reader stream) throws ParsingException,
      * @param uri the base URI
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.lang.String, java.lang.String)
      */
     @Override
@@ -372,7 +372,7 @@ public Document build(String content, String uri) throws ParsingException,
      * @param uri the URI of the document
      * @return the document
      * @throws ParsingException in case of an XML violation
-     * @throws IOException if IO goes wrang
+     * @throws IOException if IO goes wrong
      * @see nu.xom.Builder#build(java.lang.String)
      */
     @Override
@@ -412,7 +412,7 @@ public void setTransitionHander(TransitionHandler handler) {
     /**
      * Indicates whether NFC normalization of source is being checked.
      * @return <code>true</code> if NFC normalization of source is being checked.
-     * @see nu.validator.htmlparser.impl.Tokenizer#isCheckingNormalization()
+     * @see nu.validator.htmlparser.io.Driver#isCheckingNormalization()
      */
     public boolean isCheckingNormalization() {
         return checkingNormalization;
@@ -421,7 +421,7 @@ public boolean isCheckingNormalization() {
     /**
      * Toggles the checking of the NFC normalization of source.
      * @param enable <code>true</code> to check normalization
-     * @see nu.validator.htmlparser.impl.Tokenizer#setCheckingNormalization(boolean)
+     * @see nu.validator.htmlparser.io.Driver#setCheckingNormalization(boolean)
      */
     public void setCheckingNormalization(boolean enable) {
         this.checkingNormalization = enable;
@@ -646,7 +646,7 @@ public void setNamePolicy(XmlViolationPolicy namePolicy) {
      * Sets the encoding sniffing heuristics.
      * 
      * @param heuristics the heuristics to set
-     * @see nu.validator.htmlparser.impl.Tokenizer#setHeuristics(nu.validator.htmlparser.common.Heuristics)
+     * @see nu.validator.htmlparser.io.Driver#setHeuristics(nu.validator.htmlparser.common.Heuristics)
      */
     public void setHeuristics(Heuristics heuristics) {
         this.heuristics = heuristics;
@@ -687,6 +687,7 @@ public XmlViolationPolicy getNamePolicy() {
      * Does nothing.
      * @deprecated
      */
+    @Deprecated
     public void setBogusXmlnsPolicy(
             XmlViolationPolicy bogusXmlnsPolicy) {
     }
@@ -696,6 +697,7 @@ public void setBogusXmlnsPolicy(
      * @deprecated
      * @return <code>XmlViolationPolicy.ALTER_INFOSET</code>
      */
+    @Deprecated
     public XmlViolationPolicy getBogusXmlnsPolicy() {
         return XmlViolationPolicy.ALTER_INFOSET;
     }
diff --git a/src/nu/validator/htmlparser/xom/ModalDocument.java b/xom/src/main/java/nu/validator/htmlparser/xom/ModalDocument.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/ModalDocument.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/ModalDocument.java
diff --git a/src/nu/validator/htmlparser/xom/Mode.java b/xom/src/main/java/nu/validator/htmlparser/xom/Mode.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/Mode.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/Mode.java
diff --git a/src/nu/validator/htmlparser/xom/SimpleNodeFactory.java b/xom/src/main/java/nu/validator/htmlparser/xom/SimpleNodeFactory.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/SimpleNodeFactory.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/SimpleNodeFactory.java
diff --git a/src/nu/validator/htmlparser/xom/XOMTreeBuilder.java b/xom/src/main/java/nu/validator/htmlparser/xom/XOMTreeBuilder.java
similarity index 100%
rename from src/nu/validator/htmlparser/xom/XOMTreeBuilder.java
rename to xom/src/main/java/nu/validator/htmlparser/xom/XOMTreeBuilder.java
diff --git a/xom/src/main/java/nu/validator/htmlparser/xom/package-info.java b/xom/src/main/java/nu/validator/htmlparser/xom/package-info.java
new file mode 100644
index 00000000..6fde4174
--- /dev/null
+++ b/xom/src/main/java/nu/validator/htmlparser/xom/package-info.java
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2007 Henri Sivonen
+
+ Permission is hereby granted, free of charge, to any person obtaining a 
+ copy of this software and associated documentation files (the "Software"), 
+ to deal in the Software without restriction, including without limitation 
+ the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ and/or sell copies of the Software, and to permit persons to whom the 
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in 
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * This package provides an HTML5 parser that exposes the document through the XOM API.
+ */
+package nu.validator.htmlparser.xom;
diff --git a/test-src/nu/validator/htmlparser/test/XomTest.java b/xom/src/test/java/nu/validator/htmlparser/test/XomTest.java
similarity index 100%
rename from test-src/nu/validator/htmlparser/test/XomTest.java
rename to xom/src/test/java/nu/validator/htmlparser/test/XomTest.java