Merge pull request #459 from NogginBops/sized-internal-format

Added SizedInternalFormat enum group for functions that need explicitly sized formats
diff --git a/ABI/index.php b/ABI/index.php
index ef5dfa2..fe9392a 100644
--- a/ABI/index.php
+++ b/ABI/index.php
@@ -69,21 +69,21 @@
 
     <ul>
     <li> Internal implementation dependent issues - details of direct
-	rendering, loadable driver modules, etc. Such details are
-	hidden from the public interfaces by the implementation,
-	and are irrelevant to applications using the ABI. </li>
+        rendering, loadable driver modules, etc. Such details are
+        hidden from the public interfaces by the implementation,
+        and are irrelevant to applications using the ABI. </li>
     <li> Operating systems other than Linux. Other platforms such as BSD
-	are welcome to use whatever comes out of this project, but we
-	are explicitly not trying to solve this problem for every free
-	OS in the world. </li>
+        are welcome to use whatever comes out of this project, but we
+        are explicitly not trying to solve this problem for every free
+        OS in the world. </li>
     <li> Changes to the OpenGL API. The definition of OpenGL is
-	controlled by the OpenGL Architecture Review Board, and we in no
-	way challenge this. A single GLX extension is required; this
-	extension has already been approved by the ARB. </li>
+        controlled by the OpenGL Architecture Review Board, and we in no
+        way challenge this. A single GLX extension is required; this
+        extension has already been approved by the ARB. </li>
     <li> Use of 3D outside the X11/GLX context. There are a variety of
-	approaches (fxMesa, GGI, etc.) that again are welcome to use
-	relevant parts of this project, but whose support is not part of
-	its goals. </li>
+        approaches (fxMesa, GGI, etc.) that again are welcome to use
+        relevant parts of this project, but whose support is not part of
+        its goals. </li>
     </ul>
 
 <p> 1.3. We believe all critical decisions have been made. Some
@@ -119,50 +119,50 @@
 
 <table border="1" class="center-table">
     <tr><td>GL datatype</td>
-	<td>Description</td>
-	<td>gcc equivalent for IA32</td></tr>
+        <td>Description</td>
+        <td>gcc equivalent for IA32</td></tr>
     <tr><td><tt>GLboolean</tt></td>
-	<td>8-bit boolean</td>
-	<td><tt>unsigned char</tt></td></tr>
+        <td>8-bit boolean</td>
+        <td><tt>unsigned char</tt></td></tr>
     <tr><td><tt>GLbyte</tt></td>
-	<td>signed 8-bit 2's-complement integer</td>
-	<td><tt>signed char</tt></td></tr>
+        <td>signed 8-bit 2's-complement integer</td>
+        <td><tt>signed char</tt></td></tr>
     <tr><td><tt>GLubyte</tt></td>
-	<td>unsigned 8-bit integer</td>
-	<td><tt>unsigned char</tt></td></tr>
+        <td>unsigned 8-bit integer</td>
+        <td><tt>unsigned char</tt></td></tr>
     <tr><td><tt>GLshort</tt></td>
-	<td>signed 16-bit 2's-complement integer</td>
-	<td><tt>short</tt></td></tr>
+        <td>signed 16-bit 2's-complement integer</td>
+        <td><tt>short</tt></td></tr>
     <tr><td><tt>GLushort</tt></td>
-	<td>unsigned 16-bit integer</td>
-	<td><tt>unsigned short</tt></td></tr>
+        <td>unsigned 16-bit integer</td>
+        <td><tt>unsigned short</tt></td></tr>
     <tr><td><tt>GLint</tt></td>
-	<td>signed 32-bit 2's-complement integer</td>
-	<td><tt>int</tt></td></tr>
+        <td>signed 32-bit 2's-complement integer</td>
+        <td><tt>int</tt></td></tr>
     <tr><td><tt>GLuint</tt></td>
-	<td>unsigned 32-bit integer</td>
-	<td><tt>unsigned int</tt></td></tr>
+        <td>unsigned 32-bit integer</td>
+        <td><tt>unsigned int</tt></td></tr>
     <tr><td><tt>GLsizei</tt></td>
-	<td>non-negative 32-bit binary integer size</td>
-	<td><tt>int</tt></td></tr>
+        <td>non-negative 32-bit binary integer size</td>
+        <td><tt>int</tt></td></tr>
     <tr><td><tt>GLenum</tt></td>
-	<td>enumerated 32-bit value</td>
-	<td><tt>unsigned int</tt></td></tr>
+        <td>enumerated 32-bit value</td>
+        <td><tt>unsigned int</tt></td></tr>
     <tr><td><tt>GLbitfield</tt></td>
-	<td>32 bit bitfield</td>
-	<td><tt>unsigned int</tt></td></tr>
+        <td>32 bit bitfield</td>
+        <td><tt>unsigned int</tt></td></tr>
     <tr><td><tt>GLfloat</tt></td>
-	<td>32-bit IEEE754 floating-point</td>
-	<td><tt>float</tt></td></tr>
+        <td>32-bit IEEE754 floating-point</td>
+        <td><tt>float</tt></td></tr>
     <tr><td><tt>GLclampf</tt></td>
-	<td>Same as GLfloat, but in range [0, 1]</td>
-	<td><tt>float</tt></td></tr>
+        <td>Same as GLfloat, but in range [0, 1]</td>
+        <td><tt>float</tt></td></tr>
     <tr><td><tt>GLdouble</tt></td>
-	<td>64-bit IEEE754 floating-point</td>
-	<td><tt>double</tt></td></tr>
+        <td>64-bit IEEE754 floating-point</td>
+        <td><tt>double</tt></td></tr>
     <tr><td><tt>GLclampd</tt></td>
-	<td>Same as GLdouble, but in range [0, 1]</td>
-	<td><tt>double</tt></td></tr>
+        <td>Same as GLdouble, but in range [0, 1]</td>
+        <td><tt>double</tt></td></tr>
 </table>
 
 <p> <a href="#issue2.1">Issues</a></p>
@@ -195,13 +195,13 @@
 
 <table cellspacing="1" border="1" class="center-table">
     <tr><td>Link name</td>
-	<td>Runtime name (<tt>DT_SONAME</tt>)</td>
+        <td>Runtime name (<tt>DT_SONAME</tt>)</td>
     </tr>
     <tr><td><tt>libGL.so<tt></td>
-	<td><tt>libGL.so.1<tt></td>
+        <td><tt>libGL.so.1<tt></td>
     </tr>
     <tr><td><tt>libGLU.so<tt></td>
-	<td><tt>libGLU.so.1<tt></td>
+        <td><tt>libGLU.so.1<tt></td>
     </tr>
 </table>
 
@@ -250,7 +250,7 @@
     <tt>libGL</tt> also must export an entry point called </p>
 
     <blockquote>
-	<tt>void (*glXGetProcAddressARB(const GLubyte *))();</tt>
+        <tt>void (*glXGetProcAddressARB(const GLubyte *))();</tt>
     </blockquote>
 
 <p> The <a href="http://www.opengl.org/registry/specs/ARB/get_proc_address.txt">full specification</a>
@@ -367,7 +367,7 @@
     registry at <a href="http://www.opengl.org/registry/">
     http://www.opengl.org/registry/</a>. </p>
 
-<p> The <a href="../api/glext.h">latest version of
+<p> The <a href="../api/GL/glext.h">latest version of
     <tt>glext.h</tt></a> is available in the registry. It is
     automatically generated from the master OpenGL function and
     enumerant registries, and is updated as new extensions are
@@ -378,11 +378,11 @@
     generating glext.h are also available. </p>
 
 <p> Likewise for GLX, a single header defining
-    all GLX extensions, <a href="../api/glxext.h"><tt>glxext.h</tt></a>,
+    all GLX extensions, <a href="../api/GL/glxext.h"><tt>glxext.h</tt></a>,
     is required and is maintained centrally. </p>
 
 <p> The registry also contains a header defining WGL
-    extensions, <a href="../api/wglext.h"><tt>wglext.h</tt></a>, but this is
+    extensions, <a href="../api/GL/wglext.h"><tt>wglext.h</tt></a>, but this is
     only for use on Windows; <tt>wglext.h</tt> is <b>not</b> required by
     or useful for the Linux ABI. </p>
 
@@ -420,8 +420,8 @@
     #define GL_EXT_<i>extensionname</i> 1<br>
     <i> Define enumerants specific to this extension</i><br>
     <i> Typedef function pointers for entry points specifically to
-	this extension, dynamically obtained
-	with glXGetProcAddressARB</i><br>
+        this extension, dynamically obtained
+        with glXGetProcAddressARB</i><br>
     #ifdef GL_GLEXT_PROTOTYPES<br>
     <i> Define prototypes specific to this extension</i><br>
     #endif<br>
diff --git a/README.adoc b/README.adoc
index b810918..9016764 100644
--- a/README.adoc
+++ b/README.adoc
@@ -1,3 +1,23 @@
+// XX to be filled in by the merger of this PR (likely Jon)
+= *Advance Notice of Pending XML Registry Change (posted 2021-01-08)*
+
+[WARNING]
+.Warning
+====
+Shortly after 2021-04-08, we will be removing the old-style group blocks
+(contained within the `groups` section at the top of the XML registry)
+The groups are intended to contain all the possible legal values
+for corresponding function parameters, but it is likely that many
+of the groups are out of date relative to current OpenGL and OpenGL
+ES specifications, and the many extensions to those specifications.
+As of Wednesday 8th January 2020, these group blocks have been
+deprecated in favour of group attributes declared inline with
+the enumerant itself, which are currently the only actively updated
+source for groupings. For more information, see public issue
+link:https://github.com/KhronosGroup/OpenGL-Registry/issues/335[#335].
+====
+
+
 = OpenGL-Registry
 
 
diff --git a/api/GL/glcorearb.h b/api/GL/glcorearb.h
index d625420..ea6acc8 100755
--- a/api/GL/glcorearb.h
+++ b/api/GL/glcorearb.h
@@ -4662,6 +4662,11 @@
 #define GL_SR8_EXT                        0x8FBD
 #endif /* GL_EXT_texture_sRGB_R8 */
 
+#ifndef GL_EXT_texture_sRGB_RG8
+#define GL_EXT_texture_sRGB_RG8 1
+#define GL_SRG8_EXT                       0x8FBE
+#endif /* GL_EXT_texture_sRGB_RG8 */
+
 #ifndef GL_EXT_texture_sRGB_decode
 #define GL_EXT_texture_sRGB_decode 1
 #define GL_TEXTURE_SRGB_DECODE_EXT        0x8A48
@@ -5612,6 +5617,12 @@
 #define GL_SHARED_EDGE_NV                 0xC0
 #endif /* GL_NV_path_rendering_shared_edge */
 
+#ifndef GL_NV_primitive_shading_rate
+#define GL_NV_primitive_shading_rate 1
+#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1
+#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2
+#endif /* GL_NV_primitive_shading_rate */
+
 #ifndef GL_NV_representative_fragment_test
 #define GL_NV_representative_fragment_test 1
 #define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F
diff --git a/api/GL/glext.h b/api/GL/glext.h
index f6499a5..4a4a5ce 100644
--- a/api/GL/glext.h
+++ b/api/GL/glext.h
@@ -32,7 +32,7 @@
 #define GLAPI extern
 #endif
 
-#define GL_GLEXT_VERSION 20201027
+#define GL_GLEXT_VERSION 20210107
 
 #include <KHR/khrplatform.h>
 
@@ -8536,6 +8536,11 @@
 #define GL_SR8_EXT                        0x8FBD
 #endif /* GL_EXT_texture_sRGB_R8 */
 
+#ifndef GL_EXT_texture_sRGB_RG8
+#define GL_EXT_texture_sRGB_RG8 1
+#define GL_SRG8_EXT                       0x8FBE
+#endif /* GL_EXT_texture_sRGB_RG8 */
+
 #ifndef GL_EXT_texture_sRGB_decode
 #define GL_EXT_texture_sRGB_decode 1
 #define GL_TEXTURE_SRGB_DECODE_EXT        0x8A48
@@ -10780,6 +10785,12 @@
 #endif
 #endif /* GL_NV_primitive_restart */
 
+#ifndef GL_NV_primitive_shading_rate
+#define GL_NV_primitive_shading_rate 1
+#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1
+#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2
+#endif /* GL_NV_primitive_shading_rate */
+
 #ifndef GL_NV_query_resource
 #define GL_NV_query_resource 1
 #define GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV 0x9540
diff --git a/api/GLES/gl.h b/api/GLES/gl.h
index e598367..2153011 100644
--- a/api/GLES/gl.h
+++ b/api/GLES/gl.h
@@ -17,7 +17,7 @@
 
 #include <GLES/glplatform.h>
 
-/* Generated on date 20201027 */
+/* Generated on date 20210107 */
 
 /* Generated C header for:
  * API: gles1
diff --git a/api/GLES/glext.h b/api/GLES/glext.h
index 037af10..61a6363 100644
--- a/api/GLES/glext.h
+++ b/api/GLES/glext.h
@@ -19,7 +19,7 @@
 #define GL_APIENTRYP GL_APIENTRY*
 #endif
 
-/* Generated on date 20201027 */
+/* Generated on date 20210107 */
 
 /* Generated C header for:
  * API: gles1
diff --git a/api/GLES2/gl2.h b/api/GLES2/gl2.h
index ef3fe7c..3c5e6d3 100644
--- a/api/GLES2/gl2.h
+++ b/api/GLES2/gl2.h
@@ -25,7 +25,7 @@
 #define GL_GLES_PROTOTYPES 1
 #endif
 
-/* Generated on date 20201027 */
+/* Generated on date 20210107 */
 
 /* Generated C header for:
  * API: gles2
diff --git a/api/GLES2/gl2ext.h b/api/GLES2/gl2ext.h
index 7c0b043..8a66d82 100644
--- a/api/GLES2/gl2ext.h
+++ b/api/GLES2/gl2ext.h
@@ -19,7 +19,7 @@
 #define GL_APIENTRYP GL_APIENTRY*
 #endif
 
-/* Generated on date 20201027 */
+/* Generated on date 20210107 */
 
 /* Generated C header for:
  * API: gles2
@@ -3442,6 +3442,12 @@
 #endif
 #endif /* GL_NV_polygon_mode */
 
+#ifndef GL_NV_primitive_shading_rate
+#define GL_NV_primitive_shading_rate 1
+#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1
+#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2
+#endif /* GL_NV_primitive_shading_rate */
+
 #ifndef GL_NV_read_buffer
 #define GL_NV_read_buffer 1
 #define GL_READ_BUFFER_NV                 0x0C02
@@ -3791,6 +3797,14 @@
 #endif
 #endif /* GL_QCOM_extended_get2 */
 
+#ifndef GL_QCOM_frame_extrapolation
+#define GL_QCOM_frame_extrapolation 1
+typedef void (GL_APIENTRYP PFNGLEXTRAPOLATETEX2DQCOMPROC) (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glExtrapolateTex2DQCOM (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor);
+#endif
+#endif /* GL_QCOM_frame_extrapolation */
+
 #ifndef GL_QCOM_framebuffer_foveated
 #define GL_QCOM_framebuffer_foveated 1
 #define GL_FOVEATION_ENABLE_BIT_QCOM      0x00000001
diff --git a/api/GLES3/gl3.h b/api/GLES3/gl3.h
index 7ad72f9..6bb4d8f 100644
--- a/api/GLES3/gl3.h
+++ b/api/GLES3/gl3.h
@@ -25,7 +25,7 @@
 #define GL_GLES_PROTOTYPES 1
 #endif
 
-/* Generated on date 20201027 */
+/* Generated on date 20210107 */
 
 /* Generated C header for:
  * API: gles2
diff --git a/extensions/ARB/ARB_indirect_parameters.txt b/extensions/ARB/ARB_indirect_parameters.txt
index 0dc05dc..f7024c6 100644
--- a/extensions/ARB/ARB_indirect_parameters.txt
+++ b/extensions/ARB/ARB_indirect_parameters.txt
@@ -36,8 +36,8 @@
 
 Version
 
-    Last Modified Date: 23 October 2017
-    Revision: 4
+    Last Modified Date: 11 November 2020
+    Revision: 5
 
 Number
 
@@ -139,7 +139,7 @@
         void MultiDrawArraysIndirectCountARB(enum mode,
                                              const void *indirect,
                                              intptr drawcount,
-                                             intptr maxdrawcount,
+                                             sizei maxdrawcount,
                                              sizei stride);
 
     behaves similarly to MultiDrawArraysIndirect, except that <drawcount>
@@ -218,3 +218,6 @@
      3    06/20/2013  pdaniell  Modify the <indirect> parameter type to
                                 const void *.
      4    10/23/2017  nhaehnle  Add COMMAND_BARRIER_BIT language.
+     5    11/11/2020  pdaniell  Fix the type of the maxdrawcount parameter
+                                of MultiDrawArraysIndirectCountARB to be
+                                sizei making it consistent in the extension.
diff --git a/extensions/EXT/EXT_disjoint_timer_query.txt b/extensions/EXT/EXT_disjoint_timer_query.txt
index 9c30452..d31619a 100644
--- a/extensions/EXT/EXT_disjoint_timer_query.txt
+++ b/extensions/EXT/EXT_disjoint_timer_query.txt
@@ -33,7 +33,7 @@
 
 Version
 
-    Version 8, December 11, 2019
+    Version 9, November 20, 2020
 
 Number
 
@@ -477,7 +477,7 @@
         
     (2) This example uses QueryCounter.
     
-        GLint queries[1];
+        GLint queries[2];
         GLint available = 0;
         GLint disjointOccurred = 0;
         /* Timer queries can contain more than 32 bits of data, so always
@@ -485,20 +485,24 @@
         GLuint64 timeStart, timeEnd, timeElapsed = 0;
 
         /* Create a query object. */
-        glGenQueries(1, queries);
+        glGenQueries(2, queries);
 
         /* Clear disjoint error */
         glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjointOccurred);
 
+        /* Query current timestamp before drawing */
+        glQueryCounterEXT(queries[0], GL_TIMESTAMP_EXT);
+
         /* Draw full rendertarget of objects */
 
-        glQueryCounterEXT(queries[0], GL_TIMESTAMP_EXT);
+        /* Query current timestamp after drawing */
+        glQueryCounterEXT(queries[1], GL_TIMESTAMP_EXT);
         
         /* Do some other work so you don't stall waiting for available */
         
         /* Wait for the query result to become available */
         while (!available) {
-            glGetQueryObjectiv(queries[0], GL_QUERY_RESULT_AVAILABLE, &available);
+            glGetQueryObjectiv(queries[1], GL_QUERY_RESULT_AVAILABLE, &available);
         }
         
         /* Check for disjoint operation. */
@@ -507,15 +511,18 @@
         /* If a disjoint operation occurred, continue without reading the the
            values */
         if (!disjointOccurred) {
+            /* Get timestamp for when rendertarget started. */
+            glGetQueryObjectui64vEXT(queries[0], GL_QUERY_RESULT, &timeStart);
             /* Get timestamp for when rendertarget finished. */
-            glGetQueryObjectui64vEXT(queries[0], GL_QUERY_RESULT, &timeElapsed);
+            glGetQueryObjectui64vEXT(queries[1], GL_QUERY_RESULT, &timeEnd);
+            /* See how much time the rendering took in nanoseconds. */
+            timeElapsed = timeEnd - timeStart;
             
             /* Do something useful with the time if a disjoint operation did
                not occur.  Note that care should be taken to use all
                significant bits of the result, not just the least significant
                32 bits. */
-                
-            AdjustObjectLODBasedOnDrawTime(i, timeElapsed);
+            AdjustObjectLODBasedOnDrawTime(timeElapsed);
         }
         
     (3) This example demonstrates how to measure the latency between GL
@@ -538,7 +545,7 @@
         glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjointOccurred);
         
         /* Queue a query to find out when the frame finishes on the GL */
-        glQueryCounterEXT(GL_TIMESTAMP_EXT, endFrameQuery);
+        glQueryCounterEXT(endFrameQuery, GL_TIMESTAMP_EXT);
 
         /* Get the current GL time without stalling the GL */
         glGetIntegerv(GL_TIMESTAMP_EXT, &flushTime);
@@ -754,6 +761,8 @@
     will not be set.
 
 Revision History
+    Revision 9, 2020/11/20 (xndcn)
+      - Minor fix of code sample
     Revision 8, 2019/12/11 (Jon Leech)
       - Add actual spec language defining GetInteger64vEXT (github
         OpenGL-Registry issue 326)
diff --git a/extensions/EXT/EXT_texture_sRGB_RG8.txt b/extensions/EXT/EXT_texture_sRGB_RG8.txt
index 35fac02..c973dba 100644
--- a/extensions/EXT/EXT_texture_sRGB_RG8.txt
+++ b/extensions/EXT/EXT_texture_sRGB_RG8.txt
@@ -12,6 +12,7 @@
     Maurice Ribble
     Tobias Hector
     Jan-Harald Fredriksen
+    Dylan Perks
     Contributors to EXT_texture_sRGB_R8, on which this is based.
 
 Contact
@@ -24,18 +25,28 @@
 
 Version
 
-    Last Modified Date: February 05, 2015
-    Revision: 3.0
+    Last Modified Date: December 11, 2020
+    Revision: 4
 
 Number
 
     OpenGL ES Extension #223
+    OpenGL Extension #555
 
 Dependencies
 
-    OpenGL ES 3.0 is required.
+    OpenGL ES 3.0 or OpenGL 1.2 is required.
 
-    This extension is written against the OpenGL ES 3.1 specification.
+    This extension is written against the OpenGL ES 3.1 and
+    OpenGL 4.6 (Core Profile) specifications.
+
+    This extension interacts with ARB_texture_view.
+
+    This extension interacts with EXT_texture_view.
+
+    This extension interacts with OES_texture_view.
+
+    This extension interacts with ARB_direct_state_access.
 
 Overview
 
@@ -49,8 +60,9 @@
 
 New Tokens
 
-    Accepted by the <internalformat> parameters of TexImage2D, TexImage3D,
-    TexStorage2D and TexStorage3D:
+    Accepted by the <internalformat> parameters of TexImage3D, TexImage2D,
+    TexImage1D, TexStorage3D, TexStorage2D, TexStorage1D, TextureStorage3D,
+    TextureStorage2D, and TextureStorage1D:
 
         SRG8_EXT    0x8FBE
 
@@ -78,6 +90,62 @@
         ---------------
         SRG8_EXT
 
+Additions to Chapter 8 of the OpenGL 4.6 (Core Profile) Specification
+(Textures and Samplers)
+
+    The following table entry is added to Table 8.2 (Valid combinations of
+    format, type and sized internalformat):
+
+        Format    Type             External Bytes per Pixel    Internal Format
+        ------    ----             ------------------------    ---------------
+        RG        UNSIGNED_BYTE    2                           SRG8_EXT
+
+    The following table entry is added to Table 8.12 (Correspondence of sized
+    internal color formats to base internal formats):
+
+        Sized Internal Format    Base Internal Format    R    G    B    A    S    CR    TF    Req. rend.    Req. tex.
+        ---------------------    --------------------    -    -    -    -    -    --    --    ----------    ---------
+        SRG8_EXT                 RG                      8    8                         X                   X
+    
+    The following table entry is added to Table 8.22 (Compatible internal
+    formats for TextureView):
+
+        Class              Internal formats
+        ---------------    ----------------
+        VIEW_CLASS_16_BITS  SRG8_EXT
+
+    The following table entry is added to Table 8.24 (sRGB texture internal
+    formats):
+
+        Internal Format
+        ---------------
+        SRG8_EXT
+        
+Dependencies on OpenGL
+        
+    If OpenGL is not supported, ignore all references to 1D textures,
+    including TexImage1D, TexStorage1D, and TextureStorage1D.
+    
+Dependencies on OpenGL 4.5 and ARB_direct_state_access
+
+    If neither OpenGL 4.5 nor ARB_direct_state_access are supported,
+    ignore all references to TextureStorage3D, TextureStorage2D, and
+    TextureStorage1D.
+
+Dependencies on ARB_texture_view
+
+    If ARB_texture_view is supported, add SRG8_EXT to the Internal formats
+    column of the VIEW_CLASS_16_BITS row in Table 3.X.2.
+
+Dependencies on EXT_texture_view
+
+    If EXT_texture_view is supported, add SRG8_EXT to the Internal formats
+    column of the VIEW_CLASS_16_BITS row in Table 8.X.2.
+
+Dependencies on OES_texture_view
+
+    If OES_texture_view is supported, add SRG8_EXT to the Internal formats
+    column of the VIEW_CLASS_16_BITS row in Table 8.X.2.
 
 Errors
 
@@ -92,3 +160,4 @@
     #01    2/5/2015    Tobias Hector      Initial revision.
     #02    2/5/2015    Tobias Hector      Fixed Table 8.13 entry and whitespace issues.
     #03    2/17/2015   Tobias Hector      Fixed Table 8.2 entry to correctly say 2 bytes.
+    #04    12/11/2020  Dylan Perks        Add GL interactions and register for GL
diff --git a/extensions/NV/NV_primitive_shading_rate.txt b/extensions/NV/NV_primitive_shading_rate.txt
new file mode 100644
index 0000000..dc0bb42
--- /dev/null
+++ b/extensions/NV/NV_primitive_shading_rate.txt
@@ -0,0 +1,267 @@
+Name
+
+    NV_primitive_shading_rate
+
+Name Strings
+
+    GL_NV_primitive_shading_rate
+
+Contact
+
+    Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)
+
+Contributors
+
+    Jeff Bolz, NVIDIA
+
+Status
+
+    Shipping
+
+Version
+
+    Last Modified:      October 30, 2020
+    Revision:           1
+
+Number
+
+    OpenGL Extension #554
+    OpenGL ES Extension #332
+
+Dependencies
+
+    This extension is written against the OpenGL 4.6 Specification
+    (Compatibility Profile), dated February 2, 2019.
+
+    OpenGL 4.5 or OpenGL ES 3.2 is required.
+
+    NV_shading_rate_image is required.
+
+    This extension requires support from the OpenGL Shading Language (GLSL)
+    extension "NV_primitive_shading_rate", which can be found at the Khronos
+    Group Github site here:
+
+        https://github.com/KhronosGroup/GLSL
+
+    This extension interacts with NV_mesh_shader.
+
+Overview
+
+    This extension builds on top of the NV_shading_rate_image extension to
+    provide OpenGL API support for using a per-primitive shading rate value to
+    control the computation of the rate used to process each fragment.
+
+    In the NV_shading_rate_image extension, the shading rate for each fragment
+    produced by a primitive is determined by looking up a texel in the bound
+    shading rate image and using that value as an index into a shading rate
+    palette.  That extension provides a separate shading rate image lookup
+    enable and palette for each viewport.  When a primitive is rasterized, the
+    implementation uses the enable and palette associated with the primitive's
+    viewport to determine the shading rate.
+
+    This extension decouples the shading rate image enables and palettes from
+    viewports.  The number of enables/palettes now comes from the
+    implementation-dependent constant SHADING_RATE_IMAGE_PALETTE_COUNT_NV.  When
+    SHADING_RATE_IMAGE_PER_PRIMITIVE_NV (added here) is enabled, the value of
+    the new gl_ShadingRateNV built-in output is used to select an enable and
+    palette to determine the shading rate.  Otherwise, the viewport number for
+    the primitive is used, as in NV_shading_rate_image.
+
+
+New Procedures and Functions
+
+    None.
+
+
+New Tokens
+
+    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled and by the
+    <pname> parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv,
+    GetDoublev:
+
+        SHADING_RATE_IMAGE_PER_PRIMITIVE_NV             0x95B1
+
+    Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
+    GetIntegerv, and GetFloatv:
+
+        SHADING_RATE_IMAGE_PALETTE_COUNT_NV             0x95B2
+
+
+Modifications to the OpenGL 4.6 Specification (Compatibility Profile)
+
+    Modify Section 14.3.1, Multisampling, as modified by the
+    NV_shading_rate_image extension.
+
+    (modify the introduction of the shading rate image functionality to decouple
+    shading rate image enables and viewports)
+
+    When using a shading rate image (Section 14.4.1), rasterization may produce
+    fragments covering multiple pixels, where each pixel is treated as a sample.
+    If any of the SHADING_RATE_IMAGE_NV enables is enabled, primitives will be
+    processed with multisample rasterization rules, regardless of the
+    MULTISAMPLE enable or the value of SAMPLE_BUFFERS.  ...
+
+
+    Modify Section 14.4.1, Shading Rate Image, as added by the
+    NV_shading_rate_image extension.
+
+    (rework the introduction of the shading rate image functionality to decouple
+    shading rate image enables and viewports)
+
+    Applications can specify the use of a shading rate that varies by (x,y)
+    location using a _shading rate image_.  For each primitive, the shading rate
+    image is enabled or disabled by selecting a single enable in an array of
+    enables whose size is given by the implementation-dependent constant
+    SHADING_RATE_IMAGE_PALETTE_COUNT_NV.  Use of a shading rate image is enabled
+    or disabled globally by using Enable or Disable with target
+    SHADING_RATE_IMAGE_NV.  A single shading rate image enable can be modified
+    by calling Enablei or Disablei with the constant SHADING_RATE_IMAGE_NV and
+    the index of the selected enable.  The shading rate image may only be used
+    with a framebuffer object.  When rendering to the default framebuffer, the
+    shading rate image enables are ignored and operations in this section are
+    disabled.  In the initial state, all shading rate image enables are
+    disabled.
+
+    The method used to select a single shading rate image enable used to process
+    each primitive is controlled by calling Enable or Disable with the target
+    SHADING_RATE_IMAGE_PER_PRIMITIVE_NV.  When enabled, a shading rate enable
+    used for a primitive is selected using an index taken from the value of the
+    built-in output gl_ShadingRateNV for the primitive's provoking vertex.  If
+    the value of gl_ShadingRateNV is negative or greater than or equal to the
+    number of shading rate enables, the shading rate used for a primitive is
+    undefined.  When SHADING_RATE_IMAGE_PER_PRIMITIVE_NV is disabled, a shading
+    rate enable is selected using the index of the viewport used for processing
+    the primitive.  In the initial state, SHADING_RATE_IMAGE_PER_PRIMITIVE_NV is
+    disabled.
+
+
+    (rework the introduction of the shading rate image functionality to decouple
+    shading rate image palettes and viewports)
+
+    A shading rate index is mapped to a _base shading rate_ using a lookup table
+    called the shading rate image palette.  There is a separate palette
+    associated with each shading rate image enable.  As with the shading rate
+    image enables, a single palette is selected for a primitive according to the
+    enable SHADING_RATE_IMAGE_PER_PRIMITIVE_NV.  The number of palettes and the
+    number of entries in each palette are given by the implementation-dependent
+    constants SHADING_RATE_IMAGE_PALETTE_COUNT_NV and
+    SHADING_RATE_IMAGE_PALETTE_SIZE_NV, respectively.  The base shading rate for
+    an (x,y) coordinate with a shading rate index of <i> will be given by entry
+    <i> of the selected palette.  If the shading rate index is greater than or
+    equal to the palette size, the results of the palette lookup are undefined.
+
+
+    (rework the introduction of ShadingRateImagePaletteNV to decouple shading
+    rate image palettes and viewports)
+
+      Shading rate image palettes are updated using the command
+
+        void ShadingRateImagePaletteNV(uint viewport, uint first, sizei count,
+                                       const enum *rates);
+
+      <viewport> specifies the number of the palette that should be updated.
+      [[ Note:  The formal parameter name <viewport> is a remnant of the
+      original NV_shading_rate_image extension, where palettes were tightly
+      coupled with viewports. ]]  <rates> is an array ...
+
+
+    (modify the discussion of ShadingRateImagePaletteNV errors to decouple
+    shading rate image palettes and viewports)
+
+        INVALID_VALUE is generated if <viewport> is greater than or equal to
+        SHADING_RATE_IMAGE_PALETTE_COUNT_NV.
+
+        INVALID_VALUE is generated if <first> plus <count> is greater than
+        SHADING_RATE_IMAGE_PALETTE_SIZE_NV.
+
+
+    (modify the discussion of GetShadingRateImagePaletteNV to decouple shading
+    rate image palettes and viewports)
+
+      Individual entries in the shading rate palette can be queried using the
+      command:
+
+        void GetShadingRateImagePaletteNV(uint viewport, uint entry,
+                                          enum *rate);
+
+      where <viewport> specifies the number of the palette to query and...
+      <entry> specifies the palette entry number.  [[ Note:  The formal
+      parameter name <viewport> is a remnant of the original
+      NV_shading_rate_image extension, where palettes were tightly coupled
+      with viewports. ]]  A single enum from Table X.1 is returned in <rate>.
+
+      Errors
+
+        INVALID_VALUE is generated if <viewport> is greater than or equal to
+        SHADING_RATE_IMAGE_PALETTE_COUNT_NV.
+
+        INVALID_VALUE is generated if <first> plus <count> is greater than
+        SHADING_RATE_IMAGE_PALETTE_SIZE_NV.
+
+
+    Modify Section 14.9.3, Multisample Fragment Operations, as edited by
+    NV_shading_rate_image.
+
+    (modify the discussion of the shading rate image multisample functionality
+    to decouple shading rate image enables and viewports)
+
+    ... This step is skipped if MULTISAMPLE is disabled or if the value of
+    SAMPLE_BUFFERS is not one, unless one or more of the SHADING_RATE_IMAGE_NV
+    enables are enabled.
+
+
+Dependencies on NV_mesh_shader
+
+    When NV_mesh_shader is supported, the "NV_primitive_shading_rate" GLSL
+    extension allows multi-view mesh shaders to write separate per-primitive
+    shading rates for each view using the built-in gl_ShadingRatePerViewNV[].
+    When gl_ShadingRatePerViewNV[] is used with
+    SHADING_RATE_IMAGE_PER_PRIMITIVE_NV enabled, a separate shading rate image
+    enable and palette will be used for each view.
+
+
+Additions to the AGL/GLX/WGL Specifications
+
+    None
+
+Errors
+
+    See the "Errors" sections for individual commands above.
+
+New State
+
+    Get Value                   Get Command        Type    Initial Value    Description                 Sec.    Attribute
+    ---------                   ---------------    ----    -------------    -----------                 ----    ---------
+    SHADING_RATE_IMAGE_         IsEnabled           B      FALSE            Use per-primitive shading   14.4.1  enable
+      PER_PRIMITIVE_NV                                                      rate to select shading
+                                                                            rate images/palettes
+
+New Implementation Dependent State
+
+                                                    Minimum
+    Get Value                Type  Get Command      Value   Description                   Sec.
+    ---------                ----- ---------------  ------- ------------------------      ------
+    SHADING_RATE_IMAGE_      Z+    GetIntegerv      16      Number of shading rate image  14.4.1
+      PALETTE_COUNT_NV                                      enables/palettes supported
+
+Issues
+
+    (1) How should we name this extension?
+
+      RESOLVED:  We are calling this extension "NV_primitive_shading_rate"
+      because it adds a new per-primitive shading rate to the variable-rate
+      shading functionality added by NV_shading_rate_image.
+
+    (2) Do we need to add queries like LAYER_PROVOKING_VERTEX and
+        VIEWPORT_INDEX_PROVOKING_VERTEX to determine the vertex used to obtain
+        the per-primitive shading rate for each primitive?
+
+      RESOLVED:  No -- we will always use the provoking vertex.  In the event
+      that this extension is standardized in the future with behavior that
+      diverges between implementations, such a query could be added as part of
+      that effort.
+
+Revision History
+
+    Revision 1 (pbrown)
+    - Internal revisions.
diff --git a/extensions/QCOM/QCOM_frame_extrapolation.txt b/extensions/QCOM/QCOM_frame_extrapolation.txt
new file mode 100644
index 0000000..b185217
--- /dev/null
+++ b/extensions/QCOM/QCOM_frame_extrapolation.txt
@@ -0,0 +1,133 @@
+Name
+
+    QCOM_frame_extrapolation
+
+Name Strings
+
+    GL_QCOM_frame_extrapolation
+
+Contributors
+
+    Sam Holmes
+    Jonathan Wicks
+
+Contacts
+
+    Jeff Leger  <jleger@qti.qualcomm.com>
+
+Status
+
+    Complete
+
+Version
+
+    Last Modified Date: November 30, 2020
+    Revision: 1.0
+
+Number
+
+    OpenGL ES Extension #333
+
+Dependencies
+
+    Requires OpenGL ES 2.0
+
+    This extension is written based on the wording of the OpenGL ES 3.2
+    Specification.
+
+Overview
+
+    Frame extrapolation is the process of producing a new, future frame
+    based on the contents of two previously rendered frames. It may be
+    used to produce high frame rate display updates without incurring the
+    full cost of traditional rendering at the higher framerate.
+
+    This extension adds support for frame extrapolation in OpenGL ES by
+    adding a function which takes three textures. The first two are used
+    in sequence as the source frames, from which the extrapolated frame
+    is derived. The extrapolated frame is stored in the third texture.
+
+New Procedures and Functions
+
+    void ExtrapolateTex2DQCOM(uint  src1,
+                              uint  src2,
+                              uint  output,
+                              float scaleFactor);
+
+Additions to Chapter 8 of the OpenGL ES 3.2 Specification
+
+    8.24 Frame Extrapolation
+
+    The command
+
+    void ExtrapolateTex2DQCOM(uint src1, uint src2,
+    uint output, float scaleFactor);
+
+    is used to produce an extrapolated frame based on the contents of
+    two previous frames. <src1> and <src2> specify the two previously
+    rendered frames, in order, which will be used as the basis of the
+    extrapolation. The three textures provided must have the same
+    dimensions and format. While <src1>, <src2> and <output> can
+    have multiple levels the implementation only reads from or writes
+    to the base level.
+
+    The texture contents provided in the two source textures represent
+    frame contents at two points in time. <scaleFactor> defines the amount
+    of time into the future the extrapolation is to target, based on the
+    delta in time between the two source textures.
+
+    For example, a value of 1.0 for <scaleFactor> will produce an
+    extrapolated frame that is as far into the future beyond 'src2'
+    as the time delta between 'src1' and 'src2'. A value of 0.5
+    for 'scaleFactor' targets a time that is a half step in the
+    future (compared to the full step delta between the two source frames).
+
+    Specifying an accurate scale factor is important for producing smooth
+    animation. An application that is displaying to the user alternating
+    rendered and extrapolated frames would use a scale factor of 0.5 so
+    that the extrapolated frame has contents which fall halfways between the
+    last rendered frame and the next rendered frame to come in the future.
+    Negative <scaleFactor> values produce frames targeting times before
+    that represented by the contents of <src2>.
+
+    Table 8.28: Compatible formats for <src1>, <src2> and <output>
+
+        Internal Format
+        ---------------
+        RGBA8
+        RGB8
+        R8
+        RGBA16F
+        RGB16F
+        RGBA32F
+        RGB32F
+
+Errors
+
+    INVALID_VALUE is generated if scaleFactor is equal to 0.
+
+    INVALID_OPERATION is generated if the texture formats of src1, src2 and
+    output are not identical.
+
+    INVALID_OPERATION is generated if the texture dimensions of src1, src2
+    and output are not identical.
+
+    INVALID_OPERATION is generated if the texture formats of src1, src2 and
+    output are not one of the formats listed in table 8.28.
+
+Issues
+
+    (1) Why is the extrapolation quality not defined?
+
+    Resolved: The intention of this specification is to extrapolate a new
+    texture based on the two input textures. Implementations should aim to
+    produce the highest quality extrapolation but since the results are
+    extrapolations there are no prescribed steps for how the textures must
+    be generated.
+
+Revision History
+
+      Rev.  Date        Author    Changes
+      ----  ----------  --------  -----------------------------------------
+      0.1   11/21/2019  Sam       Initial draft
+      1.0   11/30/2020  Tate      Official extension number
diff --git a/extensions/SGI/GLX_SGI_video_sync.txt b/extensions/SGI/GLX_SGI_video_sync.txt
index 4042391..9072014 100644
--- a/extensions/SGI/GLX_SGI_video_sync.txt
+++ b/extensions/SGI/GLX_SGI_video_sync.txt
@@ -6,10 +6,6 @@
 
     GLX_SGI_video_sync
 
-Version
-
-    $Date: 1995/09/15 01:22:58 $ $Revision: 1.8 $
-
 Number
 
     41
@@ -39,6 +35,13 @@
 
     The counter is an unsigned 32-bit integer.
 
+Interaction with {ARB,OES}_framebuffer_object
+
+    If the current context does not have a default framebuffer there may be
+    no "frame rate" to refer to, since there is no Window or GLXWindow to map
+    to an output device. If the client API context is in this state, all
+    interaction with this extension is undefined.
+
 Issues
 
     Should glXWaitVideoSyncSGI return GLX_BAD_VALUE if <remainder> is
@@ -124,3 +127,10 @@
 New Implementation Dependent State
 
     None
+
+Version
+
+    $Date: 1995/09/15 01:22:58 $ $Revision: 1.8 $
+
+    Khronos revision 2:
+    - Note ARB_framebuffer_object interaction (ajax)
diff --git a/extensions/esext.php b/extensions/esext.php
index 3d80fe4..7e56ead 100644
--- a/extensions/esext.php
+++ b/extensions/esext.php
@@ -689,4 +689,8 @@
 </li>
 <li value=331><a href="extensions/QCOM/QCOM_texture_foveated2.txt">GL_QCOM_texture_foveated2</a>
 </li>
+<li value=332><a href="extensions/NV/NV_primitive_shading_rate.txt">GL_NV_primitive_shading_rate</a>
+</li>
+<li value=333><a href="extensions/QCOM/QCOM_frame_extrapolation.txt">QCOM_frame_extrapolation</a>
+</li>
 </ol>
diff --git a/extensions/glext.php b/extensions/glext.php
index 89618c1..1e2c0f1 100644
--- a/extensions/glext.php
+++ b/extensions/glext.php
@@ -1045,4 +1045,6 @@
 </li>
 <li value=553><a href="extensions/EXT/GLX_EXT_no_config_context.txt">GLX_EXT_no_config_context</a>
 </li>
+<li value=554><a href="extensions/NV/NV_primitive_shading_rate.txt">GL_NV_primitive_shading_rate</a>
+</li>
 </ol>
diff --git a/extensions/registry.py b/extensions/registry.py
index 86d395e..fd7502f 100644
--- a/extensions/registry.py
+++ b/extensions/registry.py
@@ -2560,6 +2560,7 @@
         'url' : 'extensions/EXT/EXT_texture_sRGB_R8.txt',
     },
     'GL_EXT_texture_sRGB_RG8' : {
+        'number' : 555,
         'esnumber' : 223,
         'flags' : { 'public' },
         'url' : 'extensions/EXT/EXT_texture_sRGB_RG8.txt',
@@ -3660,6 +3661,13 @@
         'supporters' : { 'NVIDIA' },
         'url' : 'extensions/NV/NV_primitive_restart.txt',
     },
+    'GL_NV_primitive_shading_rate' : {
+        'number' : 554,
+        'esnumber' : 332,
+        'flags' : { 'public' },
+        'supporters' : { 'NVIDIA' },
+        'url' : 'extensions/NV/NV_primitive_shading_rate.txt',
+    },
     'GL_NV_query_resource' : {
         'number' : 511,
         'flags' : { 'public' },
@@ -4528,6 +4536,11 @@
         'flags' : { 'public' },
         'url' : 'extensions/QCOM/QCOM_motion_estimation.txt',
     },
+    'QCOM_frame_extrapolation' : {
+        'esnumber' : 333,
+        'flags' : { 'public' },
+        'url' : 'extensions/QCOM/QCOM_frame_extrapolation.txt',
+    },
     'GL_QCOM_performance_monitor_global_mode' : {
         'esnumber' : 56,
         'flags' : { 'public' },
diff --git a/specs/es/3.2/katex/README.md b/specs/es/3.2/katex/README.md
deleted file mode 100644
index 5f8caa8..0000000
--- a/specs/es/3.2/katex/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# [<img src="https://khan.github.io/KaTeX/katex-logo.svg" width="130" alt="KaTeX">](https://khan.github.io/KaTeX/) [![Build Status](https://travis-ci.org/Khan/KaTeX.svg?branch=master)](https://travis-ci.org/Khan/KaTeX)
-
-[![Join the chat at https://gitter.im/Khan/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Khan/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
-
- * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://jsperf.com/katex-vs-mathjax/).
- * **Print quality:** KaTeX’s layout is based on Donald Knuth’s TeX, the gold standard for math typesetting.
- * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources.
- * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
-
-KaTeX supports all major browsers, including Chrome, Safari, Firefox, Opera, and IE 8 - IE 11.  A list of supported  commands can be on the [wiki](https://github.com/Khan/KaTeX/wiki/Function-Support-in-KaTeX).
-
-## Usage
-
-You can [download KaTeX](https://github.com/khan/katex/releases) and host it on your server or include the `katex.min.js` and `katex.min.css` files on your page directly from a CDN:
-
-```html
-<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.6.0/katex.min.css">
-<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.6.0/katex.min.js"></script>
-```
-
-#### In-browser rendering
-
-Call `katex.render` with a TeX expression and a DOM element to render into:
-
-```js
-katex.render("c = \\pm\\sqrt{a^2 + b^2}", element);
-```
-
-If KaTeX can't parse the expression, it throws a `katex.ParseError` error.
-
-#### Server side rendering or rendering to a string
-
-To generate HTML on the server or to generate an HTML string of the rendered math, you can use `katex.renderToString`:
-
-```js
-var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}");
-// '<span class="katex">...</span>'
-```
-
-Make sure to include the CSS and font files, but there is no need to include the JavaScript. Like `render`, `renderToString` throws if it can't parse the expression.
-
-#### Rendering options
-
-You can provide an object of options as the last argument to `katex.render` and `katex.renderToString`. Available options are:
-
-- `displayMode`: `boolean`. If `true` the math will be rendered in display mode, which will put the math in display style (so `\int` and `\sum` are large, for example), and will center the math on the page on its own line. If `false` the math will be rendered in inline mode. (default: `false`)
-- `throwOnError`: `boolean`. If `true`, KaTeX will throw a `ParseError` when it encounters an unsupported command. If `false`, KaTeX will render the unsupported command as text in the color given by `errorColor`. (default: `true`)
-- `errorColor`: `string`. A color string given in the format `"#XXX"` or `"#XXXXXX"`. This option determines the color which unsupported commands are rendered in. (default: `#cc0000`)
-
-For example:
-
-```js
-katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, { displayMode: true });
-```
-
-#### Automatic rendering of math on a page
-
-Math on the page can be automatically rendered using the auto-render extension. See [the Auto-render README](contrib/auto-render/README.md) for more information.
-
-## Contributing
-
-See [CONTRIBUTING.md](CONTRIBUTING.md)
-
-## License
-
-KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/specs/es/3.2/katex/katex.css b/specs/es/3.2/katex/katex.css
deleted file mode 100644
index ef0aa62..0000000
--- a/specs/es/3.2/katex/katex.css
+++ /dev/null
@@ -1,976 +0,0 @@
-@font-face {
-  font-family: 'KaTeX_AMS';
-  src: url('fonts/KaTeX_AMS-Regular.eot');
-  src: url('fonts/KaTeX_AMS-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_AMS-Regular.woff2') format('woff2'), url('fonts/KaTeX_AMS-Regular.woff') format('woff'), url('fonts/KaTeX_AMS-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Caligraphic';
-  src: url('fonts/KaTeX_Caligraphic-Bold.eot');
-  src: url('fonts/KaTeX_Caligraphic-Bold.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Caligraphic-Bold.woff2') format('woff2'), url('fonts/KaTeX_Caligraphic-Bold.woff') format('woff'), url('fonts/KaTeX_Caligraphic-Bold.ttf') format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Caligraphic';
-  src: url('fonts/KaTeX_Caligraphic-Regular.eot');
-  src: url('fonts/KaTeX_Caligraphic-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Caligraphic-Regular.woff2') format('woff2'), url('fonts/KaTeX_Caligraphic-Regular.woff') format('woff'), url('fonts/KaTeX_Caligraphic-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Fraktur';
-  src: url('fonts/KaTeX_Fraktur-Bold.eot');
-  src: url('fonts/KaTeX_Fraktur-Bold.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Fraktur-Bold.woff2') format('woff2'), url('fonts/KaTeX_Fraktur-Bold.woff') format('woff'), url('fonts/KaTeX_Fraktur-Bold.ttf') format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Fraktur';
-  src: url('fonts/KaTeX_Fraktur-Regular.eot');
-  src: url('fonts/KaTeX_Fraktur-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Fraktur-Regular.woff2') format('woff2'), url('fonts/KaTeX_Fraktur-Regular.woff') format('woff'), url('fonts/KaTeX_Fraktur-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url('fonts/KaTeX_Main-Bold.eot');
-  src: url('fonts/KaTeX_Main-Bold.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Main-Bold.woff2') format('woff2'), url('fonts/KaTeX_Main-Bold.woff') format('woff'), url('fonts/KaTeX_Main-Bold.ttf') format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url('fonts/KaTeX_Main-Italic.eot');
-  src: url('fonts/KaTeX_Main-Italic.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Main-Italic.woff2') format('woff2'), url('fonts/KaTeX_Main-Italic.woff') format('woff'), url('fonts/KaTeX_Main-Italic.ttf') format('truetype');
-  font-weight: normal;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url('fonts/KaTeX_Main-Regular.eot');
-  src: url('fonts/KaTeX_Main-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Main-Regular.woff2') format('woff2'), url('fonts/KaTeX_Main-Regular.woff') format('woff'), url('fonts/KaTeX_Main-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Math';
-  src: url('fonts/KaTeX_Math-Italic.eot');
-  src: url('fonts/KaTeX_Math-Italic.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Math-Italic.woff2') format('woff2'), url('fonts/KaTeX_Math-Italic.woff') format('woff'), url('fonts/KaTeX_Math-Italic.ttf') format('truetype');
-  font-weight: normal;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_SansSerif';
-  src: url('fonts/KaTeX_SansSerif-Regular.eot');
-  src: url('fonts/KaTeX_SansSerif-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_SansSerif-Regular.woff2') format('woff2'), url('fonts/KaTeX_SansSerif-Regular.woff') format('woff'), url('fonts/KaTeX_SansSerif-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Script';
-  src: url('fonts/KaTeX_Script-Regular.eot');
-  src: url('fonts/KaTeX_Script-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Script-Regular.woff2') format('woff2'), url('fonts/KaTeX_Script-Regular.woff') format('woff'), url('fonts/KaTeX_Script-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size1';
-  src: url('fonts/KaTeX_Size1-Regular.eot');
-  src: url('fonts/KaTeX_Size1-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Size1-Regular.woff2') format('woff2'), url('fonts/KaTeX_Size1-Regular.woff') format('woff'), url('fonts/KaTeX_Size1-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size2';
-  src: url('fonts/KaTeX_Size2-Regular.eot');
-  src: url('fonts/KaTeX_Size2-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Size2-Regular.woff2') format('woff2'), url('fonts/KaTeX_Size2-Regular.woff') format('woff'), url('fonts/KaTeX_Size2-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size3';
-  src: url('fonts/KaTeX_Size3-Regular.eot');
-  src: url('fonts/KaTeX_Size3-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Size3-Regular.woff2') format('woff2'), url('fonts/KaTeX_Size3-Regular.woff') format('woff'), url('fonts/KaTeX_Size3-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size4';
-  src: url('fonts/KaTeX_Size4-Regular.eot');
-  src: url('fonts/KaTeX_Size4-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Size4-Regular.woff2') format('woff2'), url('fonts/KaTeX_Size4-Regular.woff') format('woff'), url('fonts/KaTeX_Size4-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Typewriter';
-  src: url('fonts/KaTeX_Typewriter-Regular.eot');
-  src: url('fonts/KaTeX_Typewriter-Regular.eot#iefix') format('embedded-opentype'), url('fonts/KaTeX_Typewriter-Regular.woff2') format('woff2'), url('fonts/KaTeX_Typewriter-Regular.woff') format('woff'), url('fonts/KaTeX_Typewriter-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-.katex-display {
-  display: block;
-  margin: 1em 0;
-  text-align: center;
-}
-.katex-display > .katex {
-  display: inline-block;
-  text-align: initial;
-}
-.katex {
-  font: normal 1.21em KaTeX_Main, Times New Roman, serif;
-  line-height: 1.2;
-  white-space: nowrap;
-  text-indent: 0;
-}
-.katex .katex-html {
-  display: inline-block;
-}
-.katex .katex-mathml {
-  position: absolute;
-  clip: rect(1px, 1px, 1px, 1px);
-  padding: 0;
-  border: 0;
-  height: 1px;
-  width: 1px;
-  overflow: hidden;
-}
-.katex .base {
-  display: inline-block;
-}
-.katex .strut {
-  display: inline-block;
-}
-.katex .mathrm {
-  font-style: normal;
-}
-.katex .textit {
-  font-style: italic;
-}
-.katex .mathit {
-  font-family: KaTeX_Math;
-  font-style: italic;
-}
-.katex .mathbf {
-  font-family: KaTeX_Main;
-  font-weight: bold;
-}
-.katex .amsrm {
-  font-family: KaTeX_AMS;
-}
-.katex .mathbb {
-  font-family: KaTeX_AMS;
-}
-.katex .mathcal {
-  font-family: KaTeX_Caligraphic;
-}
-.katex .mathfrak {
-  font-family: KaTeX_Fraktur;
-}
-.katex .mathtt {
-  font-family: KaTeX_Typewriter;
-}
-.katex .mathscr {
-  font-family: KaTeX_Script;
-}
-.katex .mathsf {
-  font-family: KaTeX_SansSerif;
-}
-.katex .mainit {
-  font-family: KaTeX_Main;
-  font-style: italic;
-}
-.katex .mord + .mop {
-  margin-left: 0.16667em;
-}
-.katex .mord + .mbin {
-  margin-left: 0.22222em;
-}
-.katex .mord + .mrel {
-  margin-left: 0.27778em;
-}
-.katex .mord + .minner {
-  margin-left: 0.16667em;
-}
-.katex .mop + .mord {
-  margin-left: 0.16667em;
-}
-.katex .mop + .mop {
-  margin-left: 0.16667em;
-}
-.katex .mop + .mrel {
-  margin-left: 0.27778em;
-}
-.katex .mop + .minner {
-  margin-left: 0.16667em;
-}
-.katex .mbin + .mord {
-  margin-left: 0.22222em;
-}
-.katex .mbin + .mop {
-  margin-left: 0.22222em;
-}
-.katex .mbin + .mopen {
-  margin-left: 0.22222em;
-}
-.katex .mbin + .minner {
-  margin-left: 0.22222em;
-}
-.katex .mrel + .mord {
-  margin-left: 0.27778em;
-}
-.katex .mrel + .mop {
-  margin-left: 0.27778em;
-}
-.katex .mrel + .mopen {
-  margin-left: 0.27778em;
-}
-.katex .mrel + .minner {
-  margin-left: 0.27778em;
-}
-.katex .mclose + .mop {
-  margin-left: 0.16667em;
-}
-.katex .mclose + .mbin {
-  margin-left: 0.22222em;
-}
-.katex .mclose + .mrel {
-  margin-left: 0.27778em;
-}
-.katex .mclose + .minner {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mord {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mop {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mrel {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mopen {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mclose {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .mpunct {
-  margin-left: 0.16667em;
-}
-.katex .mpunct + .minner {
-  margin-left: 0.16667em;
-}
-.katex .minner + .mord {
-  margin-left: 0.16667em;
-}
-.katex .minner + .mop {
-  margin-left: 0.16667em;
-}
-.katex .minner + .mbin {
-  margin-left: 0.22222em;
-}
-.katex .minner + .mrel {
-  margin-left: 0.27778em;
-}
-.katex .minner + .mopen {
-  margin-left: 0.16667em;
-}
-.katex .minner + .mpunct {
-  margin-left: 0.16667em;
-}
-.katex .minner + .minner {
-  margin-left: 0.16667em;
-}
-.katex .mord.mtight {
-  margin-left: 0;
-}
-.katex .mop.mtight {
-  margin-left: 0;
-}
-.katex .mbin.mtight {
-  margin-left: 0;
-}
-.katex .mrel.mtight {
-  margin-left: 0;
-}
-.katex .mopen.mtight {
-  margin-left: 0;
-}
-.katex .mclose.mtight {
-  margin-left: 0;
-}
-.katex .mpunct.mtight {
-  margin-left: 0;
-}
-.katex .minner.mtight {
-  margin-left: 0;
-}
-.katex .mord + .mop.mtight {
-  margin-left: 0.16667em;
-}
-.katex .mop + .mord.mtight {
-  margin-left: 0.16667em;
-}
-.katex .mop + .mop.mtight {
-  margin-left: 0.16667em;
-}
-.katex .mclose + .mop.mtight {
-  margin-left: 0.16667em;
-}
-.katex .minner + .mop.mtight {
-  margin-left: 0.16667em;
-}
-.katex .reset-textstyle.textstyle {
-  font-size: 1em;
-}
-.katex .reset-textstyle.scriptstyle {
-  font-size: 0.7em;
-}
-.katex .reset-textstyle.scriptscriptstyle {
-  font-size: 0.5em;
-}
-.katex .reset-scriptstyle.textstyle {
-  font-size: 1.42857em;
-}
-.katex .reset-scriptstyle.scriptstyle {
-  font-size: 1em;
-}
-.katex .reset-scriptstyle.scriptscriptstyle {
-  font-size: 0.71429em;
-}
-.katex .reset-scriptscriptstyle.textstyle {
-  font-size: 2em;
-}
-.katex .reset-scriptscriptstyle.scriptstyle {
-  font-size: 1.4em;
-}
-.katex .reset-scriptscriptstyle.scriptscriptstyle {
-  font-size: 1em;
-}
-.katex .style-wrap {
-  position: relative;
-}
-.katex .vlist {
-  display: inline-block;
-}
-.katex .vlist > span {
-  display: block;
-  height: 0;
-  position: relative;
-}
-.katex .vlist > span > span {
-  display: inline-block;
-}
-.katex .vlist .baseline-fix {
-  display: inline-table;
-  table-layout: fixed;
-}
-.katex .msupsub {
-  text-align: left;
-}
-.katex .mfrac > span > span {
-  text-align: center;
-}
-.katex .mfrac .frac-line {
-  width: 100%;
-}
-.katex .mfrac .frac-line:before {
-  border-bottom-style: solid;
-  border-bottom-width: 1px;
-  content: "";
-  display: block;
-}
-.katex .mfrac .frac-line:after {
-  border-bottom-style: solid;
-  border-bottom-width: 0.04em;
-  content: "";
-  display: block;
-  margin-top: -1px;
-}
-.katex .mspace {
-  display: inline-block;
-}
-.katex .mspace.negativethinspace {
-  margin-left: -0.16667em;
-}
-.katex .mspace.thinspace {
-  width: 0.16667em;
-}
-.katex .mspace.negativemediumspace {
-  margin-left: -0.22222em;
-}
-.katex .mspace.mediumspace {
-  width: 0.22222em;
-}
-.katex .mspace.thickspace {
-  width: 0.27778em;
-}
-.katex .mspace.sixmuspace {
-  width: 0.333333em;
-}
-.katex .mspace.eightmuspace {
-  width: 0.444444em;
-}
-.katex .mspace.enspace {
-  width: 0.5em;
-}
-.katex .mspace.twelvemuspace {
-  width: 0.666667em;
-}
-.katex .mspace.quad {
-  width: 1em;
-}
-.katex .mspace.qquad {
-  width: 2em;
-}
-.katex .llap,
-.katex .rlap {
-  width: 0;
-  position: relative;
-}
-.katex .llap > .inner,
-.katex .rlap > .inner {
-  position: absolute;
-}
-.katex .llap > .fix,
-.katex .rlap > .fix {
-  display: inline-block;
-}
-.katex .llap > .inner {
-  right: 0;
-}
-.katex .rlap > .inner {
-  left: 0;
-}
-.katex .katex-logo .a {
-  font-size: 0.75em;
-  margin-left: -0.32em;
-  position: relative;
-  top: -0.2em;
-}
-.katex .katex-logo .t {
-  margin-left: -0.23em;
-}
-.katex .katex-logo .e {
-  margin-left: -0.1667em;
-  position: relative;
-  top: 0.2155em;
-}
-.katex .katex-logo .x {
-  margin-left: -0.125em;
-}
-.katex .rule {
-  display: inline-block;
-  border: solid 0;
-  position: relative;
-}
-.katex .overline .overline-line,
-.katex .underline .underline-line {
-  width: 100%;
-}
-.katex .overline .overline-line:before,
-.katex .underline .underline-line:before {
-  border-bottom-style: solid;
-  border-bottom-width: 1px;
-  content: "";
-  display: block;
-}
-.katex .overline .overline-line:after,
-.katex .underline .underline-line:after {
-  border-bottom-style: solid;
-  border-bottom-width: 0.04em;
-  content: "";
-  display: block;
-  margin-top: -1px;
-}
-.katex .sqrt > .sqrt-sign {
-  position: relative;
-}
-.katex .sqrt .sqrt-line {
-  width: 100%;
-}
-.katex .sqrt .sqrt-line:before {
-  border-bottom-style: solid;
-  border-bottom-width: 1px;
-  content: "";
-  display: block;
-}
-.katex .sqrt .sqrt-line:after {
-  border-bottom-style: solid;
-  border-bottom-width: 0.04em;
-  content: "";
-  display: block;
-  margin-top: -1px;
-}
-.katex .sqrt > .root {
-  margin-left: 0.27777778em;
-  margin-right: -0.55555556em;
-}
-.katex .sizing,
-.katex .fontsize-ensurer {
-  display: inline-block;
-}
-.katex .sizing.reset-size1.size1,
-.katex .fontsize-ensurer.reset-size1.size1 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size1.size2,
-.katex .fontsize-ensurer.reset-size1.size2 {
-  font-size: 1.4em;
-}
-.katex .sizing.reset-size1.size3,
-.katex .fontsize-ensurer.reset-size1.size3 {
-  font-size: 1.6em;
-}
-.katex .sizing.reset-size1.size4,
-.katex .fontsize-ensurer.reset-size1.size4 {
-  font-size: 1.8em;
-}
-.katex .sizing.reset-size1.size5,
-.katex .fontsize-ensurer.reset-size1.size5 {
-  font-size: 2em;
-}
-.katex .sizing.reset-size1.size6,
-.katex .fontsize-ensurer.reset-size1.size6 {
-  font-size: 2.4em;
-}
-.katex .sizing.reset-size1.size7,
-.katex .fontsize-ensurer.reset-size1.size7 {
-  font-size: 2.88em;
-}
-.katex .sizing.reset-size1.size8,
-.katex .fontsize-ensurer.reset-size1.size8 {
-  font-size: 3.46em;
-}
-.katex .sizing.reset-size1.size9,
-.katex .fontsize-ensurer.reset-size1.size9 {
-  font-size: 4.14em;
-}
-.katex .sizing.reset-size1.size10,
-.katex .fontsize-ensurer.reset-size1.size10 {
-  font-size: 4.98em;
-}
-.katex .sizing.reset-size2.size1,
-.katex .fontsize-ensurer.reset-size2.size1 {
-  font-size: 0.71428571em;
-}
-.katex .sizing.reset-size2.size2,
-.katex .fontsize-ensurer.reset-size2.size2 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size2.size3,
-.katex .fontsize-ensurer.reset-size2.size3 {
-  font-size: 1.14285714em;
-}
-.katex .sizing.reset-size2.size4,
-.katex .fontsize-ensurer.reset-size2.size4 {
-  font-size: 1.28571429em;
-}
-.katex .sizing.reset-size2.size5,
-.katex .fontsize-ensurer.reset-size2.size5 {
-  font-size: 1.42857143em;
-}
-.katex .sizing.reset-size2.size6,
-.katex .fontsize-ensurer.reset-size2.size6 {
-  font-size: 1.71428571em;
-}
-.katex .sizing.reset-size2.size7,
-.katex .fontsize-ensurer.reset-size2.size7 {
-  font-size: 2.05714286em;
-}
-.katex .sizing.reset-size2.size8,
-.katex .fontsize-ensurer.reset-size2.size8 {
-  font-size: 2.47142857em;
-}
-.katex .sizing.reset-size2.size9,
-.katex .fontsize-ensurer.reset-size2.size9 {
-  font-size: 2.95714286em;
-}
-.katex .sizing.reset-size2.size10,
-.katex .fontsize-ensurer.reset-size2.size10 {
-  font-size: 3.55714286em;
-}
-.katex .sizing.reset-size3.size1,
-.katex .fontsize-ensurer.reset-size3.size1 {
-  font-size: 0.625em;
-}
-.katex .sizing.reset-size3.size2,
-.katex .fontsize-ensurer.reset-size3.size2 {
-  font-size: 0.875em;
-}
-.katex .sizing.reset-size3.size3,
-.katex .fontsize-ensurer.reset-size3.size3 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size3.size4,
-.katex .fontsize-ensurer.reset-size3.size4 {
-  font-size: 1.125em;
-}
-.katex .sizing.reset-size3.size5,
-.katex .fontsize-ensurer.reset-size3.size5 {
-  font-size: 1.25em;
-}
-.katex .sizing.reset-size3.size6,
-.katex .fontsize-ensurer.reset-size3.size6 {
-  font-size: 1.5em;
-}
-.katex .sizing.reset-size3.size7,
-.katex .fontsize-ensurer.reset-size3.size7 {
-  font-size: 1.8em;
-}
-.katex .sizing.reset-size3.size8,
-.katex .fontsize-ensurer.reset-size3.size8 {
-  font-size: 2.1625em;
-}
-.katex .sizing.reset-size3.size9,
-.katex .fontsize-ensurer.reset-size3.size9 {
-  font-size: 2.5875em;
-}
-.katex .sizing.reset-size3.size10,
-.katex .fontsize-ensurer.reset-size3.size10 {
-  font-size: 3.1125em;
-}
-.katex .sizing.reset-size4.size1,
-.katex .fontsize-ensurer.reset-size4.size1 {
-  font-size: 0.55555556em;
-}
-.katex .sizing.reset-size4.size2,
-.katex .fontsize-ensurer.reset-size4.size2 {
-  font-size: 0.77777778em;
-}
-.katex .sizing.reset-size4.size3,
-.katex .fontsize-ensurer.reset-size4.size3 {
-  font-size: 0.88888889em;
-}
-.katex .sizing.reset-size4.size4,
-.katex .fontsize-ensurer.reset-size4.size4 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size4.size5,
-.katex .fontsize-ensurer.reset-size4.size5 {
-  font-size: 1.11111111em;
-}
-.katex .sizing.reset-size4.size6,
-.katex .fontsize-ensurer.reset-size4.size6 {
-  font-size: 1.33333333em;
-}
-.katex .sizing.reset-size4.size7,
-.katex .fontsize-ensurer.reset-size4.size7 {
-  font-size: 1.6em;
-}
-.katex .sizing.reset-size4.size8,
-.katex .fontsize-ensurer.reset-size4.size8 {
-  font-size: 1.92222222em;
-}
-.katex .sizing.reset-size4.size9,
-.katex .fontsize-ensurer.reset-size4.size9 {
-  font-size: 2.3em;
-}
-.katex .sizing.reset-size4.size10,
-.katex .fontsize-ensurer.reset-size4.size10 {
-  font-size: 2.76666667em;
-}
-.katex .sizing.reset-size5.size1,
-.katex .fontsize-ensurer.reset-size5.size1 {
-  font-size: 0.5em;
-}
-.katex .sizing.reset-size5.size2,
-.katex .fontsize-ensurer.reset-size5.size2 {
-  font-size: 0.7em;
-}
-.katex .sizing.reset-size5.size3,
-.katex .fontsize-ensurer.reset-size5.size3 {
-  font-size: 0.8em;
-}
-.katex .sizing.reset-size5.size4,
-.katex .fontsize-ensurer.reset-size5.size4 {
-  font-size: 0.9em;
-}
-.katex .sizing.reset-size5.size5,
-.katex .fontsize-ensurer.reset-size5.size5 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size5.size6,
-.katex .fontsize-ensurer.reset-size5.size6 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size5.size7,
-.katex .fontsize-ensurer.reset-size5.size7 {
-  font-size: 1.44em;
-}
-.katex .sizing.reset-size5.size8,
-.katex .fontsize-ensurer.reset-size5.size8 {
-  font-size: 1.73em;
-}
-.katex .sizing.reset-size5.size9,
-.katex .fontsize-ensurer.reset-size5.size9 {
-  font-size: 2.07em;
-}
-.katex .sizing.reset-size5.size10,
-.katex .fontsize-ensurer.reset-size5.size10 {
-  font-size: 2.49em;
-}
-.katex .sizing.reset-size6.size1,
-.katex .fontsize-ensurer.reset-size6.size1 {
-  font-size: 0.41666667em;
-}
-.katex .sizing.reset-size6.size2,
-.katex .fontsize-ensurer.reset-size6.size2 {
-  font-size: 0.58333333em;
-}
-.katex .sizing.reset-size6.size3,
-.katex .fontsize-ensurer.reset-size6.size3 {
-  font-size: 0.66666667em;
-}
-.katex .sizing.reset-size6.size4,
-.katex .fontsize-ensurer.reset-size6.size4 {
-  font-size: 0.75em;
-}
-.katex .sizing.reset-size6.size5,
-.katex .fontsize-ensurer.reset-size6.size5 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size6.size6,
-.katex .fontsize-ensurer.reset-size6.size6 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size6.size7,
-.katex .fontsize-ensurer.reset-size6.size7 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size6.size8,
-.katex .fontsize-ensurer.reset-size6.size8 {
-  font-size: 1.44166667em;
-}
-.katex .sizing.reset-size6.size9,
-.katex .fontsize-ensurer.reset-size6.size9 {
-  font-size: 1.725em;
-}
-.katex .sizing.reset-size6.size10,
-.katex .fontsize-ensurer.reset-size6.size10 {
-  font-size: 2.075em;
-}
-.katex .sizing.reset-size7.size1,
-.katex .fontsize-ensurer.reset-size7.size1 {
-  font-size: 0.34722222em;
-}
-.katex .sizing.reset-size7.size2,
-.katex .fontsize-ensurer.reset-size7.size2 {
-  font-size: 0.48611111em;
-}
-.katex .sizing.reset-size7.size3,
-.katex .fontsize-ensurer.reset-size7.size3 {
-  font-size: 0.55555556em;
-}
-.katex .sizing.reset-size7.size4,
-.katex .fontsize-ensurer.reset-size7.size4 {
-  font-size: 0.625em;
-}
-.katex .sizing.reset-size7.size5,
-.katex .fontsize-ensurer.reset-size7.size5 {
-  font-size: 0.69444444em;
-}
-.katex .sizing.reset-size7.size6,
-.katex .fontsize-ensurer.reset-size7.size6 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size7.size7,
-.katex .fontsize-ensurer.reset-size7.size7 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size7.size8,
-.katex .fontsize-ensurer.reset-size7.size8 {
-  font-size: 1.20138889em;
-}
-.katex .sizing.reset-size7.size9,
-.katex .fontsize-ensurer.reset-size7.size9 {
-  font-size: 1.4375em;
-}
-.katex .sizing.reset-size7.size10,
-.katex .fontsize-ensurer.reset-size7.size10 {
-  font-size: 1.72916667em;
-}
-.katex .sizing.reset-size8.size1,
-.katex .fontsize-ensurer.reset-size8.size1 {
-  font-size: 0.28901734em;
-}
-.katex .sizing.reset-size8.size2,
-.katex .fontsize-ensurer.reset-size8.size2 {
-  font-size: 0.40462428em;
-}
-.katex .sizing.reset-size8.size3,
-.katex .fontsize-ensurer.reset-size8.size3 {
-  font-size: 0.46242775em;
-}
-.katex .sizing.reset-size8.size4,
-.katex .fontsize-ensurer.reset-size8.size4 {
-  font-size: 0.52023121em;
-}
-.katex .sizing.reset-size8.size5,
-.katex .fontsize-ensurer.reset-size8.size5 {
-  font-size: 0.57803468em;
-}
-.katex .sizing.reset-size8.size6,
-.katex .fontsize-ensurer.reset-size8.size6 {
-  font-size: 0.69364162em;
-}
-.katex .sizing.reset-size8.size7,
-.katex .fontsize-ensurer.reset-size8.size7 {
-  font-size: 0.83236994em;
-}
-.katex .sizing.reset-size8.size8,
-.katex .fontsize-ensurer.reset-size8.size8 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size8.size9,
-.katex .fontsize-ensurer.reset-size8.size9 {
-  font-size: 1.19653179em;
-}
-.katex .sizing.reset-size8.size10,
-.katex .fontsize-ensurer.reset-size8.size10 {
-  font-size: 1.43930636em;
-}
-.katex .sizing.reset-size9.size1,
-.katex .fontsize-ensurer.reset-size9.size1 {
-  font-size: 0.24154589em;
-}
-.katex .sizing.reset-size9.size2,
-.katex .fontsize-ensurer.reset-size9.size2 {
-  font-size: 0.33816425em;
-}
-.katex .sizing.reset-size9.size3,
-.katex .fontsize-ensurer.reset-size9.size3 {
-  font-size: 0.38647343em;
-}
-.katex .sizing.reset-size9.size4,
-.katex .fontsize-ensurer.reset-size9.size4 {
-  font-size: 0.43478261em;
-}
-.katex .sizing.reset-size9.size5,
-.katex .fontsize-ensurer.reset-size9.size5 {
-  font-size: 0.48309179em;
-}
-.katex .sizing.reset-size9.size6,
-.katex .fontsize-ensurer.reset-size9.size6 {
-  font-size: 0.57971014em;
-}
-.katex .sizing.reset-size9.size7,
-.katex .fontsize-ensurer.reset-size9.size7 {
-  font-size: 0.69565217em;
-}
-.katex .sizing.reset-size9.size8,
-.katex .fontsize-ensurer.reset-size9.size8 {
-  font-size: 0.83574879em;
-}
-.katex .sizing.reset-size9.size9,
-.katex .fontsize-ensurer.reset-size9.size9 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size9.size10,
-.katex .fontsize-ensurer.reset-size9.size10 {
-  font-size: 1.20289855em;
-}
-.katex .sizing.reset-size10.size1,
-.katex .fontsize-ensurer.reset-size10.size1 {
-  font-size: 0.20080321em;
-}
-.katex .sizing.reset-size10.size2,
-.katex .fontsize-ensurer.reset-size10.size2 {
-  font-size: 0.2811245em;
-}
-.katex .sizing.reset-size10.size3,
-.katex .fontsize-ensurer.reset-size10.size3 {
-  font-size: 0.32128514em;
-}
-.katex .sizing.reset-size10.size4,
-.katex .fontsize-ensurer.reset-size10.size4 {
-  font-size: 0.36144578em;
-}
-.katex .sizing.reset-size10.size5,
-.katex .fontsize-ensurer.reset-size10.size5 {
-  font-size: 0.40160643em;
-}
-.katex .sizing.reset-size10.size6,
-.katex .fontsize-ensurer.reset-size10.size6 {
-  font-size: 0.48192771em;
-}
-.katex .sizing.reset-size10.size7,
-.katex .fontsize-ensurer.reset-size10.size7 {
-  font-size: 0.57831325em;
-}
-.katex .sizing.reset-size10.size8,
-.katex .fontsize-ensurer.reset-size10.size8 {
-  font-size: 0.69477912em;
-}
-.katex .sizing.reset-size10.size9,
-.katex .fontsize-ensurer.reset-size10.size9 {
-  font-size: 0.8313253em;
-}
-.katex .sizing.reset-size10.size10,
-.katex .fontsize-ensurer.reset-size10.size10 {
-  font-size: 1em;
-}
-.katex .delimsizing.size1 {
-  font-family: KaTeX_Size1;
-}
-.katex .delimsizing.size2 {
-  font-family: KaTeX_Size2;
-}
-.katex .delimsizing.size3 {
-  font-family: KaTeX_Size3;
-}
-.katex .delimsizing.size4 {
-  font-family: KaTeX_Size4;
-}
-.katex .delimsizing.mult .delim-size1 > span {
-  font-family: KaTeX_Size1;
-}
-.katex .delimsizing.mult .delim-size4 > span {
-  font-family: KaTeX_Size4;
-}
-.katex .nulldelimiter {
-  display: inline-block;
-  width: 0.12em;
-}
-.katex .op-symbol {
-  position: relative;
-}
-.katex .op-symbol.small-op {
-  font-family: KaTeX_Size1;
-}
-.katex .op-symbol.large-op {
-  font-family: KaTeX_Size2;
-}
-.katex .op-limits > .vlist > span {
-  text-align: center;
-}
-.katex .accent > .vlist > span {
-  text-align: center;
-}
-.katex .accent .accent-body > span {
-  width: 0;
-}
-.katex .accent .accent-body.accent-vec > span {
-  position: relative;
-  left: 0.326em;
-}
-.katex .mtable .vertical-separator {
-  display: inline-block;
-  margin: 0 -0.025em;
-  border-right: 0.05em solid black;
-}
-.katex .mtable .arraycolsep {
-  display: inline-block;
-}
-.katex .mtable .col-align-c > .vlist {
-  text-align: center;
-}
-.katex .mtable .col-align-l > .vlist {
-  text-align: left;
-}
-.katex .mtable .col-align-r > .vlist {
-  text-align: right;
-}
diff --git a/specs/es/3.2/katex/katex.js b/specs/es/3.2/katex/katex.js
deleted file mode 100644
index e104be9..0000000
--- a/specs/es/3.2/katex/katex.js
+++ /dev/null
@@ -1,9075 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.katex = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-/* eslint no-console:0 */
-/**
- * This is the main entry point for KaTeX. Here, we expose functions for
- * rendering expressions either to DOM nodes or to markup strings.
- *
- * We also expose the ParseError class to check if errors thrown from KaTeX are
- * errors in the expression, or errors in javascript handling.
- */
-
-var ParseError = require("./src/ParseError");
-var Settings = require("./src/Settings");
-
-var buildTree = require("./src/buildTree");
-var parseTree = require("./src/parseTree");
-var utils = require("./src/utils");
-
-/**
- * Parse and build an expression, and place that expression in the DOM node
- * given.
- */
-var render = function(expression, baseNode, options) {
-    utils.clearNode(baseNode);
-
-    var settings = new Settings(options);
-
-    var tree = parseTree(expression, settings);
-    var node = buildTree(tree, expression, settings).toNode();
-
-    baseNode.appendChild(node);
-};
-
-// KaTeX's styles don't work properly in quirks mode. Print out an error, and
-// disable rendering.
-if (typeof document !== "undefined") {
-    if (document.compatMode !== "CSS1Compat") {
-        typeof console !== "undefined" && console.warn(
-            "Warning: KaTeX doesn't work in quirks mode. Make sure your " +
-                "website has a suitable doctype.");
-
-        render = function() {
-            throw new ParseError("KaTeX doesn't work in quirks mode.");
-        };
-    }
-}
-
-/**
- * Parse and build an expression, and return the markup for that.
- */
-var renderToString = function(expression, options) {
-    var settings = new Settings(options);
-
-    var tree = parseTree(expression, settings);
-    return buildTree(tree, expression, settings).toMarkup();
-};
-
-/**
- * Parse an expression and return the parse tree.
- */
-var generateParseTree = function(expression, options) {
-    var settings = new Settings(options);
-    return parseTree(expression, settings);
-};
-
-module.exports = {
-    render: render,
-    renderToString: renderToString,
-    /**
-     * NOTE: This method is not currently recommended for public use.
-     * The internal tree representation is unstable and is very likely
-     * to change. Use at your own risk.
-     */
-    __parse: generateParseTree,
-    ParseError: ParseError
-};
-
-},{"./src/ParseError":6,"./src/Settings":8,"./src/buildTree":13,"./src/parseTree":22,"./src/utils":25}],2:[function(require,module,exports){
-/** @flow */
-
-"use strict";
-
-function getRelocatable(re) {
-  // In the future, this could use a WeakMap instead of an expando.
-  if (!re.__matchAtRelocatable) {
-    // Disjunctions are the lowest-precedence operator, so we can make any
-    // pattern match the empty string by appending `|()` to it:
-    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-patterns
-    var source = re.source + "|()";
-
-    // We always make the new regex global.
-    var flags = "g" + (re.ignoreCase ? "i" : "") + (re.multiline ? "m" : "") + (re.unicode ? "u" : "")
-    // sticky (/.../y) doesn't make sense in conjunction with our relocation
-    // logic, so we ignore it here.
-    ;
-
-    re.__matchAtRelocatable = new RegExp(source, flags);
-  }
-  return re.__matchAtRelocatable;
-}
-
-function matchAt(re, str, pos) {
-  if (re.global || re.sticky) {
-    throw new Error("matchAt(...): Only non-global regexes are supported");
-  }
-  var reloc = getRelocatable(re);
-  reloc.lastIndex = pos;
-  var match = reloc.exec(str);
-  // Last capturing group is our sentinel that indicates whether the regex
-  // matched at the given location.
-  if (match[match.length - 1] == null) {
-    // Original regex matched.
-    match.length = match.length - 1;
-    return match;
-  } else {
-    return null;
-  }
-}
-
-module.exports = matchAt;
-},{}],3:[function(require,module,exports){
-/**
- * The Lexer class handles tokenizing the input in various ways. Since our
- * parser expects us to be able to backtrack, the lexer allows lexing from any
- * given starting point.
- *
- * Its main exposed function is the `lex` function, which takes a position to
- * lex from and a type of token to lex. It defers to the appropriate `_innerLex`
- * function.
- *
- * The various `_innerLex` functions perform the actual lexing of different
- * kinds.
- */
-
-var matchAt = require("match-at");
-
-var ParseError = require("./ParseError");
-
-// The main lexer class
-function Lexer(input) {
-    this.input = input;
-    this.pos = 0;
-}
-
-/**
- * The resulting token returned from `lex`.
- *
- * It consists of the token text plus some position information.
- * The position information is essentially a range in an input string,
- * but instead of referencing the bare input string, we refer to the lexer.
- * That way it is possible to attach extra metadata to the input string,
- * like for example a file name or similar.
- *
- * The position information (all three parameters) is optional,
- * so it is OK to construct synthetic tokens if appropriate.
- * Not providing available position information may lead to
- * degraded error reporting, though.
- *
- * @param {string}  text   the text of this token
- * @param {number=} start  the start offset, zero-based inclusive
- * @param {number=} end    the end offset, zero-based exclusive
- * @param {Lexer=}  lexer  the lexer which in turn holds the input string
- */
-function Token(text, start, end, lexer) {
-    this.text = text;
-    this.start = start;
-    this.end = end;
-    this.lexer = lexer;
-}
-
-/**
- * Given a pair of tokens (this and endToken), compute a “Token” encompassing
- * the whole input range enclosed by these two.
- *
- * @param {Token}  endToken  last token of the range, inclusive
- * @param {string} text      the text of the newly constructed token
- */
-Token.prototype.range = function(endToken, text) {
-    if (endToken.lexer !== this.lexer) {
-        return new Token(text); // sorry, no position information available
-    }
-    return new Token(text, this.start, endToken.end, this.lexer);
-};
-
-/* The following tokenRegex
- * - matches typical whitespace (but not NBSP etc.) using its first group
- * - does not match any control character \x00-\x1f except whitespace
- * - does not match a bare backslash
- * - matches any ASCII character except those just mentioned
- * - does not match the BMP private use area \uE000-\uF8FF
- * - does not match bare surrogate code units
- * - matches any BMP character except for those just described
- * - matches any valid Unicode surrogate pair
- * - matches a backslash followed by one or more letters
- * - matches a backslash followed by any BMP character, including newline
- * Just because the Lexer matches something doesn't mean it's valid input:
- * If there is no matching function or symbol definition, the Parser will
- * still reject the input.
- */
-var tokenRegex = new RegExp(
-    "([ \r\n\t]+)|" +                                 // whitespace
-    "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" +  // single codepoint
-    "|[\uD800-\uDBFF][\uDC00-\uDFFF]" +               // surrogate pair
-    "|\\\\(?:[a-zA-Z]+|[^\uD800-\uDFFF])" +           // function name
-    ")"
-);
-
-/**
- * This function lexes a single token.
- */
-Lexer.prototype.lex = function() {
-    var input = this.input;
-    var pos = this.pos;
-    if (pos === input.length) {
-        return new Token("EOF", pos, pos, this);
-    }
-    var match = matchAt(tokenRegex, input, pos);
-    if (match === null) {
-        throw new ParseError(
-            "Unexpected character: '" + input[pos] + "'",
-            new Token(input[pos], pos, pos + 1, this));
-    }
-    var text = match[2] || " ";
-    var start = this.pos;
-    this.pos += match[0].length;
-    var end = this.pos;
-    return new Token(text, start, end, this);
-};
-
-module.exports = Lexer;
-
-},{"./ParseError":6,"match-at":2}],4:[function(require,module,exports){
-/**
- * This file contains the “gullet” where macros are expanded
- * until only non-macro tokens remain.
- */
-
-var Lexer = require("./Lexer");
-
-function MacroExpander(input, macros) {
-    this.lexer = new Lexer(input);
-    this.macros = macros;
-    this.stack = []; // contains tokens in REVERSE order
-    this.discardedWhiteSpace = [];
-}
-
-/**
- * Recursively expand first token, then return first non-expandable token.
- */
-MacroExpander.prototype.nextToken = function() {
-    for (;;) {
-        if (this.stack.length === 0) {
-            this.stack.push(this.lexer.lex());
-        }
-        var topToken = this.stack.pop();
-        var name = topToken.text;
-        if (!(name.charAt(0) === "\\" && this.macros.hasOwnProperty(name))) {
-            return topToken;
-        }
-        var expansion = this.macros[name];
-        if (typeof expansion === "string") {
-            var bodyLexer = new Lexer(expansion);
-            expansion = [];
-            var tok = bodyLexer.lex();
-            while (tok.text !== "EOF") {
-                expansion.push(tok);
-                tok = bodyLexer.lex();
-            }
-            expansion.reverse(); // to fit in with stack using push and pop
-            this.macros[name] = expansion;
-        }
-        this.stack = this.stack.concat(expansion);
-    }
-};
-
-MacroExpander.prototype.get = function(ignoreSpace) {
-    this.discardedWhiteSpace = [];
-    var token = this.nextToken();
-    if (ignoreSpace) {
-        while (token.text === " ") {
-            this.discardedWhiteSpace.push(token);
-            token = this.nextToken();
-        }
-    }
-    return token;
-};
-
-/**
- * Undo the effect of the preceding call to the get method.
- * A call to this method MUST be immediately preceded and immediately followed
- * by a call to get.  Only used during mode switching, i.e. after one token
- * was got in the old mode but should get got again in a new mode
- * with possibly different whitespace handling.
- */
-MacroExpander.prototype.unget = function(token) {
-    this.stack.push(token);
-    while (this.discardedWhiteSpace.length !== 0) {
-        this.stack.push(this.discardedWhiteSpace.pop());
-    }
-};
-
-module.exports = MacroExpander;
-
-},{"./Lexer":3}],5:[function(require,module,exports){
-/**
- * This file contains information about the options that the Parser carries
- * around with it while parsing. Data is held in an `Options` object, and when
- * recursing, a new `Options` object can be created with the `.with*` and
- * `.reset` functions.
- */
-
-/**
- * This is the main options class. It contains the style, size, color, and font
- * of the current parse level. It also contains the style and size of the parent
- * parse level, so size changes can be handled efficiently.
- *
- * Each of the `.with*` and `.reset` functions passes its current style and size
- * as the parentStyle and parentSize of the new options class, so parent
- * handling is taken care of automatically.
- */
-function Options(data) {
-    this.style = data.style;
-    this.color = data.color;
-    this.size = data.size;
-    this.phantom = data.phantom;
-    this.font = data.font;
-
-    if (data.parentStyle === undefined) {
-        this.parentStyle = data.style;
-    } else {
-        this.parentStyle = data.parentStyle;
-    }
-
-    if (data.parentSize === undefined) {
-        this.parentSize = data.size;
-    } else {
-        this.parentSize = data.parentSize;
-    }
-}
-
-/**
- * Returns a new options object with the same properties as "this".  Properties
- * from "extension" will be copied to the new options object.
- */
-Options.prototype.extend = function(extension) {
-    var data = {
-        style: this.style,
-        size: this.size,
-        color: this.color,
-        parentStyle: this.style,
-        parentSize: this.size,
-        phantom: this.phantom,
-        font: this.font
-    };
-
-    for (var key in extension) {
-        if (extension.hasOwnProperty(key)) {
-            data[key] = extension[key];
-        }
-    }
-
-    return new Options(data);
-};
-
-/**
- * Create a new options object with the given style.
- */
-Options.prototype.withStyle = function(style) {
-    return this.extend({
-        style: style
-    });
-};
-
-/**
- * Create a new options object with the given size.
- */
-Options.prototype.withSize = function(size) {
-    return this.extend({
-        size: size
-    });
-};
-
-/**
- * Create a new options object with the given color.
- */
-Options.prototype.withColor = function(color) {
-    return this.extend({
-        color: color
-    });
-};
-
-/**
- * Create a new options object with "phantom" set to true.
- */
-Options.prototype.withPhantom = function() {
-    return this.extend({
-        phantom: true
-    });
-};
-
-/**
- * Create a new options objects with the give font.
- */
-Options.prototype.withFont = function(font) {
-    return this.extend({
-        font: font || this.font
-    });
-};
-
-/**
- * Create a new options object with the same style, size, and color. This is
- * used so that parent style and size changes are handled correctly.
- */
-Options.prototype.reset = function() {
-    return this.extend({});
-};
-
-/**
- * A map of color names to CSS colors.
- * TODO(emily): Remove this when we have real macros
- */
-var colorMap = {
-    "katex-blue": "#6495ed",
-    "katex-orange": "#ffa500",
-    "katex-pink": "#ff00af",
-    "katex-red": "#df0030",
-    "katex-green": "#28ae7b",
-    "katex-gray": "gray",
-    "katex-purple": "#9d38bd",
-    "katex-blueA": "#ccfaff",
-    "katex-blueB": "#80f6ff",
-    "katex-blueC": "#63d9ea",
-    "katex-blueD": "#11accd",
-    "katex-blueE": "#0c7f99",
-    "katex-tealA": "#94fff5",
-    "katex-tealB": "#26edd5",
-    "katex-tealC": "#01d1c1",
-    "katex-tealD": "#01a995",
-    "katex-tealE": "#208170",
-    "katex-greenA": "#b6ffb0",
-    "katex-greenB": "#8af281",
-    "katex-greenC": "#74cf70",
-    "katex-greenD": "#1fab54",
-    "katex-greenE": "#0d923f",
-    "katex-goldA": "#ffd0a9",
-    "katex-goldB": "#ffbb71",
-    "katex-goldC": "#ff9c39",
-    "katex-goldD": "#e07d10",
-    "katex-goldE": "#a75a05",
-    "katex-redA": "#fca9a9",
-    "katex-redB": "#ff8482",
-    "katex-redC": "#f9685d",
-    "katex-redD": "#e84d39",
-    "katex-redE": "#bc2612",
-    "katex-maroonA": "#ffbde0",
-    "katex-maroonB": "#ff92c6",
-    "katex-maroonC": "#ed5fa6",
-    "katex-maroonD": "#ca337c",
-    "katex-maroonE": "#9e034e",
-    "katex-purpleA": "#ddd7ff",
-    "katex-purpleB": "#c6b9fc",
-    "katex-purpleC": "#aa87ff",
-    "katex-purpleD": "#7854ab",
-    "katex-purpleE": "#543b78",
-    "katex-mintA": "#f5f9e8",
-    "katex-mintB": "#edf2df",
-    "katex-mintC": "#e0e5cc",
-    "katex-grayA": "#f6f7f7",
-    "katex-grayB": "#f0f1f2",
-    "katex-grayC": "#e3e5e6",
-    "katex-grayD": "#d6d8da",
-    "katex-grayE": "#babec2",
-    "katex-grayF": "#888d93",
-    "katex-grayG": "#626569",
-    "katex-grayH": "#3b3e40",
-    "katex-grayI": "#21242c",
-    "katex-kaBlue": "#314453",
-    "katex-kaGreen": "#71B307"
-};
-
-/**
- * Gets the CSS color of the current options object, accounting for the
- * `colorMap`.
- */
-Options.prototype.getColor = function() {
-    if (this.phantom) {
-        return "transparent";
-    } else {
-        return colorMap[this.color] || this.color;
-    }
-};
-
-module.exports = Options;
-
-},{}],6:[function(require,module,exports){
-/**
- * This is the ParseError class, which is the main error thrown by KaTeX
- * functions when something has gone wrong. This is used to distinguish internal
- * errors from errors in the expression that the user provided.
- *
- * If possible, a caller should provide a Token or ParseNode with information
- * about where in the source string the problem occurred.
- *
- * @param {string} message  The error message
- * @param {(Token|ParseNode)=} token  An object providing position information
- */
-function ParseError(message, token) {
-    var error = "KaTeX parse error: " + message;
-    var start;
-    var end;
-
-    if (token && token.lexer && token.start <= token.end) {
-        // If we have the input and a position, make the error a bit fancier
-
-        // Get the input
-        var input = token.lexer.input;
-
-        // Prepend some information
-        start = token.start;
-        end = token.end;
-        if (start === input.length) {
-            error += " at end of input: ";
-        } else {
-            error += " at position " + (start + 1) + ": ";
-        }
-
-        // Underline token in question using combining underscores
-        var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332");
-
-        // Extract some context from the input and add it to the error
-        var left;
-        if (start > 15) {
-            left = "…" + input.slice(start - 15, start);
-        } else {
-            left = input.slice(0, start);
-        }
-        var right;
-        if (end + 15 < input.length) {
-            right = input.slice(end, end + 15) + "…";
-        } else {
-            right = input.slice(end);
-        }
-        error += left + underlined + right;
-    }
-
-    // Some hackery to make ParseError a prototype of Error
-    // See http://stackoverflow.com/a/8460753
-    var self = new Error(error);
-    self.name = "ParseError";
-    self.__proto__ = ParseError.prototype;
-
-    self.position = start;
-    return self;
-}
-
-// More hackery
-ParseError.prototype.__proto__ = Error.prototype;
-
-module.exports = ParseError;
-
-},{}],7:[function(require,module,exports){
-/* eslint no-constant-condition:0 */
-var functions = require("./functions");
-var environments = require("./environments");
-var MacroExpander = require("./MacroExpander");
-var symbols = require("./symbols");
-var utils = require("./utils");
-var cjkRegex = require("./unicodeRegexes").cjkRegex;
-
-var parseData = require("./parseData");
-var ParseError = require("./ParseError");
-
-/**
- * This file contains the parser used to parse out a TeX expression from the
- * input. Since TeX isn't context-free, standard parsers don't work particularly
- * well.
- *
- * The strategy of this parser is as such:
- *
- * The main functions (the `.parse...` ones) take a position in the current
- * parse string to parse tokens from. The lexer (found in Lexer.js, stored at
- * this.lexer) also supports pulling out tokens at arbitrary places. When
- * individual tokens are needed at a position, the lexer is called to pull out a
- * token, which is then used.
- *
- * The parser has a property called "mode" indicating the mode that
- * the parser is currently in. Currently it has to be one of "math" or
- * "text", which denotes whether the current environment is a math-y
- * one or a text-y one (e.g. inside \text). Currently, this serves to
- * limit the functions which can be used in text mode.
- *
- * The main functions then return an object which contains the useful data that
- * was parsed at its given point, and a new position at the end of the parsed
- * data. The main functions can call each other and continue the parsing by
- * using the returned position as a new starting point.
- *
- * There are also extra `.handle...` functions, which pull out some reused
- * functionality into self-contained functions.
- *
- * The earlier functions return ParseNodes.
- * The later functions (which are called deeper in the parse) sometimes return
- * ParseFuncOrArgument, which contain a ParseNode as well as some data about
- * whether the parsed object is a function which is missing some arguments, or a
- * standalone object which can be used as an argument to another function.
- */
-
-/**
- * Main Parser class
- */
-function Parser(input, settings) {
-    // Create a new macro expander (gullet) and (indirectly via that) also a
-    // new lexer (mouth) for this parser (stomach, in the language of TeX)
-    this.gullet = new MacroExpander(input, settings.macros);
-    // Store the settings for use in parsing
-    this.settings = settings;
-    // Count leftright depth (for \middle errors)
-    this.leftrightDepth = 0;
-}
-
-var ParseNode = parseData.ParseNode;
-
-/**
- * An initial function (without its arguments), or an argument to a function.
- * The `result` argument should be a ParseNode.
- */
-function ParseFuncOrArgument(result, isFunction, token) {
-    this.result = result;
-    // Is this a function (i.e. is it something defined in functions.js)?
-    this.isFunction = isFunction;
-    this.token = token;
-}
-
-/**
- * Checks a result to make sure it has the right type, and throws an
- * appropriate error otherwise.
- *
- * @param {boolean=} consume whether to consume the expected token,
- *                           defaults to true
- */
-Parser.prototype.expect = function(text, consume) {
-    if (this.nextToken.text !== text) {
-        throw new ParseError(
-            "Expected '" + text + "', got '" + this.nextToken.text + "'",
-            this.nextToken
-        );
-    }
-    if (consume !== false) {
-        this.consume();
-    }
-};
-
-/**
- * Considers the current look ahead token as consumed,
- * and fetches the one after that as the new look ahead.
- */
-Parser.prototype.consume = function() {
-    this.nextToken = this.gullet.get(this.mode === "math");
-};
-
-Parser.prototype.switchMode = function(newMode) {
-    this.gullet.unget(this.nextToken);
-    this.mode = newMode;
-    this.consume();
-};
-
-/**
- * Main parsing function, which parses an entire input.
- *
- * @return {?Array.<ParseNode>}
- */
-Parser.prototype.parse = function() {
-    // Try to parse the input
-    this.mode = "math";
-    this.consume();
-    var parse = this.parseInput();
-    return parse;
-};
-
-/**
- * Parses an entire input tree.
- */
-Parser.prototype.parseInput = function() {
-    // Parse an expression
-    var expression = this.parseExpression(false);
-    // If we succeeded, make sure there's an EOF at the end
-    this.expect("EOF", false);
-    return expression;
-};
-
-var endOfExpression = ["}", "\\end", "\\right", "&", "\\\\", "\\cr"];
-
-/**
- * Parses an "expression", which is a list of atoms.
- *
- * @param {boolean} breakOnInfix  Should the parsing stop when we hit infix
- *                  nodes? This happens when functions have higher precendence
- *                  than infix nodes in implicit parses.
- *
- * @param {?string} breakOnTokenText  The text of the token that the expression
- *                  should end with, or `null` if something else should end the
- *                  expression.
- *
- * @return {ParseNode}
- */
-Parser.prototype.parseExpression = function(breakOnInfix, breakOnTokenText) {
-    var body = [];
-    // Keep adding atoms to the body until we can't parse any more atoms (either
-    // we reached the end, a }, or a \right)
-    while (true) {
-        var lex = this.nextToken;
-        if (endOfExpression.indexOf(lex.text) !== -1) {
-            break;
-        }
-        if (breakOnTokenText && lex.text === breakOnTokenText) {
-            break;
-        }
-        if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {
-            break;
-        }
-        var atom = this.parseAtom();
-        if (!atom) {
-            if (!this.settings.throwOnError && lex.text[0] === "\\") {
-                var errorNode = this.handleUnsupportedCmd();
-                body.push(errorNode);
-                continue;
-            }
-
-            break;
-        }
-        body.push(atom);
-    }
-    return this.handleInfixNodes(body);
-};
-
-/**
- * Rewrites infix operators such as \over with corresponding commands such
- * as \frac.
- *
- * There can only be one infix operator per group.  If there's more than one
- * then the expression is ambiguous.  This can be resolved by adding {}.
- *
- * @returns {Array}
- */
-Parser.prototype.handleInfixNodes = function(body) {
-    var overIndex = -1;
-    var funcName;
-
-    for (var i = 0; i < body.length; i++) {
-        var node = body[i];
-        if (node.type === "infix") {
-            if (overIndex !== -1) {
-                throw new ParseError(
-                    "only one infix operator per group",
-                    node.value.token);
-            }
-            overIndex = i;
-            funcName = node.value.replaceWith;
-        }
-    }
-
-    if (overIndex !== -1) {
-        var numerNode;
-        var denomNode;
-
-        var numerBody = body.slice(0, overIndex);
-        var denomBody = body.slice(overIndex + 1);
-
-        if (numerBody.length === 1 && numerBody[0].type === "ordgroup") {
-            numerNode = numerBody[0];
-        } else {
-            numerNode = new ParseNode("ordgroup", numerBody, this.mode);
-        }
-
-        if (denomBody.length === 1 && denomBody[0].type === "ordgroup") {
-            denomNode = denomBody[0];
-        } else {
-            denomNode = new ParseNode("ordgroup", denomBody, this.mode);
-        }
-
-        var value = this.callFunction(
-            funcName, [numerNode, denomNode], null);
-        return [new ParseNode(value.type, value, this.mode)];
-    } else {
-        return body;
-    }
-};
-
-// The greediness of a superscript or subscript
-var SUPSUB_GREEDINESS = 1;
-
-/**
- * Handle a subscript or superscript with nice errors.
- */
-Parser.prototype.handleSupSubscript = function(name) {
-    var symbolToken = this.nextToken;
-    var symbol = symbolToken.text;
-    this.consume();
-    var group = this.parseGroup();
-
-    if (!group) {
-        if (!this.settings.throwOnError && this.nextToken.text[0] === "\\") {
-            return this.handleUnsupportedCmd();
-        } else {
-            throw new ParseError(
-                "Expected group after '" + symbol + "'",
-                symbolToken
-            );
-        }
-    } else if (group.isFunction) {
-        // ^ and _ have a greediness, so handle interactions with functions'
-        // greediness
-        var funcGreediness = functions[group.result].greediness;
-        if (funcGreediness > SUPSUB_GREEDINESS) {
-            return this.parseFunction(group);
-        } else {
-            throw new ParseError(
-                "Got function '" + group.result + "' with no arguments " +
-                    "as " + name, symbolToken);
-        }
-    } else {
-        return group.result;
-    }
-};
-
-/**
- * Converts the textual input of an unsupported command into a text node
- * contained within a color node whose color is determined by errorColor
- */
-Parser.prototype.handleUnsupportedCmd = function() {
-    var text = this.nextToken.text;
-    var textordArray = [];
-
-    for (var i = 0; i < text.length; i++) {
-        textordArray.push(new ParseNode("textord", text[i], "text"));
-    }
-
-    var textNode = new ParseNode(
-        "text",
-        {
-            body: textordArray,
-            type: "text"
-        },
-        this.mode);
-
-    var colorNode = new ParseNode(
-        "color",
-        {
-            color: this.settings.errorColor,
-            value: [textNode],
-            type: "color"
-        },
-        this.mode);
-
-    this.consume();
-    return colorNode;
-};
-
-/**
- * Parses a group with optional super/subscripts.
- *
- * @return {?ParseNode}
- */
-Parser.prototype.parseAtom = function() {
-    // The body of an atom is an implicit group, so that things like
-    // \left(x\right)^2 work correctly.
-    var base = this.parseImplicitGroup();
-
-    // In text mode, we don't have superscripts or subscripts
-    if (this.mode === "text") {
-        return base;
-    }
-
-    // Note that base may be empty (i.e. null) at this point.
-
-    var superscript;
-    var subscript;
-    while (true) {
-        // Lex the first token
-        var lex = this.nextToken;
-
-        if (lex.text === "\\limits" || lex.text === "\\nolimits") {
-            // We got a limit control
-            if (!base || base.type !== "op") {
-                throw new ParseError(
-                    "Limit controls must follow a math operator",
-                    lex);
-            } else {
-                var limits = lex.text === "\\limits";
-                base.value.limits = limits;
-                base.value.alwaysHandleSupSub = true;
-            }
-            this.consume();
-        } else if (lex.text === "^") {
-            // We got a superscript start
-            if (superscript) {
-                throw new ParseError("Double superscript", lex);
-            }
-            superscript = this.handleSupSubscript("superscript");
-        } else if (lex.text === "_") {
-            // We got a subscript start
-            if (subscript) {
-                throw new ParseError("Double subscript", lex);
-            }
-            subscript = this.handleSupSubscript("subscript");
-        } else if (lex.text === "'") {
-            // We got a prime
-            var prime = new ParseNode("textord", "\\prime", this.mode);
-
-            // Many primes can be grouped together, so we handle this here
-            var primes = [prime];
-            this.consume();
-            // Keep lexing tokens until we get something that's not a prime
-            while (this.nextToken.text === "'") {
-                // For each one, add another prime to the list
-                primes.push(prime);
-                this.consume();
-            }
-            // Put them into an ordgroup as the superscript
-            superscript = new ParseNode("ordgroup", primes, this.mode);
-        } else {
-            // If it wasn't ^, _, or ', stop parsing super/subscripts
-            break;
-        }
-    }
-
-    if (superscript || subscript) {
-        // If we got either a superscript or subscript, create a supsub
-        return new ParseNode("supsub", {
-            base: base,
-            sup: superscript,
-            sub: subscript
-        }, this.mode);
-    } else {
-        // Otherwise return the original body
-        return base;
-    }
-};
-
-// A list of the size-changing functions, for use in parseImplicitGroup
-var sizeFuncs = [
-    "\\tiny", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize",
-    "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"
-];
-
-// A list of the style-changing functions, for use in parseImplicitGroup
-var styleFuncs = [
-    "\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"
-];
-
-/**
- * Parses an implicit group, which is a group that starts at the end of a
- * specified, and ends right before a higher explicit group ends, or at EOL. It
- * is used for functions that appear to affect the current style, like \Large or
- * \textrm, where instead of keeping a style we just pretend that there is an
- * implicit grouping after it until the end of the group. E.g.
- *   small text {\Large large text} small text again
- * It is also used for \left and \right to get the correct grouping.
- *
- * @return {?ParseNode}
- */
-Parser.prototype.parseImplicitGroup = function() {
-    var start = this.parseSymbol();
-
-    if (start == null) {
-        // If we didn't get anything we handle, fall back to parseFunction
-        return this.parseFunction();
-    }
-
-    var func = start.result;
-    var body;
-
-    if (func === "\\left") {
-        // If we see a left:
-        // Parse the entire left function (including the delimiter)
-        var left = this.parseFunction(start);
-        // Parse out the implicit body
-        ++this.leftrightDepth;
-        body = this.parseExpression(false);
-        --this.leftrightDepth;
-        // Check the next token
-        this.expect("\\right", false);
-        var right = this.parseFunction();
-        return new ParseNode("leftright", {
-            body: body,
-            left: left.value.value,
-            right: right.value.value
-        }, this.mode);
-    } else if (func === "\\begin") {
-        // begin...end is similar to left...right
-        var begin = this.parseFunction(start);
-        var envName = begin.value.name;
-        if (!environments.hasOwnProperty(envName)) {
-            throw new ParseError(
-                "No such environment: " + envName, begin.value.nameGroup);
-        }
-        // Build the environment object. Arguments and other information will
-        // be made available to the begin and end methods using properties.
-        var env = environments[envName];
-        var args = this.parseArguments("\\begin{" + envName + "}", env);
-        var context = {
-            mode: this.mode,
-            envName: envName,
-            parser: this,
-            positions: args.pop()
-        };
-        var result = env.handler(context, args);
-        this.expect("\\end", false);
-        var endNameToken = this.nextToken;
-        var end = this.parseFunction();
-        if (end.value.name !== envName) {
-            throw new ParseError(
-                "Mismatch: \\begin{" + envName + "} matched " +
-                "by \\end{" + end.value.name + "}",
-                endNameToken);
-        }
-        result.position = end.position;
-        return result;
-    } else if (utils.contains(sizeFuncs, func)) {
-        // If we see a sizing function, parse out the implict body
-        body = this.parseExpression(false);
-        return new ParseNode("sizing", {
-            // Figure out what size to use based on the list of functions above
-            size: "size" + (utils.indexOf(sizeFuncs, func) + 1),
-            value: body
-        }, this.mode);
-    } else if (utils.contains(styleFuncs, func)) {
-        // If we see a styling function, parse out the implict body
-        body = this.parseExpression(true);
-        return new ParseNode("styling", {
-            // Figure out what style to use by pulling out the style from
-            // the function name
-            style: func.slice(1, func.length - 5),
-            value: body
-        }, this.mode);
-    } else {
-        // Defer to parseFunction if it's not a function we handle
-        return this.parseFunction(start);
-    }
-};
-
-/**
- * Parses an entire function, including its base and all of its arguments.
- * The base might either have been parsed already, in which case
- * it is provided as an argument, or it's the next group in the input.
- *
- * @param {ParseFuncOrArgument=} baseGroup optional as described above
- * @return {?ParseNode}
- */
-Parser.prototype.parseFunction = function(baseGroup) {
-    if (!baseGroup) {
-        baseGroup = this.parseGroup();
-    }
-
-    if (baseGroup) {
-        if (baseGroup.isFunction) {
-            var func = baseGroup.result;
-            var funcData = functions[func];
-            if (this.mode === "text" && !funcData.allowedInText) {
-                throw new ParseError(
-                    "Can't use function '" + func + "' in text mode",
-                    baseGroup.token);
-            }
-
-            var args = this.parseArguments(func, funcData);
-            var token = baseGroup.token;
-            var result = this.callFunction(func, args, args.pop(), token);
-            return new ParseNode(result.type, result, this.mode);
-        } else {
-            return baseGroup.result;
-        }
-    } else {
-        return null;
-    }
-};
-
-/**
- * Call a function handler with a suitable context and arguments.
- */
-Parser.prototype.callFunction = function(name, args, positions, token) {
-    var context = {
-        funcName: name,
-        parser: this,
-        positions: positions,
-        token: token
-    };
-    return functions[name].handler(context, args);
-};
-
-/**
- * Parses the arguments of a function or environment
- *
- * @param {string} func  "\name" or "\begin{name}"
- * @param {{numArgs:number,numOptionalArgs:number|undefined}} funcData
- * @return the array of arguments, with the list of positions as last element
- */
-Parser.prototype.parseArguments = function(func, funcData) {
-    var totalArgs = funcData.numArgs + funcData.numOptionalArgs;
-    if (totalArgs === 0) {
-        return [[this.pos]];
-    }
-
-    var baseGreediness = funcData.greediness;
-    var positions = [this.pos];
-    var args = [];
-
-    for (var i = 0; i < totalArgs; i++) {
-        var nextToken = this.nextToken;
-        var argType = funcData.argTypes && funcData.argTypes[i];
-        var arg;
-        if (i < funcData.numOptionalArgs) {
-            if (argType) {
-                arg = this.parseGroupOfType(argType, true);
-            } else {
-                arg = this.parseGroup(true);
-            }
-            if (!arg) {
-                args.push(null);
-                positions.push(this.pos);
-                continue;
-            }
-        } else {
-            if (argType) {
-                arg = this.parseGroupOfType(argType);
-            } else {
-                arg = this.parseGroup();
-            }
-            if (!arg) {
-                if (!this.settings.throwOnError &&
-                    this.nextToken.text[0] === "\\") {
-                    arg = new ParseFuncOrArgument(
-                        this.handleUnsupportedCmd(this.nextToken.text),
-                        false);
-                } else {
-                    throw new ParseError(
-                        "Expected group after '" + func + "'", nextToken);
-                }
-            }
-        }
-        var argNode;
-        if (arg.isFunction) {
-            var argGreediness =
-                functions[arg.result].greediness;
-            if (argGreediness > baseGreediness) {
-                argNode = this.parseFunction(arg);
-            } else {
-                throw new ParseError(
-                    "Got function '" + arg.result + "' as " +
-                    "argument to '" + func + "'", nextToken);
-            }
-        } else {
-            argNode = arg.result;
-        }
-        args.push(argNode);
-        positions.push(this.pos);
-    }
-
-    args.push(positions);
-
-    return args;
-};
-
-
-/**
- * Parses a group when the mode is changing.
- *
- * @return {?ParseFuncOrArgument}
- */
-Parser.prototype.parseGroupOfType = function(innerMode, optional) {
-    var outerMode = this.mode;
-    // Handle `original` argTypes
-    if (innerMode === "original") {
-        innerMode = outerMode;
-    }
-
-    if (innerMode === "color") {
-        return this.parseColorGroup(optional);
-    }
-    if (innerMode === "size") {
-        return this.parseSizeGroup(optional);
-    }
-
-    this.switchMode(innerMode);
-    if (innerMode === "text") {
-        // text mode is special because it should ignore the whitespace before
-        // it
-        while (this.nextToken.text === " ") {
-            this.consume();
-        }
-    }
-    // By the time we get here, innerMode is one of "text" or "math".
-    // We switch the mode of the parser, recurse, then restore the old mode.
-    var res = this.parseGroup(optional);
-    this.switchMode(outerMode);
-    return res;
-};
-
-/**
- * Parses a group, essentially returning the string formed by the
- * brace-enclosed tokens plus some position information.
- *
- * @param {string} modeName  Used to describe the mode in error messages
- * @param {boolean=} optional  Whether the group is optional or required
- */
-Parser.prototype.parseStringGroup = function(modeName, optional) {
-    if (optional && this.nextToken.text !== "[") {
-        return null;
-    }
-    var outerMode = this.mode;
-    this.mode = "text";
-    this.expect(optional ? "[" : "{");
-    var str = "";
-    var firstToken = this.nextToken;
-    var lastToken = firstToken;
-    while (this.nextToken.text !== (optional ? "]" : "}")) {
-        if (this.nextToken.text === "EOF") {
-            throw new ParseError(
-                "Unexpected end of input in " + modeName,
-                firstToken.range(this.nextToken, str));
-        }
-        lastToken = this.nextToken;
-        str += lastToken.text;
-        this.consume();
-    }
-    this.mode = outerMode;
-    this.expect(optional ? "]" : "}");
-    return firstToken.range(lastToken, str);
-};
-
-/**
- * Parses a regex-delimited group: the largest sequence of tokens
- * whose concatenated strings match `regex`. Returns the string
- * formed by the tokens plus some position information.
- *
- * @param {RegExp} regex
- * @param {string} modeName  Used to describe the mode in error messages
- */
-Parser.prototype.parseRegexGroup = function(regex, modeName) {
-    var outerMode = this.mode;
-    this.mode = "text";
-    var firstToken = this.nextToken;
-    var lastToken = firstToken;
-    var str = "";
-    while (this.nextToken.text !== "EOF"
-           && regex.test(str + this.nextToken.text)) {
-        lastToken = this.nextToken;
-        str += lastToken.text;
-        this.consume();
-    }
-    if (str === "") {
-        throw new ParseError(
-            "Invalid " + modeName + ": '" + firstToken.text + "'",
-            firstToken);
-    }
-    this.mode = outerMode;
-    return firstToken.range(lastToken, str);
-};
-
-/**
- * Parses a color description.
- */
-Parser.prototype.parseColorGroup = function(optional) {
-    var res = this.parseStringGroup("color", optional);
-    if (!res) {
-        return null;
-    }
-    var match = (/^(#[a-z0-9]+|[a-z]+)$/i).exec(res.text);
-    if (!match) {
-        throw new ParseError("Invalid color: '" + res.text + "'", res);
-    }
-    return new ParseFuncOrArgument(
-        new ParseNode("color", match[0], this.mode),
-        false);
-};
-
-/**
- * Parses a size specification, consisting of magnitude and unit.
- */
-Parser.prototype.parseSizeGroup = function(optional) {
-    var res;
-    if (!optional && this.nextToken.text !== "{") {
-        res = this.parseRegexGroup(
-            /^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2}$/, "size");
-    } else {
-        res = this.parseStringGroup("size", optional);
-    }
-    if (!res) {
-        return null;
-    }
-    var match = (/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/).exec(res.text);
-    if (!match) {
-        throw new ParseError("Invalid size: '" + res.text + "'", res);
-    }
-    var data = {
-        number: +(match[1] + match[2]), // sign + magnitude, cast to number
-        unit: match[3]
-    };
-    if (data.unit !== "em" && data.unit !== "ex" && data.unit !== "mu") {
-        throw new ParseError("Invalid unit: '" + data.unit + "'", res);
-    }
-    return new ParseFuncOrArgument(
-        new ParseNode("color", data, this.mode),
-        false);
-};
-
-/**
- * If the argument is false or absent, this parses an ordinary group,
- * which is either a single nucleus (like "x") or an expression
- * in braces (like "{x+y}").
- * If the argument is true, it parses either a bracket-delimited expression
- * (like "[x+y]") or returns null to indicate the absence of a
- * bracket-enclosed group.
- *
- * @param {boolean=} optional  Whether the group is optional or required
- * @return {?ParseFuncOrArgument}
- */
-Parser.prototype.parseGroup = function(optional) {
-    var firstToken = this.nextToken;
-    // Try to parse an open brace
-    if (this.nextToken.text === (optional ? "[" : "{")) {
-        // If we get a brace, parse an expression
-        this.consume();
-        var expression = this.parseExpression(false, optional ? "]" : null);
-        var lastToken = this.nextToken;
-        // Make sure we get a close brace
-        this.expect(optional ? "]" : "}");
-        if (this.mode === "text") {
-            this.formLigatures(expression);
-        }
-        return new ParseFuncOrArgument(
-            new ParseNode("ordgroup", expression, this.mode,
-                          firstToken, lastToken),
-            false);
-    } else {
-        // Otherwise, just return a nucleus, or nothing for an optional group
-        return optional ? null : this.parseSymbol();
-    }
-};
-
-/**
- * Form ligature-like combinations of characters for text mode.
- * This includes inputs like "--", "---", "``" and "''".
- * The result will simply replace multiple textord nodes with a single
- * character in each value by a single textord node having multiple
- * characters in its value.  The representation is still ASCII source.
- *
- * @param {Array.<ParseNode>} group  the nodes of this group,
- *                                   list will be moified in place
- */
-Parser.prototype.formLigatures = function(group) {
-    var i;
-    var n = group.length - 1;
-    for (i = 0; i < n; ++i) {
-        var a = group[i];
-        var v = a.value;
-        if (v === "-" && group[i + 1].value === "-") {
-            if (i + 1 < n && group[i + 2].value === "-") {
-                group.splice(i, 3, new ParseNode(
-                    "textord", "---", "text", a, group[i + 2]));
-                n -= 2;
-            } else {
-                group.splice(i, 2, new ParseNode(
-                    "textord", "--", "text", a, group[i + 1]));
-                n -= 1;
-            }
-        }
-        if ((v === "'" || v === "`") && group[i + 1].value === v) {
-            group.splice(i, 2, new ParseNode(
-                "textord", v + v, "text", a, group[i + 1]));
-            n -= 1;
-        }
-    }
-};
-
-/**
- * Parse a single symbol out of the string. Here, we handle both the functions
- * we have defined, as well as the single character symbols
- *
- * @return {?ParseFuncOrArgument}
- */
-Parser.prototype.parseSymbol = function() {
-    var nucleus = this.nextToken;
-
-    if (functions[nucleus.text]) {
-        this.consume();
-        // If there exists a function with this name, we return the function and
-        // say that it is a function.
-        return new ParseFuncOrArgument(
-            nucleus.text,
-            true, nucleus);
-    } else if (symbols[this.mode][nucleus.text]) {
-        this.consume();
-        // Otherwise if this is a no-argument function, find the type it
-        // corresponds to in the symbols map
-        return new ParseFuncOrArgument(
-            new ParseNode(symbols[this.mode][nucleus.text].group,
-                          nucleus.text, this.mode, nucleus),
-            false, nucleus);
-    } else if (this.mode === "text" && cjkRegex.test(nucleus.text)) {
-        this.consume();
-        return new ParseFuncOrArgument(
-            new ParseNode("textord", nucleus.text, this.mode, nucleus),
-            false, nucleus);
-    } else {
-        return null;
-    }
-};
-
-Parser.prototype.ParseNode = ParseNode;
-
-module.exports = Parser;
-
-},{"./MacroExpander":4,"./ParseError":6,"./environments":16,"./functions":19,"./parseData":21,"./symbols":23,"./unicodeRegexes":24,"./utils":25}],8:[function(require,module,exports){
-/**
- * This is a module for storing settings passed into KaTeX. It correctly handles
- * default settings.
- */
-
-/**
- * Helper function for getting a default value if the value is undefined
- */
-function get(option, defaultValue) {
-    return option === undefined ? defaultValue : option;
-}
-
-/**
- * The main Settings object
- *
- * The current options stored are:
- *  - displayMode: Whether the expression should be typeset by default in
- *                 textstyle or displaystyle (default false)
- */
-function Settings(options) {
-    // allow null options
-    options = options || {};
-    this.displayMode = get(options.displayMode, false);
-    this.throwOnError = get(options.throwOnError, true);
-    this.errorColor = get(options.errorColor, "#cc0000");
-    this.macros = options.macros || {};
-}
-
-module.exports = Settings;
-
-},{}],9:[function(require,module,exports){
-/**
- * This file contains information and classes for the various kinds of styles
- * used in TeX. It provides a generic `Style` class, which holds information
- * about a specific style. It then provides instances of all the different kinds
- * of styles possible, and provides functions to move between them and get
- * information about them.
- */
-
-var sigmas = require("./fontMetrics.js").sigmas;
-
-var metrics = [{}, {}, {}];
-var i;
-for (var key in sigmas) {
-    if (sigmas.hasOwnProperty(key)) {
-        for (i = 0; i < 3; i++) {
-            metrics[i][key] = sigmas[key][i];
-        }
-    }
-}
-for (i = 0; i < 3; i++) {
-    metrics[i].emPerEx = sigmas.xHeight[i] / sigmas.quad[i];
-}
-
-/**
- * The main style class. Contains a unique id for the style, a size (which is
- * the same for cramped and uncramped version of a style), a cramped flag, and a
- * size multiplier, which gives the size difference between a style and
- * textstyle.
- */
-function Style(id, size, multiplier, cramped) {
-    this.id = id;
-    this.size = size;
-    this.cramped = cramped;
-    this.sizeMultiplier = multiplier;
-    this.metrics = metrics[size > 0 ? size - 1 : 0];
-}
-
-/**
- * Get the style of a superscript given a base in the current style.
- */
-Style.prototype.sup = function() {
-    return styles[sup[this.id]];
-};
-
-/**
- * Get the style of a subscript given a base in the current style.
- */
-Style.prototype.sub = function() {
-    return styles[sub[this.id]];
-};
-
-/**
- * Get the style of a fraction numerator given the fraction in the current
- * style.
- */
-Style.prototype.fracNum = function() {
-    return styles[fracNum[this.id]];
-};
-
-/**
- * Get the style of a fraction denominator given the fraction in the current
- * style.
- */
-Style.prototype.fracDen = function() {
-    return styles[fracDen[this.id]];
-};
-
-/**
- * Get the cramped version of a style (in particular, cramping a cramped style
- * doesn't change the style).
- */
-Style.prototype.cramp = function() {
-    return styles[cramp[this.id]];
-};
-
-/**
- * HTML class name, like "displaystyle cramped"
- */
-Style.prototype.cls = function() {
-    return sizeNames[this.size] + (this.cramped ? " cramped" : " uncramped");
-};
-
-/**
- * HTML Reset class name, like "reset-textstyle"
- */
-Style.prototype.reset = function() {
-    return resetNames[this.size];
-};
-
-/**
- * Return if this style is tightly spaced (scriptstyle/scriptscriptstyle)
- */
-Style.prototype.isTight = function() {
-    return this.size >= 2;
-};
-
-// IDs of the different styles
-var D = 0;
-var Dc = 1;
-var T = 2;
-var Tc = 3;
-var S = 4;
-var Sc = 5;
-var SS = 6;
-var SSc = 7;
-
-// String names for the different sizes
-var sizeNames = [
-    "displaystyle textstyle",
-    "textstyle",
-    "scriptstyle",
-    "scriptscriptstyle"
-];
-
-// Reset names for the different sizes
-var resetNames = [
-    "reset-textstyle",
-    "reset-textstyle",
-    "reset-scriptstyle",
-    "reset-scriptscriptstyle"
-];
-
-// Instances of the different styles
-var styles = [
-    new Style(D, 0, 1.0, false),
-    new Style(Dc, 0, 1.0, true),
-    new Style(T, 1, 1.0, false),
-    new Style(Tc, 1, 1.0, true),
-    new Style(S, 2, 0.7, false),
-    new Style(Sc, 2, 0.7, true),
-    new Style(SS, 3, 0.5, false),
-    new Style(SSc, 3, 0.5, true)
-];
-
-// Lookup tables for switching from one style to another
-var sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
-var sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
-var fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
-var fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
-var cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
-
-// We only export some of the styles. Also, we don't export the `Style` class so
-// no more styles can be generated.
-module.exports = {
-    DISPLAY: styles[D],
-    TEXT: styles[T],
-    SCRIPT: styles[S],
-    SCRIPTSCRIPT: styles[SS]
-};
-
-},{"./fontMetrics.js":17}],10:[function(require,module,exports){
-/* eslint no-console:0 */
-/**
- * This module contains general functions that can be used for building
- * different kinds of domTree nodes in a consistent manner.
- */
-
-var domTree = require("./domTree");
-var fontMetrics = require("./fontMetrics");
-var symbols = require("./symbols");
-var utils = require("./utils");
-
-var greekCapitals = [
-    "\\Gamma",
-    "\\Delta",
-    "\\Theta",
-    "\\Lambda",
-    "\\Xi",
-    "\\Pi",
-    "\\Sigma",
-    "\\Upsilon",
-    "\\Phi",
-    "\\Psi",
-    "\\Omega"
-];
-
-// The following have to be loaded from Main-Italic font, using class mainit
-var mainitLetters = [
-    "\u0131",   // dotless i, \imath
-    "\u0237",   // dotless j, \jmath
-    "\u00a3"   // \pounds
-];
-
-/**
- * Makes a symbolNode after translation via the list of symbols in symbols.js.
- * Correctly pulls out metrics for the character, and optionally takes a list of
- * classes to be attached to the node.
- *
- * TODO: make argument order closer to makeSpan
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- */
-var makeSymbol = function(value, fontFamily, mode, options, classes) {
-    // Replace the value with its replaced value from symbol.js
-    if (symbols[mode][value] && symbols[mode][value].replace) {
-        value = symbols[mode][value].replace;
-    }
-
-    var metrics = fontMetrics.getCharacterMetrics(value, fontFamily);
-
-    var symbolNode;
-    if (metrics) {
-        var italic = metrics.italic;
-        if (mode === "text") {
-            italic = 0;
-        }
-        symbolNode = new domTree.symbolNode(
-            value, metrics.height, metrics.depth, italic, metrics.skew,
-            classes);
-    } else {
-        // TODO(emily): Figure out a good way to only print this in development
-        typeof console !== "undefined" && console.warn(
-            "No character metrics for '" + value + "' in style '" +
-                fontFamily + "'");
-        symbolNode = new domTree.symbolNode(value, 0, 0, 0, 0, classes);
-    }
-
-    if (options) {
-        if (options.style.isTight()) {
-            symbolNode.classes.push("mtight");
-        }
-        if (options.getColor()) {
-            symbolNode.style.color = options.getColor();
-        }
-    }
-
-    return symbolNode;
-};
-
-/**
- * Makes a symbol in Main-Regular or AMS-Regular.
- * Used for rel, bin, open, close, inner, and punct.
- */
-var mathsym = function(value, mode, options, classes) {
-    // Decide what font to render the symbol in by its entry in the symbols
-    // table.
-    // Have a special case for when the value = \ because the \ is used as a
-    // textord in unsupported command errors but cannot be parsed as a regular
-    // text ordinal and is therefore not present as a symbol in the symbols
-    // table for text
-    if (value === "\\" || symbols[mode][value].font === "main") {
-        return makeSymbol(value, "Main-Regular", mode, options, classes);
-    } else {
-        return makeSymbol(
-            value, "AMS-Regular", mode, options, classes.concat(["amsrm"]));
-    }
-};
-
-/**
- * Makes a symbol in the default font for mathords and textords.
- */
-var mathDefault = function(value, mode, options, classes, type) {
-    if (type === "mathord") {
-        return mathit(value, mode, options, classes);
-    } else if (type === "textord") {
-        return makeSymbol(
-            value, "Main-Regular", mode, options, classes.concat(["mathrm"]));
-    } else {
-        throw new Error("unexpected type: " + type + " in mathDefault");
-    }
-};
-
-/**
- * Makes a symbol in the italic math font.
- */
-var mathit = function(value, mode, options, classes) {
-    if (/[0-9]/.test(value.charAt(0)) ||
-            // glyphs for \imath and \jmath do not exist in Math-Italic so we
-            // need to use Main-Italic instead
-            utils.contains(mainitLetters, value) ||
-            utils.contains(greekCapitals, value)) {
-        return makeSymbol(
-            value, "Main-Italic", mode, options, classes.concat(["mainit"]));
-    } else {
-        return makeSymbol(
-            value, "Math-Italic", mode, options, classes.concat(["mathit"]));
-    }
-};
-
-/**
- * Makes either a mathord or textord in the correct font and color.
- */
-var makeOrd = function(group, options, type) {
-    var mode = group.mode;
-    var value = group.value;
-    if (symbols[mode][value] && symbols[mode][value].replace) {
-        value = symbols[mode][value].replace;
-    }
-
-    var classes = ["mord"];
-
-    var font = options.font;
-    if (font) {
-        if (font === "mathit" || utils.contains(mainitLetters, value)) {
-            return mathit(value, mode, options, classes);
-        } else {
-            var fontName = fontMap[font].fontName;
-            if (fontMetrics.getCharacterMetrics(value, fontName)) {
-                return makeSymbol(
-                    value, fontName, mode, options, classes.concat([font]));
-            } else {
-                return mathDefault(value, mode, options, classes, type);
-            }
-        }
-    } else {
-        return mathDefault(value, mode, options, classes, type);
-    }
-};
-
-/**
- * Calculate the height, depth, and maxFontSize of an element based on its
- * children.
- */
-var sizeElementFromChildren = function(elem) {
-    var height = 0;
-    var depth = 0;
-    var maxFontSize = 0;
-
-    if (elem.children) {
-        for (var i = 0; i < elem.children.length; i++) {
-            if (elem.children[i].height > height) {
-                height = elem.children[i].height;
-            }
-            if (elem.children[i].depth > depth) {
-                depth = elem.children[i].depth;
-            }
-            if (elem.children[i].maxFontSize > maxFontSize) {
-                maxFontSize = elem.children[i].maxFontSize;
-            }
-        }
-    }
-
-    elem.height = height;
-    elem.depth = depth;
-    elem.maxFontSize = maxFontSize;
-};
-
-/**
- * Makes a span with the given list of classes, list of children, and options.
- *
- * TODO: Ensure that `options` is always provided (currently some call sites
- * don't pass it).
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- */
-var makeSpan = function(classes, children, options) {
-    var span = new domTree.span(classes, children, options);
-
-    sizeElementFromChildren(span);
-
-    return span;
-};
-
-/**
- * Prepends the given children to the given span, updating height, depth, and
- * maxFontSize.
- */
-var prependChildren = function(span, children) {
-    span.children = children.concat(span.children);
-
-    sizeElementFromChildren(span);
-};
-
-/**
- * Makes a document fragment with the given list of children.
- */
-var makeFragment = function(children) {
-    var fragment = new domTree.documentFragment(children);
-
-    sizeElementFromChildren(fragment);
-
-    return fragment;
-};
-
-/**
- * Makes an element placed in each of the vlist elements to ensure that each
- * element has the same max font size. To do this, we create a zero-width space
- * with the correct font size.
- */
-var makeFontSizer = function(options, fontSize) {
-    var fontSizeInner = makeSpan([], [new domTree.symbolNode("\u200b")]);
-    fontSizeInner.style.fontSize =
-        (fontSize / options.style.sizeMultiplier) + "em";
-
-    var fontSizer = makeSpan(
-        ["fontsize-ensurer", "reset-" + options.size, "size5"],
-        [fontSizeInner]);
-
-    return fontSizer;
-};
-
-/**
- * Makes a vertical list by stacking elements and kerns on top of each other.
- * Allows for many different ways of specifying the positioning method.
- *
- * Arguments:
- *  - children: A list of child or kern nodes to be stacked on top of each other
- *              (i.e. the first element will be at the bottom, and the last at
- *              the top). Element nodes are specified as
- *                {type: "elem", elem: node}
- *              while kern nodes are specified as
- *                {type: "kern", size: size}
- *  - positionType: The method by which the vlist should be positioned. Valid
- *                  values are:
- *                   - "individualShift": The children list only contains elem
- *                                        nodes, and each node contains an extra
- *                                        "shift" value of how much it should be
- *                                        shifted (note that shifting is always
- *                                        moving downwards). positionData is
- *                                        ignored.
- *                   - "top": The positionData specifies the topmost point of
- *                            the vlist (note this is expected to be a height,
- *                            so positive values move up)
- *                   - "bottom": The positionData specifies the bottommost point
- *                               of the vlist (note this is expected to be a
- *                               depth, so positive values move down
- *                   - "shift": The vlist will be positioned such that its
- *                              baseline is positionData away from the baseline
- *                              of the first child. Positive values move
- *                              downwards.
- *                   - "firstBaseline": The vlist will be positioned such that
- *                                      its baseline is aligned with the
- *                                      baseline of the first child.
- *                                      positionData is ignored. (this is
- *                                      equivalent to "shift" with
- *                                      positionData=0)
- *  - positionData: Data used in different ways depending on positionType
- *  - options: An Options object
- *
- */
-var makeVList = function(children, positionType, positionData, options) {
-    var depth;
-    var currPos;
-    var i;
-    if (positionType === "individualShift") {
-        var oldChildren = children;
-        children = [oldChildren[0]];
-
-        // Add in kerns to the list of children to get each element to be
-        // shifted to the correct specified shift
-        depth = -oldChildren[0].shift - oldChildren[0].elem.depth;
-        currPos = depth;
-        for (i = 1; i < oldChildren.length; i++) {
-            var diff = -oldChildren[i].shift - currPos -
-                oldChildren[i].elem.depth;
-            var size = diff -
-                (oldChildren[i - 1].elem.height +
-                 oldChildren[i - 1].elem.depth);
-
-            currPos = currPos + diff;
-
-            children.push({type: "kern", size: size});
-            children.push(oldChildren[i]);
-        }
-    } else if (positionType === "top") {
-        // We always start at the bottom, so calculate the bottom by adding up
-        // all the sizes
-        var bottom = positionData;
-        for (i = 0; i < children.length; i++) {
-            if (children[i].type === "kern") {
-                bottom -= children[i].size;
-            } else {
-                bottom -= children[i].elem.height + children[i].elem.depth;
-            }
-        }
-        depth = bottom;
-    } else if (positionType === "bottom") {
-        depth = -positionData;
-    } else if (positionType === "shift") {
-        depth = -children[0].elem.depth - positionData;
-    } else if (positionType === "firstBaseline") {
-        depth = -children[0].elem.depth;
-    } else {
-        depth = 0;
-    }
-
-    // Make the fontSizer
-    var maxFontSize = 0;
-    for (i = 0; i < children.length; i++) {
-        if (children[i].type === "elem") {
-            maxFontSize = Math.max(maxFontSize, children[i].elem.maxFontSize);
-        }
-    }
-    var fontSizer = makeFontSizer(options, maxFontSize);
-
-    // Create a new list of actual children at the correct offsets
-    var realChildren = [];
-    currPos = depth;
-    for (i = 0; i < children.length; i++) {
-        if (children[i].type === "kern") {
-            currPos += children[i].size;
-        } else {
-            var child = children[i].elem;
-
-            var shift = -child.depth - currPos;
-            currPos += child.height + child.depth;
-
-            var childWrap = makeSpan([], [fontSizer, child]);
-            childWrap.height -= shift;
-            childWrap.depth += shift;
-            childWrap.style.top = shift + "em";
-
-            realChildren.push(childWrap);
-        }
-    }
-
-    // Add in an element at the end with no offset to fix the calculation of
-    // baselines in some browsers (namely IE, sometimes safari)
-    var baselineFix = makeSpan(
-        ["baseline-fix"], [fontSizer, new domTree.symbolNode("\u200b")]);
-    realChildren.push(baselineFix);
-
-    var vlist = makeSpan(["vlist"], realChildren);
-    // Fix the final height and depth, in case there were kerns at the ends
-    // since the makeSpan calculation won't take that in to account.
-    vlist.height = Math.max(currPos, vlist.height);
-    vlist.depth = Math.max(-depth, vlist.depth);
-    return vlist;
-};
-
-// A table of size -> font size for the different sizing functions
-var sizingMultiplier = {
-    size1: 0.5,
-    size2: 0.7,
-    size3: 0.8,
-    size4: 0.9,
-    size5: 1.0,
-    size6: 1.2,
-    size7: 1.44,
-    size8: 1.73,
-    size9: 2.07,
-    size10: 2.49
-};
-
-// A map of spacing functions to their attributes, like size and corresponding
-// CSS class
-var spacingFunctions = {
-    "\\qquad": {
-        size: "2em",
-        className: "qquad"
-    },
-    "\\quad": {
-        size: "1em",
-        className: "quad"
-    },
-    "\\enspace": {
-        size: "0.5em",
-        className: "enspace"
-    },
-    "\\;": {
-        size: "0.277778em",
-        className: "thickspace"
-    },
-    "\\:": {
-        size: "0.22222em",
-        className: "mediumspace"
-    },
-    "\\,": {
-        size: "0.16667em",
-        className: "thinspace"
-    },
-    "\\!": {
-        size: "-0.16667em",
-        className: "negativethinspace"
-    }
-};
-
-/**
- * Maps TeX font commands to objects containing:
- * - variant: string used for "mathvariant" attribute in buildMathML.js
- * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics
- */
-// A map between tex font commands an MathML mathvariant attribute values
-var fontMap = {
-    // styles
-    "mathbf": {
-        variant: "bold",
-        fontName: "Main-Bold"
-    },
-    "mathrm": {
-        variant: "normal",
-        fontName: "Main-Regular"
-    },
-    "textit": {
-        variant: "italic",
-        fontName: "Main-Italic"
-    },
-
-    // "mathit" is missing because it requires the use of two fonts: Main-Italic
-    // and Math-Italic.  This is handled by a special case in makeOrd which ends
-    // up calling mathit.
-
-    // families
-    "mathbb": {
-        variant: "double-struck",
-        fontName: "AMS-Regular"
-    },
-    "mathcal": {
-        variant: "script",
-        fontName: "Caligraphic-Regular"
-    },
-    "mathfrak": {
-        variant: "fraktur",
-        fontName: "Fraktur-Regular"
-    },
-    "mathscr": {
-        variant: "script",
-        fontName: "Script-Regular"
-    },
-    "mathsf": {
-        variant: "sans-serif",
-        fontName: "SansSerif-Regular"
-    },
-    "mathtt": {
-        variant: "monospace",
-        fontName: "Typewriter-Regular"
-    }
-};
-
-module.exports = {
-    fontMap: fontMap,
-    makeSymbol: makeSymbol,
-    mathsym: mathsym,
-    makeSpan: makeSpan,
-    makeFragment: makeFragment,
-    makeVList: makeVList,
-    makeOrd: makeOrd,
-    prependChildren: prependChildren,
-    sizingMultiplier: sizingMultiplier,
-    spacingFunctions: spacingFunctions
-};
-
-},{"./domTree":15,"./fontMetrics":17,"./symbols":23,"./utils":25}],11:[function(require,module,exports){
-/* eslint no-console:0 */
-/**
- * This file does the main work of building a domTree structure from a parse
- * tree. The entry point is the `buildHTML` function, which takes a parse tree.
- * Then, the buildExpression, buildGroup, and various groupTypes functions are
- * called, to produce a final HTML tree.
- */
-
-var ParseError = require("./ParseError");
-var Style = require("./Style");
-
-var buildCommon = require("./buildCommon");
-var delimiter = require("./delimiter");
-var domTree = require("./domTree");
-var fontMetrics = require("./fontMetrics");
-var utils = require("./utils");
-
-var makeSpan = buildCommon.makeSpan;
-
-var isSpace = function(node) {
-    return node instanceof domTree.span && node.classes[0] === "mspace";
-};
-
-// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)
-// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,
-// and the text before Rule 19.
-
-var isBin = function(node) {
-    return node && node.classes[0] === "mbin";
-};
-
-var isBinLeftCanceller = function(node, isRealGroup) {
-    // TODO: This code assumes that a node's math class is the first element
-    // of its `classes` array. A later cleanup should ensure this, for
-    // instance by changing the signature of `makeSpan`.
-    if (node) {
-        return utils.contains(["mbin", "mopen", "mrel", "mop", "mpunct"],
-                              node.classes[0]);
-    } else {
-        return isRealGroup;
-    }
-};
-
-var isBinRightCanceller = function(node, isRealGroup) {
-    if (node) {
-        return utils.contains(["mrel", "mclose", "mpunct"], node.classes[0]);
-    } else {
-        return isRealGroup;
-    }
-};
-
-/**
- * Take a list of nodes, build them in order, and return a list of the built
- * nodes. documentFragments are flattened into their contents, so the
- * returned list contains no fragments. `isRealGroup` is true if `expression`
- * is a real group (no atoms will be added on either side), as opposed to
- * a partial group (e.g. one created by \color).
- */
-var buildExpression = function(expression, options, isRealGroup) {
-    // Parse expressions into `groups`.
-    var groups = [];
-    for (var i = 0; i < expression.length; i++) {
-        var group = expression[i];
-        var output = buildGroup(group, options);
-        if (output instanceof domTree.documentFragment) {
-            Array.prototype.push.apply(groups, output.children);
-        } else {
-            groups.push(output);
-        }
-    }
-    // At this point `groups` consists entirely of `symbolNode`s and `span`s.
-
-    // Explicit spaces (e.g., \;, \,) should be ignored with respect to atom
-    // spacing (e.g., "add thick space between mord and mrel"). Since CSS
-    // adjacency rules implement atom spacing, spaces should be invisible to
-    // CSS. So we splice them out of `groups` and into the atoms themselves.
-    var spaces = null;
-    for (i = 0; i < groups.length; i++) {
-        if (isSpace(groups[i])) {
-            spaces = spaces || [];
-            spaces.push(groups[i]);
-            groups.splice(i, 1);
-            i--;
-        } else if (spaces) {
-            if (groups[i] instanceof domTree.symbolNode) {
-                groups[i] = makeSpan([].concat(groups[i].classes), [groups[i]]);
-            }
-            buildCommon.prependChildren(groups[i], spaces);
-            spaces = null;
-        }
-    }
-    if (spaces) {
-        Array.prototype.push.apply(groups, spaces);
-    }
-
-    // Binary operators change to ordinary symbols in some contexts.
-    for (i = 0; i < groups.length; i++) {
-        if (isBin(groups[i])
-            && (isBinLeftCanceller(groups[i - 1], isRealGroup)
-                || isBinRightCanceller(groups[i + 1], isRealGroup))) {
-            groups[i].classes[0] = "mord";
-        }
-    }
-
-    return groups;
-};
-
-// Return math atom class (mclass) of a domTree.
-var getTypeOfDomTree = function(node) {
-    if (node instanceof domTree.documentFragment) {
-        if (node.children.length) {
-            return getTypeOfDomTree(
-                node.children[node.children.length - 1]);
-        }
-    } else {
-        if (utils.contains(["mord", "mop", "mbin", "mrel", "mopen", "mclose",
-            "mpunct", "minner"], node.classes[0])) {
-            return node.classes[0];
-        }
-    }
-    return null;
-};
-
-/**
- * Sometimes, groups perform special rules when they have superscripts or
- * subscripts attached to them. This function lets the `supsub` group know that
- * its inner element should handle the superscripts and subscripts instead of
- * handling them itself.
- */
-var shouldHandleSupSub = function(group, options) {
-    if (!group) {
-        return false;
-    } else if (group.type === "op") {
-        // Operators handle supsubs differently when they have limits
-        // (e.g. `\displaystyle\sum_2^3`)
-        return group.value.limits &&
-            (options.style.size === Style.DISPLAY.size ||
-            group.value.alwaysHandleSupSub);
-    } else if (group.type === "accent") {
-        return isCharacterBox(group.value.base);
-    } else {
-        return null;
-    }
-};
-
-/**
- * Sometimes we want to pull out the innermost element of a group. In most
- * cases, this will just be the group itself, but when ordgroups and colors have
- * a single element, we want to pull that out.
- */
-var getBaseElem = function(group) {
-    if (!group) {
-        return false;
-    } else if (group.type === "ordgroup") {
-        if (group.value.length === 1) {
-            return getBaseElem(group.value[0]);
-        } else {
-            return group;
-        }
-    } else if (group.type === "color") {
-        if (group.value.value.length === 1) {
-            return getBaseElem(group.value.value[0]);
-        } else {
-            return group;
-        }
-    } else if (group.type === "font") {
-        return getBaseElem(group.value.body);
-    } else {
-        return group;
-    }
-};
-
-/**
- * TeXbook algorithms often reference "character boxes", which are simply groups
- * with a single character in them. To decide if something is a character box,
- * we find its innermost group, and see if it is a single character.
- */
-var isCharacterBox = function(group) {
-    var baseElem = getBaseElem(group);
-
-    // These are all they types of groups which hold single characters
-    return baseElem.type === "mathord" ||
-        baseElem.type === "textord" ||
-        baseElem.type === "bin" ||
-        baseElem.type === "rel" ||
-        baseElem.type === "inner" ||
-        baseElem.type === "open" ||
-        baseElem.type === "close" ||
-        baseElem.type === "punct";
-};
-
-var makeNullDelimiter = function(options, classes) {
-    return makeSpan(classes.concat([
-        "sizing", "reset-" + options.size, "size5",
-        options.style.reset(), Style.TEXT.cls(),
-        "nulldelimiter"]));
-};
-
-/**
- * This is a map of group types to the function used to handle that type.
- * Simpler types come at the beginning, while complicated types come afterwards.
- */
-var groupTypes = {};
-
-groupTypes.mathord = function(group, options) {
-    return buildCommon.makeOrd(group, options, "mathord");
-};
-
-groupTypes.textord = function(group, options) {
-    return buildCommon.makeOrd(group, options, "textord");
-};
-
-groupTypes.bin = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["mbin"]);
-};
-
-groupTypes.rel = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["mrel"]);
-};
-
-groupTypes.open = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["mopen"]);
-};
-
-groupTypes.close = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["mclose"]);
-};
-
-groupTypes.inner = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["minner"]);
-};
-
-groupTypes.punct = function(group, options) {
-    return buildCommon.mathsym(
-        group.value, group.mode, options, ["mpunct"]);
-};
-
-groupTypes.ordgroup = function(group, options) {
-    return makeSpan(
-        ["mord", options.style.cls()],
-        buildExpression(group.value, options.reset(), true),
-        options
-    );
-};
-
-groupTypes.text = function(group, options) {
-    var newOptions = options.withFont(group.value.style);
-    var inner = buildExpression(group.value.body, newOptions, true);
-    for (var i = 0; i < inner.length - 1; i++) {
-        if (inner[i].tryCombine(inner[i + 1])) {
-            inner.splice(i + 1, 1);
-            i--;
-        }
-    }
-    return makeSpan(["mord", "text", newOptions.style.cls()],
-        inner, newOptions);
-};
-
-groupTypes.color = function(group, options) {
-    var elements = buildExpression(
-        group.value.value,
-        options.withColor(group.value.color),
-        false
-    );
-
-    // \color isn't supposed to affect the type of the elements it contains.
-    // To accomplish this, we wrap the results in a fragment, so the inner
-    // elements will be able to directly interact with their neighbors. For
-    // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
-    return new buildCommon.makeFragment(elements);
-};
-
-groupTypes.supsub = function(group, options) {
-    // Superscript and subscripts are handled in the TeXbook on page
-    // 445-446, rules 18(a-f).
-
-    // Here is where we defer to the inner group if it should handle
-    // superscripts and subscripts itself.
-    if (shouldHandleSupSub(group.value.base, options)) {
-        return groupTypes[group.value.base.type](group, options);
-    }
-
-    var base = buildGroup(group.value.base, options.reset());
-    var supmid;
-    var submid;
-    var sup;
-    var sub;
-
-    var style = options.style;
-    var newOptions;
-
-    if (group.value.sup) {
-        newOptions = options.withStyle(style.sup());
-        sup = buildGroup(group.value.sup, newOptions);
-        supmid = makeSpan([style.reset(), style.sup().cls()],
-            [sup], newOptions);
-    }
-
-    if (group.value.sub) {
-        newOptions = options.withStyle(style.sub());
-        sub = buildGroup(group.value.sub, newOptions);
-        submid = makeSpan([style.reset(), style.sub().cls()],
-            [sub], newOptions);
-    }
-
-    // Rule 18a
-    var supShift;
-    var subShift;
-    if (isCharacterBox(group.value.base)) {
-        supShift = 0;
-        subShift = 0;
-    } else {
-        supShift = base.height - style.metrics.supDrop;
-        subShift = base.depth + style.metrics.subDrop;
-    }
-
-    // Rule 18c
-    var minSupShift;
-    if (style === Style.DISPLAY) {
-        minSupShift = style.metrics.sup1;
-    } else if (style.cramped) {
-        minSupShift = style.metrics.sup3;
-    } else {
-        minSupShift = style.metrics.sup2;
-    }
-
-    // scriptspace is a font-size-independent size, so scale it
-    // appropriately
-    var multiplier = Style.TEXT.sizeMultiplier *
-            style.sizeMultiplier;
-    var scriptspace =
-        (0.5 / fontMetrics.metrics.ptPerEm) / multiplier + "em";
-
-    var supsub;
-    if (!group.value.sup) {
-        // Rule 18b
-        subShift = Math.max(
-            subShift, style.metrics.sub1,
-            sub.height - 0.8 * style.metrics.xHeight);
-
-        supsub = buildCommon.makeVList([
-            {type: "elem", elem: submid}
-        ], "shift", subShift, options);
-
-        supsub.children[0].style.marginRight = scriptspace;
-
-        // Subscripts shouldn't be shifted by the base's italic correction.
-        // Account for that by shifting the subscript back the appropriate
-        // amount. Note we only do this when the base is a single symbol.
-        if (base instanceof domTree.symbolNode) {
-            supsub.children[0].style.marginLeft = -base.italic + "em";
-        }
-    } else if (!group.value.sub) {
-        // Rule 18c, d
-        supShift = Math.max(supShift, minSupShift,
-            sup.depth + 0.25 * style.metrics.xHeight);
-
-        supsub = buildCommon.makeVList([
-            {type: "elem", elem: supmid}
-        ], "shift", -supShift, options);
-
-        supsub.children[0].style.marginRight = scriptspace;
-    } else {
-        supShift = Math.max(
-            supShift, minSupShift, sup.depth + 0.25 * style.metrics.xHeight);
-        subShift = Math.max(subShift, style.metrics.sub2);
-
-        var ruleWidth = fontMetrics.metrics.defaultRuleThickness;
-
-        // Rule 18e
-        if ((supShift - sup.depth) - (sub.height - subShift) <
-                4 * ruleWidth) {
-            subShift = 4 * ruleWidth - (supShift - sup.depth) + sub.height;
-            var psi = 0.8 * style.metrics.xHeight - (supShift - sup.depth);
-            if (psi > 0) {
-                supShift += psi;
-                subShift -= psi;
-            }
-        }
-
-        supsub = buildCommon.makeVList([
-            {type: "elem", elem: submid, shift: subShift},
-            {type: "elem", elem: supmid, shift: -supShift}
-        ], "individualShift", null, options);
-
-        // See comment above about subscripts not being shifted
-        if (base instanceof domTree.symbolNode) {
-            supsub.children[0].style.marginLeft = -base.italic + "em";
-        }
-
-        supsub.children[0].style.marginRight = scriptspace;
-        supsub.children[1].style.marginRight = scriptspace;
-    }
-
-    // We ensure to wrap the supsub vlist in a span.msupsub to reset text-align
-    var mclass = getTypeOfDomTree(base) || "mord";
-    return makeSpan([mclass],
-        [base, makeSpan(["msupsub"], [supsub])],
-        options);
-};
-
-groupTypes.genfrac = function(group, options) {
-    // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).
-    // Figure out what style this fraction should be in based on the
-    // function used
-    var style = options.style;
-    if (group.value.size === "display") {
-        style = Style.DISPLAY;
-    } else if (group.value.size === "text") {
-        style = Style.TEXT;
-    }
-
-    var nstyle = style.fracNum();
-    var dstyle = style.fracDen();
-    var newOptions;
-
-    newOptions = options.withStyle(nstyle);
-    var numer = buildGroup(group.value.numer, newOptions);
-    var numerreset = makeSpan([style.reset(), nstyle.cls()],
-        [numer], newOptions);
-
-    newOptions = options.withStyle(dstyle);
-    var denom = buildGroup(group.value.denom, newOptions);
-    var denomreset = makeSpan([style.reset(), dstyle.cls()],
-        [denom], newOptions);
-
-    var ruleWidth;
-    if (group.value.hasBarLine) {
-        ruleWidth = fontMetrics.metrics.defaultRuleThickness /
-            options.style.sizeMultiplier;
-    } else {
-        ruleWidth = 0;
-    }
-
-    // Rule 15b
-    var numShift;
-    var clearance;
-    var denomShift;
-    if (style.size === Style.DISPLAY.size) {
-        numShift = style.metrics.num1;
-        if (ruleWidth > 0) {
-            clearance = 3 * ruleWidth;
-        } else {
-            clearance = 7 * fontMetrics.metrics.defaultRuleThickness;
-        }
-        denomShift = style.metrics.denom1;
-    } else {
-        if (ruleWidth > 0) {
-            numShift = style.metrics.num2;
-            clearance = ruleWidth;
-        } else {
-            numShift = style.metrics.num3;
-            clearance = 3 * fontMetrics.metrics.defaultRuleThickness;
-        }
-        denomShift = style.metrics.denom2;
-    }
-
-    var frac;
-    if (ruleWidth === 0) {
-        // Rule 15c
-        var candidateClearance =
-            (numShift - numer.depth) - (denom.height - denomShift);
-        if (candidateClearance < clearance) {
-            numShift += 0.5 * (clearance - candidateClearance);
-            denomShift += 0.5 * (clearance - candidateClearance);
-        }
-
-        frac = buildCommon.makeVList([
-            {type: "elem", elem: denomreset, shift: denomShift},
-            {type: "elem", elem: numerreset, shift: -numShift}
-        ], "individualShift", null, options);
-    } else {
-        // Rule 15d
-        var axisHeight = style.metrics.axisHeight;
-
-        if ((numShift - numer.depth) - (axisHeight + 0.5 * ruleWidth) <
-                clearance) {
-            numShift +=
-                clearance - ((numShift - numer.depth) -
-                             (axisHeight + 0.5 * ruleWidth));
-        }
-
-        if ((axisHeight - 0.5 * ruleWidth) - (denom.height - denomShift) <
-                clearance) {
-            denomShift +=
-                clearance - ((axisHeight - 0.5 * ruleWidth) -
-                             (denom.height - denomShift));
-        }
-
-        var mid = makeSpan(
-            [options.style.reset(), Style.TEXT.cls(), "frac-line"]);
-        // Manually set the height of the line because its height is
-        // created in CSS
-        mid.height = ruleWidth;
-
-        var midShift = -(axisHeight - 0.5 * ruleWidth);
-
-        frac = buildCommon.makeVList([
-            {type: "elem", elem: denomreset, shift: denomShift},
-            {type: "elem", elem: mid,        shift: midShift},
-            {type: "elem", elem: numerreset, shift: -numShift}
-        ], "individualShift", null, options);
-    }
-
-    // Since we manually change the style sometimes (with \dfrac or \tfrac),
-    // account for the possible size change here.
-    frac.height *= style.sizeMultiplier / options.style.sizeMultiplier;
-    frac.depth *= style.sizeMultiplier / options.style.sizeMultiplier;
-
-    // Rule 15e
-    var delimSize;
-    if (style.size === Style.DISPLAY.size) {
-        delimSize = style.metrics.delim1;
-    } else {
-        delimSize = style.metrics.delim2;
-    }
-
-    var leftDelim;
-    var rightDelim;
-    if (group.value.leftDelim == null) {
-        leftDelim = makeNullDelimiter(options, ["mopen"]);
-    } else {
-        leftDelim = delimiter.customSizedDelim(
-            group.value.leftDelim, delimSize, true,
-            options.withStyle(style), group.mode, ["mopen"]);
-    }
-    if (group.value.rightDelim == null) {
-        rightDelim = makeNullDelimiter(options, ["mclose"]);
-    } else {
-        rightDelim = delimiter.customSizedDelim(
-            group.value.rightDelim, delimSize, true,
-            options.withStyle(style), group.mode, ["mclose"]);
-    }
-
-    return makeSpan(
-        ["mord", options.style.reset(), style.cls()],
-        [leftDelim, makeSpan(["mfrac"], [frac]), rightDelim],
-        options);
-};
-
-var calculateSize = function(sizeValue, style) {
-    var x = sizeValue.number;
-    if (sizeValue.unit === "ex") {
-        x *= style.metrics.emPerEx;
-    } else if (sizeValue.unit === "mu") {
-        x /= 18;
-    }
-    return x;
-};
-
-groupTypes.array = function(group, options) {
-    var r;
-    var c;
-    var nr = group.value.body.length;
-    var nc = 0;
-    var body = new Array(nr);
-
-    var style = options.style;
-
-    // Horizontal spacing
-    var pt = 1 / fontMetrics.metrics.ptPerEm;
-    var arraycolsep = 5 * pt; // \arraycolsep in article.cls
-
-    // Vertical spacing
-    var baselineskip = 12 * pt; // see size10.clo
-    // Default \arraystretch from lttab.dtx
-    // TODO(gagern): may get redefined once we have user-defined macros
-    var arraystretch = utils.deflt(group.value.arraystretch, 1);
-    var arrayskip = arraystretch * baselineskip;
-    var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and
-    var arstrutDepth = 0.3 * arrayskip;  // \@arstrutbox in lttab.dtx
-
-    var totalHeight = 0;
-    for (r = 0; r < group.value.body.length; ++r) {
-        var inrow = group.value.body[r];
-        var height = arstrutHeight; // \@array adds an \@arstrut
-        var depth = arstrutDepth;   // to each tow (via the template)
-
-        if (nc < inrow.length) {
-            nc = inrow.length;
-        }
-
-        var outrow = new Array(inrow.length);
-        for (c = 0; c < inrow.length; ++c) {
-            var elt = buildGroup(inrow[c], options);
-            if (depth < elt.depth) {
-                depth = elt.depth;
-            }
-            if (height < elt.height) {
-                height = elt.height;
-            }
-            outrow[c] = elt;
-        }
-
-        var gap = 0;
-        if (group.value.rowGaps[r]) {
-            gap = calculateSize(group.value.rowGaps[r].value, style);
-            if (gap > 0) { // \@argarraycr
-                gap += arstrutDepth;
-                if (depth < gap) {
-                    depth = gap; // \@xargarraycr
-                }
-                gap = 0;
-            }
-        }
-
-        outrow.height = height;
-        outrow.depth = depth;
-        totalHeight += height;
-        outrow.pos = totalHeight;
-        totalHeight += depth + gap; // \@yargarraycr
-        body[r] = outrow;
-    }
-
-    var offset = totalHeight / 2 + style.metrics.axisHeight;
-    var colDescriptions = group.value.cols || [];
-    var cols = [];
-    var colSep;
-    var colDescrNum;
-    for (c = 0, colDescrNum = 0;
-         // Continue while either there are more columns or more column
-         // descriptions, so trailing separators don't get lost.
-         c < nc || colDescrNum < colDescriptions.length;
-         ++c, ++colDescrNum) {
-
-        var colDescr = colDescriptions[colDescrNum] || {};
-
-        var firstSeparator = true;
-        while (colDescr.type === "separator") {
-            // If there is more than one separator in a row, add a space
-            // between them.
-            if (!firstSeparator) {
-                colSep = makeSpan(["arraycolsep"], []);
-                colSep.style.width =
-                    fontMetrics.metrics.doubleRuleSep + "em";
-                cols.push(colSep);
-            }
-
-            if (colDescr.separator === "|") {
-                var separator = makeSpan(
-                    ["vertical-separator"],
-                    []);
-                separator.style.height = totalHeight + "em";
-                separator.style.verticalAlign =
-                    -(totalHeight - offset) + "em";
-
-                cols.push(separator);
-            } else {
-                throw new ParseError(
-                    "Invalid separator type: " + colDescr.separator);
-            }
-
-            colDescrNum++;
-            colDescr = colDescriptions[colDescrNum] || {};
-            firstSeparator = false;
-        }
-
-        if (c >= nc) {
-            continue;
-        }
-
-        var sepwidth;
-        if (c > 0 || group.value.hskipBeforeAndAfter) {
-            sepwidth = utils.deflt(colDescr.pregap, arraycolsep);
-            if (sepwidth !== 0) {
-                colSep = makeSpan(["arraycolsep"], []);
-                colSep.style.width = sepwidth + "em";
-                cols.push(colSep);
-            }
-        }
-
-        var col = [];
-        for (r = 0; r < nr; ++r) {
-            var row = body[r];
-            var elem = row[c];
-            if (!elem) {
-                continue;
-            }
-            var shift = row.pos - offset;
-            elem.depth = row.depth;
-            elem.height = row.height;
-            col.push({type: "elem", elem: elem, shift: shift});
-        }
-
-        col = buildCommon.makeVList(col, "individualShift", null, options);
-        col = makeSpan(
-            ["col-align-" + (colDescr.align || "c")],
-            [col]);
-        cols.push(col);
-
-        if (c < nc - 1 || group.value.hskipBeforeAndAfter) {
-            sepwidth = utils.deflt(colDescr.postgap, arraycolsep);
-            if (sepwidth !== 0) {
-                colSep = makeSpan(["arraycolsep"], []);
-                colSep.style.width = sepwidth + "em";
-                cols.push(colSep);
-            }
-        }
-    }
-    body = makeSpan(["mtable"], cols);
-    return makeSpan(["mord"], [body], options);
-};
-
-groupTypes.spacing = function(group, options) {
-    if (group.value === "\\ " || group.value === "\\space" ||
-        group.value === " " || group.value === "~") {
-        // Spaces are generated by adding an actual space. Each of these
-        // things has an entry in the symbols table, so these will be turned
-        // into appropriate outputs.
-        if (group.mode === "text") {
-            return buildCommon.makeOrd(group, options, "textord");
-        } else {
-            return makeSpan(["mspace"],
-                [buildCommon.mathsym(group.value, group.mode, options)],
-                options);
-        }
-    } else {
-        // Other kinds of spaces are of arbitrary width. We use CSS to
-        // generate these.
-        return makeSpan(
-            ["mspace",
-                buildCommon.spacingFunctions[group.value].className],
-            [], options);
-    }
-};
-
-groupTypes.llap = function(group, options) {
-    var inner = makeSpan(
-        ["inner"], [buildGroup(group.value.body, options.reset())]);
-    var fix = makeSpan(["fix"], []);
-    return makeSpan(
-        ["mord", "llap", options.style.cls()], [inner, fix], options);
-};
-
-groupTypes.rlap = function(group, options) {
-    var inner = makeSpan(
-        ["inner"], [buildGroup(group.value.body, options.reset())]);
-    var fix = makeSpan(["fix"], []);
-    return makeSpan(
-        ["mord", "rlap", options.style.cls()], [inner, fix], options);
-};
-
-groupTypes.op = function(group, options) {
-    // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
-    var supGroup;
-    var subGroup;
-    var hasLimits = false;
-    if (group.type === "supsub") {
-        // If we have limits, supsub will pass us its group to handle. Pull
-        // out the superscript and subscript and set the group to the op in
-        // its base.
-        supGroup = group.value.sup;
-        subGroup = group.value.sub;
-        group = group.value.base;
-        hasLimits = true;
-    }
-
-    var style = options.style;
-
-    // Most operators have a large successor symbol, but these don't.
-    var noSuccessor = [
-        "\\smallint"
-    ];
-
-    var large = false;
-    if (style.size === Style.DISPLAY.size &&
-        group.value.symbol &&
-        !utils.contains(noSuccessor, group.value.body)) {
-
-        // Most symbol operators get larger in displaystyle (rule 13)
-        large = true;
-    }
-
-    var base;
-    var baseShift = 0;
-    var slant = 0;
-    if (group.value.symbol) {
-        // If this is a symbol, create the symbol.
-        var fontName = large ? "Size2-Regular" : "Size1-Regular";
-        base = buildCommon.makeSymbol(
-            group.value.body, fontName, "math", options,
-            ["mop", "op-symbol", large ? "large-op" : "small-op"]);
-
-        // Shift the symbol so its center lies on the axis (rule 13). It
-        // appears that our fonts have the centers of the symbols already
-        // almost on the axis, so these numbers are very small. Note we
-        // don't actually apply this here, but instead it is used either in
-        // the vlist creation or separately when there are no limits.
-        baseShift = (base.height - base.depth) / 2 -
-            style.metrics.axisHeight * style.sizeMultiplier;
-
-        // The slant of the symbol is just its italic correction.
-        slant = base.italic;
-    } else if (group.value.value) {
-        // If this is a list, compose that list.
-        var inner = buildExpression(group.value.value, options, true);
-
-        base = makeSpan(["mop"], inner, options);
-    } else {
-        // Otherwise, this is a text operator. Build the text from the
-        // operator's name.
-        // TODO(emily): Add a space in the middle of some of these
-        // operators, like \limsup
-        var output = [];
-        for (var i = 1; i < group.value.body.length; i++) {
-            output.push(buildCommon.mathsym(group.value.body[i], group.mode));
-        }
-        base = makeSpan(["mop"], output, options);
-    }
-
-    if (hasLimits) {
-        // IE 8 clips \int if it is in a display: inline-block. We wrap it
-        // in a new span so it is an inline, and works.
-        base = makeSpan([], [base]);
-
-        var supmid;
-        var supKern;
-        var submid;
-        var subKern;
-        var newOptions;
-        // We manually have to handle the superscripts and subscripts. This,
-        // aside from the kern calculations, is copied from supsub.
-        if (supGroup) {
-            newOptions = options.withStyle(style.sup());
-            var sup = buildGroup(supGroup, newOptions);
-            supmid = makeSpan([style.reset(), style.sup().cls()],
-                [sup], newOptions);
-
-            supKern = Math.max(
-                fontMetrics.metrics.bigOpSpacing1,
-                fontMetrics.metrics.bigOpSpacing3 - sup.depth);
-        }
-
-        if (subGroup) {
-            newOptions = options.withStyle(style.sub());
-            var sub = buildGroup(subGroup, newOptions);
-            submid = makeSpan([style.reset(), style.sub().cls()],
-                [sub], newOptions);
-
-            subKern = Math.max(
-                fontMetrics.metrics.bigOpSpacing2,
-                fontMetrics.metrics.bigOpSpacing4 - sub.height);
-        }
-
-        // Build the final group as a vlist of the possible subscript, base,
-        // and possible superscript.
-        var finalGroup;
-        var top;
-        var bottom;
-        if (!supGroup) {
-            top = base.height - baseShift;
-
-            finalGroup = buildCommon.makeVList([
-                {type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
-                {type: "elem", elem: submid},
-                {type: "kern", size: subKern},
-                {type: "elem", elem: base}
-            ], "top", top, options);
-
-            // Here, we shift the limits by the slant of the symbol. Note
-            // that we are supposed to shift the limits by 1/2 of the slant,
-            // but since we are centering the limits adding a full slant of
-            // margin will shift by 1/2 that.
-            finalGroup.children[0].style.marginLeft = -slant + "em";
-        } else if (!subGroup) {
-            bottom = base.depth + baseShift;
-
-            finalGroup = buildCommon.makeVList([
-                {type: "elem", elem: base},
-                {type: "kern", size: supKern},
-                {type: "elem", elem: supmid},
-                {type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
-            ], "bottom", bottom, options);
-
-            // See comment above about slants
-            finalGroup.children[1].style.marginLeft = slant + "em";
-        } else if (!supGroup && !subGroup) {
-            // This case probably shouldn't occur (this would mean the
-            // supsub was sending us a group with no superscript or
-            // subscript) but be safe.
-            return base;
-        } else {
-            bottom = fontMetrics.metrics.bigOpSpacing5 +
-                submid.height + submid.depth +
-                subKern +
-                base.depth + baseShift;
-
-            finalGroup = buildCommon.makeVList([
-                {type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
-                {type: "elem", elem: submid},
-                {type: "kern", size: subKern},
-                {type: "elem", elem: base},
-                {type: "kern", size: supKern},
-                {type: "elem", elem: supmid},
-                {type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
-            ], "bottom", bottom, options);
-
-            // See comment above about slants
-            finalGroup.children[0].style.marginLeft = -slant + "em";
-            finalGroup.children[2].style.marginLeft = slant + "em";
-        }
-
-        return makeSpan(["mop", "op-limits"], [finalGroup], options);
-    } else {
-        if (group.value.symbol) {
-            base.style.top = baseShift + "em";
-        }
-
-        return base;
-    }
-};
-
-groupTypes.mod = function(group, options) {
-    var inner = [];
-
-    if (group.value.modType === "bmod") {
-        // “\nonscript\mskip-\medmuskip\mkern5mu”
-        if (!options.style.isTight()) {
-            inner.push(makeSpan(
-                ["mspace", "negativemediumspace"], [], options));
-        }
-        inner.push(makeSpan(["mspace", "thickspace"], [], options));
-    } else if (options.style.size === Style.DISPLAY.size) {
-        inner.push(makeSpan(["mspace", "quad"], [], options));
-    } else if (group.value.modType === "mod") {
-        inner.push(makeSpan(["mspace", "twelvemuspace"], [], options));
-    } else {
-        inner.push(makeSpan(["mspace", "eightmuspace"], [], options));
-    }
-
-    if (group.value.modType === "pod" || group.value.modType === "pmod") {
-        inner.push(buildCommon.mathsym("(", group.mode));
-    }
-
-    if (group.value.modType !== "pod") {
-        var modInner = [
-            buildCommon.mathsym("m", group.mode),
-            buildCommon.mathsym("o", group.mode),
-            buildCommon.mathsym("d", group.mode)];
-        if (group.value.modType === "bmod") {
-            inner.push(makeSpan(["mbin"], modInner, options));
-            // “\mkern5mu\nonscript\mskip-\medmuskip”
-            inner.push(makeSpan(["mspace", "thickspace"], [], options));
-            if (!options.style.isTight()) {
-                inner.push(makeSpan(
-                    ["mspace", "negativemediumspace"], [], options));
-            }
-        } else {
-            Array.prototype.push.apply(inner, modInner);
-            inner.push(makeSpan(["mspace", "sixmuspace"], [], options));
-        }
-    }
-
-    if (group.value.value) {
-        Array.prototype.push.apply(inner,
-            buildExpression(group.value.value, options, false));
-    }
-
-    if (group.value.modType === "pod" || group.value.modType === "pmod") {
-        inner.push(buildCommon.mathsym(")", group.mode));
-    }
-
-    return buildCommon.makeFragment(inner);
-};
-
-groupTypes.katex = function(group, options) {
-    // The KaTeX logo. The offsets for the K and a were chosen to look
-    // good, but the offsets for the T, E, and X were taken from the
-    // definition of \TeX in TeX (see TeXbook pg. 356)
-    var k = makeSpan(
-        ["k"], [buildCommon.mathsym("K", group.mode)], options);
-    var a = makeSpan(
-        ["a"], [buildCommon.mathsym("A", group.mode)], options);
-
-    a.height = (a.height + 0.2) * 0.75;
-    a.depth = (a.height - 0.2) * 0.75;
-
-    var t = makeSpan(
-        ["t"], [buildCommon.mathsym("T", group.mode)], options);
-    var e = makeSpan(
-        ["e"], [buildCommon.mathsym("E", group.mode)], options);
-
-    e.height = (e.height - 0.2155);
-    e.depth = (e.depth + 0.2155);
-
-    var x = makeSpan(
-        ["x"], [buildCommon.mathsym("X", group.mode)], options);
-
-    return makeSpan(
-        ["mord", "katex-logo"], [k, a, t, e, x], options);
-};
-
-groupTypes.overline = function(group, options) {
-    // Overlines are handled in the TeXbook pg 443, Rule 9.
-    var style = options.style;
-
-    // Build the inner group in the cramped style.
-    var innerGroup = buildGroup(group.value.body,
-            options.withStyle(style.cramp()));
-
-    var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
-        style.sizeMultiplier;
-
-    // Create the line above the body
-    var line = makeSpan(
-        [style.reset(), Style.TEXT.cls(), "overline-line"]);
-    line.height = ruleWidth;
-    line.maxFontSize = 1.0;
-
-    // Generate the vlist, with the appropriate kerns
-    var vlist = buildCommon.makeVList([
-        {type: "elem", elem: innerGroup},
-        {type: "kern", size: 3 * ruleWidth},
-        {type: "elem", elem: line},
-        {type: "kern", size: ruleWidth}
-    ], "firstBaseline", null, options);
-
-    return makeSpan(["mord", "overline"], [vlist], options);
-};
-
-groupTypes.underline = function(group, options) {
-    // Underlines are handled in the TeXbook pg 443, Rule 10.
-    var style = options.style;
-
-    // Build the inner group.
-    var innerGroup = buildGroup(group.value.body, options);
-
-    var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
-        style.sizeMultiplier;
-
-    // Create the line above the body
-    var line = makeSpan([style.reset(), Style.TEXT.cls(), "underline-line"]);
-    line.height = ruleWidth;
-    line.maxFontSize = 1.0;
-
-    // Generate the vlist, with the appropriate kerns
-    var vlist = buildCommon.makeVList([
-        {type: "kern", size: ruleWidth},
-        {type: "elem", elem: line},
-        {type: "kern", size: 3 * ruleWidth},
-        {type: "elem", elem: innerGroup}
-    ], "top", innerGroup.height, options);
-
-    return makeSpan(["mord", "underline"], [vlist], options);
-};
-
-groupTypes.sqrt = function(group, options) {
-    // Square roots are handled in the TeXbook pg. 443, Rule 11.
-    var style = options.style;
-
-    // First, we do the same steps as in overline to build the inner group
-    // and line
-    var inner = buildGroup(group.value.body, options.withStyle(style.cramp()));
-
-    var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
-        style.sizeMultiplier;
-
-    var line = makeSpan(
-        [style.reset(), Style.TEXT.cls(), "sqrt-line"], [],
-        options);
-    line.height = ruleWidth;
-    line.maxFontSize = 1.0;
-
-    var phi = ruleWidth;
-    if (style.id < Style.TEXT.id) {
-        phi = style.metrics.xHeight;
-    }
-
-    // Calculate the clearance between the body and line
-    var lineClearance = ruleWidth + phi / 4;
-
-    var innerHeight = (inner.height + inner.depth) * style.sizeMultiplier;
-    var minDelimiterHeight = innerHeight + lineClearance + ruleWidth;
-
-    // Create a \surd delimiter of the required minimum size
-    var delim = makeSpan(["sqrt-sign"], [
-        delimiter.customSizedDelim("\\surd", minDelimiterHeight,
-                                   false, options, group.mode)],
-                         options);
-
-    var delimDepth = (delim.height + delim.depth) - ruleWidth;
-
-    // Adjust the clearance based on the delimiter size
-    if (delimDepth > inner.height + inner.depth + lineClearance) {
-        lineClearance =
-            (lineClearance + delimDepth - inner.height - inner.depth) / 2;
-    }
-
-    // Shift the delimiter so that its top lines up with the top of the line
-    var delimShift = -(inner.height + lineClearance + ruleWidth) + delim.height;
-    delim.style.top = delimShift + "em";
-    delim.height -= delimShift;
-    delim.depth += delimShift;
-
-    // We add a special case here, because even when `inner` is empty, we
-    // still get a line. So, we use a simple heuristic to decide if we
-    // should omit the body entirely. (note this doesn't work for something
-    // like `\sqrt{\rlap{x}}`, but if someone is doing that they deserve for
-    // it not to work.
-    var body;
-    if (inner.height === 0 && inner.depth === 0) {
-        body = makeSpan();
-    } else {
-        body = buildCommon.makeVList([
-            {type: "elem", elem: inner},
-            {type: "kern", size: lineClearance},
-            {type: "elem", elem: line},
-            {type: "kern", size: ruleWidth}
-        ], "firstBaseline", null, options);
-    }
-
-    if (!group.value.index) {
-        return makeSpan(["mord", "sqrt"], [delim, body], options);
-    } else {
-        // Handle the optional root index
-
-        // The index is always in scriptscript style
-        var newOptions = options.withStyle(Style.SCRIPTSCRIPT);
-        var root = buildGroup(group.value.index, newOptions);
-        var rootWrap = makeSpan(
-            [style.reset(), Style.SCRIPTSCRIPT.cls()],
-            [root],
-            newOptions);
-
-        // Figure out the height and depth of the inner part
-        var innerRootHeight = Math.max(delim.height, body.height);
-        var innerRootDepth = Math.max(delim.depth, body.depth);
-
-        // The amount the index is shifted by. This is taken from the TeX
-        // source, in the definition of `\r@@t`.
-        var toShift = 0.6 * (innerRootHeight - innerRootDepth);
-
-        // Build a VList with the superscript shifted up correctly
-        var rootVList = buildCommon.makeVList(
-            [{type: "elem", elem: rootWrap}],
-            "shift", -toShift, options);
-        // Add a class surrounding it so we can add on the appropriate
-        // kerning
-        var rootVListWrap = makeSpan(["root"], [rootVList]);
-
-        return makeSpan(["mord", "sqrt"],
-            [rootVListWrap, delim, body], options);
-    }
-};
-
-groupTypes.sizing = function(group, options) {
-    // Handle sizing operators like \Huge. Real TeX doesn't actually allow
-    // these functions inside of math expressions, so we do some special
-    // handling.
-    var inner = buildExpression(group.value.value,
-            options.withSize(group.value.size), false);
-
-    // Compute the correct maxFontSize.
-    var style = options.style;
-    var fontSize = buildCommon.sizingMultiplier[group.value.size];
-    fontSize = fontSize * style.sizeMultiplier;
-
-    // Add size-resetting classes to the inner list and set maxFontSize
-    // manually. Handle nested size changes.
-    for (var i = 0; i < inner.length; i++) {
-        var pos = utils.indexOf(inner[i].classes, "sizing");
-        if (pos < 0) {
-            inner[i].classes.push("sizing", "reset-" + options.size,
-                                  group.value.size, style.cls());
-            inner[i].maxFontSize = fontSize;
-        } else if (inner[i].classes[pos + 1] === "reset-" + group.value.size) {
-            // This is a nested size change: e.g., inner[i] is the "b" in
-            // `\Huge a \small b`. Override the old size (the `reset-` class)
-            // but not the new size.
-            inner[i].classes[pos + 1] = "reset-" + options.size;
-        }
-    }
-
-    return buildCommon.makeFragment(inner);
-};
-
-groupTypes.styling = function(group, options) {
-    // Style changes are handled in the TeXbook on pg. 442, Rule 3.
-
-    // Figure out what style we're changing to.
-    var styleMap = {
-        "display": Style.DISPLAY,
-        "text": Style.TEXT,
-        "script": Style.SCRIPT,
-        "scriptscript": Style.SCRIPTSCRIPT
-    };
-
-    var newStyle = styleMap[group.value.style];
-    var newOptions = options.withStyle(newStyle);
-
-    // Build the inner expression in the new style.
-    var inner = buildExpression(
-        group.value.value, newOptions, false);
-
-    // Add style-resetting classes to the inner list. Handle nested changes.
-    for (var i = 0; i < inner.length; i++) {
-        var pos = utils.indexOf(inner[i].classes, newStyle.reset());
-        if (pos < 0) {
-            inner[i].classes.push(options.style.reset(), newStyle.cls());
-        } else {
-            // This is a nested style change, as `\textstyle a\scriptstyle b`.
-            // Only override the old style (the reset class).
-            inner[i].classes[pos] = options.style.reset();
-        }
-    }
-
-    return new buildCommon.makeFragment(inner);
-};
-
-groupTypes.font = function(group, options) {
-    var font = group.value.font;
-    return buildGroup(group.value.body, options.withFont(font));
-};
-
-groupTypes.delimsizing = function(group, options) {
-    var delim = group.value.value;
-
-    if (delim === ".") {
-        // Empty delimiters still count as elements, even though they don't
-        // show anything.
-        return makeSpan([group.value.mclass]);
-    }
-
-    // Use delimiter.sizedDelim to generate the delimiter.
-    return delimiter.sizedDelim(
-            delim, group.value.size, options, group.mode,
-            [group.value.mclass]);
-};
-
-groupTypes.leftright = function(group, options) {
-    // Build the inner expression
-    var inner = buildExpression(group.value.body, options.reset(), true);
-
-    var innerHeight = 0;
-    var innerDepth = 0;
-    var hadMiddle = false;
-
-    // Calculate its height and depth
-    for (var i = 0; i < inner.length; i++) {
-        if (inner[i].isMiddle) {
-            hadMiddle = true;
-        } else {
-            innerHeight = Math.max(inner[i].height, innerHeight);
-            innerDepth = Math.max(inner[i].depth, innerDepth);
-        }
-    }
-
-    var style = options.style;
-
-    // The size of delimiters is the same, regardless of what style we are
-    // in. Thus, to correctly calculate the size of delimiter we need around
-    // a group, we scale down the inner size based on the size.
-    innerHeight *= style.sizeMultiplier;
-    innerDepth *= style.sizeMultiplier;
-
-    var leftDelim;
-    if (group.value.left === ".") {
-        // Empty delimiters in \left and \right make null delimiter spaces.
-        leftDelim = makeNullDelimiter(options, ["mopen"]);
-    } else {
-        // Otherwise, use leftRightDelim to generate the correct sized
-        // delimiter.
-        leftDelim = delimiter.leftRightDelim(
-            group.value.left, innerHeight, innerDepth, options,
-            group.mode, ["mopen"]);
-    }
-    // Add it to the beginning of the expression
-    inner.unshift(leftDelim);
-
-    // Handle middle delimiters
-    if (hadMiddle) {
-        for (i = 1; i < inner.length; i++) {
-            if (inner[i].isMiddle) {
-                // Apply the options that were active when \middle was called
-                inner[i] = delimiter.leftRightDelim(
-                    inner[i].isMiddle.value, innerHeight, innerDepth,
-                    inner[i].isMiddle.options, group.mode, []);
-            }
-        }
-    }
-
-    var rightDelim;
-    // Same for the right delimiter
-    if (group.value.right === ".") {
-        rightDelim = makeNullDelimiter(options, ["mclose"]);
-    } else {
-        rightDelim = delimiter.leftRightDelim(
-            group.value.right, innerHeight, innerDepth, options,
-            group.mode, ["mclose"]);
-    }
-    // Add it to the end of the expression.
-    inner.push(rightDelim);
-
-    return makeSpan(
-        ["minner", style.cls()], inner, options);
-};
-
-groupTypes.middle = function(group, options) {
-    var middleDelim;
-    if (group.value.value === ".") {
-        middleDelim = makeNullDelimiter(options, []);
-    } else {
-        middleDelim = delimiter.sizedDelim(
-            group.value.value, 1, options,
-            group.mode, []);
-        middleDelim.isMiddle = {value: group.value.value, options: options};
-    }
-    return middleDelim;
-};
-
-groupTypes.rule = function(group, options) {
-    // Make an empty span for the rule
-    var rule = makeSpan(["mord", "rule"], [], options);
-    var style = options.style;
-
-    // Calculate the shift, width, and height of the rule, and account for units
-    var shift = 0;
-    if (group.value.shift) {
-        shift = calculateSize(group.value.shift, style);
-    }
-
-    var width = calculateSize(group.value.width, style);
-    var height = calculateSize(group.value.height, style);
-
-    // The sizes of rules are absolute, so make it larger if we are in a
-    // smaller style.
-    shift /= style.sizeMultiplier;
-    width /= style.sizeMultiplier;
-    height /= style.sizeMultiplier;
-
-    // Style the rule to the right size
-    rule.style.borderRightWidth = width + "em";
-    rule.style.borderTopWidth = height + "em";
-    rule.style.bottom = shift + "em";
-
-    // Record the height and width
-    rule.width = width;
-    rule.height = height + shift;
-    rule.depth = -shift;
-
-    return rule;
-};
-
-groupTypes.kern = function(group, options) {
-    // Make an empty span for the rule
-    var rule = makeSpan(["mord", "rule"], [], options);
-    var style = options.style;
-
-    var dimension = 0;
-    if (group.value.dimension) {
-        dimension = calculateSize(group.value.dimension, style);
-    }
-
-    dimension /= style.sizeMultiplier;
-
-    rule.style.marginLeft = dimension + "em";
-
-    return rule;
-};
-
-groupTypes.accent = function(group, options) {
-    // Accents are handled in the TeXbook pg. 443, rule 12.
-    var base = group.value.base;
-    var style = options.style;
-
-    var supsubGroup;
-    if (group.type === "supsub") {
-        // If our base is a character box, and we have superscripts and
-        // subscripts, the supsub will defer to us. In particular, we want
-        // to attach the superscripts and subscripts to the inner body (so
-        // that the position of the superscripts and subscripts won't be
-        // affected by the height of the accent). We accomplish this by
-        // sticking the base of the accent into the base of the supsub, and
-        // rendering that, while keeping track of where the accent is.
-
-        // The supsub group is the group that was passed in
-        var supsub = group;
-        // The real accent group is the base of the supsub group
-        group = supsub.value.base;
-        // The character box is the base of the accent group
-        base = group.value.base;
-        // Stick the character box into the base of the supsub group
-        supsub.value.base = base;
-
-        // Rerender the supsub group with its new base, and store that
-        // result.
-        supsubGroup = buildGroup(
-            supsub, options.reset());
-    }
-
-    // Build the base group
-    var body = buildGroup(
-        base, options.withStyle(style.cramp()));
-
-    // Calculate the skew of the accent. This is based on the line "If the
-    // nucleus is not a single character, let s = 0; otherwise set s to the
-    // kern amount for the nucleus followed by the \skewchar of its font."
-    // Note that our skew metrics are just the kern between each character
-    // and the skewchar.
-    var skew;
-    if (isCharacterBox(base)) {
-        // If the base is a character box, then we want the skew of the
-        // innermost character. To do that, we find the innermost character:
-        var baseChar = getBaseElem(base);
-        // Then, we render its group to get the symbol inside it
-        var baseGroup = buildGroup(
-            baseChar, options.withStyle(style.cramp()));
-        // Finally, we pull the skew off of the symbol.
-        skew = baseGroup.skew;
-        // Note that we now throw away baseGroup, because the layers we
-        // removed with getBaseElem might contain things like \color which
-        // we can't get rid of.
-        // TODO(emily): Find a better way to get the skew
-    } else {
-        skew = 0;
-    }
-
-    // calculate the amount of space between the body and the accent
-    var clearance = Math.min(
-        body.height,
-        style.metrics.xHeight);
-
-    // Build the accent
-    var accent = buildCommon.makeSymbol(
-        group.value.accent, "Main-Regular", "math", options);
-    // Remove the italic correction of the accent, because it only serves to
-    // shift the accent over to a place we don't want.
-    accent.italic = 0;
-
-    // The \vec character that the fonts use is a combining character, and
-    // thus shows up much too far to the left. To account for this, we add a
-    // specific class which shifts the accent over to where we want it.
-    // TODO(emily): Fix this in a better way, like by changing the font
-    var vecClass = group.value.accent === "\\vec" ? "accent-vec" : null;
-
-    var accentBody = makeSpan(["accent-body", vecClass], [
-        makeSpan([], [accent])]);
-
-    accentBody = buildCommon.makeVList([
-        {type: "elem", elem: body},
-        {type: "kern", size: -clearance},
-        {type: "elem", elem: accentBody}
-    ], "firstBaseline", null, options);
-
-    // Shift the accent over by the skew. Note we shift by twice the skew
-    // because we are centering the accent, so by adding 2*skew to the left,
-    // we shift it to the right by 1*skew.
-    accentBody.children[1].style.marginLeft = 2 * skew + "em";
-
-    var accentWrap = makeSpan(["mord", "accent"], [accentBody], options);
-
-    if (supsubGroup) {
-        // Here, we replace the "base" child of the supsub with our newly
-        // generated accent.
-        supsubGroup.children[0] = accentWrap;
-
-        // Since we don't rerun the height calculation after replacing the
-        // accent, we manually recalculate height.
-        supsubGroup.height = Math.max(accentWrap.height, supsubGroup.height);
-
-        // Accents should always be ords, even when their innards are not.
-        supsubGroup.classes[0] = "mord";
-
-        return supsubGroup;
-    } else {
-        return accentWrap;
-    }
-};
-
-groupTypes.phantom = function(group, options) {
-    var elements = buildExpression(
-        group.value.value,
-        options.withPhantom(),
-        false
-    );
-
-    // \phantom isn't supposed to affect the elements it contains.
-    // See "color" for more details.
-    return new buildCommon.makeFragment(elements);
-};
-
-groupTypes.mclass = function(group, options) {
-    var elements = buildExpression(group.value.value, options, true);
-
-    return makeSpan([group.value.mclass], elements, options);
-};
-
-/**
- * buildGroup is the function that takes a group and calls the correct groupType
- * function for it. It also handles the interaction of size and style changes
- * between parents and children.
- */
-var buildGroup = function(group, options) {
-    if (!group) {
-        return makeSpan();
-    }
-
-    if (groupTypes[group.type]) {
-        // Call the groupTypes function
-        var groupNode = groupTypes[group.type](group, options);
-        var multiplier;
-
-        // If the style changed between the parent and the current group,
-        // account for the size difference
-        if (options.style !== options.parentStyle) {
-            multiplier = options.style.sizeMultiplier /
-                    options.parentStyle.sizeMultiplier;
-
-            groupNode.height *= multiplier;
-            groupNode.depth *= multiplier;
-        }
-
-        // If the size changed between the parent and the current group, account
-        // for that size difference.
-        if (options.size !== options.parentSize) {
-            multiplier = buildCommon.sizingMultiplier[options.size] /
-                    buildCommon.sizingMultiplier[options.parentSize];
-
-            groupNode.height *= multiplier;
-            groupNode.depth *= multiplier;
-        }
-
-        return groupNode;
-    } else {
-        throw new ParseError(
-            "Got group of unknown type: '" + group.type + "'");
-    }
-};
-
-/**
- * Take an entire parse tree, and build it into an appropriate set of HTML
- * nodes.
- */
-var buildHTML = function(tree, options) {
-    // buildExpression is destructive, so we need to make a clone
-    // of the incoming tree so that it isn't accidentally changed
-    tree = JSON.parse(JSON.stringify(tree));
-
-    // Build the expression contained in the tree
-    var expression = buildExpression(tree, options, true);
-    var body = makeSpan(["base", options.style.cls()], expression, options);
-
-    // Add struts, which ensure that the top of the HTML element falls at the
-    // height of the expression, and the bottom of the HTML element falls at the
-    // depth of the expression.
-    var topStrut = makeSpan(["strut"]);
-    var bottomStrut = makeSpan(["strut", "bottom"]);
-
-    topStrut.style.height = body.height + "em";
-    bottomStrut.style.height = (body.height + body.depth) + "em";
-    // We'd like to use `vertical-align: top` but in IE 9 this lowers the
-    // baseline of the box to the bottom of this strut (instead staying in the
-    // normal place) so we use an absolute value for vertical-align instead
-    bottomStrut.style.verticalAlign = -body.depth + "em";
-
-    // Wrap the struts and body together
-    var htmlNode = makeSpan(["katex-html"], [topStrut, bottomStrut, body]);
-
-    htmlNode.setAttribute("aria-hidden", "true");
-
-    return htmlNode;
-};
-
-module.exports = buildHTML;
-
-},{"./ParseError":6,"./Style":9,"./buildCommon":10,"./delimiter":14,"./domTree":15,"./fontMetrics":17,"./utils":25}],12:[function(require,module,exports){
-/**
- * This file converts a parse tree into a cooresponding MathML tree. The main
- * entry point is the `buildMathML` function, which takes a parse tree from the
- * parser.
- */
-
-var buildCommon = require("./buildCommon");
-var fontMetrics = require("./fontMetrics");
-var mathMLTree = require("./mathMLTree");
-var ParseError = require("./ParseError");
-var symbols = require("./symbols");
-var utils = require("./utils");
-
-var makeSpan = buildCommon.makeSpan;
-var fontMap = buildCommon.fontMap;
-
-/**
- * Takes a symbol and converts it into a MathML text node after performing
- * optional replacement from symbols.js.
- */
-var makeText = function(text, mode) {
-    if (symbols[mode][text] && symbols[mode][text].replace) {
-        text = symbols[mode][text].replace;
-    }
-
-    return new mathMLTree.TextNode(text);
-};
-
-/**
- * Returns the math variant as a string or null if none is required.
- */
-var getVariant = function(group, options) {
-    var font = options.font;
-    if (!font) {
-        return null;
-    }
-
-    var mode = group.mode;
-    if (font === "mathit") {
-        return "italic";
-    }
-
-    var value = group.value;
-    if (utils.contains(["\\imath", "\\jmath"], value)) {
-        return null;
-    }
-
-    if (symbols[mode][value] && symbols[mode][value].replace) {
-        value = symbols[mode][value].replace;
-    }
-
-    var fontName = fontMap[font].fontName;
-    if (fontMetrics.getCharacterMetrics(value, fontName)) {
-        return fontMap[options.font].variant;
-    }
-
-    return null;
-};
-
-/**
- * Functions for handling the different types of groups found in the parse
- * tree. Each function should take a parse group and return a MathML node.
- */
-var groupTypes = {};
-
-groupTypes.mathord = function(group, options) {
-    var node = new mathMLTree.MathNode(
-        "mi",
-        [makeText(group.value, group.mode)]);
-
-    var variant = getVariant(group, options);
-    if (variant) {
-        node.setAttribute("mathvariant", variant);
-    }
-    return node;
-};
-
-groupTypes.textord = function(group, options) {
-    var text = makeText(group.value, group.mode);
-
-    var variant = getVariant(group, options) || "normal";
-
-    var node;
-    if (/[0-9]/.test(group.value)) {
-        // TODO(kevinb) merge adjacent <mn> nodes
-        // do it as a post processing step
-        node = new mathMLTree.MathNode("mn", [text]);
-        if (options.font) {
-            node.setAttribute("mathvariant", variant);
-        }
-    } else {
-        node = new mathMLTree.MathNode("mi", [text]);
-        node.setAttribute("mathvariant", variant);
-    }
-
-    return node;
-};
-
-groupTypes.bin = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    return node;
-};
-
-groupTypes.rel = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    return node;
-};
-
-groupTypes.open = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    return node;
-};
-
-groupTypes.close = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    return node;
-};
-
-groupTypes.inner = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    return node;
-};
-
-groupTypes.punct = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mo", [makeText(group.value, group.mode)]);
-
-    node.setAttribute("separator", "true");
-
-    return node;
-};
-
-groupTypes.ordgroup = function(group, options) {
-    var inner = buildExpression(group.value, options);
-
-    var node = new mathMLTree.MathNode("mrow", inner);
-
-    return node;
-};
-
-groupTypes.text = function(group, options) {
-    var inner = buildExpression(group.value.body, options);
-
-    var node = new mathMLTree.MathNode("mtext", inner);
-
-    return node;
-};
-
-groupTypes.color = function(group, options) {
-    var inner = buildExpression(group.value.value, options);
-
-    var node = new mathMLTree.MathNode("mstyle", inner);
-
-    node.setAttribute("mathcolor", group.value.color);
-
-    return node;
-};
-
-groupTypes.supsub = function(group, options) {
-    var children = [buildGroup(group.value.base, options)];
-
-    if (group.value.sub) {
-        children.push(buildGroup(group.value.sub, options));
-    }
-
-    if (group.value.sup) {
-        children.push(buildGroup(group.value.sup, options));
-    }
-
-    var nodeType;
-    if (!group.value.sub) {
-        nodeType = "msup";
-    } else if (!group.value.sup) {
-        nodeType = "msub";
-    } else {
-        nodeType = "msubsup";
-    }
-
-    var node = new mathMLTree.MathNode(nodeType, children);
-
-    return node;
-};
-
-groupTypes.genfrac = function(group, options) {
-    var node = new mathMLTree.MathNode(
-        "mfrac",
-        [buildGroup(group.value.numer, options),
-            buildGroup(group.value.denom, options)]);
-
-    if (!group.value.hasBarLine) {
-        node.setAttribute("linethickness", "0px");
-    }
-
-    if (group.value.leftDelim != null || group.value.rightDelim != null) {
-        var withDelims = [];
-
-        if (group.value.leftDelim != null) {
-            var leftOp = new mathMLTree.MathNode(
-                "mo", [new mathMLTree.TextNode(group.value.leftDelim)]);
-
-            leftOp.setAttribute("fence", "true");
-
-            withDelims.push(leftOp);
-        }
-
-        withDelims.push(node);
-
-        if (group.value.rightDelim != null) {
-            var rightOp = new mathMLTree.MathNode(
-                "mo", [new mathMLTree.TextNode(group.value.rightDelim)]);
-
-            rightOp.setAttribute("fence", "true");
-
-            withDelims.push(rightOp);
-        }
-
-        var outerNode = new mathMLTree.MathNode("mrow", withDelims);
-
-        return outerNode;
-    }
-
-    return node;
-};
-
-groupTypes.array = function(group, options) {
-    return new mathMLTree.MathNode(
-        "mtable", group.value.body.map(function(row) {
-            return new mathMLTree.MathNode(
-                "mtr", row.map(function(cell) {
-                    return new mathMLTree.MathNode(
-                        "mtd", [buildGroup(cell, options)]);
-                }));
-        }));
-};
-
-groupTypes.sqrt = function(group, options) {
-    var node;
-    if (group.value.index) {
-        node = new mathMLTree.MathNode(
-            "mroot", [
-                buildGroup(group.value.body, options),
-                buildGroup(group.value.index, options)
-            ]);
-    } else {
-        node = new mathMLTree.MathNode(
-            "msqrt", [buildGroup(group.value.body, options)]);
-    }
-
-    return node;
-};
-
-groupTypes.leftright = function(group, options) {
-    var inner = buildExpression(group.value.body, options);
-
-    if (group.value.left !== ".") {
-        var leftNode = new mathMLTree.MathNode(
-            "mo", [makeText(group.value.left, group.mode)]);
-
-        leftNode.setAttribute("fence", "true");
-
-        inner.unshift(leftNode);
-    }
-
-    if (group.value.right !== ".") {
-        var rightNode = new mathMLTree.MathNode(
-            "mo", [makeText(group.value.right, group.mode)]);
-
-        rightNode.setAttribute("fence", "true");
-
-        inner.push(rightNode);
-    }
-
-    var outerNode = new mathMLTree.MathNode("mrow", inner);
-
-    return outerNode;
-};
-
-groupTypes.middle = function(group, options) {
-    var middleNode = new mathMLTree.MathNode(
-        "mo", [makeText(group.value.middle, group.mode)]);
-    middleNode.setAttribute("fence", "true");
-    return middleNode;
-};
-
-groupTypes.accent = function(group, options) {
-    var accentNode = new mathMLTree.MathNode(
-        "mo", [makeText(group.value.accent, group.mode)]);
-
-    var node = new mathMLTree.MathNode(
-        "mover",
-        [buildGroup(group.value.base, options),
-            accentNode]);
-
-    node.setAttribute("accent", "true");
-
-    return node;
-};
-
-groupTypes.spacing = function(group) {
-    var node;
-
-    if (group.value === "\\ " || group.value === "\\space" ||
-        group.value === " " || group.value === "~") {
-        node = new mathMLTree.MathNode(
-            "mtext", [new mathMLTree.TextNode("\u00a0")]);
-    } else {
-        node = new mathMLTree.MathNode("mspace");
-
-        node.setAttribute(
-            "width", buildCommon.spacingFunctions[group.value].size);
-    }
-
-    return node;
-};
-
-groupTypes.op = function(group, options) {
-    var node;
-
-    // TODO(emily): handle big operators using the `largeop` attribute
-
-    if (group.value.symbol) {
-        // This is a symbol. Just add the symbol.
-        node = new mathMLTree.MathNode(
-            "mo", [makeText(group.value.body, group.mode)]);
-    } else if (group.value.value) {
-        // This is an operator with children. Add them.
-        node = new mathMLTree.MathNode(
-            "mo", buildExpression(group.value.value, options));
-    } else {
-        // This is a text operator. Add all of the characters from the
-        // operator's name.
-        // TODO(emily): Add a space in the middle of some of these
-        // operators, like \limsup.
-        node = new mathMLTree.MathNode(
-            "mi", [new mathMLTree.TextNode(group.value.body.slice(1))]);
-    }
-
-    return node;
-};
-
-groupTypes.mod = function(group, options) {
-    var inner = [];
-
-    if (group.value.modType === "pod" || group.value.modType === "pmod") {
-        inner.push(new mathMLTree.MathNode(
-            "mo", [makeText("(", group.mode)]));
-    }
-    if (group.value.modType !== "pod") {
-        inner.push(new mathMLTree.MathNode(
-            "mo", [makeText("mod", group.mode)]));
-    }
-    if (group.value.value) {
-        var space = new mathMLTree.MathNode("mspace");
-        space.setAttribute("width", "0.333333em");
-        inner.push(space);
-        inner = inner.concat(buildExpression(group.value.value, options));
-    }
-    if (group.value.modType === "pod" || group.value.modType === "pmod") {
-        inner.push(new mathMLTree.MathNode(
-            "mo", [makeText(")", group.mode)]));
-    }
-
-    return new mathMLTree.MathNode("mo", inner);
-};
-
-groupTypes.katex = function(group) {
-    var node = new mathMLTree.MathNode(
-        "mtext", [new mathMLTree.TextNode("KaTeX")]);
-
-    return node;
-};
-
-groupTypes.font = function(group, options) {
-    var font = group.value.font;
-    return buildGroup(group.value.body, options.withFont(font));
-};
-
-groupTypes.delimsizing = function(group) {
-    var children = [];
-
-    if (group.value.value !== ".") {
-        children.push(makeText(group.value.value, group.mode));
-    }
-
-    var node = new mathMLTree.MathNode("mo", children);
-
-    if (group.value.mclass === "mopen" ||
-        group.value.mclass === "mclose") {
-        // Only some of the delimsizing functions act as fences, and they
-        // return "mopen" or "mclose" mclass.
-        node.setAttribute("fence", "true");
-    } else {
-        // Explicitly disable fencing if it's not a fence, to override the
-        // defaults.
-        node.setAttribute("fence", "false");
-    }
-
-    return node;
-};
-
-groupTypes.styling = function(group, options) {
-    var inner = buildExpression(group.value.value, options);
-
-    var node = new mathMLTree.MathNode("mstyle", inner);
-
-    var styleAttributes = {
-        "display": ["0", "true"],
-        "text": ["0", "false"],
-        "script": ["1", "false"],
-        "scriptscript": ["2", "false"]
-    };
-
-    var attr = styleAttributes[group.value.style];
-
-    node.setAttribute("scriptlevel", attr[0]);
-    node.setAttribute("displaystyle", attr[1]);
-
-    return node;
-};
-
-groupTypes.sizing = function(group, options) {
-    var inner = buildExpression(group.value.value, options);
-
-    var node = new mathMLTree.MathNode("mstyle", inner);
-
-    // TODO(emily): This doesn't produce the correct size for nested size
-    // changes, because we don't keep state of what style we're currently
-    // in, so we can't reset the size to normal before changing it.  Now
-    // that we're passing an options parameter we should be able to fix
-    // this.
-    node.setAttribute(
-        "mathsize", buildCommon.sizingMultiplier[group.value.size] + "em");
-
-    return node;
-};
-
-groupTypes.overline = function(group, options) {
-    var operator = new mathMLTree.MathNode(
-        "mo", [new mathMLTree.TextNode("\u203e")]);
-    operator.setAttribute("stretchy", "true");
-
-    var node = new mathMLTree.MathNode(
-        "mover",
-        [buildGroup(group.value.body, options),
-            operator]);
-    node.setAttribute("accent", "true");
-
-    return node;
-};
-
-groupTypes.underline = function(group, options) {
-    var operator = new mathMLTree.MathNode(
-        "mo", [new mathMLTree.TextNode("\u203e")]);
-    operator.setAttribute("stretchy", "true");
-
-    var node = new mathMLTree.MathNode(
-        "munder",
-        [buildGroup(group.value.body, options),
-            operator]);
-    node.setAttribute("accentunder", "true");
-
-    return node;
-};
-
-groupTypes.rule = function(group) {
-    // TODO(emily): Figure out if there's an actual way to draw black boxes
-    // in MathML.
-    var node = new mathMLTree.MathNode("mrow");
-
-    return node;
-};
-
-groupTypes.kern = function(group) {
-    // TODO(kevin): Figure out if there's a way to add space in MathML
-    var node = new mathMLTree.MathNode("mrow");
-
-    return node;
-};
-
-groupTypes.llap = function(group, options) {
-    var node = new mathMLTree.MathNode(
-        "mpadded", [buildGroup(group.value.body, options)]);
-
-    node.setAttribute("lspace", "-1width");
-    node.setAttribute("width", "0px");
-
-    return node;
-};
-
-groupTypes.rlap = function(group, options) {
-    var node = new mathMLTree.MathNode(
-        "mpadded", [buildGroup(group.value.body, options)]);
-
-    node.setAttribute("width", "0px");
-
-    return node;
-};
-
-groupTypes.phantom = function(group, options) {
-    var inner = buildExpression(group.value.value, options);
-    return new mathMLTree.MathNode("mphantom", inner);
-};
-
-groupTypes.mclass = function(group, options) {
-    var inner = buildExpression(group.value.value, options);
-    return new mathMLTree.MathNode("mstyle", inner);
-};
-
-/**
- * Takes a list of nodes, builds them, and returns a list of the generated
- * MathML nodes. A little simpler than the HTML version because we don't do any
- * previous-node handling.
- */
-var buildExpression = function(expression, options) {
-    var groups = [];
-    for (var i = 0; i < expression.length; i++) {
-        var group = expression[i];
-        groups.push(buildGroup(group, options));
-    }
-    return groups;
-};
-
-/**
- * Takes a group from the parser and calls the appropriate groupTypes function
- * on it to produce a MathML node.
- */
-var buildGroup = function(group, options) {
-    if (!group) {
-        return new mathMLTree.MathNode("mrow");
-    }
-
-    if (groupTypes[group.type]) {
-        // Call the groupTypes function
-        return groupTypes[group.type](group, options);
-    } else {
-        throw new ParseError(
-            "Got group of unknown type: '" + group.type + "'");
-    }
-};
-
-/**
- * Takes a full parse tree and settings and builds a MathML representation of
- * it. In particular, we put the elements from building the parse tree into a
- * <semantics> tag so we can also include that TeX source as an annotation.
- *
- * Note that we actually return a domTree element with a `<math>` inside it so
- * we can do appropriate styling.
- */
-var buildMathML = function(tree, texExpression, options) {
-    var expression = buildExpression(tree, options);
-
-    // Wrap up the expression in an mrow so it is presented in the semantics
-    // tag correctly.
-    var wrapper = new mathMLTree.MathNode("mrow", expression);
-
-    // Build a TeX annotation of the source
-    var annotation = new mathMLTree.MathNode(
-        "annotation", [new mathMLTree.TextNode(texExpression)]);
-
-    annotation.setAttribute("encoding", "application/x-tex");
-
-    var semantics = new mathMLTree.MathNode(
-        "semantics", [wrapper, annotation]);
-
-    var math = new mathMLTree.MathNode("math", [semantics]);
-
-    // You can't style <math> nodes, so we wrap the node in a span.
-    return makeSpan(["katex-mathml"], [math]);
-};
-
-module.exports = buildMathML;
-
-},{"./ParseError":6,"./buildCommon":10,"./fontMetrics":17,"./mathMLTree":20,"./symbols":23,"./utils":25}],13:[function(require,module,exports){
-var buildHTML = require("./buildHTML");
-var buildMathML = require("./buildMathML");
-var buildCommon = require("./buildCommon");
-var Options = require("./Options");
-var Settings = require("./Settings");
-var Style = require("./Style");
-
-var makeSpan = buildCommon.makeSpan;
-
-var buildTree = function(tree, expression, settings) {
-    settings = settings || new Settings({});
-
-    var startStyle = Style.TEXT;
-    if (settings.displayMode) {
-        startStyle = Style.DISPLAY;
-    }
-
-    // Setup the default options
-    var options = new Options({
-        style: startStyle,
-        size: "size5"
-    });
-
-    // `buildHTML` sometimes messes with the parse tree (like turning bins ->
-    // ords), so we build the MathML version first.
-    var mathMLNode = buildMathML(tree, expression, options);
-    var htmlNode = buildHTML(tree, options);
-
-    var katexNode = makeSpan(["katex"], [
-        mathMLNode, htmlNode
-    ]);
-
-    if (settings.displayMode) {
-        return makeSpan(["katex-display"], [katexNode]);
-    } else {
-        return katexNode;
-    }
-};
-
-module.exports = buildTree;
-
-},{"./Options":5,"./Settings":8,"./Style":9,"./buildCommon":10,"./buildHTML":11,"./buildMathML":12}],14:[function(require,module,exports){
-/**
- * This file deals with creating delimiters of various sizes. The TeXbook
- * discusses these routines on page 441-442, in the "Another subroutine sets box
- * x to a specified variable delimiter" paragraph.
- *
- * There are three main routines here. `makeSmallDelim` makes a delimiter in the
- * normal font, but in either text, script, or scriptscript style.
- * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,
- * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of
- * smaller pieces that are stacked on top of one another.
- *
- * The functions take a parameter `center`, which determines if the delimiter
- * should be centered around the axis.
- *
- * Then, there are three exposed functions. `sizedDelim` makes a delimiter in
- * one of the given sizes. This is used for things like `\bigl`.
- * `customSizedDelim` makes a delimiter with a given total height+depth. It is
- * called in places like `\sqrt`. `leftRightDelim` makes an appropriate
- * delimiter which surrounds an expression of a given height an depth. It is
- * used in `\left` and `\right`.
- */
-
-var ParseError = require("./ParseError");
-var Style = require("./Style");
-
-var buildCommon = require("./buildCommon");
-var fontMetrics = require("./fontMetrics");
-var symbols = require("./symbols");
-var utils = require("./utils");
-
-var makeSpan = buildCommon.makeSpan;
-
-/**
- * Get the metrics for a given symbol and font, after transformation (i.e.
- * after following replacement from symbols.js)
- */
-var getMetrics = function(symbol, font) {
-    if (symbols.math[symbol] && symbols.math[symbol].replace) {
-        return fontMetrics.getCharacterMetrics(
-            symbols.math[symbol].replace, font);
-    } else {
-        return fontMetrics.getCharacterMetrics(
-            symbol, font);
-    }
-};
-
-/**
- * Builds a symbol in the given font size (note size is an integer)
- */
-var mathrmSize = function(value, size, mode, options) {
-    return buildCommon.makeSymbol(value, "Size" + size + "-Regular",
-        mode, options);
-};
-
-/**
- * Puts a delimiter span in a given style, and adds appropriate height, depth,
- * and maxFontSizes.
- */
-var styleWrap = function(delim, toStyle, options, classes) {
-    classes = classes || [];
-    var span = makeSpan(
-        classes.concat(["style-wrap", options.style.reset(), toStyle.cls()]),
-        [delim], options);
-
-    var multiplier = toStyle.sizeMultiplier / options.style.sizeMultiplier;
-
-    span.height *= multiplier;
-    span.depth *= multiplier;
-    span.maxFontSize = toStyle.sizeMultiplier;
-
-    return span;
-};
-
-/**
- * Makes a small delimiter. This is a delimiter that comes in the Main-Regular
- * font, but is restyled to either be in textstyle, scriptstyle, or
- * scriptscriptstyle.
- */
-var makeSmallDelim = function(delim, style, center, options, mode, classes) {
-    var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options);
-
-    var span = styleWrap(text, style, options, classes);
-
-    if (center) {
-        var shift =
-            (1 - options.style.sizeMultiplier / style.sizeMultiplier) *
-            options.style.metrics.axisHeight;
-
-        span.style.top = shift + "em";
-        span.height -= shift;
-        span.depth += shift;
-    }
-
-    return span;
-};
-
-/**
- * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,
- * Size3, or Size4 fonts. It is always rendered in textstyle.
- */
-var makeLargeDelim = function(delim, size, center, options, mode, classes) {
-    var inner = mathrmSize(delim, size, mode, options);
-
-    var span = styleWrap(
-        makeSpan(["delimsizing", "size" + size], [inner], options),
-        Style.TEXT, options, classes);
-
-    if (center) {
-        var shift = (1 - options.style.sizeMultiplier) *
-            options.style.metrics.axisHeight;
-
-        span.style.top = shift + "em";
-        span.height -= shift;
-        span.depth += shift;
-    }
-
-    return span;
-};
-
-/**
- * Make an inner span with the given offset and in the given font. This is used
- * in `makeStackedDelim` to make the stacking pieces for the delimiter.
- */
-var makeInner = function(symbol, font, mode) {
-    var sizeClass;
-    // Apply the correct CSS class to choose the right font.
-    if (font === "Size1-Regular") {
-        sizeClass = "delim-size1";
-    } else if (font === "Size4-Regular") {
-        sizeClass = "delim-size4";
-    }
-
-    var inner = makeSpan(
-        ["delimsizinginner", sizeClass],
-        [makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]);
-
-    // Since this will be passed into `makeVList` in the end, wrap the element
-    // in the appropriate tag that VList uses.
-    return {type: "elem", elem: inner};
-};
-
-/**
- * Make a stacked delimiter out of a given delimiter, with the total height at
- * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.
- */
-var makeStackedDelim = function(delim, heightTotal, center, options, mode,
-                                classes) {
-    // There are four parts, the top, an optional middle, a repeated part, and a
-    // bottom.
-    var top;
-    var middle;
-    var repeat;
-    var bottom;
-    top = repeat = bottom = delim;
-    middle = null;
-    // Also keep track of what font the delimiters are in
-    var font = "Size1-Regular";
-
-    // We set the parts and font based on the symbol. Note that we use
-    // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the
-    // repeats of the arrows
-    if (delim === "\\uparrow") {
-        repeat = bottom = "\u23d0";
-    } else if (delim === "\\Uparrow") {
-        repeat = bottom = "\u2016";
-    } else if (delim === "\\downarrow") {
-        top = repeat = "\u23d0";
-    } else if (delim === "\\Downarrow") {
-        top = repeat = "\u2016";
-    } else if (delim === "\\updownarrow") {
-        top = "\\uparrow";
-        repeat = "\u23d0";
-        bottom = "\\downarrow";
-    } else if (delim === "\\Updownarrow") {
-        top = "\\Uparrow";
-        repeat = "\u2016";
-        bottom = "\\Downarrow";
-    } else if (delim === "[" || delim === "\\lbrack") {
-        top = "\u23a1";
-        repeat = "\u23a2";
-        bottom = "\u23a3";
-        font = "Size4-Regular";
-    } else if (delim === "]" || delim === "\\rbrack") {
-        top = "\u23a4";
-        repeat = "\u23a5";
-        bottom = "\u23a6";
-        font = "Size4-Regular";
-    } else if (delim === "\\lfloor") {
-        repeat = top = "\u23a2";
-        bottom = "\u23a3";
-        font = "Size4-Regular";
-    } else if (delim === "\\lceil") {
-        top = "\u23a1";
-        repeat = bottom = "\u23a2";
-        font = "Size4-Regular";
-    } else if (delim === "\\rfloor") {
-        repeat = top = "\u23a5";
-        bottom = "\u23a6";
-        font = "Size4-Regular";
-    } else if (delim === "\\rceil") {
-        top = "\u23a4";
-        repeat = bottom = "\u23a5";
-        font = "Size4-Regular";
-    } else if (delim === "(") {
-        top = "\u239b";
-        repeat = "\u239c";
-        bottom = "\u239d";
-        font = "Size4-Regular";
-    } else if (delim === ")") {
-        top = "\u239e";
-        repeat = "\u239f";
-        bottom = "\u23a0";
-        font = "Size4-Regular";
-    } else if (delim === "\\{" || delim === "\\lbrace") {
-        top = "\u23a7";
-        middle = "\u23a8";
-        bottom = "\u23a9";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\}" || delim === "\\rbrace") {
-        top = "\u23ab";
-        middle = "\u23ac";
-        bottom = "\u23ad";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\lgroup") {
-        top = "\u23a7";
-        bottom = "\u23a9";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\rgroup") {
-        top = "\u23ab";
-        bottom = "\u23ad";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\lmoustache") {
-        top = "\u23a7";
-        bottom = "\u23ad";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\rmoustache") {
-        top = "\u23ab";
-        bottom = "\u23a9";
-        repeat = "\u23aa";
-        font = "Size4-Regular";
-    } else if (delim === "\\surd") {
-        top = "\ue001";
-        bottom = "\u23b7";
-        repeat = "\ue000";
-        font = "Size4-Regular";
-    }
-
-    // Get the metrics of the four sections
-    var topMetrics = getMetrics(top, font);
-    var topHeightTotal = topMetrics.height + topMetrics.depth;
-    var repeatMetrics = getMetrics(repeat, font);
-    var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;
-    var bottomMetrics = getMetrics(bottom, font);
-    var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;
-    var middleHeightTotal = 0;
-    var middleFactor = 1;
-    if (middle !== null) {
-        var middleMetrics = getMetrics(middle, font);
-        middleHeightTotal = middleMetrics.height + middleMetrics.depth;
-        middleFactor = 2; // repeat symmetrically above and below middle
-    }
-
-    // Calcuate the minimal height that the delimiter can have.
-    // It is at least the size of the top, bottom, and optional middle combined.
-    var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal;
-
-    // Compute the number of copies of the repeat symbol we will need
-    var repeatCount = Math.ceil(
-        (heightTotal - minHeight) / (middleFactor * repeatHeightTotal));
-
-    // Compute the total height of the delimiter including all the symbols
-    var realHeightTotal =
-        minHeight + repeatCount * middleFactor * repeatHeightTotal;
-
-    // The center of the delimiter is placed at the center of the axis. Note
-    // that in this context, "center" means that the delimiter should be
-    // centered around the axis in the current style, while normally it is
-    // centered around the axis in textstyle.
-    var axisHeight = options.style.metrics.axisHeight;
-    if (center) {
-        axisHeight *= options.style.sizeMultiplier;
-    }
-    // Calculate the depth
-    var depth = realHeightTotal / 2 - axisHeight;
-
-    // Now, we start building the pieces that will go into the vlist
-
-    // Keep a list of the inner pieces
-    var inners = [];
-
-    // Add the bottom symbol
-    inners.push(makeInner(bottom, font, mode));
-
-    var i;
-    if (middle === null) {
-        // Add that many symbols
-        for (i = 0; i < repeatCount; i++) {
-            inners.push(makeInner(repeat, font, mode));
-        }
-    } else {
-        // When there is a middle bit, we need the middle part and two repeated
-        // sections
-        for (i = 0; i < repeatCount; i++) {
-            inners.push(makeInner(repeat, font, mode));
-        }
-        inners.push(makeInner(middle, font, mode));
-        for (i = 0; i < repeatCount; i++) {
-            inners.push(makeInner(repeat, font, mode));
-        }
-    }
-
-    // Add the top symbol
-    inners.push(makeInner(top, font, mode));
-
-    // Finally, build the vlist
-    var inner = buildCommon.makeVList(inners, "bottom", depth, options);
-
-    return styleWrap(
-        makeSpan(["delimsizing", "mult"], [inner], options),
-        Style.TEXT, options, classes);
-};
-
-// There are three kinds of delimiters, delimiters that stack when they become
-// too large
-var stackLargeDelimiters = [
-    "(", ")", "[", "\\lbrack", "]", "\\rbrack",
-    "\\{", "\\lbrace", "\\}", "\\rbrace",
-    "\\lfloor", "\\rfloor", "\\lceil", "\\rceil",
-    "\\surd"
-];
-
-// delimiters that always stack
-var stackAlwaysDelimiters = [
-    "\\uparrow", "\\downarrow", "\\updownarrow",
-    "\\Uparrow", "\\Downarrow", "\\Updownarrow",
-    "|", "\\|", "\\vert", "\\Vert",
-    "\\lvert", "\\rvert", "\\lVert", "\\rVert",
-    "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache"
-];
-
-// and delimiters that never stack
-var stackNeverDelimiters = [
-    "<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"
-];
-
-// Metrics of the different sizes. Found by looking at TeX's output of
-// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$
-// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.
-var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];
-
-/**
- * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.
- */
-var makeSizedDelim = function(delim, size, options, mode, classes) {
-    // < and > turn into \langle and \rangle in delimiters
-    if (delim === "<" || delim === "\\lt") {
-        delim = "\\langle";
-    } else if (delim === ">" || delim === "\\gt") {
-        delim = "\\rangle";
-    }
-
-    // Sized delimiters are never centered.
-    if (utils.contains(stackLargeDelimiters, delim) ||
-        utils.contains(stackNeverDelimiters, delim)) {
-        return makeLargeDelim(delim, size, false, options, mode, classes);
-    } else if (utils.contains(stackAlwaysDelimiters, delim)) {
-        return makeStackedDelim(
-            delim, sizeToMaxHeight[size], false, options, mode, classes);
-    } else {
-        throw new ParseError("Illegal delimiter: '" + delim + "'");
-    }
-};
-
-/**
- * There are three different sequences of delimiter sizes that the delimiters
- * follow depending on the kind of delimiter. This is used when creating custom
- * sized delimiters to decide whether to create a small, large, or stacked
- * delimiter.
- *
- * In real TeX, these sequences aren't explicitly defined, but are instead
- * defined inside the font metrics. Since there are only three sequences that
- * are possible for the delimiters that TeX defines, it is easier to just encode
- * them explicitly here.
- */
-
-// Delimiters that never stack try small delimiters and large delimiters only
-var stackNeverDelimiterSequence = [
-    {type: "small", style: Style.SCRIPTSCRIPT},
-    {type: "small", style: Style.SCRIPT},
-    {type: "small", style: Style.TEXT},
-    {type: "large", size: 1},
-    {type: "large", size: 2},
-    {type: "large", size: 3},
-    {type: "large", size: 4}
-];
-
-// Delimiters that always stack try the small delimiters first, then stack
-var stackAlwaysDelimiterSequence = [
-    {type: "small", style: Style.SCRIPTSCRIPT},
-    {type: "small", style: Style.SCRIPT},
-    {type: "small", style: Style.TEXT},
-    {type: "stack"}
-];
-
-// Delimiters that stack when large try the small and then large delimiters, and
-// stack afterwards
-var stackLargeDelimiterSequence = [
-    {type: "small", style: Style.SCRIPTSCRIPT},
-    {type: "small", style: Style.SCRIPT},
-    {type: "small", style: Style.TEXT},
-    {type: "large", size: 1},
-    {type: "large", size: 2},
-    {type: "large", size: 3},
-    {type: "large", size: 4},
-    {type: "stack"}
-];
-
-/**
- * Get the font used in a delimiter based on what kind of delimiter it is.
- */
-var delimTypeToFont = function(type) {
-    if (type.type === "small") {
-        return "Main-Regular";
-    } else if (type.type === "large") {
-        return "Size" + type.size + "-Regular";
-    } else if (type.type === "stack") {
-        return "Size4-Regular";
-    }
-};
-
-/**
- * Traverse a sequence of types of delimiters to decide what kind of delimiter
- * should be used to create a delimiter of the given height+depth.
- */
-var traverseSequence = function(delim, height, sequence, options) {
-    // Here, we choose the index we should start at in the sequences. In smaller
-    // sizes (which correspond to larger numbers in style.size) we start earlier
-    // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts
-    // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2
-    var start = Math.min(2, 3 - options.style.size);
-    for (var i = start; i < sequence.length; i++) {
-        if (sequence[i].type === "stack") {
-            // This is always the last delimiter, so we just break the loop now.
-            break;
-        }
-
-        var metrics = getMetrics(delim, delimTypeToFont(sequence[i]));
-        var heightDepth = metrics.height + metrics.depth;
-
-        // Small delimiters are scaled down versions of the same font, so we
-        // account for the style change size.
-
-        if (sequence[i].type === "small") {
-            heightDepth *= sequence[i].style.sizeMultiplier;
-        }
-
-        // Check if the delimiter at this size works for the given height.
-        if (heightDepth > height) {
-            return sequence[i];
-        }
-    }
-
-    // If we reached the end of the sequence, return the last sequence element.
-    return sequence[sequence.length - 1];
-};
-
-/**
- * Make a delimiter of a given height+depth, with optional centering. Here, we
- * traverse the sequences, and create a delimiter that the sequence tells us to.
- */
-var makeCustomSizedDelim = function(delim, height, center, options, mode,
-                                    classes) {
-    if (delim === "<" || delim === "\\lt") {
-        delim = "\\langle";
-    } else if (delim === ">" || delim === "\\gt") {
-        delim = "\\rangle";
-    }
-
-    // Decide what sequence to use
-    var sequence;
-    if (utils.contains(stackNeverDelimiters, delim)) {
-        sequence = stackNeverDelimiterSequence;
-    } else if (utils.contains(stackLargeDelimiters, delim)) {
-        sequence = stackLargeDelimiterSequence;
-    } else {
-        sequence = stackAlwaysDelimiterSequence;
-    }
-
-    // Look through the sequence
-    var delimType = traverseSequence(delim, height, sequence, options);
-
-    // Depending on the sequence element we decided on, call the appropriate
-    // function.
-    if (delimType.type === "small") {
-        return makeSmallDelim(delim, delimType.style, center, options, mode,
-                              classes);
-    } else if (delimType.type === "large") {
-        return makeLargeDelim(delim, delimType.size, center, options, mode,
-                              classes);
-    } else if (delimType.type === "stack") {
-        return makeStackedDelim(delim, height, center, options, mode, classes);
-    }
-};
-
-/**
- * Make a delimiter for use with `\left` and `\right`, given a height and depth
- * of an expression that the delimiters surround.
- */
-var makeLeftRightDelim = function(delim, height, depth, options, mode,
-                                  classes) {
-    // We always center \left/\right delimiters, so the axis is always shifted
-    var axisHeight =
-        options.style.metrics.axisHeight * options.style.sizeMultiplier;
-
-    // Taken from TeX source, tex.web, function make_left_right
-    var delimiterFactor = 901;
-    var delimiterExtend = 5.0 / fontMetrics.metrics.ptPerEm;
-
-    var maxDistFromAxis = Math.max(
-        height - axisHeight, depth + axisHeight);
-
-    var totalHeight = Math.max(
-        // In real TeX, calculations are done using integral values which are
-        // 65536 per pt, or 655360 per em. So, the division here truncates in
-        // TeX but doesn't here, producing different results. If we wanted to
-        // exactly match TeX's calculation, we could do
-        //   Math.floor(655360 * maxDistFromAxis / 500) *
-        //    delimiterFactor / 655360
-        // (To see the difference, compare
-        //    x^{x^{\left(\rule{0.1em}{0.68em}\right)}}
-        // in TeX and KaTeX)
-        maxDistFromAxis / 500 * delimiterFactor,
-        2 * maxDistFromAxis - delimiterExtend);
-
-    // Finally, we defer to `makeCustomSizedDelim` with our calculated total
-    // height
-    return makeCustomSizedDelim(delim, totalHeight, true, options, mode,
-                                classes);
-};
-
-module.exports = {
-    sizedDelim: makeSizedDelim,
-    customSizedDelim: makeCustomSizedDelim,
-    leftRightDelim: makeLeftRightDelim
-};
-
-},{"./ParseError":6,"./Style":9,"./buildCommon":10,"./fontMetrics":17,"./symbols":23,"./utils":25}],15:[function(require,module,exports){
-/**
- * These objects store the data about the DOM nodes we create, as well as some
- * extra data. They can then be transformed into real DOM nodes with the
- * `toNode` function or HTML markup using `toMarkup`. They are useful for both
- * storing extra properties on the nodes, as well as providing a way to easily
- * work with the DOM.
- *
- * Similar functions for working with MathML nodes exist in mathMLTree.js.
- */
-var unicodeRegexes = require("./unicodeRegexes");
-var utils = require("./utils");
-
-/**
- * Create an HTML className based on a list of classes. In addition to joining
- * with spaces, we also remove null or empty classes.
- */
-var createClass = function(classes) {
-    classes = classes.slice();
-    for (var i = classes.length - 1; i >= 0; i--) {
-        if (!classes[i]) {
-            classes.splice(i, 1);
-        }
-    }
-
-    return classes.join(" ");
-};
-
-/**
- * This node represents a span node, with a className, a list of children, and
- * an inline style. It also contains information about its height, depth, and
- * maxFontSize.
- */
-function span(classes, children, options) {
-    this.classes = classes || [];
-    this.children = children || [];
-    this.height = 0;
-    this.depth = 0;
-    this.maxFontSize = 0;
-    this.style = {};
-    this.attributes = {};
-    if (options) {
-        if (options.style.isTight()) {
-            this.classes.push("mtight");
-        }
-        if (options.getColor()) {
-            this.style.color = options.getColor();
-        }
-    }
-}
-
-/**
- * Sets an arbitrary attribute on the span. Warning: use this wisely. Not all
- * browsers support attributes the same, and having too many custom attributes
- * is probably bad.
- */
-span.prototype.setAttribute = function(attribute, value) {
-    this.attributes[attribute] = value;
-};
-
-span.prototype.tryCombine = function(sibling) {
-    return false;
-};
-
-/**
- * Convert the span into an HTML node
- */
-span.prototype.toNode = function() {
-    var span = document.createElement("span");
-
-    // Apply the class
-    span.className = createClass(this.classes);
-
-    // Apply inline styles
-    for (var style in this.style) {
-        if (Object.prototype.hasOwnProperty.call(this.style, style)) {
-            span.style[style] = this.style[style];
-        }
-    }
-
-    // Apply attributes
-    for (var attr in this.attributes) {
-        if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-            span.setAttribute(attr, this.attributes[attr]);
-        }
-    }
-
-    // Append the children, also as HTML nodes
-    for (var i = 0; i < this.children.length; i++) {
-        span.appendChild(this.children[i].toNode());
-    }
-
-    return span;
-};
-
-/**
- * Convert the span into an HTML markup string
- */
-span.prototype.toMarkup = function() {
-    var markup = "<span";
-
-    // Add the class
-    if (this.classes.length) {
-        markup += " class=\"";
-        markup += utils.escape(createClass(this.classes));
-        markup += "\"";
-    }
-
-    var styles = "";
-
-    // Add the styles, after hyphenation
-    for (var style in this.style) {
-        if (this.style.hasOwnProperty(style)) {
-            styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-        }
-    }
-
-    if (styles) {
-        markup += " style=\"" + utils.escape(styles) + "\"";
-    }
-
-    // Add the attributes
-    for (var attr in this.attributes) {
-        if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-            markup += " " + attr + "=\"";
-            markup += utils.escape(this.attributes[attr]);
-            markup += "\"";
-        }
-    }
-
-    markup += ">";
-
-    // Add the markup of the children, also as markup
-    for (var i = 0; i < this.children.length; i++) {
-        markup += this.children[i].toMarkup();
-    }
-
-    markup += "</span>";
-
-    return markup;
-};
-
-/**
- * This node represents a document fragment, which contains elements, but when
- * placed into the DOM doesn't have any representation itself. Thus, it only
- * contains children and doesn't have any HTML properties. It also keeps track
- * of a height, depth, and maxFontSize.
- */
-function documentFragment(children) {
-    this.children = children || [];
-    this.height = 0;
-    this.depth = 0;
-    this.maxFontSize = 0;
-}
-
-/**
- * Convert the fragment into a node
- */
-documentFragment.prototype.toNode = function() {
-    // Create a fragment
-    var frag = document.createDocumentFragment();
-
-    // Append the children
-    for (var i = 0; i < this.children.length; i++) {
-        frag.appendChild(this.children[i].toNode());
-    }
-
-    return frag;
-};
-
-/**
- * Convert the fragment into HTML markup
- */
-documentFragment.prototype.toMarkup = function() {
-    var markup = "";
-
-    // Simply concatenate the markup for the children together
-    for (var i = 0; i < this.children.length; i++) {
-        markup += this.children[i].toMarkup();
-    }
-
-    return markup;
-};
-
-var iCombinations = {
-    'î': '\u0131\u0302',
-    'ï': '\u0131\u0308',
-    'í': '\u0131\u0301',
-    // 'ī': '\u0131\u0304', // enable when we add Extended Latin
-    'ì': '\u0131\u0300'
-};
-
-/**
- * A symbol node contains information about a single symbol. It either renders
- * to a single text node, or a span with a single text node in it, depending on
- * whether it has CSS classes, styles, or needs italic correction.
- */
-function symbolNode(value, height, depth, italic, skew, classes, style) {
-    this.value = value || "";
-    this.height = height || 0;
-    this.depth = depth || 0;
-    this.italic = italic || 0;
-    this.skew = skew || 0;
-    this.classes = classes || [];
-    this.style = style || {};
-    this.maxFontSize = 0;
-
-    // Mark CJK characters with specific classes so that we can specify which
-    // fonts to use.  This allows us to render these characters with a serif
-    // font in situations where the browser would either default to a sans serif
-    // or render a placeholder character.
-    if (unicodeRegexes.cjkRegex.test(value)) {
-        // I couldn't find any fonts that contained Hangul as well as all of
-        // the other characters we wanted to test there for it gets its own
-        // CSS class.
-        if (unicodeRegexes.hangulRegex.test(value)) {
-            this.classes.push('hangul_fallback');
-        } else {
-            this.classes.push('cjk_fallback');
-        }
-    }
-
-    if (/[îïíì]/.test(this.value)) {    // add ī when we add Extended Latin
-        this.value = iCombinations[this.value];
-    }
-}
-
-symbolNode.prototype.tryCombine = function(sibling) {
-    if (!sibling
-        || !(sibling instanceof symbolNode)
-        || this.italic > 0
-        || createClass(this.classes) !== createClass(sibling.classes)
-        || this.skew !== sibling.skew
-        || this.maxFontSize !== sibling.maxFontSize) {
-        return false;
-    }
-    for (var style in this.style) {
-        if (this.style.hasOwnProperty(style)
-            && this.style[style] !== sibling.style[style]) {
-            return false;
-        }
-    }
-    for (style in sibling.style) {
-        if (sibling.style.hasOwnProperty(style)
-            && this.style[style] !== sibling.style[style]) {
-            return false;
-        }
-    }
-    this.value += sibling.value;
-    this.height = Math.max(this.height, sibling.height);
-    this.depth = Math.max(this.depth, sibling.depth);
-    this.italic = sibling.italic;
-    return true;
-};
-
-/**
- * Creates a text node or span from a symbol node. Note that a span is only
- * created if it is needed.
- */
-symbolNode.prototype.toNode = function() {
-    var node = document.createTextNode(this.value);
-    var span = null;
-
-    if (this.italic > 0) {
-        span = document.createElement("span");
-        span.style.marginRight = this.italic + "em";
-    }
-
-    if (this.classes.length > 0) {
-        span = span || document.createElement("span");
-        span.className = createClass(this.classes);
-    }
-
-    for (var style in this.style) {
-        if (this.style.hasOwnProperty(style)) {
-            span = span || document.createElement("span");
-            span.style[style] = this.style[style];
-        }
-    }
-
-    if (span) {
-        span.appendChild(node);
-        return span;
-    } else {
-        return node;
-    }
-};
-
-/**
- * Creates markup for a symbol node.
- */
-symbolNode.prototype.toMarkup = function() {
-    // TODO(alpert): More duplication than I'd like from
-    // span.prototype.toMarkup and symbolNode.prototype.toNode...
-    var needsSpan = false;
-
-    var markup = "<span";
-
-    if (this.classes.length) {
-        needsSpan = true;
-        markup += " class=\"";
-        markup += utils.escape(createClass(this.classes));
-        markup += "\"";
-    }
-
-    var styles = "";
-
-    if (this.italic > 0) {
-        styles += "margin-right:" + this.italic + "em;";
-    }
-    for (var style in this.style) {
-        if (this.style.hasOwnProperty(style)) {
-            styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-        }
-    }
-
-    if (styles) {
-        needsSpan = true;
-        markup += " style=\"" + utils.escape(styles) + "\"";
-    }
-
-    var escaped = utils.escape(this.value);
-    if (needsSpan) {
-        markup += ">";
-        markup += escaped;
-        markup += "</span>";
-        return markup;
-    } else {
-        return escaped;
-    }
-};
-
-module.exports = {
-    span: span,
-    documentFragment: documentFragment,
-    symbolNode: symbolNode
-};
-
-},{"./unicodeRegexes":24,"./utils":25}],16:[function(require,module,exports){
-/* eslint no-constant-condition:0 */
-var parseData = require("./parseData");
-var ParseError = require("./ParseError");
-var Style = require("./Style");
-
-var ParseNode = parseData.ParseNode;
-
-/**
- * Parse the body of the environment, with rows delimited by \\ and
- * columns delimited by &, and create a nested list in row-major order
- * with one group per cell.
- */
-function parseArray(parser, result) {
-    var row = [];
-    var body = [row];
-    var rowGaps = [];
-    while (true) {
-        var cell = parser.parseExpression(false, null);
-        row.push(new ParseNode("ordgroup", cell, parser.mode));
-        var next = parser.nextToken.text;
-        if (next === "&") {
-            parser.consume();
-        } else if (next === "\\end") {
-            break;
-        } else if (next === "\\\\" || next === "\\cr") {
-            var cr = parser.parseFunction();
-            rowGaps.push(cr.value.size);
-            row = [];
-            body.push(row);
-        } else {
-            throw new ParseError("Expected & or \\\\ or \\end",
-                                 parser.nextToken);
-        }
-    }
-    result.body = body;
-    result.rowGaps = rowGaps;
-    return new ParseNode(result.type, result, parser.mode);
-}
-
-/*
- * An environment definition is very similar to a function definition:
- * it is declared with a name or a list of names, a set of properties
- * and a handler containing the actual implementation.
- *
- * The properties include:
- *  - numArgs: The number of arguments after the \begin{name} function.
- *  - argTypes: (optional) Just like for a function
- *  - allowedInText: (optional) Whether or not the environment is allowed inside
- *                   text mode (default false) (not enforced yet)
- *  - numOptionalArgs: (optional) Just like for a function
- * A bare number instead of that object indicates the numArgs value.
- *
- * The handler function will receive two arguments
- *  - context: information and references provided by the parser
- *  - args: an array of arguments passed to \begin{name}
- * The context contains the following properties:
- *  - envName: the name of the environment, one of the listed names.
- *  - parser: the parser object
- *  - lexer: the lexer object
- *  - positions: the positions associated with these arguments from args.
- * The handler must return a ParseResult.
- */
-
-function defineEnvironment(names, props, handler) {
-    if (typeof names === "string") {
-        names = [names];
-    }
-    if (typeof props === "number") {
-        props = { numArgs: props };
-    }
-    // Set default values of environments
-    var data = {
-        numArgs: props.numArgs || 0,
-        argTypes: props.argTypes,
-        greediness: 1,
-        allowedInText: !!props.allowedInText,
-        numOptionalArgs: props.numOptionalArgs || 0,
-        handler: handler
-    };
-    for (var i = 0; i < names.length; ++i) {
-        module.exports[names[i]] = data;
-    }
-}
-
-// Arrays are part of LaTeX, defined in lttab.dtx so its documentation
-// is part of the source2e.pdf file of LaTeX2e source documentation.
-defineEnvironment("array", {
-    numArgs: 1
-}, function(context, args) {
-    var colalign = args[0];
-    colalign = colalign.value.map ? colalign.value : [colalign];
-    var cols = colalign.map(function(node) {
-        var ca = node.value;
-        if ("lcr".indexOf(ca) !== -1) {
-            return {
-                type: "align",
-                align: ca
-            };
-        } else if (ca === "|") {
-            return {
-                type: "separator",
-                separator: "|"
-            };
-        }
-        throw new ParseError(
-            "Unknown column alignment: " + node.value,
-            node);
-    });
-    var res = {
-        type: "array",
-        cols: cols,
-        hskipBeforeAndAfter: true // \@preamble in lttab.dtx
-    };
-    res = parseArray(context.parser, res);
-    return res;
-});
-
-// The matrix environments of amsmath builds on the array environment
-// of LaTeX, which is discussed above.
-defineEnvironment([
-    "matrix",
-    "pmatrix",
-    "bmatrix",
-    "Bmatrix",
-    "vmatrix",
-    "Vmatrix"
-], {
-}, function(context) {
-    var delimiters = {
-        "matrix": null,
-        "pmatrix": ["(", ")"],
-        "bmatrix": ["[", "]"],
-        "Bmatrix": ["\\{", "\\}"],
-        "vmatrix": ["|", "|"],
-        "Vmatrix": ["\\Vert", "\\Vert"]
-    }[context.envName];
-    var res = {
-        type: "array",
-        hskipBeforeAndAfter: false // \hskip -\arraycolsep in amsmath
-    };
-    res = parseArray(context.parser, res);
-    if (delimiters) {
-        res = new ParseNode("leftright", {
-            body: [res],
-            left: delimiters[0],
-            right: delimiters[1]
-        }, context.mode);
-    }
-    return res;
-});
-
-// A cases environment (in amsmath.sty) is almost equivalent to
-// \def\arraystretch{1.2}%
-// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right.
-defineEnvironment("cases", {
-}, function(context) {
-    var res = {
-        type: "array",
-        arraystretch: 1.2,
-        cols: [{
-            type: "align",
-            align: "l",
-            pregap: 0,
-            // TODO(kevinb) get the current style.
-            // For now we use the metrics for TEXT style which is what we were
-            // doing before.  Before attempting to get the current style we
-            // should look at TeX's behavior especially for \over and matrices.
-            postgap: Style.TEXT.metrics.quad
-        }, {
-            type: "align",
-            align: "l",
-            pregap: 0,
-            postgap: 0
-        }]
-    };
-    res = parseArray(context.parser, res);
-    res = new ParseNode("leftright", {
-        body: [res],
-        left: "\\{",
-        right: "."
-    }, context.mode);
-    return res;
-});
-
-// An aligned environment is like the align* environment
-// except it operates within math mode.
-// Note that we assume \nomallineskiplimit to be zero,
-// so that \strut@ is the same as \strut.
-defineEnvironment("aligned", {
-}, function(context) {
-    var res = {
-        type: "array",
-        cols: []
-    };
-    res = parseArray(context.parser, res);
-    var emptyGroup = new ParseNode("ordgroup", [], context.mode);
-    var numCols = 0;
-    res.value.body.forEach(function(row) {
-        var i;
-        for (i = 1; i < row.length; i += 2) {
-            row[i].value.unshift(emptyGroup);
-        }
-        if (numCols < row.length) {
-            numCols = row.length;
-        }
-    });
-    for (var i = 0; i < numCols; ++i) {
-        var align = "r";
-        var pregap = 0;
-        if (i % 2 === 1) {
-            align = "l";
-        } else if (i > 0) {
-            pregap = 2; // one \qquad between columns
-        }
-        res.value.cols[i] = {
-            type: "align",
-            align: align,
-            pregap: pregap,
-            postgap: 0
-        };
-    }
-    return res;
-});
-
-},{"./ParseError":6,"./Style":9,"./parseData":21}],17:[function(require,module,exports){
-/* eslint no-unused-vars:0 */
-
-var Style = require("./Style");
-var cjkRegex = require("./unicodeRegexes").cjkRegex;
-
-/**
- * This file contains metrics regarding fonts and individual symbols. The sigma
- * and xi variables, as well as the metricMap map contain data extracted from
- * TeX, TeX font metrics, and the TTF files. These data are then exposed via the
- * `metrics` variable and the getCharacterMetrics function.
- */
-
-// In TeX, there are actually three sets of dimensions, one for each of
-// textstyle, scriptstyle, and scriptscriptstyle.  These are provided in the
-// the arrays below, in that order.
-//
-// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively.
-// This was determined by running the folllowing script:
-//
-//     latex -interaction=nonstopmode \
-//     '\documentclass{article}\usepackage{amsmath}\begin{document}' \
-//     '$a$ \expandafter\show\the\textfont2' \
-//     '\expandafter\show\the\scriptfont2' \
-//     '\expandafter\show\the\scriptscriptfont2' \
-//     '\stop'
-//
-// The metrics themselves were retreived using the following commands:
-//
-//     tftopl cmsy10
-//     tftopl cmsy7
-//     tftopl cmsy5
-//
-// The output of each of these commands is quite lengthy.  The only part we
-// care about is the FONTDIMEN section. Each value is measured in EMs.
-var sigmas = {
-    slant: [0.250, 0.250, 0.250],       // sigma1
-    space: [0.000, 0.000, 0.000],       // sigma2
-    stretch: [0.000, 0.000, 0.000],     // sigma3
-    shrink: [0.000, 0.000, 0.000],      // sigma4
-    xHeight: [0.431, 0.431, 0.431],     // sigma5
-    quad: [1.000, 1.171, 1.472],        // sigma6
-    extraSpace: [0.000, 0.000, 0.000],  // sigma7
-    num1: [0.677, 0.732, 0.925],        // sigma8
-    num2: [0.394, 0.384, 0.387],        // sigma9
-    num3: [0.444, 0.471, 0.504],        // sigma10
-    denom1: [0.686, 0.752, 1.025],      // sigma11
-    denom2: [0.345, 0.344, 0.532],      // sigma12
-    sup1: [0.413, 0.503, 0.504],        // sigma13
-    sup2: [0.363, 0.431, 0.404],        // sigma14
-    sup3: [0.289, 0.286, 0.294],        // sigma15
-    sub1: [0.150, 0.143, 0.200],        // sigma16
-    sub2: [0.247, 0.286, 0.400],        // sigma17
-    supDrop: [0.386, 0.353, 0.494],     // sigma18
-    subDrop: [0.050, 0.071, 0.100],     // sigma19
-    delim1: [2.390, 1.700, 1.980],      // sigma20
-    delim2: [1.010, 1.157, 1.420],      // sigma21
-    axisHeight: [0.250, 0.250, 0.250]  // sigma22
-};
-
-// These font metrics are extracted from TeX by using
-// \font\a=cmex10
-// \showthe\fontdimenX\a
-// where X is the corresponding variable number. These correspond to the font
-// parameters of the extension fonts (family 3). See the TeXbook, page 441.
-var xi1 = 0;
-var xi2 = 0;
-var xi3 = 0;
-var xi4 = 0;
-var xi5 = 0.431;
-var xi6 = 1;
-var xi7 = 0;
-var xi8 = 0.04;
-var xi9 = 0.111;
-var xi10 = 0.166;
-var xi11 = 0.2;
-var xi12 = 0.6;
-var xi13 = 0.1;
-
-// This value determines how large a pt is, for metrics which are defined in
-// terms of pts.
-// This value is also used in katex.less; if you change it make sure the values
-// match.
-var ptPerEm = 10.0;
-
-// The space between adjacent `|` columns in an array definition. From
-// `\showthe\doublerulesep` in LaTeX.
-var doubleRuleSep = 2.0 / ptPerEm;
-
-/**
- * This is just a mapping from common names to real metrics
- */
-var metrics = {
-    defaultRuleThickness: xi8,
-    bigOpSpacing1: xi9,
-    bigOpSpacing2: xi10,
-    bigOpSpacing3: xi11,
-    bigOpSpacing4: xi12,
-    bigOpSpacing5: xi13,
-    ptPerEm: ptPerEm,
-    doubleRuleSep: doubleRuleSep
-};
-
-// This map contains a mapping from font name and character code to character
-// metrics, including height, depth, italic correction, and skew (kern from the
-// character to the corresponding \skewchar)
-// This map is generated via `make metrics`. It should not be changed manually.
-var metricMap = require("./fontMetricsData");
-
-// These are very rough approximations.  We default to Times New Roman which
-// should have Latin-1 and Cyrillic characters, but may not depending on the
-// operating system.  The metrics do not account for extra height from the
-// accents.  In the case of Cyrillic characters which have both ascenders and
-// descenders we prefer approximations with ascenders, primarily to prevent
-// the fraction bar or root line from intersecting the glyph.
-// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.
-var extraCharacterMap = {
-    // Latin-1
-    'À': 'A',
-    'Á': 'A',
-    'Â': 'A',
-    'Ã': 'A',
-    'Ä': 'A',
-    'Å': 'A',
-    'Æ': 'A',
-    'Ç': 'C',
-    'È': 'E',
-    'É': 'E',
-    'Ê': 'E',
-    'Ë': 'E',
-    'Ì': 'I',
-    'Í': 'I',
-    'Î': 'I',
-    'Ï': 'I',
-    'Ð': 'D',
-    'Ñ': 'N',
-    'Ò': 'O',
-    'Ó': 'O',
-    'Ô': 'O',
-    'Õ': 'O',
-    'Ö': 'O',
-    'Ø': 'O',
-    'Ù': 'U',
-    'Ú': 'U',
-    'Û': 'U',
-    'Ü': 'U',
-    'Ý': 'Y',
-    'Þ': 'o',
-    'ß': 'B',
-    'à': 'a',
-    'á': 'a',
-    'â': 'a',
-    'ã': 'a',
-    'ä': 'a',
-    'å': 'a',
-    'æ': 'a',
-    'ç': 'c',
-    'è': 'e',
-    'é': 'e',
-    'ê': 'e',
-    'ë': 'e',
-    'ì': 'i',
-    'í': 'i',
-    'î': 'i',
-    'ï': 'i',
-    'ð': 'd',
-    'ñ': 'n',
-    'ò': 'o',
-    'ó': 'o',
-    'ô': 'o',
-    'õ': 'o',
-    'ö': 'o',
-    'ø': 'o',
-    'ù': 'u',
-    'ú': 'u',
-    'û': 'u',
-    'ü': 'u',
-    'ý': 'y',
-    'þ': 'o',
-    'ÿ': 'y',
-
-    // Cyrillic
-    'А': 'A',
-    'Б': 'B',
-    'В': 'B',
-    'Г': 'F',
-    'Д': 'A',
-    'Е': 'E',
-    'Ж': 'K',
-    'З': '3',
-    'И': 'N',
-    'Й': 'N',
-    'К': 'K',
-    'Л': 'N',
-    'М': 'M',
-    'Н': 'H',
-    'О': 'O',
-    'П': 'N',
-    'Р': 'P',
-    'С': 'C',
-    'Т': 'T',
-    'У': 'y',
-    'Ф': 'O',
-    'Х': 'X',
-    'Ц': 'U',
-    'Ч': 'h',
-    'Ш': 'W',
-    'Щ': 'W',
-    'Ъ': 'B',
-    'Ы': 'X',
-    'Ь': 'B',
-    'Э': '3',
-    'Ю': 'X',
-    'Я': 'R',
-    'а': 'a',
-    'б': 'b',
-    'в': 'a',
-    'г': 'r',
-    'д': 'y',
-    'е': 'e',
-    'ж': 'm',
-    'з': 'e',
-    'и': 'n',
-    'й': 'n',
-    'к': 'n',
-    'л': 'n',
-    'м': 'm',
-    'н': 'n',
-    'о': 'o',
-    'п': 'n',
-    'р': 'p',
-    'с': 'c',
-    'т': 'o',
-    'у': 'y',
-    'ф': 'b',
-    'х': 'x',
-    'ц': 'n',
-    'ч': 'n',
-    'ш': 'w',
-    'щ': 'w',
-    'ъ': 'a',
-    'ы': 'm',
-    'ь': 'a',
-    'э': 'e',
-    'ю': 'm',
-    'я': 'r'
-};
-
-/**
- * This function is a convenience function for looking up information in the
- * metricMap table. It takes a character as a string, and a style.
- *
- * Note: the `width` property may be undefined if fontMetricsData.js wasn't
- * built using `Make extended_metrics`.
- */
-var getCharacterMetrics = function(character, style) {
-    var ch = character.charCodeAt(0);
-    if (character[0] in extraCharacterMap) {
-        ch = extraCharacterMap[character[0]].charCodeAt(0);
-    } else if (cjkRegex.test(character[0])) {
-        ch = 'M'.charCodeAt(0);
-    }
-    var metrics = metricMap[style][ch];
-    if (metrics) {
-        return {
-            depth: metrics[0],
-            height: metrics[1],
-            italic: metrics[2],
-            skew: metrics[3],
-            width: metrics[4]
-        };
-    }
-};
-
-module.exports = {
-    metrics: metrics,
-    sigmas: sigmas,
-    getCharacterMetrics: getCharacterMetrics
-};
-
-},{"./Style":9,"./fontMetricsData":18,"./unicodeRegexes":24}],18:[function(require,module,exports){
-module.exports = {
-    "AMS-Regular": {
-        "65": [0, 0.68889, 0, 0],
-        "66": [0, 0.68889, 0, 0],
-        "67": [0, 0.68889, 0, 0],
-        "68": [0, 0.68889, 0, 0],
-        "69": [0, 0.68889, 0, 0],
-        "70": [0, 0.68889, 0, 0],
-        "71": [0, 0.68889, 0, 0],
-        "72": [0, 0.68889, 0, 0],
-        "73": [0, 0.68889, 0, 0],
-        "74": [0.16667, 0.68889, 0, 0],
-        "75": [0, 0.68889, 0, 0],
-        "76": [0, 0.68889, 0, 0],
-        "77": [0, 0.68889, 0, 0],
-        "78": [0, 0.68889, 0, 0],
-        "79": [0.16667, 0.68889, 0, 0],
-        "80": [0, 0.68889, 0, 0],
-        "81": [0.16667, 0.68889, 0, 0],
-        "82": [0, 0.68889, 0, 0],
-        "83": [0, 0.68889, 0, 0],
-        "84": [0, 0.68889, 0, 0],
-        "85": [0, 0.68889, 0, 0],
-        "86": [0, 0.68889, 0, 0],
-        "87": [0, 0.68889, 0, 0],
-        "88": [0, 0.68889, 0, 0],
-        "89": [0, 0.68889, 0, 0],
-        "90": [0, 0.68889, 0, 0],
-        "107": [0, 0.68889, 0, 0],
-        "165": [0, 0.675, 0.025, 0],
-        "174": [0.15559, 0.69224, 0, 0],
-        "240": [0, 0.68889, 0, 0],
-        "295": [0, 0.68889, 0, 0],
-        "710": [0, 0.825, 0, 0],
-        "732": [0, 0.9, 0, 0],
-        "770": [0, 0.825, 0, 0],
-        "771": [0, 0.9, 0, 0],
-        "989": [0.08167, 0.58167, 0, 0],
-        "1008": [0, 0.43056, 0.04028, 0],
-        "8245": [0, 0.54986, 0, 0],
-        "8463": [0, 0.68889, 0, 0],
-        "8487": [0, 0.68889, 0, 0],
-        "8498": [0, 0.68889, 0, 0],
-        "8502": [0, 0.68889, 0, 0],
-        "8503": [0, 0.68889, 0, 0],
-        "8504": [0, 0.68889, 0, 0],
-        "8513": [0, 0.68889, 0, 0],
-        "8592": [-0.03598, 0.46402, 0, 0],
-        "8594": [-0.03598, 0.46402, 0, 0],
-        "8602": [-0.13313, 0.36687, 0, 0],
-        "8603": [-0.13313, 0.36687, 0, 0],
-        "8606": [0.01354, 0.52239, 0, 0],
-        "8608": [0.01354, 0.52239, 0, 0],
-        "8610": [0.01354, 0.52239, 0, 0],
-        "8611": [0.01354, 0.52239, 0, 0],
-        "8619": [0, 0.54986, 0, 0],
-        "8620": [0, 0.54986, 0, 0],
-        "8621": [-0.13313, 0.37788, 0, 0],
-        "8622": [-0.13313, 0.36687, 0, 0],
-        "8624": [0, 0.69224, 0, 0],
-        "8625": [0, 0.69224, 0, 0],
-        "8630": [0, 0.43056, 0, 0],
-        "8631": [0, 0.43056, 0, 0],
-        "8634": [0.08198, 0.58198, 0, 0],
-        "8635": [0.08198, 0.58198, 0, 0],
-        "8638": [0.19444, 0.69224, 0, 0],
-        "8639": [0.19444, 0.69224, 0, 0],
-        "8642": [0.19444, 0.69224, 0, 0],
-        "8643": [0.19444, 0.69224, 0, 0],
-        "8644": [0.1808, 0.675, 0, 0],
-        "8646": [0.1808, 0.675, 0, 0],
-        "8647": [0.1808, 0.675, 0, 0],
-        "8648": [0.19444, 0.69224, 0, 0],
-        "8649": [0.1808, 0.675, 0, 0],
-        "8650": [0.19444, 0.69224, 0, 0],
-        "8651": [0.01354, 0.52239, 0, 0],
-        "8652": [0.01354, 0.52239, 0, 0],
-        "8653": [-0.13313, 0.36687, 0, 0],
-        "8654": [-0.13313, 0.36687, 0, 0],
-        "8655": [-0.13313, 0.36687, 0, 0],
-        "8666": [0.13667, 0.63667, 0, 0],
-        "8667": [0.13667, 0.63667, 0, 0],
-        "8669": [-0.13313, 0.37788, 0, 0],
-        "8672": [-0.064, 0.437, 0, 0],
-        "8674": [-0.064, 0.437, 0, 0],
-        "8705": [0, 0.825, 0, 0],
-        "8708": [0, 0.68889, 0, 0],
-        "8709": [0.08167, 0.58167, 0, 0],
-        "8717": [0, 0.43056, 0, 0],
-        "8722": [-0.03598, 0.46402, 0, 0],
-        "8724": [0.08198, 0.69224, 0, 0],
-        "8726": [0.08167, 0.58167, 0, 0],
-        "8733": [0, 0.69224, 0, 0],
-        "8736": [0, 0.69224, 0, 0],
-        "8737": [0, 0.69224, 0, 0],
-        "8738": [0.03517, 0.52239, 0, 0],
-        "8739": [0.08167, 0.58167, 0, 0],
-        "8740": [0.25142, 0.74111, 0, 0],
-        "8741": [0.08167, 0.58167, 0, 0],
-        "8742": [0.25142, 0.74111, 0, 0],
-        "8756": [0, 0.69224, 0, 0],
-        "8757": [0, 0.69224, 0, 0],
-        "8764": [-0.13313, 0.36687, 0, 0],
-        "8765": [-0.13313, 0.37788, 0, 0],
-        "8769": [-0.13313, 0.36687, 0, 0],
-        "8770": [-0.03625, 0.46375, 0, 0],
-        "8774": [0.30274, 0.79383, 0, 0],
-        "8776": [-0.01688, 0.48312, 0, 0],
-        "8778": [0.08167, 0.58167, 0, 0],
-        "8782": [0.06062, 0.54986, 0, 0],
-        "8783": [0.06062, 0.54986, 0, 0],
-        "8785": [0.08198, 0.58198, 0, 0],
-        "8786": [0.08198, 0.58198, 0, 0],
-        "8787": [0.08198, 0.58198, 0, 0],
-        "8790": [0, 0.69224, 0, 0],
-        "8791": [0.22958, 0.72958, 0, 0],
-        "8796": [0.08198, 0.91667, 0, 0],
-        "8806": [0.25583, 0.75583, 0, 0],
-        "8807": [0.25583, 0.75583, 0, 0],
-        "8808": [0.25142, 0.75726, 0, 0],
-        "8809": [0.25142, 0.75726, 0, 0],
-        "8812": [0.25583, 0.75583, 0, 0],
-        "8814": [0.20576, 0.70576, 0, 0],
-        "8815": [0.20576, 0.70576, 0, 0],
-        "8816": [0.30274, 0.79383, 0, 0],
-        "8817": [0.30274, 0.79383, 0, 0],
-        "8818": [0.22958, 0.72958, 0, 0],
-        "8819": [0.22958, 0.72958, 0, 0],
-        "8822": [0.1808, 0.675, 0, 0],
-        "8823": [0.1808, 0.675, 0, 0],
-        "8828": [0.13667, 0.63667, 0, 0],
-        "8829": [0.13667, 0.63667, 0, 0],
-        "8830": [0.22958, 0.72958, 0, 0],
-        "8831": [0.22958, 0.72958, 0, 0],
-        "8832": [0.20576, 0.70576, 0, 0],
-        "8833": [0.20576, 0.70576, 0, 0],
-        "8840": [0.30274, 0.79383, 0, 0],
-        "8841": [0.30274, 0.79383, 0, 0],
-        "8842": [0.13597, 0.63597, 0, 0],
-        "8843": [0.13597, 0.63597, 0, 0],
-        "8847": [0.03517, 0.54986, 0, 0],
-        "8848": [0.03517, 0.54986, 0, 0],
-        "8858": [0.08198, 0.58198, 0, 0],
-        "8859": [0.08198, 0.58198, 0, 0],
-        "8861": [0.08198, 0.58198, 0, 0],
-        "8862": [0, 0.675, 0, 0],
-        "8863": [0, 0.675, 0, 0],
-        "8864": [0, 0.675, 0, 0],
-        "8865": [0, 0.675, 0, 0],
-        "8872": [0, 0.69224, 0, 0],
-        "8873": [0, 0.69224, 0, 0],
-        "8874": [0, 0.69224, 0, 0],
-        "8876": [0, 0.68889, 0, 0],
-        "8877": [0, 0.68889, 0, 0],
-        "8878": [0, 0.68889, 0, 0],
-        "8879": [0, 0.68889, 0, 0],
-        "8882": [0.03517, 0.54986, 0, 0],
-        "8883": [0.03517, 0.54986, 0, 0],
-        "8884": [0.13667, 0.63667, 0, 0],
-        "8885": [0.13667, 0.63667, 0, 0],
-        "8888": [0, 0.54986, 0, 0],
-        "8890": [0.19444, 0.43056, 0, 0],
-        "8891": [0.19444, 0.69224, 0, 0],
-        "8892": [0.19444, 0.69224, 0, 0],
-        "8901": [0, 0.54986, 0, 0],
-        "8903": [0.08167, 0.58167, 0, 0],
-        "8905": [0.08167, 0.58167, 0, 0],
-        "8906": [0.08167, 0.58167, 0, 0],
-        "8907": [0, 0.69224, 0, 0],
-        "8908": [0, 0.69224, 0, 0],
-        "8909": [-0.03598, 0.46402, 0, 0],
-        "8910": [0, 0.54986, 0, 0],
-        "8911": [0, 0.54986, 0, 0],
-        "8912": [0.03517, 0.54986, 0, 0],
-        "8913": [0.03517, 0.54986, 0, 0],
-        "8914": [0, 0.54986, 0, 0],
-        "8915": [0, 0.54986, 0, 0],
-        "8916": [0, 0.69224, 0, 0],
-        "8918": [0.0391, 0.5391, 0, 0],
-        "8919": [0.0391, 0.5391, 0, 0],
-        "8920": [0.03517, 0.54986, 0, 0],
-        "8921": [0.03517, 0.54986, 0, 0],
-        "8922": [0.38569, 0.88569, 0, 0],
-        "8923": [0.38569, 0.88569, 0, 0],
-        "8926": [0.13667, 0.63667, 0, 0],
-        "8927": [0.13667, 0.63667, 0, 0],
-        "8928": [0.30274, 0.79383, 0, 0],
-        "8929": [0.30274, 0.79383, 0, 0],
-        "8934": [0.23222, 0.74111, 0, 0],
-        "8935": [0.23222, 0.74111, 0, 0],
-        "8936": [0.23222, 0.74111, 0, 0],
-        "8937": [0.23222, 0.74111, 0, 0],
-        "8938": [0.20576, 0.70576, 0, 0],
-        "8939": [0.20576, 0.70576, 0, 0],
-        "8940": [0.30274, 0.79383, 0, 0],
-        "8941": [0.30274, 0.79383, 0, 0],
-        "8994": [0.19444, 0.69224, 0, 0],
-        "8995": [0.19444, 0.69224, 0, 0],
-        "9416": [0.15559, 0.69224, 0, 0],
-        "9484": [0, 0.69224, 0, 0],
-        "9488": [0, 0.69224, 0, 0],
-        "9492": [0, 0.37788, 0, 0],
-        "9496": [0, 0.37788, 0, 0],
-        "9585": [0.19444, 0.68889, 0, 0],
-        "9586": [0.19444, 0.74111, 0, 0],
-        "9632": [0, 0.675, 0, 0],
-        "9633": [0, 0.675, 0, 0],
-        "9650": [0, 0.54986, 0, 0],
-        "9651": [0, 0.54986, 0, 0],
-        "9654": [0.03517, 0.54986, 0, 0],
-        "9660": [0, 0.54986, 0, 0],
-        "9661": [0, 0.54986, 0, 0],
-        "9664": [0.03517, 0.54986, 0, 0],
-        "9674": [0.11111, 0.69224, 0, 0],
-        "9733": [0.19444, 0.69224, 0, 0],
-        "10003": [0, 0.69224, 0, 0],
-        "10016": [0, 0.69224, 0, 0],
-        "10731": [0.11111, 0.69224, 0, 0],
-        "10846": [0.19444, 0.75583, 0, 0],
-        "10877": [0.13667, 0.63667, 0, 0],
-        "10878": [0.13667, 0.63667, 0, 0],
-        "10885": [0.25583, 0.75583, 0, 0],
-        "10886": [0.25583, 0.75583, 0, 0],
-        "10887": [0.13597, 0.63597, 0, 0],
-        "10888": [0.13597, 0.63597, 0, 0],
-        "10889": [0.26167, 0.75726, 0, 0],
-        "10890": [0.26167, 0.75726, 0, 0],
-        "10891": [0.48256, 0.98256, 0, 0],
-        "10892": [0.48256, 0.98256, 0, 0],
-        "10901": [0.13667, 0.63667, 0, 0],
-        "10902": [0.13667, 0.63667, 0, 0],
-        "10933": [0.25142, 0.75726, 0, 0],
-        "10934": [0.25142, 0.75726, 0, 0],
-        "10935": [0.26167, 0.75726, 0, 0],
-        "10936": [0.26167, 0.75726, 0, 0],
-        "10937": [0.26167, 0.75726, 0, 0],
-        "10938": [0.26167, 0.75726, 0, 0],
-        "10949": [0.25583, 0.75583, 0, 0],
-        "10950": [0.25583, 0.75583, 0, 0],
-        "10955": [0.28481, 0.79383, 0, 0],
-        "10956": [0.28481, 0.79383, 0, 0],
-        "57350": [0.08167, 0.58167, 0, 0],
-        "57351": [0.08167, 0.58167, 0, 0],
-        "57352": [0.08167, 0.58167, 0, 0],
-        "57353": [0, 0.43056, 0.04028, 0],
-        "57356": [0.25142, 0.75726, 0, 0],
-        "57357": [0.25142, 0.75726, 0, 0],
-        "57358": [0.41951, 0.91951, 0, 0],
-        "57359": [0.30274, 0.79383, 0, 0],
-        "57360": [0.30274, 0.79383, 0, 0],
-        "57361": [0.41951, 0.91951, 0, 0],
-        "57366": [0.25142, 0.75726, 0, 0],
-        "57367": [0.25142, 0.75726, 0, 0],
-        "57368": [0.25142, 0.75726, 0, 0],
-        "57369": [0.25142, 0.75726, 0, 0],
-        "57370": [0.13597, 0.63597, 0, 0],
-        "57371": [0.13597, 0.63597, 0, 0]
-    },
-    "Caligraphic-Regular": {
-        "48": [0, 0.43056, 0, 0],
-        "49": [0, 0.43056, 0, 0],
-        "50": [0, 0.43056, 0, 0],
-        "51": [0.19444, 0.43056, 0, 0],
-        "52": [0.19444, 0.43056, 0, 0],
-        "53": [0.19444, 0.43056, 0, 0],
-        "54": [0, 0.64444, 0, 0],
-        "55": [0.19444, 0.43056, 0, 0],
-        "56": [0, 0.64444, 0, 0],
-        "57": [0.19444, 0.43056, 0, 0],
-        "65": [0, 0.68333, 0, 0.19445],
-        "66": [0, 0.68333, 0.03041, 0.13889],
-        "67": [0, 0.68333, 0.05834, 0.13889],
-        "68": [0, 0.68333, 0.02778, 0.08334],
-        "69": [0, 0.68333, 0.08944, 0.11111],
-        "70": [0, 0.68333, 0.09931, 0.11111],
-        "71": [0.09722, 0.68333, 0.0593, 0.11111],
-        "72": [0, 0.68333, 0.00965, 0.11111],
-        "73": [0, 0.68333, 0.07382, 0],
-        "74": [0.09722, 0.68333, 0.18472, 0.16667],
-        "75": [0, 0.68333, 0.01445, 0.05556],
-        "76": [0, 0.68333, 0, 0.13889],
-        "77": [0, 0.68333, 0, 0.13889],
-        "78": [0, 0.68333, 0.14736, 0.08334],
-        "79": [0, 0.68333, 0.02778, 0.11111],
-        "80": [0, 0.68333, 0.08222, 0.08334],
-        "81": [0.09722, 0.68333, 0, 0.11111],
-        "82": [0, 0.68333, 0, 0.08334],
-        "83": [0, 0.68333, 0.075, 0.13889],
-        "84": [0, 0.68333, 0.25417, 0],
-        "85": [0, 0.68333, 0.09931, 0.08334],
-        "86": [0, 0.68333, 0.08222, 0],
-        "87": [0, 0.68333, 0.08222, 0.08334],
-        "88": [0, 0.68333, 0.14643, 0.13889],
-        "89": [0.09722, 0.68333, 0.08222, 0.08334],
-        "90": [0, 0.68333, 0.07944, 0.13889]
-    },
-    "Fraktur-Regular": {
-        "33": [0, 0.69141, 0, 0],
-        "34": [0, 0.69141, 0, 0],
-        "38": [0, 0.69141, 0, 0],
-        "39": [0, 0.69141, 0, 0],
-        "40": [0.24982, 0.74947, 0, 0],
-        "41": [0.24982, 0.74947, 0, 0],
-        "42": [0, 0.62119, 0, 0],
-        "43": [0.08319, 0.58283, 0, 0],
-        "44": [0, 0.10803, 0, 0],
-        "45": [0.08319, 0.58283, 0, 0],
-        "46": [0, 0.10803, 0, 0],
-        "47": [0.24982, 0.74947, 0, 0],
-        "48": [0, 0.47534, 0, 0],
-        "49": [0, 0.47534, 0, 0],
-        "50": [0, 0.47534, 0, 0],
-        "51": [0.18906, 0.47534, 0, 0],
-        "52": [0.18906, 0.47534, 0, 0],
-        "53": [0.18906, 0.47534, 0, 0],
-        "54": [0, 0.69141, 0, 0],
-        "55": [0.18906, 0.47534, 0, 0],
-        "56": [0, 0.69141, 0, 0],
-        "57": [0.18906, 0.47534, 0, 0],
-        "58": [0, 0.47534, 0, 0],
-        "59": [0.12604, 0.47534, 0, 0],
-        "61": [-0.13099, 0.36866, 0, 0],
-        "63": [0, 0.69141, 0, 0],
-        "65": [0, 0.69141, 0, 0],
-        "66": [0, 0.69141, 0, 0],
-        "67": [0, 0.69141, 0, 0],
-        "68": [0, 0.69141, 0, 0],
-        "69": [0, 0.69141, 0, 0],
-        "70": [0.12604, 0.69141, 0, 0],
-        "71": [0, 0.69141, 0, 0],
-        "72": [0.06302, 0.69141, 0, 0],
-        "73": [0, 0.69141, 0, 0],
-        "74": [0.12604, 0.69141, 0, 0],
-        "75": [0, 0.69141, 0, 0],
-        "76": [0, 0.69141, 0, 0],
-        "77": [0, 0.69141, 0, 0],
-        "78": [0, 0.69141, 0, 0],
-        "79": [0, 0.69141, 0, 0],
-        "80": [0.18906, 0.69141, 0, 0],
-        "81": [0.03781, 0.69141, 0, 0],
-        "82": [0, 0.69141, 0, 0],
-        "83": [0, 0.69141, 0, 0],
-        "84": [0, 0.69141, 0, 0],
-        "85": [0, 0.69141, 0, 0],
-        "86": [0, 0.69141, 0, 0],
-        "87": [0, 0.69141, 0, 0],
-        "88": [0, 0.69141, 0, 0],
-        "89": [0.18906, 0.69141, 0, 0],
-        "90": [0.12604, 0.69141, 0, 0],
-        "91": [0.24982, 0.74947, 0, 0],
-        "93": [0.24982, 0.74947, 0, 0],
-        "94": [0, 0.69141, 0, 0],
-        "97": [0, 0.47534, 0, 0],
-        "98": [0, 0.69141, 0, 0],
-        "99": [0, 0.47534, 0, 0],
-        "100": [0, 0.62119, 0, 0],
-        "101": [0, 0.47534, 0, 0],
-        "102": [0.18906, 0.69141, 0, 0],
-        "103": [0.18906, 0.47534, 0, 0],
-        "104": [0.18906, 0.69141, 0, 0],
-        "105": [0, 0.69141, 0, 0],
-        "106": [0, 0.69141, 0, 0],
-        "107": [0, 0.69141, 0, 0],
-        "108": [0, 0.69141, 0, 0],
-        "109": [0, 0.47534, 0, 0],
-        "110": [0, 0.47534, 0, 0],
-        "111": [0, 0.47534, 0, 0],
-        "112": [0.18906, 0.52396, 0, 0],
-        "113": [0.18906, 0.47534, 0, 0],
-        "114": [0, 0.47534, 0, 0],
-        "115": [0, 0.47534, 0, 0],
-        "116": [0, 0.62119, 0, 0],
-        "117": [0, 0.47534, 0, 0],
-        "118": [0, 0.52396, 0, 0],
-        "119": [0, 0.52396, 0, 0],
-        "120": [0.18906, 0.47534, 0, 0],
-        "121": [0.18906, 0.47534, 0, 0],
-        "122": [0.18906, 0.47534, 0, 0],
-        "8216": [0, 0.69141, 0, 0],
-        "8217": [0, 0.69141, 0, 0],
-        "58112": [0, 0.62119, 0, 0],
-        "58113": [0, 0.62119, 0, 0],
-        "58114": [0.18906, 0.69141, 0, 0],
-        "58115": [0.18906, 0.69141, 0, 0],
-        "58116": [0.18906, 0.47534, 0, 0],
-        "58117": [0, 0.69141, 0, 0],
-        "58118": [0, 0.62119, 0, 0],
-        "58119": [0, 0.47534, 0, 0]
-    },
-    "Main-Bold": {
-        "33": [0, 0.69444, 0, 0],
-        "34": [0, 0.69444, 0, 0],
-        "35": [0.19444, 0.69444, 0, 0],
-        "36": [0.05556, 0.75, 0, 0],
-        "37": [0.05556, 0.75, 0, 0],
-        "38": [0, 0.69444, 0, 0],
-        "39": [0, 0.69444, 0, 0],
-        "40": [0.25, 0.75, 0, 0],
-        "41": [0.25, 0.75, 0, 0],
-        "42": [0, 0.75, 0, 0],
-        "43": [0.13333, 0.63333, 0, 0],
-        "44": [0.19444, 0.15556, 0, 0],
-        "45": [0, 0.44444, 0, 0],
-        "46": [0, 0.15556, 0, 0],
-        "47": [0.25, 0.75, 0, 0],
-        "48": [0, 0.64444, 0, 0],
-        "49": [0, 0.64444, 0, 0],
-        "50": [0, 0.64444, 0, 0],
-        "51": [0, 0.64444, 0, 0],
-        "52": [0, 0.64444, 0, 0],
-        "53": [0, 0.64444, 0, 0],
-        "54": [0, 0.64444, 0, 0],
-        "55": [0, 0.64444, 0, 0],
-        "56": [0, 0.64444, 0, 0],
-        "57": [0, 0.64444, 0, 0],
-        "58": [0, 0.44444, 0, 0],
-        "59": [0.19444, 0.44444, 0, 0],
-        "60": [0.08556, 0.58556, 0, 0],
-        "61": [-0.10889, 0.39111, 0, 0],
-        "62": [0.08556, 0.58556, 0, 0],
-        "63": [0, 0.69444, 0, 0],
-        "64": [0, 0.69444, 0, 0],
-        "65": [0, 0.68611, 0, 0],
-        "66": [0, 0.68611, 0, 0],
-        "67": [0, 0.68611, 0, 0],
-        "68": [0, 0.68611, 0, 0],
-        "69": [0, 0.68611, 0, 0],
-        "70": [0, 0.68611, 0, 0],
-        "71": [0, 0.68611, 0, 0],
-        "72": [0, 0.68611, 0, 0],
-        "73": [0, 0.68611, 0, 0],
-        "74": [0, 0.68611, 0, 0],
-        "75": [0, 0.68611, 0, 0],
-        "76": [0, 0.68611, 0, 0],
-        "77": [0, 0.68611, 0, 0],
-        "78": [0, 0.68611, 0, 0],
-        "79": [0, 0.68611, 0, 0],
-        "80": [0, 0.68611, 0, 0],
-        "81": [0.19444, 0.68611, 0, 0],
-        "82": [0, 0.68611, 0, 0],
-        "83": [0, 0.68611, 0, 0],
-        "84": [0, 0.68611, 0, 0],
-        "85": [0, 0.68611, 0, 0],
-        "86": [0, 0.68611, 0.01597, 0],
-        "87": [0, 0.68611, 0.01597, 0],
-        "88": [0, 0.68611, 0, 0],
-        "89": [0, 0.68611, 0.02875, 0],
-        "90": [0, 0.68611, 0, 0],
-        "91": [0.25, 0.75, 0, 0],
-        "92": [0.25, 0.75, 0, 0],
-        "93": [0.25, 0.75, 0, 0],
-        "94": [0, 0.69444, 0, 0],
-        "95": [0.31, 0.13444, 0.03194, 0],
-        "96": [0, 0.69444, 0, 0],
-        "97": [0, 0.44444, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.44444, 0, 0],
-        "100": [0, 0.69444, 0, 0],
-        "101": [0, 0.44444, 0, 0],
-        "102": [0, 0.69444, 0.10903, 0],
-        "103": [0.19444, 0.44444, 0.01597, 0],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.69444, 0, 0],
-        "106": [0.19444, 0.69444, 0, 0],
-        "107": [0, 0.69444, 0, 0],
-        "108": [0, 0.69444, 0, 0],
-        "109": [0, 0.44444, 0, 0],
-        "110": [0, 0.44444, 0, 0],
-        "111": [0, 0.44444, 0, 0],
-        "112": [0.19444, 0.44444, 0, 0],
-        "113": [0.19444, 0.44444, 0, 0],
-        "114": [0, 0.44444, 0, 0],
-        "115": [0, 0.44444, 0, 0],
-        "116": [0, 0.63492, 0, 0],
-        "117": [0, 0.44444, 0, 0],
-        "118": [0, 0.44444, 0.01597, 0],
-        "119": [0, 0.44444, 0.01597, 0],
-        "120": [0, 0.44444, 0, 0],
-        "121": [0.19444, 0.44444, 0.01597, 0],
-        "122": [0, 0.44444, 0, 0],
-        "123": [0.25, 0.75, 0, 0],
-        "124": [0.25, 0.75, 0, 0],
-        "125": [0.25, 0.75, 0, 0],
-        "126": [0.35, 0.34444, 0, 0],
-        "168": [0, 0.69444, 0, 0],
-        "172": [0, 0.44444, 0, 0],
-        "175": [0, 0.59611, 0, 0],
-        "176": [0, 0.69444, 0, 0],
-        "177": [0.13333, 0.63333, 0, 0],
-        "180": [0, 0.69444, 0, 0],
-        "215": [0.13333, 0.63333, 0, 0],
-        "247": [0.13333, 0.63333, 0, 0],
-        "305": [0, 0.44444, 0, 0],
-        "567": [0.19444, 0.44444, 0, 0],
-        "710": [0, 0.69444, 0, 0],
-        "711": [0, 0.63194, 0, 0],
-        "713": [0, 0.59611, 0, 0],
-        "714": [0, 0.69444, 0, 0],
-        "715": [0, 0.69444, 0, 0],
-        "728": [0, 0.69444, 0, 0],
-        "729": [0, 0.69444, 0, 0],
-        "730": [0, 0.69444, 0, 0],
-        "732": [0, 0.69444, 0, 0],
-        "768": [0, 0.69444, 0, 0],
-        "769": [0, 0.69444, 0, 0],
-        "770": [0, 0.69444, 0, 0],
-        "771": [0, 0.69444, 0, 0],
-        "772": [0, 0.59611, 0, 0],
-        "774": [0, 0.69444, 0, 0],
-        "775": [0, 0.69444, 0, 0],
-        "776": [0, 0.69444, 0, 0],
-        "778": [0, 0.69444, 0, 0],
-        "779": [0, 0.69444, 0, 0],
-        "780": [0, 0.63194, 0, 0],
-        "824": [0.19444, 0.69444, 0, 0],
-        "915": [0, 0.68611, 0, 0],
-        "916": [0, 0.68611, 0, 0],
-        "920": [0, 0.68611, 0, 0],
-        "923": [0, 0.68611, 0, 0],
-        "926": [0, 0.68611, 0, 0],
-        "928": [0, 0.68611, 0, 0],
-        "931": [0, 0.68611, 0, 0],
-        "933": [0, 0.68611, 0, 0],
-        "934": [0, 0.68611, 0, 0],
-        "936": [0, 0.68611, 0, 0],
-        "937": [0, 0.68611, 0, 0],
-        "8211": [0, 0.44444, 0.03194, 0],
-        "8212": [0, 0.44444, 0.03194, 0],
-        "8216": [0, 0.69444, 0, 0],
-        "8217": [0, 0.69444, 0, 0],
-        "8220": [0, 0.69444, 0, 0],
-        "8221": [0, 0.69444, 0, 0],
-        "8224": [0.19444, 0.69444, 0, 0],
-        "8225": [0.19444, 0.69444, 0, 0],
-        "8242": [0, 0.55556, 0, 0],
-        "8407": [0, 0.72444, 0.15486, 0],
-        "8463": [0, 0.69444, 0, 0],
-        "8465": [0, 0.69444, 0, 0],
-        "8467": [0, 0.69444, 0, 0],
-        "8472": [0.19444, 0.44444, 0, 0],
-        "8476": [0, 0.69444, 0, 0],
-        "8501": [0, 0.69444, 0, 0],
-        "8592": [-0.10889, 0.39111, 0, 0],
-        "8593": [0.19444, 0.69444, 0, 0],
-        "8594": [-0.10889, 0.39111, 0, 0],
-        "8595": [0.19444, 0.69444, 0, 0],
-        "8596": [-0.10889, 0.39111, 0, 0],
-        "8597": [0.25, 0.75, 0, 0],
-        "8598": [0.19444, 0.69444, 0, 0],
-        "8599": [0.19444, 0.69444, 0, 0],
-        "8600": [0.19444, 0.69444, 0, 0],
-        "8601": [0.19444, 0.69444, 0, 0],
-        "8636": [-0.10889, 0.39111, 0, 0],
-        "8637": [-0.10889, 0.39111, 0, 0],
-        "8640": [-0.10889, 0.39111, 0, 0],
-        "8641": [-0.10889, 0.39111, 0, 0],
-        "8656": [-0.10889, 0.39111, 0, 0],
-        "8657": [0.19444, 0.69444, 0, 0],
-        "8658": [-0.10889, 0.39111, 0, 0],
-        "8659": [0.19444, 0.69444, 0, 0],
-        "8660": [-0.10889, 0.39111, 0, 0],
-        "8661": [0.25, 0.75, 0, 0],
-        "8704": [0, 0.69444, 0, 0],
-        "8706": [0, 0.69444, 0.06389, 0],
-        "8707": [0, 0.69444, 0, 0],
-        "8709": [0.05556, 0.75, 0, 0],
-        "8711": [0, 0.68611, 0, 0],
-        "8712": [0.08556, 0.58556, 0, 0],
-        "8715": [0.08556, 0.58556, 0, 0],
-        "8722": [0.13333, 0.63333, 0, 0],
-        "8723": [0.13333, 0.63333, 0, 0],
-        "8725": [0.25, 0.75, 0, 0],
-        "8726": [0.25, 0.75, 0, 0],
-        "8727": [-0.02778, 0.47222, 0, 0],
-        "8728": [-0.02639, 0.47361, 0, 0],
-        "8729": [-0.02639, 0.47361, 0, 0],
-        "8730": [0.18, 0.82, 0, 0],
-        "8733": [0, 0.44444, 0, 0],
-        "8734": [0, 0.44444, 0, 0],
-        "8736": [0, 0.69224, 0, 0],
-        "8739": [0.25, 0.75, 0, 0],
-        "8741": [0.25, 0.75, 0, 0],
-        "8743": [0, 0.55556, 0, 0],
-        "8744": [0, 0.55556, 0, 0],
-        "8745": [0, 0.55556, 0, 0],
-        "8746": [0, 0.55556, 0, 0],
-        "8747": [0.19444, 0.69444, 0.12778, 0],
-        "8764": [-0.10889, 0.39111, 0, 0],
-        "8768": [0.19444, 0.69444, 0, 0],
-        "8771": [0.00222, 0.50222, 0, 0],
-        "8776": [0.02444, 0.52444, 0, 0],
-        "8781": [0.00222, 0.50222, 0, 0],
-        "8801": [0.00222, 0.50222, 0, 0],
-        "8804": [0.19667, 0.69667, 0, 0],
-        "8805": [0.19667, 0.69667, 0, 0],
-        "8810": [0.08556, 0.58556, 0, 0],
-        "8811": [0.08556, 0.58556, 0, 0],
-        "8826": [0.08556, 0.58556, 0, 0],
-        "8827": [0.08556, 0.58556, 0, 0],
-        "8834": [0.08556, 0.58556, 0, 0],
-        "8835": [0.08556, 0.58556, 0, 0],
-        "8838": [0.19667, 0.69667, 0, 0],
-        "8839": [0.19667, 0.69667, 0, 0],
-        "8846": [0, 0.55556, 0, 0],
-        "8849": [0.19667, 0.69667, 0, 0],
-        "8850": [0.19667, 0.69667, 0, 0],
-        "8851": [0, 0.55556, 0, 0],
-        "8852": [0, 0.55556, 0, 0],
-        "8853": [0.13333, 0.63333, 0, 0],
-        "8854": [0.13333, 0.63333, 0, 0],
-        "8855": [0.13333, 0.63333, 0, 0],
-        "8856": [0.13333, 0.63333, 0, 0],
-        "8857": [0.13333, 0.63333, 0, 0],
-        "8866": [0, 0.69444, 0, 0],
-        "8867": [0, 0.69444, 0, 0],
-        "8868": [0, 0.69444, 0, 0],
-        "8869": [0, 0.69444, 0, 0],
-        "8900": [-0.02639, 0.47361, 0, 0],
-        "8901": [-0.02639, 0.47361, 0, 0],
-        "8902": [-0.02778, 0.47222, 0, 0],
-        "8968": [0.25, 0.75, 0, 0],
-        "8969": [0.25, 0.75, 0, 0],
-        "8970": [0.25, 0.75, 0, 0],
-        "8971": [0.25, 0.75, 0, 0],
-        "8994": [-0.13889, 0.36111, 0, 0],
-        "8995": [-0.13889, 0.36111, 0, 0],
-        "9651": [0.19444, 0.69444, 0, 0],
-        "9657": [-0.02778, 0.47222, 0, 0],
-        "9661": [0.19444, 0.69444, 0, 0],
-        "9667": [-0.02778, 0.47222, 0, 0],
-        "9711": [0.19444, 0.69444, 0, 0],
-        "9824": [0.12963, 0.69444, 0, 0],
-        "9825": [0.12963, 0.69444, 0, 0],
-        "9826": [0.12963, 0.69444, 0, 0],
-        "9827": [0.12963, 0.69444, 0, 0],
-        "9837": [0, 0.75, 0, 0],
-        "9838": [0.19444, 0.69444, 0, 0],
-        "9839": [0.19444, 0.69444, 0, 0],
-        "10216": [0.25, 0.75, 0, 0],
-        "10217": [0.25, 0.75, 0, 0],
-        "10815": [0, 0.68611, 0, 0],
-        "10927": [0.19667, 0.69667, 0, 0],
-        "10928": [0.19667, 0.69667, 0, 0]
-    },
-    "Main-Italic": {
-        "33": [0, 0.69444, 0.12417, 0],
-        "34": [0, 0.69444, 0.06961, 0],
-        "35": [0.19444, 0.69444, 0.06616, 0],
-        "37": [0.05556, 0.75, 0.13639, 0],
-        "38": [0, 0.69444, 0.09694, 0],
-        "39": [0, 0.69444, 0.12417, 0],
-        "40": [0.25, 0.75, 0.16194, 0],
-        "41": [0.25, 0.75, 0.03694, 0],
-        "42": [0, 0.75, 0.14917, 0],
-        "43": [0.05667, 0.56167, 0.03694, 0],
-        "44": [0.19444, 0.10556, 0, 0],
-        "45": [0, 0.43056, 0.02826, 0],
-        "46": [0, 0.10556, 0, 0],
-        "47": [0.25, 0.75, 0.16194, 0],
-        "48": [0, 0.64444, 0.13556, 0],
-        "49": [0, 0.64444, 0.13556, 0],
-        "50": [0, 0.64444, 0.13556, 0],
-        "51": [0, 0.64444, 0.13556, 0],
-        "52": [0.19444, 0.64444, 0.13556, 0],
-        "53": [0, 0.64444, 0.13556, 0],
-        "54": [0, 0.64444, 0.13556, 0],
-        "55": [0.19444, 0.64444, 0.13556, 0],
-        "56": [0, 0.64444, 0.13556, 0],
-        "57": [0, 0.64444, 0.13556, 0],
-        "58": [0, 0.43056, 0.0582, 0],
-        "59": [0.19444, 0.43056, 0.0582, 0],
-        "61": [-0.13313, 0.36687, 0.06616, 0],
-        "63": [0, 0.69444, 0.1225, 0],
-        "64": [0, 0.69444, 0.09597, 0],
-        "65": [0, 0.68333, 0, 0],
-        "66": [0, 0.68333, 0.10257, 0],
-        "67": [0, 0.68333, 0.14528, 0],
-        "68": [0, 0.68333, 0.09403, 0],
-        "69": [0, 0.68333, 0.12028, 0],
-        "70": [0, 0.68333, 0.13305, 0],
-        "71": [0, 0.68333, 0.08722, 0],
-        "72": [0, 0.68333, 0.16389, 0],
-        "73": [0, 0.68333, 0.15806, 0],
-        "74": [0, 0.68333, 0.14028, 0],
-        "75": [0, 0.68333, 0.14528, 0],
-        "76": [0, 0.68333, 0, 0],
-        "77": [0, 0.68333, 0.16389, 0],
-        "78": [0, 0.68333, 0.16389, 0],
-        "79": [0, 0.68333, 0.09403, 0],
-        "80": [0, 0.68333, 0.10257, 0],
-        "81": [0.19444, 0.68333, 0.09403, 0],
-        "82": [0, 0.68333, 0.03868, 0],
-        "83": [0, 0.68333, 0.11972, 0],
-        "84": [0, 0.68333, 0.13305, 0],
-        "85": [0, 0.68333, 0.16389, 0],
-        "86": [0, 0.68333, 0.18361, 0],
-        "87": [0, 0.68333, 0.18361, 0],
-        "88": [0, 0.68333, 0.15806, 0],
-        "89": [0, 0.68333, 0.19383, 0],
-        "90": [0, 0.68333, 0.14528, 0],
-        "91": [0.25, 0.75, 0.1875, 0],
-        "93": [0.25, 0.75, 0.10528, 0],
-        "94": [0, 0.69444, 0.06646, 0],
-        "95": [0.31, 0.12056, 0.09208, 0],
-        "97": [0, 0.43056, 0.07671, 0],
-        "98": [0, 0.69444, 0.06312, 0],
-        "99": [0, 0.43056, 0.05653, 0],
-        "100": [0, 0.69444, 0.10333, 0],
-        "101": [0, 0.43056, 0.07514, 0],
-        "102": [0.19444, 0.69444, 0.21194, 0],
-        "103": [0.19444, 0.43056, 0.08847, 0],
-        "104": [0, 0.69444, 0.07671, 0],
-        "105": [0, 0.65536, 0.1019, 0],
-        "106": [0.19444, 0.65536, 0.14467, 0],
-        "107": [0, 0.69444, 0.10764, 0],
-        "108": [0, 0.69444, 0.10333, 0],
-        "109": [0, 0.43056, 0.07671, 0],
-        "110": [0, 0.43056, 0.07671, 0],
-        "111": [0, 0.43056, 0.06312, 0],
-        "112": [0.19444, 0.43056, 0.06312, 0],
-        "113": [0.19444, 0.43056, 0.08847, 0],
-        "114": [0, 0.43056, 0.10764, 0],
-        "115": [0, 0.43056, 0.08208, 0],
-        "116": [0, 0.61508, 0.09486, 0],
-        "117": [0, 0.43056, 0.07671, 0],
-        "118": [0, 0.43056, 0.10764, 0],
-        "119": [0, 0.43056, 0.10764, 0],
-        "120": [0, 0.43056, 0.12042, 0],
-        "121": [0.19444, 0.43056, 0.08847, 0],
-        "122": [0, 0.43056, 0.12292, 0],
-        "126": [0.35, 0.31786, 0.11585, 0],
-        "163": [0, 0.69444, 0, 0],
-        "305": [0, 0.43056, 0, 0.02778],
-        "567": [0.19444, 0.43056, 0, 0.08334],
-        "768": [0, 0.69444, 0, 0],
-        "769": [0, 0.69444, 0.09694, 0],
-        "770": [0, 0.69444, 0.06646, 0],
-        "771": [0, 0.66786, 0.11585, 0],
-        "772": [0, 0.56167, 0.10333, 0],
-        "774": [0, 0.69444, 0.10806, 0],
-        "775": [0, 0.66786, 0.11752, 0],
-        "776": [0, 0.66786, 0.10474, 0],
-        "778": [0, 0.69444, 0, 0],
-        "779": [0, 0.69444, 0.1225, 0],
-        "780": [0, 0.62847, 0.08295, 0],
-        "915": [0, 0.68333, 0.13305, 0],
-        "916": [0, 0.68333, 0, 0],
-        "920": [0, 0.68333, 0.09403, 0],
-        "923": [0, 0.68333, 0, 0],
-        "926": [0, 0.68333, 0.15294, 0],
-        "928": [0, 0.68333, 0.16389, 0],
-        "931": [0, 0.68333, 0.12028, 0],
-        "933": [0, 0.68333, 0.11111, 0],
-        "934": [0, 0.68333, 0.05986, 0],
-        "936": [0, 0.68333, 0.11111, 0],
-        "937": [0, 0.68333, 0.10257, 0],
-        "8211": [0, 0.43056, 0.09208, 0],
-        "8212": [0, 0.43056, 0.09208, 0],
-        "8216": [0, 0.69444, 0.12417, 0],
-        "8217": [0, 0.69444, 0.12417, 0],
-        "8220": [0, 0.69444, 0.1685, 0],
-        "8221": [0, 0.69444, 0.06961, 0],
-        "8463": [0, 0.68889, 0, 0]
-    },
-    "Main-Regular": {
-        "32": [0, 0, 0, 0],
-        "33": [0, 0.69444, 0, 0],
-        "34": [0, 0.69444, 0, 0],
-        "35": [0.19444, 0.69444, 0, 0],
-        "36": [0.05556, 0.75, 0, 0],
-        "37": [0.05556, 0.75, 0, 0],
-        "38": [0, 0.69444, 0, 0],
-        "39": [0, 0.69444, 0, 0],
-        "40": [0.25, 0.75, 0, 0],
-        "41": [0.25, 0.75, 0, 0],
-        "42": [0, 0.75, 0, 0],
-        "43": [0.08333, 0.58333, 0, 0],
-        "44": [0.19444, 0.10556, 0, 0],
-        "45": [0, 0.43056, 0, 0],
-        "46": [0, 0.10556, 0, 0],
-        "47": [0.25, 0.75, 0, 0],
-        "48": [0, 0.64444, 0, 0],
-        "49": [0, 0.64444, 0, 0],
-        "50": [0, 0.64444, 0, 0],
-        "51": [0, 0.64444, 0, 0],
-        "52": [0, 0.64444, 0, 0],
-        "53": [0, 0.64444, 0, 0],
-        "54": [0, 0.64444, 0, 0],
-        "55": [0, 0.64444, 0, 0],
-        "56": [0, 0.64444, 0, 0],
-        "57": [0, 0.64444, 0, 0],
-        "58": [0, 0.43056, 0, 0],
-        "59": [0.19444, 0.43056, 0, 0],
-        "60": [0.0391, 0.5391, 0, 0],
-        "61": [-0.13313, 0.36687, 0, 0],
-        "62": [0.0391, 0.5391, 0, 0],
-        "63": [0, 0.69444, 0, 0],
-        "64": [0, 0.69444, 0, 0],
-        "65": [0, 0.68333, 0, 0],
-        "66": [0, 0.68333, 0, 0],
-        "67": [0, 0.68333, 0, 0],
-        "68": [0, 0.68333, 0, 0],
-        "69": [0, 0.68333, 0, 0],
-        "70": [0, 0.68333, 0, 0],
-        "71": [0, 0.68333, 0, 0],
-        "72": [0, 0.68333, 0, 0],
-        "73": [0, 0.68333, 0, 0],
-        "74": [0, 0.68333, 0, 0],
-        "75": [0, 0.68333, 0, 0],
-        "76": [0, 0.68333, 0, 0],
-        "77": [0, 0.68333, 0, 0],
-        "78": [0, 0.68333, 0, 0],
-        "79": [0, 0.68333, 0, 0],
-        "80": [0, 0.68333, 0, 0],
-        "81": [0.19444, 0.68333, 0, 0],
-        "82": [0, 0.68333, 0, 0],
-        "83": [0, 0.68333, 0, 0],
-        "84": [0, 0.68333, 0, 0],
-        "85": [0, 0.68333, 0, 0],
-        "86": [0, 0.68333, 0.01389, 0],
-        "87": [0, 0.68333, 0.01389, 0],
-        "88": [0, 0.68333, 0, 0],
-        "89": [0, 0.68333, 0.025, 0],
-        "90": [0, 0.68333, 0, 0],
-        "91": [0.25, 0.75, 0, 0],
-        "92": [0.25, 0.75, 0, 0],
-        "93": [0.25, 0.75, 0, 0],
-        "94": [0, 0.69444, 0, 0],
-        "95": [0.31, 0.12056, 0.02778, 0],
-        "96": [0, 0.69444, 0, 0],
-        "97": [0, 0.43056, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.43056, 0, 0],
-        "100": [0, 0.69444, 0, 0],
-        "101": [0, 0.43056, 0, 0],
-        "102": [0, 0.69444, 0.07778, 0],
-        "103": [0.19444, 0.43056, 0.01389, 0],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.66786, 0, 0],
-        "106": [0.19444, 0.66786, 0, 0],
-        "107": [0, 0.69444, 0, 0],
-        "108": [0, 0.69444, 0, 0],
-        "109": [0, 0.43056, 0, 0],
-        "110": [0, 0.43056, 0, 0],
-        "111": [0, 0.43056, 0, 0],
-        "112": [0.19444, 0.43056, 0, 0],
-        "113": [0.19444, 0.43056, 0, 0],
-        "114": [0, 0.43056, 0, 0],
-        "115": [0, 0.43056, 0, 0],
-        "116": [0, 0.61508, 0, 0],
-        "117": [0, 0.43056, 0, 0],
-        "118": [0, 0.43056, 0.01389, 0],
-        "119": [0, 0.43056, 0.01389, 0],
-        "120": [0, 0.43056, 0, 0],
-        "121": [0.19444, 0.43056, 0.01389, 0],
-        "122": [0, 0.43056, 0, 0],
-        "123": [0.25, 0.75, 0, 0],
-        "124": [0.25, 0.75, 0, 0],
-        "125": [0.25, 0.75, 0, 0],
-        "126": [0.35, 0.31786, 0, 0],
-        "160": [0, 0, 0, 0],
-        "168": [0, 0.66786, 0, 0],
-        "172": [0, 0.43056, 0, 0],
-        "175": [0, 0.56778, 0, 0],
-        "176": [0, 0.69444, 0, 0],
-        "177": [0.08333, 0.58333, 0, 0],
-        "180": [0, 0.69444, 0, 0],
-        "215": [0.08333, 0.58333, 0, 0],
-        "247": [0.08333, 0.58333, 0, 0],
-        "305": [0, 0.43056, 0, 0],
-        "567": [0.19444, 0.43056, 0, 0],
-        "710": [0, 0.69444, 0, 0],
-        "711": [0, 0.62847, 0, 0],
-        "713": [0, 0.56778, 0, 0],
-        "714": [0, 0.69444, 0, 0],
-        "715": [0, 0.69444, 0, 0],
-        "728": [0, 0.69444, 0, 0],
-        "729": [0, 0.66786, 0, 0],
-        "730": [0, 0.69444, 0, 0],
-        "732": [0, 0.66786, 0, 0],
-        "768": [0, 0.69444, 0, 0],
-        "769": [0, 0.69444, 0, 0],
-        "770": [0, 0.69444, 0, 0],
-        "771": [0, 0.66786, 0, 0],
-        "772": [0, 0.56778, 0, 0],
-        "774": [0, 0.69444, 0, 0],
-        "775": [0, 0.66786, 0, 0],
-        "776": [0, 0.66786, 0, 0],
-        "778": [0, 0.69444, 0, 0],
-        "779": [0, 0.69444, 0, 0],
-        "780": [0, 0.62847, 0, 0],
-        "824": [0.19444, 0.69444, 0, 0],
-        "915": [0, 0.68333, 0, 0],
-        "916": [0, 0.68333, 0, 0],
-        "920": [0, 0.68333, 0, 0],
-        "923": [0, 0.68333, 0, 0],
-        "926": [0, 0.68333, 0, 0],
-        "928": [0, 0.68333, 0, 0],
-        "931": [0, 0.68333, 0, 0],
-        "933": [0, 0.68333, 0, 0],
-        "934": [0, 0.68333, 0, 0],
-        "936": [0, 0.68333, 0, 0],
-        "937": [0, 0.68333, 0, 0],
-        "8211": [0, 0.43056, 0.02778, 0],
-        "8212": [0, 0.43056, 0.02778, 0],
-        "8216": [0, 0.69444, 0, 0],
-        "8217": [0, 0.69444, 0, 0],
-        "8220": [0, 0.69444, 0, 0],
-        "8221": [0, 0.69444, 0, 0],
-        "8224": [0.19444, 0.69444, 0, 0],
-        "8225": [0.19444, 0.69444, 0, 0],
-        "8230": [0, 0.12, 0, 0],
-        "8242": [0, 0.55556, 0, 0],
-        "8407": [0, 0.71444, 0.15382, 0],
-        "8463": [0, 0.68889, 0, 0],
-        "8465": [0, 0.69444, 0, 0],
-        "8467": [0, 0.69444, 0, 0.11111],
-        "8472": [0.19444, 0.43056, 0, 0.11111],
-        "8476": [0, 0.69444, 0, 0],
-        "8501": [0, 0.69444, 0, 0],
-        "8592": [-0.13313, 0.36687, 0, 0],
-        "8593": [0.19444, 0.69444, 0, 0],
-        "8594": [-0.13313, 0.36687, 0, 0],
-        "8595": [0.19444, 0.69444, 0, 0],
-        "8596": [-0.13313, 0.36687, 0, 0],
-        "8597": [0.25, 0.75, 0, 0],
-        "8598": [0.19444, 0.69444, 0, 0],
-        "8599": [0.19444, 0.69444, 0, 0],
-        "8600": [0.19444, 0.69444, 0, 0],
-        "8601": [0.19444, 0.69444, 0, 0],
-        "8614": [0.011, 0.511, 0, 0],
-        "8617": [0.011, 0.511, 0, 0],
-        "8618": [0.011, 0.511, 0, 0],
-        "8636": [-0.13313, 0.36687, 0, 0],
-        "8637": [-0.13313, 0.36687, 0, 0],
-        "8640": [-0.13313, 0.36687, 0, 0],
-        "8641": [-0.13313, 0.36687, 0, 0],
-        "8652": [0.011, 0.671, 0, 0],
-        "8656": [-0.13313, 0.36687, 0, 0],
-        "8657": [0.19444, 0.69444, 0, 0],
-        "8658": [-0.13313, 0.36687, 0, 0],
-        "8659": [0.19444, 0.69444, 0, 0],
-        "8660": [-0.13313, 0.36687, 0, 0],
-        "8661": [0.25, 0.75, 0, 0],
-        "8704": [0, 0.69444, 0, 0],
-        "8706": [0, 0.69444, 0.05556, 0.08334],
-        "8707": [0, 0.69444, 0, 0],
-        "8709": [0.05556, 0.75, 0, 0],
-        "8711": [0, 0.68333, 0, 0],
-        "8712": [0.0391, 0.5391, 0, 0],
-        "8715": [0.0391, 0.5391, 0, 0],
-        "8722": [0.08333, 0.58333, 0, 0],
-        "8723": [0.08333, 0.58333, 0, 0],
-        "8725": [0.25, 0.75, 0, 0],
-        "8726": [0.25, 0.75, 0, 0],
-        "8727": [-0.03472, 0.46528, 0, 0],
-        "8728": [-0.05555, 0.44445, 0, 0],
-        "8729": [-0.05555, 0.44445, 0, 0],
-        "8730": [0.2, 0.8, 0, 0],
-        "8733": [0, 0.43056, 0, 0],
-        "8734": [0, 0.43056, 0, 0],
-        "8736": [0, 0.69224, 0, 0],
-        "8739": [0.25, 0.75, 0, 0],
-        "8741": [0.25, 0.75, 0, 0],
-        "8743": [0, 0.55556, 0, 0],
-        "8744": [0, 0.55556, 0, 0],
-        "8745": [0, 0.55556, 0, 0],
-        "8746": [0, 0.55556, 0, 0],
-        "8747": [0.19444, 0.69444, 0.11111, 0],
-        "8764": [-0.13313, 0.36687, 0, 0],
-        "8768": [0.19444, 0.69444, 0, 0],
-        "8771": [-0.03625, 0.46375, 0, 0],
-        "8773": [-0.022, 0.589, 0, 0],
-        "8776": [-0.01688, 0.48312, 0, 0],
-        "8781": [-0.03625, 0.46375, 0, 0],
-        "8784": [-0.133, 0.67, 0, 0],
-        "8800": [0.215, 0.716, 0, 0],
-        "8801": [-0.03625, 0.46375, 0, 0],
-        "8804": [0.13597, 0.63597, 0, 0],
-        "8805": [0.13597, 0.63597, 0, 0],
-        "8810": [0.0391, 0.5391, 0, 0],
-        "8811": [0.0391, 0.5391, 0, 0],
-        "8826": [0.0391, 0.5391, 0, 0],
-        "8827": [0.0391, 0.5391, 0, 0],
-        "8834": [0.0391, 0.5391, 0, 0],
-        "8835": [0.0391, 0.5391, 0, 0],
-        "8838": [0.13597, 0.63597, 0, 0],
-        "8839": [0.13597, 0.63597, 0, 0],
-        "8846": [0, 0.55556, 0, 0],
-        "8849": [0.13597, 0.63597, 0, 0],
-        "8850": [0.13597, 0.63597, 0, 0],
-        "8851": [0, 0.55556, 0, 0],
-        "8852": [0, 0.55556, 0, 0],
-        "8853": [0.08333, 0.58333, 0, 0],
-        "8854": [0.08333, 0.58333, 0, 0],
-        "8855": [0.08333, 0.58333, 0, 0],
-        "8856": [0.08333, 0.58333, 0, 0],
-        "8857": [0.08333, 0.58333, 0, 0],
-        "8866": [0, 0.69444, 0, 0],
-        "8867": [0, 0.69444, 0, 0],
-        "8868": [0, 0.69444, 0, 0],
-        "8869": [0, 0.69444, 0, 0],
-        "8872": [0.249, 0.75, 0, 0],
-        "8900": [-0.05555, 0.44445, 0, 0],
-        "8901": [-0.05555, 0.44445, 0, 0],
-        "8902": [-0.03472, 0.46528, 0, 0],
-        "8904": [0.005, 0.505, 0, 0],
-        "8942": [0.03, 0.9, 0, 0],
-        "8943": [-0.19, 0.31, 0, 0],
-        "8945": [-0.1, 0.82, 0, 0],
-        "8968": [0.25, 0.75, 0, 0],
-        "8969": [0.25, 0.75, 0, 0],
-        "8970": [0.25, 0.75, 0, 0],
-        "8971": [0.25, 0.75, 0, 0],
-        "8994": [-0.14236, 0.35764, 0, 0],
-        "8995": [-0.14236, 0.35764, 0, 0],
-        "9136": [0.244, 0.744, 0, 0],
-        "9137": [0.244, 0.744, 0, 0],
-        "9651": [0.19444, 0.69444, 0, 0],
-        "9657": [-0.03472, 0.46528, 0, 0],
-        "9661": [0.19444, 0.69444, 0, 0],
-        "9667": [-0.03472, 0.46528, 0, 0],
-        "9711": [0.19444, 0.69444, 0, 0],
-        "9824": [0.12963, 0.69444, 0, 0],
-        "9825": [0.12963, 0.69444, 0, 0],
-        "9826": [0.12963, 0.69444, 0, 0],
-        "9827": [0.12963, 0.69444, 0, 0],
-        "9837": [0, 0.75, 0, 0],
-        "9838": [0.19444, 0.69444, 0, 0],
-        "9839": [0.19444, 0.69444, 0, 0],
-        "10216": [0.25, 0.75, 0, 0],
-        "10217": [0.25, 0.75, 0, 0],
-        "10222": [0.244, 0.744, 0, 0],
-        "10223": [0.244, 0.744, 0, 0],
-        "10229": [0.011, 0.511, 0, 0],
-        "10230": [0.011, 0.511, 0, 0],
-        "10231": [0.011, 0.511, 0, 0],
-        "10232": [0.024, 0.525, 0, 0],
-        "10233": [0.024, 0.525, 0, 0],
-        "10234": [0.024, 0.525, 0, 0],
-        "10236": [0.011, 0.511, 0, 0],
-        "10815": [0, 0.68333, 0, 0],
-        "10927": [0.13597, 0.63597, 0, 0],
-        "10928": [0.13597, 0.63597, 0, 0]
-    },
-    "Math-BoldItalic": {
-        "47": [0.19444, 0.69444, 0, 0],
-        "65": [0, 0.68611, 0, 0],
-        "66": [0, 0.68611, 0.04835, 0],
-        "67": [0, 0.68611, 0.06979, 0],
-        "68": [0, 0.68611, 0.03194, 0],
-        "69": [0, 0.68611, 0.05451, 0],
-        "70": [0, 0.68611, 0.15972, 0],
-        "71": [0, 0.68611, 0, 0],
-        "72": [0, 0.68611, 0.08229, 0],
-        "73": [0, 0.68611, 0.07778, 0],
-        "74": [0, 0.68611, 0.10069, 0],
-        "75": [0, 0.68611, 0.06979, 0],
-        "76": [0, 0.68611, 0, 0],
-        "77": [0, 0.68611, 0.11424, 0],
-        "78": [0, 0.68611, 0.11424, 0],
-        "79": [0, 0.68611, 0.03194, 0],
-        "80": [0, 0.68611, 0.15972, 0],
-        "81": [0.19444, 0.68611, 0, 0],
-        "82": [0, 0.68611, 0.00421, 0],
-        "83": [0, 0.68611, 0.05382, 0],
-        "84": [0, 0.68611, 0.15972, 0],
-        "85": [0, 0.68611, 0.11424, 0],
-        "86": [0, 0.68611, 0.25555, 0],
-        "87": [0, 0.68611, 0.15972, 0],
-        "88": [0, 0.68611, 0.07778, 0],
-        "89": [0, 0.68611, 0.25555, 0],
-        "90": [0, 0.68611, 0.06979, 0],
-        "97": [0, 0.44444, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.44444, 0, 0],
-        "100": [0, 0.69444, 0, 0],
-        "101": [0, 0.44444, 0, 0],
-        "102": [0.19444, 0.69444, 0.11042, 0],
-        "103": [0.19444, 0.44444, 0.03704, 0],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.69326, 0, 0],
-        "106": [0.19444, 0.69326, 0.0622, 0],
-        "107": [0, 0.69444, 0.01852, 0],
-        "108": [0, 0.69444, 0.0088, 0],
-        "109": [0, 0.44444, 0, 0],
-        "110": [0, 0.44444, 0, 0],
-        "111": [0, 0.44444, 0, 0],
-        "112": [0.19444, 0.44444, 0, 0],
-        "113": [0.19444, 0.44444, 0.03704, 0],
-        "114": [0, 0.44444, 0.03194, 0],
-        "115": [0, 0.44444, 0, 0],
-        "116": [0, 0.63492, 0, 0],
-        "117": [0, 0.44444, 0, 0],
-        "118": [0, 0.44444, 0.03704, 0],
-        "119": [0, 0.44444, 0.02778, 0],
-        "120": [0, 0.44444, 0, 0],
-        "121": [0.19444, 0.44444, 0.03704, 0],
-        "122": [0, 0.44444, 0.04213, 0],
-        "915": [0, 0.68611, 0.15972, 0],
-        "916": [0, 0.68611, 0, 0],
-        "920": [0, 0.68611, 0.03194, 0],
-        "923": [0, 0.68611, 0, 0],
-        "926": [0, 0.68611, 0.07458, 0],
-        "928": [0, 0.68611, 0.08229, 0],
-        "931": [0, 0.68611, 0.05451, 0],
-        "933": [0, 0.68611, 0.15972, 0],
-        "934": [0, 0.68611, 0, 0],
-        "936": [0, 0.68611, 0.11653, 0],
-        "937": [0, 0.68611, 0.04835, 0],
-        "945": [0, 0.44444, 0, 0],
-        "946": [0.19444, 0.69444, 0.03403, 0],
-        "947": [0.19444, 0.44444, 0.06389, 0],
-        "948": [0, 0.69444, 0.03819, 0],
-        "949": [0, 0.44444, 0, 0],
-        "950": [0.19444, 0.69444, 0.06215, 0],
-        "951": [0.19444, 0.44444, 0.03704, 0],
-        "952": [0, 0.69444, 0.03194, 0],
-        "953": [0, 0.44444, 0, 0],
-        "954": [0, 0.44444, 0, 0],
-        "955": [0, 0.69444, 0, 0],
-        "956": [0.19444, 0.44444, 0, 0],
-        "957": [0, 0.44444, 0.06898, 0],
-        "958": [0.19444, 0.69444, 0.03021, 0],
-        "959": [0, 0.44444, 0, 0],
-        "960": [0, 0.44444, 0.03704, 0],
-        "961": [0.19444, 0.44444, 0, 0],
-        "962": [0.09722, 0.44444, 0.07917, 0],
-        "963": [0, 0.44444, 0.03704, 0],
-        "964": [0, 0.44444, 0.13472, 0],
-        "965": [0, 0.44444, 0.03704, 0],
-        "966": [0.19444, 0.44444, 0, 0],
-        "967": [0.19444, 0.44444, 0, 0],
-        "968": [0.19444, 0.69444, 0.03704, 0],
-        "969": [0, 0.44444, 0.03704, 0],
-        "977": [0, 0.69444, 0, 0],
-        "981": [0.19444, 0.69444, 0, 0],
-        "982": [0, 0.44444, 0.03194, 0],
-        "1009": [0.19444, 0.44444, 0, 0],
-        "1013": [0, 0.44444, 0, 0]
-    },
-    "Math-Italic": {
-        "47": [0.19444, 0.69444, 0, 0],
-        "65": [0, 0.68333, 0, 0.13889],
-        "66": [0, 0.68333, 0.05017, 0.08334],
-        "67": [0, 0.68333, 0.07153, 0.08334],
-        "68": [0, 0.68333, 0.02778, 0.05556],
-        "69": [0, 0.68333, 0.05764, 0.08334],
-        "70": [0, 0.68333, 0.13889, 0.08334],
-        "71": [0, 0.68333, 0, 0.08334],
-        "72": [0, 0.68333, 0.08125, 0.05556],
-        "73": [0, 0.68333, 0.07847, 0.11111],
-        "74": [0, 0.68333, 0.09618, 0.16667],
-        "75": [0, 0.68333, 0.07153, 0.05556],
-        "76": [0, 0.68333, 0, 0.02778],
-        "77": [0, 0.68333, 0.10903, 0.08334],
-        "78": [0, 0.68333, 0.10903, 0.08334],
-        "79": [0, 0.68333, 0.02778, 0.08334],
-        "80": [0, 0.68333, 0.13889, 0.08334],
-        "81": [0.19444, 0.68333, 0, 0.08334],
-        "82": [0, 0.68333, 0.00773, 0.08334],
-        "83": [0, 0.68333, 0.05764, 0.08334],
-        "84": [0, 0.68333, 0.13889, 0.08334],
-        "85": [0, 0.68333, 0.10903, 0.02778],
-        "86": [0, 0.68333, 0.22222, 0],
-        "87": [0, 0.68333, 0.13889, 0],
-        "88": [0, 0.68333, 0.07847, 0.08334],
-        "89": [0, 0.68333, 0.22222, 0],
-        "90": [0, 0.68333, 0.07153, 0.08334],
-        "97": [0, 0.43056, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.43056, 0, 0.05556],
-        "100": [0, 0.69444, 0, 0.16667],
-        "101": [0, 0.43056, 0, 0.05556],
-        "102": [0.19444, 0.69444, 0.10764, 0.16667],
-        "103": [0.19444, 0.43056, 0.03588, 0.02778],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.65952, 0, 0],
-        "106": [0.19444, 0.65952, 0.05724, 0],
-        "107": [0, 0.69444, 0.03148, 0],
-        "108": [0, 0.69444, 0.01968, 0.08334],
-        "109": [0, 0.43056, 0, 0],
-        "110": [0, 0.43056, 0, 0],
-        "111": [0, 0.43056, 0, 0.05556],
-        "112": [0.19444, 0.43056, 0, 0.08334],
-        "113": [0.19444, 0.43056, 0.03588, 0.08334],
-        "114": [0, 0.43056, 0.02778, 0.05556],
-        "115": [0, 0.43056, 0, 0.05556],
-        "116": [0, 0.61508, 0, 0.08334],
-        "117": [0, 0.43056, 0, 0.02778],
-        "118": [0, 0.43056, 0.03588, 0.02778],
-        "119": [0, 0.43056, 0.02691, 0.08334],
-        "120": [0, 0.43056, 0, 0.02778],
-        "121": [0.19444, 0.43056, 0.03588, 0.05556],
-        "122": [0, 0.43056, 0.04398, 0.05556],
-        "915": [0, 0.68333, 0.13889, 0.08334],
-        "916": [0, 0.68333, 0, 0.16667],
-        "920": [0, 0.68333, 0.02778, 0.08334],
-        "923": [0, 0.68333, 0, 0.16667],
-        "926": [0, 0.68333, 0.07569, 0.08334],
-        "928": [0, 0.68333, 0.08125, 0.05556],
-        "931": [0, 0.68333, 0.05764, 0.08334],
-        "933": [0, 0.68333, 0.13889, 0.05556],
-        "934": [0, 0.68333, 0, 0.08334],
-        "936": [0, 0.68333, 0.11, 0.05556],
-        "937": [0, 0.68333, 0.05017, 0.08334],
-        "945": [0, 0.43056, 0.0037, 0.02778],
-        "946": [0.19444, 0.69444, 0.05278, 0.08334],
-        "947": [0.19444, 0.43056, 0.05556, 0],
-        "948": [0, 0.69444, 0.03785, 0.05556],
-        "949": [0, 0.43056, 0, 0.08334],
-        "950": [0.19444, 0.69444, 0.07378, 0.08334],
-        "951": [0.19444, 0.43056, 0.03588, 0.05556],
-        "952": [0, 0.69444, 0.02778, 0.08334],
-        "953": [0, 0.43056, 0, 0.05556],
-        "954": [0, 0.43056, 0, 0],
-        "955": [0, 0.69444, 0, 0],
-        "956": [0.19444, 0.43056, 0, 0.02778],
-        "957": [0, 0.43056, 0.06366, 0.02778],
-        "958": [0.19444, 0.69444, 0.04601, 0.11111],
-        "959": [0, 0.43056, 0, 0.05556],
-        "960": [0, 0.43056, 0.03588, 0],
-        "961": [0.19444, 0.43056, 0, 0.08334],
-        "962": [0.09722, 0.43056, 0.07986, 0.08334],
-        "963": [0, 0.43056, 0.03588, 0],
-        "964": [0, 0.43056, 0.1132, 0.02778],
-        "965": [0, 0.43056, 0.03588, 0.02778],
-        "966": [0.19444, 0.43056, 0, 0.08334],
-        "967": [0.19444, 0.43056, 0, 0.05556],
-        "968": [0.19444, 0.69444, 0.03588, 0.11111],
-        "969": [0, 0.43056, 0.03588, 0],
-        "977": [0, 0.69444, 0, 0.08334],
-        "981": [0.19444, 0.69444, 0, 0.08334],
-        "982": [0, 0.43056, 0.02778, 0],
-        "1009": [0.19444, 0.43056, 0, 0.08334],
-        "1013": [0, 0.43056, 0, 0.05556]
-    },
-    "Math-Regular": {
-        "65": [0, 0.68333, 0, 0.13889],
-        "66": [0, 0.68333, 0.05017, 0.08334],
-        "67": [0, 0.68333, 0.07153, 0.08334],
-        "68": [0, 0.68333, 0.02778, 0.05556],
-        "69": [0, 0.68333, 0.05764, 0.08334],
-        "70": [0, 0.68333, 0.13889, 0.08334],
-        "71": [0, 0.68333, 0, 0.08334],
-        "72": [0, 0.68333, 0.08125, 0.05556],
-        "73": [0, 0.68333, 0.07847, 0.11111],
-        "74": [0, 0.68333, 0.09618, 0.16667],
-        "75": [0, 0.68333, 0.07153, 0.05556],
-        "76": [0, 0.68333, 0, 0.02778],
-        "77": [0, 0.68333, 0.10903, 0.08334],
-        "78": [0, 0.68333, 0.10903, 0.08334],
-        "79": [0, 0.68333, 0.02778, 0.08334],
-        "80": [0, 0.68333, 0.13889, 0.08334],
-        "81": [0.19444, 0.68333, 0, 0.08334],
-        "82": [0, 0.68333, 0.00773, 0.08334],
-        "83": [0, 0.68333, 0.05764, 0.08334],
-        "84": [0, 0.68333, 0.13889, 0.08334],
-        "85": [0, 0.68333, 0.10903, 0.02778],
-        "86": [0, 0.68333, 0.22222, 0],
-        "87": [0, 0.68333, 0.13889, 0],
-        "88": [0, 0.68333, 0.07847, 0.08334],
-        "89": [0, 0.68333, 0.22222, 0],
-        "90": [0, 0.68333, 0.07153, 0.08334],
-        "97": [0, 0.43056, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.43056, 0, 0.05556],
-        "100": [0, 0.69444, 0, 0.16667],
-        "101": [0, 0.43056, 0, 0.05556],
-        "102": [0.19444, 0.69444, 0.10764, 0.16667],
-        "103": [0.19444, 0.43056, 0.03588, 0.02778],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.65952, 0, 0],
-        "106": [0.19444, 0.65952, 0.05724, 0],
-        "107": [0, 0.69444, 0.03148, 0],
-        "108": [0, 0.69444, 0.01968, 0.08334],
-        "109": [0, 0.43056, 0, 0],
-        "110": [0, 0.43056, 0, 0],
-        "111": [0, 0.43056, 0, 0.05556],
-        "112": [0.19444, 0.43056, 0, 0.08334],
-        "113": [0.19444, 0.43056, 0.03588, 0.08334],
-        "114": [0, 0.43056, 0.02778, 0.05556],
-        "115": [0, 0.43056, 0, 0.05556],
-        "116": [0, 0.61508, 0, 0.08334],
-        "117": [0, 0.43056, 0, 0.02778],
-        "118": [0, 0.43056, 0.03588, 0.02778],
-        "119": [0, 0.43056, 0.02691, 0.08334],
-        "120": [0, 0.43056, 0, 0.02778],
-        "121": [0.19444, 0.43056, 0.03588, 0.05556],
-        "122": [0, 0.43056, 0.04398, 0.05556],
-        "915": [0, 0.68333, 0.13889, 0.08334],
-        "916": [0, 0.68333, 0, 0.16667],
-        "920": [0, 0.68333, 0.02778, 0.08334],
-        "923": [0, 0.68333, 0, 0.16667],
-        "926": [0, 0.68333, 0.07569, 0.08334],
-        "928": [0, 0.68333, 0.08125, 0.05556],
-        "931": [0, 0.68333, 0.05764, 0.08334],
-        "933": [0, 0.68333, 0.13889, 0.05556],
-        "934": [0, 0.68333, 0, 0.08334],
-        "936": [0, 0.68333, 0.11, 0.05556],
-        "937": [0, 0.68333, 0.05017, 0.08334],
-        "945": [0, 0.43056, 0.0037, 0.02778],
-        "946": [0.19444, 0.69444, 0.05278, 0.08334],
-        "947": [0.19444, 0.43056, 0.05556, 0],
-        "948": [0, 0.69444, 0.03785, 0.05556],
-        "949": [0, 0.43056, 0, 0.08334],
-        "950": [0.19444, 0.69444, 0.07378, 0.08334],
-        "951": [0.19444, 0.43056, 0.03588, 0.05556],
-        "952": [0, 0.69444, 0.02778, 0.08334],
-        "953": [0, 0.43056, 0, 0.05556],
-        "954": [0, 0.43056, 0, 0],
-        "955": [0, 0.69444, 0, 0],
-        "956": [0.19444, 0.43056, 0, 0.02778],
-        "957": [0, 0.43056, 0.06366, 0.02778],
-        "958": [0.19444, 0.69444, 0.04601, 0.11111],
-        "959": [0, 0.43056, 0, 0.05556],
-        "960": [0, 0.43056, 0.03588, 0],
-        "961": [0.19444, 0.43056, 0, 0.08334],
-        "962": [0.09722, 0.43056, 0.07986, 0.08334],
-        "963": [0, 0.43056, 0.03588, 0],
-        "964": [0, 0.43056, 0.1132, 0.02778],
-        "965": [0, 0.43056, 0.03588, 0.02778],
-        "966": [0.19444, 0.43056, 0, 0.08334],
-        "967": [0.19444, 0.43056, 0, 0.05556],
-        "968": [0.19444, 0.69444, 0.03588, 0.11111],
-        "969": [0, 0.43056, 0.03588, 0],
-        "977": [0, 0.69444, 0, 0.08334],
-        "981": [0.19444, 0.69444, 0, 0.08334],
-        "982": [0, 0.43056, 0.02778, 0],
-        "1009": [0.19444, 0.43056, 0, 0.08334],
-        "1013": [0, 0.43056, 0, 0.05556]
-    },
-    "SansSerif-Regular": {
-        "33": [0, 0.69444, 0, 0],
-        "34": [0, 0.69444, 0, 0],
-        "35": [0.19444, 0.69444, 0, 0],
-        "36": [0.05556, 0.75, 0, 0],
-        "37": [0.05556, 0.75, 0, 0],
-        "38": [0, 0.69444, 0, 0],
-        "39": [0, 0.69444, 0, 0],
-        "40": [0.25, 0.75, 0, 0],
-        "41": [0.25, 0.75, 0, 0],
-        "42": [0, 0.75, 0, 0],
-        "43": [0.08333, 0.58333, 0, 0],
-        "44": [0.125, 0.08333, 0, 0],
-        "45": [0, 0.44444, 0, 0],
-        "46": [0, 0.08333, 0, 0],
-        "47": [0.25, 0.75, 0, 0],
-        "48": [0, 0.65556, 0, 0],
-        "49": [0, 0.65556, 0, 0],
-        "50": [0, 0.65556, 0, 0],
-        "51": [0, 0.65556, 0, 0],
-        "52": [0, 0.65556, 0, 0],
-        "53": [0, 0.65556, 0, 0],
-        "54": [0, 0.65556, 0, 0],
-        "55": [0, 0.65556, 0, 0],
-        "56": [0, 0.65556, 0, 0],
-        "57": [0, 0.65556, 0, 0],
-        "58": [0, 0.44444, 0, 0],
-        "59": [0.125, 0.44444, 0, 0],
-        "61": [-0.13, 0.37, 0, 0],
-        "63": [0, 0.69444, 0, 0],
-        "64": [0, 0.69444, 0, 0],
-        "65": [0, 0.69444, 0, 0],
-        "66": [0, 0.69444, 0, 0],
-        "67": [0, 0.69444, 0, 0],
-        "68": [0, 0.69444, 0, 0],
-        "69": [0, 0.69444, 0, 0],
-        "70": [0, 0.69444, 0, 0],
-        "71": [0, 0.69444, 0, 0],
-        "72": [0, 0.69444, 0, 0],
-        "73": [0, 0.69444, 0, 0],
-        "74": [0, 0.69444, 0, 0],
-        "75": [0, 0.69444, 0, 0],
-        "76": [0, 0.69444, 0, 0],
-        "77": [0, 0.69444, 0, 0],
-        "78": [0, 0.69444, 0, 0],
-        "79": [0, 0.69444, 0, 0],
-        "80": [0, 0.69444, 0, 0],
-        "81": [0.125, 0.69444, 0, 0],
-        "82": [0, 0.69444, 0, 0],
-        "83": [0, 0.69444, 0, 0],
-        "84": [0, 0.69444, 0, 0],
-        "85": [0, 0.69444, 0, 0],
-        "86": [0, 0.69444, 0.01389, 0],
-        "87": [0, 0.69444, 0.01389, 0],
-        "88": [0, 0.69444, 0, 0],
-        "89": [0, 0.69444, 0.025, 0],
-        "90": [0, 0.69444, 0, 0],
-        "91": [0.25, 0.75, 0, 0],
-        "93": [0.25, 0.75, 0, 0],
-        "94": [0, 0.69444, 0, 0],
-        "95": [0.35, 0.09444, 0.02778, 0],
-        "97": [0, 0.44444, 0, 0],
-        "98": [0, 0.69444, 0, 0],
-        "99": [0, 0.44444, 0, 0],
-        "100": [0, 0.69444, 0, 0],
-        "101": [0, 0.44444, 0, 0],
-        "102": [0, 0.69444, 0.06944, 0],
-        "103": [0.19444, 0.44444, 0.01389, 0],
-        "104": [0, 0.69444, 0, 0],
-        "105": [0, 0.67937, 0, 0],
-        "106": [0.19444, 0.67937, 0, 0],
-        "107": [0, 0.69444, 0, 0],
-        "108": [0, 0.69444, 0, 0],
-        "109": [0, 0.44444, 0, 0],
-        "110": [0, 0.44444, 0, 0],
-        "111": [0, 0.44444, 0, 0],
-        "112": [0.19444, 0.44444, 0, 0],
-        "113": [0.19444, 0.44444, 0, 0],
-        "114": [0, 0.44444, 0.01389, 0],
-        "115": [0, 0.44444, 0, 0],
-        "116": [0, 0.57143, 0, 0],
-        "117": [0, 0.44444, 0, 0],
-        "118": [0, 0.44444, 0.01389, 0],
-        "119": [0, 0.44444, 0.01389, 0],
-        "120": [0, 0.44444, 0, 0],
-        "121": [0.19444, 0.44444, 0.01389, 0],
-        "122": [0, 0.44444, 0, 0],
-        "126": [0.35, 0.32659, 0, 0],
-        "305": [0, 0.44444, 0, 0],
-        "567": [0.19444, 0.44444, 0, 0],
-        "768": [0, 0.69444, 0, 0],
-        "769": [0, 0.69444, 0, 0],
-        "770": [0, 0.69444, 0, 0],
-        "771": [0, 0.67659, 0, 0],
-        "772": [0, 0.60889, 0, 0],
-        "774": [0, 0.69444, 0, 0],
-        "775": [0, 0.67937, 0, 0],
-        "776": [0, 0.67937, 0, 0],
-        "778": [0, 0.69444, 0, 0],
-        "779": [0, 0.69444, 0, 0],
-        "780": [0, 0.63194, 0, 0],
-        "915": [0, 0.69444, 0, 0],
-        "916": [0, 0.69444, 0, 0],
-        "920": [0, 0.69444, 0, 0],
-        "923": [0, 0.69444, 0, 0],
-        "926": [0, 0.69444, 0, 0],
-        "928": [0, 0.69444, 0, 0],
-        "931": [0, 0.69444, 0, 0],
-        "933": [0, 0.69444, 0, 0],
-        "934": [0, 0.69444, 0, 0],
-        "936": [0, 0.69444, 0, 0],
-        "937": [0, 0.69444, 0, 0],
-        "8211": [0, 0.44444, 0.02778, 0],
-        "8212": [0, 0.44444, 0.02778, 0],
-        "8216": [0, 0.69444, 0, 0],
-        "8217": [0, 0.69444, 0, 0],
-        "8220": [0, 0.69444, 0, 0],
-        "8221": [0, 0.69444, 0, 0]
-    },
-    "Script-Regular": {
-        "65": [0, 0.7, 0.22925, 0],
-        "66": [0, 0.7, 0.04087, 0],
-        "67": [0, 0.7, 0.1689, 0],
-        "68": [0, 0.7, 0.09371, 0],
-        "69": [0, 0.7, 0.18583, 0],
-        "70": [0, 0.7, 0.13634, 0],
-        "71": [0, 0.7, 0.17322, 0],
-        "72": [0, 0.7, 0.29694, 0],
-        "73": [0, 0.7, 0.19189, 0],
-        "74": [0.27778, 0.7, 0.19189, 0],
-        "75": [0, 0.7, 0.31259, 0],
-        "76": [0, 0.7, 0.19189, 0],
-        "77": [0, 0.7, 0.15981, 0],
-        "78": [0, 0.7, 0.3525, 0],
-        "79": [0, 0.7, 0.08078, 0],
-        "80": [0, 0.7, 0.08078, 0],
-        "81": [0, 0.7, 0.03305, 0],
-        "82": [0, 0.7, 0.06259, 0],
-        "83": [0, 0.7, 0.19189, 0],
-        "84": [0, 0.7, 0.29087, 0],
-        "85": [0, 0.7, 0.25815, 0],
-        "86": [0, 0.7, 0.27523, 0],
-        "87": [0, 0.7, 0.27523, 0],
-        "88": [0, 0.7, 0.26006, 0],
-        "89": [0, 0.7, 0.2939, 0],
-        "90": [0, 0.7, 0.24037, 0]
-    },
-    "Size1-Regular": {
-        "40": [0.35001, 0.85, 0, 0],
-        "41": [0.35001, 0.85, 0, 0],
-        "47": [0.35001, 0.85, 0, 0],
-        "91": [0.35001, 0.85, 0, 0],
-        "92": [0.35001, 0.85, 0, 0],
-        "93": [0.35001, 0.85, 0, 0],
-        "123": [0.35001, 0.85, 0, 0],
-        "125": [0.35001, 0.85, 0, 0],
-        "710": [0, 0.72222, 0, 0],
-        "732": [0, 0.72222, 0, 0],
-        "770": [0, 0.72222, 0, 0],
-        "771": [0, 0.72222, 0, 0],
-        "8214": [-0.00099, 0.601, 0, 0],
-        "8593": [1e-05, 0.6, 0, 0],
-        "8595": [1e-05, 0.6, 0, 0],
-        "8657": [1e-05, 0.6, 0, 0],
-        "8659": [1e-05, 0.6, 0, 0],
-        "8719": [0.25001, 0.75, 0, 0],
-        "8720": [0.25001, 0.75, 0, 0],
-        "8721": [0.25001, 0.75, 0, 0],
-        "8730": [0.35001, 0.85, 0, 0],
-        "8739": [-0.00599, 0.606, 0, 0],
-        "8741": [-0.00599, 0.606, 0, 0],
-        "8747": [0.30612, 0.805, 0.19445, 0],
-        "8748": [0.306, 0.805, 0.19445, 0],
-        "8749": [0.306, 0.805, 0.19445, 0],
-        "8750": [0.30612, 0.805, 0.19445, 0],
-        "8896": [0.25001, 0.75, 0, 0],
-        "8897": [0.25001, 0.75, 0, 0],
-        "8898": [0.25001, 0.75, 0, 0],
-        "8899": [0.25001, 0.75, 0, 0],
-        "8968": [0.35001, 0.85, 0, 0],
-        "8969": [0.35001, 0.85, 0, 0],
-        "8970": [0.35001, 0.85, 0, 0],
-        "8971": [0.35001, 0.85, 0, 0],
-        "9168": [-0.00099, 0.601, 0, 0],
-        "10216": [0.35001, 0.85, 0, 0],
-        "10217": [0.35001, 0.85, 0, 0],
-        "10752": [0.25001, 0.75, 0, 0],
-        "10753": [0.25001, 0.75, 0, 0],
-        "10754": [0.25001, 0.75, 0, 0],
-        "10756": [0.25001, 0.75, 0, 0],
-        "10758": [0.25001, 0.75, 0, 0]
-    },
-    "Size2-Regular": {
-        "40": [0.65002, 1.15, 0, 0],
-        "41": [0.65002, 1.15, 0, 0],
-        "47": [0.65002, 1.15, 0, 0],
-        "91": [0.65002, 1.15, 0, 0],
-        "92": [0.65002, 1.15, 0, 0],
-        "93": [0.65002, 1.15, 0, 0],
-        "123": [0.65002, 1.15, 0, 0],
-        "125": [0.65002, 1.15, 0, 0],
-        "710": [0, 0.75, 0, 0],
-        "732": [0, 0.75, 0, 0],
-        "770": [0, 0.75, 0, 0],
-        "771": [0, 0.75, 0, 0],
-        "8719": [0.55001, 1.05, 0, 0],
-        "8720": [0.55001, 1.05, 0, 0],
-        "8721": [0.55001, 1.05, 0, 0],
-        "8730": [0.65002, 1.15, 0, 0],
-        "8747": [0.86225, 1.36, 0.44445, 0],
-        "8748": [0.862, 1.36, 0.44445, 0],
-        "8749": [0.862, 1.36, 0.44445, 0],
-        "8750": [0.86225, 1.36, 0.44445, 0],
-        "8896": [0.55001, 1.05, 0, 0],
-        "8897": [0.55001, 1.05, 0, 0],
-        "8898": [0.55001, 1.05, 0, 0],
-        "8899": [0.55001, 1.05, 0, 0],
-        "8968": [0.65002, 1.15, 0, 0],
-        "8969": [0.65002, 1.15, 0, 0],
-        "8970": [0.65002, 1.15, 0, 0],
-        "8971": [0.65002, 1.15, 0, 0],
-        "10216": [0.65002, 1.15, 0, 0],
-        "10217": [0.65002, 1.15, 0, 0],
-        "10752": [0.55001, 1.05, 0, 0],
-        "10753": [0.55001, 1.05, 0, 0],
-        "10754": [0.55001, 1.05, 0, 0],
-        "10756": [0.55001, 1.05, 0, 0],
-        "10758": [0.55001, 1.05, 0, 0]
-    },
-    "Size3-Regular": {
-        "40": [0.95003, 1.45, 0, 0],
-        "41": [0.95003, 1.45, 0, 0],
-        "47": [0.95003, 1.45, 0, 0],
-        "91": [0.95003, 1.45, 0, 0],
-        "92": [0.95003, 1.45, 0, 0],
-        "93": [0.95003, 1.45, 0, 0],
-        "123": [0.95003, 1.45, 0, 0],
-        "125": [0.95003, 1.45, 0, 0],
-        "710": [0, 0.75, 0, 0],
-        "732": [0, 0.75, 0, 0],
-        "770": [0, 0.75, 0, 0],
-        "771": [0, 0.75, 0, 0],
-        "8730": [0.95003, 1.45, 0, 0],
-        "8968": [0.95003, 1.45, 0, 0],
-        "8969": [0.95003, 1.45, 0, 0],
-        "8970": [0.95003, 1.45, 0, 0],
-        "8971": [0.95003, 1.45, 0, 0],
-        "10216": [0.95003, 1.45, 0, 0],
-        "10217": [0.95003, 1.45, 0, 0]
-    },
-    "Size4-Regular": {
-        "40": [1.25003, 1.75, 0, 0],
-        "41": [1.25003, 1.75, 0, 0],
-        "47": [1.25003, 1.75, 0, 0],
-        "91": [1.25003, 1.75, 0, 0],
-        "92": [1.25003, 1.75, 0, 0],
-        "93": [1.25003, 1.75, 0, 0],
-        "123": [1.25003, 1.75, 0, 0],
-        "125": [1.25003, 1.75, 0, 0],
-        "710": [0, 0.825, 0, 0],
-        "732": [0, 0.825, 0, 0],
-        "770": [0, 0.825, 0, 0],
-        "771": [0, 0.825, 0, 0],
-        "8730": [1.25003, 1.75, 0, 0],
-        "8968": [1.25003, 1.75, 0, 0],
-        "8969": [1.25003, 1.75, 0, 0],
-        "8970": [1.25003, 1.75, 0, 0],
-        "8971": [1.25003, 1.75, 0, 0],
-        "9115": [0.64502, 1.155, 0, 0],
-        "9116": [1e-05, 0.6, 0, 0],
-        "9117": [0.64502, 1.155, 0, 0],
-        "9118": [0.64502, 1.155, 0, 0],
-        "9119": [1e-05, 0.6, 0, 0],
-        "9120": [0.64502, 1.155, 0, 0],
-        "9121": [0.64502, 1.155, 0, 0],
-        "9122": [-0.00099, 0.601, 0, 0],
-        "9123": [0.64502, 1.155, 0, 0],
-        "9124": [0.64502, 1.155, 0, 0],
-        "9125": [-0.00099, 0.601, 0, 0],
-        "9126": [0.64502, 1.155, 0, 0],
-        "9127": [1e-05, 0.9, 0, 0],
-        "9128": [0.65002, 1.15, 0, 0],
-        "9129": [0.90001, 0, 0, 0],
-        "9130": [0, 0.3, 0, 0],
-        "9131": [1e-05, 0.9, 0, 0],
-        "9132": [0.65002, 1.15, 0, 0],
-        "9133": [0.90001, 0, 0, 0],
-        "9143": [0.88502, 0.915, 0, 0],
-        "10216": [1.25003, 1.75, 0, 0],
-        "10217": [1.25003, 1.75, 0, 0],
-        "57344": [-0.00499, 0.605, 0, 0],
-        "57345": [-0.00499, 0.605, 0, 0],
-        "57680": [0, 0.12, 0, 0],
-        "57681": [0, 0.12, 0, 0],
-        "57682": [0, 0.12, 0, 0],
-        "57683": [0, 0.12, 0, 0]
-    },
-    "Typewriter-Regular": {
-        "33": [0, 0.61111, 0, 0],
-        "34": [0, 0.61111, 0, 0],
-        "35": [0, 0.61111, 0, 0],
-        "36": [0.08333, 0.69444, 0, 0],
-        "37": [0.08333, 0.69444, 0, 0],
-        "38": [0, 0.61111, 0, 0],
-        "39": [0, 0.61111, 0, 0],
-        "40": [0.08333, 0.69444, 0, 0],
-        "41": [0.08333, 0.69444, 0, 0],
-        "42": [0, 0.52083, 0, 0],
-        "43": [-0.08056, 0.53055, 0, 0],
-        "44": [0.13889, 0.125, 0, 0],
-        "45": [-0.08056, 0.53055, 0, 0],
-        "46": [0, 0.125, 0, 0],
-        "47": [0.08333, 0.69444, 0, 0],
-        "48": [0, 0.61111, 0, 0],
-        "49": [0, 0.61111, 0, 0],
-        "50": [0, 0.61111, 0, 0],
-        "51": [0, 0.61111, 0, 0],
-        "52": [0, 0.61111, 0, 0],
-        "53": [0, 0.61111, 0, 0],
-        "54": [0, 0.61111, 0, 0],
-        "55": [0, 0.61111, 0, 0],
-        "56": [0, 0.61111, 0, 0],
-        "57": [0, 0.61111, 0, 0],
-        "58": [0, 0.43056, 0, 0],
-        "59": [0.13889, 0.43056, 0, 0],
-        "60": [-0.05556, 0.55556, 0, 0],
-        "61": [-0.19549, 0.41562, 0, 0],
-        "62": [-0.05556, 0.55556, 0, 0],
-        "63": [0, 0.61111, 0, 0],
-        "64": [0, 0.61111, 0, 0],
-        "65": [0, 0.61111, 0, 0],
-        "66": [0, 0.61111, 0, 0],
-        "67": [0, 0.61111, 0, 0],
-        "68": [0, 0.61111, 0, 0],
-        "69": [0, 0.61111, 0, 0],
-        "70": [0, 0.61111, 0, 0],
-        "71": [0, 0.61111, 0, 0],
-        "72": [0, 0.61111, 0, 0],
-        "73": [0, 0.61111, 0, 0],
-        "74": [0, 0.61111, 0, 0],
-        "75": [0, 0.61111, 0, 0],
-        "76": [0, 0.61111, 0, 0],
-        "77": [0, 0.61111, 0, 0],
-        "78": [0, 0.61111, 0, 0],
-        "79": [0, 0.61111, 0, 0],
-        "80": [0, 0.61111, 0, 0],
-        "81": [0.13889, 0.61111, 0, 0],
-        "82": [0, 0.61111, 0, 0],
-        "83": [0, 0.61111, 0, 0],
-        "84": [0, 0.61111, 0, 0],
-        "85": [0, 0.61111, 0, 0],
-        "86": [0, 0.61111, 0, 0],
-        "87": [0, 0.61111, 0, 0],
-        "88": [0, 0.61111, 0, 0],
-        "89": [0, 0.61111, 0, 0],
-        "90": [0, 0.61111, 0, 0],
-        "91": [0.08333, 0.69444, 0, 0],
-        "92": [0.08333, 0.69444, 0, 0],
-        "93": [0.08333, 0.69444, 0, 0],
-        "94": [0, 0.61111, 0, 0],
-        "95": [0.09514, 0, 0, 0],
-        "96": [0, 0.61111, 0, 0],
-        "97": [0, 0.43056, 0, 0],
-        "98": [0, 0.61111, 0, 0],
-        "99": [0, 0.43056, 0, 0],
-        "100": [0, 0.61111, 0, 0],
-        "101": [0, 0.43056, 0, 0],
-        "102": [0, 0.61111, 0, 0],
-        "103": [0.22222, 0.43056, 0, 0],
-        "104": [0, 0.61111, 0, 0],
-        "105": [0, 0.61111, 0, 0],
-        "106": [0.22222, 0.61111, 0, 0],
-        "107": [0, 0.61111, 0, 0],
-        "108": [0, 0.61111, 0, 0],
-        "109": [0, 0.43056, 0, 0],
-        "110": [0, 0.43056, 0, 0],
-        "111": [0, 0.43056, 0, 0],
-        "112": [0.22222, 0.43056, 0, 0],
-        "113": [0.22222, 0.43056, 0, 0],
-        "114": [0, 0.43056, 0, 0],
-        "115": [0, 0.43056, 0, 0],
-        "116": [0, 0.55358, 0, 0],
-        "117": [0, 0.43056, 0, 0],
-        "118": [0, 0.43056, 0, 0],
-        "119": [0, 0.43056, 0, 0],
-        "120": [0, 0.43056, 0, 0],
-        "121": [0.22222, 0.43056, 0, 0],
-        "122": [0, 0.43056, 0, 0],
-        "123": [0.08333, 0.69444, 0, 0],
-        "124": [0.08333, 0.69444, 0, 0],
-        "125": [0.08333, 0.69444, 0, 0],
-        "126": [0, 0.61111, 0, 0],
-        "127": [0, 0.61111, 0, 0],
-        "305": [0, 0.43056, 0, 0],
-        "567": [0.22222, 0.43056, 0, 0],
-        "768": [0, 0.61111, 0, 0],
-        "769": [0, 0.61111, 0, 0],
-        "770": [0, 0.61111, 0, 0],
-        "771": [0, 0.61111, 0, 0],
-        "772": [0, 0.56555, 0, 0],
-        "774": [0, 0.61111, 0, 0],
-        "776": [0, 0.61111, 0, 0],
-        "778": [0, 0.61111, 0, 0],
-        "780": [0, 0.56597, 0, 0],
-        "915": [0, 0.61111, 0, 0],
-        "916": [0, 0.61111, 0, 0],
-        "920": [0, 0.61111, 0, 0],
-        "923": [0, 0.61111, 0, 0],
-        "926": [0, 0.61111, 0, 0],
-        "928": [0, 0.61111, 0, 0],
-        "931": [0, 0.61111, 0, 0],
-        "933": [0, 0.61111, 0, 0],
-        "934": [0, 0.61111, 0, 0],
-        "936": [0, 0.61111, 0, 0],
-        "937": [0, 0.61111, 0, 0],
-        "2018": [0, 0.61111, 0, 0],
-        "2019": [0, 0.61111, 0, 0],
-        "8242": [0, 0.61111, 0, 0]
-    }
-};
-
-},{}],19:[function(require,module,exports){
-var utils = require("./utils");
-var ParseError = require("./ParseError");
-var parseData = require("./parseData");
-var ParseNode = parseData.ParseNode;
-
-/* This file contains a list of functions that we parse, identified by
- * the calls to defineFunction.
- *
- * The first argument to defineFunction is a single name or a list of names.
- * All functions named in such a list will share a single implementation.
- *
- * Each declared function can have associated properties, which
- * include the following:
- *
- *  - numArgs: The number of arguments the function takes.
- *             If this is the only property, it can be passed as a number
- *             instead of an element of a properties object.
- *  - argTypes: (optional) An array corresponding to each argument of the
- *              function, giving the type of argument that should be parsed. Its
- *              length should be equal to `numArgs + numOptionalArgs`. Valid
- *              types:
- *               - "size": A size-like thing, such as "1em" or "5ex"
- *               - "color": An html color, like "#abc" or "blue"
- *               - "original": The same type as the environment that the
- *                             function being parsed is in (e.g. used for the
- *                             bodies of functions like \color where the first
- *                             argument is special and the second argument is
- *                             parsed normally)
- *              Other possible types (probably shouldn't be used)
- *               - "text": Text-like (e.g. \text)
- *               - "math": Normal math
- *              If undefined, this will be treated as an appropriate length
- *              array of "original" strings
- *  - greediness: (optional) The greediness of the function to use ungrouped
- *                arguments.
- *
- *                E.g. if you have an expression
- *                  \sqrt \frac 1 2
- *                since \frac has greediness=2 vs \sqrt's greediness=1, \frac
- *                will use the two arguments '1' and '2' as its two arguments,
- *                then that whole function will be used as the argument to
- *                \sqrt. On the other hand, the expressions
- *                  \frac \frac 1 2 3
- *                and
- *                  \frac \sqrt 1 2
- *                will fail because \frac and \frac have equal greediness
- *                and \sqrt has a lower greediness than \frac respectively. To
- *                make these parse, we would have to change them to:
- *                  \frac {\frac 1 2} 3
- *                and
- *                  \frac {\sqrt 1} 2
- *
- *                The default value is `1`
- *  - allowedInText: (optional) Whether or not the function is allowed inside
- *                   text mode (default false)
- *  - numOptionalArgs: (optional) The number of optional arguments the function
- *                     should parse. If the optional arguments aren't found,
- *                     `null` will be passed to the handler in their place.
- *                     (default 0)
- *  - infix: (optional) Must be true if the function is an infix operator.
- *
- * The last argument is that implementation, the handler for the function(s).
- * It is called to handle these functions and their arguments.
- * It receives two arguments:
- *  - context contains information and references provided by the parser
- *  - args is an array of arguments obtained from TeX input
- * The context contains the following properties:
- *  - funcName: the text (i.e. name) of the function, including \
- *  - parser: the parser object
- *  - lexer: the lexer object
- *  - positions: the positions in the overall string of the function
- *               and the arguments.
- * The latter three should only be used to produce error messages.
- *
- * The function should return an object with the following keys:
- *  - type: The type of element that this is. This is then used in
- *          buildHTML/buildMathML to determine which function
- *          should be called to build this node into a DOM node
- * Any other data can be added to the object, which will be passed
- * in to the function in buildHTML/buildMathML as `group.value`.
- */
-
-function defineFunction(names, props, handler) {
-    if (typeof names === "string") {
-        names = [names];
-    }
-    if (typeof props === "number") {
-        props = { numArgs: props };
-    }
-    // Set default values of functions
-    var data = {
-        numArgs: props.numArgs,
-        argTypes: props.argTypes,
-        greediness: (props.greediness === undefined) ? 1 : props.greediness,
-        allowedInText: !!props.allowedInText,
-        numOptionalArgs: props.numOptionalArgs || 0,
-        infix: !!props.infix,
-        handler: handler
-    };
-    for (var i = 0; i < names.length; ++i) {
-        module.exports[names[i]] = data;
-    }
-}
-
-// Since the corresponding buildHTML/buildMathML function expects a
-// list of elements, we normalize for different kinds of arguments
-var ordargument = function(arg) {
-    if (arg.type === "ordgroup") {
-        return arg.value;
-    } else {
-        return [arg];
-    }
-};
-
-// A normal square root
-defineFunction("\\sqrt", {
-    numArgs: 1,
-    numOptionalArgs: 1
-}, function(context, args) {
-    var index = args[0];
-    var body = args[1];
-    return {
-        type: "sqrt",
-        body: body,
-        index: index
-    };
-});
-
-// Non-mathy text, possibly in a font
-var textFunctionStyles = {
-    "\\text": undefined, "\\textrm": "mathrm", "\\textsf": "mathsf",
-    "\\texttt": "mathtt", "\\textnormal": "mathrm", "\\textbf": "mathbf",
-    "\\textit": "textit"
-};
-
-defineFunction([
-    "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal",
-    "\\textbf", "\\textit"
-], {
-    numArgs: 1,
-    argTypes: ["text"],
-    greediness: 2,
-    allowedInText: true
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "text",
-        body: ordargument(body),
-        style: textFunctionStyles[context.funcName]
-    };
-});
-
-// A two-argument custom color
-defineFunction("\\color", {
-    numArgs: 2,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "original"]
-}, function(context, args) {
-    var color = args[0];
-    var body = args[1];
-    return {
-        type: "color",
-        color: color.value,
-        value: ordargument(body)
-    };
-});
-
-// An overline
-defineFunction("\\overline", {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "overline",
-        body: body
-    };
-});
-
-// An underline
-defineFunction("\\underline", {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "underline",
-        body: body
-    };
-});
-
-// A box of the width and height
-defineFunction("\\rule", {
-    numArgs: 2,
-    numOptionalArgs: 1,
-    argTypes: ["size", "size", "size"]
-}, function(context, args) {
-    var shift = args[0];
-    var width = args[1];
-    var height = args[2];
-    return {
-        type: "rule",
-        shift: shift && shift.value,
-        width: width.value,
-        height: height.value
-    };
-});
-
-// TODO: In TeX, \mkern only accepts mu-units, and \kern does not accept
-// mu-units. In current KaTeX we relax this; both commands accept any unit.
-defineFunction(["\\kern", "\\mkern"], {
-    numArgs: 1,
-    argTypes: ["size"]
-}, function(context, args) {
-    return {
-        type: "kern",
-        dimension: args[0].value
-    };
-});
-
-// A KaTeX logo
-defineFunction("\\KaTeX", {
-    numArgs: 0
-}, function(context) {
-    return {
-        type: "katex"
-    };
-});
-
-defineFunction("\\phantom", {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "phantom",
-        value: ordargument(body)
-    };
-});
-
-// Math class commands except \mathop
-defineFunction([
-    "\\mathord", "\\mathbin", "\\mathrel", "\\mathopen",
-    "\\mathclose", "\\mathpunct", "\\mathinner"
-], {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "mclass",
-        mclass: "m" + context.funcName.substr(5),
-        value: ordargument(body)
-    };
-});
-
-// Build a relation by placing one symbol on top of another
-defineFunction("\\stackrel", {
-    numArgs: 2
-}, function(context, args) {
-    var top = args[0];
-    var bottom = args[1];
-
-    var bottomop = new ParseNode("op", {
-        type: "op",
-        limits: true,
-        alwaysHandleSupSub: true,
-        symbol: false,
-        value: ordargument(bottom)
-    }, bottom.mode);
-
-    var supsub = new ParseNode("supsub", {
-        base: bottomop,
-        sup: top,
-        sub: null
-    }, top.mode);
-
-    return {
-        type: "mclass",
-        mclass: "mrel",
-        value: [supsub]
-    };
-});
-
-// \mod-type functions
-defineFunction("\\bmod", {
-    numArgs: 0
-}, function(context, args) {
-    return {
-        type: "mod",
-        modType: "bmod",
-        value: null
-    };
-});
-
-defineFunction(["\\pod", "\\pmod", "\\mod"], {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "mod",
-        modType: context.funcName.substr(1),
-        value: ordargument(body)
-    };
-});
-
-// Extra data needed for the delimiter handler down below
-var delimiterSizes = {
-    "\\bigl" : {mclass: "mopen",    size: 1},
-    "\\Bigl" : {mclass: "mopen",    size: 2},
-    "\\biggl": {mclass: "mopen",    size: 3},
-    "\\Biggl": {mclass: "mopen",    size: 4},
-    "\\bigr" : {mclass: "mclose",   size: 1},
-    "\\Bigr" : {mclass: "mclose",   size: 2},
-    "\\biggr": {mclass: "mclose",   size: 3},
-    "\\Biggr": {mclass: "mclose",   size: 4},
-    "\\bigm" : {mclass: "mrel",     size: 1},
-    "\\Bigm" : {mclass: "mrel",     size: 2},
-    "\\biggm": {mclass: "mrel",     size: 3},
-    "\\Biggm": {mclass: "mrel",     size: 4},
-    "\\big"  : {mclass: "mord",     size: 1},
-    "\\Big"  : {mclass: "mord",     size: 2},
-    "\\bigg" : {mclass: "mord",     size: 3},
-    "\\Bigg" : {mclass: "mord",     size: 4}
-};
-
-var delimiters = [
-    "(", ")", "[", "\\lbrack", "]", "\\rbrack",
-    "\\{", "\\lbrace", "\\}", "\\rbrace",
-    "\\lfloor", "\\rfloor", "\\lceil", "\\rceil",
-    "<", ">", "\\langle", "\\rangle", "\\lt", "\\gt",
-    "\\lvert", "\\rvert", "\\lVert", "\\rVert",
-    "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache",
-    "/", "\\backslash",
-    "|", "\\vert", "\\|", "\\Vert",
-    "\\uparrow", "\\Uparrow",
-    "\\downarrow", "\\Downarrow",
-    "\\updownarrow", "\\Updownarrow",
-    "."
-];
-
-var fontAliases = {
-    "\\Bbb": "\\mathbb",
-    "\\bold": "\\mathbf",
-    "\\frak": "\\mathfrak"
-};
-
-// Single-argument color functions
-defineFunction([
-    "\\blue", "\\orange", "\\pink", "\\red",
-    "\\green", "\\gray", "\\purple",
-    "\\blueA", "\\blueB", "\\blueC", "\\blueD", "\\blueE",
-    "\\tealA", "\\tealB", "\\tealC", "\\tealD", "\\tealE",
-    "\\greenA", "\\greenB", "\\greenC", "\\greenD", "\\greenE",
-    "\\goldA", "\\goldB", "\\goldC", "\\goldD", "\\goldE",
-    "\\redA", "\\redB", "\\redC", "\\redD", "\\redE",
-    "\\maroonA", "\\maroonB", "\\maroonC", "\\maroonD", "\\maroonE",
-    "\\purpleA", "\\purpleB", "\\purpleC", "\\purpleD", "\\purpleE",
-    "\\mintA", "\\mintB", "\\mintC",
-    "\\grayA", "\\grayB", "\\grayC", "\\grayD", "\\grayE",
-    "\\grayF", "\\grayG", "\\grayH", "\\grayI",
-    "\\kaBlue", "\\kaGreen"
-], {
-    numArgs: 1,
-    allowedInText: true,
-    greediness: 3
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "color",
-        color: "katex-" + context.funcName.slice(1),
-        value: ordargument(body)
-    };
-});
-
-// There are 2 flags for operators; whether they produce limits in
-// displaystyle, and whether they are symbols and should grow in
-// displaystyle. These four groups cover the four possible choices.
-
-// No limits, not symbols
-defineFunction([
-    "\\arcsin", "\\arccos", "\\arctan", "\\arg", "\\cos", "\\cosh",
-    "\\cot", "\\coth", "\\csc", "\\deg", "\\dim", "\\exp", "\\hom",
-    "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh",
-    "\\tan", "\\tanh"
-], {
-    numArgs: 0
-}, function(context) {
-    return {
-        type: "op",
-        limits: false,
-        symbol: false,
-        body: context.funcName
-    };
-});
-
-// Limits, not symbols
-defineFunction([
-    "\\det", "\\gcd", "\\inf", "\\lim", "\\liminf", "\\limsup", "\\max",
-    "\\min", "\\Pr", "\\sup"
-], {
-    numArgs: 0
-}, function(context) {
-    return {
-        type: "op",
-        limits: true,
-        symbol: false,
-        body: context.funcName
-    };
-});
-
-// No limits, symbols
-defineFunction([
-    "\\int", "\\iint", "\\iiint", "\\oint"
-], {
-    numArgs: 0
-}, function(context) {
-    return {
-        type: "op",
-        limits: false,
-        symbol: true,
-        body: context.funcName
-    };
-});
-
-// Limits, symbols
-defineFunction([
-    "\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap",
-    "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes",
-    "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint"
-], {
-    numArgs: 0
-}, function(context) {
-    return {
-        type: "op",
-        limits: true,
-        symbol: true,
-        body: context.funcName
-    };
-});
-
-// \mathop class command
-defineFunction("\\mathop", {
-    numArgs: 1
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: "op",
-        limits: false,
-        symbol: false,
-        value: ordargument(body)
-    };
-});
-
-// Fractions
-defineFunction([
-    "\\dfrac", "\\frac", "\\tfrac",
-    "\\dbinom", "\\binom", "\\tbinom",
-    "\\\\atopfrac" // can’t be entered directly
-], {
-    numArgs: 2,
-    greediness: 2
-}, function(context, args) {
-    var numer = args[0];
-    var denom = args[1];
-    var hasBarLine;
-    var leftDelim = null;
-    var rightDelim = null;
-    var size = "auto";
-
-    switch (context.funcName) {
-        case "\\dfrac":
-        case "\\frac":
-        case "\\tfrac":
-            hasBarLine = true;
-            break;
-        case "\\\\atopfrac":
-            hasBarLine = false;
-            break;
-        case "\\dbinom":
-        case "\\binom":
-        case "\\tbinom":
-            hasBarLine = false;
-            leftDelim = "(";
-            rightDelim = ")";
-            break;
-        default:
-            throw new Error("Unrecognized genfrac command");
-    }
-
-    switch (context.funcName) {
-        case "\\dfrac":
-        case "\\dbinom":
-            size = "display";
-            break;
-        case "\\tfrac":
-        case "\\tbinom":
-            size = "text";
-            break;
-    }
-
-    return {
-        type: "genfrac",
-        numer: numer,
-        denom: denom,
-        hasBarLine: hasBarLine,
-        leftDelim: leftDelim,
-        rightDelim: rightDelim,
-        size: size
-    };
-});
-
-// Left and right overlap functions
-defineFunction(["\\llap", "\\rlap"], {
-    numArgs: 1,
-    allowedInText: true
-}, function(context, args) {
-    var body = args[0];
-    return {
-        type: context.funcName.slice(1),
-        body: body
-    };
-});
-
-// Delimiter functions
-var checkDelimiter = function(delim, context) {
-    if (utils.contains(delimiters, delim.value)) {
-        return delim;
-    } else {
-        throw new ParseError(
-            "Invalid delimiter: '" + delim.value + "' after '" +
-            context.funcName + "'", delim);
-    }
-};
-
-defineFunction([
-    "\\bigl", "\\Bigl", "\\biggl", "\\Biggl",
-    "\\bigr", "\\Bigr", "\\biggr", "\\Biggr",
-    "\\bigm", "\\Bigm", "\\biggm", "\\Biggm",
-    "\\big",  "\\Big",  "\\bigg",  "\\Bigg"
-], {
-    numArgs: 1
-}, function(context, args) {
-    var delim = checkDelimiter(args[0], context);
-
-    return {
-        type: "delimsizing",
-        size: delimiterSizes[context.funcName].size,
-        mclass: delimiterSizes[context.funcName].mclass,
-        value: delim.value
-    };
-});
-
-defineFunction([
-    "\\left", "\\right"
-], {
-    numArgs: 1
-}, function(context, args) {
-    var delim = checkDelimiter(args[0], context);
-
-    // \left and \right are caught somewhere in Parser.js, which is
-    // why this data doesn't match what is in buildHTML.
-    return {
-        type: "leftright",
-        value: delim.value
-    };
-});
-
-defineFunction("\\middle", {
-    numArgs: 1
-}, function(context, args) {
-    var delim = checkDelimiter(args[0], context);
-    if (!context.parser.leftrightDepth) {
-        throw new ParseError("\\middle without preceding \\left", delim);
-    }
-
-    return {
-        type: "middle",
-        value: delim.value
-    };
-});
-
-// Sizing functions (handled in Parser.js explicitly, hence no handler)
-defineFunction([
-    "\\tiny", "\\scriptsize", "\\footnotesize", "\\small",
-    "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"
-], 0, null);
-
-// Style changing functions (handled in Parser.js explicitly, hence no
-// handler)
-defineFunction([
-    "\\displaystyle", "\\textstyle", "\\scriptstyle",
-    "\\scriptscriptstyle"
-], 0, null);
-
-defineFunction([
-    // styles
-    "\\mathrm", "\\mathit", "\\mathbf",
-
-    // families
-    "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf",
-    "\\mathtt",
-
-    // aliases
-    "\\Bbb", "\\bold", "\\frak"
-], {
-    numArgs: 1,
-    greediness: 2
-}, function(context, args) {
-    var body = args[0];
-    var func = context.funcName;
-    if (func in fontAliases) {
-        func = fontAliases[func];
-    }
-    return {
-        type: "font",
-        font: func.slice(1),
-        body: body
-    };
-});
-
-// Accents
-defineFunction([
-    "\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve",
-    "\\check", "\\hat", "\\vec", "\\dot"
-    // We don't support expanding accents yet
-    // "\\widetilde", "\\widehat"
-], {
-    numArgs: 1
-}, function(context, args) {
-    var base = args[0];
-    return {
-        type: "accent",
-        accent: context.funcName,
-        base: base
-    };
-});
-
-// Infix generalized fractions
-defineFunction(["\\over", "\\choose", "\\atop"], {
-    numArgs: 0,
-    infix: true
-}, function(context) {
-    var replaceWith;
-    switch (context.funcName) {
-        case "\\over":
-            replaceWith = "\\frac";
-            break;
-        case "\\choose":
-            replaceWith = "\\binom";
-            break;
-        case "\\atop":
-            replaceWith = "\\\\atopfrac";
-            break;
-        default:
-            throw new Error("Unrecognized infix genfrac command");
-    }
-    return {
-        type: "infix",
-        replaceWith: replaceWith,
-        token: context.token
-    };
-});
-
-// Row breaks for aligned data
-defineFunction(["\\\\", "\\cr"], {
-    numArgs: 0,
-    numOptionalArgs: 1,
-    argTypes: ["size"]
-}, function(context, args) {
-    var size = args[0];
-    return {
-        type: "cr",
-        size: size
-    };
-});
-
-// Environment delimiters
-defineFunction(["\\begin", "\\end"], {
-    numArgs: 1,
-    argTypes: ["text"]
-}, function(context, args) {
-    var nameGroup = args[0];
-    if (nameGroup.type !== "ordgroup") {
-        throw new ParseError("Invalid environment name", nameGroup);
-    }
-    var name = "";
-    for (var i = 0; i < nameGroup.value.length; ++i) {
-        name += nameGroup.value[i].value;
-    }
-    return {
-        type: "environment",
-        name: name,
-        nameGroup: nameGroup
-    };
-});
-
-},{"./ParseError":6,"./parseData":21,"./utils":25}],20:[function(require,module,exports){
-/**
- * These objects store data about MathML nodes. This is the MathML equivalent
- * of the types in domTree.js. Since MathML handles its own rendering, and
- * since we're mainly using MathML to improve accessibility, we don't manage
- * any of the styling state that the plain DOM nodes do.
- *
- * The `toNode` and `toMarkup` functions work simlarly to how they do in
- * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.
- */
-
-var utils = require("./utils");
-
-/**
- * This node represents a general purpose MathML node of any type. The
- * constructor requires the type of node to create (for example, `"mo"` or
- * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags).
- */
-function MathNode(type, children) {
-    this.type = type;
-    this.attributes = {};
-    this.children = children || [];
-}
-
-/**
- * Sets an attribute on a MathML node. MathML depends on attributes to convey a
- * semantic content, so this is used heavily.
- */
-MathNode.prototype.setAttribute = function(name, value) {
-    this.attributes[name] = value;
-};
-
-/**
- * Converts the math node into a MathML-namespaced DOM element.
- */
-MathNode.prototype.toNode = function() {
-    var node = document.createElementNS(
-        "http://www.w3.org/1998/Math/MathML", this.type);
-
-    for (var attr in this.attributes) {
-        if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-            node.setAttribute(attr, this.attributes[attr]);
-        }
-    }
-
-    for (var i = 0; i < this.children.length; i++) {
-        node.appendChild(this.children[i].toNode());
-    }
-
-    return node;
-};
-
-/**
- * Converts the math node into an HTML markup string.
- */
-MathNode.prototype.toMarkup = function() {
-    var markup = "<" + this.type;
-
-    // Add the attributes
-    for (var attr in this.attributes) {
-        if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-            markup += " " + attr + "=\"";
-            markup += utils.escape(this.attributes[attr]);
-            markup += "\"";
-        }
-    }
-
-    markup += ">";
-
-    for (var i = 0; i < this.children.length; i++) {
-        markup += this.children[i].toMarkup();
-    }
-
-    markup += "</" + this.type + ">";
-
-    return markup;
-};
-
-/**
- * This node represents a piece of text.
- */
-function TextNode(text) {
-    this.text = text;
-}
-
-/**
- * Converts the text node into a DOM text node.
- */
-TextNode.prototype.toNode = function() {
-    return document.createTextNode(this.text);
-};
-
-/**
- * Converts the text node into HTML markup (which is just the text itself).
- */
-TextNode.prototype.toMarkup = function() {
-    return utils.escape(this.text);
-};
-
-module.exports = {
-    MathNode: MathNode,
-    TextNode: TextNode
-};
-
-},{"./utils":25}],21:[function(require,module,exports){
-/**
- * The resulting parse tree nodes of the parse tree.
- *
- * It is possible to provide position information, so that a ParseNode can
- * fulfil a role similar to a Token in error reporting.
- * For details on the corresponding properties see Token constructor.
- * Providing such information can lead to better error reporting.
- *
- * @param {string}  type       type of node, like e.g. "ordgroup"
- * @param {?object} value      type-specific representation of the node
- * @param {string}  mode       parse mode in action for this node,
- *                             "math" or "text"
- * @param {Token=} firstToken  first token of the input for this node,
- *                             will omit position information if unset
- * @param {Token=} lastToken   last token of the input for this node,
- *                             will default to firstToken if unset
- */
-function ParseNode(type, value, mode, firstToken, lastToken) {
-    this.type = type;
-    this.value = value;
-    this.mode = mode;
-    if (firstToken && (!lastToken || lastToken.lexer === firstToken.lexer)) {
-        this.lexer = firstToken.lexer;
-        this.start = firstToken.start;
-        this.end = (lastToken || firstToken).end;
-    }
-}
-
-module.exports = {
-    ParseNode: ParseNode
-};
-
-
-},{}],22:[function(require,module,exports){
-/**
- * Provides a single function for parsing an expression using a Parser
- * TODO(emily): Remove this
- */
-
-var Parser = require("./Parser");
-
-/**
- * Parses an expression using a Parser, then returns the parsed result.
- */
-var parseTree = function(toParse, settings) {
-    if (!(typeof toParse === 'string' || toParse instanceof String)) {
-        throw new TypeError('KaTeX can only parse string typed expression');
-    }
-    var parser = new Parser(toParse, settings);
-
-    return parser.parse();
-};
-
-module.exports = parseTree;
-
-},{"./Parser":7}],23:[function(require,module,exports){
-/**
- * This file holds a list of all no-argument functions and single-character
- * symbols (like 'a' or ';').
- *
- * For each of the symbols, there are three properties they can have:
- * - font (required): the font to be used for this symbol. Either "main" (the
-     normal font), or "ams" (the ams fonts).
- * - group (required): the ParseNode group type the symbol should have (i.e.
-     "textord", "mathord", etc).
-     See https://github.com/Khan/KaTeX/wiki/Examining-TeX#group-types
- * - replace: the character that this symbol or function should be
- *   replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi
- *   character in the main font).
- *
- * The outermost map in the table indicates what mode the symbols should be
- * accepted in (e.g. "math" or "text").
- */
-
-module.exports = {
-    math: {},
-    text: {}
-};
-
-function defineSymbol(mode, font, group, replace, name) {
-    module.exports[mode][name] = {
-        font: font,
-        group: group,
-        replace: replace
-    };
-}
-
-// Some abbreviations for commonly used strings.
-// This helps minify the code, and also spotting typos using jshint.
-
-// modes:
-var math = "math";
-var text = "text";
-
-// fonts:
-var main = "main";
-var ams = "ams";
-
-// groups:
-var accent = "accent";
-var bin = "bin";
-var close = "close";
-var inner = "inner";
-var mathord = "mathord";
-var op = "op";
-var open = "open";
-var punct = "punct";
-var rel = "rel";
-var spacing = "spacing";
-var textord = "textord";
-
-// Now comes the symbol table
-
-// Relation Symbols
-defineSymbol(math, main, rel, "\u2261", "\\equiv");
-defineSymbol(math, main, rel, "\u227a", "\\prec");
-defineSymbol(math, main, rel, "\u227b", "\\succ");
-defineSymbol(math, main, rel, "\u223c", "\\sim");
-defineSymbol(math, main, rel, "\u22a5", "\\perp");
-defineSymbol(math, main, rel, "\u2aaf", "\\preceq");
-defineSymbol(math, main, rel, "\u2ab0", "\\succeq");
-defineSymbol(math, main, rel, "\u2243", "\\simeq");
-defineSymbol(math, main, rel, "\u2223", "\\mid");
-defineSymbol(math, main, rel, "\u226a", "\\ll");
-defineSymbol(math, main, rel, "\u226b", "\\gg");
-defineSymbol(math, main, rel, "\u224d", "\\asymp");
-defineSymbol(math, main, rel, "\u2225", "\\parallel");
-defineSymbol(math, main, rel, "\u22c8", "\\bowtie");
-defineSymbol(math, main, rel, "\u2323", "\\smile");
-defineSymbol(math, main, rel, "\u2291", "\\sqsubseteq");
-defineSymbol(math, main, rel, "\u2292", "\\sqsupseteq");
-defineSymbol(math, main, rel, "\u2250", "\\doteq");
-defineSymbol(math, main, rel, "\u2322", "\\frown");
-defineSymbol(math, main, rel, "\u220b", "\\ni");
-defineSymbol(math, main, rel, "\u221d", "\\propto");
-defineSymbol(math, main, rel, "\u22a2", "\\vdash");
-defineSymbol(math, main, rel, "\u22a3", "\\dashv");
-defineSymbol(math, main, rel, "\u220b", "\\owns");
-
-// Punctuation
-defineSymbol(math, main, punct, "\u002e", "\\ldotp");
-defineSymbol(math, main, punct, "\u22c5", "\\cdotp");
-
-// Misc Symbols
-defineSymbol(math, main, textord, "\u0023", "\\#");
-defineSymbol(text, main, textord, "\u0023", "\\#");
-defineSymbol(math, main, textord, "\u0026", "\\&");
-defineSymbol(text, main, textord, "\u0026", "\\&");
-defineSymbol(math, main, textord, "\u2135", "\\aleph");
-defineSymbol(math, main, textord, "\u2200", "\\forall");
-defineSymbol(math, main, textord, "\u210f", "\\hbar");
-defineSymbol(math, main, textord, "\u2203", "\\exists");
-defineSymbol(math, main, textord, "\u2207", "\\nabla");
-defineSymbol(math, main, textord, "\u266d", "\\flat");
-defineSymbol(math, main, textord, "\u2113", "\\ell");
-defineSymbol(math, main, textord, "\u266e", "\\natural");
-defineSymbol(math, main, textord, "\u2663", "\\clubsuit");
-defineSymbol(math, main, textord, "\u2118", "\\wp");
-defineSymbol(math, main, textord, "\u266f", "\\sharp");
-defineSymbol(math, main, textord, "\u2662", "\\diamondsuit");
-defineSymbol(math, main, textord, "\u211c", "\\Re");
-defineSymbol(math, main, textord, "\u2661", "\\heartsuit");
-defineSymbol(math, main, textord, "\u2111", "\\Im");
-defineSymbol(math, main, textord, "\u2660", "\\spadesuit");
-
-// Math and Text
-defineSymbol(math, main, textord, "\u2020", "\\dag");
-defineSymbol(math, main, textord, "\u2021", "\\ddag");
-
-// Large Delimiters
-defineSymbol(math, main, close, "\u23b1", "\\rmoustache");
-defineSymbol(math, main, open, "\u23b0", "\\lmoustache");
-defineSymbol(math, main, close, "\u27ef", "\\rgroup");
-defineSymbol(math, main, open, "\u27ee", "\\lgroup");
-
-// Binary Operators
-defineSymbol(math, main, bin, "\u2213", "\\mp");
-defineSymbol(math, main, bin, "\u2296", "\\ominus");
-defineSymbol(math, main, bin, "\u228e", "\\uplus");
-defineSymbol(math, main, bin, "\u2293", "\\sqcap");
-defineSymbol(math, main, bin, "\u2217", "\\ast");
-defineSymbol(math, main, bin, "\u2294", "\\sqcup");
-defineSymbol(math, main, bin, "\u25ef", "\\bigcirc");
-defineSymbol(math, main, bin, "\u2219", "\\bullet");
-defineSymbol(math, main, bin, "\u2021", "\\ddagger");
-defineSymbol(math, main, bin, "\u2240", "\\wr");
-defineSymbol(math, main, bin, "\u2a3f", "\\amalg");
-
-// Arrow Symbols
-defineSymbol(math, main, rel, "\u27f5", "\\longleftarrow");
-defineSymbol(math, main, rel, "\u21d0", "\\Leftarrow");
-defineSymbol(math, main, rel, "\u27f8", "\\Longleftarrow");
-defineSymbol(math, main, rel, "\u27f6", "\\longrightarrow");
-defineSymbol(math, main, rel, "\u21d2", "\\Rightarrow");
-defineSymbol(math, main, rel, "\u27f9", "\\Longrightarrow");
-defineSymbol(math, main, rel, "\u2194", "\\leftrightarrow");
-defineSymbol(math, main, rel, "\u27f7", "\\longleftrightarrow");
-defineSymbol(math, main, rel, "\u21d4", "\\Leftrightarrow");
-defineSymbol(math, main, rel, "\u27fa", "\\Longleftrightarrow");
-defineSymbol(math, main, rel, "\u21a6", "\\mapsto");
-defineSymbol(math, main, rel, "\u27fc", "\\longmapsto");
-defineSymbol(math, main, rel, "\u2197", "\\nearrow");
-defineSymbol(math, main, rel, "\u21a9", "\\hookleftarrow");
-defineSymbol(math, main, rel, "\u21aa", "\\hookrightarrow");
-defineSymbol(math, main, rel, "\u2198", "\\searrow");
-defineSymbol(math, main, rel, "\u21bc", "\\leftharpoonup");
-defineSymbol(math, main, rel, "\u21c0", "\\rightharpoonup");
-defineSymbol(math, main, rel, "\u2199", "\\swarrow");
-defineSymbol(math, main, rel, "\u21bd", "\\leftharpoondown");
-defineSymbol(math, main, rel, "\u21c1", "\\rightharpoondown");
-defineSymbol(math, main, rel, "\u2196", "\\nwarrow");
-defineSymbol(math, main, rel, "\u21cc", "\\rightleftharpoons");
-
-// AMS Negated Binary Relations
-defineSymbol(math, ams, rel, "\u226e", "\\nless");
-defineSymbol(math, ams, rel, "\ue010", "\\nleqslant");
-defineSymbol(math, ams, rel, "\ue011", "\\nleqq");
-defineSymbol(math, ams, rel, "\u2a87", "\\lneq");
-defineSymbol(math, ams, rel, "\u2268", "\\lneqq");
-defineSymbol(math, ams, rel, "\ue00c", "\\lvertneqq");
-defineSymbol(math, ams, rel, "\u22e6", "\\lnsim");
-defineSymbol(math, ams, rel, "\u2a89", "\\lnapprox");
-defineSymbol(math, ams, rel, "\u2280", "\\nprec");
-defineSymbol(math, ams, rel, "\u22e0", "\\npreceq");
-defineSymbol(math, ams, rel, "\u22e8", "\\precnsim");
-defineSymbol(math, ams, rel, "\u2ab9", "\\precnapprox");
-defineSymbol(math, ams, rel, "\u2241", "\\nsim");
-defineSymbol(math, ams, rel, "\ue006", "\\nshortmid");
-defineSymbol(math, ams, rel, "\u2224", "\\nmid");
-defineSymbol(math, ams, rel, "\u22ac", "\\nvdash");
-defineSymbol(math, ams, rel, "\u22ad", "\\nvDash");
-defineSymbol(math, ams, rel, "\u22ea", "\\ntriangleleft");
-defineSymbol(math, ams, rel, "\u22ec", "\\ntrianglelefteq");
-defineSymbol(math, ams, rel, "\u228a", "\\subsetneq");
-defineSymbol(math, ams, rel, "\ue01a", "\\varsubsetneq");
-defineSymbol(math, ams, rel, "\u2acb", "\\subsetneqq");
-defineSymbol(math, ams, rel, "\ue017", "\\varsubsetneqq");
-defineSymbol(math, ams, rel, "\u226f", "\\ngtr");
-defineSymbol(math, ams, rel, "\ue00f", "\\ngeqslant");
-defineSymbol(math, ams, rel, "\ue00e", "\\ngeqq");
-defineSymbol(math, ams, rel, "\u2a88", "\\gneq");
-defineSymbol(math, ams, rel, "\u2269", "\\gneqq");
-defineSymbol(math, ams, rel, "\ue00d", "\\gvertneqq");
-defineSymbol(math, ams, rel, "\u22e7", "\\gnsim");
-defineSymbol(math, ams, rel, "\u2a8a", "\\gnapprox");
-defineSymbol(math, ams, rel, "\u2281", "\\nsucc");
-defineSymbol(math, ams, rel, "\u22e1", "\\nsucceq");
-defineSymbol(math, ams, rel, "\u22e9", "\\succnsim");
-defineSymbol(math, ams, rel, "\u2aba", "\\succnapprox");
-defineSymbol(math, ams, rel, "\u2246", "\\ncong");
-defineSymbol(math, ams, rel, "\ue007", "\\nshortparallel");
-defineSymbol(math, ams, rel, "\u2226", "\\nparallel");
-defineSymbol(math, ams, rel, "\u22af", "\\nVDash");
-defineSymbol(math, ams, rel, "\u22eb", "\\ntriangleright");
-defineSymbol(math, ams, rel, "\u22ed", "\\ntrianglerighteq");
-defineSymbol(math, ams, rel, "\ue018", "\\nsupseteqq");
-defineSymbol(math, ams, rel, "\u228b", "\\supsetneq");
-defineSymbol(math, ams, rel, "\ue01b", "\\varsupsetneq");
-defineSymbol(math, ams, rel, "\u2acc", "\\supsetneqq");
-defineSymbol(math, ams, rel, "\ue019", "\\varsupsetneqq");
-defineSymbol(math, ams, rel, "\u22ae", "\\nVdash");
-defineSymbol(math, ams, rel, "\u2ab5", "\\precneqq");
-defineSymbol(math, ams, rel, "\u2ab6", "\\succneqq");
-defineSymbol(math, ams, rel, "\ue016", "\\nsubseteqq");
-defineSymbol(math, ams, bin, "\u22b4", "\\unlhd");
-defineSymbol(math, ams, bin, "\u22b5", "\\unrhd");
-
-// AMS Negated Arrows
-defineSymbol(math, ams, rel, "\u219a", "\\nleftarrow");
-defineSymbol(math, ams, rel, "\u219b", "\\nrightarrow");
-defineSymbol(math, ams, rel, "\u21cd", "\\nLeftarrow");
-defineSymbol(math, ams, rel, "\u21cf", "\\nRightarrow");
-defineSymbol(math, ams, rel, "\u21ae", "\\nleftrightarrow");
-defineSymbol(math, ams, rel, "\u21ce", "\\nLeftrightarrow");
-
-// AMS Misc
-defineSymbol(math, ams, rel, "\u25b3", "\\vartriangle");
-defineSymbol(math, ams, textord, "\u210f", "\\hslash");
-defineSymbol(math, ams, textord, "\u25bd", "\\triangledown");
-defineSymbol(math, ams, textord, "\u25ca", "\\lozenge");
-defineSymbol(math, ams, textord, "\u24c8", "\\circledS");
-defineSymbol(math, ams, textord, "\u00ae", "\\circledR");
-defineSymbol(math, ams, textord, "\u2221", "\\measuredangle");
-defineSymbol(math, ams, textord, "\u2204", "\\nexists");
-defineSymbol(math, ams, textord, "\u2127", "\\mho");
-defineSymbol(math, ams, textord, "\u2132", "\\Finv");
-defineSymbol(math, ams, textord, "\u2141", "\\Game");
-defineSymbol(math, ams, textord, "\u006b", "\\Bbbk");
-defineSymbol(math, ams, textord, "\u2035", "\\backprime");
-defineSymbol(math, ams, textord, "\u25b2", "\\blacktriangle");
-defineSymbol(math, ams, textord, "\u25bc", "\\blacktriangledown");
-defineSymbol(math, ams, textord, "\u25a0", "\\blacksquare");
-defineSymbol(math, ams, textord, "\u29eb", "\\blacklozenge");
-defineSymbol(math, ams, textord, "\u2605", "\\bigstar");
-defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle");
-defineSymbol(math, ams, textord, "\u2201", "\\complement");
-defineSymbol(math, ams, textord, "\u00f0", "\\eth");
-defineSymbol(math, ams, textord, "\u2571", "\\diagup");
-defineSymbol(math, ams, textord, "\u2572", "\\diagdown");
-defineSymbol(math, ams, textord, "\u25a1", "\\square");
-defineSymbol(math, ams, textord, "\u25a1", "\\Box");
-defineSymbol(math, ams, textord, "\u25ca", "\\Diamond");
-defineSymbol(math, ams, textord, "\u00a5", "\\yen");
-defineSymbol(math, ams, textord, "\u2713", "\\checkmark");
-
-// AMS Hebrew
-defineSymbol(math, ams, textord, "\u2136", "\\beth");
-defineSymbol(math, ams, textord, "\u2138", "\\daleth");
-defineSymbol(math, ams, textord, "\u2137", "\\gimel");
-
-// AMS Greek
-defineSymbol(math, ams, textord, "\u03dd", "\\digamma");
-defineSymbol(math, ams, textord, "\u03f0", "\\varkappa");
-
-// AMS Delimiters
-defineSymbol(math, ams, open, "\u250c", "\\ulcorner");
-defineSymbol(math, ams, close, "\u2510", "\\urcorner");
-defineSymbol(math, ams, open, "\u2514", "\\llcorner");
-defineSymbol(math, ams, close, "\u2518", "\\lrcorner");
-
-// AMS Binary Relations
-defineSymbol(math, ams, rel, "\u2266", "\\leqq");
-defineSymbol(math, ams, rel, "\u2a7d", "\\leqslant");
-defineSymbol(math, ams, rel, "\u2a95", "\\eqslantless");
-defineSymbol(math, ams, rel, "\u2272", "\\lesssim");
-defineSymbol(math, ams, rel, "\u2a85", "\\lessapprox");
-defineSymbol(math, ams, rel, "\u224a", "\\approxeq");
-defineSymbol(math, ams, bin, "\u22d6", "\\lessdot");
-defineSymbol(math, ams, rel, "\u22d8", "\\lll");
-defineSymbol(math, ams, rel, "\u2276", "\\lessgtr");
-defineSymbol(math, ams, rel, "\u22da", "\\lesseqgtr");
-defineSymbol(math, ams, rel, "\u2a8b", "\\lesseqqgtr");
-defineSymbol(math, ams, rel, "\u2251", "\\doteqdot");
-defineSymbol(math, ams, rel, "\u2253", "\\risingdotseq");
-defineSymbol(math, ams, rel, "\u2252", "\\fallingdotseq");
-defineSymbol(math, ams, rel, "\u223d", "\\backsim");
-defineSymbol(math, ams, rel, "\u22cd", "\\backsimeq");
-defineSymbol(math, ams, rel, "\u2ac5", "\\subseteqq");
-defineSymbol(math, ams, rel, "\u22d0", "\\Subset");
-defineSymbol(math, ams, rel, "\u228f", "\\sqsubset");
-defineSymbol(math, ams, rel, "\u227c", "\\preccurlyeq");
-defineSymbol(math, ams, rel, "\u22de", "\\curlyeqprec");
-defineSymbol(math, ams, rel, "\u227e", "\\precsim");
-defineSymbol(math, ams, rel, "\u2ab7", "\\precapprox");
-defineSymbol(math, ams, rel, "\u22b2", "\\vartriangleleft");
-defineSymbol(math, ams, rel, "\u22b4", "\\trianglelefteq");
-defineSymbol(math, ams, rel, "\u22a8", "\\vDash");
-defineSymbol(math, ams, rel, "\u22aa", "\\Vvdash");
-defineSymbol(math, ams, rel, "\u2323", "\\smallsmile");
-defineSymbol(math, ams, rel, "\u2322", "\\smallfrown");
-defineSymbol(math, ams, rel, "\u224f", "\\bumpeq");
-defineSymbol(math, ams, rel, "\u224e", "\\Bumpeq");
-defineSymbol(math, ams, rel, "\u2267", "\\geqq");
-defineSymbol(math, ams, rel, "\u2a7e", "\\geqslant");
-defineSymbol(math, ams, rel, "\u2a96", "\\eqslantgtr");
-defineSymbol(math, ams, rel, "\u2273", "\\gtrsim");
-defineSymbol(math, ams, rel, "\u2a86", "\\gtrapprox");
-defineSymbol(math, ams, bin, "\u22d7", "\\gtrdot");
-defineSymbol(math, ams, rel, "\u22d9", "\\ggg");
-defineSymbol(math, ams, rel, "\u2277", "\\gtrless");
-defineSymbol(math, ams, rel, "\u22db", "\\gtreqless");
-defineSymbol(math, ams, rel, "\u2a8c", "\\gtreqqless");
-defineSymbol(math, ams, rel, "\u2256", "\\eqcirc");
-defineSymbol(math, ams, rel, "\u2257", "\\circeq");
-defineSymbol(math, ams, rel, "\u225c", "\\triangleq");
-defineSymbol(math, ams, rel, "\u223c", "\\thicksim");
-defineSymbol(math, ams, rel, "\u2248", "\\thickapprox");
-defineSymbol(math, ams, rel, "\u2ac6", "\\supseteqq");
-defineSymbol(math, ams, rel, "\u22d1", "\\Supset");
-defineSymbol(math, ams, rel, "\u2290", "\\sqsupset");
-defineSymbol(math, ams, rel, "\u227d", "\\succcurlyeq");
-defineSymbol(math, ams, rel, "\u22df", "\\curlyeqsucc");
-defineSymbol(math, ams, rel, "\u227f", "\\succsim");
-defineSymbol(math, ams, rel, "\u2ab8", "\\succapprox");
-defineSymbol(math, ams, rel, "\u22b3", "\\vartriangleright");
-defineSymbol(math, ams, rel, "\u22b5", "\\trianglerighteq");
-defineSymbol(math, ams, rel, "\u22a9", "\\Vdash");
-defineSymbol(math, ams, rel, "\u2223", "\\shortmid");
-defineSymbol(math, ams, rel, "\u2225", "\\shortparallel");
-defineSymbol(math, ams, rel, "\u226c", "\\between");
-defineSymbol(math, ams, rel, "\u22d4", "\\pitchfork");
-defineSymbol(math, ams, rel, "\u221d", "\\varpropto");
-defineSymbol(math, ams, rel, "\u25c0", "\\blacktriangleleft");
-defineSymbol(math, ams, rel, "\u2234", "\\therefore");
-defineSymbol(math, ams, rel, "\u220d", "\\backepsilon");
-defineSymbol(math, ams, rel, "\u25b6", "\\blacktriangleright");
-defineSymbol(math, ams, rel, "\u2235", "\\because");
-defineSymbol(math, ams, rel, "\u22d8", "\\llless");
-defineSymbol(math, ams, rel, "\u22d9", "\\gggtr");
-defineSymbol(math, ams, bin, "\u22b2", "\\lhd");
-defineSymbol(math, ams, bin, "\u22b3", "\\rhd");
-defineSymbol(math, ams, rel, "\u2242", "\\eqsim");
-defineSymbol(math, main, rel, "\u22c8", "\\Join");
-defineSymbol(math, ams, rel, "\u2251", "\\Doteq");
-
-// AMS Binary Operators
-defineSymbol(math, ams, bin, "\u2214", "\\dotplus");
-defineSymbol(math, ams, bin, "\u2216", "\\smallsetminus");
-defineSymbol(math, ams, bin, "\u22d2", "\\Cap");
-defineSymbol(math, ams, bin, "\u22d3", "\\Cup");
-defineSymbol(math, ams, bin, "\u2a5e", "\\doublebarwedge");
-defineSymbol(math, ams, bin, "\u229f", "\\boxminus");
-defineSymbol(math, ams, bin, "\u229e", "\\boxplus");
-defineSymbol(math, ams, bin, "\u22c7", "\\divideontimes");
-defineSymbol(math, ams, bin, "\u22c9", "\\ltimes");
-defineSymbol(math, ams, bin, "\u22ca", "\\rtimes");
-defineSymbol(math, ams, bin, "\u22cb", "\\leftthreetimes");
-defineSymbol(math, ams, bin, "\u22cc", "\\rightthreetimes");
-defineSymbol(math, ams, bin, "\u22cf", "\\curlywedge");
-defineSymbol(math, ams, bin, "\u22ce", "\\curlyvee");
-defineSymbol(math, ams, bin, "\u229d", "\\circleddash");
-defineSymbol(math, ams, bin, "\u229b", "\\circledast");
-defineSymbol(math, ams, bin, "\u22c5", "\\centerdot");
-defineSymbol(math, ams, bin, "\u22ba", "\\intercal");
-defineSymbol(math, ams, bin, "\u22d2", "\\doublecap");
-defineSymbol(math, ams, bin, "\u22d3", "\\doublecup");
-defineSymbol(math, ams, bin, "\u22a0", "\\boxtimes");
-
-// AMS Arrows
-defineSymbol(math, ams, rel, "\u21e2", "\\dashrightarrow");
-defineSymbol(math, ams, rel, "\u21e0", "\\dashleftarrow");
-defineSymbol(math, ams, rel, "\u21c7", "\\leftleftarrows");
-defineSymbol(math, ams, rel, "\u21c6", "\\leftrightarrows");
-defineSymbol(math, ams, rel, "\u21da", "\\Lleftarrow");
-defineSymbol(math, ams, rel, "\u219e", "\\twoheadleftarrow");
-defineSymbol(math, ams, rel, "\u21a2", "\\leftarrowtail");
-defineSymbol(math, ams, rel, "\u21ab", "\\looparrowleft");
-defineSymbol(math, ams, rel, "\u21cb", "\\leftrightharpoons");
-defineSymbol(math, ams, rel, "\u21b6", "\\curvearrowleft");
-defineSymbol(math, ams, rel, "\u21ba", "\\circlearrowleft");
-defineSymbol(math, ams, rel, "\u21b0", "\\Lsh");
-defineSymbol(math, ams, rel, "\u21c8", "\\upuparrows");
-defineSymbol(math, ams, rel, "\u21bf", "\\upharpoonleft");
-defineSymbol(math, ams, rel, "\u21c3", "\\downharpoonleft");
-defineSymbol(math, ams, rel, "\u22b8", "\\multimap");
-defineSymbol(math, ams, rel, "\u21ad", "\\leftrightsquigarrow");
-defineSymbol(math, ams, rel, "\u21c9", "\\rightrightarrows");
-defineSymbol(math, ams, rel, "\u21c4", "\\rightleftarrows");
-defineSymbol(math, ams, rel, "\u21a0", "\\twoheadrightarrow");
-defineSymbol(math, ams, rel, "\u21a3", "\\rightarrowtail");
-defineSymbol(math, ams, rel, "\u21ac", "\\looparrowright");
-defineSymbol(math, ams, rel, "\u21b7", "\\curvearrowright");
-defineSymbol(math, ams, rel, "\u21bb", "\\circlearrowright");
-defineSymbol(math, ams, rel, "\u21b1", "\\Rsh");
-defineSymbol(math, ams, rel, "\u21ca", "\\downdownarrows");
-defineSymbol(math, ams, rel, "\u21be", "\\upharpoonright");
-defineSymbol(math, ams, rel, "\u21c2", "\\downharpoonright");
-defineSymbol(math, ams, rel, "\u21dd", "\\rightsquigarrow");
-defineSymbol(math, ams, rel, "\u21dd", "\\leadsto");
-defineSymbol(math, ams, rel, "\u21db", "\\Rrightarrow");
-defineSymbol(math, ams, rel, "\u21be", "\\restriction");
-
-defineSymbol(math, main, textord, "\u2018", "`");
-defineSymbol(math, main, textord, "$", "\\$");
-defineSymbol(text, main, textord, "$", "\\$");
-defineSymbol(math, main, textord, "%", "\\%");
-defineSymbol(text, main, textord, "%", "\\%");
-defineSymbol(math, main, textord, "_", "\\_");
-defineSymbol(text, main, textord, "_", "\\_");
-defineSymbol(math, main, textord, "\u2220", "\\angle");
-defineSymbol(math, main, textord, "\u221e", "\\infty");
-defineSymbol(math, main, textord, "\u2032", "\\prime");
-defineSymbol(math, main, textord, "\u25b3", "\\triangle");
-defineSymbol(math, main, textord, "\u0393", "\\Gamma");
-defineSymbol(math, main, textord, "\u0394", "\\Delta");
-defineSymbol(math, main, textord, "\u0398", "\\Theta");
-defineSymbol(math, main, textord, "\u039b", "\\Lambda");
-defineSymbol(math, main, textord, "\u039e", "\\Xi");
-defineSymbol(math, main, textord, "\u03a0", "\\Pi");
-defineSymbol(math, main, textord, "\u03a3", "\\Sigma");
-defineSymbol(math, main, textord, "\u03a5", "\\Upsilon");
-defineSymbol(math, main, textord, "\u03a6", "\\Phi");
-defineSymbol(math, main, textord, "\u03a8", "\\Psi");
-defineSymbol(math, main, textord, "\u03a9", "\\Omega");
-defineSymbol(math, main, textord, "\u00ac", "\\neg");
-defineSymbol(math, main, textord, "\u00ac", "\\lnot");
-defineSymbol(math, main, textord, "\u22a4", "\\top");
-defineSymbol(math, main, textord, "\u22a5", "\\bot");
-defineSymbol(math, main, textord, "\u2205", "\\emptyset");
-defineSymbol(math, ams, textord, "\u2205", "\\varnothing");
-defineSymbol(math, main, mathord, "\u03b1", "\\alpha");
-defineSymbol(math, main, mathord, "\u03b2", "\\beta");
-defineSymbol(math, main, mathord, "\u03b3", "\\gamma");
-defineSymbol(math, main, mathord, "\u03b4", "\\delta");
-defineSymbol(math, main, mathord, "\u03f5", "\\epsilon");
-defineSymbol(math, main, mathord, "\u03b6", "\\zeta");
-defineSymbol(math, main, mathord, "\u03b7", "\\eta");
-defineSymbol(math, main, mathord, "\u03b8", "\\theta");
-defineSymbol(math, main, mathord, "\u03b9", "\\iota");
-defineSymbol(math, main, mathord, "\u03ba", "\\kappa");
-defineSymbol(math, main, mathord, "\u03bb", "\\lambda");
-defineSymbol(math, main, mathord, "\u03bc", "\\mu");
-defineSymbol(math, main, mathord, "\u03bd", "\\nu");
-defineSymbol(math, main, mathord, "\u03be", "\\xi");
-defineSymbol(math, main, mathord, "o", "\\omicron");
-defineSymbol(math, main, mathord, "\u03c0", "\\pi");
-defineSymbol(math, main, mathord, "\u03c1", "\\rho");
-defineSymbol(math, main, mathord, "\u03c3", "\\sigma");
-defineSymbol(math, main, mathord, "\u03c4", "\\tau");
-defineSymbol(math, main, mathord, "\u03c5", "\\upsilon");
-defineSymbol(math, main, mathord, "\u03d5", "\\phi");
-defineSymbol(math, main, mathord, "\u03c7", "\\chi");
-defineSymbol(math, main, mathord, "\u03c8", "\\psi");
-defineSymbol(math, main, mathord, "\u03c9", "\\omega");
-defineSymbol(math, main, mathord, "\u03b5", "\\varepsilon");
-defineSymbol(math, main, mathord, "\u03d1", "\\vartheta");
-defineSymbol(math, main, mathord, "\u03d6", "\\varpi");
-defineSymbol(math, main, mathord, "\u03f1", "\\varrho");
-defineSymbol(math, main, mathord, "\u03c2", "\\varsigma");
-defineSymbol(math, main, mathord, "\u03c6", "\\varphi");
-defineSymbol(math, main, bin, "\u2217", "*");
-defineSymbol(math, main, bin, "+", "+");
-defineSymbol(math, main, bin, "\u2212", "-");
-defineSymbol(math, main, bin, "\u22c5", "\\cdot");
-defineSymbol(math, main, bin, "\u2218", "\\circ");
-defineSymbol(math, main, bin, "\u00f7", "\\div");
-defineSymbol(math, main, bin, "\u00b1", "\\pm");
-defineSymbol(math, main, bin, "\u00d7", "\\times");
-defineSymbol(math, main, bin, "\u2229", "\\cap");
-defineSymbol(math, main, bin, "\u222a", "\\cup");
-defineSymbol(math, main, bin, "\u2216", "\\setminus");
-defineSymbol(math, main, bin, "\u2227", "\\land");
-defineSymbol(math, main, bin, "\u2228", "\\lor");
-defineSymbol(math, main, bin, "\u2227", "\\wedge");
-defineSymbol(math, main, bin, "\u2228", "\\vee");
-defineSymbol(math, main, textord, "\u221a", "\\surd");
-defineSymbol(math, main, open, "(", "(");
-defineSymbol(math, main, open, "[", "[");
-defineSymbol(math, main, open, "\u27e8", "\\langle");
-defineSymbol(math, main, open, "\u2223", "\\lvert");
-defineSymbol(math, main, open, "\u2225", "\\lVert");
-defineSymbol(math, main, close, ")", ")");
-defineSymbol(math, main, close, "]", "]");
-defineSymbol(math, main, close, "?", "?");
-defineSymbol(math, main, close, "!", "!");
-defineSymbol(math, main, close, "\u27e9", "\\rangle");
-defineSymbol(math, main, close, "\u2223", "\\rvert");
-defineSymbol(math, main, close, "\u2225", "\\rVert");
-defineSymbol(math, main, rel, "=", "=");
-defineSymbol(math, main, rel, "<", "<");
-defineSymbol(math, main, rel, ">", ">");
-defineSymbol(math, main, rel, ":", ":");
-defineSymbol(math, main, rel, "\u2248", "\\approx");
-defineSymbol(math, main, rel, "\u2245", "\\cong");
-defineSymbol(math, main, rel, "\u2265", "\\ge");
-defineSymbol(math, main, rel, "\u2265", "\\geq");
-defineSymbol(math, main, rel, "\u2190", "\\gets");
-defineSymbol(math, main, rel, ">", "\\gt");
-defineSymbol(math, main, rel, "\u2208", "\\in");
-defineSymbol(math, main, rel, "\u2209", "\\notin");
-defineSymbol(math, main, rel, "\u2282", "\\subset");
-defineSymbol(math, main, rel, "\u2283", "\\supset");
-defineSymbol(math, main, rel, "\u2286", "\\subseteq");
-defineSymbol(math, main, rel, "\u2287", "\\supseteq");
-defineSymbol(math, ams, rel, "\u2288", "\\nsubseteq");
-defineSymbol(math, ams, rel, "\u2289", "\\nsupseteq");
-defineSymbol(math, main, rel, "\u22a8", "\\models");
-defineSymbol(math, main, rel, "\u2190", "\\leftarrow");
-defineSymbol(math, main, rel, "\u2264", "\\le");
-defineSymbol(math, main, rel, "\u2264", "\\leq");
-defineSymbol(math, main, rel, "<", "\\lt");
-defineSymbol(math, main, rel, "\u2260", "\\ne");
-defineSymbol(math, main, rel, "\u2260", "\\neq");
-defineSymbol(math, main, rel, "\u2192", "\\rightarrow");
-defineSymbol(math, main, rel, "\u2192", "\\to");
-defineSymbol(math, ams, rel, "\u2271", "\\ngeq");
-defineSymbol(math, ams, rel, "\u2270", "\\nleq");
-defineSymbol(math, main, spacing, null, "\\!");
-defineSymbol(math, main, spacing, "\u00a0", "\\ ");
-defineSymbol(math, main, spacing, "\u00a0", "~");
-defineSymbol(math, main, spacing, null, "\\,");
-defineSymbol(math, main, spacing, null, "\\:");
-defineSymbol(math, main, spacing, null, "\\;");
-defineSymbol(math, main, spacing, null, "\\enspace");
-defineSymbol(math, main, spacing, null, "\\qquad");
-defineSymbol(math, main, spacing, null, "\\quad");
-defineSymbol(math, main, spacing, "\u00a0", "\\space");
-defineSymbol(math, main, punct, ",", ",");
-defineSymbol(math, main, punct, ";", ";");
-defineSymbol(math, main, punct, ":", "\\colon");
-defineSymbol(math, ams, bin, "\u22bc", "\\barwedge");
-defineSymbol(math, ams, bin, "\u22bb", "\\veebar");
-defineSymbol(math, main, bin, "\u2299", "\\odot");
-defineSymbol(math, main, bin, "\u2295", "\\oplus");
-defineSymbol(math, main, bin, "\u2297", "\\otimes");
-defineSymbol(math, main, textord, "\u2202", "\\partial");
-defineSymbol(math, main, bin, "\u2298", "\\oslash");
-defineSymbol(math, ams, bin, "\u229a", "\\circledcirc");
-defineSymbol(math, ams, bin, "\u22a1", "\\boxdot");
-defineSymbol(math, main, bin, "\u25b3", "\\bigtriangleup");
-defineSymbol(math, main, bin, "\u25bd", "\\bigtriangledown");
-defineSymbol(math, main, bin, "\u2020", "\\dagger");
-defineSymbol(math, main, bin, "\u22c4", "\\diamond");
-defineSymbol(math, main, bin, "\u22c6", "\\star");
-defineSymbol(math, main, bin, "\u25c3", "\\triangleleft");
-defineSymbol(math, main, bin, "\u25b9", "\\triangleright");
-defineSymbol(math, main, open, "{", "\\{");
-defineSymbol(text, main, textord, "{", "\\{");
-defineSymbol(math, main, close, "}", "\\}");
-defineSymbol(text, main, textord, "}", "\\}");
-defineSymbol(math, main, open, "{", "\\lbrace");
-defineSymbol(math, main, close, "}", "\\rbrace");
-defineSymbol(math, main, open, "[", "\\lbrack");
-defineSymbol(math, main, close, "]", "\\rbrack");
-defineSymbol(math, main, open, "\u230a", "\\lfloor");
-defineSymbol(math, main, close, "\u230b", "\\rfloor");
-defineSymbol(math, main, open, "\u2308", "\\lceil");
-defineSymbol(math, main, close, "\u2309", "\\rceil");
-defineSymbol(math, main, textord, "\\", "\\backslash");
-defineSymbol(math, main, textord, "\u2223", "|");
-defineSymbol(math, main, textord, "\u2223", "\\vert");
-defineSymbol(math, main, textord, "\u2225", "\\|");
-defineSymbol(math, main, textord, "\u2225", "\\Vert");
-defineSymbol(math, main, rel, "\u2191", "\\uparrow");
-defineSymbol(math, main, rel, "\u21d1", "\\Uparrow");
-defineSymbol(math, main, rel, "\u2193", "\\downarrow");
-defineSymbol(math, main, rel, "\u21d3", "\\Downarrow");
-defineSymbol(math, main, rel, "\u2195", "\\updownarrow");
-defineSymbol(math, main, rel, "\u21d5", "\\Updownarrow");
-defineSymbol(math, math, op, "\u2210", "\\coprod");
-defineSymbol(math, math, op, "\u22c1", "\\bigvee");
-defineSymbol(math, math, op, "\u22c0", "\\bigwedge");
-defineSymbol(math, math, op, "\u2a04", "\\biguplus");
-defineSymbol(math, math, op, "\u22c2", "\\bigcap");
-defineSymbol(math, math, op, "\u22c3", "\\bigcup");
-defineSymbol(math, math, op, "\u222b", "\\int");
-defineSymbol(math, math, op, "\u222b", "\\intop");
-defineSymbol(math, math, op, "\u222c", "\\iint");
-defineSymbol(math, math, op, "\u222d", "\\iiint");
-defineSymbol(math, math, op, "\u220f", "\\prod");
-defineSymbol(math, math, op, "\u2211", "\\sum");
-defineSymbol(math, math, op, "\u2a02", "\\bigotimes");
-defineSymbol(math, math, op, "\u2a01", "\\bigoplus");
-defineSymbol(math, math, op, "\u2a00", "\\bigodot");
-defineSymbol(math, math, op, "\u222e", "\\oint");
-defineSymbol(math, math, op, "\u2a06", "\\bigsqcup");
-defineSymbol(math, math, op, "\u222b", "\\smallint");
-defineSymbol(text, main, inner, "\u2026", "\\textellipsis");
-defineSymbol(math, main, inner, "\u2026", "\\mathellipsis");
-defineSymbol(text, main, inner, "\u2026", "\\ldots");
-defineSymbol(math, main, inner, "\u2026", "\\ldots");
-defineSymbol(math, main, inner, "\u22ef", "\\cdots");
-defineSymbol(math, main, inner, "\u22f1", "\\ddots");
-defineSymbol(math, main, textord, "\u22ee", "\\vdots");
-defineSymbol(math, main, accent, "\u00b4", "\\acute");
-defineSymbol(math, main, accent, "\u0060", "\\grave");
-defineSymbol(math, main, accent, "\u00a8", "\\ddot");
-defineSymbol(math, main, accent, "\u007e", "\\tilde");
-defineSymbol(math, main, accent, "\u00af", "\\bar");
-defineSymbol(math, main, accent, "\u02d8", "\\breve");
-defineSymbol(math, main, accent, "\u02c7", "\\check");
-defineSymbol(math, main, accent, "\u005e", "\\hat");
-defineSymbol(math, main, accent, "\u20d7", "\\vec");
-defineSymbol(math, main, accent, "\u02d9", "\\dot");
-defineSymbol(math, main, mathord, "\u0131", "\\imath");
-defineSymbol(math, main, mathord, "\u0237", "\\jmath");
-
-defineSymbol(text, main, textord, "\u2013", "--");
-defineSymbol(text, main, textord, "\u2014", "---");
-defineSymbol(text, main, textord, "\u2018", "`");
-defineSymbol(text, main, textord, "\u2019", "'");
-defineSymbol(text, main, textord, "\u201c", "``");
-defineSymbol(text, main, textord, "\u201d", "''");
-defineSymbol(math, main, textord, "\u00b0", "\\degree");
-defineSymbol(text, main, textord, "\u00b0", "\\degree");
-defineSymbol(math, main, mathord, "\u00a3", "\\pounds");
-defineSymbol(math, ams, textord, "\u2720", "\\maltese");
-defineSymbol(text, ams, textord, "\u2720", "\\maltese");
-
-defineSymbol(text, main, spacing, "\u00a0", "\\ ");
-defineSymbol(text, main, spacing, "\u00a0", " ");
-defineSymbol(text, main, spacing, "\u00a0", "~");
-
-// There are lots of symbols which are the same, so we add them in afterwards.
-var i;
-var ch;
-
-// All of these are textords in math mode
-var mathTextSymbols = "0123456789/@.\"";
-for (i = 0; i < mathTextSymbols.length; i++) {
-    ch = mathTextSymbols.charAt(i);
-    defineSymbol(math, main, textord, ch, ch);
-}
-
-// All of these are textords in text mode
-var textSymbols = "0123456789!@*()-=+[]\";:?/.,";
-for (i = 0; i < textSymbols.length; i++) {
-    ch = textSymbols.charAt(i);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-// All of these are textords in text mode, and mathords in math mode
-var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-for (i = 0; i < letters.length; i++) {
-    ch = letters.charAt(i);
-    defineSymbol(math, main, mathord, ch, ch);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-// Latin-1 letters
-for (i = 0x00C0; i <= 0x00D6; i++) {
-    ch = String.fromCharCode(i);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-for (i = 0x00D8; i <= 0x00F6; i++) {
-    ch = String.fromCharCode(i);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-for (i = 0x00F8; i <= 0x00FF; i++) {
-    ch = String.fromCharCode(i);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-// Cyrillic
-for (i = 0x0410; i <= 0x044F; i++) {
-    ch = String.fromCharCode(i);
-    defineSymbol(text, main, textord, ch, ch);
-}
-
-// Unicode versions of existing characters
-defineSymbol(text, main, textord, "\u2013", "–");
-defineSymbol(text, main, textord, "\u2014", "—");
-defineSymbol(text, main, textord, "\u2018", "‘");
-defineSymbol(text, main, textord, "\u2019", "’");
-defineSymbol(text, main, textord, "\u201c", "“");
-defineSymbol(text, main, textord, "\u201d", "”");
-
-},{}],24:[function(require,module,exports){
-var hangulRegex = /[\uAC00-\uD7AF]/;
-
-// This regex combines
-// - Hiragana: [\u3040-\u309F]
-// - Katakana: [\u30A0-\u30FF]
-// - CJK ideograms: [\u4E00-\u9FAF]
-// - Hangul syllables: [\uAC00-\uD7AF]
-// Notably missing are halfwidth Katakana and Romanji glyphs.
-var cjkRegex =
-    /[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FAF]|[\uAC00-\uD7AF]/;
-
-module.exports = {
-    cjkRegex: cjkRegex,
-    hangulRegex: hangulRegex
-};
-
-},{}],25:[function(require,module,exports){
-/**
- * This file contains a list of utility functions which are useful in other
- * files.
- */
-
-/**
- * Provide an `indexOf` function which works in IE8, but defers to native if
- * possible.
- */
-var nativeIndexOf = Array.prototype.indexOf;
-var indexOf = function(list, elem) {
-    if (list == null) {
-        return -1;
-    }
-    if (nativeIndexOf && list.indexOf === nativeIndexOf) {
-        return list.indexOf(elem);
-    }
-    var i = 0;
-    var l = list.length;
-    for (; i < l; i++) {
-        if (list[i] === elem) {
-            return i;
-        }
-    }
-    return -1;
-};
-
-/**
- * Return whether an element is contained in a list
- */
-var contains = function(list, elem) {
-    return indexOf(list, elem) !== -1;
-};
-
-/**
- * Provide a default value if a setting is undefined
- */
-var deflt = function(setting, defaultIfUndefined) {
-    return setting === undefined ? defaultIfUndefined : setting;
-};
-
-// hyphenate and escape adapted from Facebook's React under Apache 2 license
-
-var uppercase = /([A-Z])/g;
-var hyphenate = function(str) {
-    return str.replace(uppercase, "-$1").toLowerCase();
-};
-
-var ESCAPE_LOOKUP = {
-    "&": "&amp;",
-    ">": "&gt;",
-    "<": "&lt;",
-    "\"": "&quot;",
-    "'": "&#x27;"
-};
-
-var ESCAPE_REGEX = /[&><"']/g;
-
-function escaper(match) {
-    return ESCAPE_LOOKUP[match];
-}
-
-/**
- * Escapes text to prevent scripting attacks.
- *
- * @param {*} text Text value to escape.
- * @return {string} An escaped string.
- */
-function escape(text) {
-    return ("" + text).replace(ESCAPE_REGEX, escaper);
-}
-
-/**
- * A function to set the text content of a DOM element in all supported
- * browsers. Note that we don't define this if there is no document.
- */
-var setTextContent;
-if (typeof document !== "undefined") {
-    var testNode = document.createElement("span");
-    if ("textContent" in testNode) {
-        setTextContent = function(node, text) {
-            node.textContent = text;
-        };
-    } else {
-        setTextContent = function(node, text) {
-            node.innerText = text;
-        };
-    }
-}
-
-/**
- * A function to clear a node.
- */
-function clearNode(node) {
-    setTextContent(node, "");
-}
-
-module.exports = {
-    contains: contains,
-    deflt: deflt,
-    escape: escape,
-    hyphenate: hyphenate,
-    indexOf: indexOf,
-    setTextContent: setTextContent,
-    clearNode: clearNode
-};
-
-},{}]},{},[1])(1)
-});
\ No newline at end of file
diff --git a/specs/es/3.2/katex/katex.min.css b/specs/es/3.2/katex/katex.min.css
deleted file mode 100644
index d6fb837..0000000
--- a/specs/es/3.2/katex/katex.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.eot);src:url(fonts/KaTeX_AMS-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_AMS-Regular.woff2) format('woff2'),url(fonts/KaTeX_AMS-Regular.woff) format('woff'),url(fonts/KaTeX_AMS-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.eot);src:url(fonts/KaTeX_Caligraphic-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Bold.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.eot);src:url(fonts/KaTeX_Caligraphic-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Regular.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.eot);src:url(fonts/KaTeX_Fraktur-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Bold.woff) format('woff'),url(fonts/KaTeX_Fraktur-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.eot);src:url(fonts/KaTeX_Fraktur-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Regular.woff) format('woff'),url(fonts/KaTeX_Fraktur-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.eot);src:url(fonts/KaTeX_Main-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Bold.woff2) format('woff2'),url(fonts/KaTeX_Main-Bold.woff) format('woff'),url(fonts/KaTeX_Main-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.eot);src:url(fonts/KaTeX_Main-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Italic.woff2) format('woff2'),url(fonts/KaTeX_Main-Italic.woff) format('woff'),url(fonts/KaTeX_Main-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.eot);src:url(fonts/KaTeX_Main-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Regular.woff2) format('woff2'),url(fonts/KaTeX_Main-Regular.woff) format('woff'),url(fonts/KaTeX_Main-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.eot);src:url(fonts/KaTeX_Math-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Math-Italic.woff2) format('woff2'),url(fonts/KaTeX_Math-Italic.woff) format('woff'),url(fonts/KaTeX_Math-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Regular.eot);src:url(fonts/KaTeX_SansSerif-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'),url(fonts/KaTeX_SansSerif-Regular.woff) format('woff'),url(fonts/KaTeX_SansSerif-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.eot);src:url(fonts/KaTeX_Script-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Script-Regular.woff2) format('woff2'),url(fonts/KaTeX_Script-Regular.woff) format('woff'),url(fonts/KaTeX_Script-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.eot);src:url(fonts/KaTeX_Size1-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size1-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size1-Regular.woff) format('woff'),url(fonts/KaTeX_Size1-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.eot);src:url(fonts/KaTeX_Size2-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size2-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size2-Regular.woff) format('woff'),url(fonts/KaTeX_Size2-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.eot);src:url(fonts/KaTeX_Size3-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size3-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size3-Regular.woff) format('woff'),url(fonts/KaTeX_Size3-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.eot);src:url(fonts/KaTeX_Size4-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size4-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size4-Regular.woff) format('woff'),url(fonts/KaTeX_Size4-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.eot);src:url(fonts/KaTeX_Typewriter-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'),url(fonts/KaTeX_Typewriter-Regular.woff) format('woff'),url(fonts/KaTeX_Typewriter-Regular.ttf) format('truetype');font-weight:400;font-style:normal}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:inline-block;text-align:initial}.katex{font:400 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;white-space:nowrap;text-indent:0}.katex .katex-html{display:inline-block}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .base,.katex .strut{display:inline-block}.katex .mathrm{font-style:normal}.katex .textit{font-style:italic}.katex .mathit{font-family:KaTeX_Math;font-style:italic}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .amsrm,.katex .mathbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr{font-family:KaTeX_Script}.katex .mathsf{font-family:KaTeX_SansSerif}.katex .mainit{font-family:KaTeX_Main;font-style:italic}.katex .mord+.mop{margin-left:.16667em}.katex .mord+.mbin{margin-left:.22222em}.katex .mord+.mrel{margin-left:.27778em}.katex .mop+.mop,.katex .mop+.mord,.katex .mord+.minner{margin-left:.16667em}.katex .mop+.mrel{margin-left:.27778em}.katex .mop+.minner{margin-left:.16667em}.katex .mbin+.minner,.katex .mbin+.mop,.katex .mbin+.mopen,.katex .mbin+.mord{margin-left:.22222em}.katex .mrel+.minner,.katex .mrel+.mop,.katex .mrel+.mopen,.katex .mrel+.mord{margin-left:.27778em}.katex .mclose+.mop{margin-left:.16667em}.katex .mclose+.mbin{margin-left:.22222em}.katex .mclose+.mrel{margin-left:.27778em}.katex .mclose+.minner,.katex .minner+.mop,.katex .minner+.mord,.katex .mpunct+.mclose,.katex .mpunct+.minner,.katex .mpunct+.mop,.katex .mpunct+.mopen,.katex .mpunct+.mord,.katex .mpunct+.mpunct,.katex .mpunct+.mrel{margin-left:.16667em}.katex .minner+.mbin{margin-left:.22222em}.katex .minner+.mrel{margin-left:.27778em}.katex .minner+.minner,.katex .minner+.mopen,.katex .minner+.mpunct{margin-left:.16667em}.katex .mbin.mtight,.katex .mclose.mtight,.katex .minner.mtight,.katex .mop.mtight,.katex .mopen.mtight,.katex .mord.mtight,.katex .mpunct.mtight,.katex .mrel.mtight{margin-left:0}.katex .mclose+.mop.mtight,.katex .minner+.mop.mtight,.katex .mop+.mop.mtight,.katex .mop+.mord.mtight,.katex .mord+.mop.mtight{margin-left:.16667em}.katex .reset-textstyle.textstyle{font-size:1em}.katex .reset-textstyle.scriptstyle{font-size:.7em}.katex .reset-textstyle.scriptscriptstyle{font-size:.5em}.katex .reset-scriptstyle.textstyle{font-size:1.42857em}.katex .reset-scriptstyle.scriptstyle{font-size:1em}.katex .reset-scriptstyle.scriptscriptstyle{font-size:.71429em}.katex .reset-scriptscriptstyle.textstyle{font-size:2em}.katex .reset-scriptscriptstyle.scriptstyle{font-size:1.4em}.katex .reset-scriptscriptstyle.scriptscriptstyle{font-size:1em}.katex .style-wrap{position:relative}.katex .vlist{display:inline-block}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist .baseline-fix{display:inline-table;table-layout:fixed}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{width:100%}.katex .mfrac .frac-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .mfrac .frac-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .mspace{display:inline-block}.katex .mspace.negativethinspace{margin-left:-.16667em}.katex .mspace.thinspace{width:.16667em}.katex .mspace.negativemediumspace{margin-left:-.22222em}.katex .mspace.mediumspace{width:.22222em}.katex .mspace.thickspace{width:.27778em}.katex .mspace.sixmuspace{width:.333333em}.katex .mspace.eightmuspace{width:.444444em}.katex .mspace.enspace{width:.5em}.katex .mspace.twelvemuspace{width:.666667em}.katex .mspace.quad{width:1em}.katex .mspace.qquad{width:2em}.katex .llap,.katex .rlap{width:0;position:relative}.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .rlap>.inner{left:0}.katex .katex-logo .a{font-size:.75em;margin-left:-.32em;position:relative;top:-.2em}.katex .katex-logo .t{margin-left:-.23em}.katex .katex-logo .e{margin-left:-.1667em;position:relative;top:.2155em}.katex .katex-logo .x{margin-left:-.125em}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .overline .overline-line,.katex .underline .underline-line{width:100%}.katex .overline .overline-line:before,.katex .underline .underline-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .overline .overline-line:after,.katex .underline .underline-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.sqrt-sign{position:relative}.katex .sqrt .sqrt-line{width:100%}.katex .sqrt .sqrt-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .sqrt .sqrt-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:2em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:3.46em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:4.14em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.98em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.47142857em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.95714286em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.55714286em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.875em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.125em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.25em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.5em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.8em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.1625em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.5875em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:3.1125em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.77777778em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.88888889em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.6em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.92222222em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.3em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.76666667em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.7em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.8em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.9em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.2em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.44em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.73em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:2.07em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.49em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.58333333em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.66666667em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.75em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.83333333em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44166667em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.725em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.075em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.48611111em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.55555556em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.625em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.69444444em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.20138889em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.4375em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72916667em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.28901734em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.40462428em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.46242775em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.52023121em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.57803468em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69364162em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83236994em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.19653179em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.43930636em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.24154589em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.33816425em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.38647343em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.43478261em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.48309179em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.57971014em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69565217em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83574879em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20289855em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.20080321em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2811245em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.32128514em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.36144578em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.40160643em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48192771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57831325em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69477912em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8313253em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist>span,.katex .op-limits>.vlist>span{text-align:center}.katex .accent .accent-body>span{width:0}.katex .accent .accent-body.accent-vec>span{position:relative;left:.326em}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid #000}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist{text-align:center}.katex .mtable .col-align-l>.vlist{text-align:left}.katex .mtable .col-align-r>.vlist{text-align:right}
\ No newline at end of file
diff --git a/specs/es/3.2/katex/katex.min.js b/specs/es/3.2/katex/katex.min.js
deleted file mode 100644
index 66c0821..0000000
--- a/specs/es/3.2/katex/katex.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.katex=e()}})(function(){var e,t,r;return function a(e,t,r){function i(s,l){if(!t[s]){if(!e[s]){var o=typeof require=="function"&&require;if(!l&&o)return o(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var p=t[s]={exports:{}};e[s][0].call(p.exports,function(t){var r=e[s][1][t];return i(r?r:t)},p,p.exports,a,e,t,r)}return t[s].exports}var n=typeof require=="function"&&require;for(var s=0;s<r.length;s++)i(r[s]);return i}({1:[function(e,t,r){var a=e("./src/ParseError");var i=e("./src/Settings");var n=e("./src/buildTree");var s=e("./src/parseTree");var l=e("./src/utils");var o=function(e,t,r){l.clearNode(t);var a=new i(r);var o=s(e,a);var u=n(o,e,a).toNode();t.appendChild(u)};if(typeof document!=="undefined"){if(document.compatMode!=="CSS1Compat"){typeof console!=="undefined"&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your "+"website has a suitable doctype.");o=function(){throw new a("KaTeX doesn't work in quirks mode.")}}}var u=function(e,t){var r=new i(t);var a=s(e,r);return n(a,e,r).toMarkup()};var p=function(e,t){var r=new i(t);return s(e,r)};t.exports={render:o,renderToString:u,__parse:p,ParseError:a}},{"./src/ParseError":6,"./src/Settings":8,"./src/buildTree":13,"./src/parseTree":22,"./src/utils":25}],2:[function(e,t,r){"use strict";function a(e){if(!e.__matchAtRelocatable){var t=e.source+"|()";var r="g"+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"");e.__matchAtRelocatable=new RegExp(t,r)}return e.__matchAtRelocatable}function i(e,t,r){if(e.global||e.sticky){throw new Error("matchAt(...): Only non-global regexes are supported")}var i=a(e);i.lastIndex=r;var n=i.exec(t);if(n[n.length-1]==null){n.length=n.length-1;return n}else{return null}}t.exports=i},{}],3:[function(e,t,r){var a=e("match-at");var i=e("./ParseError");function n(e){this.input=e;this.pos=0}function s(e,t,r,a){this.text=e;this.start=t;this.end=r;this.lexer=a}s.prototype.range=function(e,t){if(e.lexer!==this.lexer){return new s(t)}return new s(t,this.start,e.end,this.lexer)};var l=new RegExp("([ \r\n	]+)|"+"([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+"|[\ud800-\udbff][\udc00-\udfff]"+"|\\\\(?:[a-zA-Z]+|[^\ud800-\udfff])"+")");n.prototype.lex=function(){var e=this.input;var t=this.pos;if(t===e.length){return new s("EOF",t,t,this)}var r=a(l,e,t);if(r===null){throw new i("Unexpected character: '"+e[t]+"'",new s(e[t],t,t+1,this))}var n=r[2]||" ";var o=this.pos;this.pos+=r[0].length;var u=this.pos;return new s(n,o,u,this)};t.exports=n},{"./ParseError":6,"match-at":2}],4:[function(e,t,r){var a=e("./Lexer");function i(e,t){this.lexer=new a(e);this.macros=t;this.stack=[];this.discardedWhiteSpace=[]}i.prototype.nextToken=function(){for(;;){if(this.stack.length===0){this.stack.push(this.lexer.lex())}var e=this.stack.pop();var t=e.text;if(!(t.charAt(0)==="\\"&&this.macros.hasOwnProperty(t))){return e}var r=this.macros[t];if(typeof r==="string"){var i=new a(r);r=[];var n=i.lex();while(n.text!=="EOF"){r.push(n);n=i.lex()}r.reverse();this.macros[t]=r}this.stack=this.stack.concat(r)}};i.prototype.get=function(e){this.discardedWhiteSpace=[];var t=this.nextToken();if(e){while(t.text===" "){this.discardedWhiteSpace.push(t);t=this.nextToken()}}return t};i.prototype.unget=function(e){this.stack.push(e);while(this.discardedWhiteSpace.length!==0){this.stack.push(this.discardedWhiteSpace.pop())}};t.exports=i},{"./Lexer":3}],5:[function(e,t,r){function a(e){this.style=e.style;this.color=e.color;this.size=e.size;this.phantom=e.phantom;this.font=e.font;if(e.parentStyle===undefined){this.parentStyle=e.style}else{this.parentStyle=e.parentStyle}if(e.parentSize===undefined){this.parentSize=e.size}else{this.parentSize=e.parentSize}}a.prototype.extend=function(e){var t={style:this.style,size:this.size,color:this.color,parentStyle:this.style,parentSize:this.size,phantom:this.phantom,font:this.font};for(var r in e){if(e.hasOwnProperty(r)){t[r]=e[r]}}return new a(t)};a.prototype.withStyle=function(e){return this.extend({style:e})};a.prototype.withSize=function(e){return this.extend({size:e})};a.prototype.withColor=function(e){return this.extend({color:e})};a.prototype.withPhantom=function(){return this.extend({phantom:true})};a.prototype.withFont=function(e){return this.extend({font:e||this.font})};a.prototype.reset=function(){return this.extend({})};var i={"katex-blue":"#6495ed","katex-orange":"#ffa500","katex-pink":"#ff00af","katex-red":"#df0030","katex-green":"#28ae7b","katex-gray":"gray","katex-purple":"#9d38bd","katex-blueA":"#ccfaff","katex-blueB":"#80f6ff","katex-blueC":"#63d9ea","katex-blueD":"#11accd","katex-blueE":"#0c7f99","katex-tealA":"#94fff5","katex-tealB":"#26edd5","katex-tealC":"#01d1c1","katex-tealD":"#01a995","katex-tealE":"#208170","katex-greenA":"#b6ffb0","katex-greenB":"#8af281","katex-greenC":"#74cf70","katex-greenD":"#1fab54","katex-greenE":"#0d923f","katex-goldA":"#ffd0a9","katex-goldB":"#ffbb71","katex-goldC":"#ff9c39","katex-goldD":"#e07d10","katex-goldE":"#a75a05","katex-redA":"#fca9a9","katex-redB":"#ff8482","katex-redC":"#f9685d","katex-redD":"#e84d39","katex-redE":"#bc2612","katex-maroonA":"#ffbde0","katex-maroonB":"#ff92c6","katex-maroonC":"#ed5fa6","katex-maroonD":"#ca337c","katex-maroonE":"#9e034e","katex-purpleA":"#ddd7ff","katex-purpleB":"#c6b9fc","katex-purpleC":"#aa87ff","katex-purpleD":"#7854ab","katex-purpleE":"#543b78","katex-mintA":"#f5f9e8","katex-mintB":"#edf2df","katex-mintC":"#e0e5cc","katex-grayA":"#f6f7f7","katex-grayB":"#f0f1f2","katex-grayC":"#e3e5e6","katex-grayD":"#d6d8da","katex-grayE":"#babec2","katex-grayF":"#888d93","katex-grayG":"#626569","katex-grayH":"#3b3e40","katex-grayI":"#21242c","katex-kaBlue":"#314453","katex-kaGreen":"#71B307"};a.prototype.getColor=function(){if(this.phantom){return"transparent"}else{return i[this.color]||this.color}};t.exports=a},{}],6:[function(e,t,r){function a(e,t){var r="KaTeX parse error: "+e;var i;var n;if(t&&t.lexer&&t.start<=t.end){var s=t.lexer.input;i=t.start;n=t.end;if(i===s.length){r+=" at end of input: "}else{r+=" at position "+(i+1)+": "}var l=s.slice(i,n).replace(/[^]/g,"$&\u0332");var o;if(i>15){o="\u2026"+s.slice(i-15,i)}else{o=s.slice(0,i)}var u;if(n+15<s.length){u=s.slice(n,n+15)+"\u2026"}else{u=s.slice(n)}r+=o+l+u}var p=new Error(r);p.name="ParseError";p.__proto__=a.prototype;p.position=i;return p}a.prototype.__proto__=Error.prototype;t.exports=a},{}],7:[function(e,t,r){var a=e("./functions");var i=e("./environments");var n=e("./MacroExpander");var s=e("./symbols");var l=e("./utils");var o=e("./unicodeRegexes").cjkRegex;var u=e("./parseData");var p=e("./ParseError");function h(e,t){this.gullet=new n(e,t.macros);this.settings=t;this.leftrightDepth=0}var c=u.ParseNode;function m(e,t,r){this.result=e;this.isFunction=t;this.token=r}h.prototype.expect=function(e,t){if(this.nextToken.text!==e){throw new p("Expected '"+e+"', got '"+this.nextToken.text+"'",this.nextToken)}if(t!==false){this.consume()}};h.prototype.consume=function(){this.nextToken=this.gullet.get(this.mode==="math")};h.prototype.switchMode=function(e){this.gullet.unget(this.nextToken);this.mode=e;this.consume()};h.prototype.parse=function(){this.mode="math";this.consume();var e=this.parseInput();return e};h.prototype.parseInput=function(){var e=this.parseExpression(false);this.expect("EOF",false);return e};var f=["}","\\end","\\right","&","\\\\","\\cr"];h.prototype.parseExpression=function(e,t){var r=[];while(true){var i=this.nextToken;if(f.indexOf(i.text)!==-1){break}if(t&&i.text===t){break}if(e&&a[i.text]&&a[i.text].infix){break}var n=this.parseAtom();if(!n){if(!this.settings.throwOnError&&i.text[0]==="\\"){var s=this.handleUnsupportedCmd();r.push(s);continue}break}r.push(n)}return this.handleInfixNodes(r)};h.prototype.handleInfixNodes=function(e){var t=-1;var r;for(var a=0;a<e.length;a++){var i=e[a];if(i.type==="infix"){if(t!==-1){throw new p("only one infix operator per group",i.value.token)}t=a;r=i.value.replaceWith}}if(t!==-1){var n;var s;var l=e.slice(0,t);var o=e.slice(t+1);if(l.length===1&&l[0].type==="ordgroup"){n=l[0]}else{n=new c("ordgroup",l,this.mode)}if(o.length===1&&o[0].type==="ordgroup"){s=o[0]}else{s=new c("ordgroup",o,this.mode)}var u=this.callFunction(r,[n,s],null);return[new c(u.type,u,this.mode)]}else{return e}};var v=1;h.prototype.handleSupSubscript=function(e){var t=this.nextToken;var r=t.text;this.consume();var i=this.parseGroup();if(!i){if(!this.settings.throwOnError&&this.nextToken.text[0]==="\\"){return this.handleUnsupportedCmd()}else{throw new p("Expected group after '"+r+"'",t)}}else if(i.isFunction){var n=a[i.result].greediness;if(n>v){return this.parseFunction(i)}else{throw new p("Got function '"+i.result+"' with no arguments "+"as "+e,t)}}else{return i.result}};h.prototype.handleUnsupportedCmd=function(){var e=this.nextToken.text;var t=[];for(var r=0;r<e.length;r++){t.push(new c("textord",e[r],"text"))}var a=new c("text",{body:t,type:"text"},this.mode);var i=new c("color",{color:this.settings.errorColor,value:[a],type:"color"},this.mode);this.consume();return i};h.prototype.parseAtom=function(){var e=this.parseImplicitGroup();if(this.mode==="text"){return e}var t;var r;while(true){var a=this.nextToken;if(a.text==="\\limits"||a.text==="\\nolimits"){if(!e||e.type!=="op"){throw new p("Limit controls must follow a math operator",a)}else{var i=a.text==="\\limits";e.value.limits=i;e.value.alwaysHandleSupSub=true}this.consume()}else if(a.text==="^"){if(t){throw new p("Double superscript",a)}t=this.handleSupSubscript("superscript")}else if(a.text==="_"){if(r){throw new p("Double subscript",a)}r=this.handleSupSubscript("subscript")}else if(a.text==="'"){var n=new c("textord","\\prime",this.mode);var s=[n];this.consume();while(this.nextToken.text==="'"){s.push(n);this.consume()}t=new c("ordgroup",s,this.mode)}else{break}}if(t||r){return new c("supsub",{base:e,sup:t,sub:r},this.mode)}else{return e}};var d=["\\tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];var g=["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"];h.prototype.parseImplicitGroup=function(){var e=this.parseSymbol();if(e==null){return this.parseFunction()}var t=e.result;var r;if(t==="\\left"){var a=this.parseFunction(e);++this.leftrightDepth;r=this.parseExpression(false);--this.leftrightDepth;this.expect("\\right",false);var n=this.parseFunction();return new c("leftright",{body:r,left:a.value.value,right:n.value.value},this.mode)}else if(t==="\\begin"){var s=this.parseFunction(e);var o=s.value.name;if(!i.hasOwnProperty(o)){throw new p("No such environment: "+o,s.value.nameGroup)}var u=i[o];var h=this.parseArguments("\\begin{"+o+"}",u);var m={mode:this.mode,envName:o,parser:this,positions:h.pop()};var f=u.handler(m,h);this.expect("\\end",false);var v=this.nextToken;var y=this.parseFunction();if(y.value.name!==o){throw new p("Mismatch: \\begin{"+o+"} matched "+"by \\end{"+y.value.name+"}",v)}f.position=y.position;return f}else if(l.contains(d,t)){r=this.parseExpression(false);return new c("sizing",{size:"size"+(l.indexOf(d,t)+1),value:r},this.mode)}else if(l.contains(g,t)){r=this.parseExpression(true);return new c("styling",{style:t.slice(1,t.length-5),value:r},this.mode)}else{return this.parseFunction(e)}};h.prototype.parseFunction=function(e){if(!e){e=this.parseGroup()}if(e){if(e.isFunction){var t=e.result;var r=a[t];if(this.mode==="text"&&!r.allowedInText){throw new p("Can't use function '"+t+"' in text mode",e.token)}var i=this.parseArguments(t,r);var n=e.token;var s=this.callFunction(t,i,i.pop(),n);return new c(s.type,s,this.mode)}else{return e.result}}else{return null}};h.prototype.callFunction=function(e,t,r,i){var n={funcName:e,parser:this,positions:r,token:i};return a[e].handler(n,t)};h.prototype.parseArguments=function(e,t){var r=t.numArgs+t.numOptionalArgs;if(r===0){return[[this.pos]]}var i=t.greediness;var n=[this.pos];var s=[];for(var l=0;l<r;l++){var o=this.nextToken;var u=t.argTypes&&t.argTypes[l];var h;if(l<t.numOptionalArgs){if(u){h=this.parseGroupOfType(u,true)}else{h=this.parseGroup(true)}if(!h){s.push(null);n.push(this.pos);continue}}else{if(u){h=this.parseGroupOfType(u)}else{h=this.parseGroup()}if(!h){if(!this.settings.throwOnError&&this.nextToken.text[0]==="\\"){h=new m(this.handleUnsupportedCmd(this.nextToken.text),false)}else{throw new p("Expected group after '"+e+"'",o)}}}var c;if(h.isFunction){var f=a[h.result].greediness;if(f>i){c=this.parseFunction(h)}else{throw new p("Got function '"+h.result+"' as "+"argument to '"+e+"'",o)}}else{c=h.result}s.push(c);n.push(this.pos)}s.push(n);return s};h.prototype.parseGroupOfType=function(e,t){var r=this.mode;if(e==="original"){e=r}if(e==="color"){return this.parseColorGroup(t)}if(e==="size"){return this.parseSizeGroup(t)}this.switchMode(e);if(e==="text"){while(this.nextToken.text===" "){this.consume()}}var a=this.parseGroup(t);this.switchMode(r);return a};h.prototype.parseStringGroup=function(e,t){if(t&&this.nextToken.text!=="["){return null}var r=this.mode;this.mode="text";this.expect(t?"[":"{");var a="";var i=this.nextToken;var n=i;while(this.nextToken.text!==(t?"]":"}")){if(this.nextToken.text==="EOF"){throw new p("Unexpected end of input in "+e,i.range(this.nextToken,a))}n=this.nextToken;a+=n.text;this.consume()}this.mode=r;this.expect(t?"]":"}");return i.range(n,a)};h.prototype.parseRegexGroup=function(e,t){var r=this.mode;this.mode="text";var a=this.nextToken;var i=a;var n="";while(this.nextToken.text!=="EOF"&&e.test(n+this.nextToken.text)){i=this.nextToken;n+=i.text;this.consume()}if(n===""){throw new p("Invalid "+t+": '"+a.text+"'",a)}this.mode=r;return a.range(i,n)};h.prototype.parseColorGroup=function(e){var t=this.parseStringGroup("color",e);if(!t){return null}var r=/^(#[a-z0-9]+|[a-z]+)$/i.exec(t.text);if(!r){throw new p("Invalid color: '"+t.text+"'",t)}return new m(new c("color",r[0],this.mode),false)};h.prototype.parseSizeGroup=function(e){var t;if(!e&&this.nextToken.text!=="{"){t=this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2}$/,"size")}else{t=this.parseStringGroup("size",e)}if(!t){return null}var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t.text);if(!r){throw new p("Invalid size: '"+t.text+"'",t)}var a={number:+(r[1]+r[2]),unit:r[3]};if(a.unit!=="em"&&a.unit!=="ex"&&a.unit!=="mu"){throw new p("Invalid unit: '"+a.unit+"'",t)}return new m(new c("color",a,this.mode),false)};h.prototype.parseGroup=function(e){var t=this.nextToken;if(this.nextToken.text===(e?"[":"{")){this.consume();var r=this.parseExpression(false,e?"]":null);var a=this.nextToken;this.expect(e?"]":"}");if(this.mode==="text"){this.formLigatures(r)}return new m(new c("ordgroup",r,this.mode,t,a),false)}else{return e?null:this.parseSymbol()}};h.prototype.formLigatures=function(e){var t;var r=e.length-1;for(t=0;t<r;++t){var a=e[t];var i=a.value;if(i==="-"&&e[t+1].value==="-"){if(t+1<r&&e[t+2].value==="-"){e.splice(t,3,new c("textord","---","text",a,e[t+2]));r-=2}else{e.splice(t,2,new c("textord","--","text",a,e[t+1]));r-=1}}if((i==="'"||i==="`")&&e[t+1].value===i){e.splice(t,2,new c("textord",i+i,"text",a,e[t+1]));r-=1}}};h.prototype.parseSymbol=function(){var e=this.nextToken;if(a[e.text]){this.consume();return new m(e.text,true,e)}else if(s[this.mode][e.text]){this.consume();return new m(new c(s[this.mode][e.text].group,e.text,this.mode,e),false,e)}else if(this.mode==="text"&&o.test(e.text)){this.consume();return new m(new c("textord",e.text,this.mode,e),false,e)}else{return null}};h.prototype.ParseNode=c;t.exports=h},{"./MacroExpander":4,"./ParseError":6,"./environments":16,"./functions":19,"./parseData":21,"./symbols":23,"./unicodeRegexes":24,"./utils":25}],8:[function(e,t,r){function a(e,t){return e===undefined?t:e}function i(e){e=e||{};this.displayMode=a(e.displayMode,false);this.throwOnError=a(e.throwOnError,true);this.errorColor=a(e.errorColor,"#cc0000");this.macros=e.macros||{}}t.exports=i},{}],9:[function(e,t,r){var a=e("./fontMetrics.js").sigmas;var i=[{},{},{}];var n;for(var s in a){if(a.hasOwnProperty(s)){for(n=0;n<3;n++){i[n][s]=a[s][n]}}}for(n=0;n<3;n++){i[n].emPerEx=a.xHeight[n]/a.quad[n]}function l(e,t,r,a){this.id=e;this.size=t;this.cramped=a;this.sizeMultiplier=r;this.metrics=i[t>0?t-1:0]}l.prototype.sup=function(){return y[x[this.id]]};l.prototype.sub=function(){return y[b[this.id]]};l.prototype.fracNum=function(){return y[w[this.id]]};l.prototype.fracDen=function(){return y[k[this.id]]};l.prototype.cramp=function(){return y[z[this.id]]};l.prototype.cls=function(){return d[this.size]+(this.cramped?" cramped":" uncramped")};l.prototype.reset=function(){return g[this.size]};l.prototype.isTight=function(){return this.size>=2};var o=0;var u=1;var p=2;var h=3;var c=4;var m=5;var f=6;var v=7;var d=["displaystyle textstyle","textstyle","scriptstyle","scriptscriptstyle"];var g=["reset-textstyle","reset-textstyle","reset-scriptstyle","reset-scriptscriptstyle"];var y=[new l(o,0,1,false),new l(u,0,1,true),new l(p,1,1,false),new l(h,1,1,true),new l(c,2,.7,false),new l(m,2,.7,true),new l(f,3,.5,false),new l(v,3,.5,true)];var x=[c,m,c,m,f,v,f,v];var b=[m,m,m,m,v,v,v,v];var w=[p,h,c,m,f,v,f,v];var k=[h,h,m,m,v,v,v,v];var z=[u,u,h,h,m,m,v,v];t.exports={DISPLAY:y[o],TEXT:y[p],SCRIPT:y[c],SCRIPTSCRIPT:y[f]}},{"./fontMetrics.js":17}],10:[function(e,t,r){var a=e("./domTree");var i=e("./fontMetrics");var n=e("./symbols");var s=e("./utils");var l=["\\Gamma","\\Delta","\\Theta","\\Lambda","\\Xi","\\Pi","\\Sigma","\\Upsilon","\\Phi","\\Psi","\\Omega"];var o=["\u0131","\u0237","\xa3"];var u=function(e,t,r,s,l){if(n[r][e]&&n[r][e].replace){e=n[r][e].replace}var o=i.getCharacterMetrics(e,t);var u;if(o){var p=o.italic;if(r==="text"){p=0}u=new a.symbolNode(e,o.height,o.depth,p,o.skew,l)}else{typeof console!=="undefined"&&console.warn("No character metrics for '"+e+"' in style '"+t+"'");u=new a.symbolNode(e,0,0,0,0,l)}if(s){if(s.style.isTight()){u.classes.push("mtight")}if(s.getColor()){u.style.color=s.getColor()}}return u};var p=function(e,t,r,a){if(e==="\\"||n[t][e].font==="main"){return u(e,"Main-Regular",t,r,a)}else{return u(e,"AMS-Regular",t,r,a.concat(["amsrm"]))}};var h=function(e,t,r,a,i){if(i==="mathord"){return c(e,t,r,a)}else if(i==="textord"){return u(e,"Main-Regular",t,r,a.concat(["mathrm"]))}else{throw new Error("unexpected type: "+i+" in mathDefault")}};var c=function(e,t,r,a){if(/[0-9]/.test(e.charAt(0))||s.contains(o,e)||s.contains(l,e)){return u(e,"Main-Italic",t,r,a.concat(["mainit"]))}else{return u(e,"Math-Italic",t,r,a.concat(["mathit"]))}};var m=function(e,t,r){var a=e.mode;var l=e.value;if(n[a][l]&&n[a][l].replace){l=n[a][l].replace}var p=["mord"];var m=t.font;if(m){if(m==="mathit"||s.contains(o,l)){return c(l,a,t,p)}else{var f=k[m].fontName;if(i.getCharacterMetrics(l,f)){return u(l,f,a,t,p.concat([m]))}else{return h(l,a,t,p,r)}}}else{return h(l,a,t,p,r)}};var f=function(e){var t=0;var r=0;var a=0;if(e.children){for(var i=0;i<e.children.length;i++){if(e.children[i].height>t){t=e.children[i].height}if(e.children[i].depth>r){r=e.children[i].depth}if(e.children[i].maxFontSize>a){a=e.children[i].maxFontSize}}}e.height=t;e.depth=r;e.maxFontSize=a};var v=function(e,t,r){var i=new a.span(e,t,r);f(i);return i};var d=function(e,t){e.children=t.concat(e.children);f(e)};var g=function(e){var t=new a.documentFragment(e);f(t);return t};var y=function(e,t){var r=v([],[new a.symbolNode("\u200b")]);r.style.fontSize=t/e.style.sizeMultiplier+"em";var i=v(["fontsize-ensurer","reset-"+e.size,"size5"],[r]);return i};var x=function(e,t,r,i){var n;var s;var l;if(t==="individualShift"){var o=e;e=[o[0]];n=-o[0].shift-o[0].elem.depth;s=n;for(l=1;l<o.length;l++){var u=-o[l].shift-s-o[l].elem.depth;var p=u-(o[l-1].elem.height+o[l-1].elem.depth);s=s+u;e.push({type:"kern",size:p});e.push(o[l])}}else if(t==="top"){var h=r;for(l=0;l<e.length;l++){if(e[l].type==="kern"){h-=e[l].size}else{h-=e[l].elem.height+e[l].elem.depth}}n=h}else if(t==="bottom"){n=-r}else if(t==="shift"){n=-e[0].elem.depth-r}else if(t==="firstBaseline"){n=-e[0].elem.depth}else{n=0}var c=0;for(l=0;l<e.length;l++){if(e[l].type==="elem"){c=Math.max(c,e[l].elem.maxFontSize)}}var m=y(i,c);var f=[];s=n;for(l=0;l<e.length;l++){if(e[l].type==="kern"){s+=e[l].size}else{var d=e[l].elem;var g=-d.depth-s;s+=d.height+d.depth;var x=v([],[m,d]);x.height-=g;x.depth+=g;x.style.top=g+"em";f.push(x)}}var b=v(["baseline-fix"],[m,new a.symbolNode("\u200b")]);f.push(b);var w=v(["vlist"],f);w.height=Math.max(s,w.height);w.depth=Math.max(-n,w.depth);return w};var b={size1:.5,size2:.7,size3:.8,size4:.9,size5:1,size6:1.2,size7:1.44,size8:1.73,size9:2.07,size10:2.49};var w={"\\qquad":{size:"2em",className:"qquad"},"\\quad":{size:"1em",className:"quad"},"\\enspace":{size:"0.5em",className:"enspace"},"\\;":{size:"0.277778em",className:"thickspace"},"\\:":{size:"0.22222em",className:"mediumspace"},"\\,":{size:"0.16667em",className:"thinspace"},"\\!":{size:"-0.16667em",className:"negativethinspace"}};var k={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}};t.exports={fontMap:k,makeSymbol:u,mathsym:p,makeSpan:v,makeFragment:g,makeVList:x,makeOrd:m,prependChildren:d,sizingMultiplier:b,spacingFunctions:w}},{"./domTree":15,"./fontMetrics":17,"./symbols":23,"./utils":25}],11:[function(e,t,r){var a=e("./ParseError");var i=e("./Style");var n=e("./buildCommon");var s=e("./delimiter");var l=e("./domTree");var o=e("./fontMetrics");var u=e("./utils");var p=n.makeSpan;var h=function(e){return e instanceof l.span&&e.classes[0]==="mspace"};var c=function(e){return e&&e.classes[0]==="mbin"};var m=function(e,t){if(e){return u.contains(["mbin","mopen","mrel","mop","mpunct"],e.classes[0])}else{return t}};var f=function(e,t){if(e){return u.contains(["mrel","mclose","mpunct"],e.classes[0])}else{return t}};var v=function(e,t,r){var a=[];for(var i=0;i<e.length;i++){var s=e[i];var o=z(s,t);if(o instanceof l.documentFragment){Array.prototype.push.apply(a,o.children)}else{a.push(o)}}var u=null;for(i=0;i<a.length;i++){if(h(a[i])){u=u||[];u.push(a[i]);a.splice(i,1);i--}else if(u){if(a[i]instanceof l.symbolNode){a[i]=p([].concat(a[i].classes),[a[i]])}n.prependChildren(a[i],u);u=null}}if(u){Array.prototype.push.apply(a,u)}for(i=0;i<a.length;i++){if(c(a[i])&&(m(a[i-1],r)||f(a[i+1],r))){a[i].classes[0]="mord"}}return a};var d=function(e){if(e instanceof l.documentFragment){if(e.children.length){return d(e.children[e.children.length-1])}}else{if(u.contains(["mord","mop","mbin","mrel","mopen","mclose","mpunct","minner"],e.classes[0])){return e.classes[0]}}return null};var g=function(e,t){if(!e){return false}else if(e.type==="op"){return e.value.limits&&(t.style.size===i.DISPLAY.size||e.value.alwaysHandleSupSub)}else if(e.type==="accent"){return x(e.value.base)}else{return null}};var y=function(e){if(!e){return false}else if(e.type==="ordgroup"){if(e.value.length===1){return y(e.value[0])}else{return e}}else if(e.type==="color"){if(e.value.value.length===1){return y(e.value.value[0])}else{return e}}else if(e.type==="font"){return y(e.value.body)}else{return e}};var x=function(e){var t=y(e);return t.type==="mathord"||t.type==="textord"||t.type==="bin"||t.type==="rel"||t.type==="inner"||t.type==="open"||t.type==="close"||t.type==="punct"};var b=function(e,t){return p(t.concat(["sizing","reset-"+e.size,"size5",e.style.reset(),i.TEXT.cls(),"nulldelimiter"]))};var w={};w.mathord=function(e,t){return n.makeOrd(e,t,"mathord")};w.textord=function(e,t){return n.makeOrd(e,t,"textord")};w.bin=function(e,t){return n.mathsym(e.value,e.mode,t,["mbin"])};w.rel=function(e,t){return n.mathsym(e.value,e.mode,t,["mrel"])};w.open=function(e,t){return n.mathsym(e.value,e.mode,t,["mopen"])};w.close=function(e,t){return n.mathsym(e.value,e.mode,t,["mclose"])};w.inner=function(e,t){return n.mathsym(e.value,e.mode,t,["minner"])};w.punct=function(e,t){return n.mathsym(e.value,e.mode,t,["mpunct"])};w.ordgroup=function(e,t){return p(["mord",t.style.cls()],v(e.value,t.reset(),true),t)};w.text=function(e,t){var r=t.withFont(e.value.style);var a=v(e.value.body,r,true);for(var i=0;i<a.length-1;i++){if(a[i].tryCombine(a[i+1])){a.splice(i+1,1);i--}}return p(["mord","text",r.style.cls()],a,r)};w.color=function(e,t){var r=v(e.value.value,t.withColor(e.value.color),false);return new n.makeFragment(r)};w.supsub=function(e,t){if(g(e.value.base,t)){return w[e.value.base.type](e,t)}var r=z(e.value.base,t.reset());var a;var s;var u;var h;var c=t.style;var m;if(e.value.sup){m=t.withStyle(c.sup());u=z(e.value.sup,m);a=p([c.reset(),c.sup().cls()],[u],m)}if(e.value.sub){m=t.withStyle(c.sub());h=z(e.value.sub,m);s=p([c.reset(),c.sub().cls()],[h],m)}var f;var v;if(x(e.value.base)){f=0;v=0}else{f=r.height-c.metrics.supDrop;v=r.depth+c.metrics.subDrop}var y;if(c===i.DISPLAY){y=c.metrics.sup1}else if(c.cramped){y=c.metrics.sup3}else{y=c.metrics.sup2}var b=i.TEXT.sizeMultiplier*c.sizeMultiplier;var k=.5/o.metrics.ptPerEm/b+"em";var S;if(!e.value.sup){v=Math.max(v,c.metrics.sub1,h.height-.8*c.metrics.xHeight);S=n.makeVList([{type:"elem",elem:s}],"shift",v,t);S.children[0].style.marginRight=k;if(r instanceof l.symbolNode){S.children[0].style.marginLeft=-r.italic+"em"}}else if(!e.value.sub){f=Math.max(f,y,u.depth+.25*c.metrics.xHeight);S=n.makeVList([{type:"elem",elem:a}],"shift",-f,t);S.children[0].style.marginRight=k}else{f=Math.max(f,y,u.depth+.25*c.metrics.xHeight);v=Math.max(v,c.metrics.sub2);var M=o.metrics.defaultRuleThickness;if(f-u.depth-(h.height-v)<4*M){v=4*M-(f-u.depth)+h.height;var T=.8*c.metrics.xHeight-(f-u.depth);if(T>0){f+=T;v-=T}}S=n.makeVList([{type:"elem",elem:s,shift:v},{type:"elem",elem:a,shift:-f}],"individualShift",null,t);if(r instanceof l.symbolNode){S.children[0].style.marginLeft=-r.italic+"em"}S.children[0].style.marginRight=k;S.children[1].style.marginRight=k}var A=d(r)||"mord";return p([A],[r,p(["msupsub"],[S])],t)};w.genfrac=function(e,t){var r=t.style;if(e.value.size==="display"){r=i.DISPLAY}else if(e.value.size==="text"){r=i.TEXT}var a=r.fracNum();var l=r.fracDen();var u;u=t.withStyle(a);var h=z(e.value.numer,u);var c=p([r.reset(),a.cls()],[h],u);u=t.withStyle(l);var m=z(e.value.denom,u);var f=p([r.reset(),l.cls()],[m],u);var v;if(e.value.hasBarLine){v=o.metrics.defaultRuleThickness/t.style.sizeMultiplier}else{v=0}var d;var g;var y;if(r.size===i.DISPLAY.size){d=r.metrics.num1;if(v>0){g=3*v}else{g=7*o.metrics.defaultRuleThickness}y=r.metrics.denom1}else{if(v>0){d=r.metrics.num2;g=v}else{d=r.metrics.num3;g=3*o.metrics.defaultRuleThickness}y=r.metrics.denom2}var x;if(v===0){var w=d-h.depth-(m.height-y);if(w<g){d+=.5*(g-w);y+=.5*(g-w)}x=n.makeVList([{type:"elem",elem:f,shift:y},{type:"elem",elem:c,shift:-d}],"individualShift",null,t)}else{var k=r.metrics.axisHeight;if(d-h.depth-(k+.5*v)<g){d+=g-(d-h.depth-(k+.5*v))}if(k-.5*v-(m.height-y)<g){y+=g-(k-.5*v-(m.height-y))}var S=p([t.style.reset(),i.TEXT.cls(),"frac-line"]);S.height=v;var M=-(k-.5*v);x=n.makeVList([{type:"elem",elem:f,shift:y},{type:"elem",elem:S,shift:M},{type:"elem",elem:c,shift:-d}],"individualShift",null,t)}x.height*=r.sizeMultiplier/t.style.sizeMultiplier;x.depth*=r.sizeMultiplier/t.style.sizeMultiplier;var T;if(r.size===i.DISPLAY.size){T=r.metrics.delim1}else{T=r.metrics.delim2}var A;var N;if(e.value.leftDelim==null){A=b(t,["mopen"])}else{A=s.customSizedDelim(e.value.leftDelim,T,true,t.withStyle(r),e.mode,["mopen"])}if(e.value.rightDelim==null){N=b(t,["mclose"])}else{N=s.customSizedDelim(e.value.rightDelim,T,true,t.withStyle(r),e.mode,["mclose"])}return p(["mord",t.style.reset(),r.cls()],[A,p(["mfrac"],[x]),N],t)};var k=function(e,t){var r=e.number;if(e.unit==="ex"){r*=t.metrics.emPerEx}else if(e.unit==="mu"){r/=18}return r};w.array=function(e,t){var r;var i;var s=e.value.body.length;var l=0;var h=new Array(s);var c=t.style;var m=1/o.metrics.ptPerEm;var f=5*m;var v=12*m;var d=u.deflt(e.value.arraystretch,1);var g=d*v;var y=.7*g;var x=.3*g;var b=0;for(r=0;r<e.value.body.length;++r){var w=e.value.body[r];var S=y;var M=x;if(l<w.length){l=w.length}var T=new Array(w.length);for(i=0;i<w.length;++i){var A=z(w[i],t);if(M<A.depth){M=A.depth}if(S<A.height){S=A.height}T[i]=A}var N=0;if(e.value.rowGaps[r]){N=k(e.value.rowGaps[r].value,c);if(N>0){N+=x;if(M<N){M=N}N=0}}T.height=S;T.depth=M;b+=S;T.pos=b;b+=M+N;h[r]=T}var q=b/2+c.metrics.axisHeight;var R=e.value.cols||[];var E=[];var C;var D;for(i=0,D=0;i<l||D<R.length;++i,++D){var O=R[D]||{};var P=true;while(O.type==="separator"){if(!P){C=p(["arraycolsep"],[]);C.style.width=o.metrics.doubleRuleSep+"em";E.push(C)}if(O.separator==="|"){var F=p(["vertical-separator"],[]);F.style.height=b+"em";F.style.verticalAlign=-(b-q)+"em";E.push(F)}else{throw new a("Invalid separator type: "+O.separator)}D++;O=R[D]||{};P=false}if(i>=l){continue}var I;if(i>0||e.value.hskipBeforeAndAfter){I=u.deflt(O.pregap,f);if(I!==0){C=p(["arraycolsep"],[]);C.style.width=I+"em";E.push(C)}}var L=[];for(r=0;r<s;++r){var B=h[r];var G=B[i];if(!G){continue}var V=B.pos-q;G.depth=B.depth;G.height=B.height;L.push({type:"elem",elem:G,shift:V})}L=n.makeVList(L,"individualShift",null,t);L=p(["col-align-"+(O.align||"c")],[L]);E.push(L);if(i<l-1||e.value.hskipBeforeAndAfter){I=u.deflt(O.postgap,f);if(I!==0){C=p(["arraycolsep"],[]);C.style.width=I+"em";E.push(C)}}}h=p(["mtable"],E);return p(["mord"],[h],t)};w.spacing=function(e,t){if(e.value==="\\ "||e.value==="\\space"||e.value===" "||e.value==="~"){if(e.mode==="text"){return n.makeOrd(e,t,"textord")}else{return p(["mspace"],[n.mathsym(e.value,e.mode,t)],t)}}else{return p(["mspace",n.spacingFunctions[e.value].className],[],t)}};w.llap=function(e,t){var r=p(["inner"],[z(e.value.body,t.reset())]);var a=p(["fix"],[]);return p(["mord","llap",t.style.cls()],[r,a],t)};w.rlap=function(e,t){var r=p(["inner"],[z(e.value.body,t.reset())]);var a=p(["fix"],[]);return p(["mord","rlap",t.style.cls()],[r,a],t)};w.op=function(e,t){var r;var a;var s=false;if(e.type==="supsub"){r=e.value.sup;a=e.value.sub;e=e.value.base;s=true}var l=t.style;var h=["\\smallint"];var c=false;if(l.size===i.DISPLAY.size&&e.value.symbol&&!u.contains(h,e.value.body)){c=true}var m;var f=0;var d=0;if(e.value.symbol){var g=c?"Size2-Regular":"Size1-Regular";m=n.makeSymbol(e.value.body,g,"math",t,["mop","op-symbol",c?"large-op":"small-op"]);f=(m.height-m.depth)/2-l.metrics.axisHeight*l.sizeMultiplier;d=m.italic}else if(e.value.value){var y=v(e.value.value,t,true);m=p(["mop"],y,t)}else{var x=[];for(var b=1;b<e.value.body.length;b++){x.push(n.mathsym(e.value.body[b],e.mode))}m=p(["mop"],x,t)}if(s){m=p([],[m]);var w;var k;var S;var M;var T;if(r){T=t.withStyle(l.sup());var A=z(r,T);w=p([l.reset(),l.sup().cls()],[A],T);k=Math.max(o.metrics.bigOpSpacing1,o.metrics.bigOpSpacing3-A.depth)}if(a){T=t.withStyle(l.sub());var N=z(a,T);S=p([l.reset(),l.sub().cls()],[N],T);M=Math.max(o.metrics.bigOpSpacing2,o.metrics.bigOpSpacing4-N.height)}var q;var R;var E;if(!r){R=m.height-f;q=n.makeVList([{type:"kern",size:o.metrics.bigOpSpacing5},{type:"elem",elem:S},{type:"kern",size:M},{type:"elem",elem:m}],"top",R,t);q.children[0].style.marginLeft=-d+"em"}else if(!a){E=m.depth+f;q=n.makeVList([{type:"elem",elem:m},{type:"kern",size:k},{type:"elem",elem:w},{type:"kern",size:o.metrics.bigOpSpacing5}],"bottom",E,t);q.children[1].style.marginLeft=d+"em"}else if(!r&&!a){return m}else{E=o.metrics.bigOpSpacing5+S.height+S.depth+M+m.depth+f;
-q=n.makeVList([{type:"kern",size:o.metrics.bigOpSpacing5},{type:"elem",elem:S},{type:"kern",size:M},{type:"elem",elem:m},{type:"kern",size:k},{type:"elem",elem:w},{type:"kern",size:o.metrics.bigOpSpacing5}],"bottom",E,t);q.children[0].style.marginLeft=-d+"em";q.children[2].style.marginLeft=d+"em"}return p(["mop","op-limits"],[q],t)}else{if(e.value.symbol){m.style.top=f+"em"}return m}};w.mod=function(e,t){var r=[];if(e.value.modType==="bmod"){if(!t.style.isTight()){r.push(p(["mspace","negativemediumspace"],[],t))}r.push(p(["mspace","thickspace"],[],t))}else if(t.style.size===i.DISPLAY.size){r.push(p(["mspace","quad"],[],t))}else if(e.value.modType==="mod"){r.push(p(["mspace","twelvemuspace"],[],t))}else{r.push(p(["mspace","eightmuspace"],[],t))}if(e.value.modType==="pod"||e.value.modType==="pmod"){r.push(n.mathsym("(",e.mode))}if(e.value.modType!=="pod"){var a=[n.mathsym("m",e.mode),n.mathsym("o",e.mode),n.mathsym("d",e.mode)];if(e.value.modType==="bmod"){r.push(p(["mbin"],a,t));r.push(p(["mspace","thickspace"],[],t));if(!t.style.isTight()){r.push(p(["mspace","negativemediumspace"],[],t))}}else{Array.prototype.push.apply(r,a);r.push(p(["mspace","sixmuspace"],[],t))}}if(e.value.value){Array.prototype.push.apply(r,v(e.value.value,t,false))}if(e.value.modType==="pod"||e.value.modType==="pmod"){r.push(n.mathsym(")",e.mode))}return n.makeFragment(r)};w.katex=function(e,t){var r=p(["k"],[n.mathsym("K",e.mode)],t);var a=p(["a"],[n.mathsym("A",e.mode)],t);a.height=(a.height+.2)*.75;a.depth=(a.height-.2)*.75;var i=p(["t"],[n.mathsym("T",e.mode)],t);var s=p(["e"],[n.mathsym("E",e.mode)],t);s.height=s.height-.2155;s.depth=s.depth+.2155;var l=p(["x"],[n.mathsym("X",e.mode)],t);return p(["mord","katex-logo"],[r,a,i,s,l],t)};w.overline=function(e,t){var r=t.style;var a=z(e.value.body,t.withStyle(r.cramp()));var s=o.metrics.defaultRuleThickness/r.sizeMultiplier;var l=p([r.reset(),i.TEXT.cls(),"overline-line"]);l.height=s;l.maxFontSize=1;var u=n.makeVList([{type:"elem",elem:a},{type:"kern",size:3*s},{type:"elem",elem:l},{type:"kern",size:s}],"firstBaseline",null,t);return p(["mord","overline"],[u],t)};w.underline=function(e,t){var r=t.style;var a=z(e.value.body,t);var s=o.metrics.defaultRuleThickness/r.sizeMultiplier;var l=p([r.reset(),i.TEXT.cls(),"underline-line"]);l.height=s;l.maxFontSize=1;var u=n.makeVList([{type:"kern",size:s},{type:"elem",elem:l},{type:"kern",size:3*s},{type:"elem",elem:a}],"top",a.height,t);return p(["mord","underline"],[u],t)};w.sqrt=function(e,t){var r=t.style;var a=z(e.value.body,t.withStyle(r.cramp()));var l=o.metrics.defaultRuleThickness/r.sizeMultiplier;var u=p([r.reset(),i.TEXT.cls(),"sqrt-line"],[],t);u.height=l;u.maxFontSize=1;var h=l;if(r.id<i.TEXT.id){h=r.metrics.xHeight}var c=l+h/4;var m=(a.height+a.depth)*r.sizeMultiplier;var f=m+c+l;var v=p(["sqrt-sign"],[s.customSizedDelim("\\surd",f,false,t,e.mode)],t);var d=v.height+v.depth-l;if(d>a.height+a.depth+c){c=(c+d-a.height-a.depth)/2}var g=-(a.height+c+l)+v.height;v.style.top=g+"em";v.height-=g;v.depth+=g;var y;if(a.height===0&&a.depth===0){y=p()}else{y=n.makeVList([{type:"elem",elem:a},{type:"kern",size:c},{type:"elem",elem:u},{type:"kern",size:l}],"firstBaseline",null,t)}if(!e.value.index){return p(["mord","sqrt"],[v,y],t)}else{var x=t.withStyle(i.SCRIPTSCRIPT);var b=z(e.value.index,x);var w=p([r.reset(),i.SCRIPTSCRIPT.cls()],[b],x);var k=Math.max(v.height,y.height);var S=Math.max(v.depth,y.depth);var M=.6*(k-S);var T=n.makeVList([{type:"elem",elem:w}],"shift",-M,t);var A=p(["root"],[T]);return p(["mord","sqrt"],[A,v,y],t)}};w.sizing=function(e,t){var r=v(e.value.value,t.withSize(e.value.size),false);var a=t.style;var i=n.sizingMultiplier[e.value.size];i=i*a.sizeMultiplier;for(var s=0;s<r.length;s++){var l=u.indexOf(r[s].classes,"sizing");if(l<0){r[s].classes.push("sizing","reset-"+t.size,e.value.size,a.cls());r[s].maxFontSize=i}else if(r[s].classes[l+1]==="reset-"+e.value.size){r[s].classes[l+1]="reset-"+t.size}}return n.makeFragment(r)};w.styling=function(e,t){var r={display:i.DISPLAY,text:i.TEXT,script:i.SCRIPT,scriptscript:i.SCRIPTSCRIPT};var a=r[e.value.style];var s=t.withStyle(a);var l=v(e.value.value,s,false);for(var o=0;o<l.length;o++){var p=u.indexOf(l[o].classes,a.reset());if(p<0){l[o].classes.push(t.style.reset(),a.cls())}else{l[o].classes[p]=t.style.reset()}}return new n.makeFragment(l)};w.font=function(e,t){var r=e.value.font;return z(e.value.body,t.withFont(r))};w.delimsizing=function(e,t){var r=e.value.value;if(r==="."){return p([e.value.mclass])}return s.sizedDelim(r,e.value.size,t,e.mode,[e.value.mclass])};w.leftright=function(e,t){var r=v(e.value.body,t.reset(),true);var a=0;var i=0;var n=false;for(var l=0;l<r.length;l++){if(r[l].isMiddle){n=true}else{a=Math.max(r[l].height,a);i=Math.max(r[l].depth,i)}}var o=t.style;a*=o.sizeMultiplier;i*=o.sizeMultiplier;var u;if(e.value.left==="."){u=b(t,["mopen"])}else{u=s.leftRightDelim(e.value.left,a,i,t,e.mode,["mopen"])}r.unshift(u);if(n){for(l=1;l<r.length;l++){if(r[l].isMiddle){r[l]=s.leftRightDelim(r[l].isMiddle.value,a,i,r[l].isMiddle.options,e.mode,[])}}}var h;if(e.value.right==="."){h=b(t,["mclose"])}else{h=s.leftRightDelim(e.value.right,a,i,t,e.mode,["mclose"])}r.push(h);return p(["minner",o.cls()],r,t)};w.middle=function(e,t){var r;if(e.value.value==="."){r=b(t,[])}else{r=s.sizedDelim(e.value.value,1,t,e.mode,[]);r.isMiddle={value:e.value.value,options:t}}return r};w.rule=function(e,t){var r=p(["mord","rule"],[],t);var a=t.style;var i=0;if(e.value.shift){i=k(e.value.shift,a)}var n=k(e.value.width,a);var s=k(e.value.height,a);i/=a.sizeMultiplier;n/=a.sizeMultiplier;s/=a.sizeMultiplier;r.style.borderRightWidth=n+"em";r.style.borderTopWidth=s+"em";r.style.bottom=i+"em";r.width=n;r.height=s+i;r.depth=-i;return r};w.kern=function(e,t){var r=p(["mord","rule"],[],t);var a=t.style;var i=0;if(e.value.dimension){i=k(e.value.dimension,a)}i/=a.sizeMultiplier;r.style.marginLeft=i+"em";return r};w.accent=function(e,t){var r=e.value.base;var a=t.style;var i;if(e.type==="supsub"){var s=e;e=s.value.base;r=e.value.base;s.value.base=r;i=z(s,t.reset())}var l=z(r,t.withStyle(a.cramp()));var o;if(x(r)){var u=y(r);var h=z(u,t.withStyle(a.cramp()));o=h.skew}else{o=0}var c=Math.min(l.height,a.metrics.xHeight);var m=n.makeSymbol(e.value.accent,"Main-Regular","math",t);m.italic=0;var f=e.value.accent==="\\vec"?"accent-vec":null;var v=p(["accent-body",f],[p([],[m])]);v=n.makeVList([{type:"elem",elem:l},{type:"kern",size:-c},{type:"elem",elem:v}],"firstBaseline",null,t);v.children[1].style.marginLeft=2*o+"em";var d=p(["mord","accent"],[v],t);if(i){i.children[0]=d;i.height=Math.max(d.height,i.height);i.classes[0]="mord";return i}else{return d}};w.phantom=function(e,t){var r=v(e.value.value,t.withPhantom(),false);return new n.makeFragment(r)};w.mclass=function(e,t){var r=v(e.value.value,t,true);return p([e.value.mclass],r,t)};var z=function(e,t){if(!e){return p()}if(w[e.type]){var r=w[e.type](e,t);var i;if(t.style!==t.parentStyle){i=t.style.sizeMultiplier/t.parentStyle.sizeMultiplier;r.height*=i;r.depth*=i}if(t.size!==t.parentSize){i=n.sizingMultiplier[t.size]/n.sizingMultiplier[t.parentSize];r.height*=i;r.depth*=i}return r}else{throw new a("Got group of unknown type: '"+e.type+"'")}};var S=function(e,t){e=JSON.parse(JSON.stringify(e));var r=v(e,t,true);var a=p(["base",t.style.cls()],r,t);var i=p(["strut"]);var n=p(["strut","bottom"]);i.style.height=a.height+"em";n.style.height=a.height+a.depth+"em";n.style.verticalAlign=-a.depth+"em";var s=p(["katex-html"],[i,n,a]);s.setAttribute("aria-hidden","true");return s};t.exports=S},{"./ParseError":6,"./Style":9,"./buildCommon":10,"./delimiter":14,"./domTree":15,"./fontMetrics":17,"./utils":25}],12:[function(e,t,r){var a=e("./buildCommon");var i=e("./fontMetrics");var n=e("./mathMLTree");var s=e("./ParseError");var l=e("./symbols");var o=e("./utils");var u=a.makeSpan;var p=a.fontMap;var h=function(e,t){if(l[t][e]&&l[t][e].replace){e=l[t][e].replace}return new n.TextNode(e)};var c=function(e,t){var r=t.font;if(!r){return null}var a=e.mode;if(r==="mathit"){return"italic"}var n=e.value;if(o.contains(["\\imath","\\jmath"],n)){return null}if(l[a][n]&&l[a][n].replace){n=l[a][n].replace}var s=p[r].fontName;if(i.getCharacterMetrics(n,s)){return p[t.font].variant}return null};var m={};m.mathord=function(e,t){var r=new n.MathNode("mi",[h(e.value,e.mode)]);var a=c(e,t);if(a){r.setAttribute("mathvariant",a)}return r};m.textord=function(e,t){var r=h(e.value,e.mode);var a=c(e,t)||"normal";var i;if(/[0-9]/.test(e.value)){i=new n.MathNode("mn",[r]);if(t.font){i.setAttribute("mathvariant",a)}}else{i=new n.MathNode("mi",[r]);i.setAttribute("mathvariant",a)}return i};m.bin=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);return t};m.rel=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);return t};m.open=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);return t};m.close=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);return t};m.inner=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);return t};m.punct=function(e){var t=new n.MathNode("mo",[h(e.value,e.mode)]);t.setAttribute("separator","true");return t};m.ordgroup=function(e,t){var r=f(e.value,t);var a=new n.MathNode("mrow",r);return a};m.text=function(e,t){var r=f(e.value.body,t);var a=new n.MathNode("mtext",r);return a};m.color=function(e,t){var r=f(e.value.value,t);var a=new n.MathNode("mstyle",r);a.setAttribute("mathcolor",e.value.color);return a};m.supsub=function(e,t){var r=[v(e.value.base,t)];if(e.value.sub){r.push(v(e.value.sub,t))}if(e.value.sup){r.push(v(e.value.sup,t))}var a;if(!e.value.sub){a="msup"}else if(!e.value.sup){a="msub"}else{a="msubsup"}var i=new n.MathNode(a,r);return i};m.genfrac=function(e,t){var r=new n.MathNode("mfrac",[v(e.value.numer,t),v(e.value.denom,t)]);if(!e.value.hasBarLine){r.setAttribute("linethickness","0px")}if(e.value.leftDelim!=null||e.value.rightDelim!=null){var a=[];if(e.value.leftDelim!=null){var i=new n.MathNode("mo",[new n.TextNode(e.value.leftDelim)]);i.setAttribute("fence","true");a.push(i)}a.push(r);if(e.value.rightDelim!=null){var s=new n.MathNode("mo",[new n.TextNode(e.value.rightDelim)]);s.setAttribute("fence","true");a.push(s)}var l=new n.MathNode("mrow",a);return l}return r};m.array=function(e,t){return new n.MathNode("mtable",e.value.body.map(function(e){return new n.MathNode("mtr",e.map(function(e){return new n.MathNode("mtd",[v(e,t)])}))}))};m.sqrt=function(e,t){var r;if(e.value.index){r=new n.MathNode("mroot",[v(e.value.body,t),v(e.value.index,t)])}else{r=new n.MathNode("msqrt",[v(e.value.body,t)])}return r};m.leftright=function(e,t){var r=f(e.value.body,t);if(e.value.left!=="."){var a=new n.MathNode("mo",[h(e.value.left,e.mode)]);a.setAttribute("fence","true");r.unshift(a)}if(e.value.right!=="."){var i=new n.MathNode("mo",[h(e.value.right,e.mode)]);i.setAttribute("fence","true");r.push(i)}var s=new n.MathNode("mrow",r);return s};m.middle=function(e,t){var r=new n.MathNode("mo",[h(e.value.middle,e.mode)]);r.setAttribute("fence","true");return r};m.accent=function(e,t){var r=new n.MathNode("mo",[h(e.value.accent,e.mode)]);var a=new n.MathNode("mover",[v(e.value.base,t),r]);a.setAttribute("accent","true");return a};m.spacing=function(e){var t;if(e.value==="\\ "||e.value==="\\space"||e.value===" "||e.value==="~"){t=new n.MathNode("mtext",[new n.TextNode("\xa0")])}else{t=new n.MathNode("mspace");t.setAttribute("width",a.spacingFunctions[e.value].size)}return t};m.op=function(e,t){var r;if(e.value.symbol){r=new n.MathNode("mo",[h(e.value.body,e.mode)])}else if(e.value.value){r=new n.MathNode("mo",f(e.value.value,t))}else{r=new n.MathNode("mi",[new n.TextNode(e.value.body.slice(1))])}return r};m.mod=function(e,t){var r=[];if(e.value.modType==="pod"||e.value.modType==="pmod"){r.push(new n.MathNode("mo",[h("(",e.mode)]))}if(e.value.modType!=="pod"){r.push(new n.MathNode("mo",[h("mod",e.mode)]))}if(e.value.value){var a=new n.MathNode("mspace");a.setAttribute("width","0.333333em");r.push(a);r=r.concat(f(e.value.value,t))}if(e.value.modType==="pod"||e.value.modType==="pmod"){r.push(new n.MathNode("mo",[h(")",e.mode)]))}return new n.MathNode("mo",r)};m.katex=function(e){var t=new n.MathNode("mtext",[new n.TextNode("KaTeX")]);return t};m.font=function(e,t){var r=e.value.font;return v(e.value.body,t.withFont(r))};m.delimsizing=function(e){var t=[];if(e.value.value!=="."){t.push(h(e.value.value,e.mode))}var r=new n.MathNode("mo",t);if(e.value.mclass==="mopen"||e.value.mclass==="mclose"){r.setAttribute("fence","true")}else{r.setAttribute("fence","false")}return r};m.styling=function(e,t){var r=f(e.value.value,t);var a=new n.MathNode("mstyle",r);var i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]};var s=i[e.value.style];a.setAttribute("scriptlevel",s[0]);a.setAttribute("displaystyle",s[1]);return a};m.sizing=function(e,t){var r=f(e.value.value,t);var i=new n.MathNode("mstyle",r);i.setAttribute("mathsize",a.sizingMultiplier[e.value.size]+"em");return i};m.overline=function(e,t){var r=new n.MathNode("mo",[new n.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new n.MathNode("mover",[v(e.value.body,t),r]);a.setAttribute("accent","true");return a};m.underline=function(e,t){var r=new n.MathNode("mo",[new n.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new n.MathNode("munder",[v(e.value.body,t),r]);a.setAttribute("accentunder","true");return a};m.rule=function(e){var t=new n.MathNode("mrow");return t};m.kern=function(e){var t=new n.MathNode("mrow");return t};m.llap=function(e,t){var r=new n.MathNode("mpadded",[v(e.value.body,t)]);r.setAttribute("lspace","-1width");r.setAttribute("width","0px");return r};m.rlap=function(e,t){var r=new n.MathNode("mpadded",[v(e.value.body,t)]);r.setAttribute("width","0px");return r};m.phantom=function(e,t){var r=f(e.value.value,t);return new n.MathNode("mphantom",r)};m.mclass=function(e,t){var r=f(e.value.value,t);return new n.MathNode("mstyle",r)};var f=function(e,t){var r=[];for(var a=0;a<e.length;a++){var i=e[a];r.push(v(i,t))}return r};var v=function(e,t){if(!e){return new n.MathNode("mrow")}if(m[e.type]){return m[e.type](e,t)}else{throw new s("Got group of unknown type: '"+e.type+"'")}};var d=function(e,t,r){var a=f(e,r);var i=new n.MathNode("mrow",a);var s=new n.MathNode("annotation",[new n.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var l=new n.MathNode("semantics",[i,s]);var o=new n.MathNode("math",[l]);return u(["katex-mathml"],[o])};t.exports=d},{"./ParseError":6,"./buildCommon":10,"./fontMetrics":17,"./mathMLTree":20,"./symbols":23,"./utils":25}],13:[function(e,t,r){var a=e("./buildHTML");var i=e("./buildMathML");var n=e("./buildCommon");var s=e("./Options");var l=e("./Settings");var o=e("./Style");var u=n.makeSpan;var p=function(e,t,r){r=r||new l({});var n=o.TEXT;if(r.displayMode){n=o.DISPLAY}var p=new s({style:n,size:"size5"});var h=i(e,t,p);var c=a(e,p);var m=u(["katex"],[h,c]);if(r.displayMode){return u(["katex-display"],[m])}else{return m}};t.exports=p},{"./Options":5,"./Settings":8,"./Style":9,"./buildCommon":10,"./buildHTML":11,"./buildMathML":12}],14:[function(e,t,r){var a=e("./ParseError");var i=e("./Style");var n=e("./buildCommon");var s=e("./fontMetrics");var l=e("./symbols");var o=e("./utils");var u=n.makeSpan;var p=function(e,t){if(l.math[e]&&l.math[e].replace){return s.getCharacterMetrics(l.math[e].replace,t)}else{return s.getCharacterMetrics(e,t)}};var h=function(e,t,r,a){return n.makeSymbol(e,"Size"+t+"-Regular",r,a)};var c=function(e,t,r,a){a=a||[];var i=u(a.concat(["style-wrap",r.style.reset(),t.cls()]),[e],r);var n=t.sizeMultiplier/r.style.sizeMultiplier;i.height*=n;i.depth*=n;i.maxFontSize=t.sizeMultiplier;return i};var m=function(e,t,r,a,i,s){var l=n.makeSymbol(e,"Main-Regular",i,a);var o=c(l,t,a,s);if(r){var u=(1-a.style.sizeMultiplier/t.sizeMultiplier)*a.style.metrics.axisHeight;o.style.top=u+"em";o.height-=u;o.depth+=u}return o};var f=function(e,t,r,a,n,s){var l=h(e,t,n,a);var o=c(u(["delimsizing","size"+t],[l],a),i.TEXT,a,s);if(r){var p=(1-a.style.sizeMultiplier)*a.style.metrics.axisHeight;o.style.top=p+"em";o.height-=p;o.depth+=p}return o};var v=function(e,t,r){var a;if(t==="Size1-Regular"){a="delim-size1"}else if(t==="Size4-Regular"){a="delim-size4"}var i=u(["delimsizinginner",a],[u([],[n.makeSymbol(e,t,r)])]);return{type:"elem",elem:i}};var d=function(e,t,r,a,s,l){var o;var h;var m;var f;o=m=f=e;h=null;var d="Size1-Regular";if(e==="\\uparrow"){m=f="\u23d0"}else if(e==="\\Uparrow"){m=f="\u2016"}else if(e==="\\downarrow"){o=m="\u23d0"}else if(e==="\\Downarrow"){o=m="\u2016"}else if(e==="\\updownarrow"){o="\\uparrow";m="\u23d0";f="\\downarrow"}else if(e==="\\Updownarrow"){o="\\Uparrow";m="\u2016";f="\\Downarrow"}else if(e==="["||e==="\\lbrack"){o="\u23a1";m="\u23a2";f="\u23a3";d="Size4-Regular"}else if(e==="]"||e==="\\rbrack"){o="\u23a4";m="\u23a5";f="\u23a6";d="Size4-Regular"}else if(e==="\\lfloor"){m=o="\u23a2";f="\u23a3";d="Size4-Regular"}else if(e==="\\lceil"){o="\u23a1";m=f="\u23a2";d="Size4-Regular"}else if(e==="\\rfloor"){m=o="\u23a5";f="\u23a6";d="Size4-Regular"}else if(e==="\\rceil"){o="\u23a4";m=f="\u23a5";d="Size4-Regular"}else if(e==="("){o="\u239b";m="\u239c";f="\u239d";d="Size4-Regular"}else if(e===")"){o="\u239e";m="\u239f";f="\u23a0";d="Size4-Regular"}else if(e==="\\{"||e==="\\lbrace"){o="\u23a7";h="\u23a8";f="\u23a9";m="\u23aa";d="Size4-Regular"}else if(e==="\\}"||e==="\\rbrace"){o="\u23ab";h="\u23ac";f="\u23ad";m="\u23aa";d="Size4-Regular"}else if(e==="\\lgroup"){o="\u23a7";f="\u23a9";m="\u23aa";d="Size4-Regular"}else if(e==="\\rgroup"){o="\u23ab";f="\u23ad";m="\u23aa";d="Size4-Regular"}else if(e==="\\lmoustache"){o="\u23a7";f="\u23ad";m="\u23aa";d="Size4-Regular"}else if(e==="\\rmoustache"){o="\u23ab";f="\u23a9";m="\u23aa";d="Size4-Regular"}else if(e==="\\surd"){o="\ue001";f="\u23b7";m="\ue000";d="Size4-Regular"}var g=p(o,d);var y=g.height+g.depth;var x=p(m,d);var b=x.height+x.depth;var w=p(f,d);var k=w.height+w.depth;var z=0;var S=1;if(h!==null){var M=p(h,d);z=M.height+M.depth;S=2}var T=y+k+z;var A=Math.ceil((t-T)/(S*b));var N=T+A*S*b;var q=a.style.metrics.axisHeight;if(r){q*=a.style.sizeMultiplier}var R=N/2-q;var E=[];E.push(v(f,d,s));var C;if(h===null){for(C=0;C<A;C++){E.push(v(m,d,s))}}else{for(C=0;C<A;C++){E.push(v(m,d,s))}E.push(v(h,d,s));for(C=0;C<A;C++){E.push(v(m,d,s))}}E.push(v(o,d,s));var D=n.makeVList(E,"bottom",R,a);return c(u(["delimsizing","mult"],[D],a),i.TEXT,a,l)};var g=["(",")","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\\lceil","\\rceil","\\surd"];var y=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\\lmoustache","\\rmoustache"];var x=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"];var b=[0,1.2,1.8,2.4,3];var w=function(e,t,r,i,n){if(e==="<"||e==="\\lt"){e="\\langle"}else if(e===">"||e==="\\gt"){e="\\rangle"}if(o.contains(g,e)||o.contains(x,e)){return f(e,t,false,r,i,n)}else if(o.contains(y,e)){return d(e,b[t],false,r,i,n)}else{throw new a("Illegal delimiter: '"+e+"'")}};var k=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}];var z=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"stack"}];var S=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];var M=function(e){if(e.type==="small"){return"Main-Regular"}else if(e.type==="large"){return"Size"+e.size+"-Regular"}else if(e.type==="stack"){return"Size4-Regular"}};var T=function(e,t,r,a){var i=Math.min(2,3-a.style.size);for(var n=i;n<r.length;n++){if(r[n].type==="stack"){break}var s=p(e,M(r[n]));var l=s.height+s.depth;if(r[n].type==="small"){l*=r[n].style.sizeMultiplier}if(l>t){return r[n]}}return r[r.length-1]};var A=function(e,t,r,a,i,n){if(e==="<"||e==="\\lt"){e="\\langle"}else if(e===">"||e==="\\gt"){e="\\rangle"}var s;if(o.contains(x,e)){s=k}else if(o.contains(g,e)){s=S}else{s=z}var l=T(e,t,s,a);if(l.type==="small"){return m(e,l.style,r,a,i,n)}else if(l.type==="large"){return f(e,l.size,r,a,i,n)}else if(l.type==="stack"){return d(e,t,r,a,i,n)}};var N=function(e,t,r,a,i,n){var l=a.style.metrics.axisHeight*a.style.sizeMultiplier;var o=901;var u=5/s.metrics.ptPerEm;var p=Math.max(t-l,r+l);var h=Math.max(p/500*o,2*p-u);return A(e,h,true,a,i,n)};t.exports={sizedDelim:w,customSizedDelim:A,leftRightDelim:N}},{"./ParseError":6,"./Style":9,"./buildCommon":10,"./fontMetrics":17,"./symbols":23,"./utils":25}],15:[function(e,t,r){var a=e("./unicodeRegexes");var i=e("./utils");var n=function(e){e=e.slice();for(var t=e.length-1;t>=0;t--){if(!e[t]){e.splice(t,1)}}return e.join(" ")};function s(e,t,r){this.classes=e||[];this.children=t||[];this.height=0;this.depth=0;this.maxFontSize=0;this.style={};this.attributes={};if(r){if(r.style.isTight()){this.classes.push("mtight")}if(r.getColor()){this.style.color=r.getColor()}}}s.prototype.setAttribute=function(e,t){this.attributes[e]=t};s.prototype.tryCombine=function(e){return false};s.prototype.toNode=function(){var e=document.createElement("span");e.className=n(this.classes);for(var t in this.style){if(Object.prototype.hasOwnProperty.call(this.style,t)){e.style[t]=this.style[t]}}for(var r in this.attributes){if(Object.prototype.hasOwnProperty.call(this.attributes,r)){e.setAttribute(r,this.attributes[r])}}for(var a=0;a<this.children.length;a++){e.appendChild(this.children[a].toNode())}return e};s.prototype.toMarkup=function(){var e="<span";if(this.classes.length){e+=' class="';e+=i.escape(n(this.classes));e+='"'}var t="";for(var r in this.style){if(this.style.hasOwnProperty(r)){t+=i.hyphenate(r)+":"+this.style[r]+";"}}if(t){e+=' style="'+i.escape(t)+'"'}for(var a in this.attributes){if(Object.prototype.hasOwnProperty.call(this.attributes,a)){e+=" "+a+'="';e+=i.escape(this.attributes[a]);e+='"'}}e+=">";for(var s=0;s<this.children.length;s++){e+=this.children[s].toMarkup()}e+="</span>";return e};function l(e){this.children=e||[];this.height=0;this.depth=0;this.maxFontSize=0}l.prototype.toNode=function(){var e=document.createDocumentFragment();for(var t=0;t<this.children.length;t++){e.appendChild(this.children[t].toNode())}return e};l.prototype.toMarkup=function(){var e="";for(var t=0;t<this.children.length;t++){e+=this.children[t].toMarkup()}return e};var o={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"};function u(e,t,r,i,n,s,l){this.value=e||"";this.height=t||0;this.depth=r||0;this.italic=i||0;this.skew=n||0;this.classes=s||[];this.style=l||{};this.maxFontSize=0;if(a.cjkRegex.test(e)){if(a.hangulRegex.test(e)){this.classes.push("hangul_fallback")}else{this.classes.push("cjk_fallback")}}if(/[\xee\xef\xed\xec]/.test(this.value)){this.value=o[this.value]}}u.prototype.tryCombine=function(e){if(!e||!(e instanceof u)||this.italic>0||n(this.classes)!==n(e.classes)||this.skew!==e.skew||this.maxFontSize!==e.maxFontSize){return false}for(var t in this.style){if(this.style.hasOwnProperty(t)&&this.style[t]!==e.style[t]){return false}}for(t in e.style){if(e.style.hasOwnProperty(t)&&this.style[t]!==e.style[t]){return false}}this.value+=e.value;this.height=Math.max(this.height,e.height);this.depth=Math.max(this.depth,e.depth);this.italic=e.italic;return true};u.prototype.toNode=function(){var e=document.createTextNode(this.value);var t=null;if(this.italic>0){t=document.createElement("span");t.style.marginRight=this.italic+"em"}if(this.classes.length>0){t=t||document.createElement("span");t.className=n(this.classes)}for(var r in this.style){if(this.style.hasOwnProperty(r)){t=t||document.createElement("span");t.style[r]=this.style[r]}}if(t){t.appendChild(e);return t}else{return e}};u.prototype.toMarkup=function(){var e=false;var t="<span";if(this.classes.length){e=true;t+=' class="';t+=i.escape(n(this.classes));t+='"'}var r="";if(this.italic>0){r+="margin-right:"+this.italic+"em;"}for(var a in this.style){if(this.style.hasOwnProperty(a)){r+=i.hyphenate(a)+":"+this.style[a]+";"}}if(r){e=true;t+=' style="'+i.escape(r)+'"'}var s=i.escape(this.value);if(e){t+=">";t+=s;t+="</span>";return t}else{return s}};t.exports={span:s,documentFragment:l,symbolNode:u}},{"./unicodeRegexes":24,"./utils":25}],16:[function(e,t,r){var a=e("./parseData");var i=e("./ParseError");var n=e("./Style");var s=a.ParseNode;function l(e,t){var r=[];var a=[r];var n=[];while(true){var l=e.parseExpression(false,null);r.push(new s("ordgroup",l,e.mode));var o=e.nextToken.text;if(o==="&"){e.consume()}else if(o==="\\end"){break}else if(o==="\\\\"||o==="\\cr"){var u=e.parseFunction();n.push(u.value.size);r=[];a.push(r)}else{throw new i("Expected & or \\\\ or \\end",e.nextToken)}}t.body=a;t.rowGaps=n;return new s(t.type,t,e.mode)}function o(e,r,a){if(typeof e==="string"){e=[e]}if(typeof r==="number"){r={numArgs:r}}var i={numArgs:r.numArgs||0,argTypes:r.argTypes,greediness:1,allowedInText:!!r.allowedInText,numOptionalArgs:r.numOptionalArgs||0,handler:a};for(var n=0;n<e.length;++n){t.exports[e[n]]=i}}o("array",{numArgs:1},function(e,t){var r=t[0];r=r.value.map?r.value:[r];var a=r.map(function(e){var t=e.value;if("lcr".indexOf(t)!==-1){return{type:"align",align:t}}else if(t==="|"){return{type:"separator",separator:"|"}}throw new i("Unknown column alignment: "+e.value,e)});var n={type:"array",cols:a,hskipBeforeAndAfter:true};n=l(e.parser,n);return n});o(["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],{},function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName];var r={type:"array",hskipBeforeAndAfter:false};r=l(e.parser,r);if(t){r=new s("leftright",{body:[r],left:t[0],right:t[1]},e.mode)}return r});o("cases",{},function(e){var t={type:"array",arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:n.TEXT.metrics.quad},{type:"align",align:"l",pregap:0,postgap:0}]};t=l(e.parser,t);t=new s("leftright",{body:[t],left:"\\{",right:"."},e.mode);return t});o("aligned",{},function(e){var t={type:"array",cols:[]};t=l(e.parser,t);var r=new s("ordgroup",[],e.mode);var a=0;t.value.body.forEach(function(e){var t;for(t=1;t<e.length;t+=2){e[t].value.unshift(r)}if(a<e.length){a=e.length}});for(var i=0;i<a;++i){var n="r";var o=0;if(i%2===1){n="l"}else if(i>0){o=2}t.value.cols[i]={type:"align",align:n,pregap:o,postgap:0}}return t})},{"./ParseError":6,"./Style":9,"./parseData":21}],17:[function(e,t,r){var a=e("./Style");var i=e("./unicodeRegexes").cjkRegex;var n={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25]};var s=0;var l=0;var o=0;var u=0;var p=.431;var h=1;var c=0;var m=.04;var f=.111;var v=.166;var d=.2;var g=.6;var y=.1;var x=10;var b=2/x;var w={defaultRuleThickness:m,bigOpSpacing1:f,bigOpSpacing2:v,bigOpSpacing3:d,bigOpSpacing4:g,bigOpSpacing5:y,ptPerEm:x,doubleRuleSep:b};var k=e("./fontMetricsData");var z={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xc6":"A","\xc7":"C","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xd0":"D","\xd1":"N","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xdd":"Y","\xde":"o","\xdf":"B","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xe6":"a","\xe7":"c","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xf0":"d","\xf1":"n","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xfd":"y","\xfe":"o","\xff":"y","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};var S=function(e,t){var r=e.charCodeAt(0);if(e[0]in z){r=z[e[0]].charCodeAt(0)}else if(i.test(e[0])){r="M".charCodeAt(0)}var a=k[t][r];if(a){return{depth:a[0],height:a[1],italic:a[2],skew:a[3],width:a[4]}}};t.exports={metrics:w,sigmas:n,getCharacterMetrics:S}},{"./Style":9,"./fontMetricsData":18,"./unicodeRegexes":24}],18:[function(e,t,r){t.exports={"AMS-Regular":{65:[0,.68889,0,0],66:[0,.68889,0,0],67:[0,.68889,0,0],68:[0,.68889,0,0],69:[0,.68889,0,0],70:[0,.68889,0,0],71:[0,.68889,0,0],72:[0,.68889,0,0],73:[0,.68889,0,0],74:[.16667,.68889,0,0],75:[0,.68889,0,0],76:[0,.68889,0,0],77:[0,.68889,0,0],78:[0,.68889,0,0],79:[.16667,.68889,0,0],80:[0,.68889,0,0],81:[.16667,.68889,0,0],82:[0,.68889,0,0],83:[0,.68889,0,0],84:[0,.68889,0,0],85:[0,.68889,0,0],86:[0,.68889,0,0],87:[0,.68889,0,0],88:[0,.68889,0,0],89:[0,.68889,0,0],90:[0,.68889,0,0],107:[0,.68889,0,0],165:[0,.675,.025,0],174:[.15559,.69224,0,0],240:[0,.68889,0,0],295:[0,.68889,0,0],710:[0,.825,0,0],732:[0,.9,0,0],770:[0,.825,0,0],771:[0,.9,0,0],989:[.08167,.58167,0,0],1008:[0,.43056,.04028,0],8245:[0,.54986,0,0],8463:[0,.68889,0,0],8487:[0,.68889,0,0],8498:[0,.68889,0,0],8502:[0,.68889,0,0],8503:[0,.68889,0,0],8504:[0,.68889,0,0],8513:[0,.68889,0,0],8592:[-.03598,.46402,0,0],8594:[-.03598,.46402,0,0],8602:[-.13313,.36687,0,0],8603:[-.13313,.36687,0,0],8606:[.01354,.52239,0,0],8608:[.01354,.52239,0,0],8610:[.01354,.52239,0,0],8611:[.01354,.52239,0,0],8619:[0,.54986,0,0],8620:[0,.54986,0,0],8621:[-.13313,.37788,0,0],8622:[-.13313,.36687,0,0],8624:[0,.69224,0,0],8625:[0,.69224,0,0],8630:[0,.43056,0,0],8631:[0,.43056,0,0],8634:[.08198,.58198,0,0],8635:[.08198,.58198,0,0],8638:[.19444,.69224,0,0],8639:[.19444,.69224,0,0],8642:[.19444,.69224,0,0],8643:[.19444,.69224,0,0],8644:[.1808,.675,0,0],8646:[.1808,.675,0,0],8647:[.1808,.675,0,0],8648:[.19444,.69224,0,0],8649:[.1808,.675,0,0],8650:[.19444,.69224,0,0],8651:[.01354,.52239,0,0],8652:[.01354,.52239,0,0],8653:[-.13313,.36687,0,0],8654:[-.13313,.36687,0,0],8655:[-.13313,.36687,0,0],8666:[.13667,.63667,0,0],8667:[.13667,.63667,0,0],8669:[-.13313,.37788,0,0],8672:[-.064,.437,0,0],8674:[-.064,.437,0,0],8705:[0,.825,0,0],8708:[0,.68889,0,0],8709:[.08167,.58167,0,0],8717:[0,.43056,0,0],8722:[-.03598,.46402,0,0],8724:[.08198,.69224,0,0],8726:[.08167,.58167,0,0],8733:[0,.69224,0,0],8736:[0,.69224,0,0],8737:[0,.69224,0,0],8738:[.03517,.52239,0,0],8739:[.08167,.58167,0,0],8740:[.25142,.74111,0,0],8741:[.08167,.58167,0,0],8742:[.25142,.74111,0,0],8756:[0,.69224,0,0],8757:[0,.69224,0,0],8764:[-.13313,.36687,0,0],8765:[-.13313,.37788,0,0],8769:[-.13313,.36687,0,0],8770:[-.03625,.46375,0,0],8774:[.30274,.79383,0,0],8776:[-.01688,.48312,0,0],8778:[.08167,.58167,0,0],8782:[.06062,.54986,0,0],8783:[.06062,.54986,0,0],8785:[.08198,.58198,0,0],8786:[.08198,.58198,0,0],8787:[.08198,.58198,0,0],8790:[0,.69224,0,0],8791:[.22958,.72958,0,0],8796:[.08198,.91667,0,0],8806:[.25583,.75583,0,0],
-8807:[.25583,.75583,0,0],8808:[.25142,.75726,0,0],8809:[.25142,.75726,0,0],8812:[.25583,.75583,0,0],8814:[.20576,.70576,0,0],8815:[.20576,.70576,0,0],8816:[.30274,.79383,0,0],8817:[.30274,.79383,0,0],8818:[.22958,.72958,0,0],8819:[.22958,.72958,0,0],8822:[.1808,.675,0,0],8823:[.1808,.675,0,0],8828:[.13667,.63667,0,0],8829:[.13667,.63667,0,0],8830:[.22958,.72958,0,0],8831:[.22958,.72958,0,0],8832:[.20576,.70576,0,0],8833:[.20576,.70576,0,0],8840:[.30274,.79383,0,0],8841:[.30274,.79383,0,0],8842:[.13597,.63597,0,0],8843:[.13597,.63597,0,0],8847:[.03517,.54986,0,0],8848:[.03517,.54986,0,0],8858:[.08198,.58198,0,0],8859:[.08198,.58198,0,0],8861:[.08198,.58198,0,0],8862:[0,.675,0,0],8863:[0,.675,0,0],8864:[0,.675,0,0],8865:[0,.675,0,0],8872:[0,.69224,0,0],8873:[0,.69224,0,0],8874:[0,.69224,0,0],8876:[0,.68889,0,0],8877:[0,.68889,0,0],8878:[0,.68889,0,0],8879:[0,.68889,0,0],8882:[.03517,.54986,0,0],8883:[.03517,.54986,0,0],8884:[.13667,.63667,0,0],8885:[.13667,.63667,0,0],8888:[0,.54986,0,0],8890:[.19444,.43056,0,0],8891:[.19444,.69224,0,0],8892:[.19444,.69224,0,0],8901:[0,.54986,0,0],8903:[.08167,.58167,0,0],8905:[.08167,.58167,0,0],8906:[.08167,.58167,0,0],8907:[0,.69224,0,0],8908:[0,.69224,0,0],8909:[-.03598,.46402,0,0],8910:[0,.54986,0,0],8911:[0,.54986,0,0],8912:[.03517,.54986,0,0],8913:[.03517,.54986,0,0],8914:[0,.54986,0,0],8915:[0,.54986,0,0],8916:[0,.69224,0,0],8918:[.0391,.5391,0,0],8919:[.0391,.5391,0,0],8920:[.03517,.54986,0,0],8921:[.03517,.54986,0,0],8922:[.38569,.88569,0,0],8923:[.38569,.88569,0,0],8926:[.13667,.63667,0,0],8927:[.13667,.63667,0,0],8928:[.30274,.79383,0,0],8929:[.30274,.79383,0,0],8934:[.23222,.74111,0,0],8935:[.23222,.74111,0,0],8936:[.23222,.74111,0,0],8937:[.23222,.74111,0,0],8938:[.20576,.70576,0,0],8939:[.20576,.70576,0,0],8940:[.30274,.79383,0,0],8941:[.30274,.79383,0,0],8994:[.19444,.69224,0,0],8995:[.19444,.69224,0,0],9416:[.15559,.69224,0,0],9484:[0,.69224,0,0],9488:[0,.69224,0,0],9492:[0,.37788,0,0],9496:[0,.37788,0,0],9585:[.19444,.68889,0,0],9586:[.19444,.74111,0,0],9632:[0,.675,0,0],9633:[0,.675,0,0],9650:[0,.54986,0,0],9651:[0,.54986,0,0],9654:[.03517,.54986,0,0],9660:[0,.54986,0,0],9661:[0,.54986,0,0],9664:[.03517,.54986,0,0],9674:[.11111,.69224,0,0],9733:[.19444,.69224,0,0],10003:[0,.69224,0,0],10016:[0,.69224,0,0],10731:[.11111,.69224,0,0],10846:[.19444,.75583,0,0],10877:[.13667,.63667,0,0],10878:[.13667,.63667,0,0],10885:[.25583,.75583,0,0],10886:[.25583,.75583,0,0],10887:[.13597,.63597,0,0],10888:[.13597,.63597,0,0],10889:[.26167,.75726,0,0],10890:[.26167,.75726,0,0],10891:[.48256,.98256,0,0],10892:[.48256,.98256,0,0],10901:[.13667,.63667,0,0],10902:[.13667,.63667,0,0],10933:[.25142,.75726,0,0],10934:[.25142,.75726,0,0],10935:[.26167,.75726,0,0],10936:[.26167,.75726,0,0],10937:[.26167,.75726,0,0],10938:[.26167,.75726,0,0],10949:[.25583,.75583,0,0],10950:[.25583,.75583,0,0],10955:[.28481,.79383,0,0],10956:[.28481,.79383,0,0],57350:[.08167,.58167,0,0],57351:[.08167,.58167,0,0],57352:[.08167,.58167,0,0],57353:[0,.43056,.04028,0],57356:[.25142,.75726,0,0],57357:[.25142,.75726,0,0],57358:[.41951,.91951,0,0],57359:[.30274,.79383,0,0],57360:[.30274,.79383,0,0],57361:[.41951,.91951,0,0],57366:[.25142,.75726,0,0],57367:[.25142,.75726,0,0],57368:[.25142,.75726,0,0],57369:[.25142,.75726,0,0],57370:[.13597,.63597,0,0],57371:[.13597,.63597,0,0]},"Caligraphic-Regular":{48:[0,.43056,0,0],49:[0,.43056,0,0],50:[0,.43056,0,0],51:[.19444,.43056,0,0],52:[.19444,.43056,0,0],53:[.19444,.43056,0,0],54:[0,.64444,0,0],55:[.19444,.43056,0,0],56:[0,.64444,0,0],57:[.19444,.43056,0,0],65:[0,.68333,0,.19445],66:[0,.68333,.03041,.13889],67:[0,.68333,.05834,.13889],68:[0,.68333,.02778,.08334],69:[0,.68333,.08944,.11111],70:[0,.68333,.09931,.11111],71:[.09722,.68333,.0593,.11111],72:[0,.68333,.00965,.11111],73:[0,.68333,.07382,0],74:[.09722,.68333,.18472,.16667],75:[0,.68333,.01445,.05556],76:[0,.68333,0,.13889],77:[0,.68333,0,.13889],78:[0,.68333,.14736,.08334],79:[0,.68333,.02778,.11111],80:[0,.68333,.08222,.08334],81:[.09722,.68333,0,.11111],82:[0,.68333,0,.08334],83:[0,.68333,.075,.13889],84:[0,.68333,.25417,0],85:[0,.68333,.09931,.08334],86:[0,.68333,.08222,0],87:[0,.68333,.08222,.08334],88:[0,.68333,.14643,.13889],89:[.09722,.68333,.08222,.08334],90:[0,.68333,.07944,.13889]},"Fraktur-Regular":{33:[0,.69141,0,0],34:[0,.69141,0,0],38:[0,.69141,0,0],39:[0,.69141,0,0],40:[.24982,.74947,0,0],41:[.24982,.74947,0,0],42:[0,.62119,0,0],43:[.08319,.58283,0,0],44:[0,.10803,0,0],45:[.08319,.58283,0,0],46:[0,.10803,0,0],47:[.24982,.74947,0,0],48:[0,.47534,0,0],49:[0,.47534,0,0],50:[0,.47534,0,0],51:[.18906,.47534,0,0],52:[.18906,.47534,0,0],53:[.18906,.47534,0,0],54:[0,.69141,0,0],55:[.18906,.47534,0,0],56:[0,.69141,0,0],57:[.18906,.47534,0,0],58:[0,.47534,0,0],59:[.12604,.47534,0,0],61:[-.13099,.36866,0,0],63:[0,.69141,0,0],65:[0,.69141,0,0],66:[0,.69141,0,0],67:[0,.69141,0,0],68:[0,.69141,0,0],69:[0,.69141,0,0],70:[.12604,.69141,0,0],71:[0,.69141,0,0],72:[.06302,.69141,0,0],73:[0,.69141,0,0],74:[.12604,.69141,0,0],75:[0,.69141,0,0],76:[0,.69141,0,0],77:[0,.69141,0,0],78:[0,.69141,0,0],79:[0,.69141,0,0],80:[.18906,.69141,0,0],81:[.03781,.69141,0,0],82:[0,.69141,0,0],83:[0,.69141,0,0],84:[0,.69141,0,0],85:[0,.69141,0,0],86:[0,.69141,0,0],87:[0,.69141,0,0],88:[0,.69141,0,0],89:[.18906,.69141,0,0],90:[.12604,.69141,0,0],91:[.24982,.74947,0,0],93:[.24982,.74947,0,0],94:[0,.69141,0,0],97:[0,.47534,0,0],98:[0,.69141,0,0],99:[0,.47534,0,0],100:[0,.62119,0,0],101:[0,.47534,0,0],102:[.18906,.69141,0,0],103:[.18906,.47534,0,0],104:[.18906,.69141,0,0],105:[0,.69141,0,0],106:[0,.69141,0,0],107:[0,.69141,0,0],108:[0,.69141,0,0],109:[0,.47534,0,0],110:[0,.47534,0,0],111:[0,.47534,0,0],112:[.18906,.52396,0,0],113:[.18906,.47534,0,0],114:[0,.47534,0,0],115:[0,.47534,0,0],116:[0,.62119,0,0],117:[0,.47534,0,0],118:[0,.52396,0,0],119:[0,.52396,0,0],120:[.18906,.47534,0,0],121:[.18906,.47534,0,0],122:[.18906,.47534,0,0],8216:[0,.69141,0,0],8217:[0,.69141,0,0],58112:[0,.62119,0,0],58113:[0,.62119,0,0],58114:[.18906,.69141,0,0],58115:[.18906,.69141,0,0],58116:[.18906,.47534,0,0],58117:[0,.69141,0,0],58118:[0,.62119,0,0],58119:[0,.47534,0,0]},"Main-Bold":{33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.13333,.63333,0,0],44:[.19444,.15556,0,0],45:[0,.44444,0,0],46:[0,.15556,0,0],47:[.25,.75,0,0],48:[0,.64444,0,0],49:[0,.64444,0,0],50:[0,.64444,0,0],51:[0,.64444,0,0],52:[0,.64444,0,0],53:[0,.64444,0,0],54:[0,.64444,0,0],55:[0,.64444,0,0],56:[0,.64444,0,0],57:[0,.64444,0,0],58:[0,.44444,0,0],59:[.19444,.44444,0,0],60:[.08556,.58556,0,0],61:[-.10889,.39111,0,0],62:[.08556,.58556,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.68611,0,0],66:[0,.68611,0,0],67:[0,.68611,0,0],68:[0,.68611,0,0],69:[0,.68611,0,0],70:[0,.68611,0,0],71:[0,.68611,0,0],72:[0,.68611,0,0],73:[0,.68611,0,0],74:[0,.68611,0,0],75:[0,.68611,0,0],76:[0,.68611,0,0],77:[0,.68611,0,0],78:[0,.68611,0,0],79:[0,.68611,0,0],80:[0,.68611,0,0],81:[.19444,.68611,0,0],82:[0,.68611,0,0],83:[0,.68611,0,0],84:[0,.68611,0,0],85:[0,.68611,0,0],86:[0,.68611,.01597,0],87:[0,.68611,.01597,0],88:[0,.68611,0,0],89:[0,.68611,.02875,0],90:[0,.68611,0,0],91:[.25,.75,0,0],92:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.31,.13444,.03194,0],96:[0,.69444,0,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[0,.69444,.10903,0],103:[.19444,.44444,.01597,0],104:[0,.69444,0,0],105:[0,.69444,0,0],106:[.19444,.69444,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,0,0],114:[0,.44444,0,0],115:[0,.44444,0,0],116:[0,.63492,0,0],117:[0,.44444,0,0],118:[0,.44444,.01597,0],119:[0,.44444,.01597,0],120:[0,.44444,0,0],121:[.19444,.44444,.01597,0],122:[0,.44444,0,0],123:[.25,.75,0,0],124:[.25,.75,0,0],125:[.25,.75,0,0],126:[.35,.34444,0,0],168:[0,.69444,0,0],172:[0,.44444,0,0],175:[0,.59611,0,0],176:[0,.69444,0,0],177:[.13333,.63333,0,0],180:[0,.69444,0,0],215:[.13333,.63333,0,0],247:[.13333,.63333,0,0],305:[0,.44444,0,0],567:[.19444,.44444,0,0],710:[0,.69444,0,0],711:[0,.63194,0,0],713:[0,.59611,0,0],714:[0,.69444,0,0],715:[0,.69444,0,0],728:[0,.69444,0,0],729:[0,.69444,0,0],730:[0,.69444,0,0],732:[0,.69444,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.69444,0,0],772:[0,.59611,0,0],774:[0,.69444,0,0],775:[0,.69444,0,0],776:[0,.69444,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.63194,0,0],824:[.19444,.69444,0,0],915:[0,.68611,0,0],916:[0,.68611,0,0],920:[0,.68611,0,0],923:[0,.68611,0,0],926:[0,.68611,0,0],928:[0,.68611,0,0],931:[0,.68611,0,0],933:[0,.68611,0,0],934:[0,.68611,0,0],936:[0,.68611,0,0],937:[0,.68611,0,0],8211:[0,.44444,.03194,0],8212:[0,.44444,.03194,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0],8224:[.19444,.69444,0,0],8225:[.19444,.69444,0,0],8242:[0,.55556,0,0],8407:[0,.72444,.15486,0],8463:[0,.69444,0,0],8465:[0,.69444,0,0],8467:[0,.69444,0,0],8472:[.19444,.44444,0,0],8476:[0,.69444,0,0],8501:[0,.69444,0,0],8592:[-.10889,.39111,0,0],8593:[.19444,.69444,0,0],8594:[-.10889,.39111,0,0],8595:[.19444,.69444,0,0],8596:[-.10889,.39111,0,0],8597:[.25,.75,0,0],8598:[.19444,.69444,0,0],8599:[.19444,.69444,0,0],8600:[.19444,.69444,0,0],8601:[.19444,.69444,0,0],8636:[-.10889,.39111,0,0],8637:[-.10889,.39111,0,0],8640:[-.10889,.39111,0,0],8641:[-.10889,.39111,0,0],8656:[-.10889,.39111,0,0],8657:[.19444,.69444,0,0],8658:[-.10889,.39111,0,0],8659:[.19444,.69444,0,0],8660:[-.10889,.39111,0,0],8661:[.25,.75,0,0],8704:[0,.69444,0,0],8706:[0,.69444,.06389,0],8707:[0,.69444,0,0],8709:[.05556,.75,0,0],8711:[0,.68611,0,0],8712:[.08556,.58556,0,0],8715:[.08556,.58556,0,0],8722:[.13333,.63333,0,0],8723:[.13333,.63333,0,0],8725:[.25,.75,0,0],8726:[.25,.75,0,0],8727:[-.02778,.47222,0,0],8728:[-.02639,.47361,0,0],8729:[-.02639,.47361,0,0],8730:[.18,.82,0,0],8733:[0,.44444,0,0],8734:[0,.44444,0,0],8736:[0,.69224,0,0],8739:[.25,.75,0,0],8741:[.25,.75,0,0],8743:[0,.55556,0,0],8744:[0,.55556,0,0],8745:[0,.55556,0,0],8746:[0,.55556,0,0],8747:[.19444,.69444,.12778,0],8764:[-.10889,.39111,0,0],8768:[.19444,.69444,0,0],8771:[.00222,.50222,0,0],8776:[.02444,.52444,0,0],8781:[.00222,.50222,0,0],8801:[.00222,.50222,0,0],8804:[.19667,.69667,0,0],8805:[.19667,.69667,0,0],8810:[.08556,.58556,0,0],8811:[.08556,.58556,0,0],8826:[.08556,.58556,0,0],8827:[.08556,.58556,0,0],8834:[.08556,.58556,0,0],8835:[.08556,.58556,0,0],8838:[.19667,.69667,0,0],8839:[.19667,.69667,0,0],8846:[0,.55556,0,0],8849:[.19667,.69667,0,0],8850:[.19667,.69667,0,0],8851:[0,.55556,0,0],8852:[0,.55556,0,0],8853:[.13333,.63333,0,0],8854:[.13333,.63333,0,0],8855:[.13333,.63333,0,0],8856:[.13333,.63333,0,0],8857:[.13333,.63333,0,0],8866:[0,.69444,0,0],8867:[0,.69444,0,0],8868:[0,.69444,0,0],8869:[0,.69444,0,0],8900:[-.02639,.47361,0,0],8901:[-.02639,.47361,0,0],8902:[-.02778,.47222,0,0],8968:[.25,.75,0,0],8969:[.25,.75,0,0],8970:[.25,.75,0,0],8971:[.25,.75,0,0],8994:[-.13889,.36111,0,0],8995:[-.13889,.36111,0,0],9651:[.19444,.69444,0,0],9657:[-.02778,.47222,0,0],9661:[.19444,.69444,0,0],9667:[-.02778,.47222,0,0],9711:[.19444,.69444,0,0],9824:[.12963,.69444,0,0],9825:[.12963,.69444,0,0],9826:[.12963,.69444,0,0],9827:[.12963,.69444,0,0],9837:[0,.75,0,0],9838:[.19444,.69444,0,0],9839:[.19444,.69444,0,0],10216:[.25,.75,0,0],10217:[.25,.75,0,0],10815:[0,.68611,0,0],10927:[.19667,.69667,0,0],10928:[.19667,.69667,0,0]},"Main-Italic":{33:[0,.69444,.12417,0],34:[0,.69444,.06961,0],35:[.19444,.69444,.06616,0],37:[.05556,.75,.13639,0],38:[0,.69444,.09694,0],39:[0,.69444,.12417,0],40:[.25,.75,.16194,0],41:[.25,.75,.03694,0],42:[0,.75,.14917,0],43:[.05667,.56167,.03694,0],44:[.19444,.10556,0,0],45:[0,.43056,.02826,0],46:[0,.10556,0,0],47:[.25,.75,.16194,0],48:[0,.64444,.13556,0],49:[0,.64444,.13556,0],50:[0,.64444,.13556,0],51:[0,.64444,.13556,0],52:[.19444,.64444,.13556,0],53:[0,.64444,.13556,0],54:[0,.64444,.13556,0],55:[.19444,.64444,.13556,0],56:[0,.64444,.13556,0],57:[0,.64444,.13556,0],58:[0,.43056,.0582,0],59:[.19444,.43056,.0582,0],61:[-.13313,.36687,.06616,0],63:[0,.69444,.1225,0],64:[0,.69444,.09597,0],65:[0,.68333,0,0],66:[0,.68333,.10257,0],67:[0,.68333,.14528,0],68:[0,.68333,.09403,0],69:[0,.68333,.12028,0],70:[0,.68333,.13305,0],71:[0,.68333,.08722,0],72:[0,.68333,.16389,0],73:[0,.68333,.15806,0],74:[0,.68333,.14028,0],75:[0,.68333,.14528,0],76:[0,.68333,0,0],77:[0,.68333,.16389,0],78:[0,.68333,.16389,0],79:[0,.68333,.09403,0],80:[0,.68333,.10257,0],81:[.19444,.68333,.09403,0],82:[0,.68333,.03868,0],83:[0,.68333,.11972,0],84:[0,.68333,.13305,0],85:[0,.68333,.16389,0],86:[0,.68333,.18361,0],87:[0,.68333,.18361,0],88:[0,.68333,.15806,0],89:[0,.68333,.19383,0],90:[0,.68333,.14528,0],91:[.25,.75,.1875,0],93:[.25,.75,.10528,0],94:[0,.69444,.06646,0],95:[.31,.12056,.09208,0],97:[0,.43056,.07671,0],98:[0,.69444,.06312,0],99:[0,.43056,.05653,0],100:[0,.69444,.10333,0],101:[0,.43056,.07514,0],102:[.19444,.69444,.21194,0],103:[.19444,.43056,.08847,0],104:[0,.69444,.07671,0],105:[0,.65536,.1019,0],106:[.19444,.65536,.14467,0],107:[0,.69444,.10764,0],108:[0,.69444,.10333,0],109:[0,.43056,.07671,0],110:[0,.43056,.07671,0],111:[0,.43056,.06312,0],112:[.19444,.43056,.06312,0],113:[.19444,.43056,.08847,0],114:[0,.43056,.10764,0],115:[0,.43056,.08208,0],116:[0,.61508,.09486,0],117:[0,.43056,.07671,0],118:[0,.43056,.10764,0],119:[0,.43056,.10764,0],120:[0,.43056,.12042,0],121:[.19444,.43056,.08847,0],122:[0,.43056,.12292,0],126:[.35,.31786,.11585,0],163:[0,.69444,0,0],305:[0,.43056,0,.02778],567:[.19444,.43056,0,.08334],768:[0,.69444,0,0],769:[0,.69444,.09694,0],770:[0,.69444,.06646,0],771:[0,.66786,.11585,0],772:[0,.56167,.10333,0],774:[0,.69444,.10806,0],775:[0,.66786,.11752,0],776:[0,.66786,.10474,0],778:[0,.69444,0,0],779:[0,.69444,.1225,0],780:[0,.62847,.08295,0],915:[0,.68333,.13305,0],916:[0,.68333,0,0],920:[0,.68333,.09403,0],923:[0,.68333,0,0],926:[0,.68333,.15294,0],928:[0,.68333,.16389,0],931:[0,.68333,.12028,0],933:[0,.68333,.11111,0],934:[0,.68333,.05986,0],936:[0,.68333,.11111,0],937:[0,.68333,.10257,0],8211:[0,.43056,.09208,0],8212:[0,.43056,.09208,0],8216:[0,.69444,.12417,0],8217:[0,.69444,.12417,0],8220:[0,.69444,.1685,0],8221:[0,.69444,.06961,0],8463:[0,.68889,0,0]},"Main-Regular":{32:[0,0,0,0],33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.08333,.58333,0,0],44:[.19444,.10556,0,0],45:[0,.43056,0,0],46:[0,.10556,0,0],47:[.25,.75,0,0],48:[0,.64444,0,0],49:[0,.64444,0,0],50:[0,.64444,0,0],51:[0,.64444,0,0],52:[0,.64444,0,0],53:[0,.64444,0,0],54:[0,.64444,0,0],55:[0,.64444,0,0],56:[0,.64444,0,0],57:[0,.64444,0,0],58:[0,.43056,0,0],59:[.19444,.43056,0,0],60:[.0391,.5391,0,0],61:[-.13313,.36687,0,0],62:[.0391,.5391,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.68333,0,0],66:[0,.68333,0,0],67:[0,.68333,0,0],68:[0,.68333,0,0],69:[0,.68333,0,0],70:[0,.68333,0,0],71:[0,.68333,0,0],72:[0,.68333,0,0],73:[0,.68333,0,0],74:[0,.68333,0,0],75:[0,.68333,0,0],76:[0,.68333,0,0],77:[0,.68333,0,0],78:[0,.68333,0,0],79:[0,.68333,0,0],80:[0,.68333,0,0],81:[.19444,.68333,0,0],82:[0,.68333,0,0],83:[0,.68333,0,0],84:[0,.68333,0,0],85:[0,.68333,0,0],86:[0,.68333,.01389,0],87:[0,.68333,.01389,0],88:[0,.68333,0,0],89:[0,.68333,.025,0],90:[0,.68333,0,0],91:[.25,.75,0,0],92:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.31,.12056,.02778,0],96:[0,.69444,0,0],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,0],100:[0,.69444,0,0],101:[0,.43056,0,0],102:[0,.69444,.07778,0],103:[.19444,.43056,.01389,0],104:[0,.69444,0,0],105:[0,.66786,0,0],106:[.19444,.66786,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,0],112:[.19444,.43056,0,0],113:[.19444,.43056,0,0],114:[0,.43056,0,0],115:[0,.43056,0,0],116:[0,.61508,0,0],117:[0,.43056,0,0],118:[0,.43056,.01389,0],119:[0,.43056,.01389,0],120:[0,.43056,0,0],121:[.19444,.43056,.01389,0],122:[0,.43056,0,0],123:[.25,.75,0,0],124:[.25,.75,0,0],125:[.25,.75,0,0],126:[.35,.31786,0,0],160:[0,0,0,0],168:[0,.66786,0,0],172:[0,.43056,0,0],175:[0,.56778,0,0],176:[0,.69444,0,0],177:[.08333,.58333,0,0],180:[0,.69444,0,0],215:[.08333,.58333,0,0],247:[.08333,.58333,0,0],305:[0,.43056,0,0],567:[.19444,.43056,0,0],710:[0,.69444,0,0],711:[0,.62847,0,0],713:[0,.56778,0,0],714:[0,.69444,0,0],715:[0,.69444,0,0],728:[0,.69444,0,0],729:[0,.66786,0,0],730:[0,.69444,0,0],732:[0,.66786,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.66786,0,0],772:[0,.56778,0,0],774:[0,.69444,0,0],775:[0,.66786,0,0],776:[0,.66786,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.62847,0,0],824:[.19444,.69444,0,0],915:[0,.68333,0,0],916:[0,.68333,0,0],920:[0,.68333,0,0],923:[0,.68333,0,0],926:[0,.68333,0,0],928:[0,.68333,0,0],931:[0,.68333,0,0],933:[0,.68333,0,0],934:[0,.68333,0,0],936:[0,.68333,0,0],937:[0,.68333,0,0],8211:[0,.43056,.02778,0],8212:[0,.43056,.02778,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0],8224:[.19444,.69444,0,0],8225:[.19444,.69444,0,0],8230:[0,.12,0,0],8242:[0,.55556,0,0],8407:[0,.71444,.15382,0],8463:[0,.68889,0,0],8465:[0,.69444,0,0],8467:[0,.69444,0,.11111],8472:[.19444,.43056,0,.11111],8476:[0,.69444,0,0],8501:[0,.69444,0,0],8592:[-.13313,.36687,0,0],8593:[.19444,.69444,0,0],8594:[-.13313,.36687,0,0],8595:[.19444,.69444,0,0],8596:[-.13313,.36687,0,0],8597:[.25,.75,0,0],8598:[.19444,.69444,0,0],8599:[.19444,.69444,0,0],8600:[.19444,.69444,0,0],8601:[.19444,.69444,0,0],8614:[.011,.511,0,0],8617:[.011,.511,0,0],8618:[.011,.511,0,0],8636:[-.13313,.36687,0,0],8637:[-.13313,.36687,0,0],8640:[-.13313,.36687,0,0],8641:[-.13313,.36687,0,0],8652:[.011,.671,0,0],8656:[-.13313,.36687,0,0],8657:[.19444,.69444,0,0],8658:[-.13313,.36687,0,0],8659:[.19444,.69444,0,0],8660:[-.13313,.36687,0,0],8661:[.25,.75,0,0],8704:[0,.69444,0,0],8706:[0,.69444,.05556,.08334],8707:[0,.69444,0,0],8709:[.05556,.75,0,0],8711:[0,.68333,0,0],8712:[.0391,.5391,0,0],8715:[.0391,.5391,0,0],8722:[.08333,.58333,0,0],8723:[.08333,.58333,0,0],8725:[.25,.75,0,0],8726:[.25,.75,0,0],8727:[-.03472,.46528,0,0],8728:[-.05555,.44445,0,0],8729:[-.05555,.44445,0,0],8730:[.2,.8,0,0],8733:[0,.43056,0,0],8734:[0,.43056,0,0],8736:[0,.69224,0,0],8739:[.25,.75,0,0],8741:[.25,.75,0,0],8743:[0,.55556,0,0],8744:[0,.55556,0,0],8745:[0,.55556,0,0],8746:[0,.55556,0,0],8747:[.19444,.69444,.11111,0],8764:[-.13313,.36687,0,0],8768:[.19444,.69444,0,0],8771:[-.03625,.46375,0,0],8773:[-.022,.589,0,0],8776:[-.01688,.48312,0,0],8781:[-.03625,.46375,0,0],8784:[-.133,.67,0,0],8800:[.215,.716,0,0],8801:[-.03625,.46375,0,0],8804:[.13597,.63597,0,0],8805:[.13597,.63597,0,0],8810:[.0391,.5391,0,0],8811:[.0391,.5391,0,0],8826:[.0391,.5391,0,0],8827:[.0391,.5391,0,0],8834:[.0391,.5391,0,0],8835:[.0391,.5391,0,0],8838:[.13597,.63597,0,0],8839:[.13597,.63597,0,0],8846:[0,.55556,0,0],8849:[.13597,.63597,0,0],8850:[.13597,.63597,0,0],8851:[0,.55556,0,0],8852:[0,.55556,0,0],8853:[.08333,.58333,0,0],8854:[.08333,.58333,0,0],8855:[.08333,.58333,0,0],8856:[.08333,.58333,0,0],8857:[.08333,.58333,0,0],8866:[0,.69444,0,0],8867:[0,.69444,0,0],8868:[0,.69444,0,0],8869:[0,.69444,0,0],8872:[.249,.75,0,0],8900:[-.05555,.44445,0,0],8901:[-.05555,.44445,0,0],8902:[-.03472,.46528,0,0],8904:[.005,.505,0,0],8942:[.03,.9,0,0],8943:[-.19,.31,0,0],8945:[-.1,.82,0,0],8968:[.25,.75,0,0],8969:[.25,.75,0,0],8970:[.25,.75,0,0],8971:[.25,.75,0,0],8994:[-.14236,.35764,0,0],8995:[-.14236,.35764,0,0],9136:[.244,.744,0,0],9137:[.244,.744,0,0],9651:[.19444,.69444,0,0],9657:[-.03472,.46528,0,0],9661:[.19444,.69444,0,0],9667:[-.03472,.46528,0,0],9711:[.19444,.69444,0,0],9824:[.12963,.69444,0,0],9825:[.12963,.69444,0,0],9826:[.12963,.69444,0,0],9827:[.12963,.69444,0,0],9837:[0,.75,0,0],9838:[.19444,.69444,0,0],9839:[.19444,.69444,0,0],10216:[.25,.75,0,0],10217:[.25,.75,0,0],10222:[.244,.744,0,0],10223:[.244,.744,0,0],10229:[.011,.511,0,0],10230:[.011,.511,0,0],10231:[.011,.511,0,0],10232:[.024,.525,0,0],10233:[.024,.525,0,0],10234:[.024,.525,0,0],10236:[.011,.511,0,0],10815:[0,.68333,0,0],10927:[.13597,.63597,0,0],10928:[.13597,.63597,0,0]},"Math-BoldItalic":{47:[.19444,.69444,0,0],65:[0,.68611,0,0],66:[0,.68611,.04835,0],67:[0,.68611,.06979,0],68:[0,.68611,.03194,0],69:[0,.68611,.05451,0],70:[0,.68611,.15972,0],71:[0,.68611,0,0],72:[0,.68611,.08229,0],73:[0,.68611,.07778,0],74:[0,.68611,.10069,0],75:[0,.68611,.06979,0],76:[0,.68611,0,0],77:[0,.68611,.11424,0],78:[0,.68611,.11424,0],79:[0,.68611,.03194,0],80:[0,.68611,.15972,0],81:[.19444,.68611,0,0],82:[0,.68611,.00421,0],83:[0,.68611,.05382,0],84:[0,.68611,.15972,0],85:[0,.68611,.11424,0],86:[0,.68611,.25555,0],87:[0,.68611,.15972,0],88:[0,.68611,.07778,0],89:[0,.68611,.25555,0],90:[0,.68611,.06979,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[.19444,.69444,.11042,0],103:[.19444,.44444,.03704,0],104:[0,.69444,0,0],105:[0,.69326,0,0],106:[.19444,.69326,.0622,0],107:[0,.69444,.01852,0],108:[0,.69444,.0088,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,.03704,0],114:[0,.44444,.03194,0],115:[0,.44444,0,0],116:[0,.63492,0,0],117:[0,.44444,0,0],118:[0,.44444,.03704,0],119:[0,.44444,.02778,0],120:[0,.44444,0,0],121:[.19444,.44444,.03704,0],122:[0,.44444,.04213,0],915:[0,.68611,.15972,0],916:[0,.68611,0,0],920:[0,.68611,.03194,0],923:[0,.68611,0,0],926:[0,.68611,.07458,0],928:[0,.68611,.08229,0],931:[0,.68611,.05451,0],933:[0,.68611,.15972,0],934:[0,.68611,0,0],936:[0,.68611,.11653,0],937:[0,.68611,.04835,0],945:[0,.44444,0,0],946:[.19444,.69444,.03403,0],947:[.19444,.44444,.06389,0],948:[0,.69444,.03819,0],949:[0,.44444,0,0],950:[.19444,.69444,.06215,0],951:[.19444,.44444,.03704,0],952:[0,.69444,.03194,0],953:[0,.44444,0,0],954:[0,.44444,0,0],955:[0,.69444,0,0],956:[.19444,.44444,0,0],957:[0,.44444,.06898,0],958:[.19444,.69444,.03021,0],959:[0,.44444,0,0],960:[0,.44444,.03704,0],961:[.19444,.44444,0,0],962:[.09722,.44444,.07917,0],963:[0,.44444,.03704,0],964:[0,.44444,.13472,0],965:[0,.44444,.03704,0],966:[.19444,.44444,0,0],967:[.19444,.44444,0,0],968:[.19444,.69444,.03704,0],969:[0,.44444,.03704,0],977:[0,.69444,0,0],981:[.19444,.69444,0,0],982:[0,.44444,.03194,0],1009:[.19444,.44444,0,0],1013:[0,.44444,0,0]},"Math-Italic":{47:[.19444,.69444,0,0],65:[0,.68333,0,.13889],66:[0,.68333,.05017,.08334],67:[0,.68333,.07153,.08334],68:[0,.68333,.02778,.05556],69:[0,.68333,.05764,.08334],70:[0,.68333,.13889,.08334],71:[0,.68333,0,.08334],72:[0,.68333,.08125,.05556],73:[0,.68333,.07847,.11111],74:[0,.68333,.09618,.16667],75:[0,.68333,.07153,.05556],76:[0,.68333,0,.02778],77:[0,.68333,.10903,.08334],78:[0,.68333,.10903,.08334],79:[0,.68333,.02778,.08334],80:[0,.68333,.13889,.08334],81:[.19444,.68333,0,.08334],82:[0,.68333,.00773,.08334],83:[0,.68333,.05764,.08334],84:[0,.68333,.13889,.08334],85:[0,.68333,.10903,.02778],86:[0,.68333,.22222,0],87:[0,.68333,.13889,0],88:[0,.68333,.07847,.08334],89:[0,.68333,.22222,0],90:[0,.68333,.07153,.08334],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,.05556],100:[0,.69444,0,.16667],101:[0,.43056,0,.05556],102:[.19444,.69444,.10764,.16667],103:[.19444,.43056,.03588,.02778],104:[0,.69444,0,0],105:[0,.65952,0,0],106:[.19444,.65952,.05724,0],107:[0,.69444,.03148,0],108:[0,.69444,.01968,.08334],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,.05556],112:[.19444,.43056,0,.08334],113:[.19444,.43056,.03588,.08334],114:[0,.43056,.02778,.05556],115:[0,.43056,0,.05556],116:[0,.61508,0,.08334],117:[0,.43056,0,.02778],118:[0,.43056,.03588,.02778],119:[0,.43056,.02691,.08334],120:[0,.43056,0,.02778],121:[.19444,.43056,.03588,.05556],122:[0,.43056,.04398,.05556],915:[0,.68333,.13889,.08334],916:[0,.68333,0,.16667],920:[0,.68333,.02778,.08334],923:[0,.68333,0,.16667],926:[0,.68333,.07569,.08334],928:[0,.68333,.08125,.05556],931:[0,.68333,.05764,.08334],933:[0,.68333,.13889,.05556],934:[0,.68333,0,.08334],936:[0,.68333,.11,.05556],937:[0,.68333,.05017,.08334],945:[0,.43056,.0037,.02778],946:[.19444,.69444,.05278,.08334],947:[.19444,.43056,.05556,0],948:[0,.69444,.03785,.05556],949:[0,.43056,0,.08334],950:[.19444,.69444,.07378,.08334],951:[.19444,.43056,.03588,.05556],952:[0,.69444,.02778,.08334],953:[0,.43056,0,.05556],954:[0,.43056,0,0],955:[0,.69444,0,0],956:[.19444,.43056,0,.02778],957:[0,.43056,.06366,.02778],958:[.19444,.69444,.04601,.11111],959:[0,.43056,0,.05556],960:[0,.43056,.03588,0],961:[.19444,.43056,0,.08334],962:[.09722,.43056,.07986,.08334],963:[0,.43056,.03588,0],964:[0,.43056,.1132,.02778],965:[0,.43056,.03588,.02778],966:[.19444,.43056,0,.08334],967:[.19444,.43056,0,.05556],968:[.19444,.69444,.03588,.11111],969:[0,.43056,.03588,0],977:[0,.69444,0,.08334],981:[.19444,.69444,0,.08334],982:[0,.43056,.02778,0],1009:[.19444,.43056,0,.08334],1013:[0,.43056,0,.05556]},"Math-Regular":{65:[0,.68333,0,.13889],66:[0,.68333,.05017,.08334],67:[0,.68333,.07153,.08334],68:[0,.68333,.02778,.05556],69:[0,.68333,.05764,.08334],70:[0,.68333,.13889,.08334],71:[0,.68333,0,.08334],72:[0,.68333,.08125,.05556],73:[0,.68333,.07847,.11111],74:[0,.68333,.09618,.16667],75:[0,.68333,.07153,.05556],76:[0,.68333,0,.02778],77:[0,.68333,.10903,.08334],78:[0,.68333,.10903,.08334],79:[0,.68333,.02778,.08334],80:[0,.68333,.13889,.08334],81:[.19444,.68333,0,.08334],82:[0,.68333,.00773,.08334],83:[0,.68333,.05764,.08334],84:[0,.68333,.13889,.08334],85:[0,.68333,.10903,.02778],86:[0,.68333,.22222,0],87:[0,.68333,.13889,0],88:[0,.68333,.07847,.08334],89:[0,.68333,.22222,0],90:[0,.68333,.07153,.08334],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,.05556],100:[0,.69444,0,.16667],101:[0,.43056,0,.05556],102:[.19444,.69444,.10764,.16667],103:[.19444,.43056,.03588,.02778],104:[0,.69444,0,0],105:[0,.65952,0,0],106:[.19444,.65952,.05724,0],107:[0,.69444,.03148,0],108:[0,.69444,.01968,.08334],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,.05556],112:[.19444,.43056,0,.08334],113:[.19444,.43056,.03588,.08334],114:[0,.43056,.02778,.05556],115:[0,.43056,0,.05556],116:[0,.61508,0,.08334],117:[0,.43056,0,.02778],118:[0,.43056,.03588,.02778],119:[0,.43056,.02691,.08334],120:[0,.43056,0,.02778],121:[.19444,.43056,.03588,.05556],122:[0,.43056,.04398,.05556],915:[0,.68333,.13889,.08334],916:[0,.68333,0,.16667],920:[0,.68333,.02778,.08334],923:[0,.68333,0,.16667],926:[0,.68333,.07569,.08334],928:[0,.68333,.08125,.05556],931:[0,.68333,.05764,.08334],933:[0,.68333,.13889,.05556],934:[0,.68333,0,.08334],936:[0,.68333,.11,.05556],937:[0,.68333,.05017,.08334],945:[0,.43056,.0037,.02778],946:[.19444,.69444,.05278,.08334],947:[.19444,.43056,.05556,0],948:[0,.69444,.03785,.05556],949:[0,.43056,0,.08334],950:[.19444,.69444,.07378,.08334],951:[.19444,.43056,.03588,.05556],952:[0,.69444,.02778,.08334],953:[0,.43056,0,.05556],954:[0,.43056,0,0],955:[0,.69444,0,0],956:[.19444,.43056,0,.02778],957:[0,.43056,.06366,.02778],958:[.19444,.69444,.04601,.11111],959:[0,.43056,0,.05556],960:[0,.43056,.03588,0],961:[.19444,.43056,0,.08334],962:[.09722,.43056,.07986,.08334],963:[0,.43056,.03588,0],964:[0,.43056,.1132,.02778],965:[0,.43056,.03588,.02778],966:[.19444,.43056,0,.08334],967:[.19444,.43056,0,.05556],968:[.19444,.69444,.03588,.11111],969:[0,.43056,.03588,0],977:[0,.69444,0,.08334],981:[.19444,.69444,0,.08334],982:[0,.43056,.02778,0],1009:[.19444,.43056,0,.08334],1013:[0,.43056,0,.05556]},"SansSerif-Regular":{33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.08333,.58333,0,0],44:[.125,.08333,0,0],45:[0,.44444,0,0],46:[0,.08333,0,0],47:[.25,.75,0,0],48:[0,.65556,0,0],49:[0,.65556,0,0],50:[0,.65556,0,0],51:[0,.65556,0,0],52:[0,.65556,0,0],53:[0,.65556,0,0],54:[0,.65556,0,0],55:[0,.65556,0,0],56:[0,.65556,0,0],57:[0,.65556,0,0],58:[0,.44444,0,0],59:[.125,.44444,0,0],61:[-.13,.37,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.69444,0,0],66:[0,.69444,0,0],67:[0,.69444,0,0],68:[0,.69444,0,0],69:[0,.69444,0,0],70:[0,.69444,0,0],71:[0,.69444,0,0],72:[0,.69444,0,0],73:[0,.69444,0,0],74:[0,.69444,0,0],75:[0,.69444,0,0],76:[0,.69444,0,0],77:[0,.69444,0,0],78:[0,.69444,0,0],79:[0,.69444,0,0],80:[0,.69444,0,0],81:[.125,.69444,0,0],82:[0,.69444,0,0],83:[0,.69444,0,0],84:[0,.69444,0,0],85:[0,.69444,0,0],86:[0,.69444,.01389,0],87:[0,.69444,.01389,0],88:[0,.69444,0,0],89:[0,.69444,.025,0],90:[0,.69444,0,0],91:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.35,.09444,.02778,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[0,.69444,.06944,0],103:[.19444,.44444,.01389,0],104:[0,.69444,0,0],105:[0,.67937,0,0],106:[.19444,.67937,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,0,0],114:[0,.44444,.01389,0],115:[0,.44444,0,0],116:[0,.57143,0,0],117:[0,.44444,0,0],118:[0,.44444,.01389,0],119:[0,.44444,.01389,0],120:[0,.44444,0,0],121:[.19444,.44444,.01389,0],122:[0,.44444,0,0],126:[.35,.32659,0,0],305:[0,.44444,0,0],567:[.19444,.44444,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.67659,0,0],772:[0,.60889,0,0],774:[0,.69444,0,0],775:[0,.67937,0,0],776:[0,.67937,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.63194,0,0],915:[0,.69444,0,0],916:[0,.69444,0,0],920:[0,.69444,0,0],923:[0,.69444,0,0],926:[0,.69444,0,0],928:[0,.69444,0,0],931:[0,.69444,0,0],933:[0,.69444,0,0],934:[0,.69444,0,0],936:[0,.69444,0,0],937:[0,.69444,0,0],8211:[0,.44444,.02778,0],8212:[0,.44444,.02778,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0]},"Script-Regular":{65:[0,.7,.22925,0],66:[0,.7,.04087,0],67:[0,.7,.1689,0],68:[0,.7,.09371,0],69:[0,.7,.18583,0],70:[0,.7,.13634,0],71:[0,.7,.17322,0],72:[0,.7,.29694,0],73:[0,.7,.19189,0],74:[.27778,.7,.19189,0],75:[0,.7,.31259,0],76:[0,.7,.19189,0],77:[0,.7,.15981,0],78:[0,.7,.3525,0],79:[0,.7,.08078,0],80:[0,.7,.08078,0],81:[0,.7,.03305,0],82:[0,.7,.06259,0],83:[0,.7,.19189,0],84:[0,.7,.29087,0],85:[0,.7,.25815,0],86:[0,.7,.27523,0],87:[0,.7,.27523,0],88:[0,.7,.26006,0],89:[0,.7,.2939,0],90:[0,.7,.24037,0]},"Size1-Regular":{40:[.35001,.85,0,0],41:[.35001,.85,0,0],47:[.35001,.85,0,0],91:[.35001,.85,0,0],92:[.35001,.85,0,0],93:[.35001,.85,0,0],123:[.35001,.85,0,0],125:[.35001,.85,0,0],710:[0,.72222,0,0],732:[0,.72222,0,0],770:[0,.72222,0,0],771:[0,.72222,0,0],8214:[-99e-5,.601,0,0],8593:[1e-5,.6,0,0],8595:[1e-5,.6,0,0],8657:[1e-5,.6,0,0],8659:[1e-5,.6,0,0],8719:[.25001,.75,0,0],8720:[.25001,.75,0,0],8721:[.25001,.75,0,0],8730:[.35001,.85,0,0],8739:[-.00599,.606,0,0],8741:[-.00599,.606,0,0],8747:[.30612,.805,.19445,0],8748:[.306,.805,.19445,0],8749:[.306,.805,.19445,0],8750:[.30612,.805,.19445,0],8896:[.25001,.75,0,0],8897:[.25001,.75,0,0],8898:[.25001,.75,0,0],8899:[.25001,.75,0,0],8968:[.35001,.85,0,0],8969:[.35001,.85,0,0],8970:[.35001,.85,0,0],8971:[.35001,.85,0,0],9168:[-99e-5,.601,0,0],10216:[.35001,.85,0,0],10217:[.35001,.85,0,0],10752:[.25001,.75,0,0],10753:[.25001,.75,0,0],10754:[.25001,.75,0,0],10756:[.25001,.75,0,0],10758:[.25001,.75,0,0]},"Size2-Regular":{40:[.65002,1.15,0,0],41:[.65002,1.15,0,0],47:[.65002,1.15,0,0],91:[.65002,1.15,0,0],92:[.65002,1.15,0,0],93:[.65002,1.15,0,0],123:[.65002,1.15,0,0],125:[.65002,1.15,0,0],710:[0,.75,0,0],732:[0,.75,0,0],770:[0,.75,0,0],771:[0,.75,0,0],8719:[.55001,1.05,0,0],8720:[.55001,1.05,0,0],8721:[.55001,1.05,0,0],8730:[.65002,1.15,0,0],8747:[.86225,1.36,.44445,0],8748:[.862,1.36,.44445,0],8749:[.862,1.36,.44445,0],8750:[.86225,1.36,.44445,0],8896:[.55001,1.05,0,0],8897:[.55001,1.05,0,0],8898:[.55001,1.05,0,0],8899:[.55001,1.05,0,0],8968:[.65002,1.15,0,0],8969:[.65002,1.15,0,0],8970:[.65002,1.15,0,0],8971:[.65002,1.15,0,0],10216:[.65002,1.15,0,0],10217:[.65002,1.15,0,0],10752:[.55001,1.05,0,0],10753:[.55001,1.05,0,0],10754:[.55001,1.05,0,0],
-10756:[.55001,1.05,0,0],10758:[.55001,1.05,0,0]},"Size3-Regular":{40:[.95003,1.45,0,0],41:[.95003,1.45,0,0],47:[.95003,1.45,0,0],91:[.95003,1.45,0,0],92:[.95003,1.45,0,0],93:[.95003,1.45,0,0],123:[.95003,1.45,0,0],125:[.95003,1.45,0,0],710:[0,.75,0,0],732:[0,.75,0,0],770:[0,.75,0,0],771:[0,.75,0,0],8730:[.95003,1.45,0,0],8968:[.95003,1.45,0,0],8969:[.95003,1.45,0,0],8970:[.95003,1.45,0,0],8971:[.95003,1.45,0,0],10216:[.95003,1.45,0,0],10217:[.95003,1.45,0,0]},"Size4-Regular":{40:[1.25003,1.75,0,0],41:[1.25003,1.75,0,0],47:[1.25003,1.75,0,0],91:[1.25003,1.75,0,0],92:[1.25003,1.75,0,0],93:[1.25003,1.75,0,0],123:[1.25003,1.75,0,0],125:[1.25003,1.75,0,0],710:[0,.825,0,0],732:[0,.825,0,0],770:[0,.825,0,0],771:[0,.825,0,0],8730:[1.25003,1.75,0,0],8968:[1.25003,1.75,0,0],8969:[1.25003,1.75,0,0],8970:[1.25003,1.75,0,0],8971:[1.25003,1.75,0,0],9115:[.64502,1.155,0,0],9116:[1e-5,.6,0,0],9117:[.64502,1.155,0,0],9118:[.64502,1.155,0,0],9119:[1e-5,.6,0,0],9120:[.64502,1.155,0,0],9121:[.64502,1.155,0,0],9122:[-99e-5,.601,0,0],9123:[.64502,1.155,0,0],9124:[.64502,1.155,0,0],9125:[-99e-5,.601,0,0],9126:[.64502,1.155,0,0],9127:[1e-5,.9,0,0],9128:[.65002,1.15,0,0],9129:[.90001,0,0,0],9130:[0,.3,0,0],9131:[1e-5,.9,0,0],9132:[.65002,1.15,0,0],9133:[.90001,0,0,0],9143:[.88502,.915,0,0],10216:[1.25003,1.75,0,0],10217:[1.25003,1.75,0,0],57344:[-.00499,.605,0,0],57345:[-.00499,.605,0,0],57680:[0,.12,0,0],57681:[0,.12,0,0],57682:[0,.12,0,0],57683:[0,.12,0,0]},"Typewriter-Regular":{33:[0,.61111,0,0],34:[0,.61111,0,0],35:[0,.61111,0,0],36:[.08333,.69444,0,0],37:[.08333,.69444,0,0],38:[0,.61111,0,0],39:[0,.61111,0,0],40:[.08333,.69444,0,0],41:[.08333,.69444,0,0],42:[0,.52083,0,0],43:[-.08056,.53055,0,0],44:[.13889,.125,0,0],45:[-.08056,.53055,0,0],46:[0,.125,0,0],47:[.08333,.69444,0,0],48:[0,.61111,0,0],49:[0,.61111,0,0],50:[0,.61111,0,0],51:[0,.61111,0,0],52:[0,.61111,0,0],53:[0,.61111,0,0],54:[0,.61111,0,0],55:[0,.61111,0,0],56:[0,.61111,0,0],57:[0,.61111,0,0],58:[0,.43056,0,0],59:[.13889,.43056,0,0],60:[-.05556,.55556,0,0],61:[-.19549,.41562,0,0],62:[-.05556,.55556,0,0],63:[0,.61111,0,0],64:[0,.61111,0,0],65:[0,.61111,0,0],66:[0,.61111,0,0],67:[0,.61111,0,0],68:[0,.61111,0,0],69:[0,.61111,0,0],70:[0,.61111,0,0],71:[0,.61111,0,0],72:[0,.61111,0,0],73:[0,.61111,0,0],74:[0,.61111,0,0],75:[0,.61111,0,0],76:[0,.61111,0,0],77:[0,.61111,0,0],78:[0,.61111,0,0],79:[0,.61111,0,0],80:[0,.61111,0,0],81:[.13889,.61111,0,0],82:[0,.61111,0,0],83:[0,.61111,0,0],84:[0,.61111,0,0],85:[0,.61111,0,0],86:[0,.61111,0,0],87:[0,.61111,0,0],88:[0,.61111,0,0],89:[0,.61111,0,0],90:[0,.61111,0,0],91:[.08333,.69444,0,0],92:[.08333,.69444,0,0],93:[.08333,.69444,0,0],94:[0,.61111,0,0],95:[.09514,0,0,0],96:[0,.61111,0,0],97:[0,.43056,0,0],98:[0,.61111,0,0],99:[0,.43056,0,0],100:[0,.61111,0,0],101:[0,.43056,0,0],102:[0,.61111,0,0],103:[.22222,.43056,0,0],104:[0,.61111,0,0],105:[0,.61111,0,0],106:[.22222,.61111,0,0],107:[0,.61111,0,0],108:[0,.61111,0,0],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,0],112:[.22222,.43056,0,0],113:[.22222,.43056,0,0],114:[0,.43056,0,0],115:[0,.43056,0,0],116:[0,.55358,0,0],117:[0,.43056,0,0],118:[0,.43056,0,0],119:[0,.43056,0,0],120:[0,.43056,0,0],121:[.22222,.43056,0,0],122:[0,.43056,0,0],123:[.08333,.69444,0,0],124:[.08333,.69444,0,0],125:[.08333,.69444,0,0],126:[0,.61111,0,0],127:[0,.61111,0,0],305:[0,.43056,0,0],567:[.22222,.43056,0,0],768:[0,.61111,0,0],769:[0,.61111,0,0],770:[0,.61111,0,0],771:[0,.61111,0,0],772:[0,.56555,0,0],774:[0,.61111,0,0],776:[0,.61111,0,0],778:[0,.61111,0,0],780:[0,.56597,0,0],915:[0,.61111,0,0],916:[0,.61111,0,0],920:[0,.61111,0,0],923:[0,.61111,0,0],926:[0,.61111,0,0],928:[0,.61111,0,0],931:[0,.61111,0,0],933:[0,.61111,0,0],934:[0,.61111,0,0],936:[0,.61111,0,0],937:[0,.61111,0,0],2018:[0,.61111,0,0],2019:[0,.61111,0,0],8242:[0,.61111,0,0]}}},{}],19:[function(e,t,r){var a=e("./utils");var i=e("./ParseError");var n=e("./parseData");var s=n.ParseNode;function l(e,r,a){if(typeof e==="string"){e=[e]}if(typeof r==="number"){r={numArgs:r}}var i={numArgs:r.numArgs,argTypes:r.argTypes,greediness:r.greediness===undefined?1:r.greediness,allowedInText:!!r.allowedInText,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,handler:a};for(var n=0;n<e.length;++n){t.exports[e[n]]=i}}var o=function(e){if(e.type==="ordgroup"){return e.value}else{return[e]}};l("\\sqrt",{numArgs:1,numOptionalArgs:1},function(e,t){var r=t[0];var a=t[1];return{type:"sqrt",body:a,index:r}});var u={"\\text":undefined,"\\textrm":"mathrm","\\textsf":"mathsf","\\texttt":"mathtt","\\textnormal":"mathrm","\\textbf":"mathbf","\\textit":"textit"};l(["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textit"],{numArgs:1,argTypes:["text"],greediness:2,allowedInText:true},function(e,t){var r=t[0];return{type:"text",body:o(r),style:u[e.funcName]}});l("\\color",{numArgs:2,allowedInText:true,greediness:3,argTypes:["color","original"]},function(e,t){var r=t[0];var a=t[1];return{type:"color",color:r.value,value:o(a)}});l("\\overline",{numArgs:1},function(e,t){var r=t[0];return{type:"overline",body:r}});l("\\underline",{numArgs:1},function(e,t){var r=t[0];return{type:"underline",body:r}});l("\\rule",{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},function(e,t){var r=t[0];var a=t[1];var i=t[2];return{type:"rule",shift:r&&r.value,width:a.value,height:i.value}});l(["\\kern","\\mkern"],{numArgs:1,argTypes:["size"]},function(e,t){return{type:"kern",dimension:t[0].value}});l("\\KaTeX",{numArgs:0},function(e){return{type:"katex"}});l("\\phantom",{numArgs:1},function(e,t){var r=t[0];return{type:"phantom",value:o(r)}});l(["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],{numArgs:1},function(e,t){var r=t[0];return{type:"mclass",mclass:"m"+e.funcName.substr(5),value:o(r)}});l("\\stackrel",{numArgs:2},function(e,t){var r=t[0];var a=t[1];var i=new s("op",{type:"op",limits:true,alwaysHandleSupSub:true,symbol:false,value:o(a)},a.mode);var n=new s("supsub",{base:i,sup:r,sub:null},r.mode);return{type:"mclass",mclass:"mrel",value:[n]}});l("\\bmod",{numArgs:0},function(e,t){return{type:"mod",modType:"bmod",value:null}});l(["\\pod","\\pmod","\\mod"],{numArgs:1},function(e,t){var r=t[0];return{type:"mod",modType:e.funcName.substr(1),value:o(r)}});var p={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}};var h=["(",")","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\\lceil","\\rceil","<",">","\\langle","\\rangle","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\\lmoustache","\\rmoustache","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];var c={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak"};l(["\\blue","\\orange","\\pink","\\red","\\green","\\gray","\\purple","\\blueA","\\blueB","\\blueC","\\blueD","\\blueE","\\tealA","\\tealB","\\tealC","\\tealD","\\tealE","\\greenA","\\greenB","\\greenC","\\greenD","\\greenE","\\goldA","\\goldB","\\goldC","\\goldD","\\goldE","\\redA","\\redB","\\redC","\\redD","\\redE","\\maroonA","\\maroonB","\\maroonC","\\maroonD","\\maroonE","\\purpleA","\\purpleB","\\purpleC","\\purpleD","\\purpleE","\\mintA","\\mintB","\\mintC","\\grayA","\\grayB","\\grayC","\\grayD","\\grayE","\\grayF","\\grayG","\\grayH","\\grayI","\\kaBlue","\\kaGreen"],{numArgs:1,allowedInText:true,greediness:3},function(e,t){var r=t[0];return{type:"color",color:"katex-"+e.funcName.slice(1),value:o(r)}});l(["\\arcsin","\\arccos","\\arctan","\\arg","\\cos","\\cosh","\\cot","\\coth","\\csc","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\tan","\\tanh"],{numArgs:0},function(e){return{type:"op",limits:false,symbol:false,body:e.funcName}});l(["\\det","\\gcd","\\inf","\\lim","\\liminf","\\limsup","\\max","\\min","\\Pr","\\sup"],{numArgs:0},function(e){return{type:"op",limits:true,symbol:false,body:e.funcName}});l(["\\int","\\iint","\\iiint","\\oint"],{numArgs:0},function(e){return{type:"op",limits:false,symbol:true,body:e.funcName}});l(["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint"],{numArgs:0},function(e){return{type:"op",limits:true,symbol:true,body:e.funcName}});l("\\mathop",{numArgs:1},function(e,t){var r=t[0];return{type:"op",limits:false,symbol:false,value:o(r)}});l(["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac"],{numArgs:2,greediness:2},function(e,t){var r=t[0];var a=t[1];var i;var n=null;var s=null;var l="auto";switch(e.funcName){case"\\dfrac":case"\\frac":case"\\tfrac":i=true;break;case"\\\\atopfrac":i=false;break;case"\\dbinom":case"\\binom":case"\\tbinom":i=false;n="(";s=")";break;default:throw new Error("Unrecognized genfrac command")}switch(e.funcName){case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text";break}return{type:"genfrac",numer:r,denom:a,hasBarLine:i,leftDelim:n,rightDelim:s,size:l}});l(["\\llap","\\rlap"],{numArgs:1,allowedInText:true},function(e,t){var r=t[0];return{type:e.funcName.slice(1),body:r}});var m=function(e,t){if(a.contains(h,e.value)){return e}else{throw new i("Invalid delimiter: '"+e.value+"' after '"+t.funcName+"'",e)}};l(["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],{numArgs:1},function(e,t){var r=m(t[0],e);return{type:"delimsizing",size:p[e.funcName].size,mclass:p[e.funcName].mclass,value:r.value}});l(["\\left","\\right"],{numArgs:1},function(e,t){var r=m(t[0],e);return{type:"leftright",value:r.value}});l("\\middle",{numArgs:1},function(e,t){var r=m(t[0],e);if(!e.parser.leftrightDepth){throw new i("\\middle without preceding \\left",r)}return{type:"middle",value:r.value}});l(["\\tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],0,null);l(["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],0,null);l(["\\mathrm","\\mathit","\\mathbf","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],{numArgs:1,greediness:2},function(e,t){var r=t[0];var a=e.funcName;if(a in c){a=c[a]}return{type:"font",font:a.slice(1),body:r}});l(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot"],{numArgs:1},function(e,t){var r=t[0];return{type:"accent",accent:e.funcName,base:r}});l(["\\over","\\choose","\\atop"],{numArgs:0,infix:true},function(e){var t;switch(e.funcName){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",replaceWith:t,token:e.token}});l(["\\\\","\\cr"],{numArgs:0,numOptionalArgs:1,argTypes:["size"]},function(e,t){var r=t[0];return{type:"cr",size:r}});l(["\\begin","\\end"],{numArgs:1,argTypes:["text"]},function(e,t){var r=t[0];if(r.type!=="ordgroup"){throw new i("Invalid environment name",r)}var a="";for(var n=0;n<r.value.length;++n){a+=r.value[n].value}return{type:"environment",name:a,nameGroup:r}})},{"./ParseError":6,"./parseData":21,"./utils":25}],20:[function(e,t,r){var a=e("./utils");function i(e,t){this.type=e;this.attributes={};this.children=t||[]}i.prototype.setAttribute=function(e,t){this.attributes[e]=t};i.prototype.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes){if(Object.prototype.hasOwnProperty.call(this.attributes,t)){e.setAttribute(t,this.attributes[t])}}for(var r=0;r<this.children.length;r++){e.appendChild(this.children[r].toNode())}return e};i.prototype.toMarkup=function(){var e="<"+this.type;for(var t in this.attributes){if(Object.prototype.hasOwnProperty.call(this.attributes,t)){e+=" "+t+'="';e+=a.escape(this.attributes[t]);e+='"'}}e+=">";for(var r=0;r<this.children.length;r++){e+=this.children[r].toMarkup()}e+="</"+this.type+">";return e};function n(e){this.text=e}n.prototype.toNode=function(){return document.createTextNode(this.text)};n.prototype.toMarkup=function(){return a.escape(this.text)};t.exports={MathNode:i,TextNode:n}},{"./utils":25}],21:[function(e,t,r){function a(e,t,r,a,i){this.type=e;this.value=t;this.mode=r;if(a&&(!i||i.lexer===a.lexer)){this.lexer=a.lexer;this.start=a.start;this.end=(i||a).end}}t.exports={ParseNode:a}},{}],22:[function(e,t,r){var a=e("./Parser");var i=function(e,t){if(!(typeof e==="string"||e instanceof String)){throw new TypeError("KaTeX can only parse string typed expression")}var r=new a(e,t);return r.parse()};t.exports=i},{"./Parser":7}],23:[function(e,t,r){t.exports={math:{},text:{}};function a(e,r,a,i,n){t.exports[e][n]={font:r,group:a,replace:i}}var i="math";var n="text";var s="main";var l="ams";var o="accent";var u="bin";var p="close";var h="inner";var c="mathord";var m="op";var f="open";var v="punct";var d="rel";var g="spacing";var y="textord";a(i,s,d,"\u2261","\\equiv");a(i,s,d,"\u227a","\\prec");a(i,s,d,"\u227b","\\succ");a(i,s,d,"\u223c","\\sim");a(i,s,d,"\u22a5","\\perp");a(i,s,d,"\u2aaf","\\preceq");a(i,s,d,"\u2ab0","\\succeq");a(i,s,d,"\u2243","\\simeq");a(i,s,d,"\u2223","\\mid");a(i,s,d,"\u226a","\\ll");a(i,s,d,"\u226b","\\gg");a(i,s,d,"\u224d","\\asymp");a(i,s,d,"\u2225","\\parallel");a(i,s,d,"\u22c8","\\bowtie");a(i,s,d,"\u2323","\\smile");a(i,s,d,"\u2291","\\sqsubseteq");a(i,s,d,"\u2292","\\sqsupseteq");a(i,s,d,"\u2250","\\doteq");a(i,s,d,"\u2322","\\frown");a(i,s,d,"\u220b","\\ni");a(i,s,d,"\u221d","\\propto");a(i,s,d,"\u22a2","\\vdash");a(i,s,d,"\u22a3","\\dashv");a(i,s,d,"\u220b","\\owns");a(i,s,v,".","\\ldotp");a(i,s,v,"\u22c5","\\cdotp");a(i,s,y,"#","\\#");a(n,s,y,"#","\\#");a(i,s,y,"&","\\&");a(n,s,y,"&","\\&");a(i,s,y,"\u2135","\\aleph");a(i,s,y,"\u2200","\\forall");a(i,s,y,"\u210f","\\hbar");a(i,s,y,"\u2203","\\exists");a(i,s,y,"\u2207","\\nabla");a(i,s,y,"\u266d","\\flat");a(i,s,y,"\u2113","\\ell");a(i,s,y,"\u266e","\\natural");a(i,s,y,"\u2663","\\clubsuit");a(i,s,y,"\u2118","\\wp");a(i,s,y,"\u266f","\\sharp");a(i,s,y,"\u2662","\\diamondsuit");a(i,s,y,"\u211c","\\Re");a(i,s,y,"\u2661","\\heartsuit");a(i,s,y,"\u2111","\\Im");a(i,s,y,"\u2660","\\spadesuit");a(i,s,y,"\u2020","\\dag");a(i,s,y,"\u2021","\\ddag");a(i,s,p,"\u23b1","\\rmoustache");a(i,s,f,"\u23b0","\\lmoustache");a(i,s,p,"\u27ef","\\rgroup");a(i,s,f,"\u27ee","\\lgroup");a(i,s,u,"\u2213","\\mp");a(i,s,u,"\u2296","\\ominus");a(i,s,u,"\u228e","\\uplus");a(i,s,u,"\u2293","\\sqcap");a(i,s,u,"\u2217","\\ast");a(i,s,u,"\u2294","\\sqcup");a(i,s,u,"\u25ef","\\bigcirc");a(i,s,u,"\u2219","\\bullet");a(i,s,u,"\u2021","\\ddagger");a(i,s,u,"\u2240","\\wr");a(i,s,u,"\u2a3f","\\amalg");a(i,s,d,"\u27f5","\\longleftarrow");a(i,s,d,"\u21d0","\\Leftarrow");a(i,s,d,"\u27f8","\\Longleftarrow");a(i,s,d,"\u27f6","\\longrightarrow");a(i,s,d,"\u21d2","\\Rightarrow");a(i,s,d,"\u27f9","\\Longrightarrow");a(i,s,d,"\u2194","\\leftrightarrow");a(i,s,d,"\u27f7","\\longleftrightarrow");a(i,s,d,"\u21d4","\\Leftrightarrow");a(i,s,d,"\u27fa","\\Longleftrightarrow");a(i,s,d,"\u21a6","\\mapsto");a(i,s,d,"\u27fc","\\longmapsto");a(i,s,d,"\u2197","\\nearrow");a(i,s,d,"\u21a9","\\hookleftarrow");a(i,s,d,"\u21aa","\\hookrightarrow");a(i,s,d,"\u2198","\\searrow");a(i,s,d,"\u21bc","\\leftharpoonup");a(i,s,d,"\u21c0","\\rightharpoonup");a(i,s,d,"\u2199","\\swarrow");a(i,s,d,"\u21bd","\\leftharpoondown");a(i,s,d,"\u21c1","\\rightharpoondown");a(i,s,d,"\u2196","\\nwarrow");a(i,s,d,"\u21cc","\\rightleftharpoons");a(i,l,d,"\u226e","\\nless");a(i,l,d,"\ue010","\\nleqslant");a(i,l,d,"\ue011","\\nleqq");a(i,l,d,"\u2a87","\\lneq");a(i,l,d,"\u2268","\\lneqq");a(i,l,d,"\ue00c","\\lvertneqq");a(i,l,d,"\u22e6","\\lnsim");a(i,l,d,"\u2a89","\\lnapprox");a(i,l,d,"\u2280","\\nprec");a(i,l,d,"\u22e0","\\npreceq");a(i,l,d,"\u22e8","\\precnsim");a(i,l,d,"\u2ab9","\\precnapprox");a(i,l,d,"\u2241","\\nsim");a(i,l,d,"\ue006","\\nshortmid");a(i,l,d,"\u2224","\\nmid");a(i,l,d,"\u22ac","\\nvdash");a(i,l,d,"\u22ad","\\nvDash");a(i,l,d,"\u22ea","\\ntriangleleft");a(i,l,d,"\u22ec","\\ntrianglelefteq");a(i,l,d,"\u228a","\\subsetneq");a(i,l,d,"\ue01a","\\varsubsetneq");a(i,l,d,"\u2acb","\\subsetneqq");a(i,l,d,"\ue017","\\varsubsetneqq");a(i,l,d,"\u226f","\\ngtr");a(i,l,d,"\ue00f","\\ngeqslant");a(i,l,d,"\ue00e","\\ngeqq");a(i,l,d,"\u2a88","\\gneq");a(i,l,d,"\u2269","\\gneqq");a(i,l,d,"\ue00d","\\gvertneqq");a(i,l,d,"\u22e7","\\gnsim");a(i,l,d,"\u2a8a","\\gnapprox");a(i,l,d,"\u2281","\\nsucc");a(i,l,d,"\u22e1","\\nsucceq");a(i,l,d,"\u22e9","\\succnsim");a(i,l,d,"\u2aba","\\succnapprox");a(i,l,d,"\u2246","\\ncong");a(i,l,d,"\ue007","\\nshortparallel");a(i,l,d,"\u2226","\\nparallel");a(i,l,d,"\u22af","\\nVDash");a(i,l,d,"\u22eb","\\ntriangleright");a(i,l,d,"\u22ed","\\ntrianglerighteq");a(i,l,d,"\ue018","\\nsupseteqq");a(i,l,d,"\u228b","\\supsetneq");a(i,l,d,"\ue01b","\\varsupsetneq");a(i,l,d,"\u2acc","\\supsetneqq");a(i,l,d,"\ue019","\\varsupsetneqq");a(i,l,d,"\u22ae","\\nVdash");a(i,l,d,"\u2ab5","\\precneqq");a(i,l,d,"\u2ab6","\\succneqq");a(i,l,d,"\ue016","\\nsubseteqq");a(i,l,u,"\u22b4","\\unlhd");a(i,l,u,"\u22b5","\\unrhd");a(i,l,d,"\u219a","\\nleftarrow");a(i,l,d,"\u219b","\\nrightarrow");a(i,l,d,"\u21cd","\\nLeftarrow");a(i,l,d,"\u21cf","\\nRightarrow");a(i,l,d,"\u21ae","\\nleftrightarrow");a(i,l,d,"\u21ce","\\nLeftrightarrow");a(i,l,d,"\u25b3","\\vartriangle");a(i,l,y,"\u210f","\\hslash");a(i,l,y,"\u25bd","\\triangledown");a(i,l,y,"\u25ca","\\lozenge");a(i,l,y,"\u24c8","\\circledS");a(i,l,y,"\xae","\\circledR");a(i,l,y,"\u2221","\\measuredangle");a(i,l,y,"\u2204","\\nexists");a(i,l,y,"\u2127","\\mho");a(i,l,y,"\u2132","\\Finv");a(i,l,y,"\u2141","\\Game");a(i,l,y,"k","\\Bbbk");a(i,l,y,"\u2035","\\backprime");a(i,l,y,"\u25b2","\\blacktriangle");a(i,l,y,"\u25bc","\\blacktriangledown");a(i,l,y,"\u25a0","\\blacksquare");a(i,l,y,"\u29eb","\\blacklozenge");a(i,l,y,"\u2605","\\bigstar");a(i,l,y,"\u2222","\\sphericalangle");a(i,l,y,"\u2201","\\complement");a(i,l,y,"\xf0","\\eth");a(i,l,y,"\u2571","\\diagup");a(i,l,y,"\u2572","\\diagdown");a(i,l,y,"\u25a1","\\square");a(i,l,y,"\u25a1","\\Box");a(i,l,y,"\u25ca","\\Diamond");a(i,l,y,"\xa5","\\yen");a(i,l,y,"\u2713","\\checkmark");a(i,l,y,"\u2136","\\beth");a(i,l,y,"\u2138","\\daleth");a(i,l,y,"\u2137","\\gimel");a(i,l,y,"\u03dd","\\digamma");a(i,l,y,"\u03f0","\\varkappa");a(i,l,f,"\u250c","\\ulcorner");a(i,l,p,"\u2510","\\urcorner");a(i,l,f,"\u2514","\\llcorner");a(i,l,p,"\u2518","\\lrcorner");a(i,l,d,"\u2266","\\leqq");a(i,l,d,"\u2a7d","\\leqslant");a(i,l,d,"\u2a95","\\eqslantless");a(i,l,d,"\u2272","\\lesssim");a(i,l,d,"\u2a85","\\lessapprox");a(i,l,d,"\u224a","\\approxeq");a(i,l,u,"\u22d6","\\lessdot");a(i,l,d,"\u22d8","\\lll");a(i,l,d,"\u2276","\\lessgtr");a(i,l,d,"\u22da","\\lesseqgtr");a(i,l,d,"\u2a8b","\\lesseqqgtr");a(i,l,d,"\u2251","\\doteqdot");a(i,l,d,"\u2253","\\risingdotseq");a(i,l,d,"\u2252","\\fallingdotseq");a(i,l,d,"\u223d","\\backsim");a(i,l,d,"\u22cd","\\backsimeq");a(i,l,d,"\u2ac5","\\subseteqq");a(i,l,d,"\u22d0","\\Subset");a(i,l,d,"\u228f","\\sqsubset");a(i,l,d,"\u227c","\\preccurlyeq");a(i,l,d,"\u22de","\\curlyeqprec");a(i,l,d,"\u227e","\\precsim");a(i,l,d,"\u2ab7","\\precapprox");a(i,l,d,"\u22b2","\\vartriangleleft");a(i,l,d,"\u22b4","\\trianglelefteq");a(i,l,d,"\u22a8","\\vDash");a(i,l,d,"\u22aa","\\Vvdash");a(i,l,d,"\u2323","\\smallsmile");a(i,l,d,"\u2322","\\smallfrown");a(i,l,d,"\u224f","\\bumpeq");a(i,l,d,"\u224e","\\Bumpeq");a(i,l,d,"\u2267","\\geqq");a(i,l,d,"\u2a7e","\\geqslant");a(i,l,d,"\u2a96","\\eqslantgtr");a(i,l,d,"\u2273","\\gtrsim");a(i,l,d,"\u2a86","\\gtrapprox");a(i,l,u,"\u22d7","\\gtrdot");a(i,l,d,"\u22d9","\\ggg");a(i,l,d,"\u2277","\\gtrless");a(i,l,d,"\u22db","\\gtreqless");a(i,l,d,"\u2a8c","\\gtreqqless");a(i,l,d,"\u2256","\\eqcirc");a(i,l,d,"\u2257","\\circeq");a(i,l,d,"\u225c","\\triangleq");a(i,l,d,"\u223c","\\thicksim");a(i,l,d,"\u2248","\\thickapprox");a(i,l,d,"\u2ac6","\\supseteqq");a(i,l,d,"\u22d1","\\Supset");a(i,l,d,"\u2290","\\sqsupset");a(i,l,d,"\u227d","\\succcurlyeq");a(i,l,d,"\u22df","\\curlyeqsucc");a(i,l,d,"\u227f","\\succsim");a(i,l,d,"\u2ab8","\\succapprox");a(i,l,d,"\u22b3","\\vartriangleright");a(i,l,d,"\u22b5","\\trianglerighteq");a(i,l,d,"\u22a9","\\Vdash");a(i,l,d,"\u2223","\\shortmid");a(i,l,d,"\u2225","\\shortparallel");a(i,l,d,"\u226c","\\between");a(i,l,d,"\u22d4","\\pitchfork");a(i,l,d,"\u221d","\\varpropto");a(i,l,d,"\u25c0","\\blacktriangleleft");a(i,l,d,"\u2234","\\therefore");a(i,l,d,"\u220d","\\backepsilon");a(i,l,d,"\u25b6","\\blacktriangleright");a(i,l,d,"\u2235","\\because");a(i,l,d,"\u22d8","\\llless");a(i,l,d,"\u22d9","\\gggtr");a(i,l,u,"\u22b2","\\lhd");a(i,l,u,"\u22b3","\\rhd");a(i,l,d,"\u2242","\\eqsim");a(i,s,d,"\u22c8","\\Join");a(i,l,d,"\u2251","\\Doteq");a(i,l,u,"\u2214","\\dotplus");a(i,l,u,"\u2216","\\smallsetminus");a(i,l,u,"\u22d2","\\Cap");a(i,l,u,"\u22d3","\\Cup");a(i,l,u,"\u2a5e","\\doublebarwedge");a(i,l,u,"\u229f","\\boxminus");a(i,l,u,"\u229e","\\boxplus");a(i,l,u,"\u22c7","\\divideontimes");a(i,l,u,"\u22c9","\\ltimes");a(i,l,u,"\u22ca","\\rtimes");a(i,l,u,"\u22cb","\\leftthreetimes");a(i,l,u,"\u22cc","\\rightthreetimes");a(i,l,u,"\u22cf","\\curlywedge");a(i,l,u,"\u22ce","\\curlyvee");a(i,l,u,"\u229d","\\circleddash");a(i,l,u,"\u229b","\\circledast");a(i,l,u,"\u22c5","\\centerdot");a(i,l,u,"\u22ba","\\intercal");a(i,l,u,"\u22d2","\\doublecap");a(i,l,u,"\u22d3","\\doublecup");a(i,l,u,"\u22a0","\\boxtimes");a(i,l,d,"\u21e2","\\dashrightarrow");a(i,l,d,"\u21e0","\\dashleftarrow");a(i,l,d,"\u21c7","\\leftleftarrows");a(i,l,d,"\u21c6","\\leftrightarrows");a(i,l,d,"\u21da","\\Lleftarrow");a(i,l,d,"\u219e","\\twoheadleftarrow");a(i,l,d,"\u21a2","\\leftarrowtail");a(i,l,d,"\u21ab","\\looparrowleft");a(i,l,d,"\u21cb","\\leftrightharpoons");a(i,l,d,"\u21b6","\\curvearrowleft");a(i,l,d,"\u21ba","\\circlearrowleft");a(i,l,d,"\u21b0","\\Lsh");a(i,l,d,"\u21c8","\\upuparrows");a(i,l,d,"\u21bf","\\upharpoonleft");a(i,l,d,"\u21c3","\\downharpoonleft");a(i,l,d,"\u22b8","\\multimap");a(i,l,d,"\u21ad","\\leftrightsquigarrow");a(i,l,d,"\u21c9","\\rightrightarrows");a(i,l,d,"\u21c4","\\rightleftarrows");a(i,l,d,"\u21a0","\\twoheadrightarrow");a(i,l,d,"\u21a3","\\rightarrowtail");a(i,l,d,"\u21ac","\\looparrowright");a(i,l,d,"\u21b7","\\curvearrowright");a(i,l,d,"\u21bb","\\circlearrowright");a(i,l,d,"\u21b1","\\Rsh");a(i,l,d,"\u21ca","\\downdownarrows");a(i,l,d,"\u21be","\\upharpoonright");a(i,l,d,"\u21c2","\\downharpoonright");a(i,l,d,"\u21dd","\\rightsquigarrow");a(i,l,d,"\u21dd","\\leadsto");a(i,l,d,"\u21db","\\Rrightarrow");a(i,l,d,"\u21be","\\restriction");a(i,s,y,"\u2018","`");a(i,s,y,"$","\\$");a(n,s,y,"$","\\$");a(i,s,y,"%","\\%");a(n,s,y,"%","\\%");a(i,s,y,"_","\\_");a(n,s,y,"_","\\_");a(i,s,y,"\u2220","\\angle");a(i,s,y,"\u221e","\\infty");a(i,s,y,"\u2032","\\prime");a(i,s,y,"\u25b3","\\triangle");a(i,s,y,"\u0393","\\Gamma");a(i,s,y,"\u0394","\\Delta");a(i,s,y,"\u0398","\\Theta");a(i,s,y,"\u039b","\\Lambda");a(i,s,y,"\u039e","\\Xi");a(i,s,y,"\u03a0","\\Pi");a(i,s,y,"\u03a3","\\Sigma");a(i,s,y,"\u03a5","\\Upsilon");a(i,s,y,"\u03a6","\\Phi");a(i,s,y,"\u03a8","\\Psi");a(i,s,y,"\u03a9","\\Omega");a(i,s,y,"\xac","\\neg");a(i,s,y,"\xac","\\lnot");a(i,s,y,"\u22a4","\\top");a(i,s,y,"\u22a5","\\bot");a(i,s,y,"\u2205","\\emptyset");a(i,l,y,"\u2205","\\varnothing");a(i,s,c,"\u03b1","\\alpha");a(i,s,c,"\u03b2","\\beta");a(i,s,c,"\u03b3","\\gamma");a(i,s,c,"\u03b4","\\delta");a(i,s,c,"\u03f5","\\epsilon");a(i,s,c,"\u03b6","\\zeta");a(i,s,c,"\u03b7","\\eta");a(i,s,c,"\u03b8","\\theta");a(i,s,c,"\u03b9","\\iota");a(i,s,c,"\u03ba","\\kappa");a(i,s,c,"\u03bb","\\lambda");a(i,s,c,"\u03bc","\\mu");a(i,s,c,"\u03bd","\\nu");a(i,s,c,"\u03be","\\xi");a(i,s,c,"o","\\omicron");a(i,s,c,"\u03c0","\\pi");a(i,s,c,"\u03c1","\\rho");a(i,s,c,"\u03c3","\\sigma");a(i,s,c,"\u03c4","\\tau");a(i,s,c,"\u03c5","\\upsilon");a(i,s,c,"\u03d5","\\phi");a(i,s,c,"\u03c7","\\chi");a(i,s,c,"\u03c8","\\psi");a(i,s,c,"\u03c9","\\omega");a(i,s,c,"\u03b5","\\varepsilon");a(i,s,c,"\u03d1","\\vartheta");a(i,s,c,"\u03d6","\\varpi");a(i,s,c,"\u03f1","\\varrho");a(i,s,c,"\u03c2","\\varsigma");a(i,s,c,"\u03c6","\\varphi");a(i,s,u,"\u2217","*");a(i,s,u,"+","+");a(i,s,u,"\u2212","-");a(i,s,u,"\u22c5","\\cdot");a(i,s,u,"\u2218","\\circ");a(i,s,u,"\xf7","\\div");a(i,s,u,"\xb1","\\pm");a(i,s,u,"\xd7","\\times");a(i,s,u,"\u2229","\\cap");a(i,s,u,"\u222a","\\cup");a(i,s,u,"\u2216","\\setminus");a(i,s,u,"\u2227","\\land");a(i,s,u,"\u2228","\\lor");a(i,s,u,"\u2227","\\wedge");a(i,s,u,"\u2228","\\vee");a(i,s,y,"\u221a","\\surd");a(i,s,f,"(","(");a(i,s,f,"[","[");a(i,s,f,"\u27e8","\\langle");a(i,s,f,"\u2223","\\lvert");a(i,s,f,"\u2225","\\lVert");a(i,s,p,")",")");a(i,s,p,"]","]");a(i,s,p,"?","?");a(i,s,p,"!","!");a(i,s,p,"\u27e9","\\rangle");a(i,s,p,"\u2223","\\rvert");a(i,s,p,"\u2225","\\rVert");a(i,s,d,"=","=");a(i,s,d,"<","<");a(i,s,d,">",">");a(i,s,d,":",":");a(i,s,d,"\u2248","\\approx");a(i,s,d,"\u2245","\\cong");a(i,s,d,"\u2265","\\ge");a(i,s,d,"\u2265","\\geq");a(i,s,d,"\u2190","\\gets");a(i,s,d,">","\\gt");a(i,s,d,"\u2208","\\in");a(i,s,d,"\u2209","\\notin");a(i,s,d,"\u2282","\\subset");a(i,s,d,"\u2283","\\supset");a(i,s,d,"\u2286","\\subseteq");a(i,s,d,"\u2287","\\supseteq");a(i,l,d,"\u2288","\\nsubseteq");a(i,l,d,"\u2289","\\nsupseteq");a(i,s,d,"\u22a8","\\models");a(i,s,d,"\u2190","\\leftarrow");a(i,s,d,"\u2264","\\le");a(i,s,d,"\u2264","\\leq");a(i,s,d,"<","\\lt");a(i,s,d,"\u2260","\\ne");a(i,s,d,"\u2260","\\neq");a(i,s,d,"\u2192","\\rightarrow");a(i,s,d,"\u2192","\\to");a(i,l,d,"\u2271","\\ngeq");a(i,l,d,"\u2270","\\nleq");a(i,s,g,null,"\\!");a(i,s,g,"\xa0","\\ ");a(i,s,g,"\xa0","~");a(i,s,g,null,"\\,");a(i,s,g,null,"\\:");a(i,s,g,null,"\\;");a(i,s,g,null,"\\enspace");a(i,s,g,null,"\\qquad");a(i,s,g,null,"\\quad");a(i,s,g,"\xa0","\\space");a(i,s,v,",",",");a(i,s,v,";",";");a(i,s,v,":","\\colon");a(i,l,u,"\u22bc","\\barwedge");a(i,l,u,"\u22bb","\\veebar");a(i,s,u,"\u2299","\\odot");a(i,s,u,"\u2295","\\oplus");a(i,s,u,"\u2297","\\otimes");a(i,s,y,"\u2202","\\partial");a(i,s,u,"\u2298","\\oslash");a(i,l,u,"\u229a","\\circledcirc");a(i,l,u,"\u22a1","\\boxdot");a(i,s,u,"\u25b3","\\bigtriangleup");a(i,s,u,"\u25bd","\\bigtriangledown");a(i,s,u,"\u2020","\\dagger");a(i,s,u,"\u22c4","\\diamond");a(i,s,u,"\u22c6","\\star");a(i,s,u,"\u25c3","\\triangleleft");a(i,s,u,"\u25b9","\\triangleright");a(i,s,f,"{","\\{");a(n,s,y,"{","\\{");a(i,s,p,"}","\\}");a(n,s,y,"}","\\}");a(i,s,f,"{","\\lbrace");a(i,s,p,"}","\\rbrace");a(i,s,f,"[","\\lbrack");a(i,s,p,"]","\\rbrack");a(i,s,f,"\u230a","\\lfloor");a(i,s,p,"\u230b","\\rfloor");a(i,s,f,"\u2308","\\lceil");a(i,s,p,"\u2309","\\rceil");a(i,s,y,"\\","\\backslash");a(i,s,y,"\u2223","|");a(i,s,y,"\u2223","\\vert");a(i,s,y,"\u2225","\\|");a(i,s,y,"\u2225","\\Vert");a(i,s,d,"\u2191","\\uparrow");a(i,s,d,"\u21d1","\\Uparrow");a(i,s,d,"\u2193","\\downarrow");a(i,s,d,"\u21d3","\\Downarrow");a(i,s,d,"\u2195","\\updownarrow");a(i,s,d,"\u21d5","\\Updownarrow");a(i,i,m,"\u2210","\\coprod");a(i,i,m,"\u22c1","\\bigvee");a(i,i,m,"\u22c0","\\bigwedge");a(i,i,m,"\u2a04","\\biguplus");a(i,i,m,"\u22c2","\\bigcap");a(i,i,m,"\u22c3","\\bigcup");a(i,i,m,"\u222b","\\int");a(i,i,m,"\u222b","\\intop");a(i,i,m,"\u222c","\\iint");a(i,i,m,"\u222d","\\iiint");a(i,i,m,"\u220f","\\prod");a(i,i,m,"\u2211","\\sum");a(i,i,m,"\u2a02","\\bigotimes");a(i,i,m,"\u2a01","\\bigoplus");a(i,i,m,"\u2a00","\\bigodot");a(i,i,m,"\u222e","\\oint");a(i,i,m,"\u2a06","\\bigsqcup");a(i,i,m,"\u222b","\\smallint");a(n,s,h,"\u2026","\\textellipsis");a(i,s,h,"\u2026","\\mathellipsis");a(n,s,h,"\u2026","\\ldots");a(i,s,h,"\u2026","\\ldots");a(i,s,h,"\u22ef","\\cdots");a(i,s,h,"\u22f1","\\ddots");a(i,s,y,"\u22ee","\\vdots");a(i,s,o,"\xb4","\\acute");a(i,s,o,"`","\\grave");a(i,s,o,"\xa8","\\ddot");a(i,s,o,"~","\\tilde");a(i,s,o,"\xaf","\\bar");a(i,s,o,"\u02d8","\\breve");a(i,s,o,"\u02c7","\\check");a(i,s,o,"^","\\hat");a(i,s,o,"\u20d7","\\vec");a(i,s,o,"\u02d9","\\dot");a(i,s,c,"\u0131","\\imath");a(i,s,c,"\u0237","\\jmath");a(n,s,y,"\u2013","--");a(n,s,y,"\u2014","---");a(n,s,y,"\u2018","`");a(n,s,y,"\u2019","'");a(n,s,y,"\u201c","``");a(n,s,y,"\u201d","''");a(i,s,y,"\xb0","\\degree");a(n,s,y,"\xb0","\\degree");a(i,s,c,"\xa3","\\pounds");a(i,l,y,"\u2720","\\maltese");a(n,l,y,"\u2720","\\maltese");a(n,s,g,"\xa0","\\ ");a(n,s,g,"\xa0"," ");a(n,s,g,"\xa0","~");var x;var b;var w='0123456789/@."';for(x=0;x<w.length;x++){b=w.charAt(x);a(i,s,y,b,b)}var k='0123456789!@*()-=+[]";:?/.,';for(x=0;x<k.length;x++){b=k.charAt(x);a(n,s,y,b,b)}var z="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(x=0;x<z.length;x++){b=z.charAt(x);a(i,s,c,b,b);a(n,s,y,b,b)}for(x=192;x<=214;x++){b=String.fromCharCode(x);a(n,s,y,b,b)}for(x=216;x<=246;x++){b=String.fromCharCode(x);a(n,s,y,b,b)}for(x=248;x<=255;x++){b=String.fromCharCode(x);a(n,s,y,b,b)}for(x=1040;x<=1103;x++){b=String.fromCharCode(x);a(n,s,y,b,b)}a(n,s,y,"\u2013","\u2013");a(n,s,y,"\u2014","\u2014");a(n,s,y,"\u2018","\u2018");a(n,s,y,"\u2019","\u2019");a(n,s,y,"\u201c","\u201c");a(n,s,y,"\u201d","\u201d")},{}],24:[function(e,t,r){var a=/[\uAC00-\uD7AF]/;var i=/[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FAF]|[\uAC00-\uD7AF]/;t.exports={cjkRegex:i,hangulRegex:a}},{}],25:[function(e,t,r){var a=Array.prototype.indexOf;var i=function(e,t){if(e==null){return-1}if(a&&e.indexOf===a){return e.indexOf(t)}var r=0;var i=e.length;for(;r<i;r++){if(e[r]===t){return r}}return-1};var n=function(e,t){return i(e,t)!==-1};var s=function(e,t){return e===undefined?t:e};var l=/([A-Z])/g;var o=function(e){return e.replace(l,"-$1").toLowerCase()};var u={"&":"&amp;",">":"&gt;","<":"&lt;",'"':"&quot;","'":"&#x27;"};var p=/[&><"']/g;function h(e){return u[e]}function c(e){return(""+e).replace(p,h)}var m;if(typeof document!=="undefined"){var f=document.createElement("span");if("textContent"in f){m=function(e,t){e.textContent=t}}else{m=function(e,t){e.innerText=t}}}function v(e){m(e,"")}t.exports={contains:n,deflt:s,escape:c,hyphenate:o,indexOf:i,setTextContent:m,clearNode:v}},{}]},{},[1])(1)});
diff --git a/specs/gl/katex/README.md b/specs/es/katex/README.md
similarity index 100%
rename from specs/gl/katex/README.md
rename to specs/es/katex/README.md
diff --git a/specs/es/3.2/katex/contrib/auto-render.min.js b/specs/es/katex/contrib/auto-render.min.js
similarity index 100%
rename from specs/es/3.2/katex/contrib/auto-render.min.js
rename to specs/es/katex/contrib/auto-render.min.js
diff --git a/specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.eot b/specs/es/katex/fonts/KaTeX_AMS-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.eot
rename to specs/es/katex/fonts/KaTeX_AMS-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.ttf b/specs/es/katex/fonts/KaTeX_AMS-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_AMS-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.woff b/specs/es/katex/fonts/KaTeX_AMS-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.woff
rename to specs/es/katex/fonts/KaTeX_AMS-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.woff2 b/specs/es/katex/fonts/KaTeX_AMS-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_AMS-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_AMS-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.eot b/specs/es/katex/fonts/KaTeX_Caligraphic-Bold.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.eot
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Bold.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.ttf b/specs/es/katex/fonts/KaTeX_Caligraphic-Bold.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.ttf
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Bold.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.woff b/specs/es/katex/fonts/KaTeX_Caligraphic-Bold.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.woff
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Bold.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.woff2 b/specs/es/katex/fonts/KaTeX_Caligraphic-Bold.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Bold.woff2
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Bold.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.eot b/specs/es/katex/fonts/KaTeX_Caligraphic-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.ttf b/specs/es/katex/fonts/KaTeX_Caligraphic-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.woff b/specs/es/katex/fonts/KaTeX_Caligraphic-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Caligraphic-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Caligraphic-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Caligraphic-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.eot b/specs/es/katex/fonts/KaTeX_Fraktur-Bold.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.eot
rename to specs/es/katex/fonts/KaTeX_Fraktur-Bold.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.ttf b/specs/es/katex/fonts/KaTeX_Fraktur-Bold.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.ttf
rename to specs/es/katex/fonts/KaTeX_Fraktur-Bold.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.woff b/specs/es/katex/fonts/KaTeX_Fraktur-Bold.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.woff
rename to specs/es/katex/fonts/KaTeX_Fraktur-Bold.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/specs/es/katex/fonts/KaTeX_Fraktur-Bold.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Bold.woff2
rename to specs/es/katex/fonts/KaTeX_Fraktur-Bold.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.eot b/specs/es/katex/fonts/KaTeX_Fraktur-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Fraktur-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.ttf b/specs/es/katex/fonts/KaTeX_Fraktur-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Fraktur-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.woff b/specs/es/katex/fonts/KaTeX_Fraktur-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Fraktur-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Fraktur-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Fraktur-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Fraktur-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Bold.eot b/specs/es/katex/fonts/KaTeX_Main-Bold.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Bold.eot
rename to specs/es/katex/fonts/KaTeX_Main-Bold.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Bold.ttf b/specs/es/katex/fonts/KaTeX_Main-Bold.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Bold.ttf
rename to specs/es/katex/fonts/KaTeX_Main-Bold.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Bold.woff b/specs/es/katex/fonts/KaTeX_Main-Bold.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Bold.woff
rename to specs/es/katex/fonts/KaTeX_Main-Bold.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Bold.woff2 b/specs/es/katex/fonts/KaTeX_Main-Bold.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Bold.woff2
rename to specs/es/katex/fonts/KaTeX_Main-Bold.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Italic.eot b/specs/es/katex/fonts/KaTeX_Main-Italic.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Italic.eot
rename to specs/es/katex/fonts/KaTeX_Main-Italic.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Italic.ttf b/specs/es/katex/fonts/KaTeX_Main-Italic.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Italic.ttf
rename to specs/es/katex/fonts/KaTeX_Main-Italic.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Italic.woff b/specs/es/katex/fonts/KaTeX_Main-Italic.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Italic.woff
rename to specs/es/katex/fonts/KaTeX_Main-Italic.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Italic.woff2 b/specs/es/katex/fonts/KaTeX_Main-Italic.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Italic.woff2
rename to specs/es/katex/fonts/KaTeX_Main-Italic.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Regular.eot b/specs/es/katex/fonts/KaTeX_Main-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Main-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Regular.ttf b/specs/es/katex/fonts/KaTeX_Main-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Main-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Regular.woff b/specs/es/katex/fonts/KaTeX_Main-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Main-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Main-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Main-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Main-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Main-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.eot b/specs/es/katex/fonts/KaTeX_Math-BoldItalic.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.eot
rename to specs/es/katex/fonts/KaTeX_Math-BoldItalic.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.ttf b/specs/es/katex/fonts/KaTeX_Math-BoldItalic.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.ttf
rename to specs/es/katex/fonts/KaTeX_Math-BoldItalic.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.woff b/specs/es/katex/fonts/KaTeX_Math-BoldItalic.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.woff
rename to specs/es/katex/fonts/KaTeX_Math-BoldItalic.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/specs/es/katex/fonts/KaTeX_Math-BoldItalic.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-BoldItalic.woff2
rename to specs/es/katex/fonts/KaTeX_Math-BoldItalic.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Italic.eot b/specs/es/katex/fonts/KaTeX_Math-Italic.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Italic.eot
rename to specs/es/katex/fonts/KaTeX_Math-Italic.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Italic.ttf b/specs/es/katex/fonts/KaTeX_Math-Italic.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Italic.ttf
rename to specs/es/katex/fonts/KaTeX_Math-Italic.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Italic.woff b/specs/es/katex/fonts/KaTeX_Math-Italic.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Italic.woff
rename to specs/es/katex/fonts/KaTeX_Math-Italic.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Italic.woff2 b/specs/es/katex/fonts/KaTeX_Math-Italic.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Italic.woff2
rename to specs/es/katex/fonts/KaTeX_Math-Italic.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Regular.eot b/specs/es/katex/fonts/KaTeX_Math-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Math-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Regular.ttf b/specs/es/katex/fonts/KaTeX_Math-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Math-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Regular.woff b/specs/es/katex/fonts/KaTeX_Math-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Math-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Math-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Math-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Math-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Math-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.eot b/specs/es/katex/fonts/KaTeX_SansSerif-Bold.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.eot
rename to specs/es/katex/fonts/KaTeX_SansSerif-Bold.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.ttf b/specs/es/katex/fonts/KaTeX_SansSerif-Bold.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.ttf
rename to specs/es/katex/fonts/KaTeX_SansSerif-Bold.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.woff b/specs/es/katex/fonts/KaTeX_SansSerif-Bold.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.woff
rename to specs/es/katex/fonts/KaTeX_SansSerif-Bold.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.woff2 b/specs/es/katex/fonts/KaTeX_SansSerif-Bold.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Bold.woff2
rename to specs/es/katex/fonts/KaTeX_SansSerif-Bold.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.eot b/specs/es/katex/fonts/KaTeX_SansSerif-Italic.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.eot
rename to specs/es/katex/fonts/KaTeX_SansSerif-Italic.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.ttf b/specs/es/katex/fonts/KaTeX_SansSerif-Italic.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.ttf
rename to specs/es/katex/fonts/KaTeX_SansSerif-Italic.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.woff b/specs/es/katex/fonts/KaTeX_SansSerif-Italic.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.woff
rename to specs/es/katex/fonts/KaTeX_SansSerif-Italic.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/specs/es/katex/fonts/KaTeX_SansSerif-Italic.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Italic.woff2
rename to specs/es/katex/fonts/KaTeX_SansSerif-Italic.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.eot b/specs/es/katex/fonts/KaTeX_SansSerif-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.eot
rename to specs/es/katex/fonts/KaTeX_SansSerif-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.ttf b/specs/es/katex/fonts/KaTeX_SansSerif-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_SansSerif-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.woff b/specs/es/katex/fonts/KaTeX_SansSerif-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.woff
rename to specs/es/katex/fonts/KaTeX_SansSerif-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.woff2 b/specs/es/katex/fonts/KaTeX_SansSerif-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_SansSerif-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_SansSerif-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Script-Regular.eot b/specs/es/katex/fonts/KaTeX_Script-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Script-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Script-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Script-Regular.ttf b/specs/es/katex/fonts/KaTeX_Script-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Script-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Script-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Script-Regular.woff b/specs/es/katex/fonts/KaTeX_Script-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Script-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Script-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Script-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Script-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Script-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Script-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.eot b/specs/es/katex/fonts/KaTeX_Size1-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Size1-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.ttf b/specs/es/katex/fonts/KaTeX_Size1-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Size1-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.woff b/specs/es/katex/fonts/KaTeX_Size1-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Size1-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Size1-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size1-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Size1-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.eot b/specs/es/katex/fonts/KaTeX_Size2-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Size2-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.ttf b/specs/es/katex/fonts/KaTeX_Size2-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Size2-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.woff b/specs/es/katex/fonts/KaTeX_Size2-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Size2-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Size2-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size2-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Size2-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.eot b/specs/es/katex/fonts/KaTeX_Size3-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Size3-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.ttf b/specs/es/katex/fonts/KaTeX_Size3-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Size3-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.woff b/specs/es/katex/fonts/KaTeX_Size3-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Size3-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Size3-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size3-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Size3-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.eot b/specs/es/katex/fonts/KaTeX_Size4-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Size4-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.ttf b/specs/es/katex/fonts/KaTeX_Size4-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Size4-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.woff b/specs/es/katex/fonts/KaTeX_Size4-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Size4-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Size4-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Size4-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Size4-Regular.woff2
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.eot b/specs/es/katex/fonts/KaTeX_Typewriter-Regular.eot
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.eot
rename to specs/es/katex/fonts/KaTeX_Typewriter-Regular.eot
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.ttf b/specs/es/katex/fonts/KaTeX_Typewriter-Regular.ttf
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.ttf
rename to specs/es/katex/fonts/KaTeX_Typewriter-Regular.ttf
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.woff b/specs/es/katex/fonts/KaTeX_Typewriter-Regular.woff
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.woff
rename to specs/es/katex/fonts/KaTeX_Typewriter-Regular.woff
Binary files differ
diff --git a/specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/specs/es/katex/fonts/KaTeX_Typewriter-Regular.woff2
similarity index 100%
rename from specs/es/3.2/katex/fonts/KaTeX_Typewriter-Regular.woff2
rename to specs/es/katex/fonts/KaTeX_Typewriter-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/katex.css b/specs/es/katex/katex.css
similarity index 100%
rename from specs/gl/katex/katex.css
rename to specs/es/katex/katex.css
diff --git a/specs/gl/katex/katex.js b/specs/es/katex/katex.js
similarity index 100%
rename from specs/gl/katex/katex.js
rename to specs/es/katex/katex.js
diff --git a/specs/gl/katex/katex.min.css b/specs/es/katex/katex.min.css
similarity index 100%
rename from specs/gl/katex/katex.min.css
rename to specs/es/katex/katex.min.css
diff --git a/specs/gl/katex/katex.min.js b/specs/es/katex/katex.min.js
similarity index 100%
rename from specs/gl/katex/katex.min.js
rename to specs/es/katex/katex.min.js
diff --git a/specs/gl/katex/README.md b/specs/katex/README.md
similarity index 100%
copy from specs/gl/katex/README.md
copy to specs/katex/README.md
diff --git a/specs/gl/katex/contrib/auto-render.min.js b/specs/katex/contrib/auto-render.min.js
similarity index 100%
rename from specs/gl/katex/contrib/auto-render.min.js
rename to specs/katex/contrib/auto-render.min.js
diff --git a/specs/gl/katex/fonts/KaTeX_AMS-Regular.eot b/specs/katex/fonts/KaTeX_AMS-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_AMS-Regular.eot
rename to specs/katex/fonts/KaTeX_AMS-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_AMS-Regular.ttf b/specs/katex/fonts/KaTeX_AMS-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_AMS-Regular.ttf
rename to specs/katex/fonts/KaTeX_AMS-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_AMS-Regular.woff b/specs/katex/fonts/KaTeX_AMS-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_AMS-Regular.woff
rename to specs/katex/fonts/KaTeX_AMS-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_AMS-Regular.woff2 b/specs/katex/fonts/KaTeX_AMS-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_AMS-Regular.woff2
rename to specs/katex/fonts/KaTeX_AMS-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.eot b/specs/katex/fonts/KaTeX_Caligraphic-Bold.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.eot
rename to specs/katex/fonts/KaTeX_Caligraphic-Bold.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.ttf b/specs/katex/fonts/KaTeX_Caligraphic-Bold.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.ttf
rename to specs/katex/fonts/KaTeX_Caligraphic-Bold.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.woff b/specs/katex/fonts/KaTeX_Caligraphic-Bold.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.woff
rename to specs/katex/fonts/KaTeX_Caligraphic-Bold.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.woff2 b/specs/katex/fonts/KaTeX_Caligraphic-Bold.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Bold.woff2
rename to specs/katex/fonts/KaTeX_Caligraphic-Bold.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.eot b/specs/katex/fonts/KaTeX_Caligraphic-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.eot
rename to specs/katex/fonts/KaTeX_Caligraphic-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.ttf b/specs/katex/fonts/KaTeX_Caligraphic-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.ttf
rename to specs/katex/fonts/KaTeX_Caligraphic-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.woff b/specs/katex/fonts/KaTeX_Caligraphic-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.woff
rename to specs/katex/fonts/KaTeX_Caligraphic-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/specs/katex/fonts/KaTeX_Caligraphic-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Caligraphic-Regular.woff2
rename to specs/katex/fonts/KaTeX_Caligraphic-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Bold.eot b/specs/katex/fonts/KaTeX_Fraktur-Bold.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Bold.eot
rename to specs/katex/fonts/KaTeX_Fraktur-Bold.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Bold.ttf b/specs/katex/fonts/KaTeX_Fraktur-Bold.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Bold.ttf
rename to specs/katex/fonts/KaTeX_Fraktur-Bold.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Bold.woff b/specs/katex/fonts/KaTeX_Fraktur-Bold.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Bold.woff
rename to specs/katex/fonts/KaTeX_Fraktur-Bold.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/specs/katex/fonts/KaTeX_Fraktur-Bold.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Bold.woff2
rename to specs/katex/fonts/KaTeX_Fraktur-Bold.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Regular.eot b/specs/katex/fonts/KaTeX_Fraktur-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Regular.eot
rename to specs/katex/fonts/KaTeX_Fraktur-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Regular.ttf b/specs/katex/fonts/KaTeX_Fraktur-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Regular.ttf
rename to specs/katex/fonts/KaTeX_Fraktur-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Regular.woff b/specs/katex/fonts/KaTeX_Fraktur-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Regular.woff
rename to specs/katex/fonts/KaTeX_Fraktur-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Fraktur-Regular.woff2 b/specs/katex/fonts/KaTeX_Fraktur-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Fraktur-Regular.woff2
rename to specs/katex/fonts/KaTeX_Fraktur-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Bold.eot b/specs/katex/fonts/KaTeX_Main-Bold.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Bold.eot
rename to specs/katex/fonts/KaTeX_Main-Bold.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Bold.ttf b/specs/katex/fonts/KaTeX_Main-Bold.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Bold.ttf
rename to specs/katex/fonts/KaTeX_Main-Bold.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Bold.woff b/specs/katex/fonts/KaTeX_Main-Bold.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Bold.woff
rename to specs/katex/fonts/KaTeX_Main-Bold.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Bold.woff2 b/specs/katex/fonts/KaTeX_Main-Bold.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Bold.woff2
rename to specs/katex/fonts/KaTeX_Main-Bold.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Italic.eot b/specs/katex/fonts/KaTeX_Main-Italic.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Italic.eot
rename to specs/katex/fonts/KaTeX_Main-Italic.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Italic.ttf b/specs/katex/fonts/KaTeX_Main-Italic.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Italic.ttf
rename to specs/katex/fonts/KaTeX_Main-Italic.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Italic.woff b/specs/katex/fonts/KaTeX_Main-Italic.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Italic.woff
rename to specs/katex/fonts/KaTeX_Main-Italic.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Italic.woff2 b/specs/katex/fonts/KaTeX_Main-Italic.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Italic.woff2
rename to specs/katex/fonts/KaTeX_Main-Italic.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Regular.eot b/specs/katex/fonts/KaTeX_Main-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Regular.eot
rename to specs/katex/fonts/KaTeX_Main-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Regular.ttf b/specs/katex/fonts/KaTeX_Main-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Regular.ttf
rename to specs/katex/fonts/KaTeX_Main-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Regular.woff b/specs/katex/fonts/KaTeX_Main-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Regular.woff
rename to specs/katex/fonts/KaTeX_Main-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Main-Regular.woff2 b/specs/katex/fonts/KaTeX_Main-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Main-Regular.woff2
rename to specs/katex/fonts/KaTeX_Main-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-BoldItalic.eot b/specs/katex/fonts/KaTeX_Math-BoldItalic.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-BoldItalic.eot
rename to specs/katex/fonts/KaTeX_Math-BoldItalic.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-BoldItalic.ttf b/specs/katex/fonts/KaTeX_Math-BoldItalic.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-BoldItalic.ttf
rename to specs/katex/fonts/KaTeX_Math-BoldItalic.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-BoldItalic.woff b/specs/katex/fonts/KaTeX_Math-BoldItalic.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-BoldItalic.woff
rename to specs/katex/fonts/KaTeX_Math-BoldItalic.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/specs/katex/fonts/KaTeX_Math-BoldItalic.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-BoldItalic.woff2
rename to specs/katex/fonts/KaTeX_Math-BoldItalic.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Italic.eot b/specs/katex/fonts/KaTeX_Math-Italic.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Italic.eot
rename to specs/katex/fonts/KaTeX_Math-Italic.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Italic.ttf b/specs/katex/fonts/KaTeX_Math-Italic.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Italic.ttf
rename to specs/katex/fonts/KaTeX_Math-Italic.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Italic.woff b/specs/katex/fonts/KaTeX_Math-Italic.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Italic.woff
rename to specs/katex/fonts/KaTeX_Math-Italic.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Italic.woff2 b/specs/katex/fonts/KaTeX_Math-Italic.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Italic.woff2
rename to specs/katex/fonts/KaTeX_Math-Italic.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Regular.eot b/specs/katex/fonts/KaTeX_Math-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Regular.eot
rename to specs/katex/fonts/KaTeX_Math-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Regular.ttf b/specs/katex/fonts/KaTeX_Math-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Regular.ttf
rename to specs/katex/fonts/KaTeX_Math-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Regular.woff b/specs/katex/fonts/KaTeX_Math-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Regular.woff
rename to specs/katex/fonts/KaTeX_Math-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Math-Regular.woff2 b/specs/katex/fonts/KaTeX_Math-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Math-Regular.woff2
rename to specs/katex/fonts/KaTeX_Math-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Bold.eot b/specs/katex/fonts/KaTeX_SansSerif-Bold.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Bold.eot
rename to specs/katex/fonts/KaTeX_SansSerif-Bold.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Bold.ttf b/specs/katex/fonts/KaTeX_SansSerif-Bold.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Bold.ttf
rename to specs/katex/fonts/KaTeX_SansSerif-Bold.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Bold.woff b/specs/katex/fonts/KaTeX_SansSerif-Bold.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Bold.woff
rename to specs/katex/fonts/KaTeX_SansSerif-Bold.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Bold.woff2 b/specs/katex/fonts/KaTeX_SansSerif-Bold.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Bold.woff2
rename to specs/katex/fonts/KaTeX_SansSerif-Bold.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Italic.eot b/specs/katex/fonts/KaTeX_SansSerif-Italic.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Italic.eot
rename to specs/katex/fonts/KaTeX_SansSerif-Italic.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Italic.ttf b/specs/katex/fonts/KaTeX_SansSerif-Italic.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Italic.ttf
rename to specs/katex/fonts/KaTeX_SansSerif-Italic.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Italic.woff b/specs/katex/fonts/KaTeX_SansSerif-Italic.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Italic.woff
rename to specs/katex/fonts/KaTeX_SansSerif-Italic.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/specs/katex/fonts/KaTeX_SansSerif-Italic.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Italic.woff2
rename to specs/katex/fonts/KaTeX_SansSerif-Italic.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Regular.eot b/specs/katex/fonts/KaTeX_SansSerif-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Regular.eot
rename to specs/katex/fonts/KaTeX_SansSerif-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Regular.ttf b/specs/katex/fonts/KaTeX_SansSerif-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Regular.ttf
rename to specs/katex/fonts/KaTeX_SansSerif-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Regular.woff b/specs/katex/fonts/KaTeX_SansSerif-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Regular.woff
rename to specs/katex/fonts/KaTeX_SansSerif-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_SansSerif-Regular.woff2 b/specs/katex/fonts/KaTeX_SansSerif-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_SansSerif-Regular.woff2
rename to specs/katex/fonts/KaTeX_SansSerif-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Script-Regular.eot b/specs/katex/fonts/KaTeX_Script-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Script-Regular.eot
rename to specs/katex/fonts/KaTeX_Script-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Script-Regular.ttf b/specs/katex/fonts/KaTeX_Script-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Script-Regular.ttf
rename to specs/katex/fonts/KaTeX_Script-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Script-Regular.woff b/specs/katex/fonts/KaTeX_Script-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Script-Regular.woff
rename to specs/katex/fonts/KaTeX_Script-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Script-Regular.woff2 b/specs/katex/fonts/KaTeX_Script-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Script-Regular.woff2
rename to specs/katex/fonts/KaTeX_Script-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size1-Regular.eot b/specs/katex/fonts/KaTeX_Size1-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size1-Regular.eot
rename to specs/katex/fonts/KaTeX_Size1-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size1-Regular.ttf b/specs/katex/fonts/KaTeX_Size1-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size1-Regular.ttf
rename to specs/katex/fonts/KaTeX_Size1-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size1-Regular.woff b/specs/katex/fonts/KaTeX_Size1-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size1-Regular.woff
rename to specs/katex/fonts/KaTeX_Size1-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size1-Regular.woff2 b/specs/katex/fonts/KaTeX_Size1-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size1-Regular.woff2
rename to specs/katex/fonts/KaTeX_Size1-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size2-Regular.eot b/specs/katex/fonts/KaTeX_Size2-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size2-Regular.eot
rename to specs/katex/fonts/KaTeX_Size2-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size2-Regular.ttf b/specs/katex/fonts/KaTeX_Size2-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size2-Regular.ttf
rename to specs/katex/fonts/KaTeX_Size2-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size2-Regular.woff b/specs/katex/fonts/KaTeX_Size2-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size2-Regular.woff
rename to specs/katex/fonts/KaTeX_Size2-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size2-Regular.woff2 b/specs/katex/fonts/KaTeX_Size2-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size2-Regular.woff2
rename to specs/katex/fonts/KaTeX_Size2-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size3-Regular.eot b/specs/katex/fonts/KaTeX_Size3-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size3-Regular.eot
rename to specs/katex/fonts/KaTeX_Size3-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size3-Regular.ttf b/specs/katex/fonts/KaTeX_Size3-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size3-Regular.ttf
rename to specs/katex/fonts/KaTeX_Size3-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size3-Regular.woff b/specs/katex/fonts/KaTeX_Size3-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size3-Regular.woff
rename to specs/katex/fonts/KaTeX_Size3-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size3-Regular.woff2 b/specs/katex/fonts/KaTeX_Size3-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size3-Regular.woff2
rename to specs/katex/fonts/KaTeX_Size3-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size4-Regular.eot b/specs/katex/fonts/KaTeX_Size4-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size4-Regular.eot
rename to specs/katex/fonts/KaTeX_Size4-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size4-Regular.ttf b/specs/katex/fonts/KaTeX_Size4-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size4-Regular.ttf
rename to specs/katex/fonts/KaTeX_Size4-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size4-Regular.woff b/specs/katex/fonts/KaTeX_Size4-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size4-Regular.woff
rename to specs/katex/fonts/KaTeX_Size4-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Size4-Regular.woff2 b/specs/katex/fonts/KaTeX_Size4-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Size4-Regular.woff2
rename to specs/katex/fonts/KaTeX_Size4-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Typewriter-Regular.eot b/specs/katex/fonts/KaTeX_Typewriter-Regular.eot
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Typewriter-Regular.eot
rename to specs/katex/fonts/KaTeX_Typewriter-Regular.eot
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Typewriter-Regular.ttf b/specs/katex/fonts/KaTeX_Typewriter-Regular.ttf
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Typewriter-Regular.ttf
rename to specs/katex/fonts/KaTeX_Typewriter-Regular.ttf
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Typewriter-Regular.woff b/specs/katex/fonts/KaTeX_Typewriter-Regular.woff
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Typewriter-Regular.woff
rename to specs/katex/fonts/KaTeX_Typewriter-Regular.woff
Binary files differ
diff --git a/specs/gl/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/specs/katex/fonts/KaTeX_Typewriter-Regular.woff2
similarity index 100%
rename from specs/gl/katex/fonts/KaTeX_Typewriter-Regular.woff2
rename to specs/katex/fonts/KaTeX_Typewriter-Regular.woff2
Binary files differ
diff --git a/specs/gl/katex/katex.css b/specs/katex/katex.css
similarity index 100%
copy from specs/gl/katex/katex.css
copy to specs/katex/katex.css
diff --git a/specs/gl/katex/katex.js b/specs/katex/katex.js
similarity index 100%
copy from specs/gl/katex/katex.js
copy to specs/katex/katex.js
diff --git a/specs/gl/katex/katex.min.css b/specs/katex/katex.min.css
similarity index 100%
copy from specs/gl/katex/katex.min.css
copy to specs/katex/katex.min.css
diff --git a/specs/gl/katex/katex.min.js b/specs/katex/katex.min.js
similarity index 100%
copy from specs/gl/katex/katex.min.js
copy to specs/katex/katex.min.js
diff --git a/xml/gl.xml b/xml/gl.xml
index 8fb0ce5..2af2461 100644
--- a/xml/gl.xml
+++ b/xml/gl.xml
@@ -9135,7 +9135,7 @@
         <enum value="0x8B4A" name="GL_MAX_VERTEX_UNIFORM_COMPONENTS" group="GetPName"/>
         <enum value="0x8B4A" name="GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB"/>
         <enum value="0x8B4B" name="GL_MAX_VARYING_FLOATS" group="GetPName"/>
-        <enum value="0x8B4B" name="GL_MAX_VARYING_COMPONENTS" alias="MAX_VARYING_FLOATS" group="GetPName"/>
+        <enum value="0x8B4B" name="GL_MAX_VARYING_COMPONENTS" alias="GL_MAX_VARYING_FLOATS" group="GetPName"/>
         <enum value="0x8B4B" name="GL_MAX_VARYING_COMPONENTS_EXT"/>
         <enum value="0x8B4B" name="GL_MAX_VARYING_FLOATS_ARB"/>
         <enum value="0x8B4C" name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" group="GetPName"/>
@@ -9324,7 +9324,7 @@
         <enum value="0x8C07" name="GL_FACTOR_ALPHA_MODULATE_IMG"/>
         <enum value="0x8C08" name="GL_FRAGMENT_ALPHA_MODULATE_IMG"/>
         <enum value="0x8C09" name="GL_ADD_BLEND_IMG"/>
-        <enum value="0x8C0A" name="GL_SGX_BINARY_IMG"/>
+        <enum value="0x8C0A" name="GL_SGX_BINARY_IMG" group="ShaderBinaryFormat"/>
             <unused start="0x8C0B" end="0x8C0F" vendor="IMG"/>
     </enums>
 
@@ -9982,7 +9982,7 @@
         <enum value="0x8DF5" name="GL_HIGH_INT" group="PrecisionType"/>
         <enum value="0x8DF6" name="GL_UNSIGNED_INT_10_10_10_2_OES"/>
         <enum value="0x8DF7" name="GL_INT_10_10_10_2_OES"/>
-        <enum value="0x8DF8" name="GL_SHADER_BINARY_FORMATS"/>
+        <enum value="0x8DF8" name="GL_SHADER_BINARY_FORMATS" group="GetPName"/>
         <enum value="0x8DF9" name="GL_NUM_SHADER_BINARY_FORMATS" group="GetPName"/>
         <enum value="0x8DFA" name="GL_SHADER_COMPILER" group="GetPName"/>
         <enum value="0x8DFB" name="GL_MAX_VERTEX_UNIFORM_VECTORS" group="GetPName"/>
@@ -10319,7 +10319,7 @@
     </enums>
 
     <enums namespace="GL" start="0x8F60" end="0x8F6F" vendor="ARM" comment="For Remi Pedersen, Khronos bug 3745">
-        <enum value="0x8F60" name="GL_MALI_SHADER_BINARY_ARM"/>
+        <enum value="0x8F60" name="GL_MALI_SHADER_BINARY_ARM" group="ShaderBinaryFormat"/>
         <enum value="0x8F61" name="GL_MALI_PROGRAM_BINARY_ARM"/>
             <unused start="0x8F62" vendor="ARM"/>
         <enum value="0x8F63" name="GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT"/>
@@ -10375,13 +10375,13 @@
             <unused start="0x8FB4" end="0x8FBA" vendor="QCOM"/>
         <enum value="0x8FBB" name="GL_GPU_DISJOINT_EXT"/>
             <unused start="0x8FBC" vendor="QCOM"/>
-        <enum value="0x8FBD" name="GL_SR8_EXT"/>
-        <enum value="0x8FBE" name="GL_SRG8_EXT"/>
+        <enum value="0x8FBD" name="GL_SR8_EXT" group="InternalFormat"/>
+        <enum value="0x8FBE" name="GL_SRG8_EXT" group="InternalFormat"/>
         <enum value="0x8FBF" name="GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT"/>
     </enums>
 
     <enums namespace="GL" start="0x8FC0" end="0x8FDF" vendor="VIV" comment="For Frido Garritsen, bug 4526">
-        <enum value="0x8FC4" name="GL_SHADER_BINARY_VIV"/>
+        <enum value="0x8FC4" name="GL_SHADER_BINARY_VIV" group="ShaderBinaryFormat"/>
     </enums>
 
     <enums namespace="GL" start="0x8FE0" end="0x8FFF" vendor="NV" comment="For Pat Brown, bug 4935">
@@ -10964,7 +10964,7 @@
     </enums>
 
     <enums namespace="GL" start="0x9250" end="0x925F" vendor="DMP" comment="For Eisaku Ohbuchi via email">
-        <enum value="0x9250" name="GL_SHADER_BINARY_DMP"/>
+        <enum value="0x9250" name="GL_SHADER_BINARY_DMP" group="ShaderBinaryFormat"/>
         <enum value="0x9251" name="GL_SMAPHS30_PROGRAM_BINARY_DMP"/>
         <enum value="0x9252" name="GL_SMAPHS_PROGRAM_BINARY_DMP"/>
         <enum value="0x9253" name="GL_DMP_PROGRAM_BINARY_DMP"/>
@@ -10972,7 +10972,7 @@
     </enums>
 
     <enums namespace="GL" start="0x9260" end="0x926F" vendor="FJ" comment="Khronos bug 7486">
-        <enum value="0x9260" name="GL_GCCSO_SHADER_BINARY_FJ"/>
+        <enum value="0x9260" name="GL_GCCSO_SHADER_BINARY_FJ" group="ShaderBinaryFormat"/>
             <unused start="0x9261" end="0x926F" vendor="FJ"/>
     </enums>
 
@@ -11586,7 +11586,8 @@
         <enum value="0x95AE" name="GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV"/>
         <enum value="0x95AF" name="GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV"/>
         <enum value="0x95B0" name="GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV"/>
-        <unused start="0x95B1" end="0x95B2" vendor="NV"/>
+        <enum value="0x95B1" name="GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV" group="EnableCap,GetPName"/>
+        <enum value="0x95B2" name="GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV" group="GetPName"/>
         <enum value="0x95B3" name="GL_SEMAPHORE_TYPE_NV" group="SemaphoreParameterName"/>
         <enum value="0x95B4" name="GL_SEMAPHORE_TYPE_BINARY_NV" group="SemaphoreParameterName"/>
         <enum value="0x95B5" name="GL_SEMAPHORE_TYPE_TIMELINE_NV" group="SemaphoreParameterName"/>
@@ -15006,7 +15007,7 @@
             <param len="n"><ptype>GLuint</ptype> *<name>states</name></param>
         </command>
         <command>
-            <proto group="sync"><ptype>GLsync</ptype> <name>glCreateSyncFromCLeventARB</name></proto>
+            <proto class="sync" group="sync"><ptype>GLsync</ptype> <name>glCreateSyncFromCLeventARB</name></proto>
             <param group="cl_context"><ptype>struct _cl_context</ptype> *<name>context</name></param>
             <param group="cl_event"><ptype>struct _cl_event</ptype> *<name>event</name></param>
             <param><ptype>GLbitfield</ptype> <name>flags</name></param>
@@ -16601,12 +16602,12 @@
             <param len="n">const <ptype>GLfixed</ptype> *<name>buffer</name></param>
         </command>
         <command>
-            <proto group="sync"><ptype>GLsync</ptype> <name>glFenceSync</name></proto>
+            <proto class="sync" group="sync"><ptype>GLsync</ptype> <name>glFenceSync</name></proto>
             <param group="SyncCondition"><ptype>GLenum</ptype> <name>condition</name></param>
             <param group="SyncBehaviorFlags"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
-            <proto group="sync"><ptype>GLsync</ptype> <name>glFenceSyncAPPLE</name></proto>
+            <proto class="sync" group="sync"><ptype>GLsync</ptype> <name>glFenceSyncAPPLE</name></proto>
             <param group="SyncCondition"><ptype>GLenum</ptype> <name>condition</name></param>
             <param group="SyncBehaviorFlags"><ptype>GLbitfield</ptype> <name>flags</name></param>
             <alias name="glFenceSync"/>
@@ -19132,7 +19133,7 @@
             <param><ptype>GLuint</ptype> <name>monitor</name></param>
             <param><ptype>GLenum</ptype> <name>pname</name></param>
             <param><ptype>GLsizei</ptype> <name>dataSize</name></param>
-            <param len="dataSize"><ptype>GLuint</ptype> *<name>data</name></param>
+            <param len="dataSize / 4"><ptype>GLuint</ptype> *<name>data</name></param>
             <param len="1"><ptype>GLint</ptype> *<name>bytesWritten</name></param>
         </command>
         <command>
@@ -20675,7 +20676,7 @@
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>table</name></param>
+            <param len="bufSize">void *<name>table</name></param>
         </command>
         <command>
             <proto>void <name>glGetnColorTableARB</name></proto>
@@ -20690,7 +20691,7 @@
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLint</ptype> <name>lod</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>pixels</name></param>
+            <param len="bufSize">void *<name>pixels</name></param>
         </command>
         <command>
             <proto>void <name>glGetnCompressedTexImageARB</name></proto>
@@ -20705,7 +20706,7 @@
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>image</name></param>
+            <param len="bufSize">void *<name>image</name></param>
         </command>
         <command>
             <proto>void <name>glGetnConvolutionFilterARB</name></proto>
@@ -20722,7 +20723,7 @@
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>values</name></param>
+            <param len="bufSize">void *<name>values</name></param>
         </command>
         <command>
             <proto>void <name>glGetnHistogramARB</name></proto>
@@ -20738,14 +20739,14 @@
             <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLdouble</ptype> *<name>v</name></param>
+            <param len="COMPSIZE(bufSize)"><ptype>GLdouble</ptype> *<name>v</name></param>
         </command>
         <command>
             <proto>void <name>glGetnMapdvARB</name></proto>
             <param group="MapTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="MapQuery"><ptype>GLenum</ptype> <name>query</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLdouble</ptype> *<name>v</name></param>
+            <param len="bufSize / 8"><ptype>GLdouble</ptype> *<name>v</name></param>
         </command>
         <command>
             <proto>void <name>glGetnMapfv</name></proto>
@@ -20782,7 +20783,7 @@
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>values</name></param>
+            <param len="bufSize">void *<name>values</name></param>
         </command>
         <command>
             <proto>void <name>glGetnMinmaxARB</name></proto>
@@ -20797,13 +20798,13 @@
             <proto>void <name>glGetnPixelMapfv</name></proto>
             <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLfloat</ptype> *<name>values</name></param>
+            <param len="COMPSIZE(bufSize)"><ptype>GLfloat</ptype> *<name>values</name></param>
         </command>
         <command>
             <proto>void <name>glGetnPixelMapfvARB</name></proto>
             <param group="PixelMap"><ptype>GLenum</ptype> <name>map</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLfloat</ptype> *<name>values</name></param>
+            <param len="bufSize / 4"><ptype>GLfloat</ptype> *<name>values</name></param>
         </command>
         <command>
             <proto>void <name>glGetnPixelMapuiv</name></proto>
@@ -20832,7 +20833,7 @@
         <command>
             <proto>void <name>glGetnPolygonStipple</name></proto>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLubyte</ptype> *<name>pattern</name></param>
+            <param len="bufSize"><ptype>GLubyte</ptype> *<name>pattern</name></param>
         </command>
         <command>
             <proto>void <name>glGetnPolygonStippleARB</name></proto>
@@ -20845,10 +20846,10 @@
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>rowBufSize</name></param>
-            <param>void *<name>row</name></param>
+            <param len="rowBufSize">void *<name>row</name></param>
             <param><ptype>GLsizei</ptype> <name>columnBufSize</name></param>
-            <param>void *<name>column</name></param>
-            <param>void *<name>span</name></param>
+            <param len="columnBufSize">void *<name>column</name></param>
+            <param len="0">void *<name>span</name></param>
         </command>
         <command>
             <proto>void <name>glGetnSeparableFilterARB</name></proto>
@@ -20884,35 +20885,35 @@
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param>
+            <param len="bufSize / 8"><ptype>GLdouble</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformdvARB</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param>
+            <param len="bufSize / 8"><ptype>GLdouble</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformfv</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLfloat</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformfvARB</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLfloat</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformfvEXT</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLfloat</ptype> *<name>params</name></param>
             <alias name="glGetnUniformfv"/>
         </command>
         <command>
@@ -20920,7 +20921,7 @@
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLfloat</ptype> *<name>params</name></param>
             <alias name="glGetnUniformfv"/>
         </command>
         <command>
@@ -20928,28 +20929,28 @@
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLint64</ptype> *<name>params</name></param>
+            <param len="bufSize / 8"><ptype>GLint64</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformiv</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformivARB</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformivEXT</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformiv"/>
         </command>
         <command>
@@ -20957,7 +20958,7 @@
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformiv"/>
         </command>
         <command>
@@ -20965,28 +20966,28 @@
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLuint64</ptype> *<name>params</name></param>
+            <param len="bufSize / 8"><ptype>GLuint64</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuiv</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuivARB</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuivKHR</name></proto>
             <param class="program"><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="bufSize / 4"><ptype>GLuint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformuiv"/>
         </command>
         <command>
@@ -21119,7 +21120,7 @@
             <param>const void *<name>name</name></param>
         </command>
         <command>
-            <proto group="sync"><ptype>GLsync</ptype> <name>glImportSyncEXT</name></proto>
+            <proto class="sync" group="sync"><ptype>GLsync</ptype> <name>glImportSyncEXT</name></proto>
             <param><ptype>GLenum</ptype> <name>external_sync_type</name></param>
             <param><ptype>GLintptr</ptype> <name>external_sync</name></param>
             <param><ptype>GLbitfield</ptype> <name>flags</name></param>
@@ -28915,6 +28916,13 @@
             <param class="texture" group="Texture"><ptype>GLuint</ptype> <name>mask</name></param>
         </command>
         <command>
+            <proto>void <name>glExtrapolateTex2DQCOM</name></proto>
+            <param class="texture"><ptype>GLuint</ptype> <name>src1</name></param>
+            <param class="texture"><ptype>GLuint</ptype> <name>src2</name></param>
+            <param class="texture"><ptype>GLuint</ptype> <name>output</name></param>
+            <param><ptype>GLfloat</ptype> <name>scaleFactor</name></param>
+        </command>
+        <command>
             <proto>void <name>glTexFilterFuncSGIS</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="TextureFilterSGIS"><ptype>GLenum</ptype> <name>filter</name></param>
@@ -40506,7 +40514,6 @@
             <enum name="GL_FRAMEBUFFER_BINDING"/>
             <enum name="GL_RENDERBUFFER_BINDING"/>
             <enum name="GL_MAX_RENDERBUFFER_SIZE"/>
-            <enum name="GL_NO_ERROR"/>
             <enum name="GL_GUILTY_CONTEXT_RESET"/>
             <enum name="GL_INNOCENT_CONTEXT_RESET"/>
             <enum name="GL_UNKNOWN_CONTEXT_RESET"/>
@@ -46183,7 +46190,6 @@
                 <command name="glProgramUniform2uivEXT"/>
                 <command name="glProgramUniform3uivEXT"/>
                 <command name="glProgramUniform4uivEXT"/>
-                <command name="glProgramUniformMatrix4fvEXT"/>
                 <command name="glProgramUniformMatrix2x3fvEXT"/>
                 <command name="glProgramUniformMatrix3x2fvEXT"/>
                 <command name="glProgramUniformMatrix2x4fvEXT"/>
@@ -46809,7 +46815,7 @@
                 <enum name="GL_SR8_EXT"/>
             </require>
         </extension>
-        <extension name="GL_EXT_texture_sRGB_RG8" supported="gles2">
+        <extension name="GL_EXT_texture_sRGB_RG8" supported="gles2|gl|glcore">
             <require>
                 <enum name="GL_SRG8_EXT"/>
             </require>
@@ -48138,7 +48144,6 @@
                 <enum name="GL_CONSERVATIVE_RASTER_MODE_NV"/>
                 <enum name="GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV"/>
                 <enum name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV"/>
-                <enum name="GL_CONSERVATIVE_RASTER_MODE_NV"/>
                 <command name="glConservativeRasterParameteriNV"/>
             </require>
         </extension>
@@ -49202,6 +49207,12 @@
                 <command name="glPrimitiveRestartIndexNV"/>
             </require>
         </extension>
+        <extension name="GL_NV_primitive_shading_rate" supported="gl|glcore|gles2">
+            <require>
+                <enum name="GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV"/>
+                <enum name="GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV"/>
+            </require>
+        </extension>
         <extension name="GL_NV_query_resource" supported="gl">
             <require>
                 <enum name="GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV"/>
@@ -51094,6 +51105,11 @@
                 <command name="glTexEstimateMotionRegionsQCOM"/>
             </require>
         </extension>
+        <extension name="GL_QCOM_frame_extrapolation" supported="gles2">
+            <require>
+                <command name="glExtrapolateTex2DQCOM"/>
+            </require>
+        </extension>
         <extension name="GL_QCOM_texture_foveated" supported="gles2">
             <require>
                 <enum name="GL_FOVEATION_ENABLE_BIT_QCOM"/>