Add the tools from http://dev.w3.org/cvsweb/SVG/tools/ that are necessary to build the initial import of the spec to the svg2 repository. r=WG.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/LICENSE	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,201 @@
+                                  Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/NOTICE	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,18 @@
+Apache Batik
+Copyright 1999-2007 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This software contains code from the World Wide Web Consortium (W3C) for the 
+Document Object Model API (DOM API) and SVG Document Type Definition (DTD).
+
+This software contains code from the International Organisation for
+Standardization for the definition of character entities used in the software's
+documentation.
+
+This product includes images from the Tango Desktop Project
+(http://tango.freedesktop.org/).
+
+This product includes images from the Pasodoble Icon Theme
+(http://www.jesusda.com/projects/pasodoble).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/README	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,77 @@
+
+                  A  P  A  C  H  E     B  A  T  I  K
+
+  What is it?
+  -----------
+
+  Batik is a Java based toolkit for applications which handle
+  images in the Scalable Vector Graphics (SVG) format for
+  various purposes, such as viewing, generation or
+  manipulation. 
+
+  The project's ambition is to give developers a set of core
+  modules which can be used together or individually to
+  support specific SVG solutions. Examples of modules are
+  an SVG parser, an SVG generator and an SVG DOM
+  implementation. Another ambition of the Batik project is to
+  make it highly extensible (for example, Batik allows the
+  developer to handle custom SVG tags). Even though the
+  goal of the project is to provide a set of core modules, one
+  of the deliveries is a full fledged SVG Viewer
+  implementation which validates the various modules and
+  their inter-operability. 
+
+  In a nutshell, Batik provides building blocks that developers
+  can assemble in various ways in their Java technology
+  applications to generate, parse, view or convert SVG
+  contents. For example, Batik contains a Swing component
+  that can add SVG viewing capability to all Java technology
+  applications. Batik can also be used to generate SVG on a
+  client or on a server, and Batik can convert SVG content
+  into other formats such as JPEG or PNG. Batik's goal is to
+  make it easy for application developers to handle SVG
+  content for various purposes, client-side or server-side.
+
+
+  Where is it?
+  ------------
+
+  The home page for the Apache Batik project can be found in the Apache XML 
+  Project web site (http://xmlgraphics.apache.org/batik/). There you also find 
+  information on how to download the latest release as well as all the other 
+  information you might need regarding this project.
+
+
+  Requirements
+  ------------
+
+   o  A Java 1.3 or later compatible virtual machine for your operating system.
+
+  Optional Libraries
+  ------------------
+
+  By default, Batik includes a scripting engine for ECMAScript. It is possible
+  to add support for additional scripting languages (Python and TCL).
+  
+  See http://xmlgraphics.apache.org/batik/install.html#optionalComponents for
+  details.
+ 
+  Installation Instructions and Documentation
+  -------------------------------------------
+
+  Read the Install page at http://xmlgraphics.apache.org/batik/install.html
+  for the installation instructions.
+
+  Look for the most updated documentation on the Apache Batik web site under
+  the Apache XML Graphics Project (http://xmlgraphics.apache.org/batik/).
+
+
+  Licensing and legal issues
+  --------------------------
+
+  For legal and licensing issues, please read the LICENSE and NOTICE files.
+
+  Thanks for using Apache Batik.
+
+                                           The Apache XML Graphics Project
+                                           http://xmlgraphics.apache.org/
Binary file batik/batik-rasterizer.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.dom-documentation.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,86 @@
+xml-commons/java/external/LICENSE.dom-documentation.txt $Id: LICENSE.dom-documentation.txt,v 1.1 2009/10/16 05:20:47 agrasso Exp $
+
+
+This license came from: http://www.w3.org/Consortium/Legal/copyright-documents-19990405
+
+
+W3C® DOCUMENT NOTICE AND LICENSE
+Copyright © 1994-2001 World
+Wide Web Consortium, <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a href=
+"http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a href=
+"http://www.keio.ac.jp/">Keio University</a>). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+Public documents on the W3C site are provided by the copyright
+holders under the following license. The software or Document Type 
+Definitions (DTDs) associated with W3C specifications are governed
+by the Software Notice. By using and/or copying this document, or the
+W3C document from which this statement is linked, you (the
+licensee) agree that you have read, understood, and will comply
+with the following terms and conditions:
+
+Permission to use, copy, and distribute the contents of this
+document, or the W3C document from which this statement is linked,
+in any medium for any purpose and without fee or royalty is hereby
+granted, provided that you include the following on ALL
+copies of the document, or portions thereof, that you use:
+
+A link or URL to the original W3C document.
+
+The pre-existing copyright notice of the original author, or if
+it doesn't exist, a notice of the form: "Copyright © [$date-of-document] World Wide Web
+Consortium, (Massachusetts
+Institute of Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio
+University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but a
+textual representation is permitted.)
+
+If it exists, the STATUS of the W3C document.
+
+When space permits, inclusion of the full text of this NOTICE 
+should be provided. We request that authorship
+attribution be provided in any software, documents, or other items
+or products that you create pursuant to the implementation of the
+contents of this document, or any portion thereof.
+
+No right to create modifications or derivatives of W3C documents
+is granted pursuant to this license. However, if additional 
+requirements (documented in the Copyright
+FAQ) are satisfied, the right to create modifications or
+derivatives is sometimes granted by the W3C to individuals
+complying with those requirements.
+
+THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
+REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT
+NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS
+OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE
+IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS
+THEREOF.
+
+The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to this document or its
+contents without specific, written prior permission. Title to
+copyright in this document will at all times remain with copyright
+holders.
+
+----------------------------------------------------------------------------
+This formulation of W3C's notice and license became active on
+April 05 1999 so as to account for the treatment of DTDs, schema's and 
+bindings. See the older formulation for the policy prior to this date. 
+Please see
+our Copyright FAQ for common questions
+about using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. 
+Other questions about this notice can be directed to site-policy@w3.org.
+
+webmaster
+(last updated by reagle on 1999/04/99.)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.dom-software.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,74 @@
+xml-commons/java/external/LICENSE.dom-software.txt $Id: LICENSE.dom-software.txt,v 1.1 2009/10/16 05:20:47 agrasso Exp $
+
+
+This license came from: http://www.w3.org/Consortium/Legal/copyright-software-19980720
+
+
+W3C® SOFTWARE NOTICE AND LICENSE
+Copyright © 1994-2001 World
+Wide Web Consortium, <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a href=
+"http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a href=
+"http://www.keio.ac.jp/">Keio University</a>). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:
+Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,  for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:
+
+The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.
+
+Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of
+Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/"
+
+Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide 
+URIs to the location from which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.
+____________________________________
+This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the older formulation for the
+policy prior to this date. Please see our Copyright FAQ for common 
+questions about using materials from
+our site, including specific terms and conditions for packages like
+libwww, Amaya, and Jigsaw. 
+Other questions about this notice can be
+directed to site-policy@w3.org.
+
+webmaster
+(last updated $Date: 2009/10/16 05:20:47 $)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.js.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,890 @@
+This distribution includes a binary distribution of Mozilla Rhino 1.6 release 5
+plus one patch.
+
+You can get the unpatched 1.6R5 release of Rhino from the following URL:
+
+  ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R5.zip
+
+To obtain the source code for the 1.6R5 release of Rhino, issue the following
+commands:
+
+  cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot \
+    co -D2006-11-20 mozilla/js/rhino
+
+The patch is available here:
+
+  https://bugzilla.mozilla.org/attachment.cgi?id=252418
+
+which is attached to this bug:
+
+  https://bugzilla.mozilla.org/show_bug.cgi?id=367627
+
+Rhino is licensed under both the MPL (Mozilla Public License) 1.1 and the
+GPL (GNU General Public License) 2.0, which are duplicated below.
+
+The Rhino jar also includes four classes:
+  org.mozilla.javascript.tools.debugger.downloaded.AbstractCellEditor.java
+  org.mozilla.javascript.tools.debugger.downloaded.JTreeTable.java
+  org.mozilla.javascript.tools.debugger.downloaded.TreeTableModel.java
+  org.mozilla.javascript.tools.debugger.downloaded.TreeTableModelAdapter.java
+Which come from:
+  http://java.sun.com/products/jfc/tsc/articles/treetable2
+
+Under the following license:
+
+Code sample
+License
+Copyright 1994-2006 Sun Microsystems, Inc. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ 
+
+    * Redistribution of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistribution in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+
+ 
+Neither the name of Sun Microsystems, Inc. or the names of
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+ 
+This software is provided "AS IS," without a warranty of any kind. ALL
+EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ 
+You acknowledge that this software is not designed, licensed or
+intended for use in the design, construction, operation or maintenance
+of any nuclear facility.
+
+
+
+==============================================================================
+
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
+
+==============================================================================
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+==============================================================================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.pdf-transcoder.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,2 @@
+The pdf-transcoder.jar file is licensed under the Apache License 2.0, which
+can be found in the distribution root directory in the LICENSE file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.sax.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,23 @@
+xml-commons/java/external/LICENSE.sax.txt $Id: LICENSE.sax.txt,v 1.1 2009/10/16 05:20:47 agrasso Exp $
+
+
+This license came from: http://www.megginson.com/SAX/copying.html
+  However please note future versions of SAX may be covered 
+  under http://saxproject.org/?selected=pd
+
+
+This page is now out of date -- see the new SAX site at 
+http://www.saxproject.org/ for more up-to-date
+releases and other information. Please change your bookmarks.
+
+
+SAX2 is Free!
+
+I hereby abandon any property rights to SAX 2.0 (the Simple API for
+XML), and release all of the SAX 2.0 source code, compiled code, and
+documentation contained in this distribution into the Public Domain.
+SAX comes with NO WARRANTY or guarantee of fitness for any
+purpose.
+
+David Megginson, david@megginson.com
+2000-05-05
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.xalan-2.6.0.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,2 @@
+The xalan-2.6.0.jar file is licensed under the Apache License 2.0, which
+can be found in the distribution root directory in the LICENSE file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/LICENSE.xerces_2_5_0.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,60 @@
+The xerces_2_5_0.jar file comes from the Apache Xerces project
+(http://xmlapache.org/dist/xerces-j/), and is licensed under the
+Apache Software License, Version 1.1, which is reproduced below.
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.js.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,23 @@
+This distribution includes a binary distribution of Mozilla Rhino 1.6 release 5
+plus one patch.
+
+You can get the unpatched 1.6R5 release of Rhino from the following URL:
+
+  ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R5.zip
+
+To obtain the source code for the 1.6R5 release of Rhino, issue the following
+commands:
+
+  cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot \
+    co -D2006-11-20 mozilla/js/rhino
+
+The patch is available here:
+
+  https://bugzilla.mozilla.org/attachment.cgi?id=252418
+
+which is attached to this bug:
+
+  https://bugzilla.mozilla.org/show_bug.cgi?id=367627
+
+Rhino is licensed under both the MPL (Mozilla Public License) 1.1 and the
+GPL (GNU General Public License) 2.0, which are in the LICENSE.js.txt file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.pdf-transcoder.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,8 @@
+The pdf-transcoder.jar file is built from the Apache FOP project
+(http://xmlgraphics.apache.org/fop), version 0.90alpha1.
+
+This is only needed if you want to transcode to PDF, otherwise it can
+be removed.
+
+The pdf-transcoder.jar file is licensed under the Apache License 2.0, which
+can be found in the distribution root directory in the LICENSE file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.xalan-2.6.0.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,4 @@
+The xalan-2.6.0.jar file comes from the Apache Xalan project
+(http://xml.apache.org/xalan-j/), and is licensed under the
+Apache License 2.0, which can be found in the distribution root directory
+in the LICENSE file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.xerces_2_5_0.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,4 @@
+The xerces_2_5_0.jar file comes from the Apache Xerces project
+(http://xml.apache.org/dist/xerces-j/), and is licensed under the
+Apache Software License, Version 1.1, which is in the
+LICENSE.xerces_2_5_0.txt file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.xml-apis-ext.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,19 @@
+This distribution includes xml-apis-ext.jar from the XML Commons External
+1.3.04 binary distribution, which can also be obtained from:
+
+  http://xml.apache.org/mirrors.cgi
+
+Source code is available from the XML Commons web site:
+
+  http://xml.apache.org/commons/
+
+xml-apis-ext.jar contains:
+
+  - SAC 1.3
+  - SMIL Java bindings
+  - SVG 1.1 Java bindings
+
+SAC 1.3, the SMIL Java bindings and the SVG 1.1 Java bindings are licensed
+under the W3C Software License.  Related documentation is licensed under the
+W3C Document License.  See LICENSE.dom-software.txt and
+LICENSE.dom-documentation.txt.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/batik/lib/README.xml-apis.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,30 @@
+This distribution includes xml-apis.jar from the XML Commons External
+1.3.04 binary distribution, which can also be obtained from:
+
+  http://xml.apache.org/mirrors.cgi
+
+Source code is available from the XML Commons web site:
+
+  http://xml.apache.org/commons/
+
+xml-apis.jar contains:
+
+  - DOM Level 2 Events
+  - DOM Level 2 HTML
+  - DOM Level 2 Style
+  - DOM Level 2 Traversal and Range
+  - DOM Level 2 Views
+  - DOM Level 3 Core
+  - DOM Level 3 Load and Save
+  - DOM Level 3 XPath
+  - JAXP 1.3 (JSR 206)
+  - SAX
+
+All DOM code is licensed under the W3C Software License, and DOM documentation
+under the W3C Document License.  See LICENSE.dom-software.txt and
+LICENSE.dom-documentation.txt.
+
+The JAXP 1.3 code is licensed under the Apache Software License 2.0, which is
+in the LICENSE in the root directory of this distribution.
+
+SAX is public domain.  See LICENSE.sax.txt.
Binary file batik/lib/batik-anim.jar has changed
Binary file batik/lib/batik-awt-util.jar has changed
Binary file batik/lib/batik-bridge.jar has changed
Binary file batik/lib/batik-codec.jar has changed
Binary file batik/lib/batik-css.jar has changed
Binary file batik/lib/batik-dom.jar has changed
Binary file batik/lib/batik-ext.jar has changed
Binary file batik/lib/batik-gvt.jar has changed
Binary file batik/lib/batik-parser.jar has changed
Binary file batik/lib/batik-script.jar has changed
Binary file batik/lib/batik-svg-dom.jar has changed
Binary file batik/lib/batik-transcoder.jar has changed
Binary file batik/lib/batik-util.jar has changed
Binary file batik/lib/batik-xml.jar has changed
Binary file batik/lib/js.jar has changed
Binary file batik/lib/pdf-transcoder.jar has changed
Binary file batik/lib/xalan-2.6.0.jar has changed
Binary file batik/lib/xerces_2_5_0.jar has changed
Binary file batik/lib/xml-apis-ext.jar has changed
Binary file batik/lib/xml-apis.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlparser/README	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,1 @@
+This is idlparser.jar built from sources at http://svn.mcc.id.au/svn/idlparser/ (r1712).
Binary file idlparser/idlparser.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/LICENSE.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,19 @@
+Copyright (c) 2005 by Nikolai Grigoriev.
+
+Permission is hereby granted, free of charge, to any person obtaining 
+a copy of this software and associated documentation files (the "Software"), 
+to deal in the Software without restriction, including without limitation 
+the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+and/or sell copies of the Software, and to permit persons to whom the 
+Software is furnished to do so, subject to the following conditions: 
+
+The above copyright notice and this permission notice shall be included in 
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
+IN THE SOFTWARE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/README.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,21 @@
+ATTENTION: YOU MUST CONFIGURE THE FONTS BEFORE USING SVGMATH!
+
+See the file "configuration.txt" in the "doc" subdirectory
+for instructions on how to configure fonts for SVGMath.
+
+See the file "usage.txt" in the "doc" subdirectory 
+for usage instructions and API description.
+
+See the file "mathml-coverage.txt" in the "doc" subdirectory 
+for characterization of the MathML subset covered by SVGMath.
+
+See the file "release-notes.txt" in the "doc" subdirectory 
+for the list of bugs fixed and features added in each version.
+
+SVGMath is released under MIT open-source license. See the file 
+"LICENSE.txt" for full licensing info.
+
+Please send questions, comments, bug reports, and feature requests
+to the author, Nikolai Grigoriev <svgmath@grigoriev.ru>
+
+
Binary file math/fonts/DejaVuSerif-Bold.ttf has changed
Binary file math/fonts/DejaVuSerif-BoldItalic.ttf has changed
Binary file math/fonts/DejaVuSerif-Italic.ttf has changed
Binary file math/fonts/DejaVuSerif.ttf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/math2svg.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+
+"""Command-line tool to replace MathML with SVG throughout a document.
+
+Replaces all instances of MathML throughout the document"""
+
+import getopt, sys, os.path
+from xml import sax
+# from xml.sax.saxutils import XMLGenerator
+from svgmath.tools.saxtools import XMLGenerator, ContentFilter
+from svgmath.mathhandler import MathHandler, MathNS, MathEntityResolver
+
+def open_or_die(fname, fmode, role):        
+    try: return open(fname, fmode)
+    except IOError, xcpt: 
+        print "Cannot open %s file '%s': %s" % (role, fname, str(xcpt))
+        sys.exit(1)
+
+def usage():
+    sys.stderr.write("""
+Usage: math2svg.py [options] FILE
+Replaces MathML formulae in a document by SVG images. Argument is a file name.
+
+Options:
+    -h, --help               display this synopsis and exit
+    -s, --standalone         treat input as a standalone MathML document
+    -o FILE, --output=FILE   write results to FILE instead of stdout
+    -c FILE, --config=FILE   read configuration from FILE
+    -e ENC,  --encoding=ENC  produce output in ENC encoding
+""")  
+
+class MathFilter (ContentFilter):
+    def __init__(self, out, mathout):
+        ContentFilter.__init__(self, out)
+        self.plainOutput = out
+        self.mathOutput = mathout
+        self.depth = 0
+
+    # ContentHandler methods
+    def setDocumentLocator(self, locator):
+        self.plainOutput.setDocumentLocator(locator)
+        self.mathOutput.setDocumentLocator(locator)
+
+    def startElementNS(self, elementName, qName, attrs):
+        if self.depth == 0:
+            (namespace, localName) = elementName
+            if namespace == MathNS:
+                self.output = self.mathOutput
+                self.depth = 1
+        else: self.depth += 1
+        ContentFilter.startElementNS(self, elementName, qName, attrs)
+
+    def endElementNS(self, elementName, qName):
+        ContentFilter.endElementNS(self, elementName, qName)
+        if self.depth > 0:
+            self.depth -= 1
+            if self.depth == 0:
+                self.output = self.plainOutput
+
+def main():
+    try:
+        (opts, args) = getopt.getopt(sys.argv[1:], "c:e:ho:s", ["config=", "encoding=", "help", "output=", "standalone"])
+    except getopt.GetoptError:
+        usage(); sys.exit(2)
+    
+    outputfile = None
+    configfile = None
+    encoding = 'utf-8'
+    standalone = False
+  
+    for o, a in opts:
+        if o in ("-h", "--help"):       usage(); sys.exit(0)
+        if o in ("-o", "--output"):     outputfile = a
+        if o in ("-c", "--config"):     configfile = a
+        if o in ("-e", "--encoding"):   encoding = a
+        if o in ("-s", "--standalone"): standalone = True
+     
+    # Check input
+    if len(args) < 1:
+        sys.stderr.write ("No input file specified!\n")
+        usage(); sys.exit(1)        
+    elif len(args) > 1: 
+        sys.stderr.write("WARNING: extra command line arguments ignored\n")
+
+    source = open_or_die(args[0], "rb", "input") 
+        
+    # Determine output destination
+    if outputfile is None: 
+        output = sys.stdout 
+    else: 
+        output = open_or_die(outputfile, "wb", "output") 
+  
+    # Determine config file location
+    if configfile is None:
+        configfile = os.path.join(os.path.dirname(__file__), "svgmath.xml")
+    config = open_or_die(configfile, "rb", "configuration")    
+
+    # Create the converter as a content handler. 
+    saxoutput = XMLGenerator(output, encoding)
+    handler = MathHandler(saxoutput, config)
+    if not standalone:
+        handler = MathFilter(saxoutput, handler)
+    
+    # Parse input file
+    exitcode = 0
+    try:
+        parser = sax.make_parser()
+        parser.setFeature(sax.handler.feature_namespaces, 1)
+	parser.setEntityResolver(MathEntityResolver())
+        parser.setContentHandler(handler)
+        parser.parse(source)
+    except sax.SAXException, xcpt:
+        print "Error parsing input file %s: %s" % (args[0], xcpt.getMessage())
+        exitcode = 1
+    source.close()
+    if outputfile is not None:
+        output.close()
+    sys.exit(exitcode)
+    
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/mathml2.dtd	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,4503 @@
+<!-- MathML 2.0 DTD  ....................................................... -->
+<!-- file: mathml2.dtd
+-->
+
+<!-- MathML 2.0 DTD
+
+     This is the Mathematical Markup Language (MathML) 2.0, an XML
+     application for describing mathematical notation and capturing
+     both its structure and content.
+
+     Copyright © 1998-2003 W3C® (MIT, ERCIM, Keio), All Rights 
+     Reserved. W3C liability, trademark, document use and software
+     licensing rules apply. 
+
+     Permission to use, copy, modify and distribute the MathML 2.0 DTD and
+     its accompanying documentation for any purpose and without fee is
+     hereby granted in perpetuity, provided that the above copyright notice
+     and this paragraph appear in all copies.  The copyright holders make
+     no representation about the suitability of the DTD for any purpose.
+
+     It is provided "as is" without expressed or implied warranty.
+
+        Revision:   $Id: mathml2.dtd,v 1.1 2009/09/02 07:51:45 cmccorma Exp $
+
+     This entity may be identified by the PUBLIC and SYSTEM identifiers:
+
+       PUBLIC "-//W3C//DTD MathML 2.0//EN"
+       SYSTEM "mathml2.dtd"
+
+     Revisions: editor and revision history at EOF
+-->
+<!-- Entity used to enable marked sections which enforces stricter		
+     checking of MathML syntax rules		
+-->
+<!ENTITY % MathMLstrict "IGNORE">		
+
+
+
+<!-- ....................................................................... -->
+<!-- MathML Qualified Names Module  ........................................ -->
+<!-- file: mathml2-qname-1.mod
+
+     This is the Mathematical Markup Language (MathML) 2.0, an XML 
+     application for describing mathematical notation and capturing 
+     both its structure and content.
+
+     Copyright 1998-2000 W3C (MIT, INRIA, Keio), All Rights Reserved.
+     Revision: $Id: mathml2.dtd,v 1.1 2009/09/02 07:51:45 cmccorma Exp $ 
+
+     This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+       PUBLIC "-//W3C//ENTITIES MathML 2.0 Qualified Names 1.0//EN"
+       SYSTEM "mathml2-qname-1.mod"
+
+     Revisions:
+     (none)
+     ....................................................................... -->
+
+<!-- MathML Qualified Names
+
+     This module is contained in two parts, labeled Section 'A' and 'B':
+
+       Section A declares parameter entities to support namespace-
+       qualified names, namespace declarations, and name prefixing 
+       for MathML.
+    
+       Section B declares parameter entities used to provide
+       namespace-qualified names for all MathML element types.
+
+     This module is derived from the XHTML Qualified Names Template module.
+-->
+
+<!-- Section A: XHTML XML Namespace Framework :::::::::::::::::::: -->
+
+<!ENTITY % NS.prefixed     "IGNORE" >
+<!ENTITY % MATHML.prefixed "%NS.prefixed;" >
+
+<!-- XLink ............... -->
+
+<!ENTITY % XLINK.prefix         "xlink" >		
+<!ENTITY % XLINK.xmlns "http://www.w3.org/1999/xlink" >
+<!ENTITY % XLINK.xmlns.attrib
+     "xmlns:%XLINK.prefix;  CDATA           #FIXED '%XLINK.xmlns;'"
+>
+
+<!-- W3C XML Schema ............... -->
+
+<!ENTITY % Schema.prefix         "xsi" >		
+<!ENTITY % Schema.xmlns "http://www.w3.org/2001/XMLSchema-instance" >
+<!ENTITY % Schema.xmlns.attrib
+     "xmlns:%Schema.prefix;  CDATA           #IMPLIED"
+>
+
+<!-- MathML .............. -->
+
+<!ENTITY % MATHML.xmlns    "http://www.w3.org/1998/Math/MathML" >
+<!ENTITY % MATHML.prefix   "m" >
+<![%MATHML.prefixed;[
+<!ENTITY % MATHML.xmlns.extra.attrib  "" >
+]]>
+<!ENTITY % MATHML.xmlns.extra.attrib 
+     "%XLINK.xmlns.attrib; 
+      %Schema.xmlns.attrib;" >
+
+<![%MATHML.prefixed;[
+<!ENTITY % MATHML.pfx  "%MATHML.prefix;:" >
+<!ENTITY % MATHML.xmlns.attrib
+     "xmlns:%MATHML.prefix;  CDATA   #FIXED '%MATHML.xmlns;'
+      %MATHML.xmlns.extra.attrib;"
+>
+]]>
+<!ENTITY % MATHML.pfx  "" >
+<!ENTITY % MATHML.xmlns.attrib
+     "xmlns        CDATA           #FIXED '%MATHML.xmlns;'
+      %MATHML.xmlns.extra.attrib;"
+>
+
+<![%NS.prefixed;[
+<!ENTITY % XHTML.xmlns.extra.attrib 
+     "%MATHML.xmlns.attrib;" >
+]]>
+<!ENTITY % XHTML.xmlns.extra.attrib
+     "%XLINK.xmlns.attrib;
+      %Schema.xmlns.attrib;"
+>
+
+<!-- Section B: MathML Qualified Names ::::::::::::::::::::::::::::: -->
+
+<!-- 9. This section declares parameter entities used to provide
+        namespace-qualified names for all MathML element types.
+-->
+
+<!ENTITY % abs.qname            "%MATHML.pfx;abs" >
+<!ENTITY % and.qname            "%MATHML.pfx;and" >
+<!ENTITY % annotation-xml.qname "%MATHML.pfx;annotation-xml" >
+<!ENTITY % annotation.qname     "%MATHML.pfx;annotation" >
+<!ENTITY % apply.qname          "%MATHML.pfx;apply" >
+<!ENTITY % approx.qname         "%MATHML.pfx;approx" >
+<!ENTITY % arccos.qname         "%MATHML.pfx;arccos" >
+<!ENTITY % arccosh.qname        "%MATHML.pfx;arccosh" >
+<!ENTITY % arccosh.qname        "%MATHML.pfx;arccosh" >
+<!ENTITY % arccot.qname         "%MATHML.pfx;arccot" >
+<!ENTITY % arccoth.qname        "%MATHML.pfx;arccoth" >
+<!ENTITY % arccsc.qname         "%MATHML.pfx;arccsc" >
+<!ENTITY % arccsch.qname        "%MATHML.pfx;arccsch" >
+<!ENTITY % arcsec.qname         "%MATHML.pfx;arcsec" >
+<!ENTITY % arcsech.qname        "%MATHML.pfx;arcsech" >
+<!ENTITY % arcsin.qname         "%MATHML.pfx;arcsin" >
+<!ENTITY % arcsinh.qname        "%MATHML.pfx;arcsinh" >
+<!ENTITY % arctan.qname         "%MATHML.pfx;arctan" >
+<!ENTITY % arctanh.qname        "%MATHML.pfx;arctanh" >
+<!ENTITY % arg.qname            "%MATHML.pfx;arg" >
+<!ENTITY % bvar.qname           "%MATHML.pfx;bvar" >
+<!ENTITY % card.qname           "%MATHML.pfx;card" >
+<!ENTITY % cartesianproduct.qname "%MATHML.pfx;cartesianproduct" >
+<!ENTITY % ceiling.qname         "%MATHML.pfx;ceiling" >
+<!ENTITY % ci.qname             "%MATHML.pfx;ci" >
+<!ENTITY % cn.qname             "%MATHML.pfx;cn" >
+<!ENTITY % codomain.qname       "%MATHML.pfx;codomain" >
+<!ENTITY % complexes.qname      "%MATHML.pfx;complexes" >
+<!ENTITY % compose.qname        "%MATHML.pfx;compose" >
+<!ENTITY % condition.qname      "%MATHML.pfx;condition" >
+<!ENTITY % conjugate.qname      "%MATHML.pfx;conjugate" >
+<!ENTITY % cos.qname            "%MATHML.pfx;cos" >
+<!ENTITY % cosh.qname           "%MATHML.pfx;cosh" >
+<!ENTITY % cot.qname            "%MATHML.pfx;cot" >
+<!ENTITY % coth.qname           "%MATHML.pfx;coth" >
+<!ENTITY % csc.qname            "%MATHML.pfx;csc" >
+<!ENTITY % csch.qname           "%MATHML.pfx;csch" >
+<!ENTITY % csymbol.qname        "%MATHML.pfx;csymbol" >
+<!ENTITY % curl.qname           "%MATHML.pfx;curl" >
+<!ENTITY % declare.qname        "%MATHML.pfx;declare" >
+<!ENTITY % degree.qname         "%MATHML.pfx;degree" >
+<!ENTITY % determinant.qname    "%MATHML.pfx;determinant" >
+<!ENTITY % diff.qname           "%MATHML.pfx;diff" >
+<!ENTITY % divergence.qname     "%MATHML.pfx;divergence" >
+<!ENTITY % divide.qname         "%MATHML.pfx;divide" >
+<!ENTITY % domain.qname         "%MATHML.pfx;domain" >
+<!ENTITY % domainofapplication.qname "%MATHML.pfx;domainofapplication" >
+<!ENTITY % emptyset.qname       "%MATHML.pfx;emptyset" >
+<!ENTITY % eq.qname             "%MATHML.pfx;eq" >
+<!ENTITY % equivalent.qname     "%MATHML.pfx;equivalent" >
+<!ENTITY % eulergamma.qname     "%MATHML.pfx;eulergamma" >
+<!ENTITY % exists.qname         "%MATHML.pfx;exists" >
+<!ENTITY % exp.qname            "%MATHML.pfx;exp" >
+<!ENTITY % exponentiale.qname   "%MATHML.pfx;exponentiale" >
+<!ENTITY % factorial.qname      "%MATHML.pfx;factorial" >
+<!ENTITY % factorof.qname       "%MATHML.pfx;factorof" >
+<!ENTITY % false.qname          "%MATHML.pfx;false" >
+<!ENTITY % floor.qname          "%MATHML.pfx;floor" >
+<!ENTITY % fn.qname             "%MATHML.pfx;fn" >
+<!ENTITY % forall.qname         "%MATHML.pfx;forall" >
+<!ENTITY % gcd.qname            "%MATHML.pfx;gcd" >
+<!ENTITY % geq.qname            "%MATHML.pfx;geq" >
+<!ENTITY % grad.qname           "%MATHML.pfx;grad" >
+<!ENTITY % gt.qname             "%MATHML.pfx;gt" >
+<!ENTITY % ident.qname          "%MATHML.pfx;ident" >
+<!ENTITY % image.qname          "%MATHML.pfx;image" >
+<!ENTITY % imaginary.qname      "%MATHML.pfx;imaginary" >
+<!ENTITY % imaginaryi.qname     "%MATHML.pfx;imaginaryi" >
+<!ENTITY % implies.qname        "%MATHML.pfx;implies" >
+<!ENTITY % in.qname             "%MATHML.pfx;in" >
+<!ENTITY % infinity.qname       "%MATHML.pfx;infinity" >
+<!ENTITY % int.qname            "%MATHML.pfx;int" >
+<!ENTITY % integers.qname       "%MATHML.pfx;integers" >
+<!ENTITY % intersect.qname      "%MATHML.pfx;intersect" >
+<!ENTITY % interval.qname       "%MATHML.pfx;interval" >
+<!ENTITY % inverse.qname        "%MATHML.pfx;inverse" >
+<!ENTITY % lambda.qname         "%MATHML.pfx;lambda" >
+<!ENTITY % laplacian.qname      "%MATHML.pfx;laplacian" >
+<!ENTITY % lcm.qname            "%MATHML.pfx;lcm" >
+<!ENTITY % leq.qname            "%MATHML.pfx;leq" >
+<!ENTITY % limit.qname          "%MATHML.pfx;limit" >
+<!ENTITY % list.qname           "%MATHML.pfx;list" >
+<!ENTITY % ln.qname             "%MATHML.pfx;ln" >
+<!ENTITY % log.qname            "%MATHML.pfx;log" >
+<!ENTITY % logbase.qname        "%MATHML.pfx;logbase" >
+<!ENTITY % lowlimit.qname       "%MATHML.pfx;lowlimit" >
+<!ENTITY % lt.qname             "%MATHML.pfx;lt" >
+<!ENTITY % maction.qname        "%MATHML.pfx;maction" >
+<!ENTITY % maligngroup.qname    "%MATHML.pfx;maligngroup" >
+<!ENTITY % malignmark.qname     "%MATHML.pfx;malignmark" >
+<!ENTITY % math.qname           "%MATHML.pfx;math" >
+<!ENTITY % matrix.qname         "%MATHML.pfx;matrix" >
+<!ENTITY % matrixrow.qname      "%MATHML.pfx;matrixrow" >
+<!ENTITY % max.qname            "%MATHML.pfx;max" >
+<!ENTITY % mean.qname           "%MATHML.pfx;mean" >
+<!ENTITY % median.qname         "%MATHML.pfx;median" >
+<!ENTITY % menclose.qname       "%MATHML.pfx;menclose" >
+<!ENTITY % merror.qname         "%MATHML.pfx;merror" >
+<!ENTITY % mfenced.qname        "%MATHML.pfx;mfenced" >
+<!ENTITY % mfrac.qname          "%MATHML.pfx;mfrac" >
+<!ENTITY % mglyph.qname         "%MATHML.pfx;mglyph" >
+<!ENTITY % mi.qname             "%MATHML.pfx;mi" >
+<!ENTITY % min.qname            "%MATHML.pfx;min" >
+<!ENTITY % minus.qname          "%MATHML.pfx;minus" >
+<!ENTITY % mlabeledtr.qname     "%MATHML.pfx;mlabeledtr" >
+<!ENTITY % mmultiscripts.qname  "%MATHML.pfx;mmultiscripts" >
+<!ENTITY % mn.qname             "%MATHML.pfx;mn" >
+<!ENTITY % mo.qname             "%MATHML.pfx;mo" >
+<!ENTITY % mode.qname           "%MATHML.pfx;mode" >
+<!ENTITY % moment.qname         "%MATHML.pfx;moment" >
+<!ENTITY % momentabout.qname    "%MATHML.pfx;momentabout" >
+<!ENTITY % mover.qname          "%MATHML.pfx;mover" >
+<!ENTITY % mpadded.qname        "%MATHML.pfx;mpadded" >
+<!ENTITY % mphantom.qname       "%MATHML.pfx;mphantom" >
+<!ENTITY % mprescripts.qname    "%MATHML.pfx;mprescripts" >
+<!ENTITY % mroot.qname          "%MATHML.pfx;mroot" >
+<!ENTITY % mrow.qname           "%MATHML.pfx;mrow" >
+<!ENTITY % ms.qname             "%MATHML.pfx;ms" >
+<!ENTITY % mspace.qname         "%MATHML.pfx;mspace" >
+<!ENTITY % msqrt.qname          "%MATHML.pfx;msqrt" >
+<!ENTITY % mstyle.qname         "%MATHML.pfx;mstyle" >
+<!ENTITY % msub.qname           "%MATHML.pfx;msub" >
+<!ENTITY % msubsup.qname        "%MATHML.pfx;msubsup" >
+<!ENTITY % msup.qname           "%MATHML.pfx;msup" >
+<!ENTITY % mtable.qname         "%MATHML.pfx;mtable" >
+<!ENTITY % mtd.qname            "%MATHML.pfx;mtd" >
+<!ENTITY % mtext.qname          "%MATHML.pfx;mtext" >
+<!ENTITY % mtr.qname            "%MATHML.pfx;mtr" >
+<!ENTITY % munder.qname         "%MATHML.pfx;munder" >
+<!ENTITY % munderover.qname     "%MATHML.pfx;munderover" >
+<!ENTITY % naturalnumbers.qname "%MATHML.pfx;naturalnumbers" >
+<!ENTITY % neq.qname            "%MATHML.pfx;neq" >
+<!ENTITY % none.qname           "%MATHML.pfx;none" >
+<!ENTITY % not.qname            "%MATHML.pfx;not" >
+<!ENTITY % notanumber.qname     "%MATHML.pfx;notanumber" >
+<!ENTITY % notin.qname          "%MATHML.pfx;notin" >
+<!ENTITY % notprsubset.qname    "%MATHML.pfx;notprsubset" >
+<!ENTITY % notsubset.qname      "%MATHML.pfx;notsubset" >
+<!ENTITY % or.qname             "%MATHML.pfx;or" >
+<!ENTITY % otherwise.qname      "%MATHML.pfx;otherwise" >
+<!ENTITY % outerproduct.qname   "%MATHML.pfx;outerproduct" >
+<!ENTITY % partialdiff.qname    "%MATHML.pfx;partialdiff" >
+<!ENTITY % pi.qname             "%MATHML.pfx;pi" >
+<!ENTITY % piece.qname          "%MATHML.pfx;piece" >
+<!ENTITY % piecewise.qname      "%MATHML.pfx;piecewise" >
+<!ENTITY % plus.qname           "%MATHML.pfx;plus" >
+<!ENTITY % power.qname          "%MATHML.pfx;power" >
+<!ENTITY % primes.qname         "%MATHML.pfx;primes" >
+<!ENTITY % product.qname        "%MATHML.pfx;product" >
+<!ENTITY % prsubset.qname       "%MATHML.pfx;prsubset" >
+<!ENTITY % quotient.qname       "%MATHML.pfx;quotient" >
+<!ENTITY % rationals.qname      "%MATHML.pfx;rationals" >
+<!ENTITY % real.qname           "%MATHML.pfx;real" >
+<!ENTITY % reals.qname          "%MATHML.pfx;reals" >
+<!ENTITY % reln.qname           "%MATHML.pfx;reln" >
+<!ENTITY % rem.qname            "%MATHML.pfx;rem" >
+<!ENTITY % root.qname           "%MATHML.pfx;root" >
+<!ENTITY % scalarproduct.qname  "%MATHML.pfx;scalarproduct" >
+<!ENTITY % sdev.qname           "%MATHML.pfx;sdev" >
+<!ENTITY % sec.qname            "%MATHML.pfx;sec" >
+<!ENTITY % sech.qname           "%MATHML.pfx;sech" >
+<!ENTITY % selector.qname       "%MATHML.pfx;selector" >
+<!ENTITY % semantics.qname      "%MATHML.pfx;semantics" >
+<!ENTITY % sep.qname            "%MATHML.pfx;sep" >
+<!ENTITY % set.qname            "%MATHML.pfx;set" >
+<!ENTITY % setdiff.qname        "%MATHML.pfx;setdiff" >
+<!ENTITY % sin.qname            "%MATHML.pfx;sin" >
+<!ENTITY % sinh.qname           "%MATHML.pfx;sinh" >
+<!ENTITY % subset.qname         "%MATHML.pfx;subset" >
+<!ENTITY % sum.qname            "%MATHML.pfx;sum" >
+<!ENTITY % tan.qname            "%MATHML.pfx;tan" >
+<!ENTITY % tanh.qname           "%MATHML.pfx;tanh" >
+<!ENTITY % tendsto.qname        "%MATHML.pfx;tendsto" >
+<!ENTITY % times.qname          "%MATHML.pfx;times" >
+<!ENTITY % transpose.qname      "%MATHML.pfx;transpose" >
+<!ENTITY % true.qname           "%MATHML.pfx;true" >
+<!ENTITY % union.qname          "%MATHML.pfx;union" >
+<!ENTITY % uplimit.qname        "%MATHML.pfx;uplimit" >
+<!ENTITY % variance.qname       "%MATHML.pfx;variance" >
+<!ENTITY % vector.qname         "%MATHML.pfx;vector" >
+<!ENTITY % vectorproduct.qname  "%MATHML.pfx;vectorproduct" >
+<!ENTITY % xor.qname            "%MATHML.pfx;xor" >
+
+
+<!-- ignores subsequent instantiation of this module when
+     used as external subset rather than module fragment.
+     NOTE: Do not modify this parameter entity, otherwise
+     a recursive parsing situation may result.
+-->
+<!ENTITY % mathml-qname.module "IGNORE" >
+
+<!-- end of template-qname-1.mod -->
+
+
+
+
+<!-- if %NS.prefixed; is INCLUDE, include all NS attributes, 
+     otherwise just those associated with MathML
+-->
+<![%NS.prefixed;[
+  <!ENTITY % MATHML.NamespaceDecl.attrib 
+         "%NamespaceDecl.attrib;"
+>
+]]>
+<!ENTITY % MATHML.NamespaceDecl.attrib 
+     "%MATHML.xmlns.attrib;"
+>
+
+
+<!-- Attributes shared by all elements  .......................... -->
+
+<!ENTITY % MATHML.Common.attrib
+     "%MATHML.NamespaceDecl.attrib;
+      %XLINK.prefix;:href   CDATA           #IMPLIED		
+      %XLINK.prefix;:type   CDATA           #IMPLIED	
+      class        CDATA                    #IMPLIED
+      style        CDATA                    #IMPLIED
+      id           ID                       #IMPLIED
+      xref         IDREF                    #IMPLIED
+      other        CDATA                    #IMPLIED"
+>
+
+<!-- Presentation element set  ................................... -->
+
+<!-- Attribute definitions -->
+
+<!ENTITY % att-fontsize
+     "fontsize     CDATA                    #IMPLIED" >
+<!ENTITY % att-fontweight
+     "fontweight   ( normal | bold )        #IMPLIED" >
+<!ENTITY % att-fontstyle
+     "fontstyle    ( normal | italic )      #IMPLIED" >
+<!ENTITY % att-fontfamily
+     "fontfamily   CDATA                    #IMPLIED" >
+<!ENTITY % att-color
+     "color        CDATA                    #IMPLIED" >
+
+<!-- MathML2 typographically-distinguished symbol attributes -->
+
+<![%MathMLstrict;[
+  <!ENTITY % att-mathvariant
+     "mathvariant     ( normal | bold | italic | bold-italic | double-struck | 
+                        bold-fraktur | script | bold-script | fraktur |
+                        sans-serif | bold-sans-serif | sans-serif-italic |
+                        sans-serif-bold-italic | monospace )
+                                                                   #IMPLIED" >
+]]>
+<!ENTITY % att-mathvariant
+     "mathvariant     CDATA                    #IMPLIED" >
+<!ENTITY % att-mathsize
+     "mathsize     CDATA                    #IMPLIED" >
+<!ENTITY % att-mathcolor
+     "mathcolor     CDATA                    #IMPLIED" >
+<!ENTITY % att-mathbackground
+     "mathbackground     CDATA                    #IMPLIED" >
+
+<!ENTITY % att-fontinfo
+     "%att-fontsize;
+      %att-fontweight;
+      %att-fontstyle;
+      %att-fontfamily;
+      %att-color;
+      %att-mathvariant;
+      %att-mathsize;
+      %att-mathcolor;
+      %att-mathbackground;"
+>
+
+<!ENTITY % att-form
+     "form         ( prefix | infix | postfix )  #IMPLIED" >
+<!ENTITY % att-fence
+     "fence        ( true | false )         #IMPLIED" >
+<!ENTITY % att-separator
+     "separator    ( true | false )         #IMPLIED" >
+<!ENTITY % att-lspace
+     "lspace       CDATA                    #IMPLIED" >
+<!ENTITY % att-rspace
+     "rspace       CDATA                    #IMPLIED" >
+<!ENTITY % att-stretchy
+     "stretchy     ( true | false )         #IMPLIED" >
+<!ENTITY % att-symmetric
+     "symmetric    ( true | false )         #IMPLIED" >
+<!ENTITY % att-maxsize
+     "maxsize      CDATA                    #IMPLIED" >
+<!ENTITY % att-minsize
+     "minsize      CDATA                    #IMPLIED" >
+<!ENTITY % att-largeop
+     "largeop      ( true | false)          #IMPLIED" >
+<!ENTITY % att-movablelimits
+     "movablelimits ( true | false )        #IMPLIED" >
+<!ENTITY % att-accent
+     "accent       ( true | false )         #IMPLIED" >
+
+<!ENTITY % att-opinfo
+     "%att-form;
+      %att-fence;
+      %att-separator;
+      %att-lspace;
+      %att-rspace;
+      %att-stretchy;
+      %att-symmetric;
+      %att-maxsize;
+      %att-minsize;
+      %att-largeop;
+      %att-movablelimits;
+      %att-accent;"
+>
+<!ENTITY % att-width
+     "width        CDATA                    #IMPLIED" >
+<!ENTITY % att-height
+     "height       CDATA                    #IMPLIED" >
+<!ENTITY % att-depth
+     "depth        CDATA                    #IMPLIED" >
+<!ENTITY % att-linebreak
+     "linebreak    CDATA                    #IMPLIED" >
+<!ENTITY % att-sizeinfo
+     "%att-width;
+      %att-height;
+      %att-depth;"
+>
+<!ENTITY % att-lquote               
+     "lquote       CDATA                    #IMPLIED" >
+<!ENTITY % att-rquote               
+     "rquote       CDATA                    #IMPLIED" >
+<!ENTITY % att-linethickness        
+     "linethickness CDATA                   #IMPLIED" >
+<!ENTITY % att-scriptlevel          
+     "scriptlevel  CDATA                    #IMPLIED" >
+<!ENTITY % att-displaystyle         
+     "displaystyle ( true | false )         #IMPLIED" >
+<!ENTITY % att-scriptsizemultiplier 
+     "scriptsizemultiplier CDATA            #IMPLIED" >
+<!ENTITY % att-scriptminsize        
+     "scriptminsize CDATA                   #IMPLIED" >
+<!ENTITY % att-background           
+     "background   CDATA                    #IMPLIED" >
+<!ENTITY % att-veryverythinmathspace           
+     "veryverythinmathspace   CDATA         #IMPLIED" >
+<!ENTITY % att-verythinmathspace           
+     "verythinmathspace   CDATA             #IMPLIED" >
+<!ENTITY % att-thinmathspace           
+     "thinmathspace   CDATA                 #IMPLIED" >
+<!ENTITY % att-mediummathspace           
+     "mediummathspace   CDATA               #IMPLIED" >
+<!ENTITY % att-thickmathspace           
+     "thickmathspace   CDATA                #IMPLIED" >
+<!ENTITY % att-verythickmathspace           
+     "verythickmathspace   CDATA            #IMPLIED" >
+<!ENTITY % att-veryverythickmathspace           
+     "veryverythickmathspace   CDATA        #IMPLIED" >
+<!ENTITY % att-open                 
+     "open         CDATA                    #IMPLIED" >
+<!ENTITY % att-close                
+     "close        CDATA                    #IMPLIED" >
+<!ENTITY % att-separators          
+     "separators   CDATA                    #IMPLIED" >
+<!ENTITY % att-subscriptshift       
+     "subscriptshift CDATA                  #IMPLIED" >
+<!ENTITY % att-superscriptshift     
+     "superscriptshift CDATA                #IMPLIED" >
+<!ENTITY % att-accentunder          
+     "accentunder  ( true | false )         #IMPLIED" >
+<!ENTITY % att-align       
+     "align        CDATA                    #IMPLIED" >
+<![%MathMLstrict;[
+  <!ENTITY % att-numalign	
+     "numalign     ( left | center | right )         #IMPLIED" >
+  <!ENTITY % att-denomalign
+     "denomalign   ( left | center | right )         #IMPLIED" >
+]]>
+<!ENTITY % att-numalign		
+     "numalign        CDATA                    #IMPLIED" >		
+<!ENTITY % att-denomalign		
+     "denomalign        CDATA                    #IMPLIED" >		
+<!ENTITY % att-rowalign-list		
+     "rowalign     CDATA                    #IMPLIED" >		
+<!ENTITY % att-columnalign-list		
+     "columnalign  CDATA                    #IMPLIED" >		
+<![%MathMLstrict;[
+  <!ENTITY % att-rowalign
+     "rowalign     ( top | bottom |	center | baseline | axis )    #IMPLIED" >
+  <!ENTITY % att-columnalign
+     "columnalign  ( left | center | right )        #IMPLIED" >
+]]>
+<!ENTITY % att-rowalign      
+     "rowalign     CDATA                    #IMPLIED" >
+<!ENTITY % att-columnalign     
+     "columnalign  CDATA                    #IMPLIED" >
+<!ENTITY % att-columnwidth   
+     "columnwidth  CDATA                    #IMPLIED" >
+<!ENTITY % att-groupalign-list		
+     "groupalign   CDATA                    #IMPLIED" >		
+<![%MathMLstrict;[
+  <!ENTITY % att-groupalign
+     "groupalign   ( left | right | center | decimalpoint )   #IMPLIED" >
+]]>
+<!ENTITY % att-groupalign      
+     "groupalign   CDATA                    #IMPLIED" >
+<!ENTITY % att-alignmentscope 
+     "alignmentscope CDATA                  #IMPLIED" >
+<!ENTITY % att-rowspacing           
+     "rowspacing   CDATA                    #IMPLIED" >
+<!ENTITY % att-columnspacing      
+     "columnspacing CDATA                   #IMPLIED" >
+<!ENTITY % att-rowlines            
+     "rowlines     CDATA                    #IMPLIED" >
+<!ENTITY % att-columnlines        
+     "columnlines  CDATA                    #IMPLIED" >
+<!ENTITY % att-frame            
+     "frame       ( none | solid | dashed ) #IMPLIED" >
+<!ENTITY % att-side		
+     "side       ( left | right | leftoverlap | rightoverlap ) #IMPLIED" >		
+<!ENTITY % att-framespacing         
+     "framespacing CDATA                    #IMPLIED" >
+<!ENTITY % att-minlabelspacing		
+     "minlabelspacing CDATA                 #IMPLIED" >		
+<![%MathMLstrict;[
+  <!ENTITY % att-equalrows
+     "equalrows    ( true | false )         #IMPLIED" >
+  <!ENTITY % att-equalcolumns
+     "equalcolumns ( true | false )         #IMPLIED" >
+]]>
+<!ENTITY % att-equalrows        
+     "equalrows    CDATA                    #IMPLIED" >
+<!ENTITY % att-equalcolumns         
+     "equalcolumns CDATA                    #IMPLIED" >
+
+<!ENTITY % att-tableinfo            
+     "%att-align;
+      %att-rowalign-list;	
+      %att-columnalign-list;	
+      %att-columnwidth;
+      %att-groupalign-list;	
+      %att-alignmentscope;
+      %att-side;		
+      %att-rowspacing;
+      %att-columnspacing;
+      %att-rowlines;
+      %att-columnlines;
+      %att-width;		
+      %att-frame;
+      %att-framespacing;
+      %att-minlabelspacing;		
+      %att-equalrows;
+      %att-equalcolumns;
+      %att-displaystyle;" 
+>
+
+<!ENTITY % att-rowspan              
+     "rowspan      CDATA                    #IMPLIED" >
+<!ENTITY % att-columnspan           
+     "columnspan   CDATA                    #IMPLIED" >
+<!ENTITY % att-edge        
+     "edge         ( left | right )         #IMPLIED" >
+<!ENTITY % att-actiontype          
+     "actiontype   CDATA                    #IMPLIED" >
+<!ENTITY % att-selection       
+     "selection    CDATA                    #IMPLIED" >
+
+<!ENTITY % att-name                 
+     "name         CDATA                    #IMPLIED" >
+<!ENTITY % att-alt              
+     "alt          CDATA                    #IMPLIED" >
+<!ENTITY % att-index           
+     "index        CDATA                    #IMPLIED" >
+
+<![%MathMLstrict;[
+  <!ENTITY % att-bevelled
+     "bevelled      ( true | false )        #IMPLIED" >
+]]>
+<!ENTITY % att-bevelled       
+     "bevelled      CDATA                    #IMPLIED" >
+
+<!-- Presentation schemata with content -->
+
+<!ENTITY % ptoken                   
+     "%mi.qname; | %mn.qname; | %mo.qname;
+      | %mtext.qname; | %ms.qname;" >
+
+<!ATTLIST %mi.qname;
+      %MATHML.Common.attrib;
+      %att-fontinfo;
+>
+
+<!ATTLIST %mn.qname;      
+      %MATHML.Common.attrib; 
+      %att-fontinfo;
+>
+
+<!ATTLIST %mo.qname;     
+      %MATHML.Common.attrib; 
+      %att-fontinfo;
+      %att-opinfo;
+>
+
+<!ATTLIST %mtext.qname;  
+      %MATHML.Common.attrib;
+      %att-fontinfo;
+>
+
+<!ATTLIST %ms.qname;     
+      %MATHML.Common.attrib;
+      %att-fontinfo;
+      %att-lquote;
+      %att-rquote;
+>
+
+<!-- Empty presentation schemata -->
+
+<!ENTITY % petoken                  
+     "%mspace.qname;" >
+<!ELEMENT %mspace.qname;  EMPTY >
+
+<!ATTLIST %mspace.qname; 
+      %att-sizeinfo;
+      %att-linebreak;
+      %MATHML.Common.attrib;
+>
+
+<!-- Presentation: general layout schemata -->
+
+<!ENTITY % pgenschema               
+     "%mrow.qname; | %mfrac.qname; | %msqrt.qname; | %mroot.qname; 
+      | %menclose.qname; | %mstyle.qname; | %merror.qname; 
+      | %mpadded.qname; | %mphantom.qname; | %mfenced.qname;" >
+
+<!ATTLIST %mrow.qname;        
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %mfrac.qname;     
+      %MATHML.Common.attrib;
+      %att-bevelled;		
+      %att-numalign;		
+      %att-denomalign;		
+      %att-linethickness;
+>
+
+<!ATTLIST %msqrt.qname;     
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %menclose.qname;  
+      %MATHML.Common.attrib;
+      notation CDATA 'longdiv' >
+
+<!ATTLIST %mroot.qname;    
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %mstyle.qname;  
+      %MATHML.Common.attrib;
+      %att-fontinfo;
+      %att-opinfo;
+      %att-lquote;
+      %att-rquote;
+      %att-linethickness;
+      %att-scriptlevel;
+      %att-scriptsizemultiplier;
+      %att-scriptminsize;
+      %att-background;
+      %att-veryverythinmathspace;
+      %att-verythinmathspace;
+      %att-thinmathspace;
+      %att-mediummathspace;
+      %att-thickmathspace;
+      %att-verythickmathspace;
+      %att-veryverythickmathspace;
+      %att-open;
+      %att-close;
+      %att-separators;
+      %att-subscriptshift;
+      %att-superscriptshift;
+      %att-accentunder;
+      %att-tableinfo;
+      %att-rowspan;
+      %att-columnspan;
+      %att-edge;
+      %att-selection;
+      %att-bevelled;	
+      %att-height;		
+      %att-depth;		
+>
+
+<!ATTLIST %merror.qname;   
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %mpadded.qname;     
+      %MATHML.Common.attrib;
+      %att-sizeinfo;
+      %att-lspace;
+>
+
+<!ATTLIST %mphantom.qname;      
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %mfenced.qname;     
+      %MATHML.Common.attrib;
+      %att-open;
+      %att-close;
+      %att-separators;
+>
+
+<!-- Presentation layout schemata: scripts and limits -->
+
+<!ENTITY % pscrschema               
+     "%msub.qname; | %msup.qname; | %msubsup.qname; | %munder.qname; 
+      | %mover.qname; | %munderover.qname; | %mmultiscripts.qname;" >
+
+<!ATTLIST %msub.qname;      
+      %MATHML.Common.attrib;
+      %att-subscriptshift;
+>
+
+<!ATTLIST %msup.qname;         
+      %MATHML.Common.attrib;
+      %att-superscriptshift;
+>
+
+<!ATTLIST %msubsup.qname;    
+      %MATHML.Common.attrib;
+      %att-subscriptshift;
+      %att-superscriptshift;
+>
+
+<!ATTLIST %munder.qname;   
+      %MATHML.Common.attrib;
+      %att-accentunder;
+>
+
+<!ATTLIST %mover.qname;   
+      %MATHML.Common.attrib;
+      %att-accent;
+>
+
+<!ATTLIST %munderover.qname;   
+      %MATHML.Common.attrib;
+      %att-accent;
+      %att-accentunder;
+>
+
+<!ATTLIST %mmultiscripts.qname;   
+      %MATHML.Common.attrib;
+      %att-subscriptshift;
+      %att-superscriptshift;
+>
+
+<!-- Presentation layout schemata: empty elements for scripts -->
+
+<!ENTITY % pscreschema              
+     "%mprescripts.qname; | %none.qname;" >
+
+<!ELEMENT %mprescripts.qname;  EMPTY >
+<!ATTLIST %mprescripts.qname;   
+      %MATHML.xmlns.attrib; >
+
+<!ELEMENT %none.qname;  EMPTY >
+<!ATTLIST %none.qname;    
+      %MATHML.xmlns.attrib; >
+
+<!-- Presentation layout schemata: tables -->
+
+<![%MathMLstrict;[
+<!-- in strict mode only allow mtable at top level.
+     mtr ,mlabledtr and mtd only allowed inside mtable.
+-->
+  <!ENTITY % ptabschema    "%mtable.qname;" >
+]]>
+
+<!ENTITY % ptabschema               
+     "%mtable.qname; | %mtr.qname; | %mlabeledtr.qname; | %mtd.qname;" >
+
+<!ATTLIST %mtable.qname;
+      %MATHML.Common.attrib;
+      %att-tableinfo;
+>
+
+<!ATTLIST %mtr.qname;    
+      %MATHML.Common.attrib;
+      %att-rowalign;
+      %att-columnalign-list;	
+      %att-groupalign-list;	
+>
+
+<!ATTLIST %mlabeledtr.qname;  
+      %MATHML.Common.attrib;
+      %att-rowalign;
+      %att-columnalign-list;	
+      %att-groupalign-list;	
+>
+
+<!ATTLIST %mtd.qname;   
+      %MATHML.Common.attrib;
+      %att-rowalign;
+      %att-columnalign;
+      %att-groupalign-list;	
+      %att-rowspan;
+      %att-columnspan;
+>
+<!ENTITY % plschema                 
+     "%pgenschema; | %pscrschema; | %ptabschema;" >
+
+<!-- Empty presentation layout schemata -->
+
+<!ENTITY % peschema                 
+     "%maligngroup.qname; | %malignmark.qname;" >
+
+<!ELEMENT %malignmark.qname;  EMPTY >
+
+<!ATTLIST %malignmark.qname;  
+      %att-edge; >
+
+<!ELEMENT %maligngroup.qname;  EMPTY >
+<!ATTLIST %maligngroup.qname;  
+      %MATHML.Common.attrib;
+      %att-groupalign;
+>
+
+
+<!ELEMENT %mglyph.qname;  EMPTY >
+<!ATTLIST %mglyph.qname;    
+      %att-alt;
+      %att-fontfamily;
+      %att-index; >
+
+<!-- Presentation action schemata -->
+
+<!ENTITY % pactions                 
+     "%maction.qname;" >
+<!ATTLIST %maction.qname;    
+      %MATHML.Common.attrib;
+      %att-actiontype;
+      %att-selection;
+>
+
+<!-- The following entity for substitution into
+     content constructs excludes elements that
+     are not valid as expressions.
+-->
+
+<!ENTITY % PresInCont               
+     "%ptoken; | %petoken; |
+      %plschema; | %peschema; | %pactions;" >
+
+<!-- Presentation entity: all presentation constructs -->
+
+
+<![%MathMLstrict;[
+<!-- In strict mode don't allow prescripts and none at top level.-->
+  <!ENTITY % Presentation "%PresInCont;">             
+]]>
+<!ENTITY % Presentation             
+     "%ptoken; | %petoken; | %pscreschema; |
+      %plschema; | %peschema; | %pactions;">
+
+<!-- Content element set  ........................................ -->
+
+<!-- Attribute definitions -->
+
+<!ENTITY % att-base                 
+     "base         CDATA                    '10'" >
+<!ENTITY % att-closure              
+     "closure      CDATA                    'closed'" >
+<!ENTITY % att-definition           
+     "definitionURL CDATA                   ''" >
+<!ENTITY % att-encoding             
+     "encoding     CDATA                    ''" >
+<!ENTITY % att-nargs             
+     "nargs        CDATA                    '1'" >
+<!ENTITY % att-occurrence           
+     "occurrence   CDATA                    'function-model'" >
+<!ENTITY % att-order   
+     "order        CDATA                    'numeric'" >
+<!ENTITY % att-scope                
+     "scope        CDATA                    'local'" >
+<!ENTITY % att-type                 
+     "type         CDATA                    #IMPLIED" >
+
+<!-- Content elements: leaf nodes -->
+
+<!ENTITY % ctoken               
+     "%csymbol.qname; | %ci.qname; | %cn.qname;" >
+
+<!ATTLIST %ci.qname;     
+      %MATHML.Common.attrib;
+      %att-type;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ATTLIST %csymbol.qname;   
+      %MATHML.Common.attrib;
+      %att-encoding;
+      %att-type;
+      %att-definition;
+>
+
+<!ATTLIST %cn.qname;    
+      %MATHML.Common.attrib;
+      %att-type;
+      %att-base;
+      %att-definition;
+      %att-encoding;
+>
+
+<!-- Content elements: specials -->
+
+<!ENTITY % cspecial                 
+     "%apply.qname; | %reln.qname; |
+      %lambda.qname;" >
+
+<!ATTLIST %apply.qname;   
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %reln.qname;   
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %lambda.qname;      
+      %MATHML.Common.attrib;
+>
+
+<!-- Content elements: others -->
+
+<!ENTITY % cother                   
+     "%condition.qname; | %declare.qname; | %sep.qname;" >
+
+<!ATTLIST %condition.qname;     
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %declare.qname;    
+      %MATHML.Common.attrib;
+      %att-type;
+      %att-scope;
+      %att-nargs;
+      %att-occurrence;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %sep.qname;  EMPTY >
+<!ATTLIST %sep.qname;         
+      %MATHML.xmlns.attrib; >
+
+<!-- Content elements: semantic mapping -->
+
+<![%MathMLstrict;[
+<!-- in strict mode only allow semantics at top level.
+     annotation and annotation-xml only allowed in semantics
+-->
+  <!ENTITY % csemantics  "%semantics.qname;" >
+]]>
+<!ENTITY % csemantics               
+     "%semantics.qname; | %annotation.qname; |
+      %annotation-xml.qname;" >
+
+<!ATTLIST %semantics.qname;  
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ATTLIST %annotation.qname;  
+      %MATHML.Common.attrib;
+      %att-encoding;
+>
+
+<!ATTLIST %annotation-xml.qname; 
+      %MATHML.Common.attrib;
+      %att-encoding;
+>
+
+<!-- Content elements: constructors -->
+
+<!ENTITY % cconstructor             
+     "%interval.qname; | %list.qname; | %matrix.qname; 
+      | %matrixrow.qname; | %set.qname; | %vector.qname;
+      | %piecewise.qname; " >
+
+<!ATTLIST %interval.qname;   
+      %MATHML.Common.attrib;
+      %att-closure;
+>
+
+<!ATTLIST %set.qname;        
+      %MATHML.Common.attrib;
+      %att-type;
+>
+
+<!ATTLIST %list.qname;          
+      %MATHML.Common.attrib;
+      %att-order;
+>
+
+<!ATTLIST %vector.qname;    
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %matrix.qname;    
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %matrixrow.qname;     
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %piecewise.qname;   
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %piece.qname;   
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %otherwise.qname;   
+      %MATHML.Common.attrib;
+>
+
+
+<!-- Content elements: symbols -->
+
+<!ENTITY % c0ary              
+    "%integers.qname; |
+     %reals.qname; |
+     %rationals.qname; |
+     %naturalnumbers.qname; |
+     %complexes.qname; |
+     %primes.qname; |
+     %exponentiale.qname; |
+     %imaginaryi.qname; |
+     %notanumber.qname; |
+     %true.qname; |
+     %false.qname; |
+     %emptyset.qname; |
+     %pi.qname; |
+     %eulergamma.qname; |
+     %infinity.qname;" >
+
+<!ELEMENT %integers.qname;  EMPTY >
+<!ATTLIST %integers.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %reals.qname;  EMPTY >
+<!ATTLIST %reals.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %rationals.qname;  EMPTY >
+<!ATTLIST %rationals.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %naturalnumbers.qname;  EMPTY >
+<!ATTLIST %naturalnumbers.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %complexes.qname;  EMPTY >
+<!ATTLIST %complexes.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %primes.qname;  EMPTY >
+<!ATTLIST %primes.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %exponentiale.qname;  EMPTY >
+<!ATTLIST %exponentiale.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %imaginaryi.qname;  EMPTY >
+<!ATTLIST %imaginaryi.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %notanumber.qname;  EMPTY >
+<!ATTLIST %notanumber.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %true.qname;  EMPTY >
+<!ATTLIST %true.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %false.qname;  EMPTY >
+<!ATTLIST %false.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %emptyset.qname;  EMPTY >
+<!ATTLIST %emptyset.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %pi.qname;  EMPTY >
+<!ATTLIST %pi.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %eulergamma.qname;  EMPTY >
+<!ATTLIST %eulergamma.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %infinity.qname;  EMPTY >
+<!ATTLIST %infinity.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!-- Content elements: operators -->
+
+<!ENTITY % cfuncop1ary              
+     "%inverse.qname; | %ident.qname;|
+      %domain.qname; |  %codomain.qname; | 
+      %image.qname;  " >
+
+<!ELEMENT %inverse.qname;  EMPTY >
+<!ATTLIST %inverse.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %domain.qname;  EMPTY >
+<!ATTLIST %domain.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %codomain.qname;  EMPTY >
+<!ATTLIST %codomain.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %image.qname;  EMPTY >
+<!ATTLIST %image.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+
+
+<!ENTITY % cfuncopnary              
+     "%fn.qname; | %compose.qname;" >
+
+<!ATTLIST %fn.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %ident.qname;  EMPTY >
+<!ATTLIST %ident.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %compose.qname;  EMPTY >
+<!ATTLIST %compose.qname;  
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % carithop1ary             
+     "%abs.qname; | %conjugate.qname; | %exp.qname; | %factorial.qname; |
+      %arg.qname; | %real.qname; | %imaginary.qname; |
+      %floor.qname; | %ceiling.qname;" >
+
+<!ELEMENT %exp.qname;  EMPTY >
+<!ATTLIST %exp.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %abs.qname;  EMPTY >
+<!ATTLIST %abs.qname;        
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arg.qname;  EMPTY >
+<!ATTLIST %arg.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %real.qname;  EMPTY >
+<!ATTLIST %real.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %imaginary.qname;  EMPTY >
+<!ATTLIST %imaginary.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %conjugate.qname;  EMPTY >
+<!ATTLIST %conjugate.qname;  
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %factorial.qname;  EMPTY >
+<!ATTLIST %factorial.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+
+<!ELEMENT %floor.qname;  EMPTY >
+<!ATTLIST %floor.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %ceiling.qname;  EMPTY >
+<!ATTLIST %ceiling.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+<!ENTITY % carithop1or2ary          
+     "%minus.qname;" >
+
+<!ELEMENT %minus.qname;  EMPTY >
+<!ATTLIST %minus.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % carithop2ary             
+     "%quotient.qname; | %divide.qname; | %power.qname; | %rem.qname;" >
+
+<!ELEMENT %quotient.qname;  EMPTY >
+<!ATTLIST %quotient.qname;       
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %divide.qname;  EMPTY >
+<!ATTLIST %divide.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %power.qname;  EMPTY >
+<!ATTLIST %power.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %rem.qname;  EMPTY >
+<!ATTLIST %rem.qname;       
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % carithopnary             
+     "%plus.qname; | %times.qname; | %max.qname; 
+      | %min.qname; | %gcd.qname; | %lcm.qname;" >
+
+<!ELEMENT %plus.qname;  EMPTY >
+<!ATTLIST %plus.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %max.qname;  EMPTY >
+<!ATTLIST %max.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %min.qname;  EMPTY >
+<!ATTLIST %min.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %times.qname;  EMPTY >
+<!ATTLIST %times.qname;      
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %gcd.qname;  EMPTY >
+<!ATTLIST %gcd.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %lcm.qname;  EMPTY >
+<!ATTLIST %lcm.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % carithoproot             
+     "%root.qname;" >
+
+<!ELEMENT %root.qname;  EMPTY >
+<!ATTLIST %root.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clogicopquant            
+     "%exists.qname; | %forall.qname;" >
+
+<!ELEMENT %exists.qname;  EMPTY >
+<!ATTLIST %exists.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %forall.qname;  EMPTY >
+<!ATTLIST %forall.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clogicopnary             
+     "%and.qname; | %or.qname; | %xor.qname;" >
+
+<!ELEMENT %and.qname;  EMPTY >
+<!ATTLIST %and.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %or.qname;  EMPTY >
+<!ATTLIST %or.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %xor.qname;  EMPTY >
+<!ATTLIST %xor.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clogicop1ary             
+     "%not.qname;" >
+
+<!ELEMENT %not.qname;  EMPTY >
+<!ATTLIST %not.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clogicop2ary             
+     "%implies.qname;" >
+
+<!ELEMENT %implies.qname;  EMPTY >
+<!ATTLIST %implies.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % ccalcop                  
+     "%log.qname; | %int.qname; | %diff.qname; | %partialdiff.qname; |
+      %divergence.qname; | %grad.qname; | %curl.qname; | %laplacian.qname;" >
+
+<!ELEMENT %divergence.qname;  EMPTY >
+<!ATTLIST %divergence.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %grad.qname;  EMPTY >
+<!ATTLIST %grad.qname;  
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %curl.qname;  EMPTY >
+<!ATTLIST %curl.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %laplacian.qname;  EMPTY >
+<!ATTLIST %laplacian.qname;     
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %log.qname;  EMPTY >
+<!ATTLIST %log.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %int.qname;  EMPTY >
+<!ATTLIST %int.qname;    
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %diff.qname;  EMPTY >
+<!ATTLIST %diff.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %partialdiff.qname;  EMPTY >
+<!ATTLIST %partialdiff.qname;  
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % ccalcop1ary              
+     "%ln.qname;" >
+
+<!ELEMENT %ln.qname;  EMPTY >
+<!ATTLIST %ln.qname;   
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % csetop1ary               
+     "%card.qname;" >
+
+<!ELEMENT %card.qname;  EMPTY >
+<!ATTLIST %card.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % csetop2ary               
+     "%setdiff.qname;" >
+
+<!ELEMENT %setdiff.qname;  EMPTY >
+<!ATTLIST %setdiff.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % csetopnary               
+     "%union.qname; | %intersect.qname; | %cartesianproduct.qname; " >
+
+<!ELEMENT %union.qname;  EMPTY >
+<!ATTLIST %union.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %intersect.qname;  EMPTY >
+<!ATTLIST %intersect.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %cartesianproduct.qname;  EMPTY >
+<!ATTLIST %cartesianproduct.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % cseqop                   
+     "%sum.qname; | %product.qname; | %limit.qname;" >
+
+<!ELEMENT %sum.qname;  EMPTY >
+<!ATTLIST %sum.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %product.qname;  EMPTY >
+<!ATTLIST %product.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %limit.qname;  EMPTY >
+<!ATTLIST %limit.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % ctrigop                  
+     "%sin.qname; | %cos.qname; | %tan.qname; 
+      | %sec.qname; | %csc.qname; | %cot.qname; 
+      | %sinh.qname; | %cosh.qname; | %tanh.qname; 
+      | %sech.qname; | %csch.qname; | %coth.qname; 
+      | %arcsin.qname; | %arccos.qname; | %arctan.qname;
+      | %arccosh.qname; | %arccot.qname; | %arccoth.qname;
+      | %arccsc.qname; | %arccsch.qname; | %arcsec.qname;
+      | %arcsech.qname; | %arcsinh.qname; | %arctanh.qname;
+      " >
+
+<!ELEMENT %sin.qname;  EMPTY >
+<!ATTLIST %sin.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %cos.qname;  EMPTY >
+<!ATTLIST %cos.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %tan.qname;  EMPTY >
+<!ATTLIST %tan.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %sec.qname;  EMPTY >
+<!ATTLIST %sec.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %csc.qname;  EMPTY >
+<!ATTLIST %csc.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %cot.qname;  EMPTY >
+<!ATTLIST %cot.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %sinh.qname;  EMPTY >
+<!ATTLIST %sinh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %cosh.qname;  EMPTY >
+<!ATTLIST %cosh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %tanh.qname;  EMPTY >
+<!ATTLIST %tanh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %sech.qname;  EMPTY >
+<!ATTLIST %sech.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %csch.qname;  EMPTY >
+<!ATTLIST %csch.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %coth.qname;  EMPTY >
+<!ATTLIST %coth.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arcsin.qname;  EMPTY >
+<!ATTLIST %arcsin.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arccos.qname;  EMPTY >
+<!ATTLIST %arccos.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arctan.qname;  EMPTY >
+<!ATTLIST %arctan.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arccosh.qname;  EMPTY >
+<!ATTLIST %arccosh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+
+<!ELEMENT %arccot.qname;  EMPTY >
+<!ATTLIST %arccot.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arccoth.qname;  EMPTY >
+<!ATTLIST %arccoth.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+
+<!ELEMENT %arccsc.qname;  EMPTY >
+<!ATTLIST %arccsc.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arccsch.qname;  EMPTY >
+<!ATTLIST %arccsch.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arcsec.qname;  EMPTY >
+<!ATTLIST %arcsec.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arcsech.qname;  EMPTY >
+<!ATTLIST %arcsech.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arcsinh.qname;  EMPTY >
+<!ATTLIST %arcsinh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %arctanh.qname;  EMPTY >
+<!ATTLIST %arctanh.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+
+
+<!ENTITY % cstatopnary              
+     "%mean.qname; | %sdev.qname; |
+      %variance.qname; | %median.qname; |
+      %mode.qname;" >
+
+<!ELEMENT %mean.qname;  EMPTY >
+<!ATTLIST %mean.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %sdev.qname;  EMPTY >
+<!ATTLIST %sdev.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %variance.qname;  EMPTY >
+<!ATTLIST %variance.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %median.qname;  EMPTY >
+<!ATTLIST %median.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %mode.qname;  EMPTY >
+<!ATTLIST %mode.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % cstatopmoment            
+     "%moment.qname;" >
+
+<!ELEMENT %moment.qname;  EMPTY >
+<!ATTLIST %moment.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clalgop1ary              
+     "%determinant.qname; |
+      %transpose.qname;" >
+
+<!ELEMENT %determinant.qname;  EMPTY >
+<!ATTLIST %determinant.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %transpose.qname;  EMPTY >
+<!ATTLIST %transpose.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clalgop2ary              
+     "%vectorproduct.qname; 
+      | %scalarproduct.qname; 
+      | %outerproduct.qname;" >
+
+<!ELEMENT %vectorproduct.qname;  EMPTY >
+<!ATTLIST %vectorproduct.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %scalarproduct.qname;  EMPTY >
+<!ATTLIST %scalarproduct.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %outerproduct.qname;  EMPTY >
+<!ATTLIST %outerproduct.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % clalgopnary              
+     "%selector.qname;" >
+
+<!ELEMENT %selector.qname;  EMPTY >
+<!ATTLIST %selector.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!-- Content elements: relations -->
+
+<!ENTITY % cgenrel2ary             
+     "%neq.qname; | %factorof.qname;" >
+
+<!ELEMENT %neq.qname;  EMPTY >
+<!ATTLIST %neq.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %factorof.qname;  EMPTY >
+<!ATTLIST %factorof.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % cgenrelnary              
+     "%eq.qname; | %leq.qname; | %lt.qname; | %geq.qname; 
+      | %gt.qname;| %equivalent.qname; | %approx.qname;" >
+
+<!ELEMENT %eq.qname;  EMPTY >
+<!ATTLIST %eq.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %equivalent.qname;  EMPTY >
+<!ATTLIST %equivalent.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %approx.qname;  EMPTY >
+<!ATTLIST %approx.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %gt.qname;  EMPTY >
+<!ATTLIST %gt.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %lt.qname;  EMPTY >
+<!ATTLIST %lt.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %geq.qname;  EMPTY >
+<!ATTLIST %geq.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %leq.qname;  EMPTY >
+<!ATTLIST %leq.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % csetrel2ary              
+     "%in.qname; | %notin.qname; | %notsubset.qname; | %notprsubset.qname;" >
+
+<!ELEMENT %in.qname;  EMPTY >
+<!ATTLIST %in.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %notin.qname;  EMPTY >
+<!ATTLIST %notin.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %notsubset.qname;  EMPTY >
+<!ATTLIST %notsubset.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %notprsubset.qname;  EMPTY >
+<!ATTLIST %notprsubset.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % csetrelnary       
+     "%subset.qname; | %prsubset.qname;" >
+
+<!ELEMENT %subset.qname;  EMPTY >
+<!ATTLIST %subset.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ELEMENT %prsubset.qname;  EMPTY >
+<!ATTLIST %prsubset.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+>
+
+<!ENTITY % cseqrel2ary              
+     "%tendsto.qname;" >
+
+<!ELEMENT %tendsto.qname;  EMPTY >
+<!ATTLIST %tendsto.qname;
+      %MATHML.Common.attrib;
+      %att-definition;
+      %att-encoding;
+      %att-type;
+>
+
+<!-- Content elements: quantifiers -->
+
+<!ENTITY % cquantifier            
+     "%lowlimit.qname; | %uplimit.qname; | %bvar.qname; 
+      | %degree.qname; | %logbase.qname;
+      | %momentabout.qname; | %domainofapplication.qname; " >
+
+<!ATTLIST %lowlimit.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %uplimit.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %bvar.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %degree.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %logbase.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %momentabout.qname;
+      %MATHML.Common.attrib;
+>
+
+<!ATTLIST %domainofapplication.qname;
+      %MATHML.Common.attrib;
+>
+
+<!-- Operator groups -->
+
+<!ENTITY % cop1ary                  
+     "%cfuncop1ary; | %carithop1ary; | %clogicop1ary; |
+      %ccalcop1ary; | %ctrigop; | %clalgop1ary; |
+      %csetop1ary;" >
+
+<!ENTITY % cop2ary                  
+     "%carithop2ary; | %clogicop2ary;| %clalgop2ary; | %csetop2ary;" >
+
+<!ENTITY % copnary                  
+     "%cfuncopnary; | %carithopnary; | %clogicopnary; |
+      %csetopnary; | %cstatopnary; | %clalgopnary;" >
+
+<!ENTITY % copmisc                  
+     "%carithoproot; | %carithop1or2ary; | %ccalcop; |
+      %cseqop; | %cstatopmoment; | %clogicopquant;" >
+
+<!-- Relation groups -->
+
+<!ENTITY % crel2ary                 
+     "%cgenrel2ary; | %csetrel2ary; | %cseqrel2ary;" >
+
+<!ENTITY % crelnary                 
+     "%cgenrelnary; | %csetrelnary;" >
+
+<!-- Content constructs: all -->
+
+<!ENTITY % Content                  
+     "%ctoken; | %cspecial; | %cother; | %csemantics; | %c0ary;
+      | %cconstructor; | %cquantifier; | %cop1ary; | %cop2ary; 
+      | %copnary; |%copmisc; | %crel2ary; | %crelnary;" >
+
+<!-- Content constructs for substitution in presentation structures -->
+
+<!ENTITY % ContInPres               
+     "%ci.qname; |%csymbol.qname;| %cn.qname; | %c0ary; |
+      %apply.qname; | %fn.qname; |
+      %lambda.qname; | %reln.qname; |
+      %cconstructor; |
+      %semantics.qname; |%declare.qname;" >
+
+<!-- ............................................................. -->
+<!-- Recursive definition for content of expressions. Include
+     presentation constructs at lowest level so presentation
+     layout schemata hold presentation or content elements.
+     Include content constructs at lowest level so content
+     elements hold PCDATA or presentation elements at leaf
+     level (for permitted substitutable elements in context)
+-->
+<![%MathMLstrict;[
+<!-- in strict mode don't allow presentation in content
+     except where allowed by chapter 5:
+     ci, cn, csymbol, semantics
+-->
+  <!ENTITY % ContentExpression  "(%Content;)*" >
+  <!ENTITY % semanticsContentExpression        
+       "(%Content; | %PresInCont; |
+         %annotation.qname; | %annotation-xml.qname;)*" >
+]]>
+<!ENTITY % ContentExpression        
+     "(%Content; | %PresInCont;)*" >
+<!ENTITY % semanticsContentExpression    "%ContentExpression;">    
+
+
+<!ENTITY % PresExpression      
+     "(%Presentation; | %ContInPres;)*" >
+<!ENTITY % MathExpression           
+     "(%PresInCont; | %ContInPres;)*" >
+
+<!-- PCDATA or MathML character elements -->
+<!ENTITY % MathMLCharacters         
+     "#PCDATA | %mglyph.qname; " >
+
+<!-- Content elements: tokens                       -->
+<!-- (may contain embedded presentation constructs) -->
+
+<!ELEMENT %ci.qname;                 (%MathMLCharacters; | %PresInCont;)* >
+<!ELEMENT %csymbol.qname;            (%MathMLCharacters; | %PresInCont;)* >
+<!ELEMENT %cn.qname;                 (%MathMLCharacters; | %sep.qname; | %PresInCont;)* >
+
+<!-- Content elements: special -->
+
+<!ELEMENT %apply.qname;              (%ContentExpression;) >
+<!ELEMENT %reln.qname;               (%ContentExpression;) >
+<!ELEMENT %lambda.qname;             (%ContentExpression;) >
+
+<!-- Content elements: other -->
+
+<!ELEMENT %condition.qname;          (%ContentExpression;) >
+<!ELEMENT %declare.qname;            (%ContentExpression;) >
+
+<!-- Content elements: semantics -->
+
+<!ELEMENT %semantics.qname;          (%semanticsContentExpression;) >
+<!ENTITY % Annotation.content  "( #PCDATA )" >
+<!ELEMENT %annotation.qname;         %Annotation.content; >
+
+<!ENTITY % Annotation-xml.content "ANY" >
+<!ELEMENT %annotation-xml.qname;     %Annotation-xml.content; >
+
+<!-- Content elements: constructors -->
+
+<!ELEMENT %interval.qname;           (%ContentExpression;) >
+<!ELEMENT %set.qname;                (%ContentExpression;) >
+<!ELEMENT %list.qname;               (%ContentExpression;) >
+<!ELEMENT %vector.qname;             (%ContentExpression;) >
+<!ELEMENT %matrix.qname;             (%ContentExpression;) >
+<!ELEMENT %matrixrow.qname;          (%ContentExpression;) >
+
+<!ELEMENT %piecewise.qname;          ((%piece.qname;)*, (%otherwise.qname;)? ) >
+<!ELEMENT %piece.qname;              (%ContentExpression;) >
+<!ELEMENT %otherwise.qname;          (%ContentExpression;) >
+
+<!-- Content elements: operator (user-defined) -->
+
+<!ELEMENT %fn.qname;                 (%ContentExpression;) >
+
+<!-- Content elements: quantifiers -->
+
+<!ELEMENT %lowlimit.qname;           (%ContentExpression;) >
+<!ELEMENT %uplimit.qname;            (%ContentExpression;) >
+<!ELEMENT %bvar.qname;               (%ContentExpression;) >
+<!ELEMENT %degree.qname;             (%ContentExpression;) >
+<!ELEMENT %logbase.qname;            (%ContentExpression;) >
+<!ELEMENT %momentabout.qname;        (%ContentExpression;) >
+<!ELEMENT %domainofapplication.qname; (%ContentExpression;) >
+
+<!-- ............................................................. -->
+<!-- Presentation layout schemata contain tokens,
+     layout and content schemata.
+-->
+
+
+
+<![%MathMLstrict;[
+<!-- In strict mode enforce mfrac has exactly two children
+      same for msub etc -->
+  <!ENTITY % onePresExpression
+       "(%Presentation; | %ContInPres;)" >
+  <!ENTITY % twoPresExpression
+       "(%onePresExpression;,%onePresExpression;)" >
+  <!ENTITY % threePresExpression
+       "(%onePresExpression;,%onePresExpression;,%onePresExpression;)" >
+  <!ENTITY % mtrPresExpression
+       "(%mtr.qname;|%mlabeledtr.qname;)*" >
+  <!ENTITY % mtdPresExpression
+       "(%mtd.qname;)*" >
+  <!ENTITY % prscrPresExpression " (%onePresExpression;,
+  ((%onePresExpression;|%none.qname;),(%onePresExpression;|%none.qname;))*,
+  (%mprescripts.qname;,
+  ((%onePresExpression;|%none.qname;),(%onePresExpression;|%none.qname;))*)?
+  )">
+]]>
+
+
+<!-- By default keep them as they were in MathML 2.0  -->
+<!ENTITY % onePresExpression   "%PresExpression;">
+<!ENTITY % twoPresExpression   "%PresExpression;">
+<!ENTITY % threePresExpression "%PresExpression;">
+<!ENTITY % mtrPresExpression   "%PresExpression;">
+<!ENTITY % mtdPresExpression   "%PresExpression;">
+<!ENTITY % prscrPresExpression "%PresExpression;">
+
+<!ELEMENT %mstyle.qname;             (%PresExpression;) >
+<!ELEMENT %merror.qname;             (%PresExpression;) >
+<!ELEMENT %mphantom.qname;           (%PresExpression;) >
+<!ELEMENT %mrow.qname;               (%PresExpression;) >
+<!ELEMENT %mfrac.qname;              (%twoPresExpression;) >
+<!ELEMENT %msqrt.qname;              (%PresExpression;) >
+<!ELEMENT %menclose.qname;           (%PresExpression;) >
+<!ELEMENT %mroot.qname;              (%twoPresExpression;) >
+<!ELEMENT %msub.qname;               (%twoPresExpression;) >
+<!ELEMENT %msup.qname;               (%twoPresExpression;) >
+<!ELEMENT %msubsup.qname;            (%threePresExpression;) >
+<!ELEMENT %mmultiscripts.qname;      (%prscrPresExpression;) >
+<!ELEMENT %munder.qname;             (%twoPresExpression;) >
+<!ELEMENT %mover.qname;              (%twoPresExpression;) >
+<!ELEMENT %munderover.qname;         (%threePresExpression;) >
+<!ELEMENT %mtable.qname;             (%mtrPresExpression;) >
+<!ELEMENT %mtr.qname;                (%mtdPresExpression;) >
+<!ELEMENT %mlabeledtr.qname;         (%mtdPresExpression;) >
+<!ELEMENT %mtd.qname;                (%PresExpression;) >
+<!ELEMENT %maction.qname;            (%PresExpression;) >
+<!ELEMENT %mfenced.qname;            (%PresExpression;) >
+<!ELEMENT %mpadded.qname;            (%PresExpression;) >
+
+<!-- Presentation elements contain PCDATA or malignmark constructs. -->
+
+<!ELEMENT %mi.qname;                 (%MathMLCharacters; |
+      %malignmark.qname;)* >
+<!ELEMENT %mn.qname;                 (%MathMLCharacters; |
+      %malignmark.qname;)* >
+<!ELEMENT %mo.qname;                 (%MathMLCharacters; |
+      %malignmark.qname;)* >
+<!ELEMENT %mtext.qname;              (%MathMLCharacters; |
+      %malignmark.qname;)* >
+<!ELEMENT %ms.qname;                 (%MathMLCharacters; |
+      %malignmark.qname;)* >
+
+<!-- Browser interface definition  ............................... -->
+
+<!-- Attributes for top-level element "math" -->
+
+<!ENTITY % att-macros               
+     "macros       CDATA                    #IMPLIED" >
+<!ENTITY % att-mode                 
+     "mode         CDATA                    #IMPLIED" >
+<![%MathMLstrict;[
+  <!ENTITY % att-display
+     "display      ( block | inline )                    'inline'" >
+]]>
+<!ENTITY % att-display                
+     "display      CDATA                    #IMPLIED" >
+
+<!ENTITY % att-schemalocation               
+     "%Schema.prefix;:schemaLocation CDATA  #IMPLIED">		
+
+<!ENTITY % att-topinfo          
+     "%MATHML.Common.attrib;
+      %att-schemalocation;		
+      %att-macros;
+      %att-mode;
+      %att-display;" >
+
+<!-- Attributes for browser interface element -->
+
+<!ENTITY % att-baseline             
+     "baseline     CDATA                    #IMPLIED" >
+<!ENTITY % att-overflow            
+     "overflow  ( scroll | elide | truncate | scale ) 'scroll'" >
+<!ENTITY % att-altimg               
+     "altimg       CDATA                    #IMPLIED" >
+<!ENTITY % att-alttext           
+     "alttext      CDATA                    #IMPLIED" >
+
+<!ENTITY % att-browif           
+     "%att-type;
+      %att-name;
+      %att-height;
+      %att-width;
+      %att-baseline;
+      %att-overflow;
+      %att-altimg;
+      %att-alttext;" >
+
+<!-- ............................................................. -->
+<!-- The top-level element "math" contains MathML encoded
+     mathematics. The "math" element has the browser info
+     attributes iff it is also the browser interface element.
+-->
+
+<!ELEMENT %math.qname;               (%MathExpression;) >
+
+<!ATTLIST %math.qname;
+      %att-topinfo;
+      %att-browif; >
+
+<!-- MathML Character Entities .............................................. -->
+<!ENTITY % mathml-charent.module "INCLUDE" >
+<![%mathml-charent.module;[
+<!-- Entity sets from ISO Technical Report 9573-13 ..... -->
+
+
+<!ENTITY angzarr          "⍼" ><!--angle with down zig-zag arrow -->
+<!ENTITY cirmid           "⫯" ><!--circle, mid below -->
+<!ENTITY cudarrl          "⤸" ><!--left, curved, down arrow -->
+<!ENTITY cudarrr          "⤵" ><!--right, curved, down arrow -->
+<!ENTITY cularr           "↶" ><!--/curvearrowleft A: left curved arrow -->
+<!ENTITY cularrp          "⤽" ><!--curved left arrow with plus -->
+<!ENTITY curarr           "↷" ><!--/curvearrowright A: rt curved arrow -->
+<!ENTITY curarrm          "⤼" ><!--curved right arrow with minus -->
+<!ENTITY Darr             "↡" ><!--down two-headed arrow -->
+<!ENTITY dArr             "⇓" ><!--/Downarrow A: down dbl arrow -->
+<!ENTITY ddarr            "⇊" ><!--/downdownarrows A: two down arrows -->
+<!ENTITY DDotrahd         "⤑" ><!--right arrow with dotted stem -->
+<!ENTITY dfisht           "⥿" ><!--down fish tail -->
+<!ENTITY dHar             "⥥" ><!--down harpoon-left, down harpoon-right -->
+<!ENTITY dharl            "⇃" ><!--/downharpoonleft A: dn harpoon-left -->
+<!ENTITY dharr            "⇂" ><!--/downharpoonright A: down harpoon-rt -->
+<!ENTITY duarr            "⇵" ><!--down arrow, up arrow -->
+<!ENTITY duhar            "⥯" ><!--down harp, up harp -->
+<!ENTITY dzigrarr         "⟿" ><!--right long zig-zag arrow -->
+<!ENTITY erarr            "⥱" ><!--equal, right arrow below -->
+<!ENTITY hArr             "⇔" ><!--/Leftrightarrow A: l&r dbl arrow -->
+<!ENTITY harr             "↔" ><!--/leftrightarrow A: l&r arrow -->
+<!ENTITY harrcir          "⥈" ><!--left and right arrow with a circle -->
+<!ENTITY harrw            "↭" ><!--/leftrightsquigarrow A: l&r arr-wavy -->
+<!ENTITY hoarr            "⇿" ><!--horizontal open arrow -->
+<!ENTITY imof             "⊷" ><!--image of -->
+<!ENTITY lAarr            "⇚" ><!--/Lleftarrow A: left triple arrow -->
+<!ENTITY Larr             "↞" ><!--/twoheadleftarrow A: -->
+<!ENTITY larrbfs          "⤟" ><!--left arrow-bar, filled square -->
+<!ENTITY larrfs           "⤝" ><!--left arrow, filled square -->
+<!ENTITY larrhk           "↩" ><!--/hookleftarrow A: left arrow-hooked -->
+<!ENTITY larrlp           "↫" ><!--/looparrowleft A: left arrow-looped -->
+<!ENTITY larrpl           "⤹" ><!--left arrow, plus -->
+<!ENTITY larrsim          "⥳" ><!--left arrow, similar -->
+<!ENTITY larrtl           "↢" ><!--/leftarrowtail A: left arrow-tailed -->
+<!ENTITY lAtail           "⤛" ><!--left double arrow-tail -->
+<!ENTITY latail           "⤙" ><!--left arrow-tail -->
+<!ENTITY lBarr            "⤎" ><!--left doubly broken arrow -->
+<!ENTITY lbarr            "⤌" ><!--left broken arrow -->
+<!ENTITY ldca             "⤶" ><!--left down curved arrow -->
+<!ENTITY ldrdhar          "⥧" ><!--left harpoon-down over right harpoon-down -->
+<!ENTITY ldrushar         "⥋" ><!--left-down-right-up harpoon -->
+<!ENTITY ldsh             "↲" ><!--left down angled arrow -->
+<!ENTITY lfisht           "⥼" ><!--left fish tail -->
+<!ENTITY lHar             "⥢" ><!--left harpoon-up over left harpoon-down -->
+<!ENTITY lhard            "↽" ><!--/leftharpoondown A: l harpoon-down -->
+<!ENTITY lharu            "↼" ><!--/leftharpoonup A: left harpoon-up -->
+<!ENTITY lharul           "⥪" ><!--left harpoon-up over long dash -->
+<!ENTITY llarr            "⇇" ><!--/leftleftarrows A: two left arrows -->
+<!ENTITY llhard           "⥫" ><!--left harpoon-down below long dash -->
+<!ENTITY loarr            "⇽" ><!--left open arrow -->
+<!ENTITY lrarr            "⇆" ><!--/leftrightarrows A: l arr over r arr -->
+<!ENTITY lrhar            "⇋" ><!--/leftrightharpoons A: l harp over r -->
+<!ENTITY lrhard           "⥭" ><!--right harpoon-down below long dash -->
+<!ENTITY lsh              "↰" ><!--/Lsh A: -->
+<!ENTITY lurdshar         "⥊" ><!--left-up-right-down harpoon -->
+<!ENTITY luruhar          "⥦" ><!--left harpoon-up over right harpoon-up -->
+<!ENTITY Map              "⤅" ><!--twoheaded mapsto -->
+<!ENTITY map              "↦" ><!--/mapsto A: -->
+<!ENTITY midcir           "⫰" ><!--mid, circle below  -->
+<!ENTITY mumap            "⊸" ><!--/multimap A: -->
+<!ENTITY nearhk           "⤤" ><!--NE arrow-hooked -->
+<!ENTITY neArr            "⇗" ><!--NE pointing dbl arrow -->
+<!ENTITY nearr            "↗" ><!--/nearrow A: NE pointing arrow -->
+<!ENTITY nesear           "⤨" ><!--/toea A: NE & SE arrows -->
+<!ENTITY nhArr            "⇎" ><!--/nLeftrightarrow A: not l&r dbl arr -->
+<!ENTITY nharr            "↮" ><!--/nleftrightarrow A: not l&r arrow -->
+<!ENTITY nlArr            "⇍" ><!--/nLeftarrow A: not implied by -->
+<!ENTITY nlarr            "↚" ><!--/nleftarrow A: not left arrow -->
+<!ENTITY nrArr            "⇏" ><!--/nRightarrow A: not implies -->
+<!ENTITY nrarr            "↛" ><!--/nrightarrow A: not right arrow -->
+<!ENTITY nrarrc           "⤳̸" ><!--not right arrow-curved -->
+<!ENTITY nrarrw           "↝̸" ><!--not right arrow-wavy -->
+<!ENTITY nvHarr           "⤄" ><!--not, vert, left and right double arrow  -->
+<!ENTITY nvlArr           "⤂" ><!--not, vert, left double arrow -->
+<!ENTITY nvrArr           "⤃" ><!--not, vert, right double arrow -->
+<!ENTITY nwarhk           "⤣" ><!--NW arrow-hooked -->
+<!ENTITY nwArr            "⇖" ><!--NW pointing dbl arrow -->
+<!ENTITY nwarr            "↖" ><!--/nwarrow A: NW pointing arrow -->
+<!ENTITY nwnear           "⤧" ><!--NW & NE arrows -->
+<!ENTITY olarr            "↺" ><!--/circlearrowleft A: l arr in circle -->
+<!ENTITY orarr            "↻" ><!--/circlearrowright A: r arr in circle -->
+<!ENTITY origof           "⊶" ><!--original of -->
+<!ENTITY rAarr            "⇛" ><!--/Rrightarrow A: right triple arrow -->
+<!ENTITY Rarr             "↠" ><!--/twoheadrightarrow A: -->
+<!ENTITY rarrap           "⥵" ><!--approximate, right arrow above -->
+<!ENTITY rarrbfs          "⤠" ><!--right arrow-bar, filled square -->
+<!ENTITY rarrc            "⤳" ><!--right arrow-curved -->
+<!ENTITY rarrfs           "⤞" ><!--right arrow, filled square -->
+<!ENTITY rarrhk           "↪" ><!--/hookrightarrow A: rt arrow-hooked -->
+<!ENTITY rarrlp           "↬" ><!--/looparrowright A: rt arrow-looped -->
+<!ENTITY rarrpl           "⥅" ><!--right arrow, plus -->
+<!ENTITY rarrsim          "⥴" ><!--right arrow, similar -->
+<!ENTITY Rarrtl           "⤖" ><!--right two-headed arrow with tail -->
+<!ENTITY rarrtl           "↣" ><!--/rightarrowtail A: rt arrow-tailed -->
+<!ENTITY rarrw            "↝" ><!--/rightsquigarrow A: rt arrow-wavy -->
+<!ENTITY rAtail           "⤜" ><!--right double arrow-tail -->
+<!ENTITY ratail           "⤚" ><!--right arrow-tail -->
+<!ENTITY RBarr            "⤐" ><!--/drbkarow A: twoheaded right broken arrow -->
+<!ENTITY rBarr            "⤏" ><!--/dbkarow A: right doubly broken arrow -->
+<!ENTITY rbarr            "⤍" ><!--/bkarow A: right broken arrow -->
+<!ENTITY rdca             "⤷" ><!--right down curved arrow -->
+<!ENTITY rdldhar          "⥩" ><!--right harpoon-down over left harpoon-down -->
+<!ENTITY rdsh             "↳" ><!--right down angled arrow -->
+<!ENTITY rfisht           "⥽" ><!--right fish tail -->
+<!ENTITY rHar             "⥤" ><!--right harpoon-up over right harpoon-down -->
+<!ENTITY rhard            "⇁" ><!--/rightharpoondown A: rt harpoon-down -->
+<!ENTITY rharu            "⇀" ><!--/rightharpoonup A: rt harpoon-up -->
+<!ENTITY rharul           "⥬" ><!--right harpoon-up over long dash -->
+<!ENTITY rlarr            "⇄" ><!--/rightleftarrows A: r arr over l arr -->
+<!ENTITY rlhar            "⇌" ><!--/rightleftharpoons A: r harp over l -->
+<!ENTITY roarr            "⇾" ><!--right open arrow -->
+<!ENTITY rrarr            "⇉" ><!--/rightrightarrows A: two rt arrows -->
+<!ENTITY rsh              "↱" ><!--/Rsh A: -->
+<!ENTITY ruluhar          "⥨" ><!--right harpoon-up over left harpoon-up -->
+<!ENTITY searhk           "⤥" ><!--/hksearow A: SE arrow-hooken -->
+<!ENTITY seArr            "⇘" ><!--SE pointing dbl arrow -->
+<!ENTITY searr            "↘" ><!--/searrow A: SE pointing arrow -->
+<!ENTITY seswar           "⤩" ><!--/tosa A: SE & SW arrows -->
+<!ENTITY simrarr          "⥲" ><!--similar, right arrow below -->
+<!ENTITY slarr            "←" ><!--short left arrow -->
+<!ENTITY srarr            "→" ><!--short right arrow -->
+<!ENTITY swarhk           "⤦" ><!--/hkswarow A: SW arrow-hooked -->
+<!ENTITY swArr            "⇙" ><!--SW pointing dbl arrow -->
+<!ENTITY swarr            "↙" ><!--/swarrow A: SW pointing arrow -->
+<!ENTITY swnwar           "⤪" ><!--SW & NW arrows -->
+<!ENTITY Uarr             "↟" ><!--up two-headed arrow -->
+<!ENTITY uArr             "⇑" ><!--/Uparrow A: up dbl arrow -->
+<!ENTITY Uarrocir         "⥉" ><!--up two-headed arrow above circle -->
+<!ENTITY udarr            "⇅" ><!--up arrow, down arrow -->
+<!ENTITY udhar            "⥮" ><!--up harp, down harp -->
+<!ENTITY ufisht           "⥾" ><!--up fish tail -->
+<!ENTITY uHar             "⥣" ><!--up harpoon-left, up harpoon-right -->
+<!ENTITY uharl            "↿" ><!--/upharpoonleft A: up harpoon-left -->
+<!ENTITY uharr            "↾" ><!--/upharpoonright /restriction A: up harp-r -->
+<!ENTITY uuarr            "⇈" ><!--/upuparrows A: two up arrows -->
+<!ENTITY vArr             "⇕" ><!--/Updownarrow A: up&down dbl arrow -->
+<!ENTITY varr             "↕" ><!--/updownarrow A: up&down arrow -->
+<!ENTITY xhArr            "⟺" ><!--/Longleftrightarrow A: long l&r dbl arr -->
+<!ENTITY xharr            "⟷" ><!--/longleftrightarrow A: long l&r arr -->
+<!ENTITY xlArr            "⟸" ><!--/Longleftarrow A: long l dbl arrow -->
+<!ENTITY xlarr            "⟵" ><!--/longleftarrow A: long left arrow -->
+<!ENTITY xmap             "⟼" ><!--/longmapsto A: -->
+<!ENTITY xrArr            "⟹" ><!--/Longrightarrow A: long rt dbl arr -->
+<!ENTITY xrarr            "⟶" ><!--/longrightarrow A: long right arrow -->
+<!ENTITY zigrarr          "⇝" ><!--right zig-zag arrow -->
+
+<!ENTITY ac               "∾" ><!--most positive -->
+<!ENTITY acE              "∾̳" ><!--most positive, two lines below -->
+<!ENTITY amalg            "⨿" ><!--/amalg B: amalgamation or coproduct -->
+<!ENTITY barvee           "⊽" ><!--bar, vee -->
+<!ENTITY Barwed           "⌆" ><!--/doublebarwedge B: log and, dbl bar above -->
+<!ENTITY barwed           "⌅" ><!--/barwedge B: logical and, bar above -->
+<!ENTITY bsolb            "⧅" ><!--reverse solidus in square -->
+<!ENTITY Cap              "⋒" ><!--/Cap /doublecap B: dbl intersection -->
+<!ENTITY capand           "⩄" ><!--intersection, and -->
+<!ENTITY capbrcup         "⩉" ><!--intersection, bar, union -->
+<!ENTITY capcap           "⩋" ><!--intersection, intersection, joined -->
+<!ENTITY capcup           "⩇" ><!--intersection above union -->
+<!ENTITY capdot           "⩀" ><!--intersection, with dot -->
+<!ENTITY caps             "∩︀" ><!--intersection, serifs -->
+<!ENTITY ccaps            "⩍" ><!--closed intersection, serifs -->
+<!ENTITY ccups            "⩌" ><!--closed union, serifs -->
+<!ENTITY ccupssm          "⩐" ><!--closed union, serifs, smash product -->
+<!ENTITY coprod           "∐" ><!--/coprod L: coproduct operator -->
+<!ENTITY Cup              "⋓" ><!--/Cup /doublecup B: dbl union -->
+<!ENTITY cupbrcap         "⩈" ><!--union, bar, intersection -->
+<!ENTITY cupcap           "⩆" ><!--union above intersection -->
+<!ENTITY cupcup           "⩊" ><!--union, union, joined -->
+<!ENTITY cupdot           "⊍" ><!--union, with dot -->
+<!ENTITY cupor            "⩅" ><!--union, or -->
+<!ENTITY cups             "∪︀" ><!--union, serifs -->
+<!ENTITY cuvee            "⋎" ><!--/curlyvee B: curly logical or -->
+<!ENTITY cuwed            "⋏" ><!--/curlywedge B: curly logical and -->
+<!ENTITY Dagger           "‡" ><!--/ddagger B: double dagger relation -->
+<!ENTITY dagger           "†" ><!--/dagger B: dagger relation -->
+<!ENTITY diam             "⋄" ><!--/diamond B: open diamond -->
+<!ENTITY divonx           "⋇" ><!--/divideontimes B: division on times -->
+<!ENTITY eplus            "⩱" ><!--equal, plus -->
+<!ENTITY hercon           "⊹" ><!--hermitian conjugate matrix -->
+<!ENTITY intcal           "⊺" ><!--/intercal B: intercal -->
+<!ENTITY iprod            "⨼" ><!--/intprod -->
+<!ENTITY loplus           "⨭" ><!--plus sign in left half circle -->
+<!ENTITY lotimes          "⨴" ><!--multiply sign in left half circle  -->
+<!ENTITY lthree           "⋋" ><!--/leftthreetimes B: -->
+<!ENTITY ltimes           "⋉" ><!--/ltimes B: times sign, left closed -->
+<!ENTITY midast           "*" ><!--/ast B: asterisk -->
+<!ENTITY minusb           "⊟" ><!--/boxminus B: minus sign in box -->
+<!ENTITY minusd           "∸" ><!--/dotminus B: minus sign, dot above -->
+<!ENTITY minusdu          "⨪" ><!--minus sign, dot below -->
+<!ENTITY ncap             "⩃" ><!--bar, intersection -->
+<!ENTITY ncup             "⩂" ><!--bar, union -->
+<!ENTITY oast             "⊛" ><!--/circledast B: asterisk in circle -->
+<!ENTITY ocir             "⊚" ><!--/circledcirc B: small circle in circle -->
+<!ENTITY odash            "⊝" ><!--/circleddash B: hyphen in circle -->
+<!ENTITY odiv             "⨸" ><!--divide in circle -->
+<!ENTITY odot             "⊙" ><!--/odot B: middle dot in circle -->
+<!ENTITY odsold           "⦼" ><!--dot, solidus, dot in circle -->
+<!ENTITY ofcir            "⦿" ><!--filled circle in circle -->
+<!ENTITY ogt              "⧁" ><!--greater-than in circle -->
+<!ENTITY ohbar            "⦵" ><!--circle with horizontal bar -->
+<!ENTITY olcir            "⦾" ><!--large circle in circle -->
+<!ENTITY olt              "⧀" ><!--less-than in circle -->
+<!ENTITY omid             "⦶" ><!--vertical bar in circle -->
+<!ENTITY ominus           "⊖" ><!--/ominus B: minus sign in circle -->
+<!ENTITY opar             "⦷" ><!--parallel in circle -->
+<!ENTITY operp            "⦹" ><!--perpendicular in circle -->
+<!ENTITY oplus            "⊕" ><!--/oplus B: plus sign in circle -->
+<!ENTITY osol             "⊘" ><!--/oslash B: solidus in circle -->
+<!ENTITY Otimes           "⨷" ><!--multiply sign in double circle -->
+<!ENTITY otimes           "⊗" ><!--/otimes B: multiply sign in circle -->
+<!ENTITY otimesas         "⨶" ><!--multiply sign in circle, circumflex accent -->
+<!ENTITY ovbar            "⌽" ><!--circle with vertical bar -->
+<!ENTITY plusacir         "⨣" ><!--plus, circumflex accent above -->
+<!ENTITY plusb            "⊞" ><!--/boxplus B: plus sign in box -->
+<!ENTITY pluscir          "⨢" ><!--plus, small circle above -->
+<!ENTITY plusdo           "∔" ><!--/dotplus B: plus sign, dot above -->
+<!ENTITY plusdu           "⨥" ><!--plus sign, dot below -->
+<!ENTITY pluse            "⩲" ><!--plus, equals -->
+<!ENTITY plussim          "⨦" ><!--plus, similar below -->
+<!ENTITY plustwo          "⨧" ><!--plus, two; Nim-addition -->
+<!ENTITY prod             "∏" ><!--/prod L: product operator -->
+<!ENTITY race             "⧚" ><!--reverse most positive, line below -->
+<!ENTITY roplus           "⨮" ><!--plus sign in right half circle -->
+<!ENTITY rotimes          "⨵" ><!--multiply sign in right half circle -->
+<!ENTITY rthree           "⋌" ><!--/rightthreetimes B: -->
+<!ENTITY rtimes           "⋊" ><!--/rtimes B: times sign, right closed -->
+<!ENTITY sdot             "⋅" ><!--/cdot B: small middle dot -->
+<!ENTITY sdotb            "⊡" ><!--/dotsquare /boxdot B: small dot in box -->
+<!ENTITY setmn            "∖" ><!--/setminus B: reverse solidus -->
+<!ENTITY simplus          "⨤" ><!--plus, similar above -->
+<!ENTITY smashp           "⨳" ><!--smash product -->
+<!ENTITY solb             "⧄" ><!--solidus in square -->
+<!ENTITY sqcap            "⊓" ><!--/sqcap B: square intersection -->
+<!ENTITY sqcaps           "⊓︀" ><!--square intersection, serifs -->
+<!ENTITY sqcup            "⊔" ><!--/sqcup B: square union -->
+<!ENTITY sqcups           "⊔︀" ><!--square union, serifs -->
+<!ENTITY ssetmn           "∖" ><!--/smallsetminus B: sm reverse solidus -->
+<!ENTITY sstarf           "⋆" ><!--/star B: small star, filled -->
+<!ENTITY subdot           "⪽" ><!--subset, with dot -->
+<!ENTITY sum              "∑" ><!--/sum L: summation operator -->
+<!ENTITY supdot           "⪾" ><!--superset, with dot -->
+<!ENTITY timesb           "⊠" ><!--/boxtimes B: multiply sign in box -->
+<!ENTITY timesbar         "⨱" ><!--multiply sign, bar below -->
+<!ENTITY timesd           "⨰" ><!--times, dot -->
+<!ENTITY tridot           "◬" ><!--dot in triangle -->
+<!ENTITY triminus         "⨺" ><!--minus in triangle -->
+<!ENTITY triplus          "⨹" ><!--plus in triangle -->
+<!ENTITY trisb            "⧍" ><!--triangle, serifs at bottom -->
+<!ENTITY tritime          "⨻" ><!--multiply in triangle -->
+<!ENTITY uplus            "⊎" ><!--/uplus B: plus sign in union -->
+<!ENTITY veebar           "⊻" ><!--/veebar B: logical or, bar below -->
+<!ENTITY wedbar           "⩟" ><!--wedge, bar below -->
+<!ENTITY wreath           "≀" ><!--/wr B: wreath product -->
+<!ENTITY xcap             "⋂" ><!--/bigcap L: intersection operator -->
+<!ENTITY xcirc            "◯" ><!--/bigcirc B: large circle -->
+<!ENTITY xcup             "⋃" ><!--/bigcup L: union operator -->
+<!ENTITY xdtri            "▽" ><!--/bigtriangledown B: big dn tri, open -->
+<!ENTITY xodot            "⨀" ><!--/bigodot L: circle dot operator -->
+<!ENTITY xoplus           "⨁" ><!--/bigoplus L: circle plus operator -->
+<!ENTITY xotime           "⨂" ><!--/bigotimes L: circle times operator -->
+<!ENTITY xsqcup           "⨆" ><!--/bigsqcup L: square union operator -->
+<!ENTITY xuplus           "⨄" ><!--/biguplus L: -->
+<!ENTITY xutri            "△" ><!--/bigtriangleup B: big up tri, open -->
+<!ENTITY xvee             "⋁" ><!--/bigvee L: logical and operator -->
+<!ENTITY xwedge           "⋀" ><!--/bigwedge L: logical or operator -->
+
+<!ENTITY dlcorn           "⌞" ><!--/llcorner O: lower left corner -->
+<!ENTITY drcorn           "⌟" ><!--/lrcorner C: lower right corner -->
+<!ENTITY gtlPar           "⦕" ><!--dbl left parenthesis, greater -->
+<!ENTITY langd            "⦑" ><!--left angle, dot -->
+<!ENTITY lbrke            "⦋" ><!--left bracket, equal -->
+<!ENTITY lbrksld          "⦏" ><!--left bracket, solidus bottom corner -->
+<!ENTITY lbrkslu          "⦍" ><!--left bracket, solidus top corner -->
+<!ENTITY lceil            "⌈" ><!--/lceil O: left ceiling -->
+<!ENTITY lfloor           "⌊" ><!--/lfloor O: left floor -->
+<!ENTITY lmoust           "⎰" ><!--/lmoustache -->
+<!ENTITY lparlt           "⦓" ><!--O: left parenthesis, lt -->
+<!ENTITY ltrPar           "⦖" ><!--dbl right parenthesis, less -->
+<!ENTITY rangd            "⦒" ><!--right angle, dot -->
+<!ENTITY rbrke            "⦌" ><!--right bracket, equal -->
+<!ENTITY rbrksld          "⦎" ><!--right bracket, solidus bottom corner -->
+<!ENTITY rbrkslu          "⦐" ><!--right bracket, solidus top corner -->
+<!ENTITY rceil            "⌉" ><!--/rceil C: right ceiling -->
+<!ENTITY rfloor           "⌋" ><!--/rfloor C: right floor -->
+<!ENTITY rmoust           "⎱" ><!--/rmoustache -->
+<!ENTITY rpargt           "⦔" ><!--C: right paren, gt -->
+<!ENTITY ulcorn           "⌜" ><!--/ulcorner O: upper left corner -->
+<!ENTITY urcorn           "⌝" ><!--/urcorner C: upper right corner -->
+
+<!ENTITY gnap             "⪊" ><!--/gnapprox N: greater, not approximate -->
+<!ENTITY gnE              "≩" ><!--/gneqq N: greater, not dbl equals -->
+<!ENTITY gne              "⪈" ><!--/gneq N: greater, not equals -->
+<!ENTITY gnsim            "⋧" ><!--/gnsim N: greater, not similar -->
+<!ENTITY gvnE             "≩︀" ><!--/gvertneqq N: gt, vert, not dbl eq -->
+<!ENTITY lnap             "⪉" ><!--/lnapprox N: less, not approximate -->
+<!ENTITY lnE              "≨" ><!--/lneqq N: less, not double equals -->
+<!ENTITY lne              "⪇" ><!--/lneq N: less, not equals -->
+<!ENTITY lnsim            "⋦" ><!--/lnsim N: less, not similar -->
+<!ENTITY lvnE             "≨︀" ><!--/lvertneqq N: less, vert, not dbl eq -->
+<!ENTITY nap              "≉" ><!--/napprox N: not approximate -->
+<!ENTITY napE             "⩰̸" ><!--not approximately equal or equal to -->
+<!ENTITY napid            "≋̸" ><!--not approximately identical to -->
+<!ENTITY ncong            "≇" ><!--/ncong N: not congruent with -->
+<!ENTITY ncongdot         "⩭̸" ><!--not congruent, dot -->
+<!ENTITY nequiv           "≢" ><!--/nequiv N: not identical with -->
+<!ENTITY ngE              "≧̸" ><!--/ngeqq N: not greater, dbl equals -->
+<!ENTITY nge              "≱" ><!--/ngeq N: not greater-than-or-equal -->
+<!ENTITY nges             "⩾̸" ><!--/ngeqslant N: not gt-or-eq, slanted -->
+<!ENTITY nGg              "⋙̸" ><!--not triple greater than -->
+<!ENTITY ngsim            "≵" ><!--not greater, similar -->
+<!ENTITY nGt              "≫⃒" ><!--not, vert, much greater than -->
+<!ENTITY ngt              "≯" ><!--/ngtr N: not greater-than -->
+<!ENTITY nGtv             "≫̸" ><!--not much greater than, variant -->
+<!ENTITY nlE              "≦̸" ><!--/nleqq N: not less, dbl equals -->
+<!ENTITY nle              "≰" ><!--/nleq N: not less-than-or-equal -->
+<!ENTITY nles             "⩽̸" ><!--/nleqslant N: not less-or-eq, slant -->
+<!ENTITY nLl              "⋘̸" ><!--not triple less than -->
+<!ENTITY nlsim            "≴" ><!--not less, similar -->
+<!ENTITY nLt              "≪⃒" ><!--not, vert, much less than -->
+<!ENTITY nlt              "≮" ><!--/nless N: not less-than -->
+<!ENTITY nltri            "⋪" ><!--/ntriangleleft N: not left triangle -->
+<!ENTITY nltrie           "⋬" ><!--/ntrianglelefteq N: not l tri, eq -->
+<!ENTITY nLtv             "≪̸" ><!--not much less than, variant -->
+<!ENTITY nmid             "∤" ><!--/nmid -->
+<!ENTITY npar             "∦" ><!--/nparallel N: not parallel -->
+<!ENTITY npr              "⊀" ><!--/nprec N: not precedes -->
+<!ENTITY nprcue           "⋠" ><!--not curly precedes, eq -->
+<!ENTITY npre             "⪯̸" ><!--/npreceq N: not precedes, equals -->
+<!ENTITY nrtri            "⋫" ><!--/ntriangleright N: not rt triangle -->
+<!ENTITY nrtrie           "⋭" ><!--/ntrianglerighteq N: not r tri, eq -->
+<!ENTITY nsc              "⊁" ><!--/nsucc N: not succeeds -->
+<!ENTITY nsccue           "⋡" ><!--not succeeds, curly eq -->
+<!ENTITY nsce             "⪰̸" ><!--/nsucceq N: not succeeds, equals -->
+<!ENTITY nsim             "≁" ><!--/nsim N: not similar -->
+<!ENTITY nsime            "≄" ><!--/nsimeq N: not similar, equals -->
+<!ENTITY nsmid            "∤" ><!--/nshortmid -->
+<!ENTITY nspar            "∦" ><!--/nshortparallel N: not short par -->
+<!ENTITY nsqsube          "⋢" ><!--not, square subset, equals -->
+<!ENTITY nsqsupe          "⋣" ><!--not, square superset, equals -->
+<!ENTITY nsub             "⊄" ><!--not subset -->
+<!ENTITY nsubE            "⫅̸" ><!--/nsubseteqq N: not subset, dbl eq -->
+<!ENTITY nsube            "⊈" ><!--/nsubseteq N: not subset, equals -->
+<!ENTITY nsup             "⊅" ><!--not superset -->
+<!ENTITY nsupE            "⫆̸" ><!--/nsupseteqq N: not superset, dbl eq -->
+<!ENTITY nsupe            "⊉" ><!--/nsupseteq N: not superset, equals -->
+<!ENTITY ntgl             "≹" ><!--not greater, less -->
+<!ENTITY ntlg             "≸" ><!--not less, greater -->
+<!ENTITY nvap             "≍⃒" ><!--not, vert, approximate -->
+<!ENTITY nVDash           "⊯" ><!--/nVDash N: not dbl vert, dbl dash -->
+<!ENTITY nVdash           "⊮" ><!--/nVdash N: not dbl vertical, dash -->
+<!ENTITY nvDash           "⊭" ><!--/nvDash N: not vertical, dbl dash -->
+<!ENTITY nvdash           "⊬" ><!--/nvdash N: not vertical, dash -->
+<!ENTITY nvge             "≥⃒" ><!--not, vert, greater-than-or-equal -->
+<!ENTITY nvgt             ">⃒" ><!--not, vert, greater-than -->
+<!ENTITY nvle             "≤⃒" ><!--not, vert, less-than-or-equal -->
+<!ENTITY nvlt             "&#x0003C;⃒" ><!--not, vert, less-than -->
+<!ENTITY nvltrie          "⊴⃒" ><!--not, vert, left triangle, equals -->
+<!ENTITY nvrtrie          "⊵⃒" ><!--not, vert, right triangle, equals -->
+<!ENTITY nvsim            "∼⃒" ><!--not, vert, similar -->
+<!ENTITY parsim           "⫳" ><!--parallel, similar -->
+<!ENTITY prnap            "⪹" ><!--/precnapprox N: precedes, not approx -->
+<!ENTITY prnE             "⪵" ><!--/precneqq N: precedes, not dbl eq -->
+<!ENTITY prnsim           "⋨" ><!--/precnsim N: precedes, not similar -->
+<!ENTITY rnmid            "⫮" ><!--reverse /nmid -->
+<!ENTITY scnap            "⪺" ><!--/succnapprox N: succeeds, not approx -->
+<!ENTITY scnE             "⪶" ><!--/succneqq N: succeeds, not dbl eq -->
+<!ENTITY scnsim           "⋩" ><!--/succnsim N: succeeds, not similar -->
+<!ENTITY simne            "≆" ><!--similar, not equals -->
+<!ENTITY solbar           "⌿" ><!--solidus, bar through -->
+<!ENTITY subnE            "⫋" ><!--/subsetneqq N: subset, not dbl eq -->
+<!ENTITY subne            "⊊" ><!--/subsetneq N: subset, not equals -->
+<!ENTITY supnE            "⫌" ><!--/supsetneqq N: superset, not dbl eq -->
+<!ENTITY supne            "⊋" ><!--/supsetneq N: superset, not equals -->
+<!ENTITY vnsub            "⊂⃒" ><!--/nsubset N: not subset, var -->
+<!ENTITY vnsup            "⊃⃒" ><!--/nsupset N: not superset, var -->
+<!ENTITY vsubnE           "⫋︀" ><!--/varsubsetneqq N: subset not dbl eq, var -->
+<!ENTITY vsubne           "⊊︀" ><!--/varsubsetneq N: subset, not eq, var -->
+<!ENTITY vsupnE           "⫌︀" ><!--/varsupsetneqq N: super not dbl eq, var -->
+<!ENTITY vsupne           "⊋︀" ><!--/varsupsetneq N: superset, not eq, var -->
+
+<!ENTITY ang              "∠" ><!--/angle - angle -->
+<!ENTITY ange             "⦤" ><!--angle, equal -->
+<!ENTITY angmsd           "∡" ><!--/measuredangle - angle-measured -->
+<!ENTITY angmsdaa         "⦨" ><!--angle-measured, arrow, up, right -->
+<!ENTITY angmsdab         "⦩" ><!--angle-measured, arrow, up, left -->
+<!ENTITY angmsdac         "⦪" ><!--angle-measured, arrow, down, right -->
+<!ENTITY angmsdad         "⦫" ><!--angle-measured, arrow, down, left -->
+<!ENTITY angmsdae         "⦬" ><!--angle-measured, arrow, right, up -->
+<!ENTITY angmsdaf         "⦭" ><!--angle-measured, arrow, left, up -->
+<!ENTITY angmsdag         "⦮" ><!--angle-measured, arrow, right, down -->
+<!ENTITY angmsdah         "⦯" ><!--angle-measured, arrow, left, down -->
+<!ENTITY angrtvb          "⊾" ><!--right angle-measured -->
+<!ENTITY angrtvbd         "⦝" ><!--right angle-measured, dot -->
+<!ENTITY bbrk             "⎵" ><!--bottom square bracket -->
+<!ENTITY bbrktbrk         "⎶" ><!--bottom above top square bracket -->
+<!ENTITY bemptyv          "⦰" ><!--reversed circle, slash -->
+<!ENTITY beth             "ℶ" ><!--/beth - beth, Hebrew -->
+<!ENTITY boxbox           "⧉" ><!--two joined squares -->
+<!ENTITY bprime           "‵" ><!--/backprime - reverse prime -->
+<!ENTITY bsemi            "⁏" ><!--reverse semi-colon -->
+<!ENTITY cemptyv          "⦲" ><!--circle, slash, small circle above -->
+<!ENTITY cirE             "⧃" ><!--circle, two horizontal stroked to the right -->
+<!ENTITY cirscir          "⧂" ><!--circle, small circle to the right -->
+<!ENTITY comp             "∁" ><!--/complement - complement sign -->
+<!ENTITY daleth           "ℸ" ><!--/daleth - daleth, Hebrew -->
+<!ENTITY demptyv          "⦱" ><!--circle, slash, bar above -->
+<!ENTITY ell              "ℓ" ><!--/ell - cursive small l -->
+<!ENTITY empty            "∅" ><!--/emptyset - zero, slash -->
+<!ENTITY emptyv           "∅" ><!--/varnothing - circle, slash -->
+<!ENTITY gimel            "ℷ" ><!--/gimel - gimel, Hebrew -->
+<!ENTITY iiota            "℩" ><!--inverted iota -->
+<!ENTITY image            "ℑ" ><!--/Im - imaginary   -->
+<!ENTITY imath            "ı" ><!--/imath - small i, no dot -->
+<!ENTITY jmath            "j" ><!--/jmath - small j, no dot -->
+<!ENTITY laemptyv         "⦴" ><!--circle, slash, left arrow above -->
+<!ENTITY lltri            "◺" ><!--lower left triangle -->
+<!ENTITY lrtri            "⊿" ><!--lower right triangle -->
+<!ENTITY mho              "℧" ><!--/mho - conductance -->
+<!ENTITY nang             "∠⃒" ><!--not, vert, angle -->
+<!ENTITY nexist           "∄" ><!--/nexists - negated exists -->
+<!ENTITY oS               "Ⓢ" ><!--/circledS - capital S in circle -->
+<!ENTITY planck           "ℏ" ><!--/hbar - Planck's over 2pi -->
+<!ENTITY plankv           "ℏ" ><!--/hslash - variant Planck's over 2pi -->
+<!ENTITY raemptyv         "⦳" ><!--circle, slash, right arrow above -->
+<!ENTITY range            "⦥" ><!--reverse angle, equal -->
+<!ENTITY real             "ℜ" ><!--/Re - real -->
+<!ENTITY tbrk             "⎴" ><!--top square bracket -->
+<!ENTITY trpezium         "�" ><!--trapezium -->
+<!ENTITY ultri            "◸" ><!--upper left triangle -->
+<!ENTITY urtri            "◹" ><!--upper right triangle -->
+<!ENTITY vzigzag          "⦚" ><!--vertical zig-zag line -->
+<!ENTITY weierp           "℘" ><!--/wp - Weierstrass p -->
+
+<!ENTITY apE              "⩰" ><!--approximately equal or equal to -->
+<!ENTITY ape              "≊" ><!--/approxeq R: approximate, equals -->
+<!ENTITY apid             "≋" ><!--approximately identical to -->
+<!ENTITY asymp            "≈" ><!--/asymp R: asymptotically equal to -->
+<!ENTITY Barv             "⫧" ><!--vert, dbl bar (over) -->
+<!ENTITY bcong            "≌" ><!--/backcong R: reverse congruent -->
+<!ENTITY bepsi            "϶" ><!--/backepsilon R: such that -->
+<!ENTITY bowtie           "⋈" ><!--/bowtie R: -->
+<!ENTITY bsim             "∽" ><!--/backsim R: reverse similar -->
+<!ENTITY bsime            "⋍" ><!--/backsimeq R: reverse similar, eq -->
+<!ENTITY bsolhsub         "\⊂" ><!--reverse solidus, subset -->
+<!ENTITY bump             "≎" ><!--/Bumpeq R: bumpy equals -->
+<!ENTITY bumpE            "⪮" ><!--bump, equals -->
+<!ENTITY bumpe            "≏" ><!--/bumpeq R: bumpy equals, equals -->
+<!ENTITY cire             "≗" ><!--/circeq R: circle, equals -->
+<!ENTITY Colon            "∷" ><!--/Colon, two colons -->
+<!ENTITY Colone           "⩴" ><!--double colon, equals -->
+<!ENTITY colone           "≔" ><!--/coloneq R: colon, equals -->
+<!ENTITY congdot          "⩭" ><!--congruent, dot -->
+<!ENTITY csub             "⫏" ><!--subset, closed -->
+<!ENTITY csube            "⫑" ><!--subset, closed, equals -->
+<!ENTITY csup             "⫐" ><!--superset, closed -->
+<!ENTITY csupe            "⫒" ><!--superset, closed, equals -->
+<!ENTITY cuepr            "⋞" ><!--/curlyeqprec R: curly eq, precedes -->
+<!ENTITY cuesc            "⋟" ><!--/curlyeqsucc R: curly eq, succeeds -->
+<!ENTITY Dashv            "⫤" ><!--dbl dash, vertical -->
+<!ENTITY dashv            "⊣" ><!--/dashv R: dash, vertical -->
+<!ENTITY easter           "⩮" ><!--equal, asterisk above -->
+<!ENTITY ecir             "≖" ><!--/eqcirc R: circle on equals sign -->
+<!ENTITY ecolon           "≕" ><!--/eqcolon R: equals, colon -->
+<!ENTITY eDDot            "⩷" ><!--/ddotseq R: equal with four dots -->
+<!ENTITY eDot             "≑" ><!--/doteqdot /Doteq R: eq, even dots -->
+<!ENTITY efDot            "≒" ><!--/fallingdotseq R: eq, falling dots -->
+<!ENTITY eg               "⪚" ><!--equal-or-greater -->
+<!ENTITY egs              "⪖" ><!--/eqslantgtr R: equal-or-gtr, slanted -->
+<!ENTITY egsdot           "⪘" ><!--equal-or-greater, slanted, dot inside -->
+<!ENTITY el               "⪙" ><!--equal-or-less -->
+<!ENTITY els              "⪕" ><!--/eqslantless R: eq-or-less, slanted -->
+<!ENTITY elsdot           "⪗" ><!--equal-or-less, slanted, dot inside -->
+<!ENTITY equest           "≟" ><!--/questeq R: equal with questionmark -->
+<!ENTITY equivDD          "⩸" ><!--equivalent, four dots above -->
+<!ENTITY erDot            "≓" ><!--/risingdotseq R: eq, rising dots -->
+<!ENTITY esdot            "≐" ><!--/doteq R: equals, single dot above -->
+<!ENTITY Esim             "⩳" ><!--equal, similar -->
+<!ENTITY esim             "≂" ><!--/esim R: equals, similar -->
+<!ENTITY fork             "⋔" ><!--/pitchfork R: pitchfork -->
+<!ENTITY forkv            "⫙" ><!--fork, variant -->
+<!ENTITY frown            "⌢" ><!--/frown R: down curve -->
+<!ENTITY gap              "⪆" ><!--/gtrapprox R: greater, approximate -->
+<!ENTITY gE               "≧" ><!--/geqq R: greater, double equals -->
+<!ENTITY gEl              "⪌" ><!--/gtreqqless R: gt, dbl equals, less -->
+<!ENTITY gel              "⋛" ><!--/gtreqless R: greater, equals, less -->
+<!ENTITY ges              "⩾" ><!--/geqslant R: gt-or-equal, slanted -->
+<!ENTITY gescc            "⪩" ><!--greater than, closed by curve, equal, slanted -->
+<!ENTITY gesdot           "⪀" ><!--greater-than-or-equal, slanted, dot inside -->
+<!ENTITY gesdoto          "⪂" ><!--greater-than-or-equal, slanted, dot above -->
+<!ENTITY gesdotol         "⪄" ><!--greater-than-or-equal, slanted, dot above left -->
+<!ENTITY gesl             "⋛︀" ><!--greater, equal, slanted, less -->
+<!ENTITY gesles           "⪔" ><!--greater, equal, slanted, less, equal, slanted -->
+<!ENTITY Gg               "⋙" ><!--/ggg /Gg /gggtr R: triple gtr-than -->
+<!ENTITY gl               "≷" ><!--/gtrless R: greater, less -->
+<!ENTITY gla              "⪥" ><!--greater, less, apart -->
+<!ENTITY glE              "⪒" ><!--greater, less, equal -->
+<!ENTITY glj              "⪤" ><!--greater, less, overlapping -->
+<!ENTITY gsim             "≳" ><!--/gtrsim R: greater, similar -->
+<!ENTITY gsime            "⪎" ><!--greater, similar, equal -->
+<!ENTITY gsiml            "⪐" ><!--greater, similar, less -->
+<!ENTITY Gt               "≫" ><!--/gg R: dbl greater-than sign -->
+<!ENTITY gtcc             "⪧" ><!--greater than, closed by curve -->
+<!ENTITY gtcir            "⩺" ><!--greater than, circle inside -->
+<!ENTITY gtdot            "⋗" ><!--/gtrdot R: greater than, with dot -->
+<!ENTITY gtquest          "⩼" ><!--greater than, questionmark above -->
+<!ENTITY gtrarr           "⥸" ><!--greater than, right arrow -->
+<!ENTITY homtht           "∻" ><!--homothetic -->
+<!ENTITY lap              "⪅" ><!--/lessapprox R: less, approximate -->
+<!ENTITY lat              "⪫" ><!--larger than -->
+<!ENTITY late             "⪭" ><!--larger than or equal -->
+<!ENTITY lates            "⪭︀" ><!--larger than or equal, slanted -->
+<!ENTITY lE               "≦" ><!--/leqq R: less, double equals -->
+<!ENTITY lEg              "⪋" ><!--/lesseqqgtr R: less, dbl eq, greater -->
+<!ENTITY leg              "⋚" ><!--/lesseqgtr R: less, eq, greater -->
+<!ENTITY les              "⩽" ><!--/leqslant R: less-than-or-eq, slant -->
+<!ENTITY lescc            "⪨" ><!--less than, closed by curve, equal, slanted -->
+<!ENTITY lesdot           "⩿" ><!--less-than-or-equal, slanted, dot inside -->
+<!ENTITY lesdoto          "⪁" ><!--less-than-or-equal, slanted, dot above -->
+<!ENTITY lesdotor         "⪃" ><!--less-than-or-equal, slanted, dot above right -->
+<!ENTITY lesg             "⋚︀" ><!--less, equal, slanted, greater -->
+<!ENTITY lesges           "⪓" ><!--less, equal, slanted, greater, equal, slanted -->
+<!ENTITY lg               "≶" ><!--/lessgtr R: less, greater -->
+<!ENTITY lgE              "⪑" ><!--less, greater, equal -->
+<!ENTITY Ll               "⋘" ><!--/Ll /lll /llless R: triple less-than -->
+<!ENTITY lsim             "≲" ><!--/lesssim R: less, similar -->
+<!ENTITY lsime            "⪍" ><!--less, similar, equal -->
+<!ENTITY lsimg            "⪏" ><!--less, similar, greater -->
+<!ENTITY Lt               "≪" ><!--/ll R: double less-than sign -->
+<!ENTITY ltcc             "⪦" ><!--less than, closed by curve -->
+<!ENTITY ltcir            "⩹" ><!--less than, circle inside -->
+<!ENTITY ltdot            "⋖" ><!--/lessdot R: less than, with dot -->
+<!ENTITY ltlarr           "⥶" ><!--less than, left arrow -->
+<!ENTITY ltquest          "⩻" ><!--less than, questionmark above -->
+<!ENTITY ltrie            "⊴" ><!--/trianglelefteq R: left triangle, eq -->
+<!ENTITY mcomma           "⨩" ><!--minus, comma above -->
+<!ENTITY mDDot            "∺" ><!--minus with four dots, geometric properties -->
+<!ENTITY mid              "∣" ><!--/mid R: -->
+<!ENTITY mlcp             "⫛" ><!--/mlcp -->
+<!ENTITY models           "⊧" ><!--/models R: -->
+<!ENTITY mstpos           "∾" ><!--most positive -->
+<!ENTITY Pr               "⪻" ><!--dbl precedes -->
+<!ENTITY pr               "≺" ><!--/prec R: precedes -->
+<!ENTITY prap             "⪷" ><!--/precapprox R: precedes, approximate -->
+<!ENTITY prcue            "≼" ><!--/preccurlyeq R: precedes, curly eq -->
+<!ENTITY prE              "⪳" ><!--precedes, dbl equals -->
+<!ENTITY pre              "⪯" ><!--/preceq R: precedes, equals -->
+<!ENTITY prsim            "≾" ><!--/precsim R: precedes, similar -->
+<!ENTITY prurel           "⊰" ><!--element precedes under relation -->
+<!ENTITY ratio            "∶" ><!--/ratio -->
+<!ENTITY rtrie            "⊵" ><!--/trianglerighteq R: right tri, eq -->
+<!ENTITY rtriltri         "⧎" ><!--right triangle above left triangle -->
+<!ENTITY Sc               "⪼" ><!--dbl succeeds -->
+<!ENTITY sc               "≻" ><!--/succ R: succeeds -->
+<!ENTITY scap             "⪸" ><!--/succapprox R: succeeds, approximate -->
+<!ENTITY sccue            "≽" ><!--/succcurlyeq R: succeeds, curly eq -->
+<!ENTITY scE              "⪴" ><!--succeeds, dbl equals -->
+<!ENTITY sce              "⪰" ><!--/succeq R: succeeds, equals -->
+<!ENTITY scsim            "≿" ><!--/succsim R: succeeds, similar -->
+<!ENTITY sdote            "⩦" ><!--equal, dot below -->
+<!ENTITY sfrown           "⌢" ><!--/smallfrown R: small down curve -->
+<!ENTITY simg             "⪞" ><!--similar, greater -->
+<!ENTITY simgE            "⪠" ><!--similar, greater, equal -->
+<!ENTITY siml             "⪝" ><!--similar, less -->
+<!ENTITY simlE            "⪟" ><!--similar, less, equal -->
+<!ENTITY smid             "∣" ><!--/shortmid R: -->
+<!ENTITY smile            "⌣" ><!--/smile R: up curve -->
+<!ENTITY smt              "⪪" ><!--smaller than -->
+<!ENTITY smte             "⪬" ><!--smaller than or equal -->
+<!ENTITY smtes            "⪬︀" ><!--smaller than or equal, slanted -->
+<!ENTITY spar             "∥" ><!--/shortparallel R: short parallel -->
+<!ENTITY sqsub            "⊏" ><!--/sqsubset R: square subset -->
+<!ENTITY sqsube           "⊑" ><!--/sqsubseteq R: square subset, equals -->
+<!ENTITY sqsup            "⊐" ><!--/sqsupset R: square superset -->
+<!ENTITY sqsupe           "⊒" ><!--/sqsupseteq R: square superset, eq -->
+<!ENTITY ssmile           "⌣" ><!--/smallsmile R: small up curve -->
+<!ENTITY Sub              "⋐" ><!--/Subset R: double subset -->
+<!ENTITY subE             "⫅" ><!--/subseteqq R: subset, dbl equals -->
+<!ENTITY subedot          "⫃" ><!--subset, equals, dot -->
+<!ENTITY submult          "⫁" ><!--subset, multiply -->
+<!ENTITY subplus          "⪿" ><!--subset, plus -->
+<!ENTITY subrarr          "⥹" ><!--subset, right arrow -->
+<!ENTITY subsim           "⫇" ><!--subset, similar -->
+<!ENTITY subsub           "⫕" ><!--subset above subset -->
+<!ENTITY subsup           "⫓" ><!--subset above superset -->
+<!ENTITY Sup              "⋑" ><!--/Supset R: dbl superset -->
+<!ENTITY supdsub          "⫘" ><!--superset, subset, dash joining them -->
+<!ENTITY supE             "⫆" ><!--/supseteqq R: superset, dbl equals -->
+<!ENTITY supedot          "⫄" ><!--superset, equals, dot -->
+<!ENTITY suphsol          "⊃/" ><!--superset, solidus -->
+<!ENTITY suphsub          "⫗" ><!--superset, subset -->
+<!ENTITY suplarr          "⥻" ><!--superset, left arrow -->
+<!ENTITY supmult          "⫂" ><!--superset, multiply -->
+<!ENTITY supplus          "⫀" ><!--superset, plus -->
+<!ENTITY supsim           "⫈" ><!--superset, similar -->
+<!ENTITY supsub           "⫔" ><!--superset above subset -->
+<!ENTITY supsup           "⫖" ><!--superset above superset -->
+<!ENTITY thkap            "≈" ><!--/thickapprox R: thick approximate -->
+<!ENTITY thksim           "∼" ><!--/thicksim R: thick similar -->
+<!ENTITY topfork          "⫚" ><!--fork with top -->
+<!ENTITY trie             "≜" ><!--/triangleq R: triangle, equals -->
+<!ENTITY twixt            "≬" ><!--/between R: between -->
+<!ENTITY Vbar             "⫫" ><!--dbl vert, bar (under) -->
+<!ENTITY vBar             "⫨" ><!--vert, dbl bar (under) -->
+<!ENTITY vBarv            "⫩" ><!--dbl bar, vert over and under -->
+<!ENTITY VDash            "⊫" ><!--dbl vert, dbl dash -->
+<!ENTITY Vdash            "⊩" ><!--/Vdash R: dbl vertical, dash -->
+<!ENTITY vDash            "⊨" ><!--/vDash R: vertical, dbl dash -->
+<!ENTITY vdash            "⊢" ><!--/vdash R: vertical, dash -->
+<!ENTITY Vdashl           "⫦" ><!--vertical, dash (long) -->
+<!ENTITY vltri            "⊲" ><!--/vartriangleleft R: l tri, open, var -->
+<!ENTITY vprop            "∝" ><!--/varpropto R: proportional, variant -->
+<!ENTITY vrtri            "⊳" ><!--/vartriangleright R: r tri, open, var -->
+<!ENTITY Vvdash           "⊪" ><!--/Vvdash R: triple vertical, dash -->
+
+<!ENTITY alpha            "α" ><!--/alpha small alpha, Greek -->
+<!ENTITY beta             "β" ><!--/beta small beta, Greek -->
+<!ENTITY chi              "χ" ><!--/chi small chi, Greek -->
+<!ENTITY Delta            "Δ" ><!--/Delta capital Delta, Greek -->
+<!ENTITY delta            "δ" ><!--/delta small delta, Greek -->
+<!ENTITY epsi             "ϵ" ><!--/straightepsilon, small epsilon, Greek -->
+<!ENTITY epsiv            "ε" ><!--/varepsilon -->
+<!ENTITY eta              "η" ><!--/eta small eta, Greek -->
+<!ENTITY Gamma            "Γ" ><!--/Gamma capital Gamma, Greek -->
+<!ENTITY gamma            "γ" ><!--/gamma small gamma, Greek -->
+<!ENTITY Gammad           "Ϝ" ><!--capital digamma -->
+<!ENTITY gammad           "ϝ" ><!--/digamma -->
+<!ENTITY iota             "ι" ><!--/iota small iota, Greek -->
+<!ENTITY kappa            "κ" ><!--/kappa small kappa, Greek -->
+<!ENTITY kappav           "ϰ" ><!--/varkappa -->
+<!ENTITY Lambda           "Λ" ><!--/Lambda capital Lambda, Greek -->
+<!ENTITY lambda           "λ" ><!--/lambda small lambda, Greek -->
+<!ENTITY mu               "μ" ><!--/mu small mu, Greek -->
+<!ENTITY nu               "ν" ><!--/nu small nu, Greek -->
+<!ENTITY Omega            "Ω" ><!--/Omega capital Omega, Greek -->
+<!ENTITY omega            "ω" ><!--/omega small omega, Greek -->
+<!ENTITY Phi              "Φ" ><!--/Phi capital Phi, Greek -->
+<!ENTITY phi              "ϕ" ><!--/straightphi - small phi, Greek -->
+<!ENTITY phiv             "φ" ><!--/varphi - curly or open phi -->
+<!ENTITY Pi               "Π" ><!--/Pi capital Pi, Greek -->
+<!ENTITY pi               "π" ><!--/pi small pi, Greek -->
+<!ENTITY piv              "ϖ" ><!--/varpi -->
+<!ENTITY Psi              "Ψ" ><!--/Psi capital Psi, Greek -->
+<!ENTITY psi              "ψ" ><!--/psi small psi, Greek -->
+<!ENTITY rho              "ρ" ><!--/rho small rho, Greek -->
+<!ENTITY rhov             "ϱ" ><!--/varrho -->
+<!ENTITY Sigma            "Σ" ><!--/Sigma capital Sigma, Greek -->
+<!ENTITY sigma            "σ" ><!--/sigma small sigma, Greek -->
+<!ENTITY sigmav           "ς" ><!--/varsigma -->
+<!ENTITY tau              "τ" ><!--/tau small tau, Greek -->
+<!ENTITY Theta            "Θ" ><!--/Theta capital Theta, Greek -->
+<!ENTITY theta            "θ" ><!--/theta straight theta, small theta, Greek -->
+<!ENTITY thetav           "ϑ" ><!--/vartheta - curly or open theta -->
+<!ENTITY Upsi             "ϒ" ><!--/Upsilon capital Upsilon, Greek -->
+<!ENTITY upsi             "υ" ><!--/upsilon small upsilon, Greek -->
+<!ENTITY Xi               "Ξ" ><!--/Xi capital Xi, Greek -->
+<!ENTITY xi               "ξ" ><!--/xi small xi, Greek -->
+<!ENTITY zeta             "ζ" ><!--/zeta small zeta, Greek -->
+
+<!ENTITY % plane1D  "&#38;#x1D">
+
+<!ENTITY Afr              "%plane1D;504;" ><!--/frak A, upper case a -->
+<!ENTITY afr              "%plane1D;51E;" ><!--/frak a, lower case a -->
+<!ENTITY Bfr              "%plane1D;505;" ><!--/frak B, upper case b -->
+<!ENTITY bfr              "%plane1D;51F;" ><!--/frak b, lower case b -->
+<!ENTITY Cfr              "ℭ" ><!--/frak C, upper case c -->
+<!ENTITY cfr              "%plane1D;520;" ><!--/frak c, lower case c -->
+<!ENTITY Dfr              "%plane1D;507;" ><!--/frak D, upper case d -->
+<!ENTITY dfr              "%plane1D;521;" ><!--/frak d, lower case d -->
+<!ENTITY Efr              "%plane1D;508;" ><!--/frak E, upper case e -->
+<!ENTITY efr              "%plane1D;522;" ><!--/frak e, lower case e -->
+<!ENTITY Ffr              "%plane1D;509;" ><!--/frak F, upper case f -->
+<!ENTITY ffr              "%plane1D;523;" ><!--/frak f, lower case f -->
+<!ENTITY Gfr              "%plane1D;50A;" ><!--/frak G, upper case g -->
+<!ENTITY gfr              "%plane1D;524;" ><!--/frak g, lower case g -->
+<!ENTITY Hfr              "ℌ" ><!--/frak H, upper case h -->
+<!ENTITY hfr              "%plane1D;525;" ><!--/frak h, lower case h -->
+<!ENTITY Ifr              "ℑ" ><!--/frak I, upper case i -->
+<!ENTITY ifr              "%plane1D;526;" ><!--/frak i, lower case i -->
+<!ENTITY Jfr              "%plane1D;50D;" ><!--/frak J, upper case j -->
+<!ENTITY jfr              "%plane1D;527;" ><!--/frak j, lower case j -->
+<!ENTITY Kfr              "%plane1D;50E;" ><!--/frak K, upper case k -->
+<!ENTITY kfr              "%plane1D;528;" ><!--/frak k, lower case k -->
+<!ENTITY Lfr              "%plane1D;50F;" ><!--/frak L, upper case l -->
+<!ENTITY lfr              "%plane1D;529;" ><!--/frak l, lower case l -->
+<!ENTITY Mfr              "%plane1D;510;" ><!--/frak M, upper case m -->
+<!ENTITY mfr              "%plane1D;52A;" ><!--/frak m, lower case m -->
+<!ENTITY Nfr              "%plane1D;511;" ><!--/frak N, upper case n -->
+<!ENTITY nfr              "%plane1D;52B;" ><!--/frak n, lower case n -->
+<!ENTITY Ofr              "%plane1D;512;" ><!--/frak O, upper case o -->
+<!ENTITY ofr              "%plane1D;52C;" ><!--/frak o, lower case o -->
+<!ENTITY Pfr              "%plane1D;513;" ><!--/frak P, upper case p -->
+<!ENTITY pfr              "%plane1D;52D;" ><!--/frak p, lower case p -->
+<!ENTITY Qfr              "%plane1D;514;" ><!--/frak Q, upper case q -->
+<!ENTITY qfr              "%plane1D;52E;" ><!--/frak q, lower case q -->
+<!ENTITY Rfr              "ℜ" ><!--/frak R, upper case r -->
+<!ENTITY rfr              "%plane1D;52F;" ><!--/frak r, lower case r -->
+<!ENTITY Sfr              "%plane1D;516;" ><!--/frak S, upper case s -->
+<!ENTITY sfr              "%plane1D;530;" ><!--/frak s, lower case s -->
+<!ENTITY Tfr              "%plane1D;517;" ><!--/frak T, upper case t -->
+<!ENTITY tfr              "%plane1D;531;" ><!--/frak t, lower case t -->
+<!ENTITY Ufr              "%plane1D;518;" ><!--/frak U, upper case u -->
+<!ENTITY ufr              "%plane1D;532;" ><!--/frak u, lower case u -->
+<!ENTITY Vfr              "%plane1D;519;" ><!--/frak V, upper case v -->
+<!ENTITY vfr              "%plane1D;533;" ><!--/frak v, lower case v -->
+<!ENTITY Wfr              "%plane1D;51A;" ><!--/frak W, upper case w -->
+<!ENTITY wfr              "%plane1D;534;" ><!--/frak w, lower case w -->
+<!ENTITY Xfr              "%plane1D;51B;" ><!--/frak X, upper case x -->
+<!ENTITY xfr              "%plane1D;535;" ><!--/frak x, lower case x -->
+<!ENTITY Yfr              "%plane1D;51C;" ><!--/frak Y, upper case y -->
+<!ENTITY yfr              "%plane1D;536;" ><!--/frak y, lower case y -->
+<!ENTITY Zfr              "ℨ" ><!--/frak Z, upper case z  -->
+<!ENTITY zfr              "%plane1D;537;" ><!--/frak z, lower case z -->
+
+<!ENTITY % plane1D  "&#38;#x1D">
+
+<!ENTITY Aopf             "%plane1D;538;" ><!--/Bbb A, open face A -->
+<!ENTITY Bopf             "%plane1D;539;" ><!--/Bbb B, open face B -->
+<!ENTITY Copf             "ℂ" ><!--/Bbb C, open face C -->
+<!ENTITY Dopf             "%plane1D;53B;" ><!--/Bbb D, open face D -->
+<!ENTITY Eopf             "%plane1D;53C;" ><!--/Bbb E, open face E -->
+<!ENTITY Fopf             "%plane1D;53D;" ><!--/Bbb F, open face F -->
+<!ENTITY Gopf             "%plane1D;53E;" ><!--/Bbb G, open face G -->
+<!ENTITY Hopf             "ℍ" ><!--/Bbb H, open face H -->
+<!ENTITY Iopf             "%plane1D;540;" ><!--/Bbb I, open face I -->
+<!ENTITY Jopf             "%plane1D;541;" ><!--/Bbb J, open face J -->
+<!ENTITY Kopf             "%plane1D;542;" ><!--/Bbb K, open face K  -->
+<!ENTITY Lopf             "%plane1D;543;" ><!--/Bbb L, open face L  -->
+<!ENTITY Mopf             "%plane1D;544;" ><!--/Bbb M, open face M  -->
+<!ENTITY Nopf             "ℕ" ><!--/Bbb N, open face N -->
+<!ENTITY Oopf             "%plane1D;546;" ><!--/Bbb O, open face O -->
+<!ENTITY Popf             "ℙ" ><!--/Bbb P, open face P -->
+<!ENTITY Qopf             "ℚ" ><!--/Bbb Q, open face Q -->
+<!ENTITY Ropf             "ℝ" ><!--/Bbb R, open face R -->
+<!ENTITY Sopf             "%plane1D;54A;" ><!--/Bbb S, open face S -->
+<!ENTITY Topf             "%plane1D;54B;" ><!--/Bbb T, open face T -->
+<!ENTITY Uopf             "%plane1D;54C;" ><!--/Bbb U, open face U -->
+<!ENTITY Vopf             "%plane1D;54D;" ><!--/Bbb V, open face V -->
+<!ENTITY Wopf             "%plane1D;54E;" ><!--/Bbb W, open face W -->
+<!ENTITY Xopf             "%plane1D;54F;" ><!--/Bbb X, open face X -->
+<!ENTITY Yopf             "%plane1D;550;" ><!--/Bbb Y, open face Y -->
+<!ENTITY Zopf             "ℤ" ><!--/Bbb Z, open face Z -->
+
+<!ENTITY % plane1D  "&#38;#x1D">
+
+<!ENTITY Ascr             "%plane1D;49C;" ><!--/scr A, script letter A -->
+<!ENTITY ascr             "%plane1D;4B6;" ><!--/scr a, script letter a -->
+<!ENTITY Bscr             "ℬ" ><!--/scr B, script letter B -->
+<!ENTITY bscr             "%plane1D;4B7;" ><!--/scr b, script letter b -->
+<!ENTITY Cscr             "%plane1D;49E;" ><!--/scr C, script letter C -->
+<!ENTITY cscr             "%plane1D;4B8;" ><!--/scr c, script letter c -->
+<!ENTITY Dscr             "%plane1D;49F;" ><!--/scr D, script letter D -->
+<!ENTITY dscr             "%plane1D;4B9;" ><!--/scr d, script letter d -->
+<!ENTITY Escr             "ℰ" ><!--/scr E, script letter E -->
+<!ENTITY escr             "ℯ" ><!--/scr e, script letter e -->
+<!ENTITY Fscr             "ℱ" ><!--/scr F, script letter F -->
+<!ENTITY fscr             "%plane1D;4BB;" ><!--/scr f, script letter f -->
+<!ENTITY Gscr             "%plane1D;4A2;" ><!--/scr G, script letter G -->
+<!ENTITY gscr             "ℊ" ><!--/scr g, script letter g -->
+<!ENTITY Hscr             "ℋ" ><!--/scr H, script letter H -->
+<!ENTITY hscr             "%plane1D;4BD;" ><!--/scr h, script letter h -->
+<!ENTITY Iscr             "ℐ" ><!--/scr I, script letter I -->
+<!ENTITY iscr             "%plane1D;4BE;" ><!--/scr i, script letter i -->
+<!ENTITY Jscr             "%plane1D;4A5;" ><!--/scr J, script letter J -->
+<!ENTITY jscr             "%plane1D;4BF;" ><!--/scr j, script letter j -->
+<!ENTITY Kscr             "%plane1D;4A6;" ><!--/scr K, script letter K -->
+<!ENTITY kscr             "%plane1D;4C0;" ><!--/scr k, script letter k -->
+<!ENTITY Lscr             "ℒ" ><!--/scr L, script letter L -->
+<!ENTITY lscr             "%plane1D;4C1;" ><!--/scr l, script letter l -->
+<!ENTITY Mscr             "ℳ" ><!--/scr M, script letter M -->
+<!ENTITY mscr             "%plane1D;4C2;" ><!--/scr m, script letter m -->
+<!ENTITY Nscr             "%plane1D;4A9;" ><!--/scr N, script letter N -->
+<!ENTITY nscr             "%plane1D;4C3;" ><!--/scr n, script letter n -->
+<!ENTITY Oscr             "%plane1D;4AA;" ><!--/scr O, script letter O -->
+<!ENTITY oscr             "ℴ" ><!--/scr o, script letter o -->
+<!ENTITY Pscr             "%plane1D;4AB;" ><!--/scr P, script letter P -->
+<!ENTITY pscr             "%plane1D;4C5;" ><!--/scr p, script letter p -->
+<!ENTITY Qscr             "%plane1D;4AC;" ><!--/scr Q, script letter Q -->
+<!ENTITY qscr             "%plane1D;4C6;" ><!--/scr q, script letter q -->
+<!ENTITY Rscr             "ℛ" ><!--/scr R, script letter R -->
+<!ENTITY rscr             "%plane1D;4C7;" ><!--/scr r, script letter r -->
+<!ENTITY Sscr             "%plane1D;4AE;" ><!--/scr S, script letter S -->
+<!ENTITY sscr             "%plane1D;4C8;" ><!--/scr s, script letter s -->
+<!ENTITY Tscr             "%plane1D;4AF;" ><!--/scr T, script letter T -->
+<!ENTITY tscr             "%plane1D;4C9;" ><!--/scr t, script letter t -->
+<!ENTITY Uscr             "%plane1D;4B0;" ><!--/scr U, script letter U -->
+<!ENTITY uscr             "%plane1D;4CA;" ><!--/scr u, script letter u -->
+<!ENTITY Vscr             "%plane1D;4B1;" ><!--/scr V, script letter V -->
+<!ENTITY vscr             "%plane1D;4CB;" ><!--/scr v, script letter v -->
+<!ENTITY Wscr             "%plane1D;4B2;" ><!--/scr W, script letter W -->
+<!ENTITY wscr             "%plane1D;4CC;" ><!--/scr w, script letter w -->
+<!ENTITY Xscr             "%plane1D;4B3;" ><!--/scr X, script letter X -->
+<!ENTITY xscr             "%plane1D;4CD;" ><!--/scr x, script letter x -->
+<!ENTITY Yscr             "%plane1D;4B4;" ><!--/scr Y, script letter Y -->
+<!ENTITY yscr             "%plane1D;4CE;" ><!--/scr y, script letter y -->
+<!ENTITY Zscr             "%plane1D;4B5;" ><!--/scr Z, script letter Z -->
+<!ENTITY zscr             "%plane1D;4CF;" ><!--/scr z, script letter z -->
+
+<!ENTITY acd              "∿" ><!--ac current -->
+<!ENTITY aleph            "ℵ" ><!--/aleph aleph, Hebrew -->
+<!ENTITY And              "⩓" ><!--dbl logical and -->
+<!ENTITY and              "∧" ><!--/wedge /land B: logical and -->
+<!ENTITY andand           "⩕" ><!--two logical and -->
+<!ENTITY andd             "⩜" ><!--and, horizontal dash -->
+<!ENTITY andslope         "⩘" ><!--sloping large and -->
+<!ENTITY andv             "⩚" ><!--and with middle stem -->
+<!ENTITY angrt            "∟" ><!--right (90 degree) angle -->
+<!ENTITY angsph           "∢" ><!--/sphericalangle angle-spherical -->
+<!ENTITY angst            "Å" ><!--Angstrom capital A, ring -->
+<!ENTITY ap               "≈" ><!--/approx R: approximate -->
+<!ENTITY apacir           "⩯" ><!--approximate, circumflex accent -->
+<!ENTITY awconint         "∳" ><!--contour integral, anti-clockwise -->
+<!ENTITY awint            "⨑" ><!--anti clock-wise integration -->
+<!ENTITY becaus           "∵" ><!--/because R: because -->
+<!ENTITY bernou           "ℬ" ><!--Bernoulli function (script capital B)  -->
+<!ENTITY bne              "=⃥" ><!--reverse not equal -->
+<!ENTITY bnequiv          "≡⃥" ><!--reverse not equivalent -->
+<!ENTITY bNot             "⫭" ><!--reverse not with two horizontal strokes -->
+<!ENTITY bnot             "⌐" ><!--reverse not -->
+<!ENTITY bottom           "⊥" ><!--/bot bottom -->
+<!ENTITY cap              "∩" ><!--/cap B: intersection -->
+<!ENTITY Cconint          "∰" ><!--triple contour integral operator -->
+<!ENTITY cirfnint         "⨐" ><!--circulation function -->
+<!ENTITY compfn           "∘" ><!--/circ B: composite function (small circle) -->
+<!ENTITY cong             "≅" ><!--/cong R: congruent with -->
+<!ENTITY Conint           "∯" ><!--double contour integral operator -->
+<!ENTITY conint           "∮" ><!--/oint L: contour integral operator -->
+<!ENTITY ctdot            "⋯" ><!--/cdots, three dots, centered -->
+<!ENTITY cup              "∪" ><!--/cup B: union or logical sum -->
+<!ENTITY cwconint         "∲" ><!--contour integral, clockwise -->
+<!ENTITY cwint            "∱" ><!--clockwise integral -->
+<!ENTITY cylcty           "⌭" ><!--cylindricity -->
+<!ENTITY disin            "⋲" ><!--set membership, long horizontal stroke -->
+<!ENTITY Dot              "¨" ><!--dieresis or umlaut mark -->
+<!ENTITY DotDot           " ⃜" ><!--four dots above -->
+<!ENTITY dsol             "⧶" ><!--solidus, bar above -->
+<!ENTITY dtdot            "⋱" ><!--/ddots, three dots, descending -->
+<!ENTITY dwangle          "⦦" ><!--large downward pointing angle -->
+<!ENTITY elinters         "�" ><!--electrical intersection -->
+<!ENTITY epar             "⋕" ><!--parallel, equal; equal or parallel -->
+<!ENTITY eparsl           "⧣" ><!--parallel, slanted, equal; homothetically congruent to -->
+<!ENTITY equiv            "≡" ><!--/equiv R: identical with -->
+<!ENTITY eqvparsl         "⧥" ><!--equivalent, equal; congruent and parallel -->
+<!ENTITY exist            "∃" ><!--/exists at least one exists -->
+<!ENTITY fltns            "▱" ><!--flatness -->
+<!ENTITY fnof             "ƒ" ><!--function of (italic small f) -->
+<!ENTITY forall           "∀" ><!--/forall for all -->
+<!ENTITY fpartint         "⨍" ><!--finite part integral -->
+<!ENTITY ge               "≥" ><!--/geq /ge R: greater-than-or-equal -->
+<!ENTITY hamilt           "ℋ" ><!--Hamiltonian (script capital H)  -->
+<!ENTITY iff              "⇔" ><!--/iff if and only if  -->
+<!ENTITY iinfin           "⧜" ><!--infinity sign, incomplete -->
+<!ENTITY imped            "Ƶ" ><!--impedance -->
+<!ENTITY infin            "∞" ><!--/infty infinity -->
+<!ENTITY infintie         "⧝" ><!--tie, infinity -->
+<!ENTITY Int              "∬" ><!--double integral operator -->
+<!ENTITY int              "∫" ><!--/int L: integral operator -->
+<!ENTITY intlarhk         "⨗" ><!--integral, left arrow with hook -->
+<!ENTITY isin             "∈" ><!--/in R: set membership  -->
+<!ENTITY isindot          "⋵" ><!--set membership, dot above -->
+<!ENTITY isinE            "⋹" ><!--set membership, two horizontal strokes -->
+<!ENTITY isins            "⋴" ><!--set membership, vertical bar on horizontal stroke -->
+<!ENTITY isinsv           "⋳" ><!--large set membership, vertical bar on horizontal stroke -->
+<!ENTITY isinv            "∈" ><!--set membership, variant -->
+<!ENTITY lagran           "ℒ" ><!--Lagrangian (script capital L)  -->
+<!ENTITY Lang             "《" ><!--left angle bracket, double -->
+<!ENTITY lang             "〈" ><!--/langle O: left angle bracket -->
+<!ENTITY lArr             "⇐" ><!--/Leftarrow A: is implied by -->
+<!ENTITY lbbrk            "〔" ><!--left broken bracket -->
+<!ENTITY le               "≤" ><!--/leq /le R: less-than-or-equal -->
+<!ENTITY loang            "〘" ><!--left open angular bracket -->
+<!ENTITY lobrk            "〚" ><!--left open bracket -->
+<!ENTITY lopar            "⦅" ><!--left open parenthesis -->
+<!ENTITY lowast           "∗" ><!--low asterisk -->
+<!ENTITY minus            "−" ><!--B: minus sign -->
+<!ENTITY mnplus           "∓" ><!--/mp B: minus-or-plus sign -->
+<!ENTITY nabla            "∇" ><!--/nabla del, Hamilton operator -->
+<!ENTITY ne               "≠" ><!--/ne /neq R: not equal -->
+<!ENTITY nedot            "≐̸" ><!--not equal, dot -->
+<!ENTITY nhpar            "⫲" ><!--not, horizontal, parallel -->
+<!ENTITY ni               "∋" ><!--/ni /owns R: contains -->
+<!ENTITY nis              "⋼" ><!--contains, vertical bar on horizontal stroke -->
+<!ENTITY nisd             "⋺" ><!--contains, long horizontal stroke -->
+<!ENTITY niv              "∋" ><!--contains, variant -->
+<!ENTITY Not              "⫬" ><!--not with two horizontal strokes -->
+<!ENTITY notin            "∉" ><!--/notin N: negated set membership -->
+<!ENTITY notindot         "⋵̸" ><!--negated set membership, dot above -->
+<!ENTITY notinE           "⋹̸" ><!--negated set membership, two horizontal strokes -->
+<!ENTITY notinva          "∉" ><!--negated set membership, variant -->
+<!ENTITY notinvb          "⋷" ><!--negated set membership, variant -->
+<!ENTITY notinvc          "⋶" ><!--negated set membership, variant -->
+<!ENTITY notni            "∌" ><!--negated contains -->
+<!ENTITY notniva          "∌" ><!--negated contains, variant -->
+<!ENTITY notnivb          "⋾" ><!--contains, variant -->
+<!ENTITY notnivc          "⋽" ><!--contains, variant -->
+<!ENTITY nparsl           "⫽⃥" ><!--not parallel, slanted -->
+<!ENTITY npart            "∂̸" ><!--not partial differential -->
+<!ENTITY npolint          "⨔" ><!--line integration, not including the pole -->
+<!ENTITY nvinfin          "⧞" ><!--not, vert, infinity -->
+<!ENTITY olcross          "⦻" ><!--circle, cross -->
+<!ENTITY Or               "⩔" ><!--dbl logical or -->
+<!ENTITY or               "∨" ><!--/vee /lor B: logical or -->
+<!ENTITY ord              "⩝" ><!--or, horizontal dash -->
+<!ENTITY order            "ℴ" ><!--order of (script small o)  -->
+<!ENTITY oror             "⩖" ><!--two logical or -->
+<!ENTITY orslope          "⩗" ><!--sloping large or -->
+<!ENTITY orv              "⩛" ><!--or with middle stem -->
+<!ENTITY par              "∥" ><!--/parallel R: parallel -->
+<!ENTITY parsl            "⫽" ><!--parallel, slanted -->
+<!ENTITY part             "∂" ><!--/partial partial differential -->
+<!ENTITY permil           "‰" ><!--per thousand -->
+<!ENTITY perp             "⊥" ><!--/perp R: perpendicular -->
+<!ENTITY pertenk          "‱" ><!--per 10 thousand -->
+<!ENTITY phmmat           "ℳ" ><!--physics M-matrix (script capital M)  -->
+<!ENTITY pointint         "⨕" ><!--integral around a point operator -->
+<!ENTITY Prime            "″" ><!--double prime or second -->
+<!ENTITY prime            "′" ><!--/prime prime or minute -->
+<!ENTITY profalar         "⌮" ><!--all-around profile -->
+<!ENTITY profline         "⌒" ><!--profile of a line -->
+<!ENTITY profsurf         "⌓" ><!--profile of a surface -->
+<!ENTITY prop             "∝" ><!--/propto R: is proportional to -->
+<!ENTITY qint             "⨌" ><!--/iiiint quadruple integral operator -->
+<!ENTITY qprime           "⁗" ><!--quadruple prime -->
+<!ENTITY quatint          "⨖" ><!--quaternion integral operator -->
+<!ENTITY radic            "√" ><!--/surd radical -->
+<!ENTITY Rang             "》" ><!--right angle bracket, double -->
+<!ENTITY rang             "〉" ><!--/rangle C: right angle bracket -->
+<!ENTITY rArr             "⇒" ><!--/Rightarrow A: implies -->
+<!ENTITY rbbrk            "〕" ><!--right broken bracket -->
+<!ENTITY roang            "〙" ><!--right open angular bracket -->
+<!ENTITY robrk            "〛" ><!--right open bracket -->
+<!ENTITY ropar            "⦆" ><!--right open parenthesis -->
+<!ENTITY rppolint         "⨒" ><!--line integration, rectangular path around pole -->
+<!ENTITY scpolint         "⨓" ><!--line integration, semi-circular path around pole -->
+<!ENTITY sim              "∼" ><!--/sim R: similar -->
+<!ENTITY simdot           "⩪" ><!--similar, dot -->
+<!ENTITY sime             "≃" ><!--/simeq R: similar, equals -->
+<!ENTITY smeparsl         "⧤" ><!--similar, parallel, slanted, equal -->
+<!ENTITY square           "□" ><!--/square, square -->
+<!ENTITY squarf           "▪" ><!--/blacksquare, square, filled  -->
+<!ENTITY strns            "¯" ><!--straightness -->
+<!ENTITY sub              "⊂" ><!--/subset R: subset or is implied by -->
+<!ENTITY sube             "⊆" ><!--/subseteq R: subset, equals -->
+<!ENTITY sup              "⊃" ><!--/supset R: superset or implies -->
+<!ENTITY supe             "⊇" ><!--/supseteq R: superset, equals -->
+<!ENTITY tdot             " ⃛" ><!--three dots above -->
+<!ENTITY there4           "∴" ><!--/therefore R: therefore -->
+<!ENTITY tint             "∭" ><!--/iiint triple integral operator -->
+<!ENTITY top              "⊤" ><!--/top top -->
+<!ENTITY topbot           "⌶" ><!--top and bottom -->
+<!ENTITY topcir           "⫱" ><!--top, circle below -->
+<!ENTITY tprime           "‴" ><!--triple prime -->
+<!ENTITY utdot            "⋰" ><!--three dots, ascending -->
+<!ENTITY uwangle          "⦧" ><!--large upward pointing angle -->
+<!ENTITY vangrt           "⦜" ><!--right angle, variant -->
+<!ENTITY veeeq            "≚" ><!--logical or, equals -->
+<!ENTITY Verbar           "‖" ><!--/Vert dbl vertical bar -->
+<!ENTITY wedgeq           "≙" ><!--/wedgeq R: corresponds to (wedge, equals) -->
+<!ENTITY xnis             "⋻" ><!--large contains, vertical bar on horizontal stroke -->
+
+<!-- Entity sets from informative annex to ISO 8879:1986 (SGML) ....... -->
+
+<!ENTITY boxDL            "╗" ><!--lower left quadrant -->
+<!ENTITY boxDl            "╖" ><!--lower left quadrant -->
+<!ENTITY boxdL            "╕" ><!--lower left quadrant -->
+<!ENTITY boxdl            "┐" ><!--lower left quadrant -->
+<!ENTITY boxDR            "╔" ><!--lower right quadrant -->
+<!ENTITY boxDr            "╓" ><!--lower right quadrant -->
+<!ENTITY boxdR            "╒" ><!--lower right quadrant -->
+<!ENTITY boxdr            "┌" ><!--lower right quadrant -->
+<!ENTITY boxH             "═" ><!--horizontal line -->
+<!ENTITY boxh             "─" ><!--horizontal line  -->
+<!ENTITY boxHD            "╦" ><!--lower left and right quadrants -->
+<!ENTITY boxHd            "╤" ><!--lower left and right quadrants -->
+<!ENTITY boxhD            "╥" ><!--lower left and right quadrants -->
+<!ENTITY boxhd            "┬" ><!--lower left and right quadrants -->
+<!ENTITY boxHU            "╩" ><!--upper left and right quadrants -->
+<!ENTITY boxHu            "╧" ><!--upper left and right quadrants -->
+<!ENTITY boxhU            "╨" ><!--upper left and right quadrants -->
+<!ENTITY boxhu            "┴" ><!--upper left and right quadrants -->
+<!ENTITY boxUL            "╝" ><!--upper left quadrant -->
+<!ENTITY boxUl            "╜" ><!--upper left quadrant -->
+<!ENTITY boxuL            "╛" ><!--upper left quadrant -->
+<!ENTITY boxul            "┘" ><!--upper left quadrant -->
+<!ENTITY boxUR            "╚" ><!--upper right quadrant -->
+<!ENTITY boxUr            "╙" ><!--upper right quadrant -->
+<!ENTITY boxuR            "╘" ><!--upper right quadrant -->
+<!ENTITY boxur            "└" ><!--upper right quadrant -->
+<!ENTITY boxV             "║" ><!--vertical line -->
+<!ENTITY boxv             "│" ><!--vertical line -->
+<!ENTITY boxVH            "╬" ><!--all four quadrants -->
+<!ENTITY boxVh            "╫" ><!--all four quadrants -->
+<!ENTITY boxvH            "╪" ><!--all four quadrants -->
+<!ENTITY boxvh            "┼" ><!--all four quadrants -->
+<!ENTITY boxVL            "╣" ><!--upper and lower left quadrants -->
+<!ENTITY boxVl            "╢" ><!--upper and lower left quadrants -->
+<!ENTITY boxvL            "╡" ><!--upper and lower left quadrants -->
+<!ENTITY boxvl            "┤" ><!--upper and lower left quadrants -->
+<!ENTITY boxVR            "╠" ><!--upper and lower right quadrants -->
+<!ENTITY boxVr            "╟" ><!--upper and lower right quadrants -->
+<!ENTITY boxvR            "╞" ><!--upper and lower right quadrants -->
+<!ENTITY boxvr            "├" ><!--upper and lower right quadrants -->
+
+<!ENTITY Acy              "А" ><!--=capital A, Cyrillic -->
+<!ENTITY acy              "а" ><!--=small a, Cyrillic -->
+<!ENTITY Bcy              "Б" ><!--=capital BE, Cyrillic -->
+<!ENTITY bcy              "б" ><!--=small be, Cyrillic -->
+<!ENTITY CHcy             "Ч" ><!--=capital CHE, Cyrillic -->
+<!ENTITY chcy             "ч" ><!--=small che, Cyrillic -->
+<!ENTITY Dcy              "Д" ><!--=capital DE, Cyrillic -->
+<!ENTITY dcy              "д" ><!--=small de, Cyrillic -->
+<!ENTITY Ecy              "Э" ><!--=capital E, Cyrillic -->
+<!ENTITY ecy              "э" ><!--=small e, Cyrillic -->
+<!ENTITY Fcy              "Ф" ><!--=capital EF, Cyrillic -->
+<!ENTITY fcy              "ф" ><!--=small ef, Cyrillic -->
+<!ENTITY Gcy              "Г" ><!--=capital GHE, Cyrillic -->
+<!ENTITY gcy              "г" ><!--=small ghe, Cyrillic -->
+<!ENTITY HARDcy           "Ъ" ><!--=capital HARD sign, Cyrillic -->
+<!ENTITY hardcy           "ъ" ><!--=small hard sign, Cyrillic -->
+<!ENTITY Icy              "И" ><!--=capital I, Cyrillic -->
+<!ENTITY icy              "и" ><!--=small i, Cyrillic -->
+<!ENTITY IEcy             "Е" ><!--=capital IE, Cyrillic -->
+<!ENTITY iecy             "е" ><!--=small ie, Cyrillic -->
+<!ENTITY IOcy             "Ё" ><!--=capital IO, Russian -->
+<!ENTITY iocy             "ё" ><!--=small io, Russian -->
+<!ENTITY Jcy              "Й" ><!--=capital short I, Cyrillic -->
+<!ENTITY jcy              "й" ><!--=small short i, Cyrillic -->
+<!ENTITY Kcy              "К" ><!--=capital KA, Cyrillic -->
+<!ENTITY kcy              "к" ><!--=small ka, Cyrillic -->
+<!ENTITY KHcy             "Х" ><!--=capital HA, Cyrillic -->
+<!ENTITY khcy             "х" ><!--=small ha, Cyrillic -->
+<!ENTITY Lcy              "Л" ><!--=capital EL, Cyrillic -->
+<!ENTITY lcy              "л" ><!--=small el, Cyrillic -->
+<!ENTITY Mcy              "М" ><!--=capital EM, Cyrillic -->
+<!ENTITY mcy              "м" ><!--=small em, Cyrillic -->
+<!ENTITY Ncy              "Н" ><!--=capital EN, Cyrillic -->
+<!ENTITY ncy              "н" ><!--=small en, Cyrillic -->
+<!ENTITY numero           "№" ><!--=numero sign -->
+<!ENTITY Ocy              "О" ><!--=capital O, Cyrillic -->
+<!ENTITY ocy              "о" ><!--=small o, Cyrillic -->
+<!ENTITY Pcy              "П" ><!--=capital PE, Cyrillic -->
+<!ENTITY pcy              "п" ><!--=small pe, Cyrillic -->
+<!ENTITY Rcy              "Р" ><!--=capital ER, Cyrillic -->
+<!ENTITY rcy              "р" ><!--=small er, Cyrillic -->
+<!ENTITY Scy              "С" ><!--=capital ES, Cyrillic -->
+<!ENTITY scy              "с" ><!--=small es, Cyrillic -->
+<!ENTITY SHCHcy           "Щ" ><!--=capital SHCHA, Cyrillic -->
+<!ENTITY shchcy           "щ" ><!--=small shcha, Cyrillic -->
+<!ENTITY SHcy             "Ш" ><!--=capital SHA, Cyrillic -->
+<!ENTITY shcy             "ш" ><!--=small sha, Cyrillic -->
+<!ENTITY SOFTcy           "Ь" ><!--=capital SOFT sign, Cyrillic -->
+<!ENTITY softcy           "ь" ><!--=small soft sign, Cyrillic -->
+<!ENTITY Tcy              "Т" ><!--=capital TE, Cyrillic -->
+<!ENTITY tcy              "т" ><!--=small te, Cyrillic -->
+<!ENTITY TScy             "Ц" ><!--=capital TSE, Cyrillic -->
+<!ENTITY tscy             "ц" ><!--=small tse, Cyrillic -->
+<!ENTITY Ucy              "У" ><!--=capital U, Cyrillic -->
+<!ENTITY ucy              "у" ><!--=small u, Cyrillic -->
+<!ENTITY Vcy              "В" ><!--=capital VE, Cyrillic -->
+<!ENTITY vcy              "в" ><!--=small ve, Cyrillic -->
+<!ENTITY YAcy             "Я" ><!--=capital YA, Cyrillic -->
+<!ENTITY yacy             "я" ><!--=small ya, Cyrillic -->
+<!ENTITY Ycy              "Ы" ><!--=capital YERU, Cyrillic -->
+<!ENTITY ycy              "ы" ><!--=small yeru, Cyrillic -->
+<!ENTITY YUcy             "Ю" ><!--=capital YU, Cyrillic -->
+<!ENTITY yucy             "ю" ><!--=small yu, Cyrillic -->
+<!ENTITY Zcy              "З" ><!--=capital ZE, Cyrillic -->
+<!ENTITY zcy              "з" ><!--=small ze, Cyrillic -->
+<!ENTITY ZHcy             "Ж" ><!--=capital ZHE, Cyrillic -->
+<!ENTITY zhcy             "ж" ><!--=small zhe, Cyrillic -->
+
+<!ENTITY DJcy             "Ђ" ><!--=capital DJE, Serbian -->
+<!ENTITY djcy             "ђ" ><!--=small dje, Serbian -->
+<!ENTITY DScy             "Ѕ" ><!--=capital DSE, Macedonian -->
+<!ENTITY dscy             "ѕ" ><!--=small dse, Macedonian -->
+<!ENTITY DZcy             "Џ" ><!--=capital dze, Serbian -->
+<!ENTITY dzcy             "џ" ><!--=small dze, Serbian -->
+<!ENTITY GJcy             "Ѓ" ><!--=capital GJE Macedonian -->
+<!ENTITY gjcy             "ѓ" ><!--=small gje, Macedonian -->
+<!ENTITY Iukcy            "І" ><!--=capital I, Ukrainian -->
+<!ENTITY iukcy            "і" ><!--=small i, Ukrainian -->
+<!ENTITY Jsercy           "Ј" ><!--=capital JE, Serbian -->
+<!ENTITY jsercy           "ј" ><!--=small je, Serbian -->
+<!ENTITY Jukcy            "Є" ><!--=capital JE, Ukrainian -->
+<!ENTITY jukcy            "є" ><!--=small je, Ukrainian -->
+<!ENTITY KJcy             "Ќ" ><!--=capital KJE, Macedonian -->
+<!ENTITY kjcy             "ќ" ><!--=small kje Macedonian -->
+<!ENTITY LJcy             "Љ" ><!--=capital LJE, Serbian -->
+<!ENTITY ljcy             "љ" ><!--=small lje, Serbian -->
+<!ENTITY NJcy             "Њ" ><!--=capital NJE, Serbian -->
+<!ENTITY njcy             "њ" ><!--=small nje, Serbian -->
+<!ENTITY TSHcy            "Ћ" ><!--=capital TSHE, Serbian -->
+<!ENTITY tshcy            "ћ" ><!--=small tshe, Serbian -->
+<!ENTITY Ubrcy            "Ў" ><!--=capital U, Byelorussian -->
+<!ENTITY ubrcy            "ў" ><!--=small u, Byelorussian -->
+<!ENTITY YIcy             "Ї" ><!--=capital YI, Ukrainian -->
+<!ENTITY yicy             "ї" ><!--=small yi, Ukrainian -->
+
+<!ENTITY acute            "´" ><!--=acute accent -->
+<!ENTITY breve            "˘" ><!--=breve -->
+<!ENTITY caron            "ˇ" ><!--=caron -->
+<!ENTITY cedil            "¸" ><!--=cedilla -->
+<!ENTITY circ             "ˆ" ><!--circumflex accent -->
+<!ENTITY dblac            "˝" ><!--=double acute accent -->
+<!ENTITY die              "¨" ><!--=dieresis -->
+<!ENTITY dot              "˙" ><!--=dot above -->
+<!ENTITY grave            "`" ><!--=grave accent -->
+<!ENTITY macr             "¯" ><!--=macron -->
+<!ENTITY ogon             "˛" ><!--=ogonek -->
+<!ENTITY ring             "˚" ><!--=ring -->
+<!ENTITY tilde            "˜" ><!--=tilde -->
+<!ENTITY uml              "¨" ><!--=umlaut mark -->
+
+<!ENTITY Aacute           "Á" ><!--=capital A, acute accent -->
+<!ENTITY aacute           "á" ><!--=small a, acute accent -->
+<!ENTITY Acirc            "Â" ><!--=capital A, circumflex accent -->
+<!ENTITY acirc            "â" ><!--=small a, circumflex accent -->
+<!ENTITY AElig            "Æ" ><!--=capital AE diphthong (ligature) -->
+<!ENTITY aelig            "æ" ><!--=small ae diphthong (ligature) -->
+<!ENTITY Agrave           "À" ><!--=capital A, grave accent -->
+<!ENTITY agrave           "à" ><!--=small a, grave accent -->
+<!ENTITY Aring            "Å" ><!--=capital A, ring -->
+<!ENTITY aring            "å" ><!--=small a, ring -->
+<!ENTITY Atilde           "Ã" ><!--=capital A, tilde -->
+<!ENTITY atilde           "ã" ><!--=small a, tilde -->
+<!ENTITY Auml             "Ä" ><!--=capital A, dieresis or umlaut mark -->
+<!ENTITY auml             "ä" ><!--=small a, dieresis or umlaut mark -->
+<!ENTITY Ccedil           "Ç" ><!--=capital C, cedilla -->
+<!ENTITY ccedil           "ç" ><!--=small c, cedilla -->
+<!ENTITY Eacute           "É" ><!--=capital E, acute accent -->
+<!ENTITY eacute           "é" ><!--=small e, acute accent -->
+<!ENTITY Ecirc            "Ê" ><!--=capital E, circumflex accent -->
+<!ENTITY ecirc            "ê" ><!--=small e, circumflex accent -->
+<!ENTITY Egrave           "È" ><!--=capital E, grave accent -->
+<!ENTITY egrave           "è" ><!--=small e, grave accent -->
+<!ENTITY ETH              "Ð" ><!--=capital Eth, Icelandic -->
+<!ENTITY eth              "ð" ><!--=small eth, Icelandic -->
+<!ENTITY Euml             "Ë" ><!--=capital E, dieresis or umlaut mark -->
+<!ENTITY euml             "ë" ><!--=small e, dieresis or umlaut mark -->
+<!ENTITY Iacute           "Í" ><!--=capital I, acute accent -->
+<!ENTITY iacute           "í" ><!--=small i, acute accent -->
+<!ENTITY Icirc            "Î" ><!--=capital I, circumflex accent -->
+<!ENTITY icirc            "î" ><!--=small i, circumflex accent -->
+<!ENTITY Igrave           "Ì" ><!--=capital I, grave accent -->
+<!ENTITY igrave           "ì" ><!--=small i, grave accent -->
+<!ENTITY Iuml             "Ï" ><!--=capital I, dieresis or umlaut mark -->
+<!ENTITY iuml             "ï" ><!--=small i, dieresis or umlaut mark -->
+<!ENTITY Ntilde           "Ñ" ><!--=capital N, tilde -->
+<!ENTITY ntilde           "ñ" ><!--=small n, tilde -->
+<!ENTITY Oacute           "Ó" ><!--=capital O, acute accent -->
+<!ENTITY oacute           "ó" ><!--=small o, acute accent -->
+<!ENTITY Ocirc            "Ô" ><!--=capital O, circumflex accent -->
+<!ENTITY ocirc            "ô" ><!--=small o, circumflex accent -->
+<!ENTITY Ograve           "Ò" ><!--=capital O, grave accent -->
+<!ENTITY ograve           "ò" ><!--=small o, grave accent -->
+<!ENTITY Oslash           "Ø" ><!--=capital O, slash -->
+<!ENTITY oslash           "ø" ><!--latin small letter o with stroke -->
+<!ENTITY Otilde           "Õ" ><!--=capital O, tilde -->
+<!ENTITY otilde           "õ" ><!--=small o, tilde -->
+<!ENTITY Ouml             "Ö" ><!--=capital O, dieresis or umlaut mark -->
+<!ENTITY ouml             "ö" ><!--=small o, dieresis or umlaut mark -->
+<!ENTITY szlig            "ß" ><!--=small sharp s, German (sz ligature) -->
+<!ENTITY THORN            "Þ" ><!--=capital THORN, Icelandic -->
+<!ENTITY thorn            "þ" ><!--=small thorn, Icelandic -->
+<!ENTITY Uacute           "Ú" ><!--=capital U, acute accent -->
+<!ENTITY uacute           "ú" ><!--=small u, acute accent -->
+<!ENTITY Ucirc            "Û" ><!--=capital U, circumflex accent -->
+<!ENTITY ucirc            "û" ><!--=small u, circumflex accent -->
+<!ENTITY Ugrave           "Ù" ><!--=capital U, grave accent -->
+<!ENTITY ugrave           "ù" ><!--=small u, grave accent -->
+<!ENTITY Uuml             "Ü" ><!--=capital U, dieresis or umlaut mark -->
+<!ENTITY uuml             "ü" ><!--=small u, dieresis or umlaut mark -->
+<!ENTITY Yacute           "Ý" ><!--=capital Y, acute accent -->
+<!ENTITY yacute           "ý" ><!--=small y, acute accent -->
+<!ENTITY yuml             "ÿ" ><!--=small y, dieresis or umlaut mark -->
+
+<!ENTITY Abreve           "Ă" ><!--=capital A, breve -->
+<!ENTITY abreve           "ă" ><!--=small a, breve -->
+<!ENTITY Amacr            "Ā" ><!--=capital A, macron -->
+<!ENTITY amacr            "ā" ><!--=small a, macron -->
+<!ENTITY Aogon            "Ą" ><!--=capital A, ogonek -->
+<!ENTITY aogon            "ą" ><!--=small a, ogonek -->
+<!ENTITY Cacute           "Ć" ><!--=capital C, acute accent -->
+<!ENTITY cacute           "ć" ><!--=small c, acute accent -->
+<!ENTITY Ccaron           "Č" ><!--=capital C, caron -->
+<!ENTITY ccaron           "č" ><!--=small c, caron -->
+<!ENTITY Ccirc            "Ĉ" ><!--=capital C, circumflex accent -->
+<!ENTITY ccirc            "ĉ" ><!--=small c, circumflex accent -->
+<!ENTITY Cdot             "Ċ" ><!--=capital C, dot above -->
+<!ENTITY cdot             "ċ" ><!--=small c, dot above -->
+<!ENTITY Dcaron           "Ď" ><!--=capital D, caron -->
+<!ENTITY dcaron           "ď" ><!--=small d, caron -->
+<!ENTITY Dstrok           "Đ" ><!--=capital D, stroke -->
+<!ENTITY dstrok           "đ" ><!--=small d, stroke -->
+<!ENTITY Ecaron           "Ě" ><!--=capital E, caron -->
+<!ENTITY ecaron           "ě" ><!--=small e, caron -->
+<!ENTITY Edot             "Ė" ><!--=capital E, dot above -->
+<!ENTITY edot             "ė" ><!--=small e, dot above -->
+<!ENTITY Emacr            "Ē" ><!--=capital E, macron -->
+<!ENTITY emacr            "ē" ><!--=small e, macron -->
+<!ENTITY ENG              "Ŋ" ><!--=capital ENG, Lapp -->
+<!ENTITY eng              "ŋ" ><!--=small eng, Lapp -->
+<!ENTITY Eogon            "Ę" ><!--=capital E, ogonek -->
+<!ENTITY eogon            "ę" ><!--=small e, ogonek -->
+<!ENTITY gacute           "ǵ" ><!--=small g, acute accent -->
+<!ENTITY Gbreve           "Ğ" ><!--=capital G, breve -->
+<!ENTITY gbreve           "ğ" ><!--=small g, breve -->
+<!ENTITY Gcedil           "Ģ" ><!--=capital G, cedilla -->
+<!ENTITY Gcirc            "Ĝ" ><!--=capital G, circumflex accent -->
+<!ENTITY gcirc            "ĝ" ><!--=small g, circumflex accent -->
+<!ENTITY Gdot             "Ġ" ><!--=capital G, dot above -->
+<!ENTITY gdot             "ġ" ><!--=small g, dot above -->
+<!ENTITY Hcirc            "Ĥ" ><!--=capital H, circumflex accent -->
+<!ENTITY hcirc            "ĥ" ><!--=small h, circumflex accent -->
+<!ENTITY Hstrok           "Ħ" ><!--=capital H, stroke -->
+<!ENTITY hstrok           "ħ" ><!--=small h, stroke -->
+<!ENTITY Idot             "İ" ><!--=capital I, dot above -->
+<!ENTITY IJlig            "IJ" ><!--=capital IJ ligature -->
+<!ENTITY ijlig            "ij" ><!--=small ij ligature -->
+<!ENTITY Imacr            "Ī" ><!--=capital I, macron -->
+<!ENTITY imacr            "ī" ><!--=small i, macron -->
+<!ENTITY inodot           "ı" ><!--=small i without dot -->
+<!ENTITY Iogon            "Į" ><!--=capital I, ogonek -->
+<!ENTITY iogon            "į" ><!--=small i, ogonek -->
+<!ENTITY Itilde           "Ĩ" ><!--=capital I, tilde -->
+<!ENTITY itilde           "ĩ" ><!--=small i, tilde -->
+<!ENTITY Jcirc            "Ĵ" ><!--=capital J, circumflex accent -->
+<!ENTITY jcirc            "ĵ" ><!--=small j, circumflex accent -->
+<!ENTITY Kcedil           "Ķ" ><!--=capital K, cedilla -->
+<!ENTITY kcedil           "ķ" ><!--=small k, cedilla -->
+<!ENTITY kgreen           "ĸ" ><!--=small k, Greenlandic -->
+<!ENTITY Lacute           "Ĺ" ><!--=capital L, acute accent -->
+<!ENTITY lacute           "ĺ" ><!--=small l, acute accent -->
+<!ENTITY Lcaron           "Ľ" ><!--=capital L, caron -->
+<!ENTITY lcaron           "ľ" ><!--=small l, caron -->
+<!ENTITY Lcedil           "Ļ" ><!--=capital L, cedilla -->
+<!ENTITY lcedil           "ļ" ><!--=small l, cedilla -->
+<!ENTITY Lmidot           "Ŀ" ><!--=capital L, middle dot -->
+<!ENTITY lmidot           "ŀ" ><!--=small l, middle dot -->
+<!ENTITY Lstrok           "Ł" ><!--=capital L, stroke -->
+<!ENTITY lstrok           "ł" ><!--=small l, stroke -->
+<!ENTITY Nacute           "Ń" ><!--=capital N, acute accent -->
+<!ENTITY nacute           "ń" ><!--=small n, acute accent -->
+<!ENTITY napos            "ʼn" ><!--=small n, apostrophe -->
+<!ENTITY Ncaron           "Ň" ><!--=capital N, caron -->
+<!ENTITY ncaron           "ň" ><!--=small n, caron -->
+<!ENTITY Ncedil           "Ņ" ><!--=capital N, cedilla -->
+<!ENTITY ncedil           "ņ" ><!--=small n, cedilla -->
+<!ENTITY Odblac           "Ő" ><!--=capital O, double acute accent -->
+<!ENTITY odblac           "ő" ><!--=small o, double acute accent -->
+<!ENTITY OElig            "Œ" ><!--=capital OE ligature -->
+<!ENTITY oelig            "œ" ><!--=small oe ligature -->
+<!ENTITY Omacr            "Ō" ><!--=capital O, macron -->
+<!ENTITY omacr            "ō" ><!--=small o, macron -->
+<!ENTITY Racute           "Ŕ" ><!--=capital R, acute accent -->
+<!ENTITY racute           "ŕ" ><!--=small r, acute accent -->
+<!ENTITY Rcaron           "Ř" ><!--=capital R, caron -->
+<!ENTITY rcaron           "ř" ><!--=small r, caron -->
+<!ENTITY Rcedil           "Ŗ" ><!--=capital R, cedilla -->
+<!ENTITY rcedil           "ŗ" ><!--=small r, cedilla -->
+<!ENTITY Sacute           "Ś" ><!--=capital S, acute accent -->
+<!ENTITY sacute           "ś" ><!--=small s, acute accent -->
+<!ENTITY Scaron           "Š" ><!--=capital S, caron -->
+<!ENTITY scaron           "š" ><!--=small s, caron -->
+<!ENTITY Scedil           "Ş" ><!--=capital S, cedilla -->
+<!ENTITY scedil           "ş" ><!--=small s, cedilla -->
+<!ENTITY Scirc            "Ŝ" ><!--=capital S, circumflex accent -->
+<!ENTITY scirc            "ŝ" ><!--=small s, circumflex accent -->
+<!ENTITY Tcaron           "Ť" ><!--=capital T, caron -->
+<!ENTITY tcaron           "ť" ><!--=small t, caron -->
+<!ENTITY Tcedil           "Ţ" ><!--=capital T, cedilla -->
+<!ENTITY tcedil           "ţ" ><!--=small t, cedilla -->
+<!ENTITY Tstrok           "Ŧ" ><!--=capital T, stroke -->
+<!ENTITY tstrok           "ŧ" ><!--=small t, stroke -->
+<!ENTITY Ubreve           "Ŭ" ><!--=capital U, breve -->
+<!ENTITY ubreve           "ŭ" ><!--=small u, breve -->
+<!ENTITY Udblac           "Ű" ><!--=capital U, double acute accent -->
+<!ENTITY udblac           "ű" ><!--=small u, double acute accent -->
+<!ENTITY Umacr            "Ū" ><!--=capital U, macron -->
+<!ENTITY umacr            "ū" ><!--=small u, macron -->
+<!ENTITY Uogon            "Ų" ><!--=capital U, ogonek -->
+<!ENTITY uogon            "ų" ><!--=small u, ogonek -->
+<!ENTITY Uring            "Ů" ><!--=capital U, ring -->
+<!ENTITY uring            "ů" ><!--=small u, ring -->
+<!ENTITY Utilde           "Ũ" ><!--=capital U, tilde -->
+<!ENTITY utilde           "ũ" ><!--=small u, tilde -->
+<!ENTITY Wcirc            "Ŵ" ><!--=capital W, circumflex accent -->
+<!ENTITY wcirc            "ŵ" ><!--=small w, circumflex accent -->
+<!ENTITY Ycirc            "Ŷ" ><!--=capital Y, circumflex accent -->
+<!ENTITY ycirc            "ŷ" ><!--=small y, circumflex accent -->
+<!ENTITY Yuml             "Ÿ" ><!--=capital Y, dieresis or umlaut mark -->
+<!ENTITY Zacute           "Ź" ><!--=capital Z, acute accent -->
+<!ENTITY zacute           "ź" ><!--=small z, acute accent -->
+<!ENTITY Zcaron           "Ž" ><!--=capital Z, caron -->
+<!ENTITY zcaron           "ž" ><!--=small z, caron -->
+<!ENTITY Zdot             "Ż" ><!--=capital Z, dot above -->
+<!ENTITY zdot             "ż" ><!--=small z, dot above -->
+
+<!ENTITY amp              "&#38;" ><!--=ampersand -->
+<!ENTITY apos             "'" ><!--=apostrophe -->
+<!ENTITY ast              "*" ><!--/ast B: =asterisk -->
+<!ENTITY brvbar           "¦" ><!--=broken (vertical) bar -->
+<!ENTITY bsol             "\" ><!--/backslash =reverse solidus -->
+<!ENTITY cent             "¢" ><!--=cent sign -->
+<!ENTITY colon            ":" ><!--/colon P: -->
+<!ENTITY comma            "," ><!--P: =comma -->
+<!ENTITY commat           "@" ><!--=commercial at -->
+<!ENTITY copy             "©" ><!--=copyright sign -->
+<!ENTITY curren           "¤" ><!--=general currency sign -->
+<!ENTITY darr             "↓" ><!--/downarrow A: =downward arrow -->
+<!ENTITY deg              "°" ><!--=degree sign -->
+<!ENTITY divide           "÷" ><!--/div B: =divide sign -->
+<!ENTITY dollar           "$" ><!--=dollar sign -->
+<!ENTITY equals           "=" ><!--=equals sign R: -->
+<!ENTITY excl             "!" ><!--=exclamation mark -->
+<!ENTITY frac12           "½" ><!--=fraction one-half -->
+<!ENTITY frac14           "¼" ><!--=fraction one-quarter -->
+<!ENTITY frac18           "⅛" ><!--=fraction one-eighth -->
+<!ENTITY frac34           "¾" ><!--=fraction three-quarters -->
+<!ENTITY frac38           "⅜" ><!--=fraction three-eighths -->
+<!ENTITY frac58           "⅝" ><!--=fraction five-eighths -->
+<!ENTITY frac78           "⅞" ><!--=fraction seven-eighths -->
+<!ENTITY gt               ">" ><!--=greater-than sign R: -->
+<!ENTITY half             "½" ><!--=fraction one-half -->
+<!ENTITY horbar           "―" ><!--=horizontal bar -->
+<!ENTITY hyphen           "‐" ><!--=hyphen -->
+<!ENTITY iexcl            "¡" ><!--=inverted exclamation mark -->
+<!ENTITY iquest           "¿" ><!--=inverted question mark -->
+<!ENTITY laquo            "«" ><!--=angle quotation mark, left -->
+<!ENTITY larr             "←" ><!--/leftarrow /gets A: =leftward arrow -->
+<!ENTITY lcub             "{" ><!--/lbrace O: =left curly bracket -->
+<!ENTITY ldquo            "“" ><!--=double quotation mark, left -->
+<!ENTITY lowbar           "_" ><!--=low line -->
+<!ENTITY lpar             "(" ><!--O: =left parenthesis -->
+<!ENTITY lsqb             "[" ><!--/lbrack O: =left square bracket -->
+<!ENTITY lsquo            "‘" ><!--=single quotation mark, left -->
+<!ENTITY lt               "&#60;" ><!--=less-than sign R: -->
+<!ENTITY micro            "µ" ><!--=micro sign -->
+<!ENTITY middot           "·" ><!--/centerdot B: =middle dot -->
+<!ENTITY nbsp             " " ><!--=no break (required) space -->
+<!ENTITY not              "¬" ><!--/neg /lnot =not sign -->
+<!ENTITY num              "#" ><!--=number sign -->
+<!ENTITY ohm              "Ω" ><!--=ohm sign -->
+<!ENTITY ordf             "ª" ><!--=ordinal indicator, feminine -->
+<!ENTITY ordm             "º" ><!--=ordinal indicator, masculine -->
+<!ENTITY para             "¶" ><!--=pilcrow (paragraph sign) -->
+<!ENTITY percnt           "%" ><!--=percent sign -->
+<!ENTITY period           "." ><!--=full stop, period -->
+<!ENTITY plus             "+" ><!--=plus sign B: -->
+<!ENTITY plusmn           "±" ><!--/pm B: =plus-or-minus sign -->
+<!ENTITY pound            "£" ><!--=pound sign -->
+<!ENTITY quest            "?" ><!--=question mark -->
+<!ENTITY quot             """ ><!--=quotation mark -->
+<!ENTITY raquo            "»" ><!--=angle quotation mark, right -->
+<!ENTITY rarr             "→" ><!--/rightarrow /to A: =rightward arrow -->
+<!ENTITY rcub             "}" ><!--/rbrace C: =right curly bracket -->
+<!ENTITY rdquo            "”" ><!--=double quotation mark, right -->
+<!ENTITY reg              "®" ><!--/circledR =registered sign -->
+<!ENTITY rpar             ")" ><!--C: =right parenthesis -->
+<!ENTITY rsqb             "]" ><!--/rbrack C: =right square bracket -->
+<!ENTITY rsquo            "’" ><!--=single quotation mark, right -->
+<!ENTITY sect             "§" ><!--=section sign -->
+<!ENTITY semi             ";" ><!--=semicolon P: -->
+<!ENTITY shy              "­" ><!--=soft hyphen -->
+<!ENTITY sol              "/" ><!--=solidus -->
+<!ENTITY sung             "♪" ><!--=music note (sung text sign) -->
+<!ENTITY sup1             "¹" ><!--=superscript one -->
+<!ENTITY sup2             "²" ><!--=superscript two -->
+<!ENTITY sup3             "³" ><!--=superscript three -->
+<!ENTITY times            "×" ><!--/times B: =multiply sign -->
+<!ENTITY trade            "™" ><!--=trade mark sign -->
+<!ENTITY uarr             "↑" ><!--/uparrow A: =upward arrow -->
+<!ENTITY verbar           "|" ><!--/vert =vertical bar -->
+<!ENTITY yen              "¥" ><!--/yen =yen sign -->
+
+<!ENTITY blank            "␣" ><!--=significant blank symbol -->
+<!ENTITY blk12            "▒" ><!--=50% shaded block -->
+<!ENTITY blk14            "░" ><!--=25% shaded block -->
+<!ENTITY blk34            "▓" ><!--=75% shaded block -->
+<!ENTITY block            "█" ><!--=full block -->
+<!ENTITY bull             "•" ><!--/bullet B: =round bullet, filled -->
+<!ENTITY caret            "⁁" ><!--=caret (insertion mark) -->
+<!ENTITY check            "✓" ><!--/checkmark =tick, check mark -->
+<!ENTITY cir              "○" ><!--/circ B: =circle, open -->
+<!ENTITY clubs            "♣" ><!--/clubsuit =club suit symbol  -->
+<!ENTITY copysr           "℗" ><!--=sound recording copyright sign -->
+<!ENTITY cross            "✗" ><!--=ballot cross -->
+<!ENTITY Dagger           "‡" ><!--/ddagger B: =double dagger -->
+<!ENTITY dagger           "†" ><!--/dagger B: =dagger -->
+<!ENTITY dash             "‐" ><!--=hyphen (true graphic) -->
+<!ENTITY diams            "♦" ><!--/diamondsuit =diamond suit symbol  -->
+<!ENTITY dlcrop           "⌍" ><!--downward left crop mark  -->
+<!ENTITY drcrop           "⌌" ><!--downward right crop mark  -->
+<!ENTITY dtri             "▿" ><!--/triangledown =down triangle, open -->
+<!ENTITY dtrif            "▾" ><!--/blacktriangledown =dn tri, filled -->
+<!ENTITY emsp             " " ><!--=em space -->
+<!ENTITY emsp13           " " ><!--=1/3-em space -->
+<!ENTITY emsp14           " " ><!--=1/4-em space -->
+<!ENTITY ensp             " " ><!--=en space (1/2-em) -->
+<!ENTITY female           "♀" ><!--=female symbol -->
+<!ENTITY ffilig           "ffi" ><!--small ffi ligature -->
+<!ENTITY fflig            "ff" ><!--small ff ligature -->
+<!ENTITY ffllig           "ffl" ><!--small ffl ligature -->
+<!ENTITY filig            "fi" ><!--small fi ligature -->
+<!ENTITY flat             "♭" ><!--/flat =musical flat -->
+<!ENTITY fllig            "fl" ><!--small fl ligature -->
+<!ENTITY frac13           "⅓" ><!--=fraction one-third -->
+<!ENTITY frac15           "⅕" ><!--=fraction one-fifth -->
+<!ENTITY frac16           "⅙" ><!--=fraction one-sixth -->
+<!ENTITY frac23           "⅔" ><!--=fraction two-thirds -->
+<!ENTITY frac25           "⅖" ><!--=fraction two-fifths -->
+<!ENTITY frac35           "⅗" ><!--=fraction three-fifths -->
+<!ENTITY frac45           "⅘" ><!--=fraction four-fifths -->
+<!ENTITY frac56           "⅚" ><!--=fraction five-sixths -->
+<!ENTITY hairsp           " " ><!--=hair space -->
+<!ENTITY hearts           "♥" ><!--/heartsuit =heart suit symbol -->
+<!ENTITY hellip           "…" ><!--=ellipsis (horizontal) -->
+<!ENTITY hybull           "⁃" ><!--rectangle, filled (hyphen bullet) -->
+<!ENTITY incare           "℅" ><!--=in-care-of symbol -->
+<!ENTITY ldquor           "„" ><!--=rising dbl quote, left (low) -->
+<!ENTITY lhblk            "▄" ><!--=lower half block -->
+<!ENTITY loz              "◊" ><!--/lozenge - lozenge or total mark -->
+<!ENTITY lozf             "⧫" ><!--/blacklozenge - lozenge, filled -->
+<!ENTITY lsquor           "‚" ><!--=rising single quote, left (low) -->
+<!ENTITY ltri             "◃" ><!--/triangleleft B: l triangle, open -->
+<!ENTITY ltrif            "◂" ><!--/blacktriangleleft R: =l tri, filled -->
+<!ENTITY male             "♂" ><!--=male symbol -->
+<!ENTITY malt             "✠" ><!--/maltese =maltese cross -->
+<!ENTITY marker           "▮" ><!--=histogram marker -->
+<!ENTITY mdash            "—" ><!--=em dash  -->
+<!ENTITY mldr             "…" ><!--em leader -->
+<!ENTITY natur            "♮" ><!--/natural - music natural -->
+<!ENTITY ndash            "–" ><!--=en dash -->
+<!ENTITY nldr             "‥" ><!--=double baseline dot (en leader) -->
+<!ENTITY numsp            " " ><!--=digit space (width of a number) -->
+<!ENTITY phone            "☎" ><!--=telephone symbol  -->
+<!ENTITY puncsp           " " ><!--=punctuation space (width of comma) -->
+<!ENTITY rdquor           "”" ><!--rising dbl quote, right (high) -->
+<!ENTITY rect             "▭" ><!--=rectangle, open -->
+<!ENTITY rsquor           "’" ><!--rising single quote, right (high) -->
+<!ENTITY rtri             "▹" ><!--/triangleright B: r triangle, open -->
+<!ENTITY rtrif            "▸" ><!--/blacktriangleright R: =r tri, filled -->
+<!ENTITY rx               "℞" ><!--pharmaceutical prescription (Rx) -->
+<!ENTITY sext             "✶" ><!--sextile (6-pointed star) -->
+<!ENTITY sharp            "♯" ><!--/sharp =musical sharp -->
+<!ENTITY spades           "♠" ><!--/spadesuit =spades suit symbol  -->
+<!ENTITY squ              "□" ><!--=square, open -->
+<!ENTITY squf             "▪" ><!--/blacksquare =sq bullet, filled -->
+<!ENTITY star             "☆" ><!--=star, open -->
+<!ENTITY starf            "★" ><!--/bigstar - star, filled  -->
+<!ENTITY target           "⌖" ><!--register mark or target -->
+<!ENTITY telrec           "⌕" ><!--=telephone recorder symbol -->
+<!ENTITY thinsp           " " ><!--=thin space (1/6-em) -->
+<!ENTITY uhblk            "▀" ><!--=upper half block -->
+<!ENTITY ulcrop           "⌏" ><!--upward left crop mark  -->
+<!ENTITY urcrop           "⌎" ><!--upward right crop mark  -->
+<!ENTITY utri             "▵" ><!--/triangle =up triangle, open -->
+<!ENTITY utrif            "▴" ><!--/blacktriangle =up tri, filled -->
+<!ENTITY vellip           "⋮" ><!--vertical ellipsis -->
+
+<!-- New characters defined by MathML ............................ -->
+
+<!ENTITY % plane1D  "&#38;#x1D">
+
+<!ENTITY af               "⁡" ><!--character showing function application in presentation tagging -->
+<!ENTITY aopf             "%plane1D;552;" ><!-- -->
+<!ENTITY asympeq          "≍" ><!--Old ISOAMSR asymp (for HTML compatibility) -->
+<!ENTITY bopf             "%plane1D;553;" ><!-- -->
+<!ENTITY copf             "%plane1D;554;" ><!-- -->
+<!ENTITY Cross            "⨯" ><!--cross or vector product -->
+<!ENTITY DD               "ⅅ" ><!--D for use in differentials, e.g., within integrals -->
+<!ENTITY dd               "ⅆ" ><!--d for use in differentials, e.g., within integrals -->
+<!ENTITY dopf             "%plane1D;555;" ><!-- -->
+<!ENTITY DownArrowBar     "⤓" ><!--down arrow to bar -->
+<!ENTITY DownBreve        " ̑" ><!--breve, inverted (non-spacing) -->
+<!ENTITY DownLeftRightVector "⥐" ><!--left-down-right-down harpoon -->
+<!ENTITY DownLeftTeeVector "⥞" ><!--left-down harpoon from bar -->
+<!ENTITY DownLeftVectorBar "⥖" ><!--left-down harpoon to bar -->
+<!ENTITY DownRightTeeVector "⥟" ><!--right-down harpoon from bar -->
+<!ENTITY DownRightVectorBar "⥗" ><!--right-down harpoon to bar -->
+<!ENTITY ee               "ⅇ" ><!--e use for the exponential base of the natural logarithms -->
+<!ENTITY EmptySmallSquare "◻" ><!--empty small square -->
+<!ENTITY EmptyVerySmallSquare "▫" ><!--empty small square -->
+<!ENTITY eopf             "%plane1D;556;" ><!-- -->
+<!ENTITY Equal            "⩵" ><!--two consecutive equal signs -->
+<!ENTITY FilledSmallSquare "◼" ><!--filled small square -->
+<!ENTITY FilledVerySmallSquare "▪" ><!--filled very small square -->
+<!ENTITY fopf             "%plane1D;557;" ><!-- -->
+<!ENTITY gopf             "%plane1D;558;" ><!-- -->
+<!ENTITY GreaterGreater   "⪢" ><!--alias for GT -->
+<!ENTITY Hat              "^" ><!--circumflex accent -->
+<!ENTITY hopf             "%plane1D;559;" ><!-- -->
+<!ENTITY HorizontalLine   "─" ><!--short horizontal line  -->
+<!ENTITY ic               "⁣" ><!--short form of  ⁣ -->
+<!ENTITY ii               "ⅈ" ><!--i for use as a square root of -1 -->
+<!ENTITY iopf             "%plane1D;55A;" ><!-- -->
+<!ENTITY it               "⁢" ><!--marks multiplication when it is understood without a mark -->
+<!ENTITY jopf             "%plane1D;55B;" ><!-- -->
+<!ENTITY kopf             "%plane1D;55C;" ><!-- -->
+<!ENTITY larrb            "⇤" ><!--leftwards arrow to bar -->
+<!ENTITY LeftDownTeeVector "⥡" ><!--down-left harpoon from bar -->
+<!ENTITY LeftDownVectorBar "⥙" ><!--down-left harpoon to bar -->
+<!ENTITY LeftRightVector  "⥎" ><!--left-up-right-up harpoon -->
+<!ENTITY LeftTeeVector    "⥚" ><!--left-up harpoon from bar -->
+<!ENTITY LeftTriangleBar  "⧏" ><!--left triangle, vertical bar -->
+<!ENTITY LeftUpDownVector "⥑" ><!--up-left-down-left harpoon -->
+<!ENTITY LeftUpTeeVector  "⥠" ><!--up-left harpoon from bar -->
+<!ENTITY LeftUpVectorBar  "⥘" ><!--up-left harpoon to bar -->
+<!ENTITY LeftVectorBar    "⥒" ><!--left-up harpoon to bar -->
+<!ENTITY LessLess         "⪡" ><!--alias for Lt -->
+<!ENTITY lopf             "%plane1D;55D;" ><!-- -->
+<!ENTITY mapstodown       "↧" ><!--downwards arrow from bar -->
+<!ENTITY mapstoleft       "↤" ><!--leftwards arrow from bar -->
+<!ENTITY mapstoup         "↥" ><!--upwards arrow from bar -->
+<!ENTITY MediumSpace      " " ><!--space of width 4/18 em -->
+<!ENTITY mopf             "%plane1D;55E;" ><!-- -->
+<!ENTITY nbump            "≎̸" ><!--not bumpy equals -->
+<!ENTITY nbumpe           "≏̸" ><!--not bumpy single equals -->
+<!ENTITY nesim            "≂̸" ><!--not equal or similar -->
+<!ENTITY NewLine          "
" ><!--force a line break; line feed -->
+<!ENTITY NoBreak          "⁠" ><!--never break line here -->
+<!ENTITY nopf             "%plane1D;55F;" ><!-- -->
+<!ENTITY NotCupCap        "≭" ><!--alias for &nasymp; -->
+<!ENTITY NotHumpEqual     "≏̸" ><!--alias for ≏̸ -->
+<!ENTITY NotLeftTriangleBar "⧏̸" ><!--not left triangle, vertical bar -->
+<!ENTITY NotNestedGreaterGreater "⪢̸" ><!--not double greater-than sign -->
+<!ENTITY NotNestedLessLess "⪡̸" ><!--not double less-than sign -->
+<!ENTITY NotRightTriangleBar "⧐̸" ><!--not vertical bar, right triangle -->
+<!ENTITY NotSquareSubset  "⊏̸" ><!--square not subset -->
+<!ENTITY NotSquareSuperset "⊐̸" ><!--negated set-like partial order operator -->
+<!ENTITY NotSucceedsTilde "≿̸" ><!--not succeeds or similar -->
+<!ENTITY oopf             "%plane1D;560;" ><!-- -->
+<!ENTITY OverBar          "¯" ><!--over bar -->
+<!ENTITY OverBrace        "︷" ><!--over brace  -->
+<!ENTITY OverBracket      "⎴" ><!--over bracket -->
+<!ENTITY OverParenthesis  "︵" ><!--over parenthesis -->
+<!ENTITY planckh          "ℎ" ><!--the ring (skew field) of quaternions -->
+<!ENTITY popf             "%plane1D;561;" ><!-- -->
+<!ENTITY Product          "∏" ><!--alias for ∏ -->
+<!ENTITY qopf             "%plane1D;562;" ><!-- -->
+<!ENTITY rarrb            "⇥" ><!--leftwards arrow to bar -->
+<!ENTITY RightDownTeeVector "⥝" ><!--down-right harpoon from bar -->
+<!ENTITY RightDownVectorBar "⥕" ><!--down-right harpoon to bar -->
+<!ENTITY RightTeeVector   "⥛" ><!--right-up harpoon from bar -->
+<!ENTITY RightTriangleBar "⧐" ><!--vertical bar, right triangle -->
+<!ENTITY RightUpDownVector "⥏" ><!--up-right-down-right harpoon -->
+<!ENTITY RightUpTeeVector "⥜" ><!--up-right harpoon from bar -->
+<!ENTITY RightUpVectorBar "⥔" ><!--up-right harpoon to bar -->
+<!ENTITY RightVectorBar   "⥓" ><!--up-right harpoon to bar -->
+<!ENTITY ropf             "%plane1D;563;" ><!-- -->
+<!ENTITY RoundImplies     "⥰" ><!--round implies -->
+<!ENTITY RuleDelayed      "⧴" ><!--rule-delayed (colon right arrow) -->
+<!ENTITY sopf             "%plane1D;564;" ><!-- -->
+<!ENTITY Tab              "	" ><!--tabulator stop; horizontal tabulation -->
+<!ENTITY ThickSpace       "   " ><!--space of width 5/18 em -->
+<!ENTITY topf             "%plane1D;565;" ><!-- -->
+<!ENTITY UnderBar         " ̲" ><!--combining low line -->
+<!ENTITY UnderBrace       "︸" ><!--under brace  -->
+<!ENTITY UnderBracket     "⎵" ><!--under bracket -->
+<!ENTITY UnderParenthesis "︶" ><!--under parenthesis -->
+<!ENTITY uopf             "%plane1D;566;" ><!-- -->
+<!ENTITY UpArrowBar       "⤒" ><!--up arrow to bar -->
+<!ENTITY Upsilon          "Υ" ><!--ISOGRK1 Ugr, HTML4 Upsilon -->
+<!ENTITY VerticalLine     "|" ><!--alias ISONUM verbar -->
+<!ENTITY VerticalSeparator "❘" ><!--vertical separating operator -->
+<!ENTITY vopf             "%plane1D;567;" ><!-- -->
+<!ENTITY wopf             "%plane1D;568;" ><!-- -->
+<!ENTITY xopf             "%plane1D;569;" ><!-- -->
+<!ENTITY yopf             "%plane1D;56A;" ><!-- -->
+<!ENTITY ZeroWidthSpace   "​" ><!--zero width space -->
+<!ENTITY zopf             "%plane1D;56B;" ><!-- -->
+
+<!-- MathML aliases for characters defined above ................. -->
+
+<!ENTITY angle            "∠" ><!--alias ISOAMSO ang -->
+<!ENTITY ApplyFunction    "⁡" ><!--character showing function application in presentation tagging -->
+<!ENTITY approx           "≈" ><!--alias ISOTECH ap -->
+<!ENTITY approxeq         "≊" ><!--alias ISOAMSR ape -->
+<!ENTITY Assign           "≔" ><!--assignment operator, alias ISOAMSR colone -->
+<!ENTITY backcong         "≌" ><!--alias ISOAMSR bcong -->
+<!ENTITY backepsilon      "϶" ><!--alias ISOAMSR bepsi -->
+<!ENTITY backprime        "‵" ><!--alias ISOAMSO bprime -->
+<!ENTITY backsim          "∽" ><!--alias ISOAMSR bsim -->
+<!ENTITY backsimeq        "⋍" ><!--alias ISOAMSR bsime -->
+<!ENTITY Backslash        "∖" ><!--alias ISOAMSB setmn -->
+<!ENTITY barwedge         "⌅" ><!--alias ISOAMSB barwed -->
+<!ENTITY Because          "∵" ><!--alias ISOTECH becaus -->
+<!ENTITY because          "∵" ><!--alias ISOTECH becaus -->
+<!ENTITY Bernoullis       "ℬ" ><!--alias ISOTECH bernou -->
+<!ENTITY between          "≬" ><!--alias ISOAMSR twixt -->
+<!ENTITY bigcap           "⋂" ><!--alias ISOAMSB xcap -->
+<!ENTITY bigcirc          "◯" ><!--alias ISOAMSB xcirc -->
+<!ENTITY bigcup           "⋃" ><!--alias ISOAMSB xcup -->
+<!ENTITY bigodot          "⨀" ><!--alias ISOAMSB xodot -->
+<!ENTITY bigoplus         "⨁" ><!--alias ISOAMSB xoplus -->
+<!ENTITY bigotimes        "⨂" ><!--alias ISOAMSB xotime -->
+<!ENTITY bigsqcup         "⨆" ><!--alias ISOAMSB xsqcup -->
+<!ENTITY bigstar          "★" ><!--ISOPUB    starf  -->
+<!ENTITY bigtriangledown  "▽" ><!--alias ISOAMSB xdtri -->
+<!ENTITY bigtriangleup    "△" ><!--alias ISOAMSB xutri -->
+<!ENTITY biguplus         "⨄" ><!--alias ISOAMSB xuplus -->
+<!ENTITY bigvee           "⋁" ><!--alias ISOAMSB xvee -->
+<!ENTITY bigwedge         "⋀" ><!--alias ISOAMSB xwedge -->
+<!ENTITY bkarow           "⤍" ><!--alias ISOAMSA rbarr -->
+<!ENTITY blacklozenge     "⧫" ><!--alias ISOPUB lozf -->
+<!ENTITY blacksquare      "▪" ><!--ISOTECH  squarf  -->
+<!ENTITY blacktriangle    "▴" ><!--alias ISOPUB utrif -->
+<!ENTITY blacktriangledown "▾" ><!--alias ISOPUB dtrif -->
+<!ENTITY blacktriangleleft "◂" ><!--alias ISOPUB ltrif -->
+<!ENTITY blacktriangleright "▸" ><!--alias ISOPUB rtrif -->
+<!ENTITY bot              "⊥" ><!--alias ISOTECH bottom -->
+<!ENTITY boxminus         "⊟" ><!--alias ISOAMSB minusb -->
+<!ENTITY boxplus          "⊞" ><!--alias ISOAMSB plusb -->
+<!ENTITY boxtimes         "⊠" ><!--alias ISOAMSB timesb -->
+<!ENTITY Breve            "˘" ><!--alias ISODIA breve -->
+<!ENTITY bullet           "•" ><!--alias ISOPUB bull -->
+<!ENTITY Bumpeq           "≎" ><!--alias ISOAMSR bump -->
+<!ENTITY bumpeq           "≏" ><!--alias ISOAMSR bumpe -->
+<!ENTITY CapitalDifferentialD "ⅅ" ><!--D for use in differentials, e.g., within integrals -->
+<!ENTITY Cayleys          "ℭ" ><!--the non-associative ring of octonions or Cayley numbers -->
+<!ENTITY Cedilla          "¸" ><!--alias ISODIA cedil -->
+<!ENTITY CenterDot        "·" ><!--alias ISONUM middot -->
+<!ENTITY centerdot        "·" ><!--alias ISONUM middot -->
+<!ENTITY checkmark        "✓" ><!--alias ISOPUB check -->
+<!ENTITY circeq           "≗" ><!--alias ISOAMSR cire -->
+<!ENTITY circlearrowleft  "↺" ><!--alias ISOAMSA olarr -->
+<!ENTITY circlearrowright "↻" ><!--alias ISOAMSA orarr -->
+<!ENTITY circledast       "⊛" ><!--alias ISOAMSB oast -->
+<!ENTITY circledcirc      "⊚" ><!--alias ISOAMSB ocir -->
+<!ENTITY circleddash      "⊝" ><!--alias ISOAMSB odash -->
+<!ENTITY CircleDot        "⊙" ><!--alias ISOAMSB odot -->
+<!ENTITY circledR         "®" ><!--alias ISONUM reg -->
+<!ENTITY circledS         "Ⓢ" ><!--alias ISOAMSO oS -->
+<!ENTITY CircleMinus      "⊖" ><!--alias ISOAMSB ominus -->
+<!ENTITY CirclePlus       "⊕" ><!--alias ISOAMSB oplus -->
+<!ENTITY CircleTimes      "⊗" ><!--alias ISOAMSB otimes -->
+<!ENTITY ClockwiseContourIntegral "∲" ><!--alias ISOTECH cwconint -->
+<!ENTITY CloseCurlyDoubleQuote "”" ><!--alias ISONUM rdquo -->
+<!ENTITY CloseCurlyQuote  "’" ><!--alias ISONUM rsquo -->
+<!ENTITY clubsuit         "♣" ><!--ISOPUB    clubs  -->
+<!ENTITY coloneq          "≔" ><!--alias ISOAMSR colone -->
+<!ENTITY complement       "∁" ><!--alias ISOAMSO comp -->
+<!ENTITY complexes        "ℂ" ><!--the field of complex numbers -->
+<!ENTITY Congruent        "≡" ><!--alias ISOTECH equiv -->
+<!ENTITY ContourIntegral  "∮" ><!--alias ISOTECH conint -->
+<!ENTITY Coproduct        "∐" ><!--alias ISOAMSB coprod -->
+<!ENTITY CounterClockwiseContourIntegral "∳" ><!--alias ISOTECH awconint -->
+<!ENTITY CupCap           "≍" ><!--alias asympeq -->
+<!ENTITY curlyeqprec      "⋞" ><!--alias ISOAMSR cuepr -->
+<!ENTITY curlyeqsucc      "⋟" ><!--alias ISOAMSR cuesc -->
+<!ENTITY curlyvee         "⋎" ><!--alias ISOAMSB cuvee -->
+<!ENTITY curlywedge       "⋏" ><!--alias ISOAMSB cuwed -->
+<!ENTITY curvearrowleft   "↶" ><!--alias ISOAMSA cularr -->
+<!ENTITY curvearrowright  "↷" ><!--alias ISOAMSA curarr -->
+<!ENTITY dbkarow          "⤏" ><!--alias ISOAMSA rBarr -->
+<!ENTITY ddagger          "‡" ><!--alias ISOPUB Dagger -->
+<!ENTITY ddotseq          "⩷" ><!--alias ISOAMSR eDDot -->
+<!ENTITY Del              "∇" ><!--alias ISOTECH nabla -->
+<!ENTITY DiacriticalAcute "´" ><!--alias ISODIA acute -->
+<!ENTITY DiacriticalDot   "˙" ><!--alias ISODIA dot -->
+<!ENTITY DiacriticalDoubleAcute "˝" ><!--alias ISODIA dblac -->
+<!ENTITY DiacriticalGrave "`" ><!--alias ISODIA grave -->
+<!ENTITY DiacriticalTilde "˜" ><!--alias ISODIA tilde -->
+<!ENTITY Diamond          "⋄" ><!--alias ISOAMSB diam -->
+<!ENTITY diamond          "⋄" ><!--alias ISOAMSB diam -->
+<!ENTITY diamondsuit      "♦" ><!--ISOPUB    diams  -->
+<!ENTITY DifferentialD    "ⅆ" ><!--d for use in differentials, e.g., within integrals -->
+<!ENTITY digamma          "ϝ" ><!--alias ISOGRK3 gammad -->
+<!ENTITY div              "÷" ><!--alias ISONUM divide -->
+<!ENTITY divideontimes    "⋇" ><!--alias ISOAMSB divonx -->
+<!ENTITY doteq            "≐" ><!--alias ISOAMSR esdot -->
+<!ENTITY doteqdot         "≑" ><!--alias ISOAMSR eDot -->
+<!ENTITY DotEqual         "≐" ><!--alias ISOAMSR esdot -->
+<!ENTITY dotminus         "∸" ><!--alias ISOAMSB minusd -->
+<!ENTITY dotplus          "∔" ><!--alias ISOAMSB plusdo -->
+<!ENTITY dotsquare        "⊡" ><!--alias ISOAMSB sdotb -->
+<!ENTITY doublebarwedge   "⌆" ><!--alias ISOAMSB Barwed -->
+<!ENTITY DoubleContourIntegral "∯" ><!--alias ISOTECH Conint -->
+<!ENTITY DoubleDot        "¨" ><!--alias ISODIA die -->
+<!ENTITY DoubleDownArrow  "⇓" ><!--alias ISOAMSA dArr -->
+<!ENTITY DoubleLeftArrow  "⇐" ><!--alias ISOTECH lArr -->
+<!ENTITY DoubleLeftRightArrow "⇔" ><!--alias ISOAMSA hArr -->
+<!ENTITY DoubleLeftTee    "⫤" ><!--alias for  ⫤  -->
+<!ENTITY DoubleLongLeftArrow "⟸" ><!--alias ISOAMSA xlArr -->
+<!ENTITY DoubleLongLeftRightArrow "⟺" ><!--alias ISOAMSA xhArr -->
+<!ENTITY DoubleLongRightArrow "⟹" ><!--alias ISOAMSA xrArr -->
+<!ENTITY DoubleRightArrow "⇒" ><!--alias ISOTECH rArr -->
+<!ENTITY DoubleRightTee   "⊨" ><!--alias ISOAMSR vDash -->
+<!ENTITY DoubleUpArrow    "⇑" ><!--alias ISOAMSA uArr -->
+<!ENTITY DoubleUpDownArrow "⇕" ><!--alias ISOAMSA vArr -->
+<!ENTITY DoubleVerticalBar "∥" ><!--alias ISOTECH par -->
+<!ENTITY DownArrow        "↓" ><!--alias ISONUM darr -->
+<!ENTITY Downarrow        "⇓" ><!--alias ISOAMSA dArr -->
+<!ENTITY downarrow        "↓" ><!--alias ISONUM darr -->
+<!ENTITY DownArrowUpArrow "⇵" ><!--alias ISOAMSA duarr -->
+<!ENTITY downdownarrows   "⇊" ><!--alias ISOAMSA ddarr -->
+<!ENTITY downharpoonleft  "⇃" ><!--alias ISOAMSA dharl -->
+<!ENTITY downharpoonright "⇂" ><!--alias ISOAMSA dharr -->
+<!ENTITY DownLeftVector   "↽" ><!--alias ISOAMSA lhard -->
+<!ENTITY DownRightVector  "⇁" ><!--alias ISOAMSA rhard -->
+<!ENTITY DownTee          "⊤" ><!--alias ISOTECH top -->
+<!ENTITY DownTeeArrow     "↧" ><!--alias for mapstodown -->
+<!ENTITY drbkarow         "⤐" ><!--alias ISOAMSA RBarr -->
+<!ENTITY Element          "∈" ><!--alias ISOTECH isinv -->
+<!ENTITY emptyset         "∅" ><!--alias ISOAMSO empty -->
+<!ENTITY eqcirc           "≖" ><!--alias ISOAMSR ecir -->
+<!ENTITY eqcolon          "≕" ><!--alias ISOAMSR ecolon -->
+<!ENTITY eqsim            "≂" ><!--alias ISOAMSR esim -->
+<!ENTITY eqslantgtr       "⪖" ><!--alias ISOAMSR egs -->
+<!ENTITY eqslantless      "⪕" ><!--alias ISOAMSR els -->
+<!ENTITY EqualTilde       "≂" ><!--alias ISOAMSR esim -->
+<!ENTITY Equilibrium      "⇌" ><!--alias ISOAMSA rlhar -->
+<!ENTITY Exists           "∃" ><!--alias ISOTECH exist -->
+<!ENTITY expectation      "ℰ" ><!--expectation (operator) -->
+<!ENTITY ExponentialE     "ⅇ" ><!--e use for the exponential base of the natural logarithms -->
+<!ENTITY exponentiale     "ⅇ" ><!--base of the Napierian logarithms -->
+<!ENTITY fallingdotseq    "≒" ><!--alias ISOAMSR efDot -->
+<!ENTITY ForAll           "∀" ><!--alias ISOTECH forall -->
+<!ENTITY Fouriertrf       "ℱ" ><!--Fourier transform -->
+<!ENTITY geq              "≥" ><!--alias ISOTECH ge -->
+<!ENTITY geqq             "≧" ><!--alias ISOAMSR gE -->
+<!ENTITY geqslant         "⩾" ><!--alias ISOAMSR ges -->
+<!ENTITY gg               "≫" ><!--alias ISOAMSR Gt -->
+<!ENTITY ggg              "⋙" ><!--alias ISOAMSR Gg -->
+<!ENTITY gnapprox         "⪊" ><!--alias ISOAMSN gnap -->
+<!ENTITY gneq             "⪈" ><!--alias ISOAMSN gne -->
+<!ENTITY gneqq            "≩" ><!--alias ISOAMSN gnE -->
+<!ENTITY GreaterEqual     "≥" ><!--alias ISOTECH ge -->
+<!ENTITY GreaterEqualLess "⋛" ><!--alias ISOAMSR gel -->
+<!ENTITY GreaterFullEqual "≧" ><!--alias ISOAMSR gE -->
+<!ENTITY GreaterLess      "≷" ><!--alias ISOAMSR gl -->
+<!ENTITY GreaterSlantEqual "⩾" ><!--alias ISOAMSR ges -->
+<!ENTITY GreaterTilde     "≳" ><!--alias ISOAMSR gsim -->
+<!ENTITY gtrapprox        "⪆" ><!--alias ISOAMSR gap -->
+<!ENTITY gtrdot           "⋗" ><!--alias ISOAMSR gtdot -->
+<!ENTITY gtreqless        "⋛" ><!--alias ISOAMSR gel -->
+<!ENTITY gtreqqless       "⪌" ><!--alias ISOAMSR gEl -->
+<!ENTITY gtrless          "≷" ><!--alias ISOAMSR gl -->
+<!ENTITY gtrsim           "≳" ><!--alias ISOAMSR gsim -->
+<!ENTITY gvertneqq        "≩︀" ><!--alias ISOAMSN gvnE -->
+<!ENTITY Hacek            "ˇ" ><!--alias ISODIA caron -->
+<!ENTITY hbar             "ℏ" ><!--alias ISOAMSO plank -->
+<!ENTITY heartsuit        "♥" ><!--ISOPUB hearts -->
+<!ENTITY HilbertSpace     "ℋ" ><!--Hilbert space -->
+<!ENTITY hksearow         "⤥" ><!--alias ISOAMSA searhk -->
+<!ENTITY hkswarow         "⤦" ><!--alias ISOAMSA swarhk -->
+<!ENTITY hookleftarrow    "↩" ><!--alias ISOAMSA larrhk -->
+<!ENTITY hookrightarrow   "↪" ><!--alias ISOAMSA rarrhk -->
+<!ENTITY hslash           "ℏ" ><!--alias ISOAMSO plankv -->
+<!ENTITY HumpDownHump     "≎" ><!--alias ISOAMSR bump -->
+<!ENTITY HumpEqual        "≏" ><!--alias ISOAMSR bumpe -->
+<!ENTITY iiiint           "⨌" ><!--alias ISOTECH qint -->
+<!ENTITY iiint            "∭" ><!--alias ISOTECH tint -->
+<!ENTITY Im               "ℑ" ><!--alias ISOAMSO image -->
+<!ENTITY ImaginaryI       "ⅈ" ><!--i for use as a square root of -1 -->
+<!ENTITY imagline         "ℐ" ><!--the geometric imaginary line -->
+<!ENTITY imagpart         "ℑ" ><!--alias ISOAMSO image -->
+<!ENTITY Implies          "⇒" ><!--alias ISOTECH rArr -->
+<!ENTITY in               "∈" ><!--ISOTECH   isin  -->
+<!ENTITY integers         "ℤ" ><!--the ring of integers -->
+<!ENTITY Integral         "∫" ><!--alias ISOTECH int -->
+<!ENTITY intercal         "⊺" ><!--alias ISOAMSB intcal -->
+<!ENTITY Intersection     "⋂" ><!--alias ISOAMSB xcap -->
+<!ENTITY intprod          "⨼" ><!--alias ISOAMSB iprod -->
+<!ENTITY InvisibleComma   "⁣" ><!--used as a separator, e.g., in indices -->
+<!ENTITY InvisibleTimes   "⁢" ><!--marks multiplication when it is understood without a mark -->
+<!ENTITY langle           "〈" ><!--alias ISOTECH lang -->
+<!ENTITY Laplacetrf       "ℒ" ><!--Laplace transform -->
+<!ENTITY lbrace           "{" ><!--alias ISONUM lcub -->
+<!ENTITY lbrack           "[" ><!--alias ISONUM lsqb -->
+<!ENTITY LeftAngleBracket "〈" ><!--alias ISOTECH lang -->
+<!ENTITY LeftArrow        "←" ><!--alias ISONUM larr -->
+<!ENTITY Leftarrow        "⇐" ><!--alias ISOTECH lArr -->
+<!ENTITY leftarrow        "←" ><!--alias ISONUM larr -->
+<!ENTITY LeftArrowBar     "⇤" ><!--alias for larrb -->
+<!ENTITY LeftArrowRightArrow "⇆" ><!--alias ISOAMSA lrarr -->
+<!ENTITY leftarrowtail    "↢" ><!--alias ISOAMSA larrtl -->
+<!ENTITY LeftCeiling      "⌈" ><!--alias ISOAMSC lceil -->
+<!ENTITY LeftDoubleBracket "〚" ><!--left double bracket delimiter -->
+<!ENTITY LeftDownVector   "⇃" ><!--alias ISOAMSA dharl -->
+<!ENTITY LeftFloor        "⌊" ><!--alias ISOAMSC lfloor -->
+<!ENTITY leftharpoondown  "↽" ><!--alias ISOAMSA lhard -->
+<!ENTITY leftharpoonup    "↼" ><!--alias ISOAMSA lharu -->
+<!ENTITY leftleftarrows   "⇇" ><!--alias ISOAMSA llarr -->
+<!ENTITY LeftRightArrow   "↔" ><!--alias ISOAMSA harr -->
+<!ENTITY Leftrightarrow   "⇔" ><!--alias ISOAMSA hArr -->
+<!ENTITY leftrightarrow   "↔" ><!--alias ISOAMSA harr -->
+<!ENTITY leftrightarrows  "⇆" ><!--alias ISOAMSA lrarr -->
+<!ENTITY leftrightharpoons "⇋" ><!--alias ISOAMSA lrhar -->
+<!ENTITY leftrightsquigarrow "↭" ><!--alias ISOAMSA harrw -->
+<!ENTITY LeftTee          "⊣" ><!--alias ISOAMSR dashv -->
+<!ENTITY LeftTeeArrow     "↤" ><!--alias for mapstoleft -->
+<!ENTITY leftthreetimes   "⋋" ><!--alias ISOAMSB lthree -->
+<!ENTITY LeftTriangle     "⊲" ><!--alias ISOAMSR vltri -->
+<!ENTITY LeftTriangleEqual "⊴" ><!--alias ISOAMSR ltrie -->
+<!ENTITY LeftUpVector     "↿" ><!--alias ISOAMSA uharl -->
+<!ENTITY LeftVector       "↼" ><!--alias ISOAMSA lharu -->
+<!ENTITY leq              "≤" ><!--alias ISOTECH le -->
+<!ENTITY leqq             "≦" ><!--alias ISOAMSR lE -->
+<!ENTITY leqslant         "⩽" ><!--alias ISOAMSR les -->
+<!ENTITY lessapprox       "⪅" ><!--alias ISOAMSR lap -->
+<!ENTITY lessdot          "⋖" ><!--alias ISOAMSR ltdot -->
+<!ENTITY lesseqgtr        "⋚" ><!--alias ISOAMSR leg -->
+<!ENTITY lesseqqgtr       "⪋" ><!--alias ISOAMSR lEg -->
+<!ENTITY LessEqualGreater "⋚" ><!--alias ISOAMSR leg -->
+<!ENTITY LessFullEqual    "≦" ><!--alias ISOAMSR lE -->
+<!ENTITY LessGreater      "≶" ><!--alias ISOAMSR lg -->
+<!ENTITY lessgtr          "≶" ><!--alias ISOAMSR lg -->
+<!ENTITY lesssim          "≲" ><!--alias ISOAMSR lsim -->
+<!ENTITY LessSlantEqual   "⩽" ><!--alias ISOAMSR les -->
+<!ENTITY LessTilde        "≲" ><!--alias ISOAMSR lsim -->
+<!ENTITY ll               "≪" ><!--alias ISOAMSR Lt -->
+<!ENTITY llcorner         "⌞" ><!--alias ISOAMSC dlcorn -->
+<!ENTITY Lleftarrow       "⇚" ><!--alias ISOAMSA lAarr -->
+<!ENTITY lmoustache       "⎰" ><!--alias ISOAMSC lmoust -->
+<!ENTITY lnapprox         "⪉" ><!--alias ISOAMSN lnap -->
+<!ENTITY lneq             "⪇" ><!--alias ISOAMSN lne -->
+<!ENTITY lneqq            "≨" ><!--alias ISOAMSN lnE -->
+<!ENTITY LongLeftArrow    "⟵" ><!--alias ISOAMSA xlarr -->
+<!ENTITY Longleftarrow    "⟸" ><!--alias ISOAMSA xlArr -->
+<!ENTITY longleftarrow    "⟵" ><!--alias ISOAMSA xlarr -->
+<!ENTITY LongLeftRightArrow "⟷" ><!--alias ISOAMSA xharr -->
+<!ENTITY Longleftrightarrow "⟺" ><!--alias ISOAMSA xhArr -->
+<!ENTITY longleftrightarrow "⟷" ><!--alias ISOAMSA xharr -->
+<!ENTITY longmapsto       "⟼" ><!--alias ISOAMSA xmap -->
+<!ENTITY LongRightArrow   "⟶" ><!--alias ISOAMSA xrarr -->
+<!ENTITY Longrightarrow   "⟹" ><!--alias ISOAMSA xrArr -->
+<!ENTITY longrightarrow   "⟶" ><!--alias ISOAMSA xrarr -->
+<!ENTITY looparrowleft    "↫" ><!--alias ISOAMSA larrlp -->
+<!ENTITY looparrowright   "↬" ><!--alias ISOAMSA rarrlp -->
+<!ENTITY LowerLeftArrow   "↙" ><!--alias ISOAMSA swarr -->
+<!ENTITY LowerRightArrow  "↘" ><!--alias ISOAMSA searr -->
+<!ENTITY lozenge          "◊" ><!--alias ISOPUB loz -->
+<!ENTITY lrcorner         "⌟" ><!--alias ISOAMSC drcorn -->
+<!ENTITY Lsh              "↰" ><!--alias ISOAMSA lsh -->
+<!ENTITY lvertneqq        "≨︀" ><!--alias ISOAMSN lvnE -->
+<!ENTITY maltese          "✠" ><!--alias ISOPUB malt -->
+<!ENTITY mapsto           "↦" ><!--alias ISOAMSA map -->
+<!ENTITY measuredangle    "∡" ><!--alias ISOAMSO angmsd -->
+<!ENTITY Mellintrf        "ℳ" ><!--Mellin transform -->
+<!ENTITY MinusPlus        "∓" ><!--alias ISOTECH mnplus -->
+<!ENTITY mp               "∓" ><!--alias ISOTECH mnplus -->
+<!ENTITY multimap         "⊸" ><!--alias ISOAMSA mumap -->
+<!ENTITY napprox          "≉" ><!--alias ISOAMSN nap -->
+<!ENTITY natural          "♮" ><!--alias ISOPUB natur -->
+<!ENTITY naturals         "ℕ" ><!--the semi-ring of natural numbers -->
+<!ENTITY nearrow          "↗" ><!--alias ISOAMSA nearr -->
+<!ENTITY NegativeMediumSpace "​" ><!--space of width -4/18 em -->
+<!ENTITY NegativeThickSpace "​" ><!--space of width -5/18 em -->
+<!ENTITY NegativeThinSpace "​" ><!--space of width -3/18 em -->
+<!ENTITY NegativeVeryThinSpace "​" ><!--space of width -1/18 em -->
+<!ENTITY NestedGreaterGreater "≫" ><!--alias ISOAMSR Gt -->
+<!ENTITY NestedLessLess   "≪" ><!--alias ISOAMSR Lt -->
+<!ENTITY nexists          "∄" ><!--alias ISOAMSO nexist -->
+<!ENTITY ngeq             "≱" ><!--alias ISOAMSN nge -->
+<!ENTITY ngeqq            "≧̸" ><!--alias ISOAMSN ngE -->
+<!ENTITY ngeqslant        "⩾̸" ><!--alias ISOAMSN nges -->
+<!ENTITY ngtr             "≯" ><!--alias ISOAMSN ngt -->
+<!ENTITY nLeftarrow       "⇍" ><!--alias ISOAMSA nlArr -->
+<!ENTITY nleftarrow       "↚" ><!--alias ISOAMSA nlarr -->
+<!ENTITY nLeftrightarrow  "⇎" ><!--alias ISOAMSA nhArr -->
+<!ENTITY nleftrightarrow  "↮" ><!--alias ISOAMSA nharr -->
+<!ENTITY nleq             "≰" ><!--alias ISOAMSN nle -->
+<!ENTITY nleqq            "≦̸" ><!--alias ISOAMSN nlE -->
+<!ENTITY nleqslant        "⩽̸" ><!--alias ISOAMSN nles -->
+<!ENTITY nless            "≮" ><!--alias ISOAMSN nlt -->
+<!ENTITY NonBreakingSpace " " ><!--alias ISONUM nbsp -->
+<!ENTITY NotCongruent     "≢" ><!--alias ISOAMSN nequiv -->
+<!ENTITY NotDoubleVerticalBar "∦" ><!--alias ISOAMSN npar -->
+<!ENTITY NotElement       "∉" ><!--alias ISOTECH notin -->
+<!ENTITY NotEqual         "≠" ><!--alias ISOTECH ne -->
+<!ENTITY NotEqualTilde    "≂̸" ><!--alias for  ≂̸ -->
+<!ENTITY NotExists        "∄" ><!--alias ISOAMSO nexist -->
+<!ENTITY NotGreater       "≯" ><!--alias ISOAMSN ngt -->
+<!ENTITY NotGreaterEqual  "≱" ><!--alias ISOAMSN nge -->
+<!ENTITY NotGreaterFullEqual "≦̸" ><!--alias ISOAMSN nlE -->
+<!ENTITY NotGreaterGreater "≫̸" ><!--alias ISOAMSN nGtv -->
+<!ENTITY NotGreaterLess   "≹" ><!--alias ISOAMSN ntvgl -->
+<!ENTITY NotGreaterSlantEqual "⩾̸" ><!--alias ISOAMSN nges -->
+<!ENTITY NotGreaterTilde  "≵" ><!--alias ISOAMSN ngsim -->
+<!ENTITY NotHumpDownHump  "≎̸" ><!--alias for ≎̸ -->
+<!ENTITY NotLeftTriangle  "⋪" ><!--alias ISOAMSN nltri -->
+<!ENTITY NotLeftTriangleEqual "⋬" ><!--alias ISOAMSN nltrie -->
+<!ENTITY NotLess          "≮" ><!--alias ISOAMSN nlt -->
+<!ENTITY NotLessEqual     "≰" ><!--alias ISOAMSN nle -->
+<!ENTITY NotLessGreater   "≸" ><!--alias ISOAMSN ntvlg -->
+<!ENTITY NotLessLess      "≪̸" ><!--alias ISOAMSN nLtv -->
+<!ENTITY NotLessSlantEqual "⩽̸" ><!--alias ISOAMSN nles -->
+<!ENTITY NotLessTilde     "≴" ><!--alias ISOAMSN nlsim -->
+<!ENTITY NotPrecedes      "⊀" ><!--alias ISOAMSN npr -->
+<!ENTITY NotPrecedesEqual "⪯̸" ><!--alias ISOAMSN npre -->
+<!ENTITY NotPrecedesSlantEqual "⋠" ><!--alias ISOAMSN nprcue -->
+<!ENTITY NotReverseElement "∌" ><!--alias ISOTECH notniva -->
+<!ENTITY NotRightTriangle "⋫" ><!--alias ISOAMSN nrtri -->
+<!ENTITY NotRightTriangleEqual "⋭" ><!--alias ISOAMSN nrtrie -->
+<!ENTITY NotSquareSubsetEqual "⋢" ><!--alias ISOAMSN nsqsube -->
+<!ENTITY NotSquareSupersetEqual "⋣" ><!--alias ISOAMSN nsqsupe -->
+<!ENTITY NotSubset        "⊂⃒" ><!--alias ISOAMSN vnsub -->
+<!ENTITY NotSubsetEqual   "⊈" ><!--alias ISOAMSN nsube -->
+<!ENTITY NotSucceeds      "⊁" ><!--alias ISOAMSN nsc -->
+<!ENTITY NotSucceedsEqual "⪰̸" ><!--alias ISOAMSN nsce -->
+<!ENTITY NotSucceedsSlantEqual "⋡" ><!--alias ISOAMSN nsccue -->
+<!ENTITY NotSuperset      "⊃⃒" ><!--alias ISOAMSN vnsup -->
+<!ENTITY NotSupersetEqual "⊉" ><!--alias ISOAMSN nsupe -->
+<!ENTITY NotTilde         "≁" ><!--alias ISOAMSN nsim -->
+<!ENTITY NotTildeEqual    "≄" ><!--alias ISOAMSN nsime -->
+<!ENTITY NotTildeFullEqual "≇" ><!--alias ISOAMSN ncong -->
+<!ENTITY NotTildeTilde    "≉" ><!--alias ISOAMSN nap -->
+<!ENTITY NotVerticalBar   "∤" ><!--alias ISOAMSN nmid -->
+<!ENTITY nparallel        "∦" ><!--alias ISOAMSN npar -->
+<!ENTITY nprec            "⊀" ><!--alias ISOAMSN npr -->
+<!ENTITY npreceq          "⪯̸" ><!--alias ISOAMSN npre -->
+<!ENTITY nRightarrow      "⇏" ><!--alias ISOAMSA nrArr -->
+<!ENTITY nrightarrow      "↛" ><!--alias ISOAMSA nrarr -->
+<!ENTITY nshortmid        "∤" ><!--alias ISOAMSN nsmid -->
+<!ENTITY nshortparallel   "∦" ><!--alias ISOAMSN nspar -->
+<!ENTITY nsimeq           "≄" ><!--alias ISOAMSN nsime -->
+<!ENTITY nsubset          "⊂⃒" ><!--alias ISOAMSN vnsub -->
+<!ENTITY nsubseteq        "⊈" ><!--alias ISOAMSN nsube -->
+<!ENTITY nsubseteqq       "⫅̸" ><!--alias ISOAMSN nsubE -->
+<!ENTITY nsucc            "⊁" ><!--alias ISOAMSN nsc -->
+<!ENTITY nsucceq          "⪰̸" ><!--alias ISOAMSN nsce -->
+<!ENTITY nsupset          "⊃⃒" ><!--alias ISOAMSN vnsup -->
+<!ENTITY nsupseteq        "⊉" ><!--alias ISOAMSN nsupe -->
+<!ENTITY nsupseteqq       "⫆̸" ><!--alias ISOAMSN nsupE -->
+<!ENTITY ntriangleleft    "⋪" ><!--alias ISOAMSN nltri -->
+<!ENTITY ntrianglelefteq  "⋬" ><!--alias ISOAMSN nltrie -->
+<!ENTITY ntriangleright   "⋫" ><!--alias ISOAMSN nrtri -->
+<!ENTITY ntrianglerighteq "⋭" ><!--alias ISOAMSN nrtrie -->
+<!ENTITY nwarrow          "↖" ><!--alias ISOAMSA nwarr -->
+<!ENTITY oint             "∮" ><!--alias ISOTECH conint -->
+<!ENTITY OpenCurlyDoubleQuote "“" ><!--alias ISONUM ldquo -->
+<!ENTITY OpenCurlyQuote   "‘" ><!--alias ISONUM lsquo -->
+<!ENTITY orderof          "ℴ" ><!--alias ISOTECH order -->
+<!ENTITY parallel         "∥" ><!--alias ISOTECH par -->
+<!ENTITY PartialD         "∂" ><!--alias ISOTECH part -->
+<!ENTITY pitchfork        "⋔" ><!--alias ISOAMSR fork -->
+<!ENTITY PlusMinus        "±" ><!--alias ISONUM plusmn -->
+<!ENTITY pm               "±" ><!--alias ISONUM plusmn -->
+<!ENTITY Poincareplane    "ℌ" ><!--the Poincare upper half-plane -->
+<!ENTITY prec             "≺" ><!--alias ISOAMSR pr -->
+<!ENTITY precapprox       "⪷" ><!--alias ISOAMSR prap -->
+<!ENTITY preccurlyeq      "≼" ><!--alias ISOAMSR prcue -->
+<!ENTITY Precedes         "≺" ><!--alias ISOAMSR pr -->
+<!ENTITY PrecedesEqual    "⪯" ><!--alias ISOAMSR pre -->
+<!ENTITY PrecedesSlantEqual "≼" ><!--alias ISOAMSR prcue -->
+<!ENTITY PrecedesTilde    "≾" ><!--alias ISOAMSR prsim -->
+<!ENTITY preceq           "⪯" ><!--alias ISOAMSR pre -->
+<!ENTITY precnapprox      "⪹" ><!--alias ISOAMSN prnap -->
+<!ENTITY precneqq         "⪵" ><!--alias ISOAMSN prnE -->
+<!ENTITY precnsim         "⋨" ><!--alias ISOAMSN prnsim -->
+<!ENTITY precsim          "≾" ><!--alias ISOAMSR prsim -->
+<!ENTITY primes           "ℙ" ><!--the prime natural numbers -->
+<!ENTITY Proportion       "∷" ><!--alias ISOAMSR Colon -->
+<!ENTITY Proportional     "∝" ><!--alias ISOTECH prop -->
+<!ENTITY propto           "∝" ><!--alias ISOTECH prop -->
+<!ENTITY quaternions      "ℍ" ><!--the ring (skew field) of quaternions -->
+<!ENTITY questeq          "≟" ><!--alias ISOAMSR equest -->
+<!ENTITY rangle           "〉" ><!--alias ISOTECH rang -->
+<!ENTITY rationals        "ℚ" ><!--the field of rational numbers -->
+<!ENTITY rbrace           "}" ><!--alias ISONUM rcub -->
+<!ENTITY rbrack           "]" ><!--alias ISONUM rsqb -->
+<!ENTITY Re               "ℜ" ><!--alias ISOAMSO real -->
+<!ENTITY realine          "ℛ" ><!--the geometric real line -->
+<!ENTITY realpart         "ℜ" ><!--alias ISOAMSO real -->
+<!ENTITY reals            "ℝ" ><!--the field of real numbers -->
+<!ENTITY ReverseElement   "∋" ><!--alias ISOTECH niv -->
+<!ENTITY ReverseEquilibrium "⇋" ><!--alias ISOAMSA lrhar -->
+<!ENTITY ReverseUpEquilibrium "⥯" ><!--alias ISOAMSA duhar -->
+<!ENTITY RightAngleBracket "〉" ><!--alias ISOTECH rang -->
+<!ENTITY RightArrow       "→" ><!--alias ISONUM rarr -->
+<!ENTITY Rightarrow       "⇒" ><!--alias ISOTECH rArr -->
+<!ENTITY rightarrow       "→" ><!--alias ISONUM rarr -->
+<!ENTITY RightArrowBar    "⇥" ><!--alias for rarrb -->
+<!ENTITY RightArrowLeftArrow "⇄" ><!--alias ISOAMSA rlarr -->
+<!ENTITY rightarrowtail   "↣" ><!--alias ISOAMSA rarrtl -->
+<!ENTITY RightCeiling     "⌉" ><!--alias ISOAMSC rceil -->
+<!ENTITY RightDoubleBracket "〛" ><!--right double bracket delimiter -->
+<!ENTITY RightDownVector  "⇂" ><!--alias ISOAMSA dharr -->
+<!ENTITY RightFloor       "⌋" ><!--alias ISOAMSC rfloor -->
+<!ENTITY rightharpoondown "⇁" ><!--alias ISOAMSA rhard -->
+<!ENTITY rightharpoonup   "⇀" ><!--alias ISOAMSA rharu -->
+<!ENTITY rightleftarrows  "⇄" ><!--alias ISOAMSA rlarr -->
+<!ENTITY rightleftharpoons "⇌" ><!--alias ISOAMSA rlhar -->
+<!ENTITY rightrightarrows "⇉" ><!--alias ISOAMSA rrarr -->
+<!ENTITY rightsquigarrow  "↝" ><!--alias ISOAMSA rarrw -->
+<!ENTITY RightTee         "⊢" ><!--alias ISOAMSR vdash -->
+<!ENTITY RightTeeArrow    "↦" ><!--alias ISOAMSA map -->
+<!ENTITY rightthreetimes  "⋌" ><!--alias ISOAMSB rthree -->
+<!ENTITY RightTriangle    "⊳" ><!--alias ISOAMSR vrtri -->
+<!ENTITY RightTriangleEqual "⊵" ><!--alias ISOAMSR rtrie -->
+<!ENTITY RightUpVector    "↾" ><!--alias ISOAMSA uharr -->
+<!ENTITY RightVector      "⇀" ><!--alias ISOAMSA rharu -->
+<!ENTITY risingdotseq     "≓" ><!--alias ISOAMSR erDot -->
+<!ENTITY rmoustache       "⎱" ><!--alias ISOAMSC rmoust -->
+<!ENTITY Rrightarrow      "⇛" ><!--alias ISOAMSA rAarr -->
+<!ENTITY Rsh              "↱" ><!--alias ISOAMSA rsh -->
+<!ENTITY searrow          "↘" ><!--alias ISOAMSA searr -->
+<!ENTITY setminus         "∖" ><!--alias ISOAMSB setmn -->
+<!ENTITY ShortDownArrow   "↓" ><!--short down arrow -->
+<!ENTITY ShortLeftArrow   "←" ><!--alias ISOAMSA slarr -->
+<!ENTITY shortmid         "∣" ><!--alias ISOAMSR smid -->
+<!ENTITY shortparallel    "∥" ><!--alias ISOAMSR spar -->
+<!ENTITY ShortRightArrow  "→" ><!--alias ISOAMSA srarr -->
+<!ENTITY ShortUpArrow     "↑" ><!--short up arrow  -->
+<!ENTITY simeq            "≃" ><!--alias ISOTECH sime -->
+<!ENTITY SmallCircle      "∘" ><!--alias ISOTECH compfn -->
+<!ENTITY smallsetminus    "∖" ><!--alias ISOAMSB ssetmn -->
+<!ENTITY spadesuit        "♠" ><!--ISOPUB    spades  -->
+<!ENTITY Sqrt             "√" ><!--alias ISOTECH radic -->
+<!ENTITY sqsubset         "⊏" ><!--alias ISOAMSR sqsub -->
+<!ENTITY sqsubseteq       "⊑" ><!--alias ISOAMSR sqsube -->
+<!ENTITY sqsupset         "⊐" ><!--alias ISOAMSR sqsup -->
+<!ENTITY sqsupseteq       "⊒" ><!--alias ISOAMSR sqsupe -->
+<!ENTITY Square           "□" ><!--alias for square -->
+<!ENTITY SquareIntersection "⊓" ><!--alias ISOAMSB sqcap -->
+<!ENTITY SquareSubset     "⊏" ><!--alias ISOAMSR sqsub -->
+<!ENTITY SquareSubsetEqual "⊑" ><!--alias ISOAMSR sqsube -->
+<!ENTITY SquareSuperset   "⊐" ><!--alias ISOAMSR sqsup -->
+<!ENTITY SquareSupersetEqual "⊒" ><!--alias ISOAMSR sqsupe -->
+<!ENTITY SquareUnion      "⊔" ><!--alias ISOAMSB sqcup -->
+<!ENTITY Star             "⋆" ><!--alias ISOAMSB sstarf -->
+<!ENTITY straightepsilon  "ϵ" ><!--alias ISOGRK3 epsi -->
+<!ENTITY straightphi      "ϕ" ><!--alias ISOGRK3 phi -->
+<!ENTITY Subset           "⋐" ><!--alias ISOAMSR Sub -->
+<!ENTITY subset           "⊂" ><!--alias ISOTECH sub -->
+<!ENTITY subseteq         "⊆" ><!--alias ISOTECH sube -->
+<!ENTITY subseteqq        "⫅" ><!--alias ISOAMSR subE -->
+<!ENTITY SubsetEqual      "⊆" ><!--alias ISOTECH sube -->
+<!ENTITY subsetneq        "⊊" ><!--alias ISOAMSN subne -->
+<!ENTITY subsetneqq       "⫋" ><!--alias ISOAMSN subnE -->
+<!ENTITY succ             "≻" ><!--alias ISOAMSR sc -->
+<!ENTITY succapprox       "⪸" ><!--alias ISOAMSR scap -->
+<!ENTITY succcurlyeq      "≽" ><!--alias ISOAMSR sccue -->
+<!ENTITY Succeeds         "≻" ><!--alias ISOAMSR sc -->
+<!ENTITY SucceedsEqual    "⪰" ><!--alias ISOAMSR sce -->
+<!ENTITY SucceedsSlantEqual "≽" ><!--alias ISOAMSR sccue -->
+<!ENTITY SucceedsTilde    "≿" ><!--alias ISOAMSR scsim -->
+<!ENTITY succeq           "⪰" ><!--alias ISOAMSR sce -->
+<!ENTITY succnapprox      "⪺" ><!--alias ISOAMSN scnap -->
+<!ENTITY succneqq         "⪶" ><!--alias ISOAMSN scnE -->
+<!ENTITY succnsim         "⋩" ><!--alias ISOAMSN scnsim -->
+<!ENTITY succsim          "≿" ><!--alias ISOAMSR scsim -->
+<!ENTITY SuchThat         "∋" ><!--ISOTECH  ni -->
+<!ENTITY Sum              "∑" ><!--alias ISOAMSB sum -->
+<!ENTITY Superset         "⊃" ><!--alias ISOTECH sup -->
+<!ENTITY SupersetEqual    "⊇" ><!--alias ISOTECH supe -->
+<!ENTITY Supset           "⋑" ><!--alias ISOAMSR Sup -->
+<!ENTITY supset           "⊃" ><!--alias ISOTECH sup -->
+<!ENTITY supseteq         "⊇" ><!--alias ISOTECH supe -->
+<!ENTITY supseteqq        "⫆" ><!--alias ISOAMSR supE -->
+<!ENTITY supsetneq        "⊋" ><!--alias ISOAMSN supne -->
+<!ENTITY supsetneqq       "⫌" ><!--alias ISOAMSN supnE -->
+<!ENTITY swarrow          "↙" ><!--alias ISOAMSA swarr -->
+<!ENTITY Therefore        "∴" ><!--alias ISOTECH there4 -->
+<!ENTITY therefore        "∴" ><!--alias ISOTECH there4 -->
+<!ENTITY thickapprox      "≈" ><!--ISOAMSR   thkap  -->
+<!ENTITY thicksim         "∼" ><!--ISOAMSR   thksim -->
+<!ENTITY ThinSpace        " " ><!--space of width 3/18 em alias ISOPUB thinsp -->
+<!ENTITY Tilde            "∼" ><!--alias ISOTECH sim -->
+<!ENTITY TildeEqual       "≃" ><!--alias ISOTECH sime -->
+<!ENTITY TildeFullEqual   "≅" ><!--alias ISOTECH cong -->
+<!ENTITY TildeTilde       "≈" ><!--alias ISOTECH ap -->
+<!ENTITY toea             "⤨" ><!--alias ISOAMSA nesear -->
+<!ENTITY tosa             "⤩" ><!--alias ISOAMSA seswar -->
+<!ENTITY triangle         "▵" ><!--alias ISOPUB utri -->
+<!ENTITY triangledown     "▿" ><!--alias ISOPUB dtri -->
+<!ENTITY triangleleft     "◃" ><!--alias ISOPUB ltri -->
+<!ENTITY trianglelefteq   "⊴" ><!--alias ISOAMSR ltrie -->
+<!ENTITY triangleq        "≜" ><!--alias ISOAMSR trie -->
+<!ENTITY triangleright    "▹" ><!--alias ISOPUB rtri -->
+<!ENTITY trianglerighteq  "⊵" ><!--alias ISOAMSR rtrie -->
+<!ENTITY TripleDot        " ⃛" ><!--alias ISOTECH tdot -->
+<!ENTITY twoheadleftarrow "↞" ><!--alias ISOAMSA Larr -->
+<!ENTITY twoheadrightarrow "↠" ><!--alias ISOAMSA Rarr -->
+<!ENTITY ulcorner         "⌜" ><!--alias ISOAMSC ulcorn -->
+<!ENTITY Union            "⋃" ><!--alias ISOAMSB xcup -->
+<!ENTITY UnionPlus        "⊎" ><!--alias ISOAMSB uplus -->
+<!ENTITY UpArrow          "↑" ><!--alias ISONUM uarr -->
+<!ENTITY Uparrow          "⇑" ><!--alias ISOAMSA uArr -->
+<!ENTITY uparrow          "↑" ><!--alias ISONUM uarr -->
+<!ENTITY UpArrowDownArrow "⇅" ><!--alias ISOAMSA udarr -->
+<!ENTITY UpDownArrow      "↕" ><!--alias ISOAMSA varr -->
+<!ENTITY Updownarrow      "⇕" ><!--alias ISOAMSA vArr -->
+<!ENTITY updownarrow      "↕" ><!--alias ISOAMSA varr -->
+<!ENTITY UpEquilibrium    "⥮" ><!--alias ISOAMSA udhar -->
+<!ENTITY upharpoonleft    "↿" ><!--alias ISOAMSA uharl -->
+<!ENTITY upharpoonright   "↾" ><!--alias ISOAMSA uharr -->
+<!ENTITY UpperLeftArrow   "↖" ><!--alias ISOAMSA nwarr -->
+<!ENTITY UpperRightArrow  "↗" ><!--alias ISOAMSA nearr -->
+<!ENTITY upsilon          "υ" ><!--alias ISOGRK3 upsi -->
+<!ENTITY UpTee            "⊥" ><!--alias ISOTECH perp -->
+<!ENTITY UpTeeArrow       "↥" ><!--Alias mapstoup -->
+<!ENTITY upuparrows       "⇈" ><!--alias ISOAMSA uuarr -->
+<!ENTITY urcorner         "⌝" ><!--alias ISOAMSC urcorn -->
+<!ENTITY varepsilon       "ε" ><!--alias ISOGRK3 epsiv -->
+<!ENTITY varkappa         "ϰ" ><!--alias ISOGRK3 kappav -->
+<!ENTITY varnothing       "∅" ><!--alias ISOAMSO emptyv -->
+<!ENTITY varphi           "φ" ><!--alias ISOGRK3 phiv -->
+<!ENTITY varpi            "ϖ" ><!--alias ISOGRK3 piv -->
+<!ENTITY varpropto        "∝" ><!--alias ISOAMSR vprop -->
+<!ENTITY varrho           "ϱ" ><!--alias ISOGRK3 rhov -->
+<!ENTITY varsigma         "ς" ><!--alias ISOGRK3 sigmav -->
+<!ENTITY varsubsetneq     "⊊︀" ><!--alias ISOAMSN vsubne -->
+<!ENTITY varsubsetneqq    "⫋︀" ><!--alias ISOAMSN vsubnE -->
+<!ENTITY varsupsetneq     "⊋︀" ><!--alias ISOAMSN vsupne -->
+<!ENTITY varsupsetneqq    "⫌︀" ><!--alias ISOAMSN vsupnE -->
+<!ENTITY vartheta         "ϑ" ><!--alias ISOGRK3 thetav -->
+<!ENTITY vartriangleleft  "⊲" ><!--alias ISOAMSR vltri -->
+<!ENTITY vartriangleright "⊳" ><!--alias ISOAMSR vrtri -->
+<!ENTITY Vee              "⋁" ><!--alias ISOAMSB xvee -->
+<!ENTITY vee              "∨" ><!--alias ISOTECH or -->
+<!ENTITY Vert             "‖" ><!--alias ISOTECH Verbar -->
+<!ENTITY vert             "|" ><!--alias ISONUM verbar -->
+<!ENTITY VerticalBar      "∣" ><!--alias ISOAMSR mid -->
+<!ENTITY VerticalTilde    "≀" ><!--alias ISOAMSB wreath -->
+<!ENTITY VeryThinSpace    " " ><!--space of width 1/18 em alias ISOPUB hairsp -->
+<!ENTITY Wedge            "⋀" ><!--alias ISOAMSB xwedge -->
+<!ENTITY wedge            "∧" ><!--alias ISOTECH and -->
+<!ENTITY wp               "℘" ><!--alias ISOAMSO weierp -->
+<!ENTITY wr               "≀" ><!--alias ISOAMSB wreath -->
+<!ENTITY zeetrf           "ℨ" ><!--zee transform -->
+
+<!-- end of MathML Character Entity section -->]]>
+
+<!-- Revision History:
+
+       Initial draft (syntax = XML) 1997-05-09
+          Stephen Buswell
+       Revised 1997-05-14
+          Robert Miner
+       Revised 1997-06-29 and 1997-07-02
+          Stephen Buswell
+       Revised 1997-12-15
+          Stephen Buswell
+       Revised 1998-02-08
+          Stephen Buswell
+       Revised 1998-04-04
+          Stephen Buswell
+       Entities and small revisions 1999-02-21
+          David Carlisle
+       Added attribute definitionURL to ci and cn 1999-10-11
+          Nico Poppelier
+       Additions for MathML 2  1999-12-16
+          David Carlisle
+       Namespace support 2000-01-14
+          David Carlisle
+       XHTML Compatibility 2000-02-23
+          Murray Altheim
+       New content elements 2000-03-26
+          David Carlisle
+       Further revisions for MathML2 CR draft 2000-07-11
+          David Carlisle
+       Further revisions for MathML2 CR draft 2000-10-31		
+          David Carlisle		
+       Revisions for Unicode 3.2  2002-05-21		
+          David Carlisle		
+       Add width and side attributes to mtable (to align with the specification)  2002-06-05		
+          David Carlisle		
+       Use %XLINK.prefix rather than hardwired xlink:, add xlink:type 2002-06-12		
+          David Carlisle		
+       Add missing numalign and denomalign attributes for mfrac 2002-07-05		
+          David Carlisle		
+       Add MathMLstrict entity and related extra constraints 2002-12-05		
+          David Carlisle		
+       Add support for xi:schemaLocation 2003-04-05		
+          David Carlisle		
+       Removed actiontype from mstyle (to match spec) 2003-04-07		
+          David Carlisle		
+       Additional constraints for MathMLstrict code (From Simon		
+          Pepping on www-math list) 2003-05-22		
+          David Carlisle		
+       Add missing minlabelspacing attribute (From Simon		
+          Pepping on www-math list) 2003-05-22		
+          David Carlisle		
+       Removed restricted menclose notation checking from MathMLstrict 2003-09-08		
+          David Carlisle		
+
+-->
+
+<!-- end of MathML 2.0 DTD  ................................................ -->
+<!-- ....................................................................... -->
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath.xml	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,28 @@
+<config verbose="true">
+  <fallback family="Times New Roman"/>
+  <defaults displaystyle="false"
+            mathsize="15pt"
+            scriptminsize="10pt"
+            scriptsizemultiplier="0.71"
+            veryverythinmathspace="0.0555556em"
+            verythinmathspace="0.111111em"
+            thinmathspace="0.166667em"
+            mediummathspace="0.222222em"
+            thickmathspace="0.277778em"
+            verythickmathspace="0.333333em"
+            veryverythickmathspace="0.388889em"
+            rowspacing="1.0ex"
+            columnspacing="0.8em"
+            framespacing="0.4em 0.5ex"/>
+  <fallback family="DejaVu Serif"/>
+  <family name="DejaVu Serif">
+    <font ttf="fonts/DejaVuSerif.ttf"/>
+    <font weight="bold" ttf="fonts/DejaVuSerif-Bold.ttf"/>
+    <font style="italic" ttf="fonts/DejaVuSerif-Italic.ttf"/>
+    <font weight="bold" style="italic" ttf="fonts/DejaVuSerif-BoldItalic.ttf"/>
+  </family>
+  <mathvariant name="normal" family="DejaVu Serif"/>
+  <mathvariant name="bold" family="DejaVu Serif" weight="bold"/>
+  <mathvariant name="italic" family="DejaVu Serif" style="italic"/>
+  <mathvariant name="bold-italic" family="DejaVu Serif" weight="bold" style="italic"/>
+</config>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/__init__.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,3 @@
+__all__ = ["mathhandler", "mathconfig", "mathnode", "nodelocator", 
+           "contextmakers", "measurers", "generators", "operators", 
+           "enclosures", "tables", "mathentityresolver"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/contextmakers.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,293 @@
+"""Methods to set up the context for a MathML tree node.
+
+The module contains two kinds of methods to set up context:
+   - context creators process the context of the current node;
+   - child context setters alter the context of a child."""
+   
+import sys, mathnode, operators
+
+#######################################################################
+#### CONTEXT CREATORS 
+
+def default_context (node): 
+    """Default context creator for a MathML tree node."""
+    if node.parent is not None:         
+        node.mathsize = node.parent.mathsize
+        node.fontSize = node.parent.fontSize
+        node.metriclist = node.parent.metriclist
+        node.scriptlevel = node.parent.scriptlevel
+        node.tightspaces = node.parent.tightspaces
+        node.displaystyle = node.parent.displaystyle
+        node.color = node.parent.color
+
+        node.fontfamilies = node.parent.fontfamilies
+        node.fontweight = node.parent.fontweight
+        node.fontstyle = node.parent.fontstyle
+
+        node.defaults = node.parent.defaults
+        node.parent.makeChildContext(node)
+    else:
+        node.mathsize = node.parseLength(node.defaults[u"mathsize"])
+        node.fontSize = node.mathsize
+        node.metriclist = None
+        node.scriptlevel = node.parseInt(node.defaults[u"scriptlevel"])
+        node.tightspaces = False
+        node.displaystyle = (node.defaults[u"displaystyle"] == u"true")
+        node.color = node.defaults[u"mathcolor"]
+
+        defaultVariant = node.config.variants.get(node.defaults[u"mathvariant"])
+        if defaultVariant is None:
+            raise sax.SAXException("Default mathvariant not defined in configuration file: configuration is unusable")
+        (node.fontweight, node.fontstyle, node.fontfamilies) = defaultVariant
+        
+    processFontAttributes(node)   
+
+    # Set the rest of properties that need immediate initialization
+    node.width = 0
+    node.height = 0
+    node.depth = 0
+    node.ascender = 0
+    node.descender = 0
+    node.leftspace = 0
+    node.rightspace = 0
+    node.alignToAxis = False
+    node.base = node
+    node.core = node
+    node.stretchy = False
+    node.accent = False
+    node.moveLimits = False
+    node.textShift = 0
+    node.textStretch = 1
+    node.leftBearing = 0
+    node.rightBearing = 0
+    node.isSpace = False
+    # Reset metrics list to None (so far, we used metrics from the parent)
+    node.metriclist = None
+    node.nominalMetric = None
+
+
+def context_math(node):
+    default_context(node)
+    # Display style: set differently on 'math'
+    attr = node.attributes.get(u"display")
+    if attr is not None:
+       node.displaystyle = (attr == u"block")
+    else:
+       attr = node.attributes.get(u"mode")
+       node.displaystyle = (attr == u"display")         
+
+
+def context_mstyle(node):
+    default_context(node)
+    # Avoid redefinition of mathsize - it is inherited anyway.
+    # This serves to preserve values of 'big', 'small', and 'normal'
+    # throughout the MathML instance.
+    if node.attributes and u"mathsize" in node.attributes.keys():
+        del node.attributes[u"mathsize"] 
+    if node.attributes:
+        node.defaults = node.defaults.copy()
+        node.defaults.update(node.attributes)
+    
+
+def context_mtable(node):
+    default_context(node)
+    # Display style: no inheritance, default is 'false' unless redefined in 'mstyle'
+    node.displaystyle = (node.getProperty(u"displaystyle") == u"true")
+
+
+def context_mi(node):
+    # If the identifier is a single character, make it italic by default.
+    # Don't forget surrogate pairs here!
+    if len(node.text) == 1 or ( len(node.text) == 2 
+                            and mathnode.isHighSurrogate(node.text[0])
+                            and mathnode.isLowSurrogate(node.text[1]) ):
+        node.attributes.setdefault(u"fontstyle", u"italic")
+    default_context(node)
+
+
+def context_mo(node):
+    # Apply special formatting to operators
+    extra_style = node.config.opstyles.get(node.text);
+    if extra_style:
+        for (prop, value) in extra_style.items():    
+            node.attributes.setdefault(prop, value)
+
+    # Consult the operator dictionary, and set the appropriate defaults
+    form = u"infix"
+    if node.parent is None: pass
+    elif node.parent.elementName in [u"mrow", u"mstyle", u"msqrt", 
+                                     u"merror", u"mpadded", u"mphantom",
+                                     u"menclose", u"mtd", u"math"]:
+        def isNonSpaceNode(x): return x.elementName != u"mspace"
+        
+        prevSiblings = node.parent.children[:node.nodeIndex]
+        prevSiblings = filter (isNonSpaceNode, prevSiblings)
+        
+        nextSiblings = node.parent.children[node.nodeIndex+1:]
+        nextSiblings = filter (isNonSpaceNode, nextSiblings)
+        
+        if len(prevSiblings) == 0 and len(nextSiblings) > 0: form = u"prefix"
+        if len(nextSiblings) == 0 and len(prevSiblings) > 0: form = u"postfix"
+ 
+    form = node.attributes.get(u"form", form)
+    
+    node.opdefaults = operators.lookup(node.text, form)        
+    default_context(node)
+    stretchyattr = node.getProperty(u"stretchy", node.opdefaults.get(u"stretchy"))        
+    node.stretchy = (stretchyattr == u"true")
+    symmetricattr = node.getProperty(u"symmetric", node.opdefaults.get(u"symmetric"))        
+    node.symmetric = (symmetricattr == u"true")
+    node.scaling = node.opdefaults.get(u"scaling") 
+    if not node.tightspaces:
+        lspaceattr = node.getProperty(u"lspace", node.opdefaults.get(u"lspace"))
+        node.leftspace = node.parseSpace(lspaceattr)
+        rspaceattr = node.getProperty(u"rspace", node.opdefaults.get(u"rspace"))
+        node.rightspace = node.parseSpace(rspaceattr)
+
+    if node.displaystyle:
+        value = node.opdefaults.get(u"largeop")
+        if node.getProperty(u"largeop", value) == u"true": 
+            node.fontSize *= 1.41    
+    else:
+        value = node.opdefaults.get(u"movablelimits")
+        node.moveLimits = (node.getProperty(u"movablelimits", value) == u"true")
+
+
+def processFontAttributes(node):
+    attr = node.attributes.get(u"displaystyle")
+    if attr is not None: node.displaystyle = (attr == u"true")
+
+    scriptlevelattr = node.attributes.get(u"scriptlevel")
+    if scriptlevelattr is not None:
+        scriptlevelattr = scriptlevelattr.strip()
+        if scriptlevelattr.startswith(u"+"):
+           node.scriptlevel += node.parseInt(scriptlevelattr[1:])
+        elif scriptlevelattr.startswith(u"-"):
+           node.scriptlevel -= node.parseInt(scriptlevelattr[1:])
+        else:
+           node.scriptlevel = node.parseInt(scriptlevelattr)
+        node.scriptlevel = max(node.scriptlevel, 0)
+
+    node.color = node.attributes.get(u"mathcolor", 
+                                     node.attributes.get(u"color", node.color))        
+    # Calculate font attributes
+    mathvariantattr = node.attributes.get(u"mathvariant")
+    if mathvariantattr is not None:
+        mathvariant = node.config.variants.get(mathvariantattr)
+        if mathvariant is None:
+            node.error("Ignored mathvariant attribute: value '"+str(mathvariantattr)+"' not defined in the font configuration file")
+        else:    
+            (node.fontweight, node.fontstyle, node.fontfamilies) = mathvariant
+    else:
+        node.fontweight = node.attributes.get(u"fontweight", node.fontweight)
+        node.fontstyle = node.attributes.get(u"fontstyle", node.fontstyle)
+        familyattr = node.attributes.get(u"fontfamily")
+        if familyattr is not None:
+            node.fontfamilies = [" ".join(x.split()) for x in familyattr.split(u",")] 
+
+    # Calculate font size
+    mathsizeattr = node.attributes.get(u"mathsize")         
+    if mathsizeattr is not None:
+        if mathsizeattr == u"normal":
+            node.mathsize = node.parseLength(node.defaults[u"mathsize"])
+        elif mathsizeattr == u"big":
+            node.mathsize = node.parseLength(node.defaults[u"mathsize"]) * 1.41
+        elif mathsizeattr == u"small":
+            node.mathsize = node.parseLength(node.defaults[u"mathsize"]) / 1.41
+        else:
+            mathsize = node.parseLengthOrPercent(mathsizeattr, node.mathsize)
+            if mathsize > 0: 
+                node.mathsize = mathsize
+            else:
+                node.error("Value of attribute 'mathsize' ignored - not a positive length: "+str(mathsizeattr))
+
+    node.fontSize = node.mathsize
+    if node.scriptlevel > 0:
+        scriptsizemultiplier = node.parseFloat(node.defaults.get(u"scriptsizemultiplier"))
+        if scriptsizemultiplier <= 0:
+            node.error("Bad inherited value of 'scriptsizemultiplier' attribute: "+str(mathsizeattr)+"; using default value")
+        scriptsizemultiplier = node.parseFloat(mathnode.globalDefaults.get(u"scriptsizemultiplier"))
+        node.fontSize *= scriptsizemultiplier ** node.scriptlevel 
+
+    fontsizeattr = node.attributes.get(u"fontsize")
+    if fontsizeattr is not None and mathsizeattr is None:
+        fontSizeOverride = node.parseLengthOrPercent(fontsizeattr, node.fontSize)            
+        if fontSizeOverride > 0:
+            node.mathsize *= fontSizeOverride / node.fontSize
+            node.fontSize = fontSizeOverride
+        else:
+            node.error("Value of attribute 'fontsize' ignored - not a positive length: "+str(fontsizeattr))
+
+    scriptminsize = node.parseLength(node.defaults.get(u"scriptminsize"))
+    node.fontSize = max(node.fontSize, scriptminsize)
+    node.originalFontSize = node.fontSize # save a copy - font size may change in scaling
+
+
+#######################################################################
+#### CHILD CONTEXT SETTERS 
+
+def default_child_context (node, child): 
+    """Default child context processing for a MathML tree node."""
+    pass
+
+    
+def child_context_mfrac (node, child):
+    if node.displaystyle: child.displaystyle = False
+    else: child.scriptlevel += 1
+
+
+def child_context_mroot (node, child):
+    if child.nodeIndex == 1: 
+        child.displaystyle = False
+        child.scriptlevel += 2
+        child.tightspaces = True
+
+
+def child_context_msub (node, child): makeScriptContext(child)
+def child_context_msup (node, child): makeScriptContext(child)
+def child_context_msubsup (node, child): makeScriptContext(child)
+def child_context_mmultiscripts (node, child): makeScriptContext(child)
+
+    
+def child_context_munder (node, child): 
+    if child.nodeIndex == 1:
+        makeLimitContext(node, child, u"accentunder")
+
+
+def child_context_mover (node, child): 
+    if child.nodeIndex == 1:
+        makeLimitContext(node, child, u"accent")
+
+
+def child_context_munderover (node, child): 
+    if child.nodeIndex == 1:
+        makeLimitContext(node, child, u"accentunder")
+    if child.nodeIndex == 2:
+        makeLimitContext(node, child, u"accent")
+
+
+def makeScriptContext (child):
+    if child.nodeIndex > 0: 
+        child.displaystyle = False
+        child.tightspaces = True
+        child.scriptlevel += 1
+
+
+def makeLimitContext (node, child, accentProperty):
+    child.displaystyle = False
+    child.tightspaces = True
+
+    accentValue = node.getProperty(accentProperty)
+    if accentValue is None:
+        embellishments = [u"msub", u"msup", u"msubsup", 
+                          u"munder", u"mover", u"munderover", u"mmultiscripts"]
+        def getAccentValue(ch):
+            if ch.elementName == u"mo":
+                return ch.opdefaults.get(u"accent")
+            elif ch.elementName in embellishments and len(ch.children) > 0:
+                return getAccentValue(ch.children[0])
+            else: return u"false"    
+        accentValue  = getAccentValue(child)
+    child.accent = (accentValue == u"true")
+    if not child.accent: 
+        child.scriptlevel += 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/enclosures.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,64 @@
+"""Functions to format enclosures around MathML elements."""
+import sys, math, mathnode
+
+def addRadicalEnclosure(node):
+    # The below is full of heuristics
+    node.lineWidth = node.nominalThinStrokeWidth() 
+    node.thickLineWidth = node.nominalThickStrokeWidth()
+    node.gap = node.nominalLineGap()
+    if not node.displaystyle: node.gap /= 2 # more compact style if inline
+
+    node.rootHeight = max (node.base.height, node.base.ascender)
+    node.rootHeight = max (node.rootHeight, node.nominalAscender())
+    node.rootHeight += node.gap + node.lineWidth
+    node.height = node.rootHeight
+
+    node.alignToAxis = node.base.alignToAxis
+    # Root extends to baseline for elements aligned on the baseline,
+    # and to the bottom for elements aligned on the axis. An extra
+    # line width is added to the depth, to account for radical sign 
+    # protruding below the baseline.
+    if node.alignToAxis:
+        node.rootDepth = max (0, node.base.depth - node.lineWidth) 
+        node.depth = max(node.base.depth, node.rootDepth + node.lineWidth) 
+    else: 
+        node.rootDepth = 0
+        node.depth = max(node.base.depth, node.lineWidth)
+        
+    node.rootWidth = (node.rootHeight + node.rootDepth) * 0.6    
+    node.cornerWidth = node.rootWidth * 0.9 - node.gap - node.lineWidth / 2 
+    node.cornerHeight = (node.rootHeight + node.rootDepth) * 0.5 - node.gap - node.lineWidth / 2
+
+    node.width = node.base.width + node.rootWidth + 2 * node.gap
+    node.ascender = node.height
+    node.descender = node.base.descender
+    node.leftspace = node.lineWidth
+    node.rightspace = node.lineWidth
+    
+def addBoxEnclosure(node):
+    node.width += 2 * node.hdelta
+    node.height += node.vdelta
+    node.depth += node.vdelta
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+
+def addCircleEnclosure(node):
+    d = math.sqrt(node.width**2 + node.height**2)
+    d = max (d, node.width + 2 * node.hdelta)
+    d = max (d, node.height + node.depth + 2 * node.vdelta)
+    cy = (node.height - node.depth) / 2
+    node.width = d
+    node.height = d / 2 + cy
+    node.depth = d / 2 - cy
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+
+def addBorderEnclosure(node, borders):
+    if borders[0]: node.width += node.hdelta #left
+    if borders[1]: node.width += node.hdelta # right
+    if borders[2]: node.height += node.vdelta # top
+    if borders[3]: node.depth += node.vdelta # bottom
+    node.decorationData = borders
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/__init__.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,1 @@
+__all__ = ["metric", "ttf", "afm", "glyphlist"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/afm.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,142 @@
+import sys, glyphlist
+from metric import FontMetric, CharMetric, FontFormatError 
+
+def parseLength(s): return 0.001 * float(s)
+
+class AFMFormatError (FontFormatError):
+    def __init__(self, msg):
+        FontFormatError.__init__(self, msg)
+
+class AFMMetric (FontMetric):
+
+    def __init__(self, afmname, glyphlistname=None, log=None):
+        FontMetric.__init__(self, log)
+        afmfile = open(afmname, "r")
+        if glyphlistname is None: 
+            self.glyphList = glyphlist.defaultGlyphList 
+        else: 
+            self.glyphList = glyphlist.GlyphList(open(afmname, "r"))
+        self.readFontMetrics(afmfile)
+        afmfile.close()
+        self.postParse()
+        
+    def readFontMetrics(self, afmfile):
+        line = afmfile.readline()
+        if not line.startswith("StartFontMetrics"):
+            raise AFMFormatError, "File is not an AFM file"
+        # TODO: AFM version control    
+            
+        while True:
+            line = afmfile.readline()
+            if len(line) == 0: break # EOF
+            if line.startswith("EndFontMetrics"): break
+            
+            if line.startswith("StartCharMetrics"):
+                self.readCharMetrics(afmfile)
+            elif line.startswith("StartKernData"):
+                self.readKernData(afmfile)
+            elif line.startswith("StartComposites"):
+                self.readComposites(afmfile)
+            else:
+                tokens = line.split(None, 1)
+                if len (tokens) < 2: continue
+                if tokens[0] == "FontName":
+                    self.fontname = tokens[1].strip()
+                elif tokens[0] == "FullName":
+                    self.fullname = tokens[1].strip()
+                elif tokens[0] == "FamilyName":
+                    self.family = tokens[1].strip()
+                elif tokens[0] == "Weight":
+                    self.weight = tokens[1].strip()
+                elif tokens[0] == "FontBBox":
+                    self.bbox = map (parseLength, tokens[1].split())
+                elif tokens[0] == "CapHeight":
+                    self.capheight = parseLength(tokens[1])
+                elif tokens[0] == "XHeight":
+                    self.xheight = parseLength(tokens[1])
+                elif tokens[0] == "Ascender":
+                    self.ascender = parseLength(tokens[1])
+                elif tokens[0] == "Descender":
+                    self.descender = parseLength(tokens[1])
+                elif tokens[0] == "StdHW":
+                    self.stdhw = parseLength(tokens[1])
+                elif tokens[0] == "StdVW":
+                    self.stdvw = parseLength(tokens[1])
+                elif tokens[0] == "UnderlinePosition":
+                    self.underlineposition = parseLength(tokens[1])
+                elif tokens[0] == "UnderlineThickness":
+                    self.underlinethickness = parseLength(tokens[1])
+                elif tokens[0] == "ItalicAngle":
+                    self.italicangle = float(tokens[1])
+                elif tokens[0] == "CharWidth":
+                    self.charwidth = parseLength(tokens[1].split()[0])
+
+    def readCharMetrics(self, afmfile):   
+        while True:
+            line = afmfile.readline()
+            if len(line) == 0: break; # EOF
+            if line.startswith("EndCharMetrics"): break
+            self.parseCharMetric(line)     
+
+                        
+    def parseCharMetric(self, line):                    
+        glyphname = None; width = None; bbox = None
+
+        for token in line.split(";"):
+            d = token.split()
+            if len(d) < 2: continue
+            if d[0] == "W" or d[0] == "WX" or d[0] == "W0X":
+                width = parseLength(d[1])
+            elif d[0] == "B" and len(d) == 5:
+                bbox = map (parseLength, d[1:])
+            elif d[0] == "N":            
+                glyphname = d[1]
+
+        if glyphname is None: return
+        if bbox is None:
+            if self.bbox is not None: bbox = self.bbox
+            else: bbox = [0, 0, 0, 0]
+        if width is None:
+            if self.charwidth is not None: width = self.charwidth
+            else: width = bbox[2] - bbox[0]
+
+        codes = self.glyphList.lookup(glyphname)
+        if codes is not None:
+            cm = CharMetric(glyphname, codes, width, bbox)
+            for c in codes: self.chardata[c] = cm
+        elif glyphname.startswith("uni"):
+            if len(glyphname) != 7: pass # no support for composites yet  
+            try:
+                c = int(glyphname[3:], 16)
+                if c >= 0 and c < 0x10000: 
+                    self.chardata[c] = CharMetric(glyphname, [c], width, bbox)
+            except TypeError: pass
+        elif glyphname.startswith("u"):
+            if len(glyphname) not in [5, 6, 7]: pass   
+            try:            
+                c = int(glyphname[1:], 16)
+                if c >= 0 and c < 0x10000: 
+                    self.chardata[c] = CharMetric(glyphname, [c], width, bbox)
+            except TypeError: pass
+
+    def readKernData(self, afmfile):  
+        while True:
+            line = afmfile.readline()
+            if len(line) == 0: break; # EOF
+            if line.startswith("EndKernData"): break
+            # TODO: parse kerning pairs    
+                
+    def readComposites(self, afmfile):    
+        while True:
+            line = afmfile.readline()
+            if len(line) == 0: break; # EOF
+            if line.startswith("EndComposites"): break
+            # TODO: parse composites
+               
+def main():
+    if len (sys.argv) == 2: 
+        AFMMetric(sys.argv[1], log=sys.stderr).dump() 
+    else:
+        print """Usage: AFM.py <path to AFM file>"""
+
+if __name__ == "__main__": main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/default.glyphs	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,4503 @@
+# Name:          Adobe Glyph List
+# Table version: 2.0
+# Date:          September 20, 2002
+#
+# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+#
+# Format: Semicolon-delimited fields:
+#            (1) glyph name
+#            (2) Unicode scalar value
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+#--end
+# Name:          ITC Zapf Dingbats Glyph List
+# Table version: 2.0
+# Date:          September 20, 2002
+#
+# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+#
+# Format: Semicolon-delimited fields:
+#            (1) glyph name
+#            (2) Unicode scalar value
+#
+a100;275E
+a101;2761
+a102;2762
+a103;2763
+a104;2764
+a105;2710
+a106;2765
+a107;2766
+a108;2767
+a109;2660
+a10;2721
+a110;2665
+a111;2666
+a112;2663
+a117;2709
+a118;2708
+a119;2707
+a11;261B
+a120;2460
+a121;2461
+a122;2462
+a123;2463
+a124;2464
+a125;2465
+a126;2466
+a127;2467
+a128;2468
+a129;2469
+a12;261E
+a130;2776
+a131;2777
+a132;2778
+a133;2779
+a134;277A
+a135;277B
+a136;277C
+a137;277D
+a138;277E
+a139;277F
+a13;270C
+a140;2780
+a141;2781
+a142;2782
+a143;2783
+a144;2784
+a145;2785
+a146;2786
+a147;2787
+a148;2788
+a149;2789
+a14;270D
+a150;278A
+a151;278B
+a152;278C
+a153;278D
+a154;278E
+a155;278F
+a156;2790
+a157;2791
+a158;2792
+a159;2793
+a15;270E
+a160;2794
+a161;2192
+a162;27A3
+a163;2194
+a164;2195
+a165;2799
+a166;279B
+a167;279C
+a168;279D
+a169;279E
+a16;270F
+a170;279F
+a171;27A0
+a172;27A1
+a173;27A2
+a174;27A4
+a175;27A5
+a176;27A6
+a177;27A7
+a178;27A8
+a179;27A9
+a17;2711
+a180;27AB
+a181;27AD
+a182;27AF
+a183;27B2
+a184;27B3
+a185;27B5
+a186;27B8
+a187;27BA
+a188;27BB
+a189;27BC
+a18;2712
+a190;27BD
+a191;27BE
+a192;279A
+a193;27AA
+a194;27B6
+a195;27B9
+a196;2798
+a197;27B4
+a198;27B7
+a199;27AC
+a19;2713
+a1;2701
+a200;27AE
+a201;27B1
+a202;2703
+a203;2750
+a204;2752
+a205;276E
+a206;2770
+a20;2714
+a21;2715
+a22;2716
+a23;2717
+a24;2718
+a25;2719
+a26;271A
+a27;271B
+a28;271C
+a29;2722
+a2;2702
+a30;2723
+a31;2724
+a32;2725
+a33;2726
+a34;2727
+a35;2605
+a36;2729
+a37;272A
+a38;272B
+a39;272C
+a3;2704
+a40;272D
+a41;272E
+a42;272F
+a43;2730
+a44;2731
+a45;2732
+a46;2733
+a47;2734
+a48;2735
+a49;2736
+a4;260E
+a50;2737
+a51;2738
+a52;2739
+a53;273A
+a54;273B
+a55;273C
+a56;273D
+a57;273E
+a58;273F
+a59;2740
+a5;2706
+a60;2741
+a61;2742
+a62;2743
+a63;2744
+a64;2745
+a65;2746
+a66;2747
+a67;2748
+a68;2749
+a69;274A
+a6;271D
+a70;274B
+a71;25CF
+a72;274D
+a73;25A0
+a74;274F
+a75;2751
+a76;25B2
+a77;25BC
+a78;25C6
+a79;2756
+a7;271E
+a81;25D7
+a82;2758
+a83;2759
+a84;275A
+a85;276F
+a86;2771
+a87;2772
+a88;2773
+a89;2768
+a8;271F
+a90;2769
+a91;276C
+a92;276D
+a93;276A
+a94;276B
+a95;2774
+a96;2775
+a97;275B
+a98;275C
+a99;275D
+a9;2720
+#-- end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/glyphlist.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,42 @@
+import sys, os
+
+class GlyphList(dict):
+    def __init__(self, f):
+        dict.__init__(self)
+        while True:
+            line = f.readline()
+            if len(line) == 0: break;
+            line = line.strip()
+            if len(line) == 0 or line.startswith("#"): continue  
+            pair = line.split(";")
+            if len(pair) != 2: continue
+            glyph = pair[0].strip()
+            codelist = pair[1].split()
+            if len (codelist) != 1: continue # no support for compounds
+            codepoint = int (codelist[0], 16) 
+
+            if glyph in self.keys(): 
+                self[glyph].append(codepoint)
+            else: 
+                self[glyph] = [codepoint]
+                
+    def lookup(self, glyphname):
+        if glyphname in self.keys(): return self.get(glyphname)
+        else: return defaultGlyphList.get(glyphname)
+            
+
+glyphListName = os.path.join(os.path.dirname(__file__), "default.glyphs")
+defaultGlyphList = GlyphList(open(glyphListName, "r"))
+
+def main():
+    if len(sys.argv) > 1:
+        glyphList = parseGlyphList(open(sys.argv[1], "r"))
+    else:
+        glyphList = defaultGlyphList
+
+    for entry, value in glyphList.items():
+        print entry, " => ", value 
+
+if __name__ == "__main__":
+    main()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/metric.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,141 @@
+class CharMetric:
+    def __init__(self, glyphname = None, codes = None, width = None, bbox = None):
+        self.name = glyphname
+        if codes: self.codes = codes
+        else: self.codes = []
+        self.width = width
+        self.bbox = bbox
+
+class FontFormatError(Exception):
+    def __init__(self, msg):
+        self.message = msg
+    def __str__(self):
+        return self.message
+
+class FontMetric:
+    def __init__(self, log=None):
+        self.fontname = None
+        self.fullname = None
+        self.family = None
+        self.weight = None
+        self.bbox = None
+        self.capheight = None
+        self.xheight = None
+        self.ascender = None
+        self.descender = None
+        self.stdhw = None
+        self.stdvw = None
+        self.underlineposition = None
+        self.underlinethickness = None
+        self.italicangle = None
+        self.charwidth = None
+        self.axisposition = None
+        self.chardata = {}
+        self.missingGlyph = None
+        self.log = log
+    
+    def postParse(self):
+        # Get Ascender from the 'd' glyph
+        if self.ascender is None:
+            cm = self.chardata.get(ord(u'd'))
+            if cm is not None:
+                self.descender = cm.bbox[3]
+            else: self.ascender = 0.7 
+        
+        # Get Descender from the 'p' glyph
+        if self.descender is None:
+            cm = self.chardata.get(ord(u'p'))
+            if cm is not None:
+                self.descender = cm.bbox[1]
+            else: self.descender = -0.2 
+        
+        # Get CapHeight from the 'H' glyph
+        if self.capheight is None:
+            cm = self.chardata.get(ord(u'H'))
+            if cm is not None:
+                self.capheight = cm.bbox[3]
+            else: self.capheight = self.ascender 
+       
+        # Get XHeight from the 'H' glyph
+        if self.xheight is None:
+            cm = self.chardata.get(ord(u'x'))
+            if cm is not None:
+                self.xheight = cm.bbox[3]
+            else: self.xheight = 0.45 
+    
+        # Determine the vertical position of the mathematical axis -
+        # that is, the quote to which fraction separator lines are raised.
+        # We try to deduce it from the median of the following characters:
+        # "equal", "minus", "plus", "less", "greater", "periodcentered")
+        # Default is CapHeight / 2, or 0.3 if there's no CapHeight.
+        if self.axisposition is None:             
+            for ch in [ord(u'+'), 0x2212, ord(u'='), ord(u'<'), ord(u'>'), 0xB7]:
+                cm = self.chardata.get(ch)
+                if cm is not None:
+                    self.axisposition = (cm.bbox[1] + cm.bbox[3]) / 2
+                    break
+            else: self.axisposition = self.capheight / 2
+            
+        # Determine the dominant rule width for math        
+        if self.underlinethickness is not None:
+            self.rulewidth = self.underlinethickness
+        else:
+            for ch in [0x2013, 0x2014, 0x2015, 0x2212, ord(u'-')]:
+                cm = self.chardata.get(ch)
+                if cm is not None:
+                    self.rulewidth = cm.bbox[3] - cm.bbox[1]
+                    break
+            else: self.rulewidth = 0.05
+            
+        if self.stdhw is None:
+            self.stdhw = 0.03
+            
+        if self.stdvw is None and not self.italicangle:
+            cm = self.chardata.get(ord('!'))
+            if cm is not None:
+                self.stdvw = cm.bbox[2] - cm.bbox[0]
+        if self.stdvw is None:
+            cm = self.chardata.get(ord('.'))
+            if cm is not None:
+                self.stdvw = cm.bbox[2] - cm.bbox[0]
+            else:
+                self.stdvw = 0.08
+
+        # Set rule gap
+        if self.underlineposition is not None:
+            self.vgap = - self.underlineposition
+        else: self.vgap = self.rulewidth * 2
+        
+        # Set missing glyph to be a space    
+        self.missingGlyph = self.chardata.get(ord(u' ')) or self.chardata.get(0xA0)
+   
+    def dump(self):
+        print "FontName: ", self.fontname
+        print "FullName: ", self.fullname
+        print "FontFamily: ", self.family
+        print "Weight: ", self.weight
+        print "FontBBox: ", 
+        for x in self.bbox:
+            print x,
+        print            
+        print "CapHeight: ", self.capheight
+        print "XHeight: ", self.xheight
+        print "Ascender: ", self.ascender
+        print "Descender: ", self.descender
+        print "StdHW: ", self.stdhw
+        print "StdVW: ", self.stdvw
+        print "UnderlinePosition: ", self.underlineposition
+        print "UnderlineThickness: ", self.underlinethickness
+        print "ItalicAngle: ", self.italicangle
+        print "CharWidth: ", self.charwidth
+        print "MathematicalBaseline: ", self.axisposition
+        print "Character data: "
+        chars = self.chardata.items()
+        chars.sort(key = lambda c: c[0])
+        for i, cm in chars:
+            if cm is None: continue
+            print "    ", ("U+%04X" % i), cm.name+":", "  W", cm.width, "  B",
+            for x in cm.bbox: 
+                print x,
+            print
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/fonts/ttf.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,289 @@
+import sys 
+from metric import FontMetric, CharMetric, FontFormatError 
+
+def readUnsigned(ff, size): 
+    res = 0;
+    for c in ff.read(size): 
+        res *= 0x100; 
+        res += ord(c)
+    return res
+
+def readSigned(ff, size):
+    res = ord(ff.read(1));
+    if res >= 0x80: res -= 0x100 
+    for c in ff.read(size - 1): 
+        res *= 0x100; 
+        res += ord(c)
+    return res
+
+def readFixed32(ff):
+    return readSigned(ff, 4) / 65536.0
+
+def readF2_14(ff):
+    return readSigned(ff, 2) / 16384.0
+
+def skip(ff, size):
+    ff.read(size)
+
+
+class TTFFormatError (FontFormatError):
+    def __init__(self, msg):
+        FontFormatError.__init__(self, msg)
+           
+class TTFMetric (FontMetric):
+
+    def __init__(self, ttfname, log=None):
+        FontMetric.__init__(self, log)
+        ff = open(ttfname, "rb")
+        self.readFontMetrics(ff)
+        ff.close()
+        self.postParse()
+        
+    def readFontMetrics(self, ff):
+        version = ff.read(4)
+        if map(ord, version) == [0, 1, 0, 0]:
+            self.fonttype="TTF"
+        elif version == "OTTO":
+            # self.fonttype="OTF"
+            # At the moment, I cannot parse bbox data out from CFF
+            raise TTFFormatError, "OpenType/CFF fonts are unsupported"
+        else:
+            raise TTFFormatError, "Not a TrueType file"
+        
+        numTables = readUnsigned(ff, 2)
+        tables = {}
+        skip(ff, 6)
+        for i in range(0, numTables):
+            tag = ff.read(4)
+            checksum = readUnsigned(ff, 4)
+            offset = readUnsigned(ff, 4)
+            length = readUnsigned(ff, 4)
+            tables[tag] = (offset, length)
+
+        def switchTable(tableTag):
+            if tableTag not in tables.keys():
+                raise TTFFormatError, "Required table "+tableTag+" missing in TrueType file"
+            return tables[tableTag]
+            
+        (offset, length) = switchTable("head")
+        ff.seek(offset+12)
+        magic = readUnsigned(ff, 4)
+        if magic != 0x5F0F3CF5:
+            raise TTFFormatError, "Magic number in 'head' table does not match the spec"
+        skip(ff, 2)
+        self.unitsPerEm = readUnsigned(ff, 2)
+        emScale = 1.0 / self.unitsPerEm
+        
+        skip(ff, 16)
+        xMin = readSigned(ff, 2) * emScale
+        yMin = readSigned(ff, 2) * emScale
+        xMax = readSigned(ff, 2) * emScale
+        yMax = readSigned(ff, 2) * emScale        
+        self.bbox = [xMin, yMin, xMax, yMax]
+
+        skip(ff, 6)
+        self.indexToLocFormat = readSigned(ff, 2)
+           
+        (offset, length) = switchTable("maxp")
+        ff.seek(offset+4)
+        self.numGlyphs = readUnsigned(ff, 2)
+
+        (offset, length) = switchTable("name")
+        ff.seek(offset+2)
+        
+        numRecords = readUnsigned(ff, 2)
+        storageOffset = readUnsigned(ff, 2) + offset
+        
+        uniNames = {}
+        macNames = {}
+        englishCodes = [0x409, 0x809, 0xC09, 0x1009, 0x1409, 0x1809]
+        
+        for i in range (0, numRecords):
+            platformID = readUnsigned(ff, 2)
+            encodingID = readUnsigned(ff, 2)
+            languageID = readUnsigned(ff, 2)
+            nameID = readUnsigned(ff, 2)
+            nameLength = readUnsigned(ff, 2)
+            nameOffset = readUnsigned(ff, 2)
+        
+            if platformID == 3 and encodingID == 1:
+                if languageID in englishCodes or nameID not in uniNames.keys(): 
+                    uniNames[nameID] = (nameOffset, nameLength)
+            elif platformID == 1 and encodingID == 0:
+                if languageID == 0 or nameID not in macNames.keys():
+                    macNames[nameID] = (nameOffset, nameLength)
+
+        def getName (code):
+            if code in macNames.keys():
+                (nameOffset, nameLength) = macNames[code]
+                ff.seek (storageOffset + nameOffset)
+                return ff.read(nameLength)
+                # FIXME: repair Mac encoding here
+            elif code in uniNames.keys():
+                (nameOffset, nameLength) = uniNames[code]
+                ff.seek (storageOffset + nameOffset)
+                result = u""
+                for i in range (0, nameLength/2):
+                    result += unichr(readUnsigned(ff, 2))
+                return result
+       
+        self.family = getName(1)
+        self.fullname = getName(4)
+        self.fontname = getName(6)
+        
+        (offset, length) = switchTable("OS/2")
+        ff.seek(offset)
+        tableVersion = readUnsigned(ff, 2)
+        cw = readSigned(ff, 2)
+        if cw: self.charwidth = cw * emScale
+
+        wght = readUnsigned(ff, 2)
+        if wght < 150: self.weight = "Thin"
+        elif wght < 250: self.weight = "Extra-Light"
+        elif wght < 350: self.weight = "Light"
+        elif wght < 450: self.weight = "Regular"
+        elif wght < 550: self.weight = "Medium"
+        elif wght < 650: self.weight = "Demi-Bold"
+        elif wght < 750: self.weight = "Bold"
+        elif wght < 850: self.weight = "Extra-Bold"
+        else: self.weight = "Black"
+
+        skip(ff, 62)
+        self.ascender = readSigned(ff, 2) * emScale
+        self.descender = readSigned(ff, 2) * emScale
+
+        if tableVersion == 2: 
+            skip(ff, 14)
+            xh = readSigned(ff, 2)
+            if xh: self.xheight = xh * emScale
+            ch = readSigned(ff, 2)
+            if ch: self.capheight = ch * emScale
+            
+           
+        (offset, length) = switchTable("post")
+        ff.seek(offset+4)
+        self.italicangle = readFixed32(ff)
+        self.underlineposition = readSigned(ff, 2) * emScale
+        self.underlinethickness = readSigned(ff, 2) * emScale
+
+        (offset, length) = switchTable("hhea")
+        ff.seek(offset+34)
+        numHmtx = readUnsigned(ff, 2)
+
+        (offset, length) = switchTable("hmtx")
+        ff.seek(offset)
+        glyphArray = []
+        w = 0
+        for i in range (0, self.numGlyphs):
+            if i < numHmtx: 
+                w = readUnsigned(ff, 2) * emScale
+                skip (ff, 2)
+            glyphArray.append(CharMetric(width = w))
+        
+        (offset, length) = switchTable("cmap")
+        ff.seek(offset+2)
+        subtableOffset = 0
+        numTables = readUnsigned(ff, 2)
+        
+        cmapEncodings = {}        
+        for i in range (0, numTables):
+             platformID = readUnsigned(ff, 2)
+             encodingID = readUnsigned(ff, 2)
+             subtableOffset = readUnsigned(ff, 4)
+             cmapEncodings[(platformID, encodingID)] = subtableOffset
+        
+        encodingScheme = "Unicode"
+        subtableOffset = cmapEncodings.get((3, 1))
+        if subtableOffset is None: 
+            encodingScheme = "Symbol"
+            subtableOffset = cmapEncodings.get((3, 0))            
+            if subtableOffset is None: 
+                raise TTFFormatError, "Cannot use font '%s': no known subtable in 'cmap' table" % self.fullname
+            else:
+                if self.log:
+                    self.log.write("WARNING: font '%s' is a symbolic font - Unicode mapping may be unreliable\n" % self.fullname) 
+
+        ff.seek(offset + subtableOffset)
+
+        tableFormat = readUnsigned(ff, 2)
+        if tableFormat != 4:
+            raise TTFFormatError, "Unsupported format in 'cmap' table: %d" % tableFormat
+        
+        subtableLength = readUnsigned(ff, 2)
+        skip (ff, 2)
+        segCount = readUnsigned(ff, 2) / 2
+        skip (ff, 6)
+        
+        endCounts = []
+        for i in range (0, segCount): endCounts.append(readUnsigned(ff, 2))
+        
+        skip (ff, 2)
+        startCounts = []
+        for i in range (0, segCount): startCounts.append(readUnsigned(ff, 2))
+
+        idDeltas = []
+        for i in range (0, segCount): idDeltas.append(readSigned(ff, 2))
+
+        rangeOffsets = []
+        for i in range (0, segCount): rangeOffsets.append(readUnsigned(ff, 2))
+        
+        remainingLength = subtableLength - 8*segCount - 16
+        if remainingLength <= 0:
+            remainingLength += 0x10000 # protection against Adobe's bug
+
+        glyphIdArray = []
+        for i in range (0, remainingLength/2): glyphIdArray.append(readUnsigned(ff, 2))
+
+        for i in range (0, segCount):
+            for c in range(startCounts[i], endCounts[i]+1):
+                if c == 0xFFFF: continue
+                gid = 0
+                if rangeOffsets[i]:
+                    idx = c - startCounts[i] + rangeOffsets[i]/2 - (segCount - i)   
+                    gid = glyphIdArray[idx]
+                else: gid = c + idDeltas[i] 
+                if gid >= 0x10000: gid -= 0x10000
+                elif gid < 0: gid += 0x10000
+                
+                cm = glyphArray[gid]
+                cm.codes.append(c)
+                # Dirty hack: map the lower half of the private-use area to ASCII
+                if encodingScheme == "Symbol" and c in range(0xF020, 0xF07F):
+                    cm.codes.append(c - 0xF000)
+                if not cm.name: cm.name = "u%04X" % c
+
+        (offset, length) = switchTable("loca")
+        ff.seek(offset)
+        glyphIndex = []
+        scalefactor = self.indexToLocFormat + 1
+
+        if self.indexToLocFormat == 0:
+            for i in range (0, self.numGlyphs+1):
+                glyphIndex.append(readUnsigned(ff, 2) * 2)
+        elif self.indexToLocFormat == 1:
+            for i in range (0, self.numGlyphs+1):
+                glyphIndex.append(readUnsigned(ff, 4))        
+        else:
+            raise TTFFormatError, "Invalid indexToLocFormat value (%d) in 'head' table" % str(self.indexToLocFormat)
+        
+        (offset, length) = switchTable("glyf")
+        for i in range (0, self.numGlyphs):
+            cm = glyphArray[i]
+            if glyphIndex[i] == glyphIndex[i+1]: 
+                cm.bbox = [0, 0, 0, 0] # empty glyph
+            else:
+                ff.seek(offset + glyphIndex[i] + 2)
+                xMin = readSigned(ff, 2) * emScale
+                yMin = readSigned(ff, 2) * emScale
+                xMax = readSigned(ff, 2) * emScale
+                yMax = readSigned(ff, 2) * emScale        
+                cm.bbox = [xMin, yMin, xMax, yMax]
+            for c in cm.codes: self.chardata[c] = cm
+            
+def main():
+    if len (sys.argv) == 2: 
+        TTFMetric(sys.argv[1], log=sys.stderr).dump() 
+    else:
+        print """Usage: TTF.py <path to TTF file>"""
+
+if __name__ == "__main__": main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/generators.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,620 @@
+"""Drawing methods for MathML elements"""
+import sys, math, mathnode
+from xml import sax
+from xml.sax import xmlreader
+
+# SVG namespace
+SVGNS = u"http://www.w3.org/2000/svg"
+# SVGMath proprietary namespace - used in metadata
+SVGMathNS = u"http://www.grigoriev.ru/svgmath"
+
+# Use namespace-aware (SAX2) or plain (SAX1) callbacks 
+useNamespaces = True
+# Output extra linefeeds to improve readability
+readable = False
+
+# Handy mapping of horizontal alignment keywords
+alignKeywords = { u"left": 0, u"center": 0.5, u"right": 1 }
+
+def startElement(output, localname, namespace, prefix, attrs):
+    """Wrapper to emit a start tag"""
+    if readable: output.characters(u"\n") # for readability
+    
+    if useNamespaces:    
+        nsAttrs = {}
+        for (att, value) in attrs.items(): nsAttrs[(None, att)] = value
+        qnames = attrs.keys()
+        output.startElementNS((namespace, localname), 
+                              prefix+localname, 
+                              xmlreader.AttributesNSImpl(nsAttrs, qnames))
+    else:
+        output.startElement(prefix+localname, 
+                            xmlreader.AttributesImpl(attrs))
+     
+def  endElement(output, localname, namespace, prefix):
+    """Wrapper to emit an end tag"""
+    if useNamespaces:    
+        output.endElementNS((namespace, localname), prefix+localname)
+    else:
+        output.endElement(prefix+localname)
+
+    if readable: output.characters(u"\n") # for readability    
+
+def startSVGElement(output, localname, attrs):
+    startElement(output, localname, SVGNS, u"svg:", attrs)
+
+def endSVGElement(output, localname):
+    endElement(output, localname, SVGNS, u"svg:")
+
+def drawImage(node, output):
+    """Top-level draw function: prepare the canvas, then call the draw method of the root node"""
+    # The zero level of the viewbox is always aligned on the alphabetic baseline
+    baseline = 0
+    if node.alignToAxis: baseline = node.axis();
+    
+    height = max(node.height, node.ascender);
+    depth = max(node.depth, node.descender);
+    vsize = height + depth;
+    
+    attrs = {u"width": (u"%fpt" % node.width), 
+             u"height": (u"%fpt" % vsize), 
+             u"viewBox": (u"0 %f %f %f" % (-(height+baseline), node.width, vsize))}    
+
+    if useNamespaces: 
+        output.startPrefixMapping(u'svg', SVGNS)
+        output.startPrefixMapping(u'svgmath', SVGMathNS)
+    else:
+        attrs[u"xmlns:svg"] = SVGNS
+        attrs[u"xmlns:svgmath"] = SVGMathNS
+
+    startSVGElement(output, u'svg', attrs)
+
+    # Prints baseline table as metadata    
+    startSVGElement(output, u'metadata', {})
+    startElement(output, 
+                 "metrics", SVGMathNS, "svgmath:", 
+                 { u"baseline": depth - baseline, 
+                   u"axis": depth - baseline + node.axis(),
+                   u"top": depth + node.height,
+                   u"bottom": depth - node.depth } )
+    endElement(output, "metrics", SVGMathNS, "svgmath:") 
+    
+    endSVGElement(output, u'metadata')
+
+    drawTranslatedNode(node, output, 0, - baseline)
+    endSVGElement(output, u'svg')    
+
+    if useNamespaces: 
+        output.endPrefixMapping(u'svg')
+        output.endPrefixMapping(u'svgmath')
+
+def default_draw (node, output): pass
+
+def draw_math (node, output): draw_mrow (node, output)
+ 
+def draw_mrow (node, output):
+    drawBox(node, output)
+    if len(node.children) == 0: return
+
+    offset = - node.children[0].leftspace
+    for ch in node.children:
+        offset += ch.leftspace 
+        baseline = 0
+        if ch.alignToAxis and not node.alignToAxis: baseline = - node.axis()        
+        drawTranslatedNode(ch, output, offset, baseline)
+        offset += ch.width + ch.rightspace
+
+def draw_mphantom (node, output): pass  
+
+def draw_none (node, output): pass
+
+def draw_maction (node, output):
+    if node.base is not None: node.base.draw(output)
+
+def draw_mprescripts (node, output): pass
+
+def draw_mstyle (node, output): draw_mrow (node, output)
+
+def draw_mfenced (node, output):  draw_mrow (node, output)
+    
+def draw_merror (node, output):
+    drawBox(node, output, node.borderWidth, u"red")
+    drawTranslatedNode(node.base, output,  node.borderWidth, 0)
+
+def draw_mpadded (node, output):
+    drawBox(node, output)
+    drawTranslatedNode(node.base, output, node.leftpadding, 0)
+    
+def draw_menclose (node, output):
+    if node.decoration is None:
+        node.base.draw(output)
+    elif node.decoration == "strikes":
+        drawStrikesEnclosure(node, output)
+    elif node.decoration == "borders":
+        drawBordersEnclosure(node, output)
+    elif node.decoration == "box":
+        drawBoxEnclosure(node, output)
+    elif node.decoration == "roundedbox":
+        r = (node.width - node.base.width + 
+             node.height - node.base.height +
+             node.depth - node.base.depth) / 4
+        drawBoxEnclosure(node, output, r)
+    elif node.decoration == "circle":
+        drawCircleEnclosure(node, output)
+    else:
+        node.error("Internal error: unhandled decoration %s", str(node.decoration))
+        node.base.draw(output)
+        
+def draw_mfrac (node, output):
+    drawBox(node, output)
+
+    if node.getProperty(u"bevelled") == u"true":
+        drawTranslatedNode(node.enumerator, output,
+                0, 
+                node.enumerator.height - node.height)        
+        drawTranslatedNode(node.denominator, output, 
+                node.width - node.denominator.width,
+                node.depth - node.denominator.depth) 
+    else:
+        enumalign = getAlign(node, u"enumalign")
+        denomalign = getAlign(node, u"denomalign")        
+        drawTranslatedNode(node.enumerator, output,
+                node.ruleWidth + (node.width - 2 * node.ruleWidth - node.enumerator.width) * enumalign, 
+                node.enumerator.height - node.height)        
+        drawTranslatedNode(node.denominator, output, 
+                node.ruleWidth + (node.width - 2 * node.ruleWidth - node.denominator.width) * denomalign,
+                node.depth - node.denominator.depth) 
+    
+    if node.ruleWidth:
+        if node.getProperty(u"bevelled") == u"true":
+            eh = node.enumerator.height + node.enumerator.depth
+            dh = node.denominator.height + node.denominator.depth
+
+            # Determine a point lying on the rule
+            ruleX = (node.width + node.enumerator.width - node.denominator.width) / 2.0
+            if eh < dh:
+                ruleY = 0.75 * eh - node.height 
+            else:
+                ruleY = node.depth - 0.75 * dh          
+            
+            x1 = max(0, ruleX - (node.depth - ruleY) / node.slope )
+            x2 = min(node.width, ruleX + (ruleY + node.height) / node.slope)
+            y1 = min(node.depth, ruleY + ruleX * node.slope)
+            y2 = max(-node.height, ruleY - (node.width - ruleX) * node.slope)
+            
+        else:
+            x1 = 0
+            y1 = 0
+            x2 = node.width
+            y2 = 0
+        
+        drawLine(output, node.color, node.ruleWidth, 
+                 x1, y1, x2, y2, {u"stroke-linecap": u"butt"}) 
+        
+def draw_mo (node, output):
+    drawSVGText(node, output)    
+
+def draw_mi (node, output):  
+    drawSVGText(node, output)    
+
+def draw_mn (node, output):  
+    drawSVGText(node, output)    
+
+def draw_mtext (node, output):  
+    drawSVGText(node, output)    
+
+def draw_ms (node, output):  
+    drawSVGText(node, output)
+
+def draw_mspace (node, output):
+    drawBox (node, output)
+
+def draw_msqrt(node, output):
+    drawBox(node, output)
+    drawTranslatedNode(node.base, output, 
+            node.width - node.base.width - node.gap, 0)
+
+    # Basic contour            
+    x1 = node.width - node.base.width - node.rootWidth - 2 * node.gap
+    y1 = (node.rootDepth - node.rootHeight)/2
+    
+    x2 = x1 + node.rootWidth * 0.2
+    y2 = y1
+    
+    x3 = x1 + node.rootWidth * 0.6
+    y3 = node.rootDepth
+    
+    x4 = x1 + node.rootWidth 
+    y4 = - node.rootHeight + node.lineWidth / 2
+    
+    x5 = node.width 
+    y5 = y4
+
+    # Thickening
+    slopeA = (x2 - x3)/(y2 - y3)
+    slopeB = (x3 - x4)/(y3 - y4)
+    
+    x2a = x2 + (node.thickLineWidth - node.lineWidth)
+    y2a = y2 
+    
+    x2c = x2 + node.lineWidth * slopeA / 2
+    y2c = y2 + node.lineWidth * 0.9
+    
+    x2b = x2c + (node.thickLineWidth - node.lineWidth) / 2
+    y2b = y2c
+    
+    ytmp = y3 - node.lineWidth/2 
+    xtmp = x3 - node.lineWidth * (slopeA + slopeB) / 4
+    
+    y3a = (y2a * slopeA - ytmp * slopeB + xtmp - x2a) / (slopeA - slopeB)
+    x3a = xtmp + (y3a - ytmp) * slopeB
+    
+    y3b = (y2b * slopeA - ytmp * slopeB + xtmp - x2b) / (slopeA - slopeB)
+    x3b = xtmp + (y3b - ytmp) * slopeB
+
+    # Lean the left protrusion down
+    y1 += (x2 - x1) * slopeA
+            
+    attrs = { u"stroke": node.color, u"fill": u"none",
+              u"stroke-width": (u"%f" % node.lineWidth),
+              u"stroke-linecap": u"butt", 
+              u"stroke-linejoin": u"miter", 
+              u"stroke-miterlimit": u"10", 
+              u"d": (u"M %f %f L %f %f L %f %f L %f %f L %f %f L %f %f L %f %f L %f %f L %f %f" %
+                       (x1,y1, x2a,y2a,x3a,y3a,x3b,y3b,x2b,y2b,x2c,y2c, x3,y3,  x4,y4,  x5,y5))}
+    startSVGElement(output, u'path', attrs) 
+    endSVGElement(output, u'path')    
+    
+def draw_mroot(node, output):
+    draw_msqrt(node, output)
+    if node.rootindex is not None:
+        w = max(0, node.cornerWidth - node.rootindex.width) / 2
+        h = - node.rootindex.depth - node.rootHeight + node.cornerHeight
+        drawTranslatedNode(node.rootindex, output, w, h)
+    
+def draw_msub (node, output): drawScripts(node, output)
+
+def draw_msup (node, output): drawScripts(node, output)
+    
+def draw_msubsup (node, output): drawScripts(node, output)
+
+def draw_mmultiscripts(node, output): drawScripts(node, output)
+
+def drawScripts (node, output):
+    if len(node.children) < 2:
+        draw_mrow (node); return
+
+    subY = node.subShift
+    superY = - node.superShift
+    def adjustment (script):
+        if script.alignToAxis: return script.axis()
+        else: return 0
+    
+    drawBox(node, output)
+    offset = 0
+    for i in range(len(node.prewidths)):
+        offset += node.prewidths[i]
+        if i < len(node.presubscripts):
+            presubscript = node.presubscripts[i]
+            drawTranslatedNode(presubscript, output, 
+                    offset - presubscript.width, subY - adjustment(presubscript))
+        if i < len(node.presuperscripts):
+            presuperscript = node.presuperscripts[i]
+            drawTranslatedNode(presuperscript, output, 
+                    offset - presuperscript.width, superY - adjustment(presuperscript))    
+    
+    drawTranslatedNode(node.base, output, offset, 0)
+    offset += node.base.width
+        
+    for i in range(len(node.postwidths)):
+        if i < len(node.subscripts):
+            subscript = node.subscripts[i]
+            drawTranslatedNode(subscript, output, 
+                               offset, subY - adjustment(subscript))
+        if i < len(node.superscripts):
+            superscript = node.superscripts[i]
+            drawTranslatedNode(superscript, output, 
+                               offset, superY - adjustment(superscript))    
+        offset += node.postwidths[i]
+
+def draw_munder (node, output): drawLimits(node, output)
+
+def draw_mover (node, output):   drawLimits(node, output)
+
+def draw_munderover (node, output):  drawLimits(node, output)
+
+def drawLimits (node, output):
+    if len(node.children) < 2:
+        draw_mrow (node); return
+    if node.core.moveLimits:
+        drawScripts(node, output);  return
+
+    drawBox(node, output)
+    drawTranslatedNode(node.base, output, 
+            (node.width - node.base.width) / 2, 0)
+    if node.underscript is not None:        
+        drawTranslatedNode(node.underscript, output, 
+                (node.width - node.underscript.width) / 2,
+                node.depth - node.underscript.depth) 
+    if node.overscript is not None:        
+        drawTranslatedNode(node.overscript, output, 
+                (node.width - node.overscript.width) / 2,
+                node.overscript.height - node.height) 
+                
+
+def draw_mtd(node, output):
+    draw_mrow(node, output)
+
+def draw_mtr(node, output): pass
+
+def draw_mlabeledtr(node, output): pass
+
+def draw_mtable(node, output):
+    drawBox (node, output)
+    
+    # Draw cells
+    vshift = - node.height + node.framespacings[1]    
+    for r in range (len(node.rows)):
+        row = node.rows[r]
+        vshift += row.height
+        hshift = node.framespacings[0]
+        for c in range (len(row.cells)):
+            column = node.columns[c]
+            cell = row.cells[c]
+            if cell is not None and cell.content is not None:
+                # Calculate horizontal alignment
+                if cell.colspan > 1:
+                    cellWidth = sum ([x.width for x in node.columns[c : c + cell.colspan]])
+                    cellWidth += sum ([x.spaceAfter for x in node.columns[c : c + cell.colspan - 1]])
+                else: cellWidth = column.width   
+                hadjust = (cellWidth - cell.content.width) * alignKeywords.get(cell.halign, 0.5)
+                
+                # Calculate vertical alignment.
+                if cell.rowspan > 1:
+                    cellHeight = sum ([x.height + x.depth for x in node.rows[r : r + cell.rowspan]])
+                    cellHeight += sum ([x.spaceAfter for x in node.rows[r : r + cell.rowspan - 1]])
+                else:
+                    cellHeight = row.height + row.depth
+
+                if cell.valign == u"top":
+                    vadjust = cell.content.height - row.height
+                elif cell.valign == u"bottom":
+                    vadjust = cellHeight - row.height - cell.content.depth
+                elif cell.valign in [u"axis", u"baseline"] and cell.rowspan == 1:
+                    vadjust = - cell.vshift # calculated in the measurer
+                else: # the rest of cases is centered
+                    vadjust = (cell.content.height - cell.content.depth + cellHeight) / 2 - row.height 
+                   
+                drawTranslatedNode (cell.content, output, hshift + hadjust, vshift + vadjust)
+            hshift += column.width + column.spaceAfter
+        vshift += row.depth + row.spaceAfter
+        
+    # Draw frame
+    def drawBorder (x1, y1, x2, y2, linestyle):
+        if linestyle is None: return
+        if x1 == x2 and y1 == y2: return
+        if linestyle == u"dashed":
+            linelength = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
+            dashoffset = 5 - ((linelength / node.lineWidth + 3) % 10) / 2
+            extrastyle = { u"stroke-dasharray": (u"%f,%f" %(node.lineWidth * 7, node.lineWidth * 3)),
+                           u"stroke-dashoffset": (u"%f" % (node.lineWidth * dashoffset)) }
+        else:
+            extrastyle = None
+        drawLine(output, node.color, node.lineWidth, x1, y1, x2, y2, extrastyle)
+
+    x1 = node.lineWidth / 2
+    y1 = node.lineWidth / 2 - node.height
+    x2 = node.width - node.lineWidth / 2
+    y2 = node.depth - node.lineWidth / 2
+    
+    drawBorder(x1, y1, x1, y2, node.framelines[0])  
+    drawBorder(x2, y1, x2, y2, node.framelines[0])
+    drawBorder(x1, y1, x2, y1, node.framelines[1])
+    drawBorder(x1, y2, x2, y2, node.framelines[1])
+    
+    # Draw intermediate lines
+    # First, let's make a grid
+    hshift = node.framespacings[0]
+    hoffsets = []
+    for c in range (len(node.columns)):
+        spacing = node.columns[c].spaceAfter
+        hshift += node.columns[c].width
+        hoffsets.append (hshift + spacing / 2)
+        hshift += spacing
+    hoffsets[-1] = x2
+
+    vshift = - node.height + node.framespacings[1]
+    voffsets = []
+    for r in range (len(node.rows)):
+        spacing = node.rows[r].spaceAfter
+        vshift += node.rows[r].height + node.rows[r].depth
+        voffsets.append (vshift + spacing / 2)
+        vshift += spacing    
+    voffsets[-1] = y2
+    
+    vspans = [0] * len(node.columns)
+    for r in range (len(node.rows) - 1):
+        row = node.rows[r]
+        if row.lineAfter is None: continue
+        
+        for c in range (len(row.cells)):
+            cell = row.cells[c]
+            if cell is None or cell.content is None: continue 
+            for j in range(c, c + cell.colspan): vspans[j] = cell.rowspan
+        vspans = [max (0, n - 1) for n in vspans]
+        
+        lineY = voffsets[r]
+        startX = x1
+        endX = x1
+        for c in range (len(node.columns)):
+            if vspans[c] > 0:
+                drawBorder(startX, lineY, endX, lineY, row.lineAfter)
+                startX = hoffsets[c] 
+            endX = hoffsets[c]
+        drawBorder(startX, lineY, endX, lineY, row.lineAfter)            
+        
+    hspans = [0] * len(node.rows)
+    for c in range (len(node.columns) - 1):
+        column = node.columns[c]
+        if column.lineAfter is None: continue
+        
+        for r in range (len(node.rows)):
+            row = node.rows[r]
+            if len(row.cells) <= c : continue
+            cell = row.cells[c]
+            if cell is None or cell.content is None: continue 
+            for j in range(r, r + cell.rowspan): hspans[j] = cell.colspan
+        hspans = [max (0, n - 1) for n in hspans]
+
+        lineX = hoffsets[c]
+        startY = y1
+        endY = y1
+        for r in range (len(node.rows)):
+            if hspans[r] > 0:
+                drawBorder(lineX, startY, lineX, endY, column.lineAfter)
+                startY = voffsets[r] 
+            endY = voffsets[r]
+        drawBorder(lineX, startY, lineX, endY, column.lineAfter)
+ 
+def drawBox(node, output, borderWidth = 0, borderColor = None, borderRadius = 0):
+    background = getBackground(node)
+    if background == u"none":
+        if borderWidth is None or borderWidth == 0: return
+    if borderColor is None: borderColor = node.color
+    
+    attrs = {u"fill": background,
+             u"stroke": u"none",
+             u"x": (u"%f" % (borderWidth / 2)),    
+             u"y": (u"%f" % (borderWidth / 2 - node.height)), 
+             u"width": (u"%f" % (node.width - borderWidth)), 
+             u"height": (u"%f" % (node.height + node.depth - borderWidth))} 
+    if borderWidth != 0 and borderColor is not None:
+        attrs[u"stroke"] = borderColor;
+        attrs[u"stroke-width"] = u"%f" % borderWidth
+        if borderRadius != 0:   
+            attrs[u"rx"] = u"%f" % borderRadius;
+            attrs[u"ry"] = u"%f" % borderRadius;
+                       
+    startSVGElement(output, u'rect', attrs) 
+    endSVGElement(output, u'rect')    
+
+def drawLine(output, color, width, x1, y1, x2, y2, strokeattrs = None): 
+    attrs = { u"fill": u"none", u"stroke": color, 
+              u"stroke-width": (u"%f" % width),
+              u"stroke-linecap": u"square",
+              u"stroke-dasharray": u"none",
+              u"x1": (u"%f" % x1), u"y1": (u"%f" % y1), 
+              u"x2": (u"%f" % x2), u"y2": (u"%f" % y2) }
+    if strokeattrs is not None: attrs.update(strokeattrs) 
+          
+    startSVGElement(output, u"line", attrs) 
+    endSVGElement(output, u"line")    
+
+def drawTranslatedNode(node, output, dx, dy):
+    if dx != 0 or  dy != 0:
+        startSVGElement(output, u'g', 
+                 {u"transform": (u"translate(%f, %f)" % (dx, dy))})    
+    node.draw(output)
+    if dx != 0 or  dy != 0:
+        endSVGElement(output, u'g')
+
+def drawSVGText(node, output):
+    drawBox(node, output)
+    fontfamilies = [x.family for x in node.fontpool() if x.used]
+    if len(fontfamilies) == 0: fontfamilies = node.fontfamilies
+    attrs = {u"fill": node.color,
+             u"font-family": u", ".join(fontfamilies),
+             u"font-size": (u"%f" % node.fontSize),
+             u"text-anchor": u"middle", 
+             u"x": (u"%f" % ((node.width + node.leftBearing - node.rightBearing) / 2 / node.textStretch )), 
+             u"y": (u"%f" % (- node.textShift))} 
+    if node.fontweight != u"normal": 
+        attrs[u"font-weight"] = node.fontweight
+    if node.fontstyle != u"normal": 
+        attrs[u"font-style"] = node.fontstyle
+    if node.textStretch != 1:
+        attrs[u"transform"] = (u"scale(%f, 1)" % node.textStretch)
+    
+    for oldchar, newchar in mathnode.specialChars.items():
+       node.text = node.text.replace(oldchar, newchar)
+    
+    startSVGElement(output, u'text', attrs) 
+    output.characters(node.text)
+    endSVGElement(output, u'text')    
+
+def getAlign(node, attrName):
+    attrValue = node.getProperty(attrName, u"center")
+    if attrValue not in alignKeywords.keys():
+        node.error("Bad value %s for %s", attrValue, attrName)
+    return alignKeywords.get(attrValue, 0.5) 
+
+
+def drawBoxEnclosure(node, output, roundRadius = 0): 
+    drawBox (node, output, node.borderWidth, None, roundRadius)
+    drawTranslatedNode(node.base, output, (node.width - node.base.width)/2, 0)
+
+
+def drawCircleEnclosure(node, output):   
+    background = getBackground(node)
+    
+    r = (node.width - node.borderWidth) / 2
+    cx = node.width / 2
+    cy = (node.depth - node.height) / 2
+
+    attrs = { u"fill": background, u"stroke": node.color, 
+              u"stroke-width": (u"%f" % node.borderWidth),
+              u"cx": (u"%f" % cx), u"cy": (u"%f" % cy), 
+              u"r": (u"%f" % r) }    
+    startSVGElement(output, u'circle', attrs) 
+    endSVGElement(output, u'circle')
+    
+    drawTranslatedNode(node.base, output, (node.width - node.base.width)/2, 0)
+
+    
+def drawBordersEnclosure(node, output):
+    def drawBorder (x1, y1, x2, y2):
+        drawLine(output, node.color, node.borderWidth, x1, y1, x2, y2)
+
+    drawBox(node, output)
+
+    x1 = node.borderWidth / 2
+    y1 = node.borderWidth / 2 - node.height
+    x2 = node.width - node.borderWidth / 2
+    y2 = node.depth - node.borderWidth / 2
+
+    (left, right, top, bottom) = node.decorationData
+    if left:   drawBorder(x1, y1, x1, y2)  
+    if right:  drawBorder(x2, y1, x2, y2)
+    if top:    drawBorder(x1, y1, x2, y1)
+    if bottom: drawBorder(x1, y2, x2, y2)
+
+    if left:
+       offset = node.width - node.base.width
+       if right: offset /= 2
+    else: offset = 0
+    drawTranslatedNode(node.base, output, offset, 0)
+
+        
+def drawStrikesEnclosure(node, output):
+    def drawStrike (x1, y1, x2, y2):
+        drawLine(output, node.color, node.borderWidth, x1, y1, x2, y2)
+
+    drawBox(node, output)
+    node.base.draw(output)
+    
+    mid_x = node.width / 2
+    mid_y = (node.depth - node.height) / 2
+    
+    (horiz, vert, updiag, downdiag) = node.decorationData
+    if horiz:    drawStrike(0, mid_y, node.width, mid_y)
+    if vert:     drawStrike(mid_x, -node.height, mid_x, node.depth)
+    if updiag:   drawStrike(0, node.depth, node.width, -node.height)
+    if downdiag: drawStrike(0, -node.height, node.width, node.depth)
+
+def getBackground(node):
+    for attr in [u"mathbackground", u"background-color", u"background"]:
+        value = node.attributes.get(attr)
+        if value is not None: 
+            if value == u"transparent": return u"none" 
+            else: return value
+    else: return u"none"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/mathconfig.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,140 @@
+"""Configuration for MathML-to-SVG formatter."""
+
+import os, sys 
+from xml import sax
+from fonts.afm import AFMMetric
+from fonts.ttf import TTFMetric
+from fonts.metric import FontFormatError
+
+class MathConfig(sax.ContentHandler):
+    """Configuration for MathML-to-SVG formatter.
+    
+    Implements SAX ContentHandler for ease of reading from file."""    
+    def __init__(self, configfile):
+        self.verbose = False
+        self.debug = []
+        self.currentFamily = None
+        self.fonts = {}
+        self.variants = {}
+        self.defaults = {}
+        self.opstyles = {}
+        self.fallbackFamilies = []
+        
+        # Parse config file
+        try:
+            parser = sax.make_parser()
+            parser.setContentHandler(self)
+            parser.setFeature(sax.handler.feature_namespaces, 0)
+            parser.parse(configfile)
+        except sax.SAXException, xcpt:
+            print "Error parsing configuration file ", configfile, ": ", xcpt.getMessage()
+            sys.exit(1)
+
+    
+    def startElement(self, name, attributes):
+        if name == u"config":
+            self.verbose = (attributes.get(u"verbose") == u"true") 
+            self.debug = (attributes.get(u"debug", u"")).replace(u",", u" ").split()
+
+        elif name == u"defaults":
+            self.defaults.update(attributes)
+            
+        elif name == u"fallback":
+            familyattr = attributes.get(u"family", u"")
+            self.fallbackFamilies = [" ".join(x.split()) for x in familyattr.split(u",")]
+
+        elif name == u"family":
+            self.currentFamily = attributes.get(u"name", u"")
+            self.currentFamily = "".join(self.currentFamily.lower().split())
+
+        elif name == u"font":
+            weight = attributes.get(u"weight", u"normal")
+            style = attributes.get(u"style", u"normal")
+            fontfullname = self.currentFamily;
+            if weight != u"normal":
+                fontfullname += u" " + weight
+            if style != u"normal":
+                fontfullname += u" " + style
+            try:
+                if u"afm" in attributes.keys():
+                    fontpath = attributes.get(u"afm")
+                    metric = AFMMetric(fontpath, attributes.get(u"glyph-list"), sys.stderr)
+                elif u"ttf" in attributes.keys():
+                    fontpath = attributes.get(u"ttf")
+                    metric = TTFMetric(fontpath, sys.stderr)
+                else:
+                    sys.stderr.write("Bad record in configuration file: font is neither AFM nor TTF\n")
+                    sys.stderr.write("Font entry for '%s' ignored\n" % fontfullname)
+                    return
+            except FontFormatError, err:
+                sys.stderr.write("Invalid or unsupported file format in '%s': %s\n" % (fontpath, err.message))
+                sys.stderr.write("Font entry for '%s' ignored\n" % fontfullname)
+                return
+            except IOError:
+                message = sys.exc_info()[1]
+                sys.stderr.write("I/O error reading font file '%s': %s\n" % (fontpath, str(message)))
+                sys.stderr.write("Font entry for '%s' ignored\n" % fontfullname)
+                return
+                 
+            self.fonts[weight+u" "+style+u" "+self.currentFamily] = metric
+                
+        elif name == u"mathvariant":
+            variantattr = attributes.get(u"name")
+            familyattr = attributes.get(u"family", "")
+            splitFamily = [" ".join(x.split()) for x in familyattr.split(u",")] 
+            weightattr = attributes.get(u"weight", u"normal")
+            styleattr = attributes.get(u"style", u"normal")
+            self.variants[variantattr] = (weightattr, styleattr, splitFamily)
+
+        elif name == u"operator-style":
+            opname = attributes.get(u"operator")
+            if opname:
+                styling = {}
+                styling.update(attributes)
+                del styling[u"operator"]
+                self.opstyles[opname] = styling
+            else:
+                sys.stderr.write("Bad record in configuration file: operator-style with no operator attribute\n")            
+
+        
+    def endElement(self, name):
+        if name == u"family":
+            self.currentFamily = None
+
+
+    def findfont(self, weight, style, family):
+        """Finds a metric for family+weight+style."""
+        weight = (weight or u"normal").strip()
+        style = (style or u"normal").strip()
+        family = "".join((family or u"").lower().split())
+        
+        for w in [weight, u"normal"]:
+            for s in [style, u"normal"]:                
+                metric = self.fonts.get(w+u" "+s+u" "+family)
+                if metric: return metric
+        return None
+
+
+def main():
+    if len(sys.argv) == 1:
+        config = MathConfig(None)
+    else:
+        config = MathConfig(sys.argv[1])
+        
+    print "Options:  verbose =", config.verbose, " debug =", config.debug
+    print "Fonts:"
+    for (font, metric) in config.fonts.items():
+        print "    ", font, "-->", metric.fontname
+    print "Math variants:"
+    for (variant, value) in config.variants.items():
+        print "    ", variant, "-->", value
+    print "Defaults:"
+    for (attr, value) in config.defaults.items():
+        print "    ", attr, "=", value
+    print "Operator styling:"
+    for (opname, value) in config.opstyles.items():
+        print "    ", repr(opname), ":", value
+    print "Fallback font families:", config.fallbackFamilies  
+        
+    
+if __name__ == "__main__": main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/mathhandler.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,95 @@
+"""SAX filter for MathML-to-SVG conversion."""
+
+import os
+import sys
+from xml import sax
+from mathnode import MathNode
+from mathconfig import MathConfig
+from nodelocator import NodeLocator
+
+# MathML namespace
+MathNS = u"http://www.w3.org/1998/Math/MathML"
+
+class MathHandler (sax.ContentHandler):
+    """SAX ContentHandler for converting MathML formulae to SVG.
+    
+    Instances of this class read MathML through SAX callbacks, and write
+    SVG to the destination (specified as another SAX ContentHandler).
+    Uses namespace-aware SAX calls for both input and output."""
+    
+    def __init__(self, saxoutput, config):
+        self.config = MathConfig(config)
+        self.output = saxoutput
+        self.skip = 0
+        self.currentNode = None
+        self.locator = None
+
+    
+    def setDocumentLocator(self, locator): 
+        self.locator = locator
+
+
+    def startDocument(self): 
+        self.output.startDocument()   
+
+
+    def endDocument(self): 
+        self.output.endDocument()   
+
+
+    def startElementNS(self, elementName, qName, attributes):
+        if self.skip > 0: self.skip += 1; return
+
+        locator = NodeLocator(self.locator)
+        (namespace, localName) = elementName
+        if namespace and namespace != MathNS:
+            if self.config.verbose:
+                locator.message("Skipped element '%s' from an unknown namespace '%s'" % (localName, namespace), "INFO")
+            self.skip = 1; return
+            
+        properties = {}
+        for (attName, value) in attributes.items():
+            (attNamespace, attLocalName) = attName
+            if attNamespace and attNamespace != MathNS:
+                if self.config.verbose:
+                    locator.message("Ignored attribute '%s' from an unknown namespace '%s'" % (attLocalName, attNamespace), "INFO")
+                continue            
+            properties[attLocalName] = value
+
+        self.currentNode = MathNode (localName, properties, locator, self.config, self.currentNode)
+
+      
+    def endElementNS(self, elementName, qName): 
+        if self.skip > 0: 
+            self.skip -= 1
+            if self.skip > 0: return
+
+        (namespace, localname) = elementName
+        if namespace and namespace != MathNS:
+            raise sax.SAXParseException("SAX parser error: namespace on opening and closing elements don't match", None, self.locator)
+        if self.currentNode is None: 
+            raise sax.SAXParseException("SAX parser error: unmatched closing tag", None, self.locator)
+
+        # Normalize text
+        self.currentNode.text = u' '.join(self.currentNode.text.split())
+
+        # If we're back to the top of the tree, measure and draw everything
+        if self.currentNode.parent is None:
+            self.currentNode.makeImage(self.output)
+            
+        self.currentNode = self.currentNode.parent
+
+
+    def characters(self, content):
+        if self.skip > 0: return
+        if self.currentNode: 
+            self.currentNode.text += content
+
+class MathEntityResolver(sax.handler.EntityResolver):
+    def __init__(self):
+        pass
+
+    def resolveEntity(self, publicId, systemId):
+        if systemId == "http://www.w3.org/TR/MathML2/dtd/mathml2.dtd":
+            return os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),  "mathml2.dtd"))
+        return systemId
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/mathnode.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,391 @@
+"""Main structure class for MathML formatting."""
+
+import sys, contextmakers, measurers, generators 
+from xml import sax
+from nodelocator import NodeLocator
+
+
+def isHighSurrogate(ch):
+    """Tests whether a Unicode character is from the high surrogates range"""
+    code = ord(ch)
+    return (0xD800 <= code and code <= 0xDBFF)
+    
+def isLowSurrogate(ch):
+    """Tests whether a Unicode character is from the low surrogates range"""
+    code = ord(ch)
+    return (0xDC00 <= code and code < 0xDFFF)
+    
+def decodeSurrogatePair(hi, lo):
+    """Returns a scalar value  that corresponds to a surrogate pair"""
+    return ((ord(hi) - 0xD800) * 0x400) + (ord(lo) - 0xDC00) + 0x10000
+
+
+globalDefaults = {
+    # Font and color properties
+    u"mathvariant": u"normal",
+    u"mathsize": u"12pt",
+    u"mathcolor": u"black",      
+    u"mathbackground": u"transparent", 
+    u"displaystyle": u"false",
+    u"scriptlevel": u"0",
+    # Script size factor and minimum value
+    u"scriptsizemultiplier": u"0.71",
+    u"scriptminsize": u"8pt",
+    # Spaces
+    u"veryverythinmathspace": u"0.0555556em",
+    u"verythinmathspace": u"0.111111em",
+    u"thinmathspace": u"0.166667em",
+    u"mediummathspace": u"0.222222em",
+    u"thickmathspace": u"0.277778em",
+    u"verythickmathspace": u"0.333333em",
+    u"veryverythickmathspace": u"0.388889em",
+    # Line thickness and slope for mfrac    
+    u"linethickness": "1",
+    u"bevelled": u"false",
+    u"enumalign": u"center",
+    u"denomalign": u"center",
+    # String quotes for ms
+    u"lquote": u"\"",
+    u"rquote": u"\"",
+    # Properties for mspace
+    u"height": u"0ex",
+    u"depth": u"0ex",
+    u"width": u"0em",
+    # Properties for mfenced
+    u"open": u"(",
+    u"close": u")",
+    u"separators": u",",
+    # Property for menclose
+    u"notation": u"longdiv",    
+    # Properties for mtable
+    u"align": u"axis",
+    u"rowalign": u"baseline",
+    u"columnalign": u"center",
+    u"columnwidth": u"auto",
+    u"equalrows": u"false",
+    u"equalcolumns": u"false",
+    u"rowspacing": u"1.0ex",
+    u"columnspacing": u"0.8em",
+    u"framespacing": u"0.4em 0.5ex",
+    u"rowlines": u"none",
+    u"columnlines": u"none",
+    u"frame": u"none"
+}
+
+specialChars = { u'\u2145': u'D',
+                 u'\u2146': u'd',
+                 u'\u2147': u'e',
+                 u'\u2148': u'i',
+                 u'\u00A0': u' ' }
+
+class FontMetricRecord:
+    """Structure to track usage of a single font family"""
+    def __init__(self, family, metric):
+       self.family = family
+       self.metric = metric
+       self.used = False
+
+
+class MathNode:
+    """MathML node descriptor.
+    
+    This class defines properties and methods that permit to building blocks
+    to combine with each other, creating a complex mathematical expression.
+    It uses dynamic binding to find methods to process specific MathML 
+    elements: these methods are contained in three other modules - 
+    contextmakers, measurers, and generators.
+    """
+
+    def __init__(self, elementName, attributes, locator, config, parent):
+        self.elementName = elementName
+        self.config = config
+        
+        if locator is not None:
+            self.locator = locator
+        elif parent is not None: # handy when we add nodes in preprocessing
+            self.locator = parent.locator
+        else:
+            self.locator = NodeLocator(None)
+
+        self.text = u''
+        self.children = []
+        self.attributes = attributes
+        self.parent = parent
+        self.metriclist = None
+        self.nominalMetric = None
+        if parent is not None: 
+            self.nodeIndex = len(parent.children)
+            self.defaults = parent.defaults
+            parent.children.append(self)
+        else: 
+            self.defaults = globalDefaults.copy()
+            self.defaults.update(config.defaults)
+            self.nodeIndex = 0
+
+                                    
+    def makeContext (self):
+        contextmakers.__dict__.get(u"context_"+self.elementName, 
+                                   contextmakers.default_context)(self)
+
+    def makeChildContext (self, child):
+        contextmakers.__dict__.get(u"child_context_"+self.elementName, 
+                                   contextmakers.default_child_context)(self, child)
+
+
+    def measure(self):
+        # Create the context for the node
+        self.makeContext()     
+        # Measure all children        
+        for ch in self.children: ch.measure()
+        # Perform node-specific measurement
+        self.measureNode()
+    
+    def measureNode(self):
+        measureMethod = measurers.__dict__.get(u"measure_"+self.elementName, 
+                                               measurers.default_measure)
+        if self.config.verbose and measureMethod is measurers.default_measure: 
+            self.warning("MathML element '%s' is unsupported" % self.elementName)
+        measureMethod(self)
+
+
+    def draw (self, output):
+        generators.__dict__.get(u"draw_"+self.elementName, 
+                                generators.default_draw)(self, output)
+    
+    def makeImage(self, output):        
+        if self.elementName != 'math':
+            self.warning("Root element in MathML document must be 'math'")
+        self.measure()
+        generators.drawImage(self, output)
+
+    
+    def warning(self, msg): 
+        self.locator.message(msg, "WARNING")
+
+    def error(self, msg): 
+        self.locator.message(msg, "ERROR")
+
+    def info(self, msg): 
+        if self.config.verbose: self.locator.message(msg, "INFO")
+
+    def debug(self, event, msg):
+        if event.strip() in self.config.debug: self.locator.message(msg, "DEBUG")
+
+
+    def parseInt (self, x):
+        try: return int(x, 10)
+        except TypeError:
+            self.error("Cannot parse string '%s' as an integer" % str(x))
+            return 0
+            
+    def parseFloat (self, x):
+        try: value = float(x)
+        except ValueError:
+            self.error("Cannot parse string '%s' as a float" % str(x))
+            return 0.0
+        text = str(value).lower()
+        if text.find("nan") >= 0 or text.find("inf") >= 0:  
+            self.error("Cannot parse string '%s' as a float" % str(x))
+            return 0.0
+        return value
+            
+    def parseLength(self, lenattr, unitlessScale = 0.75):
+        lenattr = lenattr.strip()
+        if lenattr.endswith("pt"):
+           return self.parseFloat(lenattr[:-2])
+        elif lenattr.endswith("mm"):
+           return self.parseFloat(lenattr[:-2]) * 72.0 / 25.4 
+        elif lenattr.endswith("cm"):
+           return self.parseFloat(lenattr[:-2]) * 72.0 / 2.54 
+        elif lenattr.endswith("in"):
+           return self.parseFloat(lenattr[:-2]) * 72.0
+        elif lenattr.endswith("pc"):
+           return self.parseFloat(lenattr[:-2]) * 12.0
+        elif lenattr.endswith("px"):
+           # pixels are calculated for 96 dpi
+           return self.parseFloat(lenattr[:-2]) * 72.0 / 96.0
+        elif lenattr.endswith("em"):
+           return self.parseFloat(lenattr[:-2]) * self.fontSize
+        elif lenattr.endswith("ex"):
+           return self.parseFloat(lenattr[:-2]) * self.fontSize * self.metric().xheight
+        else: 
+           # unitless lengths are treated as if  expressed in pixels
+           return self.parseFloat(lenattr) * unitlessScale
+
+    def parseSpace(self, spaceattr, unitlessScale = 0.75):
+        sign = 1.0
+        spaceattr = spaceattr.strip()
+        if spaceattr.endswith(u"mathspace"):
+           if spaceattr.startswith(u"negative"): 
+               sign = -1.0
+               spaceattr = spaceattr[8:]
+           realspaceattr = self.defaults.get(spaceattr);
+           if realspaceattr is None:
+               self.error("Bad space token: '%s'" % spaceattr)
+               realspaceattr = "0em"
+           return self.parseLength(realspaceattr, unitlessScale)
+        else:
+           return self.parseLength(spaceattr, unitlessScale)
+
+    def parsePercent(self, lenattr, percentBase):
+        value = self.parseFloat(lenattr[:-1])
+        if value is not None: return percentBase * value / 100
+        else: return 0
+
+    def parseLengthOrPercent(self, lenattr, percentBase, unitlessScale = 0.75):
+        if lenattr.endswith(u"%"): return self.parsePercent(lenattr, percentBase)
+        else: return self.parseLength(lenattr, unitlessScale) 
+
+    def parseSpaceOrPercent(self, lenattr, percentBase, unitlessScale = 0.75):
+        if lenattr.endswith(u"%"): return self.parsePercent(lenattr, percentBase)
+        else: return self.parseSpace(lenattr, unitlessScale) 
+
+
+    def getProperty(self, key, defvalue = None):
+        return self.attributes.get(key, self.defaults.get(key, defvalue))
+    
+    def getListProperty(self, attr, value = None):
+        if value is None: value = self.getProperty(attr)
+        splitvalue = value.split()
+        if len(splitvalue) > 0: return splitvalue
+        self.error("Bad value for '%s' attribute: empty list" % attr)
+        return self.defaults[attr].split()
+
+    def getUCSText(self):
+        codes = []
+        hisurr = None
+        for ch in self.text:
+            chcode = ord(ch)
+
+            # Processing surrogate pairs
+            if isLowSurrogate(ch):            
+                if hisurr is None:
+                    self.error("Invalid Unicode sequence - low surrogate character (U+%X) not preceded by a high surrogate" % ord(ch))
+                else:
+                    chcode = decodeSurrogatePair(hisurr, ch)
+                    hisurr = None
+
+            if hisurr is not None:         
+                self.error("Invalid Unicode sequence - high surrogate character (U+%X) not followed by a low surrogate" % ord(hisurr))
+                hisurr = None
+            if isHighSurrogate(ch): 
+                hisurr = ch; continue                
+            codes.append(chcode)    
+
+        if hisurr is not None:         
+            self.error("Invalid Unicode sequence - high surrogate character (U+%X) not followed by a low surrogate" % ord(hisurr))
+        return codes
+
+
+    def fontpool(self):
+        if self.metriclist is None:             
+            def fillMetricList(familylist):
+                metriclist = []
+                for family in familylist:
+                    metric = self.config.findfont(self.fontweight, self.fontstyle, family)
+                    if metric is not None: 
+                        metriclist.append(FontMetricRecord(family, metric))
+                if len(metriclist) == 0:
+                    self.warning("Cannot find any font metric for family "+(", ".join(familylist)))
+                    return None
+                else: return metriclist
+            self.metriclist = fillMetricList(self.fontfamilies)
+            if self.metriclist is None:
+                self.fontfamilies = self.config.fallbackFamilies
+                self.metriclist = fillMetricList(self.fontfamilies)
+            if self.metriclist is None:
+                self.error("Fatal error: cannot find any font metric for the node; fallback font families misconfiguration")
+                raise sax.SAXException("Fatal error: cannot find any font metric for the node")
+        return self.metriclist
+
+    def metric(self):
+        if self.nominalMetric is None:
+            self.nominalMetric = self.fontpool()[0].metric
+            for fd in self.metriclist:
+                if fd.used: 
+                    self.nominalMetric = fd.metric; break                    
+        return self.nominalMetric        
+
+
+    def axis(self):
+        return self.metric().axisposition * self.fontSize
+
+    def nominalLineWidth(self):
+        return self.metric().rulewidth * self.fontSize
+        
+    def nominalThinStrokeWidth(self):    
+        return 0.04 * self.originalFontSize
+
+    def nominalMediumStrokeWidth(self):    
+        return 0.06 * self.originalFontSize
+
+    def nominalThickStrokeWidth(self):    
+        return 0.08 * self.originalFontSize
+
+    def nominalLineGap(self):
+        return self.metric().vgap * self.fontSize
+
+    def nominalAscender(self):
+        return self.metric().ascender * self.fontSize
+
+    def nominalDescender(self):
+        return (- self.metric().descender * self.fontSize)
+
+    def hasGlyph(self, ch):
+        for fdesc in self.fontpool():
+            if fdesc.metric.chardata.get(ch) is not None: 
+                return True
+        return False
+           
+    def findChar(self, ch):
+        for fd in self.fontpool():
+            cm = fd.metric.chardata.get(ch)
+            if cm: return (cm, fd)
+        else:
+            if 0 < ch and ch < 0xFFFF and unichr(ch) in specialChars.keys():
+                return self.findChar(ord(specialChars[unichr(ch)]))
+            self.warning("Glyph U+%X not found" % ch)
+            return None      
+
+
+    def measureText(self):
+        """Measures text contents of a node"""
+        if len(self.text) == 0: 
+            self.isSpace = True; return        
+
+        cm0 = None; cm1 = None;
+        ucstext = self.getUCSText()
+        for chcode in ucstext:
+            chardesc = self.findChar(chcode)
+            if chardesc is None: 
+                self.width += self.metric().missingGlyph.width
+            else:
+                (cm, fd) = chardesc
+                fd.used = True
+                if chcode == ucstext[0]: cm0 = cm
+                if chcode == ucstext[-1]: cm1 = cm
+                self.width += cm.width
+                if self.height + self.depth == 0:
+                    self.height = cm.bbox[3]
+                    self.depth = - cm.bbox[1]
+                elif cm.bbox[3] != cm.bbox[1]: # exclude space  
+                    self.height = max (self.height, cm.bbox[3])
+                    self.depth = max (self.depth, - cm.bbox[1])
+                    
+        # Normalize to the font size
+        self.width *= self.fontSize 
+        self.depth *= self.fontSize
+        self.height *= self.fontSize
+
+        # Add ascender/descender values
+        self.ascender = self.nominalAscender()
+        self.descender = self.nominalDescender()
+
+        # Shape correction  
+        if cm0 is not None: self.leftBearing = max(0, - cm0.bbox[0]) * self.fontSize
+        if cm1 is not None: self.rightBearing = max(0, cm1.bbox[2] - cm.width) * self.fontSize
+        self.width += self.leftBearing + self.rightBearing        
+        
+        # Reset nominal metric
+        self.nominalMetric = None
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/measurers.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,814 @@
+"""Functions to determine size and position of MathML elements"""
+import sys, math, mathnode, operators, tables, enclosures
+
+# Handy constant to draw fraction bars
+defaultSlope = 1.383
+
+def default_measure (node): pass 
+
+def measure_none (node): pass
+
+def measure_mprescripts (node): pass
+
+def measure_math (node): measure_mrow (node)
+
+def measure_mphantom (node): measure_mrow (node)
+
+def measure_mstyle (node):
+    measure_mrow(node)  # processed in the constructor
+
+def measure_maction (node): 
+    selectionattr = node.attributes.get(u"selection", u"1")
+    selection = node.parseInt(selectionattr)
+    node.base = None
+    if selection <= 0:
+        node.error("Invalid value '%s' for 'selection' attribute - not a positive integer" % selectionattr)
+    elif len(node.children) == 0:        
+        node.error("No valid subexpression inside maction element - element ignored" % selectionattr)
+    else:
+        if selection > len(node.children):
+            node.error("Invalid value '%d' for 'selection' attribute - there are only %d expression descendants in the element" % (selection, len(node.children)))
+            selection = 1
+        setNodeBase(node, node.children[selection - 1])
+        node.width = node.base.width
+        node.height = node.base.height
+        node.depth = node.base.depth
+        node.ascender = node.base.ascender
+        node.descender = node.base.descender
+
+def measure_mpadded (node):
+    createImplicitRow(node)
+
+    def parseDimension(attr, startvalue, canUseSpaces):
+        if attr.endswith(" height"):
+            basevalue = node.base.height
+            attr = attr [:-7]
+        elif attr.endswith(" depth"):
+            basevalue = node.base.depth
+            attr = attr [:-6]
+        elif attr.endswith(" width"):
+            basevalue = node.base.width
+            attr = attr [:-6]
+        else: basevalue = startvalue
+        
+        if attr.endswith (u'%'): 
+            attr = attr[:-1]
+            basevalue /= 100.0
+        
+        if canUseSpaces:
+            return node.parseSpace(attr, basevalue)
+        else:
+            return node.parseLength(attr, basevalue)
+        
+    def getDimension(attname, startvalue, canUseSpaces):
+        attr = node.attributes.get(attname)
+        if attr is None: return startvalue
+        attr = " ".join(attr.split())
+        if attr.startswith(u'+'): 
+            return startvalue + parseDimension(attr[1:], startvalue, canUseSpaces)
+        elif attr.startswith(u'+'): 
+            return startvalue - parseDimension(attr[1:], startvalue, canUseSpaces)
+        else: 
+            return parseDimension(attr, startvalue, canUseSpaces)
+    
+    node.height = getDimension(u"height", node.base.height, False) 
+    node.depth = getDimension(u"depth", node.base.depth, False)
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+    node.leftpadding = getDimension(u"lspace", 0, True)
+    node.width = getDimension(u"width", node.base.width + node.leftpadding, True)
+    if node.width < 0: node.width = 0
+    node.leftspace = node.base.leftspace
+    node.rightspace = node.base.rightspace
+    
+
+def measure_mfenced (node):
+    old_children = node.children
+    node.children = []
+
+    # Add fences and separators, and process as a mrow
+    openingFence = node.getProperty(u"open")
+    openingFence = " ".join(openingFence.split())
+    if len(openingFence) > 0:
+        opening = mathnode.MathNode (u"mo", {u"fence": u"true", u"form": u"prefix"}, 
+                                     None, node.config, node)
+        opening.text = openingFence
+        opening.measure()
+
+    separators = "".join(node.getProperty(u"separators").split())
+    sepindex = 0
+    lastsep = len(separators) - 1 
+    
+    for ch in old_children:
+        if len(node.children) > 1 and lastsep >= 0:
+            sep = mathnode.MathNode (u"mo", {u"separator": u"true", u"form": u"infix"}, 
+                                     None, node.config, node)
+            sep.text = separators[sepindex]
+            sep.measure()
+            sepindex  = min (sepindex+1, lastsep)
+        node.children.append(ch)    
+
+    closingFence = node.getProperty(u"close")
+    closingFence = " ".join(closingFence.split())
+    if len(closingFence) > 0:
+        closing = mathnode.MathNode (u"mo", {u"fence": u"true", u"form": u"postfix"}, 
+                                     None, node.config, node)
+        closing.text = closingFence
+        closing.measure()
+
+    measure_mrow(node)
+
+def measure_mo (node): 
+    # Normalize operator glyphs
+    # Use minus instead of hyphen
+    if node.hasGlyph(0x2212): node.text = node.text.replace(u'-', u'\u2212')
+    # Use prime instead of apostrophe
+    if node.hasGlyph(0x2032): node.text = node.text.replace(u'\'', u'\u2032')
+    # Invisible operators produce space nodes
+    if node.text in [u'\u2061', u'\u2062', u'\u2063']: node.isSpace = True
+    else: node.measureText()
+    
+    # Align the operator along the mathematical axis for the respective font 
+    node.alignToAxis = True
+    node.textShift = - node.axis()
+    node.height += node.textShift
+    node.ascender += node.textShift
+    node.depth -= node.textShift    
+    node.descender -= node.textShift    
+
+def measure_mn (node): 
+    node.measureText()    
+
+def measure_mi (node): 
+    node.measureText()
+        
+def measure_mtext (node): 
+    node.measureText()
+    spacing = node.parseSpace(u"thinmathspace")    
+    node.leftspace = spacing
+    node.rightspace = spacing
+
+def measure_merror (node):
+    createImplicitRow(node)
+    
+    node.borderWidth = node.nominalLineWidth()
+    node.width =  node.base.width + 2 * node.borderWidth
+    node.height = node.base.height + node.borderWidth    
+    node.depth = node.base.depth + node.borderWidth    
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+
+def measure_ms (node): 
+    lq = node.getProperty(u"lquote")
+    rq = node.getProperty(u"rquote")
+    if lq: node.text = node.text.replace(lq, u"\\"+lq)
+    if rq and rq != lq: node.text = node.text.replace(rq, u"\\"+rq)
+    node.text = lq + node.text + rq
+    node.measureText()
+    spacing = node.parseSpace(u"thinmathspace")    
+    node.leftspace = spacing
+    node.rightspace = spacing
+
+def measure_mspace (node): 
+    node.height = node.parseLength(node.getProperty(u"height"))
+    node.depth = node.parseLength(node.getProperty(u"depth"))
+    node.width = node.parseSpace(node.getProperty(u"width"))
+
+    # Add ascender/descender values
+    node.ascender = node.nominalAscender()
+    node.descender = node.nominalDescender()
+
+def measure_mrow (node):
+    if len(node.children) == 0: return
+
+    # Determine alignment type for the row. If there is a non-axis-aligned,
+    # non-space child in the row, the whole row is non-axis-aligned. The row
+    # that consists of just spaces is considered a space itself
+    node.alignToAxis = True 
+    node.isSpace = True
+    for ch in node.children:
+        if not ch.isSpace:
+            node.alignToAxis = node.alignToAxis and ch.alignToAxis
+            node.isSpace = False
+
+    # Process non-marking operators
+    for i in range(len(node.children)):
+        ch = node.children[i]
+        if ch.core.elementName != u'mo': continue    
+        if ch.text in [u'\u2061', u'\u2062', u'\u2063']:
+            ch.text = u""
+            def longtext(n): 
+                if n is None: return False
+                if n.isSpace: return False
+                if n.core.elementName == u"ms": return True
+                if n.core.elementName in [u"mo", u"mi", u"mtext"]: return (len(n.core.text) > 1)
+                return False
+            ch_prev = None; ch_next = None;                           
+            if i > 0: ch_prev = node.children[i-1]
+            if i + 1 < len(node.children): ch_next = node.children[i+1]
+            if longtext(ch_prev) or longtext(ch_next):
+                ch.width = ch.parseSpace("thinmathspace")
+
+    # Calculate extent for vertical stretching
+    (node.ascender, node.descender) = getVerticalStretchExtent(node.children, node.alignToAxis, node.axis())
+
+    # Grow sizeable operators 
+    for ch in node.children:
+        if ch.core.stretchy:
+            desiredHeight = node.ascender; desiredDepth = node.descender
+            if ch.alignToAxis and not node.alignToAxis:
+                desiredHeight -= node.axis(); desiredDepth += node.axis()
+            desiredHeight -= ch.core.ascender - ch.core.height  
+            desiredDepth -= ch.core.descender - ch.core.depth  
+            stretch(ch, toHeight=desiredHeight, 
+                        toDepth=desiredDepth, 
+                        symmetric=node.alignToAxis)
+
+    # Recalculate height/depth after growing operators
+    (node.height, node.depth, node.ascender, node.descender) = getRowVerticalExtent(node.children, node.alignToAxis, node.axis())
+    
+    # Finally, calculate width and spacings
+    for ch in node.children:
+        node.width += ch.width + ch.leftspace + ch.rightspace 
+    node.leftspace = node.children[0].leftspace
+    node.rightspace = node.children[-1].rightspace
+    node.width -= node.leftspace + node.rightspace 
+    
+def measure_mfrac (node): 
+    if len(node.children) != 2:
+        node.error("Invalid content of 'mfrac' element: element should have exactly two children")
+        if len(node.children) < 2:
+            measure_mrow (node); return
+    
+    (node.enumerator, node.denominator) = node.children[:2]
+    node.alignToAxis = True
+    
+    ruleWidthKeywords = {u"medium": "1",
+                         u"thin": "0.5",
+                         u"thick": "2"}
+                         
+    widthAttr = node.getProperty(u"linethickness")
+    widthAttr = ruleWidthKeywords.get(widthAttr, widthAttr)
+    unitWidth = node.nominalLineWidth()
+    node.ruleWidth = node.parseLength(widthAttr, unitWidth)
+
+    node.ruleGap = node.nominalLineGap()
+    if node.tightspaces: node.ruleGap /= 1.41 # more compact style if in scripts/limits
+
+    if node.getProperty(u"bevelled") == u"true":    
+        eh = node.enumerator.height + node.enumerator.depth
+        dh = node.denominator.height + node.denominator.depth
+        vshift = min (eh, dh) / 2
+        node.height = (eh + dh - vshift) / 2
+        node.depth = node.height
+
+        node.slope = defaultSlope  
+        node.width = node.enumerator.width + node.denominator.width
+        node.width += vshift / node.slope
+        node.width += (node.ruleWidth + node.ruleGap) * math.sqrt(1 + node.slope**2)
+        node.leftspace = node.enumerator.leftspace
+        node.rightspace = node.denominator.rightspace
+    else:
+        node.height = node.ruleWidth / 2 + node.ruleGap + node.enumerator.height + node.enumerator.depth
+        node.depth  = node.ruleWidth / 2 + node.ruleGap + node.denominator.height + node.denominator.depth
+        node.width = max(node.enumerator.width, node.denominator.width) + 2 * node.ruleWidth
+        node.leftspace = node.ruleWidth
+        node.rightspace = node.ruleWidth
+
+    node.ascender = node.height
+    node.descender = node.depth
+
+def measure_msqrt(node):
+    # Create an explicit mrow if there's more than one child
+    createImplicitRow(node)
+    enclosures.addRadicalEnclosure(node)
+
+def measure_mroot(node):
+    if len(node.children) != 2:
+        node.error("Invalid content of 'mroot' element: element should have exactly two children")
+
+    if len(node.children) < 2:            
+        node.rootindex = None
+        measure_msqrt(node)
+    else:
+        setNodeBase(node, node.children[0])
+        node.rootindex = node.children[1]
+        enclosures.addRadicalEnclosure(node)
+        node.width += max(0, node.rootindex.width - node.cornerWidth)
+        node.height += max(0, node.rootindex.height + node.rootindex.depth - node.cornerHeight)        
+        node.ascender = node.height
+    
+def measure_msub (node): 
+    if len(node.children) != 2:
+        node.error("Invalid content of 'msub' element: element should have exactly two children")
+        if len(node.children) < 2:
+            measure_mrow (node); return
+    measureScripts(node, [node.children[1]], None)
+    
+def measure_msup (node): 
+    if len(node.children) != 2:
+        node.error("Invalid content of 'msup' element: element should have exactly two children")
+        if len(node.children) < 2:
+            measure_mrow (node); return
+    measureScripts(node, None, [node.children[1]])
+
+def measure_msubsup (node):
+    if len(node.children) != 3:
+        node.error("Invalid content of 'msubsup' element: element should have exactly three children")
+        if len(node.children) == 2:
+            measure_msub (node); return
+        elif len(node.children) < 2:
+            measure_mrow (node); return
+    measureScripts(node, [node.children[1]], [node.children[2]])
+
+def measure_munder (node): 
+    if len(node.children) != 2:
+        node.error("Invalid content of 'munder' element: element should have exactly two children")
+        if len(node.children) < 2:
+            measure_mrow (node); return
+    measureLimits(node, node.children[1], None)
+            
+    
+def measure_mover (node): 
+    if len(node.children) != 2:
+        node.error("Invalid content of 'mover' element: element should have exactly two children")
+        if len(node.children) < 2:
+            measure_mrow (node); return
+    measureLimits(node, None, node.children[1])
+
+def measure_munderover (node):
+    if len(node.children) != 3:
+        node.error("Invalid content of 'munderover' element: element should have exactly three children")
+        if len(node.children) == 2:
+            measure_munder (node); return
+        elif len(node.children) < 2:
+            measure_mrow (node); return
+    measureLimits(node, node.children[1], node.children[2])
+
+
+def measure_mmultiscripts (node):
+    if len(node.children) == 0:
+        measure_mrow (node); return
+    
+    # Sort children into sub- and superscripts
+    subscripts = [] 
+    superscripts = []
+    presubscripts = []
+    presuperscripts = []
+    
+    isPre = False; isSub = True
+    for ch in node.children[1:]:
+        if ch.elementName == u"mprescripts":
+            if isPre:
+                node.error("Repeated 'mprescripts' element inside 'mmultiscripts\n")
+            isPre = True; isSub = True; continue
+        if isSub:
+            if isPre: presubscripts.append(ch)
+            else: subscripts.append(ch)
+        else:
+            if isPre: presuperscripts.append(ch)
+            else: superscripts.append(ch)        
+        isSub = not isSub
+     
+    measureScripts(node, subscripts, superscripts, presubscripts, presuperscripts)
+    
+def measure_menclose (node):
+    def pushEnclosure():
+        if node.decoration is None: return  # no need to push
+
+        wrapChildren (node, u"menclose")
+        setNodeBase(node.children[0], node.base)
+        setNodeBase(node, node.children[0])
+        node.base.decoration = node.decoration
+        node.base.decorationData = node.decorationData
+        node.decoration = None
+        node.decorationData = None
+        node.base.width = node.width
+        node.base.height = node.height
+        node.base.depth = node.depth
+        node.base.borderWidth = node.borderWidth
+        
+    createImplicitRow(node)
+    signs = node.getProperty(u"notation").split()
+    node.width = node.base.width
+    node.height = node.base.height
+    node.depth = node.base.depth
+    node.decoration = None
+    node.decorationData = None
+    node.borderWidth = node.nominalLineWidth()    
+    node.hdelta = node.nominalLineGap() + node.borderWidth
+    node.vdelta = node.nominalLineGap() + node.borderWidth
+    
+    # Radical sign - convert to msqrt for simplicity
+    if u"radical" in signs:
+        wrapChildren(node, u"msqrt")
+        setNodeBase(node.children[0], node.base)
+        setNodeBase(node, node.children[0])
+        node.base.makeContext()
+        node.base.measureNode()
+        node.width = node.base.width
+        node.height = node.base.height
+        node.depth = node.base.depth        
+        
+    # Strikes
+    strikes = [ u"horizontalstrike" in signs,
+                u"verticalstrike" in signs,
+                u"updiagonalstrike" in signs,
+                u"downdiagonalstrike" in signs ]
+    if True in strikes:
+        pushEnclosure()
+        node.decoration = "strikes"
+        node.decorationData = strikes
+        # no size change - really? 
+    
+    # Rounded box 
+    if u"roundedbox" in signs:
+        pushEnclosure()
+        node.decoration = "roundedbox"
+        enclosures.addBoxEnclosure(node)
+    
+    # Square box 
+    if u"box" in signs:
+        pushEnclosure()
+        node.decoration = "box"
+        enclosures.addBoxEnclosure(node)
+    
+    # Circle
+    if u"circle" in signs:
+        pushEnclosure()
+        node.decoration = "circle"
+        enclosures.addCircleEnclosure(node)
+
+    # Borders    
+    borders = [ u"left" in signs,
+                u"right" in signs,
+                u"top" in signs,
+                u"bottom" in signs ]
+    if True in borders:
+        pushEnclosure()
+        if False in borders:
+            node.decoration = "borders"
+            enclosures.addBorderEnclosure(node, borders)
+        else:
+            node.decoration = "box"
+            enclosures.addBoxEnclosure(node)
+
+    # Long division    
+    if u"longdiv" in signs:
+        pushEnclosure()
+        node.decoration = "borders"
+        enclosures.addBorderEnclosure(node, [True, False, True, False]) # left top for now
+
+    # Actuarial    
+    if u"actuarial" in signs:
+        pushEnclosure()
+        node.decoration = "borders"
+        enclosures.addBorderEnclosure(node, [False, True, True, False]) # right top
+               
+def measure_mtable (node):
+    node.lineWidth = node.nominalLineWidth()    
+
+    # For readability, most layout stuff is split into pieces and moved to tables.py
+    tables.arrangeCells(node) 
+    tables.arrangeLines(node)
+    
+    # Calculate column widths 
+    tables.calculateColumnWidths(node)
+    # Expand stretchy operators horizontally
+    for r in node.rows:
+        for i in range(len(r.cells)):
+            c = r.cells[i]
+            if c is None or c.content is None: continue
+            content = c.content
+            if content.elementName == u"mtd":
+                if len(content.children) != 1: continue
+                content = content.children[0]
+                if content.core.stretchy: c.content = content
+            if content.core.stretchy:
+                if c.colspan == 1:
+                    stretch(content, toWidth = node.columns[i].width)
+                else:
+                    spannedColumns = node.columns[i : i + c.colspan]
+                    cellSize = sum([x.width for x in spannedColumns])
+                    cellSize += sum([x.spaceAfter for x in spannedColumns[:-1]])
+                    stretch(content, toWidth = cellSize)
+
+    # Calculate row heights
+    tables.calculateRowHeights(node)
+    # Expand stretchy operators vertically in all cells
+    for i in range(len(node.rows)):
+        r = node.rows[i]
+        for c in r.cells:
+            if c is None or c.content is None: continue
+            content = c.content
+            if content.elementName == u"mtd":
+                if len(content.children) != 1: continue
+                content = content.children[0]
+                if content.core.stretchy: c.content = content
+            if content.core.stretchy:
+                if c.rowspan == 1:
+                    stretch(content, toHeight = r.height - c.vshift, 
+                                     toDepth = r.depth + c.vshift)
+                else:
+                    spannedRows = node.rows[i : i + c.rowspan]
+                    cellSize = sum([x.height + x.depth for x in spannedRows])
+                    cellSize += sum([x.spaceAfter for x in spannedRows[:-1]])
+                    stretch(content, toHeight = cellSize / 2, 
+                                     toDepth = cellSize / 2)
+
+    # Recalculate widths, to account for stretched cells
+    tables.calculateColumnWidths(node)
+
+    # Calculate total width of the table
+    node.width  = sum([x.width + x.spaceAfter for x in node.columns])
+    node.width += 2 * node.framespacings[0]
+        
+    # Calculate total height of the table
+    vsize = sum([x.height + x.depth + x.spaceAfter for x in node.rows])
+    vsize += 2 * node.framespacings[1]
+
+    # Calculate alignment point
+    (alignType, alignRow) = tables.getAlign(node)
+    
+    if alignRow is None:
+       topLine = 0
+       bottomLine = vsize
+       axisLine = vsize / 2
+       baseLine = axisLine + node.axis()
+    else:
+       row = node.rows[alignRow - 1]
+       topLine = node.framespacings[1]
+       for r in node.rows[0 : alignRow]: topLine += r.height + r.depth + r.spaceAfter 
+       bottomLine = topLine + row.height + row.depth
+       if row.alignToAxis: 
+          axisLine = topLine + row.height
+          baseLine = axisLine + node.axis()
+       else:
+          baseLine = topLine + row.height
+          axisLine = baseLine - node.axis()   
+    
+    if alignType == u"axis":
+        node.alignToAxis = True
+        node.height = axisLine 
+    elif alignType == u"baseline":
+        node.alignToAxis = False
+        node.height = baseLine
+    elif alignType == u"center":
+        node.alignToAxis = False
+        node.height = (topLine + bottomLine) / 2    
+    elif alignType == u"top":
+        node.alignToAxis = False
+        node.height = topLine
+    elif alignType == u"bottom":    
+        node.alignToAxis = False
+        node.height = bottomLine
+    else:
+        node.error("Unrecognized or unsupported table alignment value: " + alignType)
+        node.alignToAxis = True
+        node.height = axisLine
+    node.depth = vsize - node.height
+    
+    node.ascender = node.height
+    node.descender = node.depth
+
+def measure_mtr (node):
+    if node.parent is None or node.parent.elementName != u"mtable":
+        node.error("Misplaced '%s' element: should be child of 'mtable'" % node.elementName)
+    pass # all processing is done on the table
+
+def measure_mlabeledtr (node):
+    # Strip the label and treat as an ordinary 'mtr'
+    if len(node.children) == 0:
+        node.error("Missing label in '%s' element" % node.elementName)
+    else: 
+        node.warning("MathML element '%s' is unsupported: label omitted" % node.elementName)
+        node.children = node.children[1:]
+    measure_mtr(node)    
+
+def measure_mtd (node):
+    if node.parent is None or node.parent.elementName not in [u"mtr", u"mlabeledtr", u"mtable"]:
+        node.error("Misplaced '%s' element: should be child of 'mtr', 'mlabeledtr', or 'mtable'" % node.elementName)
+    measure_mrow(node)
+
+def measureScripts(node, subscripts, superscripts, 
+                         presubscripts = None, presuperscripts = None):
+    node.subscripts = subscripts or [] 
+    node.superscripts = superscripts or []
+    node.presubscripts = presubscripts or []
+    node.presuperscripts = presuperscripts or []
+
+    setNodeBase(node, node.children[0])
+    node.width = node.base.width
+    node.height = node.base.height
+    node.depth = node.base.depth
+    node.ascender = node.base.ascender
+    node.descender = node.base.descender
+    
+    subs = node.subscripts + node.presubscripts
+    supers = node.superscripts + node.presuperscripts
+    node.subscriptAxis = max([0] + [x.axis() for x in subs])
+    node.superscriptAxis = max([0] + [x.axis() for x in supers])
+    gap = max ([x.nominalLineGap() for x in subs+supers])
+    protrusion = node.parseLength("0.25ex")
+    scriptMedian = node.axis()
+    
+    (subHeight, subDepth, subAscender, subDescender) = getRowVerticalExtent(subs, False, node.subscriptAxis)
+    (superHeight, superDepth, superAscender, superDescender) = getRowVerticalExtent(supers, False, node.superscriptAxis)
+
+    node.subShift = 0
+    if len(subs) > 0:
+        shiftAttr = node.getProperty(u"subscriptshift")
+        if shiftAttr is None: shiftAttr = "0.5ex"
+        node.subShift = node.parseLength(shiftAttr)  # positive shifts down
+        node.subShift = max (node.subShift, subHeight - scriptMedian + gap)
+        if node.alignToAxis: node.subShift += node.axis()
+        node.subShift = max (node.subShift, node.base.depth + protrusion - subDepth)
+        node.height = max (node.height, subHeight - node.subShift)
+        node.depth = max (node.depth, subDepth + node.subShift)
+        node.ascender = max (node.ascender, subAscender - node.subShift)
+        node.descender = max (node.descender, subDescender + node.subShift)
+
+    node.superShift = 0
+    if len(supers) > 0:    
+        shiftAttr = node.getProperty(u"superscriptshift")
+        if shiftAttr is None: shiftAttr = "1ex"
+        node.superShift = node.parseLength(shiftAttr)  # positive shifts up
+        node.superShift = max (node.superShift, superDepth + scriptMedian + gap)
+        if node.alignToAxis: node.superShift -= node.axis()
+        node.superShift = max (node.superShift, node.base.height + protrusion - superHeight)
+        node.height = max (node.height, superHeight + node.superShift)
+        node.depth = max (node.depth, superDepth - node.superShift)
+        node.ascender = max (node.ascender, superHeight + node.superShift)
+        node.descender = max (node.descender, superDepth - node.superShift)
+
+    def parallelWidths (nodes1, nodes2):
+       widths = []
+       for i in range (max(len(nodes1), len(nodes2))):
+          w = 0
+          if i < len(nodes1): w = max (w, nodes1[i].width) 
+          if i < len(nodes2): w = max (w, nodes2[i].width)
+          widths.append(w)
+       return widths
+
+    node.postwidths = parallelWidths(node.subscripts, node.superscripts)
+    node.prewidths = parallelWidths(node.presubscripts, node.presuperscripts)
+    node.width += sum(node.prewidths + node.postwidths)
+
+def measureLimits(node, underscript, overscript):
+    if node.children[0].core.moveLimits:
+        subs = [] 
+        supers = []
+        if underscript is not None: subs = [underscript]
+        if overscript is not None: supers = [overscript]
+        measureScripts(node, subs, supers); return
+        
+    node.underscript = underscript 
+    node.overscript = overscript
+    setNodeBase(node, node.children[0])
+    
+    node.width = node.base.width
+    if overscript is not None: node.width = max(node.width, overscript.width)
+    if underscript is not None: node.width = max(node.width, underscript.width)    
+    stretch (node.base, toWidth = node.width)
+    stretch (overscript, toWidth = node.width)
+    stretch (underscript, toWidth = node.width)
+
+    gap = node.nominalLineGap()
+
+    if overscript is not None:
+        overscriptBaselineHeight = node.base.height + gap + overscript.depth
+        node.height =  overscriptBaselineHeight + overscript.height
+        node.ascender = node.height
+    else:    
+        node.height = node.base.height
+        node.ascender = node.base.ascender
+
+    if underscript is not None:
+        underscriptBaselineDepth = node.base.depth + gap + underscript.height
+        node.depth =  underscriptBaselineDepth + underscript.depth
+        node.descender = node.depth
+    else:    
+        node.depth = node.base.depth
+        node.descender = node.base.descender
+
+def stretch(node, toWidth=None, toHeight=None, toDepth=None, symmetric=False):
+    if node is None: return
+    if not node.core.stretchy: return
+    if node is not node.base:
+        if toWidth is not None:
+            toWidth -= node.width - node.base.width
+        stretch(node.base, toWidth, toHeight, toDepth, symmetric)
+        node.measureNode()
+    elif node.elementName == u"mo":
+        if node.fontSize == 0: return 
+
+        maxsizedefault = node.opdefaults.get(u"maxsize")
+        maxsizeattr = node.getProperty(u"maxsize", maxsizedefault)
+        if (maxsizeattr == u"infinity"): 
+            maxScale = None
+        else:
+            maxScale = node.parseSpaceOrPercent(maxsizeattr, node.fontSize, node.fontSize) / node.fontSize
+
+        minsizedefault = node.opdefaults.get(u"minsize")
+        minsizeattr = node.getProperty(u"minsize", minsizedefault)
+        minScale = node.parseSpaceOrPercent(minsizeattr, node.fontSize, node.fontSize) / node.fontSize        
+        if toWidth is None:    
+            stretchVertically(node, toHeight, toDepth, minScale, maxScale, symmetric) 
+        else:
+            stretchHorizontally(node, toWidth, minScale, maxScale) 
+        
+def stretchVertically(node, toHeight, toDepth, minScale, maxScale, symmetric):
+    if node.ascender + node.descender == 0: return
+    if node.scaling == u"horizontal": return
+    
+    if symmetric and node.symmetric:
+        toHeight = (toHeight + toDepth) / 2
+        toDepth = toHeight
+    scale = (toHeight + toDepth) / (node.ascender + node.descender) 
+        
+    if minScale: scale = max (scale, minScale)
+    if maxScale: scale = min (scale, maxScale)
+
+    node.fontSize *= scale
+    node.height *= scale
+    node.depth *= scale
+    node.ascender *= scale
+    node.descender *= scale
+    node.textShift *= scale
+
+    extraShift = ((toHeight - node.ascender) - 
+                  (toDepth - node.descender)) / 2
+    node.textShift += extraShift
+    node.height += extraShift
+    node.ascender += extraShift
+    node.depth -= extraShift
+    node.descender -= extraShift
+
+    if node.scaling == u"vertical":
+        node.textStretch /= scale
+    else:
+        node.width *= scale
+        node.leftBearing *= scale
+        node.rightBearing *= scale
+                            
+def stretchHorizontally(node, toWidth, minScale, maxScale):        
+    if node.width == 0: return
+    if node.scaling != u"horizontal": return
+
+    scale = toWidth / node.width 
+    scale = max (scale, minScale)
+    if maxScale: scale = min (scale, maxScale)
+
+    node.width *= scale
+    node.textStretch *= scale
+    node.leftBearing *= scale
+    node.rightBearing *= scale
+ 
+def setNodeBase(node, base):
+     node.base = base
+     node.core = base.core
+     node.alignToAxis = base.alignToAxis
+     node.stretchy = base.stretchy
+
+def wrapChildren(node, wrapperElement):
+    old_children = node.children
+    node.children = []
+    base = mathnode.MathNode (wrapperElement, {}, None, node.config, node)
+    base.children = old_children
+
+def createImplicitRow(node):
+    if len(node.children) != 1: 
+        wrapChildren(node, u"mrow")
+        node.children[0].makeContext();
+        node.children[0].measureNode();
+    setNodeBase(node, node.children[0])
+
+def getVerticalStretchExtent(descendants, rowAlignToAxis, axis):
+    ascender = 0; descender = 0 
+    for ch in descendants:
+        if ch.core.stretchy:
+            asc = ch.core.ascender;  desc = ch.core.descender # 'cos it will grow         
+        else:
+            asc = ch.ascender;  desc = ch.descender
+        if ch.alignToAxis and not rowAlignToAxis: 
+            asc += axis; desc -= axis
+        elif not ch.alignToAxis and rowAlignToAxis:
+            chaxis = ch.axis()
+            asc -= chaxis; desc += chaxis
+        ascender = max (asc, ascender);  descender = max (desc, descender)
+    return (ascender, descender)
+
+        
+def getRowVerticalExtent(descendants, rowAlignToAxis, axis):
+    height = 0; depth = 0; ascender = 0; descender = 0
+    for ch in descendants:
+        h = ch.height;  d = ch.depth;  asc = ch.ascender; desc = ch.descender
+        if ch.alignToAxis and not rowAlignToAxis: 
+            h += axis; asc += axis; d -= axis; desc -= axis
+        elif not ch.alignToAxis and rowAlignToAxis:
+            chaxis = ch.axis()
+            h -= chaxis; asc -= chaxis; d += chaxis; desc += chaxis
+        height = max (h, height);  depth = max (d, depth)
+        ascender = max (asc, ascender);  descender = max (desc, descender)
+    return (height, depth, ascender, descender)
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/nodelocator.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,34 @@
+"""Node locator for MathML parser."""
+import sys
+
+class NodeLocator:
+    """Node locator for MathML parser.
+    
+    Stores data from a SAX locator object; 
+    provides a method to format error messages from the parser."""
+    def __init__ (self, locator):
+        if locator:
+            self.line = locator.getLineNumber()
+            self.column = locator.getColumnNumber()
+            self.filename = locator.getSystemId()
+        else:
+            self.line = None
+            self.column = None
+            self.filename = None
+            
+    def message(self, msg, label = None): 
+        coordinate = ""
+        separator = ""
+        if self.filename is not None: 
+            coordinate += "file %s" % self.filename
+            separator = ", "
+        if self.line is not None: 
+            coordinate += separator + "line %d" % self.line
+            separator = ", "
+        if self.column is not None: 
+            coordinate += separator + "column %d" % self.column
+
+        if label:      sys.stderr.write("[%s] " % label)
+        if coordinate: sys.stderr.write(coordinate + ": ")
+        if msg:        sys.stderr.write(msg)
+        sys.stderr.write('\n')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/operators.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,408 @@
+"""MathML operator dictionary and related functions"""
+import sys
+
+operatorDictionary = {}
+
+def lookup(op, form = u"infix"):
+    """Find the entry for an operator in the dictionary"""
+    res = operatorDictionary.get(op+form)
+    if res is not None: return res 
+    
+    for f in [u"infix", u"postfix", u"prefix"]:
+        res = operatorDictionary.get(op+f)
+        if res is not None: return res 
+    
+    return operatorDictionary[u""+u"infix"]  # default entry
+
+    
+def createEntry( content, 
+                 form = u"infix", 
+                 fence = u"false", 
+                 separator = u"false",
+                 accent = u"false",
+                 largeop = u"false",
+                 lspace = u"thickmathspace", 
+                 rspace = u"thickmathspace",
+                 stretchy = u"false", 
+                 scaling = u"uniform", 
+                 minsize = u"1", 
+                 maxsize = u"infinity", 
+                 movablelimits = u"false",
+                 symmetric = u"true" ) :
+    if content+form in operatorDictionary.keys():
+        sys.stderr.write("WARNING: duplicate entry in operator dictionary, %s %s\n" %(form, str(content)))
+    operatorDictionary[content+form] = { u"form": form,
+                                         u"fence": fence,
+                                         u"separator": separator,
+                                         u"accent": accent,
+                                         u"largeop": largeop,
+                                         u"lspace": lspace, 
+                                         u"rspace": rspace,
+                                         u"stretchy": stretchy, 
+                                         u"scaling": scaling, 
+                                         u"minsize": minsize, 
+                                         u"maxsize": maxsize, 
+                                         u"movablelimits": movablelimits,
+                                         u"symmetric": symmetric } 
+                
+# Create default entry
+createEntry (content=u"")
+
+# Create real entries
+createEntry (content=u"(", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u")", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"[", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"]", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"{", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"}", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"\u201D", form=u"postfix", fence=u"true", lspace=u"0em", rspace=u"0em") # CloseCurlyDoubleQuote
+createEntry (content=u"\u2019", form=u"postfix", fence=u"true", lspace=u"0em", rspace=u"0em") # CloseCurlyQuote
+createEntry (content=u"\u2329", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # LeftAngleBracket
+createEntry (content=u"\u2308", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # LeftCeiling
+createEntry (content=u"\u301A", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # LeftDoubleBracket
+createEntry (content=u"\u230A", form=u"prefix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # LeftFloor
+createEntry (content=u"\u201C", form=u"prefix", fence=u"true", lspace=u"0em", rspace=u"0em") # OpenCurlyDoubleQuote
+createEntry (content=u"\u2018", form=u"prefix", fence=u"true", lspace=u"0em", rspace=u"0em") # OpenCurlyQuote
+createEntry (content=u"\u232A", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # RightAngleBracket
+createEntry (content=u"\u2309", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # RightCeiling
+createEntry (content=u"\u301B", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # RightDoubleBracket
+createEntry (content=u"\u230B", form=u"postfix", fence=u"true", stretchy=u"true", scaling="vertical", lspace=u"0em", rspace=u"0em") # RightFloor
+createEntry (content=u"\u2063", form=u"infix", separator=u"true", lspace=u"0em", rspace=u"0em") # InvisibleComma
+createEntry (content=u",", form=u"infix", separator=u"true", lspace=u"0em", rspace=u"verythickmathspace")
+createEntry (content=u"\u2500", form=u"infix", stretchy=u"true", scaling="horizontal", minsize=u"0", lspace=u"0em", rspace=u"0em") # HorizontalLine
+# Commented out: collides with '|'. See http://lists.w3.org/Archives/Public/www-math/2004Mar/0028.html
+# createEntry (content=u"|", form=u"infix", stretchy=u"true", scaling="vertical", minsize=u"0", lspace=u"0em", rspace=u"0em") # VerticalLine 
+createEntry (content=u";", form=u"infix", separator=u"true", lspace=u"0em", rspace=u"thickmathspace")
+createEntry (content=u";", form=u"postfix", separator=u"true", lspace=u"0em", rspace=u"0em")
+createEntry (content=u":=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"\u2254", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Assign
+createEntry (content=u"\u2235", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Because
+createEntry (content=u"\u2234", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Therefore
+createEntry (content=u"\u2758", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"thickmathspace", rspace=u"thickmathspace") # VerticalSeparator
+createEntry (content=u"//", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+# Commented out: collides with Proportional
+# createEntry (content=u"\u2237", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Colon
+createEntry (content=u"&", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace")
+createEntry (content=u"&", form=u"postfix", lspace=u"thickmathspace", rspace=u"0em")
+createEntry (content=u"*=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"-=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"+=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"/=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"->", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u":", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"..", form=u"postfix", lspace=u"mediummathspace", rspace=u"0em")
+createEntry (content=u"...", form=u"postfix", lspace=u"mediummathspace", rspace=u"0em")
+# Commented out: collides with ReverseElement
+# createEntry (content=u"\u220B", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SuchThat
+createEntry (content=u"\u2AE4", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleLeftTee
+createEntry (content=u"\u22A8", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleRightTee
+createEntry (content=u"\u22A4", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownTee
+createEntry (content=u"\u22A3", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTee
+createEntry (content=u"\u22A2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTee
+# Commented out: collides with DoubleRightArrow
+# createEntry (content=u"\u21D2", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # Implies
+createEntry (content=u"\u2970", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # RoundImplies
+createEntry (content=u"|", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"||", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace")
+createEntry (content=u"\u2A54", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # Or
+createEntry (content=u"&&", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"\u2A53", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # And
+createEntry (content=u"&", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"!", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace")
+createEntry (content=u"\u2AEC", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace") # Not
+createEntry (content=u"\u2203", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace") # Exists
+createEntry (content=u"\u2200", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace") # ForAll
+createEntry (content=u"\u2204", form=u"prefix", lspace=u"0em", rspace=u"thickmathspace") # NotExists
+createEntry (content=u"\u2208", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Element
+createEntry (content=u"\u2209", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotElement
+createEntry (content=u"\u220C", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotReverseElement
+createEntry (content=u"\u228F\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSquareSubset
+createEntry (content=u"\u22E2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSquareSubsetEqual
+createEntry (content=u"\u2290\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSquareSuperset
+createEntry (content=u"\u22E3", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSquareSupersetEqual
+createEntry (content=u"\u2282\u20D2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSubset
+createEntry (content=u"\u2288", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSubsetEqual
+createEntry (content=u"\u2283\u20D2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSuperset
+createEntry (content=u"\u2289", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSupersetEqual
+createEntry (content=u"\u220B", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # ReverseElement
+createEntry (content=u"\u228F", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SquareSubset
+createEntry (content=u"\u2291", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SquareSubsetEqual
+createEntry (content=u"\u2290", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SquareSuperset
+createEntry (content=u"\u2292", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SquareSupersetEqual
+createEntry (content=u"\u22D0", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Subset
+createEntry (content=u"\u2286", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SubsetEqual
+createEntry (content=u"\u2283", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Superset
+createEntry (content=u"\u2287", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SupersetEqual
+createEntry (content=u"\u21D0", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleLeftArrow
+createEntry (content=u"\u21D4", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleLeftRightArrow
+createEntry (content=u"\u21D2", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleRightArrow
+createEntry (content=u"\u2950", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownLeftRightVector
+createEntry (content=u"\u295E", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownLeftTeeVector
+createEntry (content=u"\u21BD", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownLeftVector
+createEntry (content=u"\u2956", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownLeftVectorBar
+createEntry (content=u"\u295F", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownRightTeeVector
+createEntry (content=u"\u21C1", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownRightVector
+createEntry (content=u"\u2957", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # DownRightVectorBar
+createEntry (content=u"\u2190", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftArrow
+createEntry (content=u"\u21E4", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftArrowBar
+createEntry (content=u"\u21C6", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftArrowRightArrow
+createEntry (content=u"\u2194", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftRightArrow
+createEntry (content=u"\u294E", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftRightVector
+createEntry (content=u"\u21A4", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTeeArrow
+createEntry (content=u"\u295A", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTeeVector
+createEntry (content=u"\u21BC", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftVector
+createEntry (content=u"\u2952", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftVectorBar
+createEntry (content=u"\u2199", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LowerLeftArrow
+createEntry (content=u"\u2198", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # LowerRightArrow
+createEntry (content=u"\u2192", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightArrow
+createEntry (content=u"\u21E5", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightArrowBar
+createEntry (content=u"\u21C4", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightArrowLeftArrow
+createEntry (content=u"\u21A6", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTeeArrow
+createEntry (content=u"\u295B", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTeeVector
+createEntry (content=u"\u21C0", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightVector
+createEntry (content=u"\u2953", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightVectorBar
+# Commented out: collides with LeftArrow
+# createEntry (content=u"\u2190", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # ShortLeftArrow
+# Commented out: collides with RightArrow
+# createEntry (content=u"\u2192", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # ShortRightArrow
+createEntry (content=u"\u2196", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"thickmathspace", rspace=u"thickmathspace") # UpperLeftArrow
+createEntry (content=u"\u2197", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"thickmathspace", rspace=u"thickmathspace") # UpperRightArrow
+createEntry (content=u"=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"<", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u">", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"!=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"==", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"<=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u">=", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace")
+createEntry (content=u"\u2261", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Congruent
+createEntry (content=u"\u224D", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # CupCap
+createEntry (content=u"\u2250", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # DotEqual
+createEntry (content=u"\u2225", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # DoubleVerticalBar
+createEntry (content=u"\u2A75", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Equal
+createEntry (content=u"\u2242", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # EqualTilde
+createEntry (content=u"\u21CC", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # Equilibrium
+createEntry (content=u"\u2265", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterEqual
+createEntry (content=u"\u22DB", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterEqualLess
+createEntry (content=u"\u2267", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterFullEqual
+createEntry (content=u"\u2AA2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterGreater
+createEntry (content=u"\u2277", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterLess
+createEntry (content=u"\u2A7E", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterSlantEqual
+createEntry (content=u"\u2273", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # GreaterTilde
+createEntry (content=u"\u224E", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # HumpDownHump
+createEntry (content=u"\u224F", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # HumpEqual
+createEntry (content=u"\u22B2", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTriangle
+createEntry (content=u"\u29CF", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTriangleBar
+createEntry (content=u"\u22B4", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LeftTriangleEqual
+createEntry (content=u"\u2264", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # le
+createEntry (content=u"\u22DA", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessEqualGreater
+createEntry (content=u"\u2266", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessFullEqual
+createEntry (content=u"\u2276", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessGreater
+createEntry (content=u"\u2AA1", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessLess
+createEntry (content=u"\u2A7D", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessSlantEqual
+createEntry (content=u"\u2272", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # LessTilde
+createEntry (content=u"\u226B", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NestedGreaterGreater
+createEntry (content=u"\u226A", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NestedLessLess
+createEntry (content=u"\u2262", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotCongruent
+createEntry (content=u"\u226D", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotCupCap
+createEntry (content=u"\u2226", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotDoubleVerticalBar
+createEntry (content=u"\u2260", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotEqual
+createEntry (content=u"\u2242\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotEqualTilde
+createEntry (content=u"\u226F", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreater
+createEntry (content=u"\u2271", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterEqual
+createEntry (content=u"\u2266\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterFullEqual
+createEntry (content=u"\u226B\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterGreater
+createEntry (content=u"\u2279", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterLess
+createEntry (content=u"\u2A7E\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterSlantEqual
+createEntry (content=u"\u2275", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotGreaterTilde
+createEntry (content=u"\u224E\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotHumpDownHump
+createEntry (content=u"\u224F\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotHumpEqual
+createEntry (content=u"\u22EA", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLeftTriangle
+createEntry (content=u"\u29CF\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLeftTriangleBar
+createEntry (content=u"\u22EC", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLeftTriangleEqual
+createEntry (content=u"\u226E", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLess
+createEntry (content=u"\u2270", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLessEqual
+createEntry (content=u"\u2278", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLessGreater
+createEntry (content=u"\u226A\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLessLess
+createEntry (content=u"\u2A7D\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLessSlantEqual
+createEntry (content=u"\u2274", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotLessTilde
+createEntry (content=u"\u2AA2\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotNestedGreaterGreater
+createEntry (content=u"\u2AA1\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotNestedLessLess
+createEntry (content=u"\u2280", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotPrecedes
+createEntry (content=u"\u2AAF\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotPrecedesEqual
+createEntry (content=u"\u22E0", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotPrecedesSlantEqual
+createEntry (content=u"\u22EB", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotRightTriangle
+createEntry (content=u"\u29D0\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotRightTriangleBar
+createEntry (content=u"\u22ED", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotRightTriangleEqual
+createEntry (content=u"\u2281", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSucceeds
+createEntry (content=u"\u2AB0\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSucceedsEqual
+createEntry (content=u"\u22E1", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSucceedsSlantEqual
+createEntry (content=u"\u227F\u0338", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotSucceedsTilde
+createEntry (content=u"\u2241", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotTilde
+createEntry (content=u"\u2244", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotTildeEqual
+createEntry (content=u"\u2247", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotTildeFullEqual
+createEntry (content=u"\u2249", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotTildeTilde
+createEntry (content=u"\u2224", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # NotVerticalBar
+createEntry (content=u"\u227A", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Precedes
+createEntry (content=u"\u2AAF", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # PrecedesEqual
+createEntry (content=u"\u227C", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # PrecedesSlantEqual
+createEntry (content=u"\u227E", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # PrecedesTilde
+createEntry (content=u"\u2237", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Proportion
+createEntry (content=u"\u221D", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Proportional
+createEntry (content=u"\u21CB", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"thickmathspace", rspace=u"thickmathspace") # ReverseEquilibrium
+createEntry (content=u"\u22B3", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTriangle
+createEntry (content=u"\u29D0", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTriangleBar
+createEntry (content=u"\u22B5", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # RightTriangleEqual
+createEntry (content=u"\u227B", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Succeeds
+createEntry (content=u"\u2AB0", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SucceedsEqual
+createEntry (content=u"\u227D", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SucceedsSlantEqual
+createEntry (content=u"\u227F", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # SucceedsTilde
+createEntry (content=u"\u223C", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # Tilde
+createEntry (content=u"\u2243", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # TildeEqual
+createEntry (content=u"\u2245", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # TildeFullEqual
+createEntry (content=u"\u2248", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # TildeTilde
+createEntry (content=u"\u22A5", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # UpTee
+createEntry (content=u"\u2223", form=u"infix", lspace=u"thickmathspace", rspace=u"thickmathspace") # VerticalBar
+createEntry (content=u"\u2294", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # SquareUnion
+createEntry (content=u"\u22C3", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # Union
+createEntry (content=u"\u228E", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # UnionPlus
+createEntry (content=u"-", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace")
+# Added an entry for minus sign, separate from hyphen
+createEntry (content=u"\u2212", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace")
+createEntry (content=u"+", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace")
+createEntry (content=u"\u22C2", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # Intersection
+createEntry (content=u"\u2213", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace") # MinusPlus
+createEntry (content=u"\u00B1", form=u"infix", lspace=u"mediummathspace", rspace=u"mediummathspace") # PlusMinus
+createEntry (content=u"\u2293", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"mediummathspace", rspace=u"mediummathspace") # SquareIntersection
+createEntry (content=u"\u22C1", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Vee
+createEntry (content=u"\u2296", form=u"prefix", largeop=u"true", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace") # CircleMinus
+createEntry (content=u"\u2295", form=u"prefix", largeop=u"true", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace") # CirclePlus
+createEntry (content=u"\u2211", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Sum
+createEntry (content=u"\u22C3", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Union
+createEntry (content=u"\u228E", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # UnionPlus
+createEntry (content=u"lim", form=u"prefix", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace")
+createEntry (content=u"max", form=u"prefix", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace")
+createEntry (content=u"min", form=u"prefix", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace")
+createEntry (content=u"\u2296", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # CircleMinus
+createEntry (content=u"\u2295", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # CirclePlus
+createEntry (content=u"\u2232", form=u"prefix", largeop=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"0em") # ClockwiseContourIntegral
+createEntry (content=u"\u222E", form=u"prefix", largeop=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"0em") # ContourIntegral
+createEntry (content=u"\u2233", form=u"prefix", largeop=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"0em") # CounterClockwiseContourIntegral
+createEntry (content=u"\u222F", form=u"prefix", largeop=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"0em") # DoubleContourIntegral
+createEntry (content=u"\u222B", form=u"prefix", largeop=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"0em") # Integral
+createEntry (content=u"\u22D3", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Cup
+createEntry (content=u"\u22D2", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Cap
+createEntry (content=u"\u2240", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # VerticalTilde
+createEntry (content=u"\u22C0", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Wedge
+createEntry (content=u"\u2297", form=u"prefix", largeop=u"true", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace") # CircleTimes
+createEntry (content=u"\u2210", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Coproduct
+createEntry (content=u"\u220F", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Product
+createEntry (content=u"\u22C2", form=u"prefix", largeop=u"true", movablelimits=u"true", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"thinmathspace") # Intersection
+createEntry (content=u"\u2210", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Coproduct
+createEntry (content=u"\u22C6", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Star
+createEntry (content=u"\u2299", form=u"prefix", largeop=u"true", movablelimits=u"true", lspace=u"0em", rspace=u"thinmathspace") # CircleDot
+createEntry (content=u"*", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace")
+createEntry (content=u"\u2062", form=u"infix", lspace=u"0em", rspace=u"0em") # InvisibleTimes
+createEntry (content=u"\u00B7", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # CenterDot
+createEntry (content=u"\u2297", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # CircleTimes
+createEntry (content=u"\u22C1", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Vee
+createEntry (content=u"\u22C0", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Wedge
+createEntry (content=u"\u22C4", form=u"infix", lspace=u"thinmathspace", rspace=u"thinmathspace") # Diamond
+createEntry (content=u"\u2216", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"thinmathspace", rspace=u"thinmathspace") # Backslash
+createEntry (content=u"/", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"thinmathspace", rspace=u"thinmathspace")
+createEntry (content=u"-", form=u"prefix", lspace=u"0em", rspace=u"veryverythinmathspace")
+# Added an entry for minus sign, separate from hyphen
+createEntry (content=u"\u2212", form=u"prefix", lspace=u"0em", rspace=u"veryverythinmathspace")
+createEntry (content=u"+", form=u"prefix", lspace=u"0em", rspace=u"veryverythinmathspace")
+createEntry (content=u"\u2213", form=u"prefix", lspace=u"0em", rspace=u"veryverythinmathspace") # MinusPlus
+createEntry (content=u"\u00B1", form=u"prefix", lspace=u"0em", rspace=u"veryverythinmathspace") # PlusMinus
+createEntry (content=u".", form=u"infix", lspace=u"0em", rspace=u"0em")
+createEntry (content=u"\u2A2F", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # Cross
+createEntry (content=u"**", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"\u2299", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # CircleDot
+createEntry (content=u"\u2218", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # SmallCircle
+createEntry (content=u"\u25A1", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace") # Square
+createEntry (content=u"\u2207", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace") # Del
+createEntry (content=u"\u2202", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace") # PartialD
+createEntry (content=u"\u2145", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace") # CapitalDifferentialD
+createEntry (content=u"\u2146", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace") # DifferentialD
+createEntry (content=u"\u221A", form=u"prefix", stretchy=u"true", scaling="uniform", lspace=u"0em", rspace=u"verythinmathspace") # Sqrt
+createEntry (content=u"\u21D3", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleDownArrow
+createEntry (content=u"\u27F8", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleLongLeftArrow
+createEntry (content=u"\u27FA", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleLongLeftRightArrow
+createEntry (content=u"\u27F9", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleLongRightArrow
+createEntry (content=u"\u21D1", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleUpArrow
+createEntry (content=u"\u21D5", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DoubleUpDownArrow
+createEntry (content=u"\u2193", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DownArrow
+createEntry (content=u"\u2913", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DownArrowBar
+createEntry (content=u"\u21F5", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DownArrowUpArrow
+createEntry (content=u"\u21A7", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # DownTeeArrow
+createEntry (content=u"\u2961", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftDownTeeVector
+createEntry (content=u"\u21C3", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftDownVector
+createEntry (content=u"\u2959", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftDownVectorBar
+createEntry (content=u"\u2951", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftUpDownVector
+createEntry (content=u"\u2960", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftUpTeeVector
+createEntry (content=u"\u21BF", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftUpVector
+createEntry (content=u"\u2958", form=u"infix", stretchy=u"true", scaling="uniform", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LeftUpVectorBar
+createEntry (content=u"\u27F5", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LongLeftArrow
+createEntry (content=u"\u27F7", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LongLeftRightArrow
+createEntry (content=u"\u27F6", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # LongRightArrow
+createEntry (content=u"\u296F", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # ReverseUpEquilibrium
+createEntry (content=u"\u295D", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightDownTeeVector
+createEntry (content=u"\u21C2", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightDownVector
+createEntry (content=u"\u2955", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightDownVectorBar
+createEntry (content=u"\u294F", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightUpDownVector
+createEntry (content=u"\u295C", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightUpTeeVector
+createEntry (content=u"\u21BE", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightUpVector
+createEntry (content=u"\u2954", form=u"infix", stretchy=u"true", scaling="horizontal", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # RightUpVectorBar
+# Commented out: collides with DownArrow
+# createEntry (content=u"\u2193", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # ShortDownArrow
+# Commented out: collides with UpArrow
+# createEntry (content=u"\u2191", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # ShortUpArrow
+createEntry (content=u"\u2191", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpArrow
+createEntry (content=u"\u2912", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpArrowBar
+createEntry (content=u"\u21C5", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpArrowDownArrow
+createEntry (content=u"\u2195", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpDownArrow
+createEntry (content=u"\u296E", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpEquilibrium
+createEntry (content=u"\u21A5", form=u"infix", stretchy=u"true", scaling="vertical", lspace=u"verythinmathspace", rspace=u"verythinmathspace") # UpTeeArrow
+createEntry (content=u"^", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"<>", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"'", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+# Added an entry for prime, separate from apostrophe
+createEntry (content=u"\u2032", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+createEntry (content=u"!", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+createEntry (content=u"!!", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+createEntry (content=u"~", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"@", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"--", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+createEntry (content=u"--", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace")
+createEntry (content=u"++", form=u"postfix", lspace=u"verythinmathspace", rspace=u"0em")
+createEntry (content=u"++", form=u"prefix", lspace=u"0em", rspace=u"verythinmathspace")
+createEntry (content=u"\u2061", form=u"infix", lspace=u"0em", rspace=u"0em") # ApplyFunction
+createEntry (content=u"?", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"_", form=u"infix", lspace=u"verythinmathspace", rspace=u"verythinmathspace")
+createEntry (content=u"\u02D8", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # Breve
+createEntry (content=u"\u00B8", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # Cedilla
+createEntry (content=u"`", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DiacriticalGrave
+createEntry (content=u"\u02D9", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DiacriticalDot
+createEntry (content=u"\u02DD", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DiacriticalDoubleAcute
+createEntry (content=u"\u2190", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # LeftArrow
+createEntry (content=u"\u2194", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # LeftRightArrow
+createEntry (content=u"\u294E", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # LeftRightVector
+createEntry (content=u"\u21BC", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # LeftVector
+createEntry (content=u"\u00B4", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DiacriticalAcute
+createEntry (content=u"\u2192", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # RightArrow
+createEntry (content=u"\u21C0", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # RightVector
+createEntry (content=u"\u02DC", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # DiacriticalTilde
+createEntry (content=u"\u00A8", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DoubleDot
+createEntry (content=u"\u0311", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # DownBreve
+createEntry (content=u"\u02C7", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # Hacek
+createEntry (content=u"^", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # Hat
+createEntry (content=u"\u00AF", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # OverBar
+createEntry (content=u"\uFE37", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # OverBrace
+createEntry (content=u"\u23B4", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # OverBracket
+createEntry (content=u"\uFE35", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # OverParenthesis
+createEntry (content=u"\u20DB", form=u"postfix", accent=u"true", lspace=u"0em", rspace=u"0em") # TripleDot
+createEntry (content=u"\u0332", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # UnderBar
+createEntry (content=u"\uFE38", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # UnderBrace
+createEntry (content=u"\u23B5", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # UnderBracket
+createEntry (content=u"\uFE36", form=u"postfix", accent=u"true", stretchy=u"true", scaling="horizontal", lspace=u"0em", rspace=u"0em") # UnderParenthesis
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/tables.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,319 @@
+"""Table-related formatting functions.
+
+This module contains functions called from measurers.py to format tables."""
+import sys, mathnode
+
+def getByIndexOrLast(lst, idx):
+    if idx < len(lst): return lst[idx]
+    else: return lst[-1]
+
+class CellDescriptor:
+    """Descriptor of a single cell in a table"""
+    def __init__(self, content, halign, valign, colspan, rowspan):
+        self.content = content
+        self.halign = halign
+        self.valign = valign
+        self.colspan = colspan
+        self.rowspan = rowspan
+
+class ColumnDescriptor:
+    """Descriptor of a single column in a table"""
+    def __init__(self):
+        self.auto = True
+        self.fit = False
+        self.width = 0
+        self.spaceAfter = 0
+        self.lineAfter = None
+
+class RowDescriptor:
+    """Descriptor of a single row in a table; contains cells"""
+    def __init__(self, node, cells, rowalign, columnaligns, busycells):
+        self.alignToAxis = (rowalign == u"axis")
+        self.height = 0
+        self.depth  = 0
+        self.spaceAfter = 0
+        self.lineAfter = None
+        self.cells = []
+        for c in cells:
+            # Find the first free cell
+            while len(busycells) > len(self.cells) and busycells[len(self.cells)] > 0:
+                self.cells.append(None)
+
+            halign = getByIndexOrLast(columnaligns, len(self.cells))
+            valign = rowalign
+            colspan = 1
+            rowspan = 1
+
+            if c.elementName == u"mtd":
+                halign = c.attributes.get(u"columnalign", halign)
+                valign = c.attributes.get(u"rowalign", valign)
+                colspan = node.parseInt(c.attributes.get(u"colspan", u"1"))
+                rowspan = node.parseInt(c.attributes.get(u"rowspan", u"1"))
+
+            while len(self.cells) >= len(node.columns):
+                node.columns.append(ColumnDescriptor())
+            self.cells.append(CellDescriptor(c, halign, valign, colspan, rowspan))
+
+            for i in range (1, colspan): self.cells.append(None)
+            while len(self.cells) > len(node.columns):
+                node.columns.append(ColumnDescriptor())
+
+def arrangeCells(node):
+    node.rows = []
+    node.columns = []    
+    busycells = []
+
+    # Read table-level alignment properties      
+    table_rowaligns = node.getListProperty(u"rowalign")
+    table_columnaligns = node.getListProperty(u"columnalign")
+
+    for ch in node.children:
+        rowalign = getByIndexOrLast(table_rowaligns, len(node.rows))
+        row_columnaligns = table_columnaligns
+        if ch.elementName == u"mtr" or ch.elementName == "mlabeledtr":
+            cells = ch.children
+            rowalign = ch.attributes.get(u"rowalign", rowalign)
+            if u"columnalign" in ch.attributes.keys():
+                columnaligns = node.getListProperty(u"columnalign", ch.attributes.get(u"columnalign"))
+        else:
+            cells = [ch]
+
+        row = RowDescriptor(node, cells, rowalign, row_columnaligns, busycells)
+        node.rows.append(row)
+        # busycells passes information about cells spanning multiple rows 
+        busycells = [max (0, n - 1) for n in busycells]
+        while len(busycells) < len(row.cells): busycells.append(0)
+        for i in range (len(row.cells)):
+            cell = row.cells[i] 
+            if cell is None: continue
+            if cell.rowspan > 1: 
+                for j in range(i, i + cell.colspan): 
+                    busycells[j] = cell.rowspan - 1
+
+    # Pad the table with empty rows until no spanning cell protrudes
+    while max(busycells) > 0:
+        rowalign = getByIndexOrLast(table_rowaligns, len(node.rows))
+        node.rows.append(RowDescriptor(node, [], rowalign, table_columnaligns, busycells))
+        busycells = [max (0, n - 1) for n in busycells]
+
+def arrangeLines(node):
+    # Get spacings and line styles; expand to cover the table fully        
+    spacings = map(node.parseLength, node.getListProperty(u"rowspacing"))
+    lines = node.getListProperty(u"rowlines")
+    
+    for i in range(len(node.rows) - 1):
+        node.rows[i].spaceAfter = getByIndexOrLast(spacings, i)
+        line = getByIndexOrLast(lines, i) 
+        if line != u"none": 
+           node.rows[i].lineAfter = line
+           node.rows[i].spaceAfter += node.lineWidth
+
+    spacings = map(node.parseSpace, node.getListProperty(u"columnspacing"))
+    lines = node.getListProperty(u"columnlines")
+    
+    for i in range(len(node.columns) - 1):
+        node.columns[i].spaceAfter = getByIndexOrLast(spacings, i)        
+        line = getByIndexOrLast(lines, i)
+        if line != u"none": 
+           node.columns[i].lineAfter = line
+           node.columns[i].spaceAfter += node.lineWidth
+    
+    node.framespacings = [0, 0]
+    node.framelines = [None, None]
+    spacings = map(node.parseSpace, node.getListProperty(u"framespacing"))
+    lines = node.getListProperty(u"frame")
+    for i in range(2): 
+        line = getByIndexOrLast(lines, i)
+        if line != u"none": 
+            node.framespacings[i] = getByIndexOrLast(spacings, i)
+            node.framelines[i] = line
+
+def calculateColumnWidths(node):
+    # Get total width
+    fullwidthattr = node.attributes.get(u"width", u"auto")
+    if fullwidthattr == u"auto": 
+        fullwidth = None
+    else:
+        fullwidth = node.parseLength(fullwidthattr)
+        if fullwidth <= 0: fullwidth = None
+
+    # Fill fixed column widths
+    columnwidths = node.getListProperty(u"columnwidth")
+    for i in range(len(node.columns)):
+        column = node.columns[i]
+        attr = getByIndexOrLast(columnwidths, i)
+        if attr in [u"auto", u"fit"]: 
+            column.fit = (attr == u"fit")
+        elif attr.endswith(u'%'):
+            if fullwidth is None: 
+                node.error("Percents in column widths supported only in tables with explicit width; width of column %d treated as 'auto'" % (i+1))
+            else:
+                value = node.parseFloat(attr[:-1])
+                if value and value > 0: 
+                    column.width = fullwidth * value / 100 
+                    column.auto = False
+        else:
+            column.width = node.parseSpace(attr)
+            column.auto = False
+    
+    # Set  initial auto widths for cells with colspan == 1
+    for r in node.rows:
+        for i in range(len(r.cells)):
+            c = r.cells[i]
+            if c is None or c.content is None or c.colspan > 1: continue
+            column = node.columns[i]
+            if column.auto: column.width = max(column.width, c.content.width)
+    
+    # Calculate auto widths for cells with colspan > 1
+    while True:
+        adjustedColumns = []
+        adjustedWidth = 0
+        
+        for r in node.rows:
+            for i in range(len(r.cells)):
+                c = r.cells[i]
+                if c is None or c.content is None or c.colspan == 1: continue
+                
+                columns = node.columns[i : i + c.colspan]
+                autoColumns = [x for x in columns if x.auto]
+                if len(autoColumns) == 0: continue   # nothing to adjust                
+                fixedColumns = [x for x in columns if not x.auto]
+                
+                fixedWidth = sum([x.spaceAfter for x in columns[:-1]])
+                if len(fixedColumns) > 0: 
+                    fixedWidth += sum ([x.width for x in fixedColumns])
+                autoWidth = sum ([x.width for x in autoColumns])
+                if c.content.width <= fixedWidth + autoWidth: continue # already fits
+                
+                requiredWidth = c.content.width - fixedWidth
+                unitWidth = requiredWidth / len(autoColumns)
+                
+                while True:
+                    oversizedColumns = [x for x in autoColumns if x.width >= unitWidth]
+                    if len(oversizedColumns) == 0: break
+                    
+                    autoColumns = [x for x in autoColumns if x.width < unitWidth]
+                    if len(autoColumns) == 0: break  # weird rounding effects
+                    requiredWidth -=  sum ([x.width for x in oversizedColumns])
+                    unitWidth = requiredWidth / len(autoColumns)
+                if len(autoColumns) == 0: continue; # protection against arithmetic overflow
+                
+                # Store the maximum unit width
+                if unitWidth > adjustedWidth:
+                    adjustedWidth = unitWidth
+                    adjustedColumns = autoColumns
+                
+        if len(adjustedColumns) == 0: break;
+        for col in adjustedColumns: col.width = adjustedWidth
+    
+    if node.getProperty(u"equalcolumns") == u"true":
+        globalWidth = max([col.width for col in node.columns if col.auto])
+        for col in node.columns: 
+            if col.auto: col.width = globalWidth
+            
+    if fullwidth is not None:
+        delta = fullwidth 
+        delta -= sum ([x.width for x in node.columns])
+        delta -= sum ([x.spaceAfter for x in node.columns[:-1]]) 
+        delta -= 2 * node.framespacings[0]
+        if delta != 0:        
+            sizableColumns = [x for x in node.columns if x.fit]
+            if len(sizableColumns) == 0: 
+                sizableColumns = [x for x in node.columns if x.auto]
+            if len(sizableColumns) == 0: 
+                node.error("Overconstrained table layout: explicit table width specified, but no column has automatic width; table width attribute ignored")
+            else:
+                delta /= len(sizableColumns)
+                for col in sizableColumns: col.width += delta         
+    
+def calculateRowHeights(node):
+    # Set  initial row heights for cells with rowspan == 1
+    commonAxis = node.axis()
+    for r in node.rows:
+        r.height = 0
+        r.depth  = 0
+        for c in r.cells:
+            if c is None or c.content is None or c.rowspan != 1: continue
+            cellAxis = c.content.axis()            
+            c.vshift = 0
+            
+            if c.valign == u"baseline":
+                if r.alignToAxis: cell.vshift -= commonAxis           
+                if c.content.alignToAxis: c.vshift += cellAxis
+            
+            elif c.valign == u"axis":
+                if not r.alignToAxis: c.vshift += commonAxis           
+                if not c.content.alignToAxis: c.vshift -= cellAxis
+            
+            else:
+               c.vshift = (r.height - r.depth - c.content.height + c.content.depth) / 2
+
+            r.height = max(r.height, c.content.height + c.vshift) 
+            r.depth = max(r.depth, c.content.depth - c.vshift)
+
+    # Calculate heights for cells with rowspan > 1
+    while True:
+        adjustedRows = []
+        adjustedSize = 0
+        for i in range(len(node.rows)):
+            r = node.rows[i]
+            for c in r.cells:
+                if c is None or c.content is None or c.rowspan == 1: continue
+                rows = node.rows[i : i + c.rowspan]
+                
+                requiredSize = c.content.height + c.content.depth
+                requiredSize -= sum([x.spaceAfter for x in rows[:-1]])
+                fullSize = sum ([x.height + x.depth for x in rows])
+                if fullSize >= requiredSize: continue   
+                
+                unitSize = requiredSize / len(rows)
+                while True:
+                    oversizedRows = [x for x in rows if x.height + x.depth >= unitSize]
+                    if len(oversizedRows) == 0: break
+
+                    rows = [x for x in rows if x.height + x.depth < unitSize]
+                    if len(rows) == 0: break  # weird rounding effects
+                    requiredSize -= sum ([x.height + x.depth for x in oversizedRows])
+                    unitSize = requiredSize / len(rows)  
+                if len(rows) == 0: continue; # protection against arithmetic overflow
+                    
+                if unitSize > adjustedSize:
+                    adjustedSize = unitSize
+                    adjustedRows = rows
+                
+        if len(adjustedRows) == 0: break;
+        for r in adjustedRows: 
+            delta = (adjustedSize - r.height - r.depth) / 2
+            r.height += delta; r.depth += delta
+
+    if node.getProperty(u"equalrows") == u"true":
+        maxvsize = max([r.height + r.depth for r in node.rows])
+        for r in node.rows:
+            delta = (maxvsize - r.height - r.depth) / 2
+            r.height += delta; r.depth += delta
+    
+    
+def getAlign(node):
+    alignattr = node.getProperty(u"align").strip()
+    if len(alignattr) == 0: alignattr = mathnode.globalDefaults[u"align"]
+    
+    splitalign = alignattr.split() 
+    alignType = splitalign[0]
+
+    if len(splitalign) == 1:
+        alignRow = None
+    else:
+        alignRow = node.parseInt(splitalign[1])
+        if alignrownumber == 0:
+            node.error("Alignment row number cannot be zero")
+            alignrownumber = None
+        elif alignrownumber > len(node.rows):
+            node.error("Alignment row number cannot exceed row count")
+            alignrownumber = len(node.rows)
+        elif alignrownumber < - len(node.rows):
+            node.error("Negative alignment row number cannot exceed row count")
+            alignrownumber = 1
+        elif alignrownumber < 0:
+            alignrownumber = len(node.rows) - alignrownumber + 1 
+
+    return (alignType, alignRow)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/tools/__init__.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,1 @@
+__all__ = ["saxtools"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/math/svgmath/tools/saxtools.py	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,173 @@
+"""Miscellaneous SAX-related utilities used in SVGMath"""
+
+from xml.sax import handler
+from codecs import getwriter
+    
+def escape(data):
+    """Escape &, <, and > in a string of data.
+    
+    Unicode version of the same-named function in xml.sax.saxutils,
+    with entity replacement stripped off (not needed for generation)."""
+
+    # must do ampersand first
+    data = unicode(data)
+    data = data.replace(u"&", u"&")
+    data = data.replace(u">", u">")
+    data = data.replace(u"<", u"<")
+    return data
+
+def quoteattr(data):
+    """Escape and quote an attribute value.
+
+    Unicode version of the same-named function in xml.sax.saxutils,
+    with entity replacement stripped off (not needed for generation).
+    Escape &, <, and > in a string of data, then quote it for use as
+    an attribute value.  The '"' character will be escaped as well, if
+    necessary.
+    """
+    data = escape(data)
+    if u'"' in data:
+        if u"'" in data:
+            data = u'"%s"' % data.replace(u'"', u""")
+        else:
+            data = u"'%s'" % data
+    else:
+        data = u'"%s"' % data
+    return data
+   
+   
+class XMLGenerator(handler.ContentHandler):
+    """Clone of xml.sax.saxutils.XMLGenerator, with bugs fixed.
+       
+    This is an exact copy of the XMLGenerator class. Unfortunately,
+    the original class has critical bugs in namespace processing
+    and output encoding support (as of 2.4.3). This serializer fixes 
+    them, and additionally provides contraction of empty elements 
+    (<a/> instead of <a></a>)
+    """
+
+    def __init__(self, out, encoding="iso-8859-1"):
+        handler.ContentHandler.__init__(self)
+        self._encoding = encoding
+        self._out = getwriter(encoding)(out, "xmlcharrefreplace")
+        self._ns_contexts = [{}]
+        self._current_context = self._ns_contexts[-1]
+        self._undeclared_ns_maps = []
+        self._starttag_pending = False
+
+    def _write(self, text):
+        self._out.write(unicode(text))
+
+    def _qname(self, name):
+        if name[0]:
+            prefix = self._current_context[name[0]]
+            if prefix: 
+                return unicode(prefix) + u":" + unicode(name[1])
+        return unicode(name[1])
+        
+    def _flush_starttag(self):
+        if self._starttag_pending:
+            self._write(u">")
+            self._starttag_pending = False
+
+    # ContentHandler methods
+    def startDocument(self):
+        self._out.reset()
+        self._write(u'<?xml version="1.0" encoding="%s"?>\n' % unicode(self._encoding))
+
+    def endDocument(self):
+        self._out.reset()
+
+    def startPrefixMapping(self, prefix, uri):
+        self._ns_contexts.append(self._current_context.copy())
+        self._current_context[uri] = prefix
+        self._undeclared_ns_maps.append((prefix, uri))
+
+    def endPrefixMapping(self, prefix):
+        self._current_context = self._ns_contexts[-1]
+        del self._ns_contexts[-1]
+
+    def startElement(self, name, attrs):
+        self._flush_starttag()
+        self._write(u"<%s" % unicode(name))
+        for (name, value) in attrs.items():
+            self._write(u" %s=%s" % (unicode(name), quoteattr(value)))
+        self._starttag_pending = True
+
+    def endElement(self, name):
+        if self._starttag_pending:
+            self._write(u"/>")
+            self._starttag_pending = False
+        else:
+            self._write(u"</%s>" % unicode(name))
+
+    def startElementNS(self, name, qname, attrs):
+        qattrs = {}
+        for attname, attvalue in attrs.items(): 
+            qattrs[self._qname(attname)] = attvalue
+        for prefix, uri in self._undeclared_ns_maps:
+            if prefix:
+                qattrs[u"xmlns:%s" % unicode(prefix)] = uri
+            else:
+                qattrs[u"xmlns"] = uri        
+        self._undeclared_ns_maps = []    
+        self.startElement(self._qname(name), qattrs)
+
+    def endElementNS(self, name, qname):
+        self.endElement(self._qname(name))
+
+    def characters(self, content):
+        self._flush_starttag()
+        self._write(escape(content))
+
+    def ignorableWhitespace(self, content):
+        self.characters(content)
+
+    def processingInstruction(self, target, data):
+        self._flush_starttag()
+        self._write(u"<?%s %s?>" % (unicode(target), unicode(data)))
+
+
+class ContentFilter (handler.ContentHandler):
+    """Implementation of ContentHandler that passes callbacks to another ContentHandler.
+    
+    Used to implement filtering functionality on the ContentHandler side."""
+    
+    def __init__(self, out):
+        handler.ContentHandler.__init__(self)
+        self.output = out
+
+    # ContentHandler methods
+    def startDocument(self):
+        self.output.startDocument()
+
+    def endDocument(self):
+        self.output.endDocument()
+
+    def startPrefixMapping(self, prefix, uri):
+        self.output.startPrefixMapping(prefix, uri)
+
+    def endPrefixMapping(self, prefix):
+        self.output.endPrefixMapping(prefix)
+
+    def startElement(self, elementName, attrs):
+        self.output.startElement(elementName, attrs)
+
+    def endElement(self, elementName):
+        self.output.endElement(elementName)                
+
+    def startElementNS(self, elementName, qName, attrs):
+        self.output.startElementNS(elementName, qName, attrs)
+
+    def endElementNS(self, elementName, qName):
+        self.output.endElementNS(elementName, qName)                
+
+    def characters(self, content):
+        self.output.characters(content)
+
+    def ignorableWhitespace(self, content):
+        self.output.ignorableWhitespace(content)
+
+    def processingInstruction(self, target, data):
+        self.output.processingInstruction(target, data)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/publish.xsl	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,1647 @@
+<?xml version="1.0"?>
+
+<!-- Input document should be a publish.xml file. -->
+
+<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://www.w3.org/1999/xhtml"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:edit="http://xmlns.grorg.org/SVGT12NG/"
+                xmlns:x="http://mcc.id.au/ns/local"
+                xmlns:saxon="http://saxon.sf.net/"
+                xmlns:xs='http://www.w3.org/2001/XMLSchema'
+                xmlns:idl='http://mcc.id.au/ns/idl'
+                xmlns:_xml='data:,'
+                xpath-default-namespace="http://www.w3.org/1999/xhtml"
+                exclude-result-prefixes="h edit x saxon xs idl"
+                version="2.0">
+
+  <xsl:output method='text'/>
+  <xsl:output name='chapter' method='xml' omit-xml-declaration='yes' doctype-public='-//W3C//DTD XHTML 1.0 Transitional//EN' doctype-system='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'/>
+
+  <xsl:namespace-alias stylesheet-prefix='_xml' result-prefix='xml'/>
+
+  <xsl:variable name='MATURITIES'>
+    <x:maturity code='ED' short='ED' long='Editor’s Draft' longer='Editor’s Draft'/>
+    <x:maturity code='WG-NOTE' short='NOTE' long='Working Group Note' longer='Working Group Note'/>
+    <x:maturity code='WD' short='WD' long='Working Draft' longer='Working Draft'/>
+    <x:maturity code='FPWD' short='WD' long='Working Draft' longer='First Public Working Draft'/>
+    <x:maturity code='LCWD' short='WD' long='Working Draft' longer='Last Call Working Draft'/>
+    <x:maturity code='FPLCWD' short='WD' long='Working Draft' longer='First Public and Last Call Working Draft'/>
+    <x:maturity code='CR' short='CR' long='Candidate Recommendation' longer='Candidate Recommendation'/>
+    <x:maturity code='PR' short='PR' long='Proposed Recommendation' longer='Proposed Recommendation'/>
+    <x:maturity code='PER' short='PER' long='Proposed Edited Recommendation' longer='Proposed Edited Recommendation'/>
+    <x:maturity code='REC' short='REC' long='Recommendation' longer='Recommendation'/>
+    <x:maturity code='RSCND' short='RSCND' long='Rescinded Recommendation' longer='Rescinded Recommendation'/>
+  </xsl:variable>
+
+  <xsl:variable name='conf-document' select='/'/>
+  <xsl:variable name='conf' select='/*'/>
+
+  <xsl:variable name='maturity' select='$conf/x:maturity'/>
+  <xsl:variable name='maturity-short' select='$MATURITIES/*[@code=$maturity]/@short'/>
+  <xsl:variable name='maturity-long' select='$MATURITIES/*[@code=$maturity]/@long'/>
+  <xsl:variable name='maturity-longer' select='$MATURITIES/*[@code=$maturity]/@longer'/> 
+
+  <xsl:variable name='publication-date' select='if ($conf/x:publication-date) then xs:date($conf/x:publication-date) else xs:date(current-dateTime())' as='xs:date'/>
+
+  <xsl:variable name='this-version' select='if ($maturity = "ED") then $conf/x:versions/x:cvs/@href else $conf/x:versions/x:this/@href'/>
+
+  <xsl:variable name='idl-document' select='document($conf/x:interfaces/@idl, $conf-document)'/>
+  <xsl:variable name='idl' select='$idl-document/*'/>
+
+  <xsl:variable name='empty-defs-document'><xsl:document><x:definitions/></xsl:document></xsl:variable>
+
+  <xsl:variable name='defs-document' select='document($conf/x:definitions/@href, $conf-document)'/>
+  <xsl:variable name='defs' select='x:collate-defs($defs-document, $empty-defs-document, "")/*'/>
+
+  <xsl:variable name='single-chapter' select='not(($conf/x:chapter, $conf/x:appendix, $conf/x:page))'/>
+
+  <xsl:param name='chapters-to-build' select='string-join($conf/(x:index | x:chapter | x:appendix | x:page)/@name, " ")'/>
+  <xsl:variable name='to-build' select='tokenize($chapters-to-build, " ")'/>
+
+  <xsl:variable name='publish-dir'>
+    <xsl:choose>
+      <xsl:when test='$conf/x:output/@use-publish-directory != "true"'>/</xsl:when>
+      <xsl:when test='$conf/x:output/@publish-directory'><xsl:value-of select='$conf/x:output/@publish-directory'/>/</xsl:when>
+      <xsl:otherwise>publish/</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:template match='/'>
+    <xsl:if test='not(x:publish-conf)'>
+      <xsl:message terminate='yes'>Input document must be a publish.xml file.</xsl:message>
+    </xsl:if>
+    <xsl:for-each select='$conf/x:index[@name=$to-build]'>
+      <xsl:variable name='title-extra' select='if (@title-extra) then string(@title-extra) else""'/>
+      <xsl:result-document format='chapter' href='../{$publish-dir}{@name}.html'>
+        <xsl:variable name='d' select='document(concat(@name, ".html"), .)/html'/>
+        <xsl:variable name='master-directory' select='if ($conf/x:output/@use-publish-directory = "true") then "../master/" else "../"'/>
+        <xsl:comment>
+          <xsl:text>
  </xsl:text>
+          <xsl:value-of select='$conf/x:title'/>
+          <xsl:value-of select='$title-extra'/>
+          <xsl:text>

  $Id$

  Note: This document is generated from </xsl:text>
+          <xsl:value-of select='concat($master-directory, @name, ".html")'/>
+          <xsl:text>.
  Run "make" from </xsl:text>
+          <xsl:value-of select='$master-directory'/>
+          <xsl:text> to regenerate it.
  </xsl:text>
+        </xsl:comment>
+        <xsl:text>
</xsl:text>
+        <xsl:apply-templates select='$d'>
+          <xsl:with-param name='chapter-number' select='""' tunnel='yes'/>
+          <xsl:with-param name='chapter-type' select='"index"' tunnel='yes'/>
+          <xsl:with-param name='title-extra' select='$title-extra' tunnel='yes'/>
+        </xsl:apply-templates>
+      </xsl:result-document>
+    </xsl:for-each>
+    <xsl:apply-templates select='$conf/x:page'/>
+    <xsl:apply-templates select='$conf/x:chapter'/>
+    <xsl:apply-templates select='$conf/x:appendix'/>
+  </xsl:template>
+
+  <xsl:template match='x:chapter | x:appendix | x:page'>
+    <xsl:if test='@name=$to-build'>
+      <xsl:variable name='chapter-type' select='local-name()'/>
+      <xsl:variable name='chapter-number'>
+        <xsl:choose>
+          <xsl:when test='$chapter-type = "page"'/>
+          <xsl:when test='@number'><xsl:value-of select='@number'/></xsl:when>
+          <xsl:when test='$chapter-type = "appendix"'><xsl:number value='position()' format='A'/></xsl:when>
+          <xsl:otherwise><xsl:value-of select='position()'/></xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+      <xsl:result-document format='chapter' href='../{$publish-dir}{@name}.html'>
+        <xsl:variable name='d' select='document(concat(@name, ".html"), .)/html'/>
+        <xsl:variable name='master-directory' select='if ($conf/x:output/@use-publish-directory = "true") then "../master/" else "../"'/>
+        <xsl:comment>
+          <xsl:text>
  </xsl:text>
+          <xsl:value-of select='$conf/x:title'/>
+          <xsl:text>
  </xsl:text>
+          <xsl:value-of select='if (self::x:chapter) then "Chapter" else "Appendix"'/>
+          <xsl:text> </xsl:text>
+          <xsl:value-of select='$chapter-number'/>
+          <xsl:text>: </xsl:text>
+          <xsl:value-of select='$d/head/title'/>
+          <xsl:text>

  $Id$

  Note: This document is generated from </xsl:text>
+          <xsl:value-of select='concat($master-directory, @name, ".html")'/>
+          <xsl:text>.
  Run "make" from </xsl:text>
+          <xsl:value-of select='$master-directory'/>
+          <xsl:text> to regenerate it.
  </xsl:text>
+        </xsl:comment>
+        <xsl:text>
</xsl:text>
+        <xsl:apply-templates select='$d'>
+          <xsl:with-param name='chapter-number' select='$chapter-number' tunnel='yes'/>
+          <xsl:with-param name='chapter-type' select='$chapter-type' tunnel='yes'/>
+          <xsl:with-param name='previous-chapter' select='reverse(preceding-sibling::x:chapter | preceding-sibling::x:appendix | preceding-sibling::x:page)[1]/@name' tunnel='yes'/>
+          <xsl:with-param name='next-chapter' select='(following-sibling::x:chapter | following-sibling::x:appendix | following-sibling::x:page)[1]/@name' tunnel='yes'/>
+        </xsl:apply-templates>
+      </xsl:result-document>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='/html'>
+    <xsl:param name='chapter-number' tunnel='yes'/>
+    <xsl:param name='chapter-type' tunnel='yes'/>
+    <xsl:param name='previous-chapter' tunnel='yes'/>
+    <xsl:param name='next-chapter' tunnel='yes'/>
+    <xsl:param name='title-extra' tunnel='yes'/>
+
+    <!--
+      First, gather the sections in the chapter so that the table of
+      contents and section numbers can be generated efficiently.
+      -->
+    <xsl:variable name='sections' select='x:gather-sections(if ($single-chapter) then .//div[@class="head"][1]/following-sibling::* else .//h1[1], $chapter-number)'/>
+
+    <html>
+      <head>
+        <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/>
+        <title>
+          <xsl:choose>
+            <xsl:when test='$chapter-type = "index"'>
+              <xsl:value-of select='$conf/x:title'/><xsl:value-of select='$title-extra'/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select='head/title'/> – <xsl:value-of select='$conf/x:short-title'/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </title>
+        <xsl:apply-templates select='head/*[not(self::link) and not(self::meta) and not(self::title)]'/>
+        <xsl:apply-templates select='head/link[not(@rel="stylesheet" and contains(@href, "StyleSheets/TR") or @media="print")]'/>
+        <link rel='stylesheet' href='http://www.w3.org/StyleSheets/TR/W3C-{$maturity-short}' type='text/css' media='screen'/>
+      </head>
+      <body>
+        <xsl:variable name='header'>
+          <xsl:call-template name='header'>
+            <xsl:with-param name='previous-chapter' select='$previous-chapter'/>
+            <xsl:with-param name='next-chapter' select='$next-chapter'/>
+          </xsl:call-template>
+        </xsl:variable>
+        <xsl:if test='$chapter-type != "index"'>
+          <div class='header top'>
+            <xsl:copy-of select='$header'/>
+          </div>
+        </xsl:if>
+        <xsl:apply-templates select='body/node()'>
+          <xsl:with-param name='sections' select='$sections' tunnel='yes'/>
+        </xsl:apply-templates>
+        <xsl:if test='$chapter-type != "index" or $conf/(x:chapter | x:appendix | x:page)'>
+          <div class='header bottom'>
+            <xsl:copy-of select='$header'/>
+          </div>
+        </xsl:if>
+        <script src='style/expanders.js' type='text/javascript'><xsl:text> </xsl:text></script>
+      </body>
+    </html>
+  </xsl:template>
+  
+  <xsl:function name='x:gather-sections'>
+    <xsl:param name='n'/>
+    <xsl:param name='chapter-number'/>
+
+    <xsl:document>
+      <x:chapter number='{$chapter-number}' title='{$n}'>
+        <xsl:variable name='ignored-group' select='not(($n/following::*)[1]/self::h2[not(@edit:toc="no")])'/>
+        <xsl:for-each-group select='$n/following::*' group-starting-with='h2[not(@edit:toc="no")]'>
+          <xsl:if test='self::h2[not(@edit:toc="no")]'>
+            <xsl:variable name='pos' select='position() - (if ($ignored-group) then 1 else 0)'/>
+            <xsl:variable name='sec' select='if ($chapter-number) then concat($chapter-number, ".", $pos) else string($pos)'/>
+            <x:section _xml:id='{x:section-id(.)}' number='{$sec}'>
+              <x:title><xsl:copy-of select='node()'/></x:title>
+              <xsl:call-template name='gather-sections-rec'>
+                <xsl:with-param name='level' select='3'/>
+                <xsl:with-param name='sec' select='$sec'/>
+              </xsl:call-template>
+            </x:section>
+          </xsl:if>
+        </xsl:for-each-group>
+      </x:chapter>
+    </xsl:document>
+  </xsl:function>
+
+  <xsl:template name='gather-sections-rec'>
+    <xsl:param name='level' as='xs:integer'/>
+    <xsl:param name='sec' as='xs:string'/>
+    <xsl:variable name='ln' select='concat("h", $level)'/>
+    <xsl:variable name='ignored-group' select='local-name(current-group()[1]) ne $ln or current-group()[1]/@edit:toc = "no"'/>
+    <xsl:for-each-group select='current-group()' group-starting-with='*[local-name() eq $ln and not(@edit:toc="no")]'>
+      <xsl:if test='current-group()[1][local-name() eq $ln and not(@edit:toc="no")]'>
+        <xsl:variable name='pos' select='position() - (if ($ignored-group) then 1 else 0)'/>
+        <xsl:variable name='sec' select='concat($sec, ".", $pos)'/>
+        <x:section _xml:id='{x:section-id(.)}' number='{$sec}'>
+          <x:title><xsl:apply-templates select='node()' mode='no-id'/></x:title>
+          <xsl:if test='$level < 6'>
+            <xsl:call-template name='gather-sections-rec'>
+              <xsl:with-param name='level' select='$level + 1'/>
+              <xsl:with-param name='sec' select='$sec'/>
+            </xsl:call-template>
+          </xsl:if>
+        </x:section>
+      </xsl:if>
+    </xsl:for-each-group>
+  </xsl:template>
+
+  <!-- Generate a Table of Contents below the chapter title -->
+  <xsl:template match='h1'>
+    <xsl:param name='chapter-number' tunnel='yes'/>
+    <xsl:param name='chapter-type' tunnel='yes'/>
+    <xsl:param name='sections' tunnel='yes'/>
+    <h1>
+      <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+      <xsl:if test='$chapter-number'>
+        <xsl:value-of select='if ($chapter-type = "appendix") then concat("Appendix ", $chapter-number, ": ") else concat($chapter-number, " ")'/>
+      </xsl:if>
+      <xsl:apply-templates select='node()'/>
+    </h1>
+    <xsl:if test='$chapter-type != "index" and $sections/*/*'>
+      <h2 id='toc'>Contents</h2>
+      <ul class='toc'>
+        <xsl:apply-templates select='$sections/*/x:section'/>
+      </ul>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='edit:minitoc'>
+    <xsl:if test='$conf/x:page'>
+      <ul class='toc'>
+        <xsl:for-each select='$conf/x:page'>
+          <li class='tocline1'><a href='{@name}.html'><xsl:value-of select='document(concat(@name, ".html"), .)/html/body/h1'/></a></li>
+        </xsl:for-each>
+      </ul>
+    </xsl:if>
+    <xsl:if test='$conf/x:chapter'>
+      <ol class='toc'>
+        <xsl:for-each select='$conf/x:chapter'>
+          <li class='tocline1'><a href='{@name}.html'><xsl:value-of select='position()'/><xsl:text> </xsl:text><xsl:value-of select='document(concat(@name, ".html"), .)/html/body/h1'/></a></li>
+        </xsl:for-each>
+      </ol>
+    </xsl:if>
+    <xsl:if test='$conf/x:appendix'>
+      <ol class='toc'>
+        <xsl:for-each select='$conf/x:appendix'>
+          <li class='tocline1'><a href='{@name}.html'>Appendix <xsl:number value='position()' format='A'/>: <xsl:value-of select='document(concat(@name, ".html"), .)/html/body/h1'/></a></li>
+        </xsl:for-each>
+      </ol>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='edit:fulltoc'>
+    <xsl:param name='sections' tunnel='yes'/>
+    <xsl:choose>
+      <xsl:when test='$single-chapter'>
+        <ul class='toc'>
+          <xsl:apply-templates select='$sections/*/x:section'/>
+        </ul>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:if test='$conf/x:page'>
+          <ul class='toc'>
+            <xsl:for-each select='$conf/x:page'>
+              <li class='tocline1'><a href='{@name}.html'><xsl:value-of select='document(concat(@name, ".html"), .)/html/body/h1'/></a></li>
+            </xsl:for-each>
+          </ul>
+        </xsl:if>
+        <xsl:if test='$conf/x:chapter'>
+          <ol class='toc'>
+            <xsl:for-each select='$conf/x:chapter'>
+              <xsl:variable name='doc' select='document(concat(@name, ".html"), .)'/>
+              <xsl:variable name='s' select='x:gather-sections($doc//h1[1], position())'/>
+              <li><div class='tocline1'><a href='{@name}.html'><xsl:value-of select='position()'/><xsl:text> </xsl:text><xsl:value-of select='$doc/html/body/h1'/></a></div>
+                <xsl:if test='$s/*/x:section'>
+                  <ul class='toc'>
+                    <xsl:apply-templates select='$s/*/x:section'>
+                      <xsl:with-param name='toc-filename' select='concat(@name, ".html")' tunnel='yes'/>
+                    </xsl:apply-templates>
+                  </ul>
+                </xsl:if>
+              </li>
+            </xsl:for-each>
+          </ol>
+        </xsl:if>
+        <xsl:if test='$conf/x:appendix'>
+          <ol class='toc'>
+            <xsl:for-each select='$conf/x:appendix'>
+              <xsl:variable name='doc' select='document(concat(@name, ".html"), .)'/>
+              <xsl:variable name='num'>
+                <xsl:number value='position()' format='A'/>
+              </xsl:variable>
+              <xsl:variable name='s' select='x:gather-sections($doc//h1[1], $num)'/>
+              <li><div class='tocline1'><a href='{@name}.html'>Appendix <xsl:value-of select='$num'/>: <xsl:value-of select='$doc/html/body/h1'/></a></div>
+                <xsl:if test='$s/*/x:section'>
+                  <ul class='toc'>
+                    <xsl:apply-templates select='$s/*/x:section'>
+                      <xsl:with-param name='toc-filename' select='concat(@name, ".html")' tunnel='yes'/>
+                    </xsl:apply-templates>
+                  </ul>
+                </xsl:if>
+              </li>
+            </xsl:for-each>
+          </ol>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <!-- Insert section numbers in <h2>, <h3>, <h4>, <h5> and <h6> elements -->
+  <xsl:template match='h2|h3|h4'>
+    <xsl:param name='sections' tunnel='yes'/>
+    <xsl:param name='chapter-type' tunnel='yes'/>
+    <xsl:variable name='section-number' select='x:section-number($sections, x:section-id(.))'/>
+    <xsl:element namespace='http://www.w3.org/1999/xhtml' name='{local-name()}'>
+      <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+      <xsl:value-of select='if (not($chapter-type = "index" and not($single-chapter)) and $section-number) then concat($section-number, " ") else ""'/>
+      <xsl:apply-templates select='node()'/>
+    </xsl:element>
+  </xsl:template>
+
+  <xsl:template match='x:section'>
+    <xsl:param name='toc-filename' tunnel='yes'/>
+    <xsl:text>
</xsl:text>
+    <li>
+      <a href='{$toc-filename}#{@xml:id}'>
+        <xsl:value-of select='@number'/>
+        <xsl:text> </xsl:text>
+        <xsl:apply-templates select='x:title/node()'/>
+      </a>
+      <xsl:if test='x:section'>
+        <ul class='toc'>
+          <xsl:apply-templates select='x:section'/>
+        </ul>
+      </xsl:if>
+    </li>
+  </xsl:template>
+
+  <xsl:template match='h:*' mode='no-id'>
+    <xsl:element name='{local-name()}'>
+      <xsl:copy-of select='@*[local-name() != "id" and namespace-uri() = ""]'/>
+      <xsl:apply-templates select='node()'/>
+    </xsl:element>
+  </xsl:template>
+
+  <xsl:template match='h:*'>
+    <xsl:element name='{local-name()}'>
+      <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+      <xsl:apply-templates select='node()'/>
+    </xsl:element>
+  </xsl:template>
+
+  <xsl:template match='edit:completeidl'>
+    <xsl:variable name='modules' select='tokenize(@modules, ", ")'/>
+    <pre class='idl'>
+      <xsl:for-each select='$idl/(idl:module[@scopedname=$modules] | idl:interface | idl:exception)'>
+        <xsl:if test='position() != 1'><xsl:text>

</xsl:text></xsl:if>
+        <xsl:apply-templates select='.'/>
+      </xsl:for-each>
+    </pre>
+  </xsl:template>
+
+  <xsl:template match='idl:module'>
+    <xsl:text>module </xsl:text>
+    <b><xsl:value-of select='@name'/></b>
+    <xsl:text> {

</xsl:text>
+    <xsl:for-each select='idl:interface | idl:exception'>
+      <xsl:if test='position() != 1'><xsl:text>
</xsl:text></xsl:if>
+      <xsl:apply-templates select='.'/>
+      <xsl:text>
</xsl:text>
+    </xsl:for-each>
+    <xsl:text>
};</xsl:text>
+  </xsl:template>
+
+  <xsl:template match='edit:interface'>
+    <xsl:variable name='interface-name' select='@name'/>
+    <xsl:variable name='interface' select='$idl//(idl:interface | idl:exception)[@scopedname=$interface-name]'/>
+    <xsl:variable name='interface-desc' select='$interface/idl:description'/>
+    <xsl:apply-templates select='$interface-desc/(h:* | edit:* | text())'>
+      <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+    </xsl:apply-templates>
+    <pre class='idl'>
+      <xsl:apply-templates select='$interface'/>
+    </pre>
+    <xsl:variable name='associatedConsts' select='if ($interface/self::idl:exception) then root($interface)//idl:const[@associatedexception=$interface-name] else ()'/>
+    <xsl:if test='$interface/(idl:attribute | idl:operation | idl:const | idl:member) | $associatedConsts'>
+      <dl class='interface'>
+        <xsl:if test='$interface/idl:const | $associatedConsts'>
+          <xsl:for-each select='distinct-values(($interface/idl:const/@defgroup, $associatedConsts/self::idl:const/@defgroup))'>
+            <xsl:variable name='defgroup' select='.'/>
+            <dt class='constants-header'>Constants in group “<xsl:value-of select='.'/>â€:</dt>
+            <dd>
+              <dl class='constants'>
+                <xsl:apply-templates select='$interface/idl:const[@defgroup=$defgroup] | $associatedConsts/self::idl:const[@defgroup=$defgroup]' mode='prose'>
+                  <xsl:with-param name='interface' select='$interface'/>
+                </xsl:apply-templates>
+              </dl>
+            </dd>
+          </xsl:for-each>
+          <xsl:variable name='ungrouped-consts' select='$interface/idl:const[not(@defgroup)] | $associatedConsts/self::idl:const[not(@defgroup)]'/>
+          <xsl:if test='$ungrouped-consts'>
+            <dt class='constants-header'>
+              <xsl:choose>
+                <xsl:when test='$interface/idl:const/@defgroup | $associatedConsts/self::idl:const/@defgroup'>Other constants:</xsl:when>
+                <xsl:otherwise>Constants:</xsl:otherwise>
+              </xsl:choose>
+            </dt>
+            <dd>
+              <dl class='constants'>
+                <xsl:apply-templates select='$ungrouped-consts' mode='prose'>
+                  <xsl:with-param name='interface' select='$interface'/>
+                </xsl:apply-templates>
+              </dl>
+            </dd>
+          </xsl:if>
+        </xsl:if>
+        <xsl:if test='$interface/idl:attribute'>
+          <dt class='attributes-header'>Attributes:</dt>
+          <dd>
+            <dl class='attributes'>
+              <xsl:apply-templates select='$interface/idl:attribute' mode='prose'>
+                <xsl:with-param name='interface' select='$interface'/>
+              </xsl:apply-templates>
+            </dl>
+          </dd>
+        </xsl:if>
+        <xsl:if test='$interface/idl:member'>
+          <dt class='exception-members-header'>Exception members:</dt>
+          <dd>
+            <dl class='attributes'>
+              <xsl:apply-templates select='$interface/idl:member' mode='prose'>
+                <xsl:with-param name='interface' select='$interface'/>
+              </xsl:apply-templates>
+            </dl>
+          </dd>
+        </xsl:if>
+        <xsl:if test='$interface/idl:operation'>
+          <dt class='operations-header'>Operations:</dt>
+          <dd>
+            <dl class='attributes'>
+              <xsl:apply-templates select='$interface/idl:operation' mode='prose'>
+                <xsl:with-param name='interface' select='$interface'/>
+              </xsl:apply-templates>
+            </dl>
+          </dd>
+        </xsl:if>
+      </dl>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='idl:interface | idl:exception'>
+    <xsl:variable name='i' select='.'/>
+    <xsl:value-of select='concat(local-name(), " ")'/>
+    <xsl:variable name='name' select='@name'/>
+    <b><xsl:value-of select='@name'/></b>
+    <xsl:if test='idl:extends'>
+      <xsl:text> : </xsl:text>
+      <xsl:apply-templates select='idl:extends[1]'/>
+      <xsl:for-each select='idl:extends[position() > 1]'>
+        <xsl:text>,
             </xsl:text>
+        <xsl:value-of select='replace($name, ".", " ")'/>
+        <xsl:apply-templates select='.'/>
+      </xsl:for-each>
+    </xsl:if>
+    <xsl:text> {
</xsl:text>
+    <xsl:variable name='spaces' select='count((idl:member[1], idl:attribute[1], idl:operation[1], idl:const[@defgroup][1], idl:const[not(@defgroup)][1])) > 1'/>
+    <xsl:if test='idl:const[not(@defgroup)] and $spaces'>
+      <xsl:text>
</xsl:text>
+    </xsl:if>
+    <xsl:for-each select='idl:const[not(@defgroup)]'>
+      <xsl:text>  </xsl:text>
+      <xsl:apply-templates select='.'/>
+      <xsl:text>
</xsl:text>
+    </xsl:for-each>
+    <xsl:for-each select='distinct-values(idl:const/@defgroup)'>
+      <xsl:if test='$spaces'>
+        <xsl:text>
</xsl:text>
+      </xsl:if>
+      <xsl:text>  // </xsl:text>
+      <xsl:value-of select='.'/>
+      <xsl:text>
</xsl:text>
+      <xsl:variable name='defgroup' select='.'/>
+      <xsl:for-each select='$i/idl:const[@defgroup=$defgroup]'>
+        <xsl:text>  </xsl:text>
+        <xsl:apply-templates select='.'/>
+        <xsl:text>
</xsl:text>
+      </xsl:for-each>
+    </xsl:for-each>
+    <xsl:if test='idl:attribute'>
+      <xsl:variable name='indent' select='count(idl:attribute[@readonly="true"]) != 0'/>
+      <xsl:if test='$spaces'>
+        <xsl:text>
</xsl:text>
+      </xsl:if>
+      <xsl:for-each select='idl:attribute'>
+        <xsl:text>  </xsl:text>
+        <xsl:apply-templates select='.'>
+          <xsl:with-param name='indent' select='$indent'/>
+        </xsl:apply-templates>
+        <xsl:text>
</xsl:text>
+      </xsl:for-each>
+    </xsl:if>
+    <xsl:if test='idl:member'>
+      <xsl:for-each select='idl:member'>
+        <xsl:text>  </xsl:text>
+        <xsl:apply-templates select='.'/>
+        <xsl:text>
</xsl:text>
+      </xsl:for-each>
+    </xsl:if>
+    <xsl:if test='idl:operation'>
+      <xsl:if test='$spaces'>
+        <xsl:text>
</xsl:text>
+      </xsl:if>
+      <xsl:for-each select='idl:operation'>
+        <xsl:text>  </xsl:text>
+        <xsl:apply-templates select='.'/>
+        <xsl:text>
</xsl:text>
+      </xsl:for-each>
+    </xsl:if>
+    <xsl:text>};</xsl:text>
+    <xsl:variable name='scopedname' select='@scopedname'/>
+    <xsl:variable name='associatedConsts' select='if (self::idl:exception) then root(.)//idl:const[@associatedexception=$scopedname] else ()'/>
+    <xsl:if test='$associatedConsts'>
+      <xsl:text>
</xsl:text>
+      <xsl:for-each select='$associatedConsts/self::idl:const[not(@defgroup)]'>
+        <xsl:text>
</xsl:text>
+        <xsl:apply-templates select='.'/>
+      </xsl:for-each>
+      <xsl:for-each select='distinct-values($associatedConsts/self::idl:const/@defgroup)'>
+        <xsl:text>
</xsl:text>
+        <xsl:text>// </xsl:text>
+        <xsl:value-of select='.'/>
+        <xsl:variable name='defgroup' select='.'/>
+        <xsl:for-each select='$associatedConsts/self::idl:const[@defgroup=$defgroup]'>
+          <xsl:text>
</xsl:text>
+          <xsl:apply-templates select='.'/>
+        </xsl:for-each>
+      </xsl:for-each>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='idl:extends'>
+    <xsl:variable name='superintf' select='id(@ref, .)'/>
+    <xsl:variable name='name' select='($superintf/@name, @name)[1]'/>
+    <xsl:choose>
+      <xsl:when test='$defs/x:interface[@name=$superintf/@name]'>
+        <xsl:copy-of select='x:interface-link($superintf/@name, .)'/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select='$name'/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match='idl:member' mode='prose'>
+    <xsl:param name='interface'/>
+    <xsl:text>
</xsl:text>
+    <dt id='{replace(@scopedname, ":", "_")}' class='exception-member'>
+      <b><xsl:value-of select='@name'/></b>
+      <span class='idl-type-parenthetical'>
+        <xsl:text> (</xsl:text>
+        <xsl:call-template name='idl-type'/>
+        <xsl:text>)</xsl:text>
+      </span>
+    </dt>
+    <dd class='exception-member'>
+      <xsl:variable name='description' select='idl:description'/>
+      <xsl:choose>
+        <xsl:when test='not($description/node())'> </xsl:when>
+        <xsl:when test='local-name($description/node()[1]) = ""'>
+          <div>
+            <xsl:apply-templates select='$description/node()'>
+              <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+            </xsl:apply-templates>
+          </div>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select='$description/node()'>
+            <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+    </dd>
+  </xsl:template>
+
+  <xsl:template match='idl:member'>
+    <xsl:call-template name='idl-type'/>
+    <xsl:text> </xsl:text>
+    <a href='{substring-before($defs/x:interface[@name=current()/../@name]/@href, "#")}#{replace(@scopedname, ":", "_")}'><xsl:value-of select='@name'/></a>
+    <xsl:text>;</xsl:text>
+  </xsl:template>
+
+  <xsl:template match='idl:attribute' mode='prose'>
+    <xsl:param name='interface'/>
+    <xsl:text>
</xsl:text>
+    <dt id='{replace(@scopedname, ":", "_")}' class='attribute{if (position() = 1) then " first-child" else ""}'>
+      <b><xsl:value-of select='@name'/></b>
+      <span class='idl-type-parenthetical'>
+        <xsl:text> (</xsl:text>
+        <xsl:if test='@readonly="true"'>readonly </xsl:if>
+        <xsl:call-template name='idl-type'/>
+        <xsl:text>)</xsl:text>
+      </span>
+    </dt>
+    <dd class='attribute'>
+      <xsl:variable name='description' select='idl:description'/>
+      <xsl:choose>
+        <xsl:when test='not($description/node())'> </xsl:when>
+        <xsl:when test='local-name($description/node()[1]) = ""'>
+          <div>
+            <xsl:apply-templates select='$description/node()'>
+              <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+            </xsl:apply-templates>
+          </div>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select='$description/node()'>
+            <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:if test='idl:getraises | idl:setraises'>
+        <dl class='attribute'>
+          <xsl:if test='idl:getraises'>
+            <dt class='exceptions-header'>Exceptions on getting</dt>
+            <dd>
+              <dl class='exceptions'>
+                <xsl:for-each select='idl:getraises'>
+                  <xsl:sort select='@name'/>
+                  <xsl:variable name='getraises' select='.'/>
+                  <xsl:for-each select='idl:description'>
+                    <dt class='exception'>
+                      <xsl:copy-of select='x:interface-link(id($getraises/@ref, .)/@name, .)'/>
+                      <xsl:if test='@code'>, code <xsl:value-of select='@code'/></xsl:if>
+                    </dt>
+                    <dd class='exception'>
+                      <xsl:apply-templates select='node()'/>
+                    </dd>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </dl>
+            </dd>
+          </xsl:if>
+          <xsl:if test='idl:setraises'>
+            <dt class='exceptions-header'>Exceptions on setting</dt>
+            <dd>
+              <dl class='exceptions'>
+                <xsl:for-each select='idl:setraises'>
+                  <xsl:sort select='@name'/>
+                  <xsl:variable name='setraises' select='.'/>
+                  <xsl:for-each select='idl:description'>
+                    <dt class='exception'>
+                      <xsl:copy-of select='x:interface-link(id($setraises/@ref, .)/@name, .)'/>
+                      <xsl:if test='@code'>, code <xsl:value-of select='@code'/></xsl:if>
+                    </dt>
+                    <dd class='exception'>
+                      <xsl:apply-templates select='node()'/>
+                    </dd>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </dl>
+            </dd>
+          </xsl:if>
+        </dl>
+      </xsl:if>
+    </dd>
+  </xsl:template>
+
+  <xsl:template match='idl:attribute'>
+    <xsl:param name='indent' select='true()' as='xs:boolean'/>
+    <xsl:value-of select='if (@readonly="true") then "readonly attribute " else if ($indent) then "         attribute " else "attribute "'/>
+    <xsl:call-template name='idl-type'/>
+    <xsl:text> </xsl:text>
+    <a href='{substring-before($defs/x:interface[@name=current()/../@name]/@href, "#")}#{replace(@scopedname, ":", "_")}'><xsl:value-of select='@name'/></a>
+    <xsl:if test='idl:getraises'>
+      <xsl:text> getraises(</xsl:text>
+      <xsl:for-each select='idl:getraises'>
+        <xsl:if test='position() != 1'>, </xsl:if>
+        <xsl:call-template name='idl-type'>
+          <xsl:with-param name='name' select='id(@ref, .)/@name'/>
+        </xsl:call-template>
+      </xsl:for-each>
+      <xsl:text>)</xsl:text>
+    </xsl:if>
+    <xsl:if test='idl:setraises'>
+      <xsl:text> setraises(</xsl:text>
+      <xsl:for-each select='idl:setraises'>
+        <xsl:if test='position() != 1'>, </xsl:if>
+        <xsl:call-template name='idl-type'>
+          <xsl:with-param name='name' select='id(@ref, .)/@name'/>
+        </xsl:call-template>
+      </xsl:for-each>
+      <xsl:text>)</xsl:text>
+    </xsl:if>
+    <xsl:text>;</xsl:text>
+  </xsl:template>
+
+  <xsl:template match='idl:operation' mode='prose'>
+    <xsl:param name='interface'/>
+    <xsl:param name='op' select='.'/>
+    <xsl:text>
</xsl:text>
+    <dt id='{replace(@scopedname, ":", "_")}' class='operation{if (position() = 1) then " first-child" else ""}'>
+      <xsl:call-template name='idl-type'/>
+      <xsl:text> </xsl:text>
+      <b><xsl:value-of select='@name'/></b>
+      <xsl:text>(</xsl:text>
+      <xsl:for-each select='idl:argument'>
+        <xsl:if test='position() != 1'>, </xsl:if>
+        <xsl:text>in </xsl:text>
+        <xsl:call-template name='idl-type'/>
+        <xsl:text> </xsl:text>
+        <var><xsl:value-of select='@name'/></var>
+      </xsl:for-each>
+      <xsl:text>)</xsl:text>
+    </dt>
+    <dd class='operation'>
+      <xsl:variable name='description' select='idl:description'/>
+      <xsl:choose>
+        <xsl:when test='not($description/node())'> </xsl:when>
+        <xsl:when test='local-name($description/node()[1]) = ""'>
+          <div>
+            <xsl:apply-templates select='$description/node()'>
+              <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+            </xsl:apply-templates>
+          </div>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select='$description/node()'>
+            <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:if test='not(@type="void") or (idl:argument | idl:raises)'>
+        <dl class='operation'>
+          <xsl:if test='idl:argument'>
+            <dt class='parameters-header'>Parameters</dt>
+            <dd>
+              <ol class='parameters'>
+                <xsl:for-each select='idl:argument'>
+                  <xsl:variable name='argnum' select='position()'/>
+                  <li class='parameter{if (position() = 1) then " first-child" else ""}'>
+                    <div>
+                      <xsl:call-template name='idl-type'/>
+                      <xsl:text> </xsl:text>
+                      <var><xsl:value-of select='@name'/></var>
+                    </div>
+                    <xsl:text> </xsl:text>
+                    <xsl:choose>
+                      <xsl:when test='not(idl:description/node())'> </xsl:when>
+                      <xsl:when test='local-name(idl:description/node()[1]) = ""'>
+                        <div>
+                          <xsl:apply-templates select='idl:description/node()'>
+                            <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+                          </xsl:apply-templates>
+                        </div>
+                      </xsl:when>
+                      <xsl:otherwise>
+                        <xsl:apply-templates select='idl:description/node()'>
+                          <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+                        </xsl:apply-templates>
+                      </xsl:otherwise>
+                    </xsl:choose>
+                  </li>
+                </xsl:for-each>
+              </ol>
+            </dd>
+          </xsl:if>
+          <xsl:if test='not(@type="void")'>
+            <dt class='returns-header'>Returns</dt>
+            <dd>
+              <xsl:choose>
+                <xsl:when test='not(idl:returns/idl:description/node())'> </xsl:when>
+                <xsl:when test='local-name(idl:returns/idl:description/node()[1]) = ""'>
+                  <div>
+                    <xsl:apply-templates select='idl:returns/idl:description/node()'>
+                      <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+                    </xsl:apply-templates>
+                  </div>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:apply-templates select='idl:returns/idl:description/node()'>
+                    <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+                  </xsl:apply-templates>
+                </xsl:otherwise>
+              </xsl:choose>
+            </dd>
+          </xsl:if>
+          <xsl:if test='idl:raises'>
+            <dt class='exceptions-header'>Exceptions</dt>
+            <dd>
+              <dl class='exceptions'>
+                <xsl:for-each select='idl:raises'>
+                  <xsl:sort select='@name'/>
+                  <xsl:variable name='raises' select='.'/>
+                  <xsl:for-each select='idl:description'>
+                    <dt class='exception{if (position() = 1) then " first-child" else ""}'>
+                      <xsl:copy-of select='x:interface-link(id($raises/@ref, .)/@name, .)'/>
+                      <xsl:if test='@code'>, code <xsl:value-of select='@code'/></xsl:if>
+                    </dt>
+                    <dd class='exception'>
+                      <xsl:apply-templates select='node()'>
+                        <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+                      </xsl:apply-templates>
+                    </dd>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </dl>
+            </dd>
+          </xsl:if>
+        </dl>
+      </xsl:if>
+    </dd>
+  </xsl:template>
+
+  <xsl:template match='idl:operation'>
+    <xsl:call-template name='idl-type'/>
+    <xsl:text> </xsl:text>
+    <a href='{substring-before($defs/x:interface[@name=current()/../@name]/@href, "#")}#{replace(@scopedname, ":", "_")}'><xsl:value-of select='@name'/></a>
+    <xsl:text>(</xsl:text>
+    <xsl:for-each select='idl:argument'>
+      <xsl:if test='position() != 1'>, </xsl:if>
+      <xsl:text>in </xsl:text>
+      <xsl:call-template name='idl-type'/>
+      <xsl:text> </xsl:text>
+      <xsl:value-of select='@name'/>
+    </xsl:for-each>
+    <xsl:text>)</xsl:text>
+    <xsl:if test='idl:raises'>
+      <xsl:text> raises(</xsl:text>
+      <xsl:for-each select='idl:raises'>
+        <xsl:if test='position() != 1'>, </xsl:if>
+        <xsl:call-template name='idl-type'>
+          <xsl:with-param name='name' select='id(@ref, .)/@name'/>
+        </xsl:call-template>
+      </xsl:for-each>
+      <xsl:text>)</xsl:text>
+    </xsl:if>
+    <xsl:text>;</xsl:text>
+  </xsl:template>
+
+  <xsl:template match='idl:const' mode='prose'>
+    <xsl:param name='interface'/>
+    <xsl:text>
</xsl:text>
+    <dt id='{replace(@scopedname, ":", "_")}' class='constant{if (position() = 1) then " first-child" else ""}'>
+      <b><xsl:value-of select='@name'/></b>
+      <span class='idl-type-parenthetical'>
+        <xsl:text> (</xsl:text>
+        <xsl:call-template name='idl-type'/>
+        <xsl:text>)</xsl:text>
+      </span>
+    </dt>
+    <dd class='constant'>
+      <xsl:variable name='description' select='idl:description'/>
+      <xsl:choose>
+        <xsl:when test='not($description/node())'> </xsl:when>
+        <xsl:when test='local-name($description/node()[1]) = ""'>
+          <div>
+            <xsl:apply-templates select='$description/node()'>
+              <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+            </xsl:apply-templates>
+          </div>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select='$description/node()'>
+            <xsl:with-param name='interface' select='$interface' tunnel='yes'/>
+          </xsl:apply-templates>
+        </xsl:otherwise>
+      </xsl:choose>
+    </dd>
+  </xsl:template>
+
+  <xsl:template match='idl:const'>
+    <xsl:text>const </xsl:text>
+    <xsl:call-template name='idl-type'/>
+    <xsl:text> </xsl:text>
+    <xsl:variable name='ae' select='@associatedexception'/>
+    <xsl:variable name='container' select='if (../self::idl:interface) then ../@scopedname else if ($ae) then $ae else ()'/>
+    <xsl:variable name='x' select='$idl//(idl:interface | idl:exception)[@scopedname=$container]'/>
+    <a href='{substring-before($defs/x:interface[@name=$x/@name]/@href, "#")}#{replace(@scopedname, ":", "_")}'><xsl:value-of select='@name'/></a>
+    <xsl:text> = </xsl:text>
+    <xsl:value-of select='@value'/>
+    <xsl:text>;</xsl:text>
+  </xsl:template>
+
+  <xsl:template name='idl-type'>
+    <xsl:param name='name' select='(idl:type/idl:scopedname/@name, @type)'/>
+    <xsl:choose>
+      <xsl:when test='$defs/x:interface[@name=$name]'>
+        <xsl:copy-of select='x:interface-link($name, .)'/>
+      </xsl:when>
+      <xsl:when test='$defs/x:interface[@name=substring-after($name, "::")]'>
+        <xsl:copy-of select='x:interface-link(substring-after($name, "::"), .)'/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select='$name'/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template name='header'>
+    <xsl:param name='previous-chapter'/>
+    <xsl:param name='next-chapter'/>
+    <span class='namedate'><xsl:value-of select='$conf/x:short-title'/> – <xsl:value-of select='format-date($publication-date, "[D01] [MNn] [Y]", "en", (), ())'/></span>
+    <a href='{$conf/x:index/@name}.html'>Top</a>
+    <xsl:if test='$conf/x:toc'>
+      <xsl:text> â‹… </xsl:text><a href='{$conf/x:toc/@href}'>Contents</a>
+    </xsl:if>
+    <xsl:if test='$previous-chapter != ""'>
+      <xsl:text> â‹… </xsl:text><a href='{$previous-chapter}.html'>Previous</a>
+    </xsl:if>
+    <xsl:if test='$next-chapter != ""'>
+      <xsl:text> â‹… </xsl:text><a href='{$next-chapter}.html'>Next</a>
+    </xsl:if>
+    <xsl:if test='$conf/x:elementindex'>
+      <xsl:text> â‹… </xsl:text><a href='{$conf/x:elementindex/@href}'>Elements</a>
+    </xsl:if>
+    <xsl:if test='$conf/x:attributeindex'>
+      <xsl:text> â‹… </xsl:text><a href='{$conf/x:attributeindex/@href}'>Attributes</a>
+    </xsl:if>
+    <xsl:if test='$conf/x:propertyindex'>
+      <xsl:text> â‹… </xsl:text><a href='{$conf/x:propertyindex/@href}'>Properties</a>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='span[tokenize(@class, " ") = ("element-name", "attr-name", "prop-name") and starts-with(., "'") and ends-with(., "'")]'>
+    <span>
+      <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+      <xsl:value-of select='concat("‘", substring(., 2, string-length() - 2), "’")'/>
+    </span>
+  </xsl:template>
+
+  <xsl:template match='a[not(@href) and node()]'>
+    <xsl:param name='interface' as='node()?' select='()' tunnel='yes'/>
+    <xsl:param name='context-element' as='xs:string?' select='()' tunnel='yes'/>
+    <xsl:variable name='this' select='normalize-space(.)'/>
+    <xsl:choose>
+      <xsl:when test='$interface/(idl:operation|idl:attribute|idl:const)[@name=$this]'>
+        <xsl:variable name='idlattr' select='$interface/(idl:operation|idl:attribute|idl:const)[@name=$this]'/>
+        <a class='idlattr{if (@class) then " " else ""}{@class}' href='#{replace($idlattr/@scopedname, ":", "_")}'>
+          <xsl:copy-of select='@*[local-name() != "class" and namespace-uri() = ""]'/>
+          <xsl:value-of select='$this'/>
+        </a>
+      </xsl:when>
+      <xsl:when test='$defs/x:interface[@name=$this]'>
+        <a class='idlinterface{if (@class) then " " else ""}{@class}' href='{$defs/x:interface[@name=$this]/@href}'>
+          <xsl:copy-of select='@*[local-name() != "class" and namespace-uri() = ""]'/>
+          <xsl:value-of select='$this'/>
+        </a>
+      </xsl:when>
+      <xsl:when test='matches($this, "^[^:]+::[^:]+$")'>
+        <xsl:variable name='before' select='substring-before($this, "::")'/>
+        <xsl:variable name='after' select='substring-after($this, "::")'/>
+        <xsl:variable name='member' select='$idl//(idl:interface | idl:exception)[@name=substring-before($this, "::")]/(idl:attribute|idl:operation|idl:const|idl:member)[@name=substring-after($this, "::")]'/>
+        <xsl:choose>
+          <xsl:when test='$member'>
+            <a class='idlattr{if (@class) then " " else ""}{@class}' href='{substring-before($defs/(x:interface | x:exception)[@name=$before]/@href, "#")}#{replace($member/@scopedname, ":", "_")}'>
+              <xsl:copy-of select='@*[local-name() != "class" and namespace-uri() = ""]'/>
+              <xsl:if test='@edit:format="expanded"'><xsl:value-of select='$member/../@name'/>::</xsl:if>
+              <xsl:value-of select='$after'/>
+            </a>
+          </xsl:when>
+          <xsl:otherwise>
+            <a style='background: red; color: white' href='data:,'>
+              <xsl:message>Unknown interface member "<xsl:value-of select='$this'/>" at <xsl:value-of select="concat(base-uri(.), ' line ', saxon:line-number())"/>.</xsl:message>
+              <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+              <xsl:apply-templates/>
+            </a>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test='starts-with($this, "'") and ends-with($this, "'")'>
+        <xsl:variable name='name' select='substring($this, 2, string-length() - 2)'/>
+        <xsl:choose>
+          <xsl:when test='contains($name, "/")'>
+            <xsl:variable name='parts' select='tokenize($name, "/")'/>
+            <xsl:copy-of select='x:attribute-link($parts[2], $parts[1], false(), .)'/>
+          </xsl:when>
+          <xsl:when test='contains($name, " ")'>
+            <xsl:variable name='parts' select='tokenize($name, " ")'/>
+            <xsl:choose>
+              <xsl:when test='$parts[2] = "element"'>
+                <xsl:copy-of select='x:element-link($parts[1], .)'/>
+              </xsl:when>
+              <xsl:when test='$parts[2] = "presentationattribute"'>
+                <xsl:copy-of select='x:presentation-attribute-link($parts[1], .)'/>
+              </xsl:when>
+              <xsl:when test='$parts[2] = "attribute"'>
+                <xsl:copy-of select='x:attribute-link($parts[1], $context-element, true(), .)'/>
+              </xsl:when>
+              <xsl:when test='$parts[2] = "property"'>
+                <xsl:copy-of select='x:property-link($parts[1], .)'/>
+              </xsl:when>
+            </xsl:choose>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:copy-of select='x:name-link($name, $context-element, .)'/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test='starts-with($this, "<") and ends-with($this, ">")'>
+        <xsl:variable name='name' select='substring($this, 2, string-length() - 2)'/>
+        <xsl:copy-of select='x:symbol-link($name, .)'/>
+      </xsl:when>
+      <xsl:when test='$defs/x:term[lower-case(@name)=lower-case($this)]'>
+        <xsl:variable name='term' select='$defs/x:term[lower-case(@name)=lower-case($this)]'/>
+        <a href='{$term/@href}'><span class='{if ($term/@class) then $term/@class else "svg-term"}'>
+          <xsl:choose>
+            <xsl:when test='count($term/node())'>
+              <xsl:apply-templates select='$term/node()'/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select='$term/@name'/>
+           </xsl:otherwise>
+          </xsl:choose>
+        </span></a>
+      </xsl:when>
+      <xsl:otherwise>
+        <a style='background: red; color: white' href='data:,'>
+          <xsl:message>Unknown term "<xsl:value-of select='$this'/>" at <xsl:value-of select="concat(base-uri(.), ' line ', saxon:line-number())"/>.</xsl:message>
+          <xsl:copy-of select='@*[namespace-uri() = ""]'/>
+          <xsl:apply-templates/>
+        </a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match='edit:example'>
+    <xsl:variable name='text' select='unparsed-text(resolve-uri(@href, base-uri(.)))'/>
+    <pre class='xml'><xsl:value-of select='replace($text, "\s+$", "")'/></pre>
+    <xsl:if test='@image="yes"'>
+      <table summary="Example {@title}">
+        <caption align="bottom">Example <xsl:value-of select="@name"/></caption>
+        <tr><td><img alt="Example {@name}{if (@description) then concat(' — ', @description) else ''}" src='{replace(@href, "\.svg$", ".png")}'/></td></tr>
+      </table>
+    </xsl:if>
+    <xsl:if test='@link="yes"'>
+      <p class='view-as-svg'><a href='{@href}'>View this example as SVG (SVG-enabled browsers only)</a></p>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match='edit:includefile'>
+    <pre><xsl:value-of select='replace(unparsed-text(resolve-uri(@href, base-uri(.))), "\s+$", "")'/></pre>
+  </xsl:template>
+
+  <xsl:template match='edit:elementsummary'>
+    <!--xsl:param name='context-element' as='xs:string?' select='()' tunnel='yes'/-->
+    <xsl:for-each select='$defs/x:element[@name = current()/@name]'>
+      <xsl:variable name='element' select='.'/>
+      <xsl:variable name='name' select='@name'/>
+      <div class='element-summary'>
+        <div class='element-summary-name'><span class='element-name'>‘<xsl:value-of select='@name'/>’</span></div>
+        <dl>
+          <dt>Categories:</dt>
+          <dd>
+            <xsl:variable name='categories' select='$defs/x:elementcategory[tokenize(@elements, ", ") = current()/@name]'/>
+            <xsl:choose>
+              <xsl:when test='not($categories)'>None</xsl:when>
+              <xsl:otherwise>
+                <xsl:for-each select='$categories'>
+                  <xsl:variable name='text' select='if (position() = 1) then concat(upper-case(substring(@name, 1, 1)), substring(@name, 2)) else @name'/>
+                  <xsl:if test='position() != 1'>, </xsl:if>
+                  <a href='{@href}'><xsl:value-of select='$text'/> element</a>
+                </xsl:for-each>
+              </xsl:otherwise>
+            </xsl:choose>
+          </dd>
+          <dt>Content model:</dt>
+          <dd>
+            <xsl:choose>
+              <xsl:when test='x:contentmodel'>
+                <xsl:apply-templates select='x:contentmodel/node()'/>
+              </xsl:when>
+              <xsl:when test='@contentmodel=("textoranyof", "anyof", "oneormoreof")'>
+                <xsl:value-of select='if (@contentmodel="oneormoreof") then "One or more" else "Any number"'/> of the following elements<xsl:if test='textoranyof'> or character data</xsl:if>, in any order:
+                <ul class='no-bullets'>
+                  <xsl:for-each select='tokenize(@elementcategories, ", ")'>
+                    <xsl:variable name='category' select='$defs/x:elementcategory[@name=current()]'/>
+                    <li>
+                      <xsl:choose>
+                        <xsl:when test='$category'>
+                          <a href='{$category/@href}'><xsl:value-of select='.'/> elements</a>
+                          <span class='expanding'>
+                            <xsl:text> — </xsl:text>
+                            <xsl:for-each select='tokenize($category/@elements, ", ")'>
+                              <xsl:sort/>
+                              <xsl:if test='position() != 1'>, </xsl:if>
+                              <xsl:choose>
+                                <xsl:when test='$defs/x:element[@name=current()]'>
+                                  <a href='{$defs/x:element[@name=current()]/@href}'>
+                                    <span class='element-name'>
+                                      <xsl:value-of select='concat("‘", ., "’")'/>
+                                    </span>
+                                  </a>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                  <xsl:message>Unknown name "<xsl:value-of select='.'/>" at <xsl:value-of select="concat(base-uri($category), ' line ', saxon:line-number())"/>.</xsl:message>
+                                  <a href='data:,' style='background: red; color: white'>@@ unknown name '<xsl:value-of select='.'/>'</a>
+                                </xsl:otherwise>
+                              </xsl:choose>
+                            </xsl:for-each>
+                          </span>
+                        </xsl:when>
+                        <xsl:otherwise>
+                          <xsl:message>Unknown element category "<xsl:value-of select='.'/>" at <xsl:value-of select="concat(base-uri($element), ' line ', saxon:line-number())"/>.</xsl:message>
+                          <a href='data:,' style='background: red; color: white'>@@ unknown element category '<xsl:value-of select='.'/>'</a>
+                        </xsl:otherwise>
+                      </xsl:choose>
+                    </li>
+                  </xsl:for-each>
+                  <xsl:for-each select='tokenize(@elements, ", ")'>
+                    <xsl:sort/>
+                    <li><xsl:copy-of select='x:element-link(., $element)'/></li>
+                  </xsl:for-each>
+                </ul>
+              </xsl:when>
+              <xsl:when test='@contentmodel="any"'>
+                Any elements or character data.
+              </xsl:when>
+              <xsl:when test='@contentmodel="text"'>
+                Character data.
+              </xsl:when>
+              <xsl:otherwise>Empty.</xsl:otherwise>
+            </xsl:choose>
+          </dd>
+          <dt>Attributes:</dt>
+          <dd>
+            <xsl:choose>
+              <xsl:when test='@attributecategories or @attributes or x:attribute'>
+                <ul class='no-bullets'>
+                  <xsl:for-each select='tokenize(@attributecategories, ", ")'>
+                    <xsl:variable name='category' select='$defs/x:attributecategory[@name=current()]'/>
+                    <xsl:if test='$category/@href'>
+                      <li>
+                        <xsl:choose>
+                          <xsl:when test='$category'>
+                            <a href='{$category/@href}'><xsl:value-of select='.'/> attributes</a>
+                            <span class='expanding'>
+                              <xsl:text> — </xsl:text>
+                              <xsl:variable name='attributes' select='tokenize($category/@attributes, ", ")'/>
+                              <xsl:variable name='presentationattributes' select='tokenize($category/@presentationattributes, ", ")'/>
+                              <xsl:variable name='attributeelements' select='$category/x:attribute/@name'/>
+                              <xsl:for-each select='$attributes'>
+                                <xsl:if test='position() != 1'>, </xsl:if>
+                                <xsl:copy-of select='x:attribute-link(., $name, true(), $category)'/>
+                              </xsl:for-each>
+                              <xsl:for-each select='$presentationattributes'>
+                                <xsl:if test='count($attributes) or position() != 1'>, </xsl:if>
+                                <xsl:copy-of select='x:presentation-attribute-link(., $category)'/>
+                              </xsl:for-each>
+                              <xsl:for-each select='$attributeelements'>
+                                <xsl:if test='count($attributes) or count($presentationattributes) or position() != 1'>, </xsl:if>
+                                <xsl:copy-of select='x:attribute-link(., $name, true(), $category)'/>
+                              </xsl:for-each>
+                            </span>
+                          </xsl:when>
+                          <xsl:otherwise>
+                            <xsl:message>Unknown attribute category "<xsl:value-of select='.'/>" at <xsl:value-of select="concat(base-uri($element), ' line ', saxon:line-number())"/>.</xsl:message>
+                            <a href='data:,' style='background: red; color: white'>@@ unknown attribute category '<xsl:value-of select='.'/>'</a>
+                          </xsl:otherwise>
+                        </xsl:choose>
+                      </li>
+                    </xsl:if>
+                  </xsl:for-each>
+                  <xsl:for-each select='tokenize(@attributecategories, ", ")'>
+                    <xsl:variable name='category' select='$defs/x:attributecategory[@name=current()]'/>
+                    <xsl:if test='$category and not($category/@href)'>
+                      <xsl:variable name='attributes' select='tokenize($category/@attributes, ", ")'/>
+                      <xsl:variable name='presentationattributes' select='tokenize($category/@presentationattributes, ", ")'/>
+                      <xsl:variable name='attributeelements' select='$category/x:attribute/@name'/>
+                      <xsl:for-each select='$attributes'>
+                        <li><xsl:copy-of select='x:attribute-link(., $name, true(), $category)'/></li>
+                      </xsl:for-each>
+                      <xsl:for-each select='$presentationattributes'>
+                        <li><xsl:copy-of select='x:presentation-attribute-link(., $category)'/></li>
+                      </xsl:for-each>
+                      <xsl:for-each select='$attributeelements'>
+                        <li><xsl:copy-of select='x:attribute-link(., $name, true(), $category)'/></li>
+                      </xsl:for-each>
+                    </xsl:if>
+                  </xsl:for-each>
+                  <xsl:for-each select='tokenize(@attributes, ", *")'>
+                    <li><xsl:copy-of select='x:attribute-link(., $name, true(), $element)'/></li>
+                  </xsl:for-each>
+                  <xsl:for-each select='x:attribute'>
+                    <li><xsl:copy-of select='x:attribute-link(@name, $name, true(), $element)'/></li>
+                  </xsl:for-each>
+                </ul>
+              </xsl:when>
+              <xsl:otherwise>None</xsl:otherwise>
+            </xsl:choose>
+          </dd>
+          <dt>DOM Interfaces:</dt>
+          <dd>
+            <ul class='no-bullets'>
+              <xsl:for-each select='tokenize(@interfaces, ", *")'>
+                <li><xsl:copy-of select='x:interface-link(., $element)'/></li>
+              </xsl:for-each>
+            </ul>
+          </dd>
+        </dl>
+      </div>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match='edit:with'>
+    <xsl:param name='context-element' select='()' as='xs:string?' tunnel='yes'/>
+    <xsl:variable name='context-element' select='if (@element) then @element else $context-element'/>
+    <xsl:apply-templates select='node()'>
+      <xsl:with-param name='context-element' select='$context-element' tunnel='yes'/>
+    </xsl:apply-templates>
+  </xsl:template>
+
+  <xsl:template match='edit:toc'>[generated toc goes here]</xsl:template>
+
+  <xsl:template match='edit:maturity'><xsl:value-of select='$maturity-long'/></xsl:template>
+
+  <xsl:template match='edit:date'>
+    <xsl:value-of select='format-date($publication-date, "[D01] [MNn] [Y]", "en", (), ())'/>
+  </xsl:template>
+
+  <xsl:template match='edit:thisversion'>
+    <a href='{$this-version}' class='url'><xsl:value-of select='$this-version'/></a>
+  </xsl:template>
+
+  <xsl:template match='edit:latestversion'>
+    <xsl:variable name='href' select='$conf/x:versions/x:latest/@href'/>
+    <a href='{$href}' class='url'><xsl:value-of select='$href'/></a>
+  </xsl:template>
+
+  <xsl:template match='edit:previousversion'>
+    <xsl:variable name='href' select='$conf/x:versions/x:previous/@href'/>
+    <a href='{$href}' class='url'><xsl:value-of select='$href'/></a>
+  </xsl:template>
+
+  <xsl:template match='edit:copyright'>
+    <p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © <xsl:value-of select='year-from-date($publication-date)'/><xsl:text> </xsl:text><a href="http://www.w3.org/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.eu/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.</p>
+  </xsl:template>
+
+  <xsl:template match='edit:locallink'>
+    <xsl:variable name='s' select='resolve-uri(@href, $this-version)'/>
+    <a href='{$s}'>
+      <xsl:choose>
+        <xsl:when test='node()'>
+          <xsl:apply-templates/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select='$s'/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </a>
+  </xsl:template>
+
+  <xsl:template match='edit:attributetable'>
+    <table class='vert property-table' summary='Alphabetic list of attributes'>
+      <tr>
+        <th>Attribute</th>
+        <th>Elements on which the attribute may be specified</th>
+        <th title="Animatable"><a href="animate.html#Animatable">Anim.</a></th>
+      </tr>
+      <xsl:for-each select='$defs//x:attribute'>
+        <xsl:sort select='@name'/>
+        <xsl:sort select='@elements'/>
+        <xsl:choose>
+          <xsl:when test='../self::x:element'>
+            <tr>
+              <td><xsl:copy-of select='x:attribute-link(@name, ../@name, true(), .)'/></td>
+              <td><xsl:copy-of select='x:element-link(../@name, .)'/></td>
+              <td><xsl:copy-of select='if (x:lookup-attribute(@name, ../@name, true())/@animatable="yes") then "✓" else ""'/></td>
+            </tr>
+          </xsl:when>
+          <xsl:when test='../self::x:attributecategory'>
+            <xsl:variable name='attributecategory' select='..'/>
+            <tr>
+              <td><xsl:copy-of select='x:attribute-link(@name, $defs/x:element[tokenize(@attributecategories, ", ")=$attributecategory/@name][1]/@name, true(), .)'/></td>
+              <td>
+                <xsl:for-each select='$defs/x:element[tokenize(@attributecategories, ", ")=$attributecategory/@name]'>
+                  <xsl:sort select='@name'/>
+                  <xsl:if test='not(position()=1)'>, </xsl:if>
+                  <xsl:copy-of select='x:element-link(@name, .)'/>
+                </xsl:for-each>
+              </td>
+              <td><xsl:copy-of select='if (x:lookup-attribute(@name, $defs/x:element[tokenize(@attributecategories, ", ")=$attributecategory/@name][1]/@name, true())/@animatable="yes") then "✓" else ""'/></td>
+            </tr>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:variable name='attribute-name' select='@name'/>
+            <xsl:variable name='element-names' select='if (@elements) then tokenize(@elements, ", ") else ../x:element[tokenize(@attributes, ", ") = $attribute-name]/@name'/>
+            <xsl:variable name='element-name' select='$element-names[1]'/>
+            <tr>
+              <td><xsl:copy-of select='x:attribute-link(@name, $element-name, true(), .)'/></td>
+              <td>
+                <xsl:for-each select='$element-names'>
+                  <xsl:sort select='.'/>
+                  <xsl:if test='not(position()=1)'>, </xsl:if>
+                  <xsl:copy-of select='x:element-link(., .)'/>
+                </xsl:for-each>
+              </td>
+              <td><xsl:copy-of select='if (x:lookup-attribute(@name, $element-name, true())/@animatable="yes") then "✓" else ""'/></td>
+            </tr>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:for-each>
+    </table>
+  </xsl:template>
+
+  <xsl:template match='edit:elementcategory'>
+    <xsl:variable name='elementcategory' select='$defs/x:elementcategory[@name=current()/@name]'/>
+    <xsl:variable name='all'>
+      <xsl:perform-sort>
+        <xsl:sort select='string(.)'/>
+        <xsl:for-each select='tokenize($elementcategory/@elements, ", ")'>
+          <xsl:copy-of select='x:element-link(., $elementcategory)'/>
+        </xsl:for-each>
+      </xsl:perform-sort>
+    </xsl:variable>
+    <xsl:for-each select='$all/*'>
+      <xsl:if test='position() != 1'>
+        <xsl:choose>
+          <xsl:when test='position() = last()'> and </xsl:when>
+          <xsl:otherwise>, </xsl:otherwise>
+        </xsl:choose>
+      </xsl:if>
+      <xsl:copy-of select='.'/>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match='edit:attributecategory'>
+    <xsl:variable name='attributecategory' select='$defs/x:attributecategory[@name=current()/@name]'/>
+    <xsl:variable name='all'>
+      <xsl:perform-sort>
+        <xsl:sort select='string(.)'/>
+        <xsl:for-each select='tokenize($attributecategory/@presentationattributes, ", ")'>
+          <xsl:copy-of select='x:presentation-attribute-link(., $attributecategory)'/>
+        </xsl:for-each>
+        <xsl:for-each select='tokenize($attributecategory/@attributes, ", ")'>
+          <xsl:copy-of select='x:attribute-link(., (), true(), $attributecategory)'/>
+        </xsl:for-each>
+        <xsl:for-each select='$attributecategory/x:attribute'>
+          <a href="{@href}"><span class="attr-name">‘<xsl:value-of select='@name'/>’</span></a>
+        </xsl:for-each>
+      </xsl:perform-sort>
+    </xsl:variable>
+    <xsl:for-each select='$all/*'>
+      <xsl:if test='position() != 1'>
+        <xsl:choose>
+          <xsl:when test='position() = last()'> and </xsl:when>
+          <xsl:otherwise>, </xsl:otherwise>
+        </xsl:choose>
+      </xsl:if>
+      <xsl:copy-of select='.'/>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match='edit:elementswithattributecategory'>
+    <xsl:variable name='elementswithattributecategory' select='.'/>
+    <xsl:for-each select='$defs/x:element[tokenize(@attributecategories, ", ") = current()/@name]'>
+      <xsl:if test='position() != 1'>
+        <xsl:choose>
+          <xsl:when test='position() = last()'> and </xsl:when>
+          <xsl:otherwise>, </xsl:otherwise>
+        </xsl:choose>
+      </xsl:if>
+      <xsl:copy-of select='x:element-link(@name, $elementswithattributecategory)'/>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match='*'/>
+
+
+  <xsl:function name='x:section-number'>
+    <xsl:param name='sections'/>
+    <xsl:param name='section-id'/>
+    <xsl:variable name='e' select='id($section-id, $sections)'/>
+    <xsl:if test='$e'>
+      <xsl:value-of select='$e/@number'/>
+    </xsl:if>
+  </xsl:function>
+
+  <xsl:function name='x:section-id' as='xs:string'>
+    <xsl:param name='headerElement'/>
+    <xsl:value-of select='if ($headerElement/@id) then $headerElement/@id
+                          else if ($headerElement/a/@id) then $headerElement/a/@id
+                          else if ($headerElement/a/@name) then $headerElement/a/@name
+                          else if ($headerElement/preceding-sibling::a[1]/@id) then $headerElement/preceding-sibling::a[1]/@id
+                          else $headerElement/preceding-sibling::a[1]/@name'/>
+  </xsl:function>
+
+  <xsl:function name='x:lookup-element' as='element()?'>
+    <xsl:param name='name'/>
+    <xsl:copy-of select='$defs/x:element[@name=$name]'/>
+  </xsl:function>
+
+  <xsl:function name='x:lookup-attribute' as='element()?'>
+    <xsl:param name='name'/>
+    <xsl:param name='element-name'/>
+    <xsl:param name='definitely-attribute'/>
+    <xsl:variable name='element' select='if ($element-name="") then () else $defs/x:element[@name=$element-name]'/>
+    <xsl:variable name='attributes' select='($defs/x:attribute[not(@elements) and @name=$name],
+                                             if ($element) then ($element/x:attribute[@name=$name],
+                                                                 $defs/x:attributecategory[tokenize($element/@attributecategories, ", ") = @name]/x:attribute[@name=$name],
+                                                                 $defs/x:attribute[@name=$name and tokenize(@elements, ", ") = $element-name])
+                                                           else ())'/>
+
+    <xsl:variable name='any-attributes' select='if (not($attributes) and ($definitely-attribute or (not($defs/x:element[@name=$name]) and not($defs/x:property[@name=$name])))) then $defs/(x:attributecategory/x:attribute | x:attribute)[@name=$name] else ()'/>
+    <xsl:variable name='final-attributes' select='if ($attributes) then $attributes else if (count($any-attributes) = 1) then $any-attributes else ()'/>
+    <xsl:choose>
+      <xsl:when test='count($final-attributes) > 1'><x:ambiguous/></xsl:when>
+      <xsl:when test='count($final-attributes)'><xsl:copy-of select='$final-attributes'/></xsl:when>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:lookup-property' as='element()?'>
+    <xsl:param name='name'/>
+    <xsl:copy-of select='$defs/x:property[@name=$name]'/>
+  </xsl:function>
+
+  <xsl:function name='x:attribute-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='element'/>
+    <xsl:param name='prefer-attributes'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='attribute' select='x:lookup-attribute($name, $element, $prefer-attributes)'/>
+    <xsl:variable name='property' select='if ($prefer-attributes and $attribute) then () else x:lookup-property($name)'/>
+    <xsl:variable name='title' select='if ($property and not($attribute)) then concat("Presentation attribute for property ‘", $name, "’") else ""'/>
+    <xsl:variable name='x' select='($attribute, $property)[1]'/>
+    <xsl:choose>
+      <xsl:when test='$x/self::x:ambiguous'>
+        <xsl:message>Ambiguous attribute "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ ambiguous attribute '<xsl:value-of select='$name'/>'</a>
+      </xsl:when>
+      <xsl:when test='$x'>
+        <a href='{$x/@href}'>
+          <xsl:if test='$title != ""'>
+            <xsl:attribute name='title'><xsl:value-of select='$title'/></xsl:attribute>
+          </xsl:if>
+          <span class='attr-name'>
+            <xsl:value-of select='concat("‘", $name, "’")'/>
+          </span>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:message>Unknown attribute "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown attribute '<xsl:value-of select='$name'/>'</a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:element-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='element' select='x:lookup-element($name)'/>
+    <xsl:choose>
+      <xsl:when test='$element/self::x:ambiguous'>
+        <xsl:message>Ambiguous element "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ ambiguous element '<xsl:value-of select='$name'/>'</a>
+      </xsl:when>
+      <xsl:when test='$element'>
+        <a href='{$element/@href}'>
+          <span class='element-name'>
+            <xsl:value-of select='concat("‘", $name, "’")'/>
+          </span>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:message>Unknown element "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown element '<xsl:value-of select='$name'/>'</a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:property-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='property' select='x:lookup-property($name)'/>
+    <xsl:choose>
+      <xsl:when test='$property'>
+        <a href='{$property/@href}'>
+          <span class='prop-name'>
+            <xsl:value-of select='concat("‘", $name, "’")'/>
+          </span>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:message>Unknown property "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown property '<xsl:value-of select='$name'/>'</a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:presentation-attribute-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='property' select='x:lookup-property($name)'/>
+    <xsl:choose>
+      <xsl:when test='$property'>
+        <a href='{$property/@href}'>
+          <span class='attr-name' title='Presentation attribute for property ‘{$name}’'>
+            <xsl:value-of select='concat("‘", $name, "’")'/>
+          </span>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:message>Presentation attribute for unknown property "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ presentation attribute for unknown property '<xsl:value-of select='$name'/>'</a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:symbol-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='symbol' select='$defs/x:symbol[@name=$name]'/>
+    <xsl:choose>
+      <xsl:when test='not($symbol)'>
+        <xsl:message>Unknown grammar symbol "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown symbol '<xsl:value-of select='$name'/>'</a>
+      </xsl:when>
+      <xsl:otherwise>
+        <a href='{$symbol/@href}'><<xsl:value-of select='$name'/>></a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:name-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='context-element'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='element' select='x:lookup-element($name)'/>
+    <xsl:variable name='attribute' select='x:lookup-attribute($name, $context-element, false())'/>
+    <xsl:variable name='property' select='x:lookup-property($name)'/>
+    <xsl:variable name='all' select='($element, $property, $attribute)'/>
+    <xsl:choose>
+      <xsl:when test='$all/self::x:ambiguous or count($all) > 1'>
+        <xsl:message>Ambiguous name "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ ambiguous name '<xsl:value-of select='$name'/>'</a>
+      </xsl:when>
+      <xsl:when test='not($all)'>
+        <xsl:message>Unknown name "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown name '<xsl:value-of select='$name'/>'</a>
+      </xsl:when>
+      <xsl:otherwise>
+        <a href='{$all/@href}'>
+          <span class='{if ($element) then "element" else if ($attribute) then "attr" else "prop"}-name'>
+            <xsl:value-of select='concat("‘", $name, "’")'/>
+          </span>
+        </a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:function name='x:interface-link' as='element()'>
+    <xsl:param name='name'/>
+    <xsl:param name='referencing-element'/>
+    <xsl:variable name='interface' select='$defs/x:interface[@name=$name]'/>
+    <xsl:choose>
+      <xsl:when test='$interface'>
+        <a class='idlinterface' href='{$interface/@href}'>
+          <xsl:value-of select='$name'/>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:message>Unknown interface "<xsl:value-of select='$name'/>" at <xsl:value-of select="concat(base-uri($referencing-element), ' line ', saxon:line-number())"/>.</xsl:message>
+        <a href='data:,' style='background: red; color: white'>@@ unknown interface '<xsl:value-of select='$name'/>'</a>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+
+  <xsl:key name='key-element' match='x:element' use='@name'/>
+  <xsl:key name='key-elementcategory' match='x:elementcategory' use='@name'/>
+  <xsl:key name='key-attribute' match='x:definitions/x:attribute' use='@name'/>
+  <xsl:key name='key-attributecategory' match='x:attributecategory' use='@name'/>
+  <xsl:key name='key-property' match='x:property' use='@name'/>
+  <xsl:key name='key-interface' match='x:interface' use='@name'/>
+  <xsl:key name='key-symbol' match='x:symbol' use='@name'/>
+  <xsl:key name='key-term' match='x:term' use='@name'/>
+
+  <xsl:function name='x:collate-defs' as='node()'>
+    <xsl:param name='currentdoc' as='node()'/>
+    <xsl:param name='resultdoc' as='node()'/>
+    <xsl:param name='base'/>
+    <xsl:variable name='newresultdoc'>
+      <xsl:document>
+        <x:definitions>
+          <xsl:copy-of select='$resultdoc/*/*'/>
+          <xsl:for-each select='$currentdoc/*/*[not(self::x:import) and not(key(concat("key-", local-name(.)), @name, $resultdoc))]'>
+            <xsl:copy>
+              <xsl:copy-of select='@*[local-name() != "href" and namespace-uri() = ""]'/>
+              <xsl:if test='@href'>
+                <xsl:attribute name='href' select='if ($base = "") then @href else resolve-uri(@href, $base)'/>
+              </xsl:if>
+              <xsl:copy-of select='node()'/>
+            </xsl:copy>
+          </xsl:for-each>
+        </x:definitions>
+      </xsl:document>
+    </xsl:variable>
+    <xsl:copy-of select='x:collate-defs-import($newresultdoc, $currentdoc/*/x:import)'/>
+  </xsl:function>
+
+  <xsl:function name='x:collate-defs-import' as='node()'>
+    <xsl:param name='currentdoc' as='node()'/>
+    <xsl:param name='imports' as='element()*'/>
+    <xsl:choose>
+      <xsl:when test='$imports'>
+        <xsl:copy-of select='x:collate-defs-import(x:collate-defs(document($imports[1]/@definitions),
+                                                                  $currentdoc,
+                                                                  if ($maturity = "ED" and $imports[1]/@cvs-href) then $imports[1]/@cvs-href else $imports[1]/@href), subsequence($imports, 2))'/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:copy-of select='$currentdoc'/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:function>
+</xsl:stylesheet>
Binary file saxonb/doc/img/saxonica_logo.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/doc/index.html	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,56 @@
+<!DOCTYPE html
+  PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+   <head>
+      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+      <title>Saxonica: XSLT and XQuery Processing: Welcome</title>
+      <meta name="coverage" content="Worldwide">
+      <meta name="copyright" content="Copyright Saxonica Ltd">
+      <meta name="title" content="Saxonica: XSLT and XQuery Processing: About Saxon">
+      <meta name="robots" content="noindex,nofollow">
+      <link rel="stylesheet" href="saxondocs.css" type="text/css">
+   </head>
+   <body class="main">
+      <div id="rhDkBlueArea" style="position:absolute; width:123px; height:800px; z-index:2; right: 0px; top: 0px; border: 1px none #000000; background-color: #C1CEDE; layer-background-color: #C1CEDE; visibility: visible;"></div>
+      <div id="rhMdBlueArea" style="position:absolute; width:217px; height:800px; z-index:2; right: 340px; top: 0px; border: 1px none #000000; background-color: #E4EEF0; layer-background-color: #E4EEF0; visibility: visible;"></div>
+      <div id="lhLightArea" style="position:absolute; width:34px; height:800px; z-index:2; left: 66px; top: 0px; border: 1px none #000000; background-color: #f6fffb; layer-background-color: #E4EEF0; visibility: visible;"></div>
+      <div id="lhDkBlueArea" style="position:absolute; width:66px; height:800px; z-index:2; left: 0px; top: 0px; border: 1px none #000000; background-color: #C1CEDE; layer-background-color: #C1CEDE; visibility: visible;"></div>
+      <div id="LogoArea" style="position:absolute; width:340px; height:72px; z-index:3; right: 0px; top: 0px; border: 1px none #000000; visibility: visible;"><a href="http://www.saxonica.com/"><img src="img/saxonica_logo.gif" width="340" height="72" border="0" alt="Saxonica.com"></a></div>
+
+      <div id="MainTextArea" style="position:absolute; height:100%; z-index:5; left: 130px; right: 260px; top: 110px; border: 1px none #000000; visibility: visible;">
+         <h1>Welcome to Saxon</h1>
+         
+         
+         <p class="subhead">Online Documentation</p>
+         
+         <p>Saxon documentation for the current release is available online:</p>
+         
+         <ul>
+         <li><p><a href="http://www.saxonica.com/documentation/documentation.html" class="bodylink">Saxon Documentation</a></p></li>
+         
+         <li><p><a href="http://www.saxonica.com/documentation/javadoc/index.html" class="bodylink">Javadoc API Documentation</a></p></li>
+         
+         <li><p><a href="http://www.saxonica.com/documentation/dotnetdoc/index.html" class="bodylink">.NET API Documentation</a></p></li>
+         </ul>
+
+         
+         <p class="subhead">Downloads</p>
+         
+         <p>Saxon documentation, together with source code and sample applications
+         can also be downloaded, both for the current release and for earlier releases.
+         </p>
+         
+         <p>The same file <code>saxon-resources8-N.zip</code> covers both Saxon products
+          (Saxon-B and Saxon-SA), and both platforms (Java and .NET).</p>
+          
+         <p>The file also contains sample applications and Saxon-B source code.</p>
+         
+        
+         <ul>
+         <li><p><a class="bodylink" href="http://sourceforge.net/project/showfiles.php?group_id=29872">Saxon-B downloads at SourceForge</a></li>
+         <li><p><a class="bodylink" href="http://www.saxonica.com/">Saxon-SA downloads at www.saxonica.com</a></li>
+         </ul>
+
+      </div>
+   </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/doc/saxondocs.css	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,228 @@
+
+
+/* 
+Text blue: #3D5B96
+Dark blue: #c1cede
+Mid blue: #e4eef0 
+Light blue: #f6fffb
+mid green #B1CCC7
+rust #96433D
+*/
+
+/* used for frameset holders */
+.bgnd {
+	margin-top:0;
+	margin-left:0;
+	background: #f6fffb;
+	}
+
+/* used for menu */
+
+.menu {
+	background: #f6fffb;
+	margin-top:20;
+	margin-left:40;
+	SCROLLBAR-FACE-COLOR: #c1cede; 
+	SCROLLBAR-HIGHLIGHT-COLOR: #e4eef0; 
+	SCROLLBAR-SHADOW-COLOR: #e4eef0; 
+	SCROLLBAR-ARROW-COLOR: #f6fffb; 
+	SCROLLBAR-BASE-COLOR: #e4eef0;
+}
+
+/* used for content pages */
+
+.main {
+	background: #e4eef0;
+	margin-top:10px;
+	margin-left:5px;
+	margin-right:5px;
+	margin-bottom:20px;
+	SCROLLBAR-FACE-COLOR: #c1cede; 
+	SCROLLBAR-HIGHLIGHT-COLOR: #e4eef0; 
+	SCROLLBAR-SHADOW-COLOR: #e4eef0; 
+	SCROLLBAR-ARROW-COLOR: #f6fffb; 
+	SCROLLBAR-BASE-COLOR: #e4eef0;
+}
+
+/* used for menu links */
+
+a {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 8pt;
+	font-style:normal;
+	color: #3D5B96;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+/* used for in body links */
+
+a.bodylink {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 9pt;
+	font-style:normal;
+	color: #3D5B96;
+	font-weight: normal;
+	text-decoration: underline;
+}
+
+/* used for table of contents level 1 */
+
+a.toc1 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12pt;
+	font-style:normal;
+	color: #3D5B96;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+/* used for table of contents level 2 */
+
+a.toc2 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10pt;
+	font-style:normal;
+	color: #3D5B96;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+/* used for menu heading */
+.title {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10pt;
+	font-style:normal;
+	color: #3D5B96;
+	font-weight: bold;
+	text-decoration: none;
+	line-height: 1.3em;
+}
+
+/* used for main page headings */
+
+
+h1 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 14pt;
+	font-style: normal;
+	color: #3D5B96;
+	font-weight: bold;
+	text-decoration: none;
+		}
+
+/* used for subheads in pref. to H2 etc, to limit underlining width */
+
+.subhead {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10pt;
+	font-style: normal;
+	color: #3D5B96;
+	font-weight: bold;
+	text-decoration: none;
+	border-bottom : thin dashed #3D5B96;
+	padding-right : 5px;
+}
+
+/* used for standard text */
+
+p {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 9pt;
+	font-style: normal;
+	color: #3D5B96;
+	font-weight: normal;
+	text-decoration: none;
+	line-height: 1.3em;
+	padding-right:15px;
+}
+
+code {
+		font-family: lucida sans typewriter, courier, monospace;
+	font-size: 8pt;
+	font-style: normal;
+	font-weight: normal;
+	text-decoration: none;
+	line-height: 1.3em;
+}
+
+ul {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 9pt;
+	font-style: normal;
+	color: #3D5B96;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+li {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 9pt;
+	font-style: normal;
+	color: #3D5B96;
+	font-weight: normal;
+
+}
+
+/* used for text in boxed areas */
+
+.boxed {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 8pt;
+	font-style: normal;
+	color: #96433D;
+	font-weight: bold;
+	text-decoration: none;
+	margin-top:5px;
+	margin-bottom:5px;
+}
+
+/* used for example code */
+
+.codeblock {
+    background: #B1CCC7;
+    /*background: #e4eef0;*/
+	font-family: lucida sans typewriter, courier, monospace;
+	font-size: 8pt;	
+	font-style: normal;
+	color: #96433D;
+	font-weight: normal;
+	text-decoration: none;
+	padding-right:15px;
+}
+
+/* used for example commands */
+
+.command {
+	font-size: 8pt;	
+	font-style: normal;
+	color: #96433D;
+	font-weight: bold;
+	text-decoration: none;
+	padding-right:15px;
+}
+
+
+
+/* used for links in boxed areas */
+
+a.rust {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 8pt;
+	font-style:normal;
+	color: #96433D;
+	font-weight: bold;
+	text-decoration: underline;
+}
+
+/* used for links at the end of a page */
+
+a.nav {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 8pt;
+	font-style:normal;
+	color: #96433D;
+	font-weight: bold;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/APACHE.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,13 @@
+Apache Ant
+Copyright 1999-2006 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes also software developed by :
+  - the W3C consortium (http://www.w3c.org) ,
+  - the SAX project (http://www.saxproject.org)
+
+The <sync> task is based on code Copyright (c) 2002, Landmark
+Graphics Corp that has been kindly donated to the Apache Software
+Foundation.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/CERN.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,7 @@
+Copyright © 1999 CERN - European Organization for Nuclear Research.<br/><br/>
+
+Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
+is hereby granted without fee, provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in supporting documentation.
+CERN makes no representations about the suitability of this software for any purpose.
+It is provided "as is" without expressed or implied warranty.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/FRIJTERS.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,22 @@
+Copyright (C) 2002-2007 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+  
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+  
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+     
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+     
+  3. This notice may not be removed or altered from any source distribution.
+  
+  Jeroen Frijters
+  jeroen@frijters.net
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/GPL+CLASSPATH.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Sun Microsystems, Inc.  are subject to
+the following clarification and special exception to the GPL, but only where
+Sun has expressly included in the particular source file's header the words
+"Sun designates this particular file as subject to the "Classpath" exception
+as provided by Sun in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/JAMESCLARK.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,25 @@
+Copyright (c) 1998, 1999 James Clark
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL JAMES CLARK BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of James Clark shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from James Clark.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/LEGAL.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,33 @@
+LEGAL NOTICE
+
+This notice is issued to fulfil the requirements of the Mozilla Public License version 1.0 ("MPL 1.0")
+sections 3.4(a) and 3.6. MPL 1.0 can be found at http://www.mozilla.org/MPL/MPL-1.0.html. 
+
+Section 3.4(a) of MPL 1.0 states that any third party intellectual property rights in particular 
+functionality or code must be notified in a text file named LEGAL that is issued with the source code. Saxon 
+includes a number of such third party components, and the relevant claims are included in notices included
+in the same directory as this notice. Although MPL 1.0 requires this notice to be included only with source
+code, some of the third parties may also require notices to be included with executable code. Therefore, Saxon
+executable code must not be distributed separately from this notice and all the accompanying third
+party notices. The term "Distribution" here includes making the code available for download, and its 
+inclusion in download repositories such as Maven.
+
+Section 3.6 of MPL 1.0 states:
+
+You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have 
+been met for that Covered Code, and if You include a notice stating that the Source Code version of 
+the Covered Code is available under the terms of this License, including a description of how and 
+where You have fulfilled the obligations of Section 3.2.
+
+Section 3.2 requires the Source Code of Covered Code to be made available via an accepted Electronic
+Distribution Mechanism.
+
+The Source Code version of the Covered Code (that is, the source code of Saxon-B) is available under the 
+terms of the Mozilla Public License version 1.0, and may be obtained from the Subversion repository 
+for the Saxon project on SourceForge, at https://sourceforge.net/svn/?group_id=29872. 
+The precise version of the Subversion source for a particular Saxon maintenance release can be 
+determined by referring to the release notes for the particular release in the SourceForge download area.
+
+Note that MPL 1.0 requires that any modifications to this source code must be made available under the terms
+of the MPL "to anyone to whom you made an executable version available". As a courtesy, it is also requested 
+that you make such modifications available to Saxonica Limited.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/LICENSE.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,15 @@
+The contents of these file are subject to the Mozilla Public License Version 1.0 (the "License"); 
+you may not use these files except in compliance with the License. You may obtain a copy of the 
+License at http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis, 
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the 
+specific language governing rights and limitations under the License.
+
+The Original Code is all Saxon modules labelled with a notice referring to this license.
+
+The Initial Developer of the Original Code is Michael Kay, except where otherwise specified in an individual module.
+
+Portions created by other named contributors are copyright as identified in the relevant module. All Rights Reserved.
+
+Contributor(s) are listed in the documentation: see notices/contributors. 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/THAI.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,31 @@
+Copyright (c) 2001-2003 Thai Open Source Software Center Ltd
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+    Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+    Neither the name of the Thai Open Source Software Center Ltd nor
+    the names of its contributors may be used to endorse or promote
+    products derived from this software without specific prior written
+    permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saxonb/notices/UNICODE.txt	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,29 @@
+COPYRIGHT AND PERMISSION NOTICE
+Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under the Terms of Use 
+in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode 
+data files and any associated documentation (the "Data Files") or Unicode software and any 
+associated documentation (the "Software") to deal in the Data Files or Software without 
+restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, 
+and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or 
+Software are furnished to do so, provided that (a) the above copyright notice(s) and this 
+permission notice appear with all copies of the Data Files or Software, (b) both the above 
+copyright notice(s) and this permission notice appear in associated documentation, and 
+(c) there is clear notice in each modified Data File or in the Software as well as in the 
+documentation associated with the Data File(s) or Software that the data or software has 
+been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE 
+BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, 
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA 
+FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be used 
+in advertising or otherwise to promote the sale, use or other dealings in these 
+Data Files or Software without prior written authorization of the copyright holder.
Binary file saxonb/saxon9-dom.jar has changed
Binary file saxonb/saxon9-dom4j.jar has changed
Binary file saxonb/saxon9-jdom.jar has changed
Binary file saxonb/saxon9-s9api.jar has changed
Binary file saxonb/saxon9-sql.jar has changed
Binary file saxonb/saxon9-xom.jar has changed
Binary file saxonb/saxon9-xpath.jar has changed
Binary file saxonb/saxon9-xqj.jar has changed
Binary file saxonb/saxon9.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/single-page.xsl	Thu Jul 28 14:47:21 2011 +0100
@@ -0,0 +1,114 @@
+<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+                xmlns:h='http://www.w3.org/1999/xhtml'
+                xmlns='http://www.w3.org/1999/xhtml'
+                version='1.0'>
+
+  <xsl:output method='xml' encoding='UTF-8'
+              doctype-public='-//W3C//DTD XHTML 1.0 Transitional//EN'
+              doctype-system='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'/>
+
+  <xsl:param name='chapters'/>
+  <xsl:param name='publish'/>
+
+  <xsl:template match='/h:html/h:body'>
+    <xsl:copy>
+      <xsl:apply-templates select="@*"/>
+      <xsl:apply-templates/>
+      <xsl:call-template name='do-chapters'>
+        <xsl:with-param name='cs' select='concat($chapters, " ")'/>
+      </xsl:call-template>
+      <script src='style/expanders.js'><xsl:text> </xsl:text></script>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match='h:div[@class="header" or @class="footer" or @class="header top" or @class="header bottom"]'/>
+
+  <xsl:template match="h:head">
+    <xsl:copy>
+      <xsl:apply-templates select="@*"/>
+      <xsl:apply-templates/>
+      <xsl:call-template name='do-chapters-style'>
+        <xsl:with-param name='cs' select='concat($chapters, " ")'/>
+      </xsl:call-template>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match='@id'>
+    <xsl:param name='c'/>
+    <xsl:attribute name='id'>
+      <xsl:value-of select='concat($c, .)'/>
+    </xsl:attribute>
+  </xsl:template>
+
+  <xsl:template match='h:a/@name'>
+    <xsl:param name='c'/>
+    <xsl:attribute name='name'>
+      <xsl:value-of select='concat($c, .)'/>
+    </xsl:attribute>
+  </xsl:template>
+
+  <xsl:template match='h:a/@href'>
+    <xsl:param name='c'/>
+    <xsl:attribute name='href'>
+      <xsl:choose>
+        <xsl:when test='starts-with(., "#")'>
+          <xsl:value-of select='concat("#", $c, substring(., 2))'/>
+        </xsl:when>
+        <xsl:when test='substring-after(substring-before(., "#"), ".") = "html" and not(contains(., "/"))'>
+          <xsl:value-of select='concat("#", substring-before(., ".html"), "-", substring-after(., "#"))'/>
+        </xsl:when>
+        <xsl:when test='contains(concat(" ", $chapters, " "), concat(" ", substring-before(., ".html"), " "))'>
+          <xsl:value-of select='concat("#chapter-", substring-before(., ".html"))'/>
+        </xsl:when>
+        <xsl:when test='contains(concat(" ", $chapters, " "), concat(" ", ., " "))'>
+          <xsl:value-of select='concat("#chapter-", .)'/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select='.'/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:attribute>
+  </xsl:template>
+
+  <xsl:template match='h:script[@src="style/expanders.js"]'/>
+
+  <xsl:template match='node()|@*'>
+    <xsl:param name='c'/>
+    <xsl:copy>
+      <xsl:apply-templates select="@*">
+        <xsl:with-param name='c' select='$c'/>
+      </xsl:apply-templates>
+      <xsl:apply-templates>
+        <xsl:with-param name='c' select='$c'/>
+      </xsl:apply-templates>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template name='do-chapters'>
+    <xsl:param name='cs'/>
+    <xsl:variable name='c' select='concat(substring-before($cs, " "), "-")'/>
+    <xsl:if test='$c != "" and $c != "-"'>
+      <hr class='chapter-divider'/>
+      <xsl:text>
</xsl:text>
+      <div id='chapter-{substring($c, 1, string-length($c) - 1)}'>
+        <xsl:apply-templates select='document(concat($publish, "/", substring($c, 1, string-length($c) - 1), ".html"))/h:html/h:body/node()'>
+          <xsl:with-param name='c' select='$c'/>
+        </xsl:apply-templates>
+      </div>
+      <xsl:call-template name='do-chapters'>
+        <xsl:with-param name='cs' select='substring-after($cs, " ")'/>
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name='do-chapters-style'>
+    <xsl:param name='cs'/>
+    <xsl:variable name='c' select='concat(substring-before($cs, " "), "-")'/>
+    <xsl:if test='$c != "" and $c != "-"'>
+      <xsl:apply-templates select='document(concat($publish, "/", substring($c, 1, string-length($c) - 1), ".html"))/h:html/h:head/h:style'/>
+      <xsl:call-template name='do-chapters-style'>
+        <xsl:with-param name='cs' select='substring-after($cs, " ")'/>
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+</xsl:stylesheet>