ISO 8859-8, ASCII plus Hebrew : Encoding « I18N « Java

Home
Java
1.2D Graphics GUI
2.3D
3.Advanced Graphics
4.Ant
5.Apache Common
6.Chart
7.Class
8.Collections Data Structure
9.Data Type
10.Database SQL JDBC
11.Design Pattern
12.Development Class
13.EJB3
14.Email
15.Event
16.File Input Output
17.Game
18.Generics
19.GWT
20.Hibernate
21.I18N
22.J2EE
23.J2ME
24.JDK 6
25.JNDI LDAP
26.JPA
27.JSP
28.JSTL
29.Language Basics
30.Network Protocol
31.PDF RTF
32.Reflection
33.Regular Expressions
34.Scripting
35.Security
36.Servlets
37.Spring
38.Swing Components
39.Swing JFC
40.SWT JFace Eclipse
41.Threads
42.Tiny Application
43.Velocity
44.Web Services SOA
45.XML
Java » I18N » EncodingScreenshots 
ISO 8859-8, ASCII plus Hebrew
   

/* Copyright 2002, 2003 Elliotte Rusty Harold
   
   This library is free software; you can redistribute it and/or modify
   it under the terms of version 2.1 of the GNU Lesser General Public 
   License as published by the Free Software Foundation.
   
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
   GNU Lesser General Public License for more details.
   
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the 
   Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
   Boston, MA 02111-1307  USA
   
   You can contact Elliotte Rusty Harold by sending e-mail to
   elharo@metalab.unc.edu. Please include the word "XOM" in the
   subject line. The XOM home page is located at http://www.xom.nu/
*/


import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;




/**
 * <p>
 *   ISO 8859-8, ASCII plus Hebrew
 * </p>
 
 @author Elliotte Rusty Harold
 @version 1.0
 *
 */
class ISOHebrewWriter extends TextWriter {

    ISOHebrewWriter(Writer out, String encoding) {
        super(out, encoding);
    }

    /**
     @see nu.xom.TextWriter#needsEscaping(char)
     */
    boolean needsEscaping(char c) { 
        if (c <= 0xA0return false;        
        switch (c) { // characters shared with Latin-1
            case 0x00A2return false// CENT SIGN
            case 0x00A3return false// POUND SIGN
            case 0x00A4return false// CURRENCY SIGN
            case 0x00A5return false// YEN SIGN
            case 0x00A6return false// BROKEN BAR
            case 0x00A7return false// SECTION SIGN
            case 0x00A8return false// DIAERESIS
            case 0x00A9return false// COPYRIGHT SIGN
            case 0x00ABreturn false// LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
            case 0x00ACreturn false// NOT SIGN
            case 0x00ADreturn false// SOFT HYPHEN
            case 0x00AEreturn false// REGISTERED SIGN
            // A bug in Java prevents a macron from being correctly 
            // output as the actual character in this encoding even
            // though it does exist in the ISO-8859-8 character set.
            // See JDC bug 4760496
            // http://developer.java.sun.com/developer/bugParade/bugs/4760496.html
            // They have marked this as fixed in Tiger (i.e. Java 1.5)
            // I'm not going to fix it here yet though, because I'd 
            // prefer XOM to work correctly with earlier versions of
            // of Java; and it's not incorrect to output a character 
            // reference even if you don't have to. It is an issue if a
            // macron is used in a a comment or a processing 
            // instruction though. The macron is not a name character
            // so that's not an issue though.
            case 0x00AFreturn true;  // MACRON
            case 0x00B0return false// DEGREE SIGN
            case 0x00B1return false// PLUS-MINUS SIGN
            case 0x00B2return false// SUPERSCRIPT TWO
            case 0x00B3return false// SUPERSCRIPT THREE
            case 0x00B4return false// ACUTE ACCENT
            case 0x00B5return false// MICRO SIGN
            case 0x00B6return false// PILCROW SIGN
            case 0x00B7return false// MIDDLE DOT
            case 0x00B8return false// CEDILLA
            case 0x00B9return false// SUPERSCRIPT ONE
            case 0x00BAreturn true;  // place holder to allow optimization of switch statement
            case 0x00BBreturn false// RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
            case 0x00BCreturn false// VULGAR FRACTION ONE QUARTER
            case 0x00BDreturn false// VULGAR FRACTION ONE HALF
            case 0x00BEreturn false// VULGAR FRACTION THREE QUARTERS
        }
        switch (c) {  // Unicode Hebrew block
            case 0x05D0return false// HEBREW LETTER ALEF
            case 0x05D1return false// HEBREW LETTER BET
            case 0x05D2return false// HEBREW LETTER GIMEL
            case 0x05D3return false// HEBREW LETTER DALET
            case 0x05D4return false// HEBREW LETTER HE
            case 0x05D5return false// HEBREW LETTER VAV
            case 0x05D6return false// HEBREW LETTER ZAYIN
            case 0x05D7return false// HEBREW LETTER HET
            case 0x05D8return false// HEBREW LETTER TET
            case 0x05D9return false// HEBREW LETTER YOD
            case 0x05DAreturn false// HEBREW LETTER FINAL KAF
            case 0x05DBreturn false// HEBREW LETTER KAF
            case 0x05DCreturn false// HEBREW LETTER LAMED
            case 0x05DDreturn false// HEBREW LETTER FINAL MEM
            case 0x05DEreturn false// HEBREW LETTER MEM
            case 0x05DFreturn false// HEBREW LETTER FINAL NUN
            case 0x05E0return false// HEBREW LETTER NUN
            case 0x05E1return false// HEBREW LETTER SAMEKH
            case 0x05E2return false// HEBREW LETTER AYIN
            case 0x05E3return false// HEBREW LETTER FINAL PE
            case 0x05E4return false// HEBREW LETTER PE
            case 0x05E5return false// HEBREW LETTER FINAL TSADI
            case 0x05E6return false// HEBREW LETTER TSADI
            case 0x05E7return false// HEBREW LETTER QOF
            case 0x05E8return false// HEBREW LETTER RESH
            case 0x05E9return false// HEBREW LETTER SHIN
            case 0x05EAreturn false// HEBREW LETTER TAV
        }
        
        switch (c) {  // a few random, out of order characters
            case 0x00D7return false// MULTIPLICATION SIGN
            case 0x00F7return false// DIVISION SIGN
            // A bug in Java prevents a LEFT-TO-RIGHT MARK 
            // and RIGHT-TO-LEFT MARK from being correctly output
            // as the actual character in this encoding even
            // though it does exist in the ISO-8859-8 character set.
            // See JDC bug 4758951
            // http://developer.java.sun.com/developer/bugParade/bugs/4758951.html
            // They have marked this as fixed in Tiger (i.e. Java 1.5)
            // case 0x200E: return false; // LEFT-TO-RIGHT MARK
            // case 0x200F: return false; // RIGHT-TO-LEFT MARK
            case 0x2017return false// DOUBLE LOW LINE
        }
        
        return true;
        
    }

}

/* Copyright 2002-2006 Elliotte Rusty Harold
   
   This library is free software; you can redistribute it and/or modify
   it under the terms of version 2.1 of the GNU Lesser General Public 
   License as published by the Free Software Foundation.
   
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
   GNU Lesser General Public License for more details.
   
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the 
   Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
   Boston, MA 02111-1307  USA
   
   You can contact Elliotte Rusty Harold by sending e-mail to
   elharo@metalab.unc.edu. Please include the word "XOM" in the
   subject line. The XOM home page is located at http://www.xom.nu/
*/

/**
 * <p>
 *   This class is responsible for writing strings with the 
 *   necessary escaping for their context.
 * </p>
 
 @author Elliotte Rusty Harold
 @version 1.2d1
 *
 */
abstract class TextWriter {

    protected final Writer out;
    protected final String encoding;
    
    private String lineSeparator = "\r\n";
    // true if the user has requested a specific 
    // line separator
            boolean lineSeparatorSet = false;
    private boolean inDocType = false;
    private int     maxLength = 0;
    private int     indent = 0;
    private String  indentString = "";
    protected int   column = 0;
    // Is an xml:space="preserve" attribute in scope?
    private boolean preserveSpace = false;
    protected boolean normalize = false;
    
    protected TextWriter(Writer out, String encoding) {
        this.out = out; 
        this.encoding = encoding;
    }
    
    
    void reset() {
        column = 0
        fakeIndents = 0
        lastCharacterWasSpace = false;
        skipFollowingLinefeed = false
    }

    
    protected boolean lastCharacterWasSpace = false;
    
    /**
     * Indicates whether a linefeed is just half of a \r\n pair
     * used for a line break.
     */
    protected boolean skipFollowingLinefeed = false;
    
    // Needed for memory between calls.
    private char highSurrogate;
    
    
    private boolean isHighSurrogate(int c) {
        return c >= 0xD800 && c <= 0xDBFF;  
    }
    
    
    private boolean isLowSurrogate(int c) {
        return c >= 0xDC00 && c <= 0xDFFF;  
    }
    
    
    final void writePCDATA(char cthrows IOException {
        
        switch(c) {
            case '\r':
                if (!adjustingWhiteSpace()  && !lineSeparatorSet) {
                    out.write("&#x0D;");
                    column += 6;
                    justBroke=false;
                }
                else {
                    breakLine();
                    lastCharacterWasSpace = true;              
                }
                skipFollowingLinefeed = true;
                break;
            case 14// unreachable
            case 15// unreachable
            case 16// unreachable
            case 17// unreachable
            case 18// unreachable
            case 19// unreachable
            case 20// unreachable
            case 21// unreachable
            case 22// unreachable
            case 23// unreachable
            case 24// unreachable
            case 25// unreachable
            case 26// unreachable
            case 27// unreachable
            case 28// unreachable
            case 29// unreachable
            case 30// unreachable
            case 31// unreachable
                throw new RuntimeException("Bad character snuck into document");
            case ' ':
                write(c);
                break;
            case '!':
                write(c);
                break;
            case '"':
                write(c);
                break;
            case '#':
                write(c);
                break;
            case '$':
                write(c);
                break;
            case '%':
                write(c);
                break;
            case '&':
                out.write("&amp;");
                column += 5;
                lastCharacterWasSpace = false;
                skipFollowingLinefeed = false
                justBroke = false;
                break;
            case '\'':
                write(c);
                break;
            case '(':
                write(c);
                break;
            case ')':
                write(c);
                break;
            case '*':
                write(c);
                break;
            case '+':
                write(c);
                break;
            case ',':
                write(c);
                break;
            case '-':
                write(c);
                break;
            case '.':
                write(c);
                break;
            case '/':
                write(c);
                break;
            case '0':
                write(c);
                break;
            case '1':
                write(c);
                break;
            case '2':
                write(c);
                break;
            case '3':
                write(c);
                break;
            case '4':
                write(c);
                break;
            case '5':
                write(c);
                break;
            case '6':
                write(c);
                break;
            case '7':
                write(c);
                break;
            case '8':
                write(c);
                break;
            case '9':
                write(c);
                break;
            case ':':
                write(c);
                break;
            case ';':
                write(c);
                break;
            case '<':
                out.write("&lt;");
                column += 4;
                lastCharacterWasSpace = false
                skipFollowingLinefeed = false;
                justBroke = false;
                break;
            case '=':
                write(c);
                break;
            case '>':
                out.write("&gt;");
                column += 4;
                lastCharacterWasSpace = false;  
                skipFollowingLinefeed = false;
                justBroke = false;
                break;
            default:
                if (needsEscaping(c)) writeEscapedChar(c);
                else write(c);
        }
        
    }
    
    
    private void writeEscapedChar(char cthrows IOException {

        if (isHighSurrogate(c)) {
            //store and wait for low half
            highSurrogate = c;
        }
        else if (isLowSurrogate(c)) {
            // decode and write entity reference
            // I am assuming here that nothing allows the
            // text to be created with a malformed surrogate
            // pair such as a low surrogate that is not immediately
            // preceded by a high surrogate
            int uchar = UnicodeUtil.combineSurrogatePair(highSurrogate, c);
            String s = "&#x" + Integer.toHexString(uchar).toUpperCase() ';';
            out.write(s);
            column += s.length();
            lastCharacterWasSpace = false;
            skipFollowingLinefeed = false;
            justBroke = false;
        }
        else {
            String s = "&#x" + Integer.toHexString(c).toUpperCase() ';';
            out.write(s);
            column += s.length();
            lastCharacterWasSpace = false;
            skipFollowingLinefeed = false;
            justBroke=false;
        }
        
    }


    private boolean adjustingWhiteSpace() {
        return maxLength > || indent > 0;
    }

    
    // This is the same as writePCDATA except that it
    // also needs to escape " as &quot; and tab as "&#x09;".
    // I'm not escaping the single quote because Serializer
    // always uses double quotes to contain 
    // values.
    final void writeAttributeValue(char c
      throws IOException {
        
        switch(c) {
            // Handle white space that the parser might normalize
            // on roundtrip. We only escape them if the serializer
            // is not adjusting white space; that is indent is 0
            // and maxLength is 0.
            case '\t':
                if (!adjustingWhiteSpace()) {
                    out.write("&#x09;");
                    column += 6;
                    lastCharacterWasSpace = true;
                    skipFollowingLinefeed = false;
                    justBroke=false;
                }
                else {
                    write(' ');
                }
                break;
            case '\n':
                if (skipFollowingLinefeed) {
                    skipFollowingLinefeed = false;
                    return;
                }
                else if (adjustingWhiteSpace()) {
                    out.write(" ");
                    lastCharacterWasSpace = true;
                    justBroke=false;
                }
                else {
                    if (lineSeparatorSet) {
                        escapeBreakLine();
                    }
                    else {
                        out.write("&#x0A;");
                        column += 6
                        justBroke=false;
                    }
                    lastCharacterWasSpace = true;
                }
                break;
            case 11:
                // unreachable
            case 12:
                // unreachable
                throw new RuntimeException("Bad character snuck into document");
            case '\r':
                if (adjustingWhiteSpace()) {
                    out.write(" ");
                    lastCharacterWasSpace = true;
                    skipFollowingLinefeed = true;  
                    justBroke=false;
                }
                else {
                    if (lineSeparatorSet) {
                        escapeBreakLine();
                        skipFollowingLinefeed = true;
                    }
                    else {
                        out.write("&#x0D;");
                        column += 6;
                        justBroke=false;
                    }
                }
                break;
            case 14:
                // unreachable
            case 15:
                // unreachable
            case 16:
                // unreachable
            case 17:
                // unreachable
            case 18:
                // unreachable
            case 19:
                // unreachable
            case 20:
                // unreachable
            case 21:
                // unreachable
            case 22:
                // unreachable
            case 23:
                // unreachable
            case 24:
                // unreachable
            case 25:
                // unreachable
            case 26:
                // unreachable
            case 27:
                // unreachable
            case 28:
                // unreachable
            case 29:
                // unreachable
            case 30:
                // unreachable
            case 31:
                // unreachable
                throw new RuntimeException("Bad character snuck into document");
            case ' ':
                write(c);
                break;
            case '!':
                write(c);
                break;
            case '"':
                out.write("&quot;");
                column += 6;
                lastCharacterWasSpace = false;
                skipFollowingLinefeed = false;
                justBroke=false;
                break;
            case '#':
                write(c);
                break;
            case '$':
                write(c);
                break;
            case '%':
                write(c);
                break;
            case '&':
                out.write("&amp;");
                column += 5;
                lastCharacterWasSpace = false;
                skipFollowingLinefeed = false
                justBroke = false;
                break;
            case '\'':
                write(c);
                break;
            case '(':
                write(c);
                break;
            case ')':
                write(c);
                break;
            case '*':
                write(c);
                break;
            case '+':
                write(c);
                break;
            case ',':
                write(c);
                break;
            case '-':
                write(c);
                break;
            case '.':
                write(c);
                break;
            case '/':
                write(c);
                break;
            case '0':
                write(c);
                break;
            case '1':
                write(c);
                break;
            case '2':
                write(c);
                break;
            case '3':
                write(c);
                break;
            case '4':
                write(c);
                break;
            case '5':
                write(c);
                break;
            case '6':
                write(c);
                break;
            case '7':
                write(c);
                break;
            case '8':
                write(c);
                break;
            case '9':
                write(c);
                break;
            case ':':
                write(c);
                break;
            case ';':
                write(c);
                break;
            case '<':
                out.write("&lt;");
                column += 4;
                lastCharacterWasSpace = false
                skipFollowingLinefeed = false;
                justBroke = false;
                break;
            case '=':
                write(c);
                break;
            case '>':
                out.write("&gt;");
                column += 4;
                lastCharacterWasSpace = false;  
                skipFollowingLinefeed = false;
                justBroke = false;
                break;
            default:
                if (needsEscaping(c)) writeEscapedChar(c);
                else write(c);
        }

    }

    
    // XXX We might be able to optimize this by using switch statements
    // in the methods that call this to separate out the special cases.
    // --\n, \t, space, etc.--and passing them to a different method
    // thus avoiding the if tests here. See if this method shows up as 
    // a HotSpot in profiling.
    void write(char cthrows IOException {
        
      // Carriage returns are completely handled by
      // writePCDATA and writeAttributeValue. They never
      // enter this method.
      if ((c == ' ' || c == '\n' || c == '\t')) {
            if (needsBreak()) {
                breakLine();
                skipFollowingLinefeed = false;
            }
            else if (preserveSpace || (indent <= && maxLength <= 0)) {
                // We're neither indenting nor wrapping
                // so we need to preserve white space
                if (c == ' ' ||  c == '\t') {
                    out.write(c);
                    skipFollowingLinefeed = false;
                    column++;
                    justBroke=false;
                
                else // (c == '\n')
                    if (!lineSeparatorSet ||
                        !skipFollowingLinefeed) {
                        writeLineSeparator(c);
                    
                    skipFollowingLinefeed = false;
                    column = 0;
                }   
            }
            else if (!lastCharacterWasSpace) {
                out.write(' ');
                column++;
                skipFollowingLinefeed = false;
                justBroke=false;
            }
            lastCharacterWasSpace = true;
        }
        else {  
            out.write(c);
            // don't increment column for high surrogate, only low surrogate
            if (c < 0xd800 || c > 0xDBFFcolumn++; 
            lastCharacterWasSpace = false;
            skipFollowingLinefeed = false;
            justBroke=false;
        
      
    }

    
    private void writeLineSeparator(char c
      throws IOException {
        
        if (!inDocType && (!lineSeparatorSet || preserveSpace)) out.write(c);
        else if (lineSeparator.equals("\r\n")) {
            out.write("\r\n");    
        
        else if (lineSeparator.equals("\n")) {
            out.write('\n');    
        
        else  // lineSeparator.equals("\r")) 
            out.write('\r');    
        
        // Remember, there are only three possible line separators

    }


    private boolean needsBreak() {
        
        if (maxLength <= || preserveSpacereturn false;
        // Better algorithm needed: Should look ahead in the 
        // stream, see if there's a white space character 
        // between here and the maxLength, Then again, simple is good.
        // Here we just assume there's probably space somewhere
        // within the next ten characters 
        
        return column >= maxLength - 10
        
    }
    
    
    protected boolean justBroke = false;
    
    boolean justBroke() {
        return justBroke;
    }
    
    
    final void breakLine() throws IOException {
        
        out.write(lineSeparator);
        out.write(indentString);
        column = indentString.length();
        lastCharacterWasSpace = true;
        justBroke = true;
        
    }
    
    
    private final void escapeBreakLine() throws IOException {
        
        if ("\n".equals(lineSeparator)) {
            out.write("&#x0A;");
            column += 6;
        }
        else if ("\r\n".equals(lineSeparator)) {
            out.write("&#x0D;&#x0A;");
            column += 12;
        }
        else {
            out.write("&#x0D;");
            column += 6;
        }
        lastCharacterWasSpace = true;
        
    }
    
    
    // Note that when this method is called directly, then 
    // normalization is not performed on c. Currently this is 
    // only called for ASCII characters like <, >, and the space, 
    // which should be OK
    final void writeMarkup(char cthrows IOException {
        
        if (needsEscaping(c)) {
            throw new RuntimeException("writeMarkup");
        }
        write(c);   

    }

    
    // XXX should we have a special package protected 
    // method to be used only for ASCII characters we know don't need escaping or
    // normalization such as <, /, A-Z, etc.?

    
    void writePCDATA(String sthrows IOException {
        
        s = normalize(s);
        int length = s.length();
        for (int i=0; i < length; i++) {
            writePCDATA(s.charAt(i));
        }   
        
    }


    void writeAttributeValue(String s
      throws IOException {
        
        s = normalize(s);
        int length = s.length();
        for (int i=0; i < length; i++) {
            writeAttributeValue(s.charAt(i));
        }
        
    }

    
    void writeMarkup(String sthrows IOException {
        
        s = normalize(s);
        int length = s.length();
        for (int i=0; i < length; i++) {
            writeMarkup(s.charAt(i));
        }
        
    }
    
    
    // This is for ASCII characters like < and = we know are
    // available in all encodings and do not need to be normalized
    void writeUncheckedMarkup(String sthrows IOException {
        
        int length = s.length();
        for (int i=0; i < length; i++) {
            write(s.charAt(i));
        }
        
    }
    
    
     protected String normalize(String s) {

        if (normalize) {
            return UnicodeUtil.normalize(s);
        }
        return s;
        
    }
    


   boolean isIndenting() {
        return indentString.length() 0;   
    }


    private int fakeIndents = 0;
    
    private final static String _128_SPACES="                                                                                                                                ";
    private final static int    _128 = 128;
    
    void incrementIndent() {
        
        if (indent == 0return;
        
        String newIndent;
        int length = indentString.length() + indent;
        if (indentString.length() + indent < _128) {
            newIndent = _128_SPACES.substring(0, length);
        }
        else {
            StringBuffer sb = new StringBuffer(length);
            sb.append(_128_SPACES);
            for (int i = _128; i < length; i++) {
                sb.append(' ');
            }
            newIndent = sb.toString();
        }
        
        // limit maximum indent to half of maximum line length
        if (maxLength > && newIndent.length() > maxLength / 2) {
            fakeIndents++; 
        }
        else this.indentString = newIndent;
        
    }
    
    
    void decrementIndent() {
        
        if (indent == 0return;
        else if (fakeIndents > 0fakeIndents--;
        else {
            indentString = indentString.substring(
              0, indentString.length()-indent
            );
        }
        
    }


    String getEncoding() {
        return this.encoding;   
    }

    
    /**
     * <p>
     * Returns the String used as a line separator.
     * This is always "\n", "\r", or "\r\n".
     * </p>
     
     @return the line separator
     */
    String getLineSeparator() {
        return lineSeparator;
    }

    
    /**
     * <p>
     * Sets the lineSeparator. This  
     * can only be one of the three
     * strings "\n", "\r", or "\r\n".
     * All other values are forbidden.
     * </p>
     
     @param lineSeparator the lineSeparator to set
     
     @throws IllegalArgumentException if you attempt to use 
     *      any line separator other than "\n", "\r", or "\r\n".
     
     */
    void setLineSeparator(String lineSeparator) {
        
        if (lineSeparator.equals("\n"
          || lineSeparator.equals("\r")
          || lineSeparator.equals("\r\n")) { 
            this.lineSeparator = lineSeparator;
            this.lineSeparatorSet = true;
        }
        else {
            throw new IllegalArgumentException(
              "Illegal Line Separator");
        }  
        
    }

    
    void setInDocType(boolean inDocType) {
        this.inDocType = inDocType;  
    }

    
    /**
     * <p>
     * Returns the number of spaces this serializer indents.
     * </p>
     
     @return the number of spaces this serializer indents
     */
    int getIndent() {
        return indent;
    }


    /**
     * <p>
     * Returns the maximum line length.
     * </p>
     
     @return the maximum line length.
     */
    int getMaxLength() {
        return maxLength;
    }

    /**
     * <p>
     * Sets the suggested maximum line length for this serializer.
     * In some circumstances this may not be respected.
     * </p>
     
     @param maxLength the maxLength to set
     */
    void setMaxLength(int maxLength) {
        if (maxLength < 0maxLength = 0;
        this.maxLength = maxLength;
    }

    
   /**
     * <p>
     * Sets the number of spaces to indent each successive level in the
     *  hierarchy. Use 0 for no extra indenting.
     * </p>
     
     @param indent the indent to set
     */
    void setIndent(int indent) {
        this.indent = indent;
    }


    void flush() throws IOException {
        out.flush();    
    }

    
    abstract boolean needsEscaping(char c);

    
    /**
     * <p>
     *  Used to track the current status of xml:space.
     *  This is false by default, unless an xml:space="preserve"
     *  attribute is in-scope. When such an attribute is in-scope,
     *  white space is not adjusted even if indenting and/or
     *  a maximum line length has been requested.
     * </p>
     *
     
     @return true if an <code>xml:space="true"</code> attribute 
     *      is in-scope
     */
    boolean isPreserveSpace() {
        return preserveSpace;
    }

    
    /**
     @param preserveSpace whether to preserve all white space
     */
    void setPreserveSpace(boolean preserveSpace) {
        this.preserveSpace = preserveSpace;
    }

    
    /**
     @return the current column number
     */
    int getColumnNumber() {
        return this.column;
    }

    
    /**
     * <p>
     *   If true, this property indicates serialization will
     *   perform Unicode normalization on all data using normalization
     *   form C (NFC). Performing Unicode normalization
     *   does change the document's infoset. 
     *   The default is false; do not normalize.
     * </p>
     
     * <p>
     *   This feature has not yet been benchmarked or optimized.
     *   It may result in substantially slower code. 
     * </p>
     
     @param normalize true if normalization is performed; 
     *     false if it isn't.
     */
    void setNFC(boolean normalize) {
        this.normalize = normalize;   
    }

    
    /**
     * <p>
     *   If true, this property indicates serialization will
     *   perform Unicode normalization on all data using normalization
     *   form C (NFC). The default is false; do not normalize.
     * </p>
     
     @return true if this serialization performs Unicode 
     *     normalization; false if it doesn't.
     */
    boolean getNFC() {
        return this.normalize;   
    }


    void writeName(String namethrows IOException {
        writeMarkup(name);
    }

    
}

/* Copyright 2005, 2009 Elliotte Rusty Harold

This library is free software; you can redistribute it and/or modify
it under the terms of version 2.1 of the GNU Lesser General Public 
License as published by the Free Software Foundation.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the 
Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
Boston, MA 02111-1307  USA

You can contact Elliotte Rusty Harold by sending e-mail to
elharo@metalab.unc.edu. Please include the word "XOM" in the
subject line. The XOM home page is located at http://www.xom.nu/
*/

/**
* <p>
*   
* </p>

@author Elliotte Rusty Harold
@version 1.2b3
*
*/
final class UnicodeUtil {
 
 
 private static final int CANONICAL_COMBINING_CLASS_NOT_REORDERED = 0;
 private static final int CANONICAL_COMBINING_CLASS_OVERLAY = 1;
 private static final int CANONICAL_COMBINING_CLASS_NUKTA = 7;
 private static final int CANONICAL_COMBINING_CLASS_KANA_VOICING = 8;
 private final static int CANONICAL_COMBINING_CLASS_VIRAMA = 9;
 private final static int CANONICAL_COMBINING_CLASS_10 = 10;
 private final static int CANONICAL_COMBINING_CLASS_11 = 11;
 private final static int CANONICAL_COMBINING_CLASS_12 = 12;
 private final static int CANONICAL_COMBINING_CLASS_13 = 13;
 private final static int CANONICAL_COMBINING_CLASS_14 = 14;
 private final static int CANONICAL_COMBINING_CLASS_15 = 15;
 private final static int CANONICAL_COMBINING_CLASS_16 = 16;
 private final static int CANONICAL_COMBINING_CLASS_17 = 17;
 private final static int CANONICAL_COMBINING_CLASS_18 = 18;
 private final static int CANONICAL_COMBINING_CLASS_19 = 19;
 private final static int CANONICAL_COMBINING_CLASS_20 = 20;
 private final static int CANONICAL_COMBINING_CLASS_21 = 21;
 private final static int CANONICAL_COMBINING_CLASS_22 = 22;
 private final static int CANONICAL_COMBINING_CLASS_23 = 23;
 private final static int CANONICAL_COMBINING_CLASS_24 = 24;
 private final static int CANONICAL_COMBINING_CLASS_25 = 25;
 private final static int CANONICAL_COMBINING_CLASS_26 = 26;
 private final static int CANONICAL_COMBINING_CLASS_27 = 27;
 private final static int CANONICAL_COMBINING_CLASS_28 = 28;
 private final static int CANONICAL_COMBINING_CLASS_29 = 29;
 private final static int CANONICAL_COMBINING_CLASS_30 = 30;
 private final static int CANONICAL_COMBINING_CLASS_31 = 31;
 private final static int CANONICAL_COMBINING_CLASS_32 = 32;
 private final static int CANONICAL_COMBINING_CLASS_33 = 33;
 private final static int CANONICAL_COMBINING_CLASS_34 = 34;
 private final static int CANONICAL_COMBINING_CLASS_35 = 35;
 private final static int CANONICAL_COMBINING_CLASS_36 = 36;
 private final static int CANONICAL_COMBINING_CLASS_84 = 84;
 private final static int CANONICAL_COMBINING_CLASS_91 = 91;
 private final static int CANONICAL_COMBINING_CLASS_103 = 103;
 private final static int CANONICAL_COMBINING_CLASS_107 = 107;
 private final static int CANONICAL_COMBINING_CLASS_118 = 118;
 private final static int CANONICAL_COMBINING_CLASS_122 = 122;
 private final static int CANONICAL_COMBINING_CLASS_129 = 129;
 private final static int CANONICAL_COMBINING_CLASS_130 = 130;
 private final static int CANONICAL_COMBINING_CLASS_132 = 132;
 private final static int CANONICAL_COMBINING_CLASS_ATTACHED_BELOW = 202;
 private static final int CANONICAL_COMBINING_CLASS_214 = 214;
 private static final int CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT = 216;
 private final static int CANONICAL_COMBINING_CLASS_BELOW_LEFT = 218;
 private final static int CANONICAL_COMBINING_CLASS_BELOW = 220;
 private final static int CANONICAL_COMBINING_CLASS_BELOW_RIGHT = 222;
 private final static int CANONICAL_COMBINING_CLASS_LEFT = 224;
 private final static int CANONICAL_COMBINING_CLASS_RIGHT = 226;
 private final static int CANONICAL_COMBINING_CLASS_ABOVE_LEFT = 228;
 private final static int CANONICAL_COMBINING_CLASS_ABOVE = 230;
 private final static int CANONICAL_COMBINING_CLASS_ABOVE_RIGHT = 232;
 private final static int CANONICAL_COMBINING_CLASS_DOUBLE_BELOW = 233;
 private final static int CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE = 234;
 private final static int CANONICAL_COMBINING_CLASS_IOTA_SUBSCRIPT = 240;

 
 private static boolean isHighSurrogate(char c) {
     return c >= HI_SURROGATE_START && c <= HI_SURROGATE_END;
 }
 
 
 private static int HI_SURROGATE_START  = 0xD800;
 private static int HI_SURROGATE_END    = 0xDBFF;
 private static int LOW_SURROGATE_START = 0xDC00;
 
 
 private static Map compositions;
 
 private static void loadCompositions() {
 
     ClassLoader loader = UnicodeUtil.class.getClassLoader();
     if (loader != nullloadCompositions(loader);
     // If that didn't work, try a different ClassLoader
     if (compositions == null) {
         loader = Thread.currentThread().getContextClassLoader();
         loadCompositions(loader);
     }
     if (compositions == null) { 
         throw new RuntimeException("Broken XOM installation: "
           "could not load nu/xom/compositions.dat");
     }
     
 }
 
 
 // XXX use a BiMap and make decompose much simpler?
 private static void loadCompositions(ClassLoader loader) {
     
     DataInputStream in = null;
     try {
         InputStream source = loader.getResourceAsStream("nu/xom/compositions.dat");
         in = new DataInputStream(source);
         // ???? would it make sense to store a serialized HashMap instead????
         compositions = new HashMap();
         try {
             while (true) {
                 String composed = in.readUTF();
                 String decomposed = in.readUTF();
                 compositions.put(decomposed, composed);
             }
         }
         catch (java.io.EOFException ex) {
             // finished
         }
     }
     catch (IOException ex) {
         return;
     }
     finally {
         try {
             if (in != nullin.close();
         }
         catch (IOException ex) {
             // no big deal
         }
     }
     
 }
 

 private static boolean isStarter(int character) {
     return getCombiningClass(character== 0;
 }


 private static int getCombiningClass(int character) {
     // ???? optimize with table lookup?
     
     if (character <= 0x2ffreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x314return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x315return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
     if (character <= 0x319return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x31areturn CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
     if (character <= 0x31breturn CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
     if (character <= 0x320return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x322return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
     if (character <= 0x326return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x328return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
     if (character <= 0x333return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x338return CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x33creturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x344return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x345return CANONICAL_COMBINING_CLASS_IOTA_SUBSCRIPT;
     if (character <= 0x346return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x349return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x34creturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x34ereturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x34freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x352return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x356return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x357return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x358return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
     if (character <= 0x35areturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x35breturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x35creturn CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
     if (character <= 0x35ereturn CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
     if (character <= 0x35freturn CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
     if (character <= 0x361return CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
     if (character <= 0x362return CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
     if (character <= 0x36freturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x482return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x487return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x590return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x591return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x595return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x596return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x599return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x59areturn CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
     if (character <= 0x59breturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x5a1return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x5a7return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x5a9return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x5aareturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x5acreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x5adreturn CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
     if (character <= 0x5aereturn CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
     if (character <= 0x5afreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x5b0return CANONICAL_COMBINING_CLASS_10;
     if (character <= 0x5b1return CANONICAL_COMBINING_CLASS_11;
     if (character <= 0x5b2return CANONICAL_COMBINING_CLASS_12;
     if (character <= 0x5b3return CANONICAL_COMBINING_CLASS_13;
     if (character <= 0x5b4return CANONICAL_COMBINING_CLASS_14;
     if (character <= 0x5b5return CANONICAL_COMBINING_CLASS_15;
     if (character <= 0x5b6return CANONICAL_COMBINING_CLASS_16;
     if (character <= 0x5b7return CANONICAL_COMBINING_CLASS_17;
     if (character <= 0x5b8return CANONICAL_COMBINING_CLASS_18;
     if (character <= 0x5bareturn CANONICAL_COMBINING_CLASS_19;
     if (character <= 0x5bbreturn CANONICAL_COMBINING_CLASS_20;
     if (character <= 0x5bcreturn CANONICAL_COMBINING_CLASS_21;
     if (character <= 0x5bdreturn CANONICAL_COMBINING_CLASS_22;
     if (character <= 0x5bereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x5bfreturn CANONICAL_COMBINING_CLASS_23;
     if (character <= 0x5c0return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x5c1return CANONICAL_COMBINING_CLASS_24;
     if (character <= 0x5c2return CANONICAL_COMBINING_CLASS_25;
     if (character <= 0x5c3return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x5c4return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x5c5return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x5c6return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x5c7return CANONICAL_COMBINING_CLASS_18;
     if (character <= 0x60freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x617return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x618return CANONICAL_COMBINING_CLASS_30;
     if (character <= 0x619return CANONICAL_COMBINING_CLASS_31;
     if (character <= 0x61areturn CANONICAL_COMBINING_CLASS_32;
     if (character <= 0x64areturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x64breturn CANONICAL_COMBINING_CLASS_27;
     if (character <= 0x64creturn CANONICAL_COMBINING_CLASS_28;
     if (character <= 0x64dreturn CANONICAL_COMBINING_CLASS_29;
     if (character <= 0x64ereturn CANONICAL_COMBINING_CLASS_30;
     if (character <= 0x64freturn CANONICAL_COMBINING_CLASS_31;
     if (character <= 0x650return CANONICAL_COMBINING_CLASS_32;
     if (character <= 0x651return CANONICAL_COMBINING_CLASS_33;
     if (character <= 0x652return CANONICAL_COMBINING_CLASS_34;
     if (character <= 0x654return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x656return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x65breturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x65creturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x65ereturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x66freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x670return CANONICAL_COMBINING_CLASS_35;
     if (character <= 0x6d5return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x6dcreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x6dereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x6e2return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x6e3return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x6e4return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x6e6return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x6e8return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x6e9return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x6eareturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x6ecreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x6edreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x710return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x711return CANONICAL_COMBINING_CLASS_36;
     if (character <= 0x72freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x730return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x731return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x733return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x734return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x736return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x739return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x73areturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x73creturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x73dreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x73ereturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x741return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x742return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x743return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x744return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x745return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x746return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x747return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x748return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x74areturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x7eareturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x7f1return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x7f2return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x7f3return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x93breturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x93creturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0x94creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x94dreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x950return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x951return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x952return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x954return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x9bbreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x9bcreturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0x9ccreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x9cdreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xa3breturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa3creturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0xa4creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa4dreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xabbreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xabcreturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0xaccreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xacdreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xb3breturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xb3creturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0xb4creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xb4dreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xbccreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xbcdreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xc4creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xc4dreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xc54return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xc55return CANONICAL_COMBINING_CLASS_84;
     if (character <= 0xc56return CANONICAL_COMBINING_CLASS_91;
     if (character <= 0xcbbreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xcbcreturn CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0xcccreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xccdreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xd4creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xd4dreturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xdc9return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xdcareturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xe37return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xe39return CANONICAL_COMBINING_CLASS_103;
     if (character <= 0xe3areturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xe47return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xe4breturn CANONICAL_COMBINING_CLASS_107;
     if (character <= 0xeb7return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xeb9return CANONICAL_COMBINING_CLASS_118;
     if (character <= 0xec7return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xecbreturn CANONICAL_COMBINING_CLASS_122;
     if (character <= 0xf17return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf19return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0xf34return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf35return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0xf36return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf37return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0xf38return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf39return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
     if (character <= 0xf70return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf71return CANONICAL_COMBINING_CLASS_129;
     if (character <= 0xf72return CANONICAL_COMBINING_CLASS_130;
     if (character <= 0xf73return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf74return CANONICAL_COMBINING_CLASS_132;
     if (character <= 0xf79return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf7dreturn CANONICAL_COMBINING_CLASS_130;
     if (character <= 0xf7freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf80return CANONICAL_COMBINING_CLASS_130;
     if (character <= 0xf81return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf83return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0xf84return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xf85return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xf87return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0xfc5return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xfc6return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1036return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1037return CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0x1038return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x103areturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x108creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x108dreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x135ereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x135freturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1713return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1714return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x1733return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1734return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x17d1return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x17d2return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x17dcreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x17ddreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x18a8return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x18a9return CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
     if (character <= 0x1938return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1939return CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
     if (character <= 0x193areturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x193breturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1a16return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1a17return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1a18return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1b33return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1b34return CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0x1b43return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1b44return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x1b6areturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1b6breturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1b6creturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1b73return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1ba9return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1baareturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x1c36return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1c37return CANONICAL_COMBINING_CLASS_NUKTA;
     if (character <= 0x1dbfreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1dc1return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1dc2return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1dc9return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1dcareturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1dccreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1dcdreturn CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
     if (character <= 0x1dcereturn CANONICAL_COMBINING_CLASS_214;
     if (character <= 0x1dcfreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1dd0return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
     if (character <= 0x1de6return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1dfdreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1dfereturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1dffreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x20cfreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x20d1return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20d3return CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x20d7return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20dareturn CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x20dcreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20e0return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x20e1return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20e4return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x20e6return CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x20e7return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20e8return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x20e9return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x20ebreturn CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x20efreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x20f0return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x2ddfreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x2dffreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x3029return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x302areturn CANONICAL_COMBINING_CLASS_BELOW_LEFT;
     if (character <= 0x302breturn CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
     if (character <= 0x302creturn CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
     if (character <= 0x302dreturn CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
     if (character <= 0x302freturn CANONICAL_COMBINING_CLASS_LEFT;
     if (character <= 0x3098return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x309areturn CANONICAL_COMBINING_CLASS_KANA_VOICING;
     if (character <= 0xa66ereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa66freturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0xa67breturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa67dreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0xa805return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa806return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xa8c3return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa8c4return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xa92areturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa92dreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0xa952return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xa953return CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0xfb1dreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xfb1ereturn CANONICAL_COMBINING_CLASS_26;
     if (character <= 0xfe1freturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0xfe26return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x101fcreturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x101fdreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x10a0creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x10a0dreturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x10a0ereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x10a0freturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x10a37return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x10a38return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x10a39return CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x10a3areturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x10a3ereturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x10a3freturn CANONICAL_COMBINING_CLASS_VIRAMA;
     if (character <= 0x1d164return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d166return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
     if (character <= 0x1d169return CANONICAL_COMBINING_CLASS_OVERLAY;
     if (character <= 0x1d16creturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d16dreturn CANONICAL_COMBINING_CLASS_RIGHT;
     if (character <= 0x1d172return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
     if (character <= 0x1d17areturn CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d182return CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1d184return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d189return CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1d18breturn CANONICAL_COMBINING_CLASS_BELOW;
     if (character <= 0x1d1a9return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d1adreturn CANONICAL_COMBINING_CLASS_ABOVE;
     if (character <= 0x1d241return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
     if (character <= 0x1d244return CANONICAL_COMBINING_CLASS_ABOVE;

     
     return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
 }
 
 
 private final static int FIRST_HANGUL_SYLLABLE    = 0xAC00;
 // even if this is not right; why do tests still pass????
 // private final static int LAST_HANGUL_SYLLABLE     = 0xAC00; // FIXME 
 private final static int LAST_HANGUL_SYLLABLE = 0xD7A3;

 
 static int combineSurrogatePair(char highSurrogate, char lowSurrogate) {

     int high = highSurrogate & 0x7FF;
     int low  = lowSurrogate - 0xDC00;
     int highShifted = high << 10;
     int combined = highShifted | low; 
     int codePoint = combined + 0x10000;
     return codePoint;
     
 }

 private static String makeSurrogatePair(int codePoint) {

     StringBuffer s = new StringBuffer(2);
     if (codePoint <= 0xFFFFs.append((charcodePoint);
     else {
         char high = (char) (0xD800 (0x10000 >> 10(codePoint >> 10));
         char low = (char) (0xDC00 (codePoint & 0x3FF));
         s.append(high);
         s.append(low);
     }
     return s.toString();
     
 }

 private static char getHighSurrogate(int codepoint) {

     char x = (charcodepoint;
     int u = (codepoint >> 16((1<<51);
     char w = (char) (u - 1);
     return (char) (HI_SURROGATE_START | (w << 6| x >> 10);
     
 }


 private static char getLowSurrogate(int codepoint) {

     char x = (charcodepoint;
     return (char) (LOW_SURROGATE_START | x & ((1<<101));
     
 }
 

 static String normalize(String s) {

     boolean needsNormalizing = false;
         
     int length = s.length();
     for (int i = 0; i < length; i++) {
         char c = s.charAt(i);
         if (c > 255) {
             needsNormalizing = true;
             break;
         }
     
     
     if (needsNormalizing) {
         
         // ???? unnecessarily invoking this in many cases
         s = decomposeHangul(s);
         UnicodeString ustring = new UnicodeString(s);
         UnicodeString decomposed = ustring.decompose()
         UnicodeString recomposed = decomposed.compose();
         String result = recomposed.toString();
         // ???? unnecessarily invoking this in many cases
         result = composeHangul(result);
         return result;
     }
     
     return s;
     
 }

  
 private static String decomposeHangul(String s) {

     int length = s.length();
     StringBuffer sb = new StringBuffer(s.length());
     for (int i = 0; i < length; i++) {
         char c = s.charAt(i);
         if (c >= FIRST_HANGUL_SYLLABLE && c <= LAST_HANGUL_SYLLABLE) {
             sb.append(decomposeHangul(c));
         }
         else {
             sb.append(c);
         }
     }
     return sb.toString();
     
 }

 
 // return -1 if the character cannot be combined with the starter; 
 // otherwise return the composed character
 private static int composeCharacter(int starter, int c) {
     
     StringBuffer decomposed = new StringBuffer(4);
     
     if (starter > 0xFFFF) {
         decomposed.append(getHighSurrogate(starter));
         decomposed.append(getLowSurrogate(starter));
     }
     else decomposed.append((charstarter);
     
     if (c > 0xFFFF) {
         decomposed.append(getHighSurrogate(c));
         decomposed.append(getLowSurrogate(c));
     }
     else decomposed.append((charc);
     
     String recomposed = (Stringcompositions.get(decomposed.toString());
     if (recomposed == nullreturn -1;
     else if (recomposed.length() == 1return recomposed.charAt(0);
     else return combineSurrogatePair(recomposed.charAt(0), recomposed.charAt(1));

 }

 
 // FIXME must recurse this
 ///CLOVER:OFF
 private static String decompose(int character) {
     
     if (character < 0x00C0) {
         return String.valueOf((charcharacter);
     }
     else if (character >= FIRST_HANGUL_SYLLABLE && character <= LAST_HANGUL_SYLLABLE) {
         return decomposeHangul((charcharacter);
     }
     
     // XXX use lookup table prepopulated with large string at first use
     switch (character) {
     case 0x00C0:
         return "\u0041\u0300";
     case 0x00C1:
         return "\u0041\u0301";
     case 0x00C2:
         return "\u0041\u0302";
     case 0x00C3:
         return "\u0041\u0303";
     case 0x00C4:
         return "\u0041\u0308";
     case 0x00C5:
         return "\u0041\u030A";
     case 0x00C7:
         return "\u0043\u0327";
     case 0x00C8:
         return "\u0045\u0300";
     case 0x00C9:
         return "\u0045\u0301";
     case 0x00CA:
         return "\u0045\u0302";
     case 0x00CB:
         return "\u0045\u0308";
     case 0x00CC:
         return "\u0049\u0300";
     case 0x00CD:
         return "\u0049\u0301";
     case 0x00CE:
         return "\u0049\u0302";
     case 0x00CF:
         return "\u0049\u0308";
     case 0x00D1:
         return "\u004E\u0303";
     case 0x00D2:
         return "\u004F\u0300";
     case 0x00D3:
         return "\u004F\u0301";
     case 0x00D4:
         return "\u004F\u0302";
     case 0x00D5:
         return "\u004F\u0303";
     case 0x00D6:
         return "\u004F\u0308";
     case 0x00D9:
         return "\u0055\u0300";
     case 0x00DA:
         return "\u0055\u0301";
     case 0x00DB:
         return "\u0055\u0302";
     case 0x00DC:
         return "\u0055\u0308";
     case 0x00DD:
         return "\u0059\u0301";
     case 0x00E0:
         return "\u0061\u0300";
     case 0x00E1:
         return "\u0061\u0301";
     case 0x00E2:
         return "\u0061\u0302";
     case 0x00E3:
         return "\u0061\u0303";
     case 0x00E4:
         return "\u0061\u0308";
     case 0x00E5:
         return "\u0061\u030A";
     case 0x00E7:
         return "\u0063\u0327";
     case 0x00E8:
         return "\u0065\u0300";
     case 0x00E9:
         return "\u0065\u0301";
     case 0x00EA:
         return "\u0065\u0302";
     case 0x00EB:
         return "\u0065\u0308";
     case 0x00EC:
         return "\u0069\u0300";
     case 0x00ED:
         return "\u0069\u0301";
     case 0x00EE:
         return "\u0069\u0302";
     case 0x00EF:
         return "\u0069\u0308";
     case 0x00F1:
         return "\u006E\u0303";
     case 0x00F2:
         return "\u006F\u0300";
     case 0x00F3:
         return "\u006F\u0301";
     case 0x00F4:
         return "\u006F\u0302";
     case 0x00F5:
         return "\u006F\u0303";
     case 0x00F6:
         return "\u006F\u0308";
     case 0x00F9:
         return "\u0075\u0300";
     case 0x00FA:
         return "\u0075\u0301";
     case 0x00FB:
         return "\u0075\u0302";
     case 0x00FC:
         return "\u0075\u0308";
     case 0x00FD:
         return "\u0079\u0301";
     case 0x00FF:
         return "\u0079\u0308";
     case 0x0100:
         return "\u0041\u0304";
     case 0x0101:
         return "\u0061\u0304";
     case 0x0102:
         return "\u0041\u0306";
     case 0x0103:
         return "\u0061\u0306";
     case 0x0104:
         return "\u0041\u0328";
     case 0x0105:
         return "\u0061\u0328";
     case 0x0106:
         return "\u0043\u0301";
     case 0x0107:
         return "\u0063\u0301";
     case 0x0108:
         return "\u0043\u0302";
     case 0x0109:
         return "\u0063\u0302";
     case 0x010A:
         return "\u0043\u0307";
     case 0x010B:
         return "\u0063\u0307";
     case 0x010C:
         return "\u0043\u030C";
     case 0x010D:
         return "\u0063\u030C";
     case 0x010E:
         return "\u0044\u030C";
     case 0x010F:
         return "\u0064\u030C";
     case 0x0112:
         return "\u0045\u0304";
     case 0x0113:
         return "\u0065\u0304";
     case 0x0114:
         return "\u0045\u0306";
     case 0x0115:
         return "\u0065\u0306";
     case 0x0116:
         return "\u0045\u0307";
     case 0x0117:
         return "\u0065\u0307";
     case 0x0118:
         return "\u0045\u0328";
     case 0x0119:
         return "\u0065\u0328";
     case 0x011A:
         return "\u0045\u030C";
     case 0x011B:
         return "\u0065\u030C";
     case 0x011C:
         return "\u0047\u0302";
     case 0x011D:
         return "\u0067\u0302";
     case 0x011E:
         return "\u0047\u0306";
     case 0x011F:
         return "\u0067\u0306";
     case 0x0120:
         return "\u0047\u0307";
     case 0x0121:
         return "\u0067\u0307";
     case 0x0122:
         return "\u0047\u0327";
     case 0x0123:
         return "\u0067\u0327";
     case 0x0124:
         return "\u0048\u0302";
     case 0x0125:
         return "\u0068\u0302";
     case 0x0128:
         return "\u0049\u0303";
     case 0x0129:
         return "\u0069\u0303";
     case 0x012A:
         return "\u0049\u0304";
     case 0x012B:
         return "\u0069\u0304";
     case 0x012C:
         return "\u0049\u0306";
     case 0x012D:
         return "\u0069\u0306";
     case 0x012E:
         return "\u0049\u0328";
     case 0x012F:
         return "\u0069\u0328";
     case 0x0130:
         return "\u0049\u0307";
     case 0x0134:
         return "\u004A\u0302";
     case 0x0135:
         return "\u006A\u0302";
     case 0x0136:
         return "\u004B\u0327";
     case 0x0137:
         return "\u006B\u0327";
     case 0x0139:
         return "\u004C\u0301";
     case 0x013A:
         return "\u006C\u0301";
     case 0x013B:
         return "\u004C\u0327";
     case 0x013C:
         return "\u006C\u0327";
     case 0x013D:
         return "\u004C\u030C";
     case 0x013E:
         return "\u006C\u030C";
     case 0x0143:
         return "\u004E\u0301";
     case 0x0144:
         return "\u006E\u0301";
     case 0x0145:
         return "\u004E\u0327";
     case 0x0146:
         return "\u006E\u0327";
     case 0x0147:
         return "\u004E\u030C";
     case 0x0148:
         return "\u006E\u030C";
     case 0x014C:
         return "\u004F\u0304";
     case 0x014D:
         return "\u006F\u0304";
     case 0x014E:
         return "\u004F\u0306";
     case 0x014F:
         return "\u006F\u0306";
     case 0x0150:
         return "\u004F\u030B";
     case 0x0151:
         return "\u006F\u030B";
     case 0x0154:
         return "\u0052\u0301";
     case 0x0155:
         return "\u0072\u0301";
     case 0x0156:
         return "\u0052\u0327";
     case 0x0157:
         return "\u0072\u0327";
     case 0x0158:
         return "\u0052\u030C";
     case 0x0159:
         return "\u0072\u030C";
     case 0x015A:
         return "\u0053\u0301";
     case 0x015B:
         return "\u0073\u0301";
     case 0x015C:
         return "\u0053\u0302";
     case 0x015D:
         return "\u0073\u0302";
     case 0x015E:
         return "\u0053\u0327";
     case 0x015F:
         return "\u0073\u0327";
     case 0x0160:
         return "\u0053\u030C";
     case 0x0161:
         return "\u0073\u030C";
     case 0x0162:
         return "\u0054\u0327";
     case 0x0163:
         return "\u0074\u0327";
     case 0x0164:
         return "\u0054\u030C";
     case 0x0165:
         return "\u0074\u030C";
     case 0x0168:
         return "\u0055\u0303";
     case 0x0169:
         return "\u0075\u0303";
     case 0x016A:
         return "\u0055\u0304";
     case 0x016B:
         return "\u0075\u0304";
     case 0x016C:
         return "\u0055\u0306";
     case 0x016D:
         return "\u0075\u0306";
     case 0x016E:
         return "\u0055\u030A";
     case 0x016F:
         return "\u0075\u030A";
     case 0x0170:
         return "\u0055\u030B";
     case 0x0171:
         return "\u0075\u030B";
     case 0x0172:
         return "\u0055\u0328";
     case 0x0173:
         return "\u0075\u0328";
     case 0x0174:
         return "\u0057\u0302";
     case 0x0175:
         return "\u0077\u0302";
     case 0x0176:
         return "\u0059\u0302";
     case 0x0177:
         return "\u0079\u0302";
     case 0x0178:
         return "\u0059\u0308";
     case 0x0179:
         return "\u005A\u0301";
     case 0x017A:
         return "\u007A\u0301";
     case 0x017B:
         return "\u005A\u0307";
     case 0x017C:
         return "\u007A\u0307";
     case 0x017D:
         return "\u005A\u030C";
     case 0x017E:
         return "\u007A\u030C";
     case 0x01A0:
         return "\u004F\u031B";
     case 0x01A1:
         return "\u006F\u031B";
     case 0x01AF:
         return "\u0055\u031B";
     case 0x01B0:
         return "\u0075\u031B";
     case 0x01CD:
         return "\u0041\u030C";
     case 0x01CE:
         return "\u0061\u030C";
     case 0x01CF:
         return "\u0049\u030C";
     case 0x01D0:
         return "\u0069\u030C";
     case 0x01D1:
         return "\u004F\u030C";
     case 0x01D2:
         return "\u006F\u030C";
     case 0x01D3:
         return "\u0055\u030C";
     case 0x01D4:
         return "\u0075\u030C";
     case 0x01D5:
         return "\u00DC\u0304";
     case 0x01D6:
         return "\u00FC\u0304";
     case 0x01D7:
         return "\u00DC\u0301";
     case 0x01D8:
         return "\u00FC\u0301";
     case 0x01D9:
         return "\u00DC\u030C";
     case 0x01DA:
         return "\u00FC\u030C";
     case 0x01DB:
         return "\u00DC\u0300";
     case 0x01DC:
         return "\u00FC\u0300";
     case 0x01DE:
         return "\u00C4\u0304";
     case 0x01DF:
         return "\u00E4\u0304";
     case 0x01E0:
         return "\u0226\u0304";
     case 0x01E1:
         return "\u0227\u0304";
     case 0x01E2:
         return "\u00C6\u0304";
     case 0x01E3:
         return "\u00E6\u0304";
     case 0x01E6:
         return "\u0047\u030C";
     case 0x01E7:
         return "\u0067\u030C";
     case 0x01E8:
         return "\u004B\u030C";
     case 0x01E9:
         return "\u006B\u030C";
     case 0x01EA:
         return "\u004F\u0328";
     case 0x01EB:
         return "\u006F\u0328";
     case 0x01EC:
         return "\u01EA\u0304";
     case 0x01ED:
         return "\u01EB\u0304";
     case 0x01EE:
         return "\u01B7\u030C";
     case 0x01EF:
         return "\u0292\u030C";
     case 0x01F0:
         return "\u006A\u030C";
     case 0x01F4:
         return "\u0047\u0301";
     case 0x01F5:
         return "\u0067\u0301";
     case 0x01F8:
         return "\u004E\u0300";
     case 0x01F9:
         return "\u006E\u0300";
     case 0x01FA:
         return "\u00C5\u0301";
     case 0x01FB:
         return "\u00E5\u0301";
     case 0x01FC:
         return "\u00C6\u0301";
     case 0x01FD:
         return "\u00E6\u0301";
     case 0x01FE:
         return "\u00D8\u0301";
     case 0x01FF:
         return "\u00F8\u0301";
     case 0x0200:
         return "\u0041\u030F";
     case 0x0201:
         return "\u0061\u030F";
     case 0x0202:
         return "\u0041\u0311";
     case 0x0203:
         return "\u0061\u0311";
     case 0x0204:
         return "\u0045\u030F";
     case 0x0205:
         return "\u0065\u030F";
     case 0x0206:
         return "\u0045\u0311";
     case 0x0207:
         return "\u0065\u0311";
     case 0x0208:
         return "\u0049\u030F";
     case 0x0209:
         return "\u0069\u030F";
     case 0x020A:
         return "\u0049\u0311";
     case 0x020B:
         return "\u0069\u0311";
     case 0x020C:
         return "\u004F\u030F";
     case 0x020D:
         return "\u006F\u030F";
     case 0x020E:
         return "\u004F\u0311";
     case 0x020F:
         return "\u006F\u0311";
     case 0x0210:
         return "\u0052\u030F";
     case 0x0211:
         return "\u0072\u030F";
     case 0x0212:
         return "\u0052\u0311";
     case 0x0213:
         return "\u0072\u0311";
     case 0x0214:
         return "\u0055\u030F";
     case 0x0215:
         return "\u0075\u030F";
     case 0x0216:
         return "\u0055\u0311";
     case 0x0217:
         return "\u0075\u0311";
     case 0x0218:
         return "\u0053\u0326";
     case 0x0219:
         return "\u0073\u0326";
     case 0x021A:
         return "\u0054\u0326";
     case 0x021B:
         return "\u0074\u0326";
     case 0x021E:
         return "\u0048\u030C";
     case 0x021F:
         return "\u0068\u030C";
     case 0x0226:
         return "\u0041\u0307";
     case 0x0227:
         return "\u0061\u0307";
     case 0x0228:
         return "\u0045\u0327";
     case 0x0229:
         return "\u0065\u0327";
     case 0x022A:
         return "\u00D6\u0304";
     case 0x022B:
         return "\u00F6\u0304";
     case 0x022C:
         return "\u00D5\u0304";
     case 0x022D:
         return "\u00F5\u0304";
     case 0x022E:
         return "\u004F\u0307";
     case 0x022F:
         return "\u006F\u0307";
     case 0x0230:
         return "\u022E\u0304";
     case 0x0231:
         return "\u022F\u0304";
     case 0x0232:
         return "\u0059\u0304";
     case 0x0233:
         return "\u0079\u0304";
     case 0x0340:
         return "\u0300";
     case 0x0341:
         return "\u0301";
     case 0x0343:
         return "\u0313";
     case 0x0344:
         return "\u0308\u0301";
     case 0x0374:
         return "\u02B9";
     case 0x037E:
         return "\u003B";
     case 0x0385:
         return "\u00A8\u0301";
     case 0x0386:
         return "\u0391\u0301";
     case 0x0387:
         return "\u00B7";
     case 0x0388:
         return "\u0395\u0301";
     case 0x0389:
         return "\u0397\u0301";
     case 0x038A:
         return "\u0399\u0301";
     case 0x038C:
         return "\u039F\u0301";
     case 0x038E:
         return "\u03A5\u0301";
     case 0x038F:
         return "\u03A9\u0301";
     case 0x0390:
         return "\u03CA\u0301";
     case 0x03AA:
         return "\u0399\u0308";
     case 0x03AB:
         return "\u03A5\u0308";
     case 0x03AC:
         return "\u03B1\u0301";
     case 0x03AD:
         return "\u03B5\u0301";
     case 0x03AE:
         return "\u03B7\u0301";
     case 0x03AF:
         return "\u03B9\u0301";
     case 0x03B0:
         return "\u03CB\u0301";
     case 0x03CA:
         return "\u03B9\u0308";
     case 0x03CB:
         return "\u03C5\u0308";
     case 0x03CC:
         return "\u03BF\u0301";
     case 0x03CD:
         return "\u03C5\u0301";
     case 0x03CE:
         return "\u03C9\u0301";
     case 0x03D3:
         return "\u03D2\u0301";
     case 0x03D4:
         return "\u03D2\u0308";
     case 0x0400:
         return "\u0415\u0300";
     case 0x0401:
         return "\u0415\u0308";
     case 0x0403:
         return "\u0413\u0301";
     case 0x0407:
         return "\u0406\u0308";
     case 0x040C:
         return "\u041A\u0301";
     case 0x040D:
         return "\u0418\u0300";
     case 0x040E:
         return "\u0423\u0306";
     case 0x0419:
         return "\u0418\u0306";
     case 0x0439:
         return "\u0438\u0306";
     case 0x0450:
         return "\u0435\u0300";
     case 0x0451:
         return "\u0435\u0308";
     case 0x0453:
         return "\u0433\u0301";
     case 0x0457:
         return "\u0456\u0308";
     case 0x045C:
         return "\u043A\u0301";
     case 0x045D:
         return "\u0438\u0300";
     case 0x045E:
         return "\u0443\u0306";
     case 0x0476:
         return "\u0474\u030F";
     case 0x0477:
         return "\u0475\u030F";
     case 0x04C1:
         return "\u0416\u0306";
     case 0x04C2:
         return "\u0436\u0306";
     case 0x04D0:
         return "\u0410\u0306";
     case 0x04D1:
         return "\u0430\u0306";
     case 0x04D2:
         return "\u0410\u0308";
     case 0x04D3:
         return "\u0430\u0308";
     case 0x04D6:
         return "\u0415\u0306";
     case 0x04D7:
         return "\u0435\u0306";
     case 0x04DA:
         return "\u04D8\u0308";
     case 0x04DB:
         return "\u04D9\u0308";
     case 0x04DC:
         return "\u0416\u0308";
     case 0x04DD:
         return "\u0436\u0308";
     case 0x04DE:
         return "\u0417\u0308";
     case 0x04DF:
         return "\u0437\u0308";
     case 0x04E2:
         return "\u0418\u0304";
     case 0x04E3:
         return "\u0438\u0304";
     case 0x04E4:
         return "\u0418\u0308";
     case 0x04E5:
         return "\u0438\u0308";
     case 0x04E6:
         return "\u041E\u0308";
     case 0x04E7:
         return "\u043E\u0308";
     case 0x04EA:
         return "\u04E8\u0308";
     case 0x04EB:
         return "\u04E9\u0308";
     case 0x04EC:
         return "\u042D\u0308";
     case 0x04ED:
         return "\u044D\u0308";
     case 0x04EE:
         return "\u0423\u0304";
     case 0x04EF:
         return "\u0443\u0304";
     case 0x04F0:
         return "\u0423\u0308";
     case 0x04F1:
         return "\u0443\u0308";
     case 0x04F2:
         return "\u0423\u030B";
     case 0x04F3:
         return "\u0443\u030B";
     case 0x04F4:
         return "\u0427\u0308";
     case 0x04F5:
         return "\u0447\u0308";
     case 0x04F8:
         return "\u042B\u0308";
     case 0x04F9:
         return "\u044B\u0308";
     case 0x0622:
         return "\u0627\u0653";
     case 0x0623:
         return "\u0627\u0654";
     case 0x0624:
         return "\u0648\u0654";
     case 0x0625:
         return "\u0627\u0655";
     case 0x0626:
         return "\u064A\u0654";
     case 0x06C0:
         return "\u06D5\u0654";
     case 0x06C2:
         return "\u06C1\u0654";
     case 0x06D3:
         return "\u06D2\u0654";
     case 0x0929:
         return "\u0928\u093C";
     case 0x0931:
         return "\u0930\u093C";
     case 0x0934:
         return "\u0933\u093C";
     case 0x0958:
         return "\u0915\u093C";
     case 0x0959:
         return "\u0916\u093C";
     case 0x095A:
         return "\u0917\u093C";
     case 0x095B:
         return "\u091C\u093C";
     case 0x095C:
         return "\u0921\u093C";
     case 0x095D:
         return "\u0922\u093C";
     case 0x095E:
         return "\u092B\u093C";
     case 0x095F:
         return "\u092F\u093C";
     case 0x09CB:
         return "\u09C7\u09BE";
     case 0x09CC:
         return "\u09C7\u09D7";
     case 0x09DC:
         return "\u09A1\u09BC";
     case 0x09DD:
         return "\u09A2\u09BC";
     case 0x09DF:
         return "\u09AF\u09BC";
     case 0x0A33:
         return "\u0A32\u0A3C";
     case 0x0A36:
         return "\u0A38\u0A3C";
     case 0x0A59:
         return "\u0A16\u0A3C";
     case 0x0A5A:
         return "\u0A17\u0A3C";
     case 0x0A5B:
         return "\u0A1C\u0A3C";
     case 0x0A5E:
         return "\u0A2B\u0A3C";
     case 0x0B48:
         return "\u0B47\u0B56";
     case 0x0B4B:
         return "\u0B47\u0B3E";
     case 0x0B4C:
         return "\u0B47\u0B57";
     case 0x0B5C:
         return "\u0B21\u0B3C";
     case 0x0B5D:
         return "\u0B22\u0B3C";
     case 0x0B94:
         return "\u0B92\u0BD7";
     case 0x0BCA:
         return "\u0BC6\u0BBE";
     case 0x0BCB:
         return "\u0BC7\u0BBE";
     case 0x0BCC:
         return "\u0BC6\u0BD7";
     case 0x0C48:
         return "\u0C46\u0C56";
     case 0x0CC0:
         return "\u0CBF\u0CD5";
     case 0x0CC7:
         return "\u0CC6\u0CD5";
     case 0x0CC8:
         return "\u0CC6\u0CD6";
     case 0x0CCA:
         return "\u0CC6\u0CC2";
     case 0x0CCB:
         return "\u0CCA\u0CD5";
     case 0x0D4A:
         return "\u0D46\u0D3E";
     case 0x0D4B:
         return "\u0D47\u0D3E";
     case 0x0D4C:
         return "\u0D46\u0D57";
     case 0x0DDA:
         return "\u0DD9\u0DCA";
     case 0x0DDC:
         return "\u0DD9\u0DCF";
     case 0x0DDD:
         return "\u0DDC\u0DCA";
     case 0x0DDE:
         return "\u0DD9\u0DDF";
     case 0x0F43:
         return "\u0F42\u0FB7";
     case 0x0F4D:
         return "\u0F4C\u0FB7";
     case 0x0F52:
         return "\u0F51\u0FB7";
     case 0x0F57:
         return "\u0F56\u0FB7";
     case 0x0F5C:
         return "\u0F5B\u0FB7";
     case 0x0F69:
         return "\u0F40\u0FB5";
     case 0x0F73:
         return "\u0F71\u0F72";
     case 0x0F75:
         return "\u0F71\u0F74";
     case 0x0F76:
         return "\u0FB2\u0F80";
     case 0x0F78:
         return "\u0FB3\u0F80";
     case 0x0F81:
         return "\u0F71\u0F80";
     case 0x0F93:
         return "\u0F92\u0FB7";
     case 0x0F9D:
         return "\u0F9C\u0FB7";
     case 0x0FA2:
         return "\u0FA1\u0FB7";
     case 0x0FA7:
         return "\u0FA6\u0FB7";
     case 0x0FAC:
         return "\u0FAB\u0FB7";
     case 0x0FB9:
         return "\u0F90\u0FB5";
     case 0x1026:
         return "\u1025\u102E";
     case 0x1B06:
         return "\u1B05\u1B35";
     case 0x1B08:
         return "\u1B07\u1B35";
     case 0x1B0A:
         return "\u1B09\u1B35";
     case 0x1B0C:
         return "\u1B0B\u1B35";
     case 0x1B0E:
         return "\u1B0D\u1B35";
     case 0x1B12:
         return "\u1B11\u1B35";
     case 0x1B3B:
         return "\u1B3A\u1B35";
     case 0x1B3D:
         return "\u1B3C\u1B35";
     case 0x1B40:
         return "\u1B3E\u1B35";
     case 0x1B41:
         return "\u1B3F\u1B35";
     case 0x1B43:
         return "\u1B42\u1B35";
     case 0x1E00:
         return "\u0041\u0325";
     case 0x1E01:
         return "\u0061\u0325";
     case 0x1E02:
         return "\u0042\u0307";
     case 0x1E03:
         return "\u0062\u0307";
     case 0x1E04:
         return "\u0042\u0323";
     case 0x1E05:
         return "\u0062\u0323";
     case 0x1E06:
         return "\u0042\u0331";
     case 0x1E07:
         return "\u0062\u0331";
     case 0x1E08:
         return "\u00C7\u0301";
     case 0x1E09:
         return "\u00E7\u0301";
     case 0x1E0A:
         return "\u0044\u0307";
     case 0x1E0B:
         return "\u0064\u0307";
     case 0x1E0C:
         return "\u0044\u0323";
     case 0x1E0D:
         return "\u0064\u0323";
     case 0x1E0E:
         return "\u0044\u0331";
     case 0x1E0F:
         return "\u0064\u0331";
     case 0x1E10:
         return "\u0044\u0327";
     case 0x1E11:
         return "\u0064\u0327";
     case 0x1E12:
         return "\u0044\u032D";
     case 0x1E13:
         return "\u0064\u032D";
     case 0x1E14:
         return "\u0112\u0300";
     case 0x1E15:
         return "\u0113\u0300";
     case 0x1E16:
         return "\u0112\u0301";
     case 0x1E17:
         return "\u0113\u0301";
     case 0x1E18:
         return "\u0045\u032D";
     case 0x1E19:
         return "\u0065\u032D";
     case 0x1E1A:
         return "\u0045\u0330";
     case 0x1E1B:
         return "\u0065\u0330";
     case 0x1E1C:
         return "\u0228\u0306";
     case 0x1E1D:
         return "\u0229\u0306";
     case 0x1E1E:
         return "\u0046\u0307";
     case 0x1E1F:
         return "\u0066\u0307";
     case 0x1E20:
         return "\u0047\u0304";
     case 0x1E21:
         return "\u0067\u0304";
     case 0x1E22:
         return "\u0048\u0307";
     case 0x1E23:
         return "\u0068\u0307";
     case 0x1E24:
         return "\u0048\u0323";
     case 0x1E25:
         return "\u0068\u0323";
     case 0x1E26:
         return "\u0048\u0308";
     case 0x1E27:
         return "\u0068\u0308";
     case 0x1E28:
         return "\u0048\u0327";
     case 0x1E29:
         return "\u0068\u0327";
     case 0x1E2A:
         return "\u0048\u032E";
     case 0x1E2B:
         return "\u0068\u032E";
     case 0x1E2C:
         return "\u0049\u0330";
     case 0x1E2D:
         return "\u0069\u0330";
     case 0x1E2E:
         return "\u00CF\u0301";
     case 0x1E2F:
         return "\u00EF\u0301";
     case 0x1E30:
         return "\u004B\u0301";
     case 0x1E31:
         return "\u006B\u0301";
     case 0x1E32:
         return "\u004B\u0323";
     case 0x1E33:
         return "\u006B\u0323";
     case 0x1E34:
         return "\u004B\u0331";
     case 0x1E35:
         return "\u006B\u0331";
     case 0x1E36:
         return "\u004C\u0323";
     case 0x1E37:
         return "\u006C\u0323";
     case 0x1E38:
         return "\u1E36\u0304";
     case 0x1E39:
         return "\u1E37\u0304";
     case 0x1E3A:
         return "\u004C\u0331";
     case 0x1E3B:
         return "\u006C\u0331";
     case 0x1E3C:
         return "\u004C\u032D";
     case 0x1E3D:
         return "\u006C\u032D";
     case 0x1E3E:
         return "\u004D\u0301";
     case 0x1E3F:
         return "\u006D\u0301";
     case 0x1E40:
         return "\u004D\u0307";
     case 0x1E41:
         return "\u006D\u0307";
     case 0x1E42:
         return "\u004D\u0323";
     case 0x1E43:
         return "\u006D\u0323";
     case 0x1E44:
         return "\u004E\u0307";
     case 0x1E45:
         return "\u006E\u0307";
     case 0x1E46:
         return "\u004E\u0323";
     case 0x1E47:
         return "\u006E\u0323";
     case 0x1E48:
         return "\u004E\u0331";
     case 0x1E49:
         return "\u006E\u0331";
     case 0x1E4A:
         return "\u004E\u032D";
     case 0x1E4B:
         return "\u006E\u032D";
     case 0x1E4C:
         return "\u00D5\u0301";
     case 0x1E4D:
         return "\u00F5\u0301";
     case 0x1E4E:
         return "\u00D5\u0308";
     case 0x1E4F:
         return "\u00F5\u0308";
     case 0x1E50:
         return "\u014C\u0300";
     case 0x1E51:
         return "\u014D\u0300";
     case 0x1E52:
         return "\u014C\u0301";
     case 0x1E53:
         return "\u014D\u0301";
     case 0x1E54:
         return "\u0050\u0301";
     case 0x1E55:
         return "\u0070\u0301";
     case 0x1E56:
         return "\u0050\u0307";
     case 0x1E57:
         return "\u0070\u0307";
     case 0x1E58:
         return "\u0052\u0307";
     case 0x1E59:
         return "\u0072\u0307";
     case 0x1E5A:
         return "\u0052\u0323";
     case 0x1E5B:
         return "\u0072\u0323";
     case 0x1E5C:
         return "\u1E5A\u0304";
     case 0x1E5D:
         return "\u1E5B\u0304";
     case 0x1E5E:
         return "\u0052\u0331";
     case 0x1E5F:
         return "\u0072\u0331";
     case 0x1E60:
         return "\u0053\u0307";
     case 0x1E61:
         return "\u0073\u0307";
     case 0x1E62:
         return "\u0053\u0323";
     case 0x1E63:
         return "\u0073\u0323";
     case 0x1E64:
         return "\u015A\u0307";
     case 0x1E65:
         return "\u015B\u0307";
     case 0x1E66:
         return "\u0160\u0307";
     case 0x1E67:
         return "\u0161\u0307";
     case 0x1E68:
         return "\u1E62\u0307";
     case 0x1E69:
         return "\u1E63\u0307";
     case 0x1E6A:
         return "\u0054\u0307";
     case 0x1E6B:
         return "\u0074\u0307";
     case 0x1E6C:
         return "\u0054\u0323";
     case 0x1E6D:
         return "\u0074\u0323";
     case 0x1E6E:
         return "\u0054\u0331";
     case 0x1E6F:
         return "\u0074\u0331";
     case 0x1E70:
         return "\u0054\u032D";
     case 0x1E71:
         return "\u0074\u032D";
     case 0x1E72:
         return "\u0055\u0324";
     case 0x1E73:
         return "\u0075\u0324";
     case 0x1E74:
         return "\u0055\u0330";
     case 0x1E75:
         return "\u0075\u0330";
     case 0x1E76:
         return "\u0055\u032D";
     case 0x1E77:
         return "\u0075\u032D";
     case 0x1E78:
         return "\u0168\u0301";
     case 0x1E79:
         return "\u0169\u0301";
     case 0x1E7A:
         return "\u016A\u0308";
     case 0x1E7B:
         return "\u016B\u0308";
     case 0x1E7C:
         return "\u0056\u0303";
     case 0x1E7D:
         return "\u0076\u0303";
     case 0x1E7E:
         return "\u0056\u0323";
     case 0x1E7F:
         return "\u0076\u0323";
     case 0x1E80:
         return "\u0057\u0300";
     case 0x1E81:
         return "\u0077\u0300";
     case 0x1E82:
         return "\u0057\u0301";
     case 0x1E83:
         return "\u0077\u0301";
     case 0x1E84:
         return "\u0057\u0308";
     case 0x1E85:
         return "\u0077\u0308";
     case 0x1E86:
         return "\u0057\u0307";
     case 0x1E87:
         return "\u0077\u0307";
     case 0x1E88:
         return "\u0057\u0323";
     case 0x1E89:
         return "\u0077\u0323";
     case 0x1E8A:
         return "\u0058\u0307";
     case 0x1E8B:
         return "\u0078\u0307";
     case 0x1E8C:
         return "\u0058\u0308";
     case 0x1E8D:
         return "\u0078\u0308";
     case 0x1E8E:
         return "\u0059\u0307";
     case 0x1E8F:
         return "\u0079\u0307";
     case 0x1E90:
         return "\u005A\u0302";
     case 0x1E91:
         return "\u007A\u0302";
     case 0x1E92:
         return "\u005A\u0323";
     case 0x1E93:
         return "\u007A\u0323";
     case 0x1E94:
         return "\u005A\u0331";
     case 0x1E95:
         return "\u007A\u0331";
     case 0x1E96:
         return "\u0068\u0331";
     case 0x1E97:
         return "\u0074\u0308";
     case 0x1E98:
         return "\u0077\u030A";
     case 0x1E99:
         return "\u0079\u030A";
     case 0x1E9B:
         return "\u017F\u0307";
     case 0x1EA0:
         return "\u0041\u0323";
     case 0x1EA1:
         return "\u0061\u0323";
     case 0x1EA2:
         return "\u0041\u0309";
     case 0x1EA3:
         return "\u0061\u0309";
     case 0x1EA4:
         return "\u00C2\u0301";
     case 0x1EA5:
         return "\u00E2\u0301";
     case 0x1EA6:
         return "\u00C2\u0300";
     case 0x1EA7:
         return "\u00E2\u0300";
     case 0x1EA8:
         return "\u00C2\u0309";
     case 0x1EA9:
         return "\u00E2\u0309";
     case 0x1EAA:
         return "\u00C2\u0303";
     case 0x1EAB:
         return "\u00E2\u0303";
     case 0x1EAC:
         return "\u1EA0\u0302";
     case 0x1EAD:
         return "\u1EA1\u0302";
     case 0x1EAE:
         return "\u0102\u0301";
     case 0x1EAF:
         return "\u0103\u0301";
     case 0x1EB0:
         return "\u0102\u0300";
     case 0x1EB1:
         return "\u0103\u0300";
     case 0x1EB2:
         return "\u0102\u0309";
     case 0x1EB3:
         return "\u0103\u0309";
     case 0x1EB4:
         return "\u0102\u0303";
     case 0x1EB5:
         return "\u0103\u0303";
     case 0x1EB6:
         return "\u1EA0\u0306";
     case 0x1EB7:
         return "\u1EA1\u0306";
     case 0x1EB8:
         return "\u0045\u0323";
     case 0x1EB9:
         return "\u0065\u0323";
     case 0x1EBA:
         return "\u0045\u0309";
     case 0x1EBB:
         return "\u0065\u0309";
     case 0x1EBC:
         return "\u0045\u0303";
     case 0x1EBD:
         return "\u0065\u0303";
     case 0x1EBE:
         return "\u00CA\u0301";
     case 0x1EBF:
         return "\u00EA\u0301";
     case 0x1EC0:
         return "\u00CA\u0300";
     case 0x1EC1:
         return "\u00EA\u0300";
     case 0x1EC2:
         return "\u00CA\u0309";
     case 0x1EC3:
         return "\u00EA\u0309";
     case 0x1EC4:
         return "\u00CA\u0303";
     case 0x1EC5:
         return "\u00EA\u0303";
     case 0x1EC6:
         return "\u1EB8\u0302";
     case 0x1EC7:
         return "\u1EB9\u0302";
     case 0x1EC8:
         return "\u0049\u0309";
     case 0x1EC9:
         return "\u0069\u0309";
     case 0x1ECA:
         return "\u0049\u0323";
     case 0x1ECB:
         return "\u0069\u0323";
     case 0x1ECC:
         return "\u004F\u0323";
     case 0x1ECD:
         return "\u006F\u0323";
     case 0x1ECE:
         return "\u004F\u0309";
     case 0x1ECF:
         return "\u006F\u0309";
     case 0x1ED0:
         return "\u00D4\u0301";
     case 0x1ED1:
         return "\u00F4\u0301";
     case 0x1ED2:
         return "\u00D4\u0300";
     case 0x1ED3:
         return "\u00F4\u0300";
     case 0x1ED4:
         return "\u00D4\u0309";
     case 0x1ED5:
         return "\u00F4\u0309";
     case 0x1ED6:
         return "\u00D4\u0303";
     case 0x1ED7:
         return "\u00F4\u0303";
     case 0x1ED8:
         return "\u1ECC\u0302";
     case 0x1ED9:
         return "\u1ECD\u0302";
     case 0x1EDA:
         return "\u01A0\u0301";
     case 0x1EDB:
         return "\u01A1\u0301";
     case 0x1EDC:
         return "\u01A0\u0300";
     case 0x1EDD:
         return "\u01A1\u0300";
     case 0x1EDE:
         return "\u01A0\u0309";
     case 0x1EDF:
         return "\u01A1\u0309";
     case 0x1EE0:
         return "\u01A0\u0303";
     case 0x1EE1:
         return "\u01A1\u0303";
     case 0x1EE2:
         return "\u01A0\u0323";
     case 0x1EE3:
         return "\u01A1\u0323";
     case 0x1EE4:
         return "\u0055\u0323";
     case 0x1EE5:
         return "\u0075\u0323";
     case 0x1EE6:
         return "\u0055\u0309";
     case 0x1EE7:
         return "\u0075\u0309";
     case 0x1EE8:
         return "\u01AF\u0301";
     case 0x1EE9:
         return "\u01B0\u0301";
     case 0x1EEA:
         return "\u01AF\u0300";
     case 0x1EEB:
         return "\u01B0\u0300";
     case 0x1EEC:
         return "\u01AF\u0309";
     case 0x1EED:
         return "\u01B0\u0309";
     case 0x1EEE:
         return "\u01AF\u0303";
     case 0x1EEF:
         return "\u01B0\u0303";
     case 0x1EF0:
         return "\u01AF\u0323";
     case 0x1EF1:
         return "\u01B0\u0323";
     case 0x1EF2:
         return "\u0059\u0300";
     case 0x1EF3:
         return "\u0079\u0300";
     case 0x1EF4:
         return "\u0059\u0323";
     case 0x1EF5:
         return "\u0079\u0323";
     case 0x1EF6:
         return "\u0059\u0309";
     case 0x1EF7:
         return "\u0079\u0309";
     case 0x1EF8:
         return "\u0059\u0303";
     case 0x1EF9:
         return "\u0079\u0303";
     case 0x1F00:
         return "\u03B1\u0313";
     case 0x1F01:
         return "\u03B1\u0314";
     case 0x1F02:
         return "\u1F00\u0300";
     case 0x1F03:
         return "\u1F01\u0300";
     case 0x1F04:
         return "\u1F00\u0301";
     case 0x1F05:
         return "\u1F01\u0301";
     case 0x1F06:
         return "\u1F00\u0342";
     case 0x1F07:
         return "\u1F01\u0342";
     case 0x1F08:
         return "\u0391\u0313";
     case 0x1F09:
         return "\u0391\u0314";
     case 0x1F0A:
         return "\u1F08\u0300";
     case 0x1F0B:
         return "\u1F09\u0300";
     case 0x1F0C:
         return "\u1F08\u0301";
     case 0x1F0D:
         return "\u1F09\u0301";
     case 0x1F0E:
         return "\u1F08\u0342";
     case 0x1F0F:
         return "\u1F09\u0342";
     case 0x1F10:
         return "\u03B5\u0313";
     case 0x1F11:
         return "\u03B5\u0314";
     case 0x1F12:
         return "\u1F10\u0300";
     case 0x1F13:
         return "\u1F11\u0300";
     case 0x1F14:
         return "\u1F10\u0301";
     case 0x1F15:
         return "\u1F11\u0301";
     case 0x1F18:
         return "\u0395\u0313";
     case 0x1F19:
         return "\u0395\u0314";
     case 0x1F1A:
         return "\u1F18\u0300";
     case 0x1F1B:
         return "\u1F19\u0300";
     case 0x1F1C:
         return "\u1F18\u0301";
     case 0x1F1D:
         return "\u1F19\u0301";
     case 0x1F20:
         return "\u03B7\u0313";
     case 0x1F21:
         return "\u03B7\u0314";
     case 0x1F22:
         return "\u1F20\u0300";
     case 0x1F23:
         return "\u1F21\u0300";
     case 0x1F24:
         return "\u1F20\u0301";
     case 0x1F25:
         return "\u1F21\u0301";
     case 0x1F26:
         return "\u1F20\u0342";
     case 0x1F27:
         return "\u1F21\u0342";
     case 0x1F28:
         return "\u0397\u0313";
     case 0x1F29:
         return "\u0397\u0314";
     case 0x1F2A:
         return "\u1F28\u0300";
     case 0x1F2B:
         return "\u1F29\u0300";
     case 0x1F2C:
         return "\u1F28\u0301";
     case 0x1F2D:
         return "\u1F29\u0301";
     case 0x1F2E:
         return "\u1F28\u0342";
     case 0x1F2F:
         return "\u1F29\u0342";
     case 0x1F30:
         return "\u03B9\u0313";
     case 0x1F31:
         return "\u03B9\u0314";
     case 0x1F32:
         return "\u1F30\u0300";
     case 0x1F33:
         return "\u1F31\u0300";
     case 0x1F34:
         return "\u1F30\u0301";
     case 0x1F35:
         return "\u1F31\u0301";
     case 0x1F36:
         return "\u1F30\u0342";
     case 0x1F37:
         return "\u1F31\u0342";
     case 0x1F38:
         return "\u0399\u0313";
     case 0x1F39:
         return "\u0399\u0314";
     case 0x1F3A:
         return "\u1F38\u0300";
     case 0x1F3B:
         return "\u1F39\u0300";
     case 0x1F3C:
         return "\u1F38\u0301";
     case 0x1F3D:
         return "\u1F39\u0301";
     case 0x1F3E:
         return "\u1F38\u0342";
     case 0x1F3F:
         return "\u1F39\u0342";
     case 0x1F40:
         return "\u03BF\u0313";
     case 0x1F41:
         return "\u03BF\u0314";
     case 0x1F42:
         return "\u1F40\u0300";
     case 0x1F43:
         return "\u1F41\u0300";
     case 0x1F44:
         return "\u1F40\u0301";
     case 0x1F45:
         return "\u1F41\u0301";
     case 0x1F48:
         return "\u039F\u0313";
     case 0x1F49:
         return "\u039F\u0314";
     case 0x1F4A:
         return "\u1F48\u0300";
     case 0x1F4B:
         return "\u1F49\u0300";
     case 0x1F4C:
         return "\u1F48\u0301";
     case 0x1F4D:
         return "\u1F49\u0301";
     case 0x1F50:
         return "\u03C5\u0313";
     case 0x1F51:
         return "\u03C5\u0314";
     case 0x1F52:
         return "\u1F50\u0300";
     case 0x1F53:
         return "\u1F51\u0300";
     case 0x1F54:
         return "\u1F50\u0301";
     case 0x1F55:
         return "\u1F51\u0301";
     case 0x1F56:
         return "\u1F50\u0342";
     case 0x1F57:
         return "\u1F51\u0342";
     case 0x1F59:
         return "\u03A5\u0314";
     case 0x1F5B:
         return "\u1F59\u0300";
     case 0x1F5D:
         return "\u1F59\u0301";
     case 0x1F5F:
         return "\u1F59\u0342";
     case 0x1F60:
         return "\u03C9\u0313";
     case 0x1F61:
         return "\u03C9\u0314";
     case 0x1F62:
         return "\u1F60\u0300";
     case 0x1F63:
         return "\u1F61\u0300";
     case 0x1F64:
         return "\u1F60\u0301";
     case 0x1F65:
         return "\u1F61\u0301";
     case 0x1F66:
         return "\u1F60\u0342";
     case 0x1F67:
         return "\u1F61\u0342";
     case 0x1F68:
         return "\u03A9\u0313";
     case 0x1F69:
         return "\u03A9\u0314";
     case 0x1F6A:
         return "\u1F68\u0300";
     case 0x1F6B:
         return "\u1F69\u0300";
     case 0x1F6C:
         return "\u1F68\u0301";
     case 0x1F6D:
         return "\u1F69\u0301";
     case 0x1F6E:
         return "\u1F68\u0342";
     case 0x1F6F:
         return "\u1F69\u0342";
     case 0x1F70:
         return "\u03B1\u0300";
     case 0x1F71:
         return "\u03AC";
     case 0x1F72:
         return "\u03B5\u0300";
     case 0x1F73:
         return "\u03AD";
     case 0x1F74:
         return "\u03B7\u0300";
     case 0x1F75:
         return "\u03AE";
     case 0x1F76:
         return "\u03B9\u0300";
     case 0x1F77:
         return "\u03AF";
     case 0x1F78:
         return "\u03BF\u0300";
     case 0x1F79:
         return "\u03CC";
     case 0x1F7A:
         return "\u03C5\u0300";
     case 0x1F7B:
         return "\u03CD";
     case 0x1F7C:
         return "\u03C9\u0300";
     case 0x1F7D:
         return "\u03CE";
     case 0x1F80:
         return "\u1F00\u0345";
     case 0x1F81:
         return "\u1F01\u0345";
     case 0x1F82:
         return "\u1F02\u0345";
     case 0x1F83:
         return "\u1F03\u0345";
     case 0x1F84:
         return "\u1F04\u0345";
     case 0x1F85:
         return "\u1F05\u0345";
     case 0x1F86:
         return "\u1F06\u0345";
     case 0x1F87:
         return "\u1F07\u0345";
     case 0x1F88:
         return "\u1F08\u0345";
     case 0x1F89:
         return "\u1F09\u0345";
     case 0x1F8A:
         return "\u1F0A\u0345";
     case 0x1F8B:
         return "\u1F0B\u0345";
     case 0x1F8C:
         return "\u1F0C\u0345";
     case 0x1F8D:
         return "\u1F0D\u0345";
     case 0x1F8E:
         return "\u1F0E\u0345";
     case 0x1F8F:
         return "\u1F0F\u0345";
     case 0x1F90:
         return "\u1F20\u0345";
     case 0x1F91:
         return "\u1F21\u0345";
     case 0x1F92:
         return "\u1F22\u0345";
     case 0x1F93:
         return "\u1F23\u0345";
     case 0x1F94:
         return "\u1F24\u0345";
     case 0x1F95:
         return "\u1F25\u0345";
     case 0x1F96:
         return "\u1F26\u0345";
     case 0x1F97:
         return "\u1F27\u0345";
     case 0x1F98:
         return "\u1F28\u0345";
     case 0x1F99:
         return "\u1F29\u0345";
     case 0x1F9A:
         return "\u1F2A\u0345";
     case 0x1F9B:
         return "\u1F2B\u0345";
     case 0x1F9C:
         return "\u1F2C\u0345";
     case 0x1F9D:
         return "\u1F2D\u0345";
     case 0x1F9E:
         return "\u1F2E\u0345";
     case 0x1F9F:
         return "\u1F2F\u0345";
     case 0x1FA0:
         return "\u1F60\u0345";
     case 0x1FA1:
         return "\u1F61\u0345";
     case 0x1FA2:
         return "\u1F62\u0345";
     case 0x1FA3:
         return "\u1F63\u0345";
     case 0x1FA4:
         return "\u1F64\u0345";
     case 0x1FA5:
         return "\u1F65\u0345";
     case 0x1FA6:
         return "\u1F66\u0345";
     case 0x1FA7:
         return "\u1F67\u0345";
     case 0x1FA8:
         return "\u1F68\u0345";
     case 0x1FA9:
         return "\u1F69\u0345";
     case 0x1FAA:
         return "\u1F6A\u0345";
     case 0x1FAB:
         return "\u1F6B\u0345";
     case 0x1FAC:
         return "\u1F6C\u0345";
     case 0x1FAD:
         return "\u1F6D\u0345";
     case 0x1FAE:
         return "\u1F6E\u0345";
     case 0x1FAF:
         return "\u1F6F\u0345";
     case 0x1FB0:
         return "\u03B1\u0306";
     case 0x1FB1:
         return "\u03B1\u0304";
     case 0x1FB2:
         return "\u1F70\u0345";
     case 0x1FB3:
         return "\u03B1\u0345";
     case 0x1FB4:
         return "\u03AC\u0345";
     case 0x1FB6:
         return "\u03B1\u0342";
     case 0x1FB7:
         return "\u1FB6\u0345";
     case 0x1FB8:
         return "\u0391\u0306";
     case 0x1FB9:
         return "\u0391\u0304";
     case 0x1FBA:
         return "\u0391\u0300";
     case 0x1FBB:
         return "\u0386";
     case 0x1FBC:
         return "\u0391\u0345";
     case 0x1FBE:
         return "\u03B9";
     case 0x1FC1:
         return "\u00A8\u0342";
     case 0x1FC2:
         return "\u1F74\u0345";
     case 0x1FC3:
         return "\u03B7\u0345";
     case 0x1FC4:
         return "\u03AE\u0345";
     case 0x1FC6:
         return "\u03B7\u0342";
     case 0x1FC7:
         return "\u1FC6\u0345";
     case 0x1FC8:
         return "\u0395\u0300";
     case 0x1FC9:
         return "\u0388";
     case 0x1FCA:
         return "\u0397\u0300";
     case 0x1FCB:
         return "\u0389";
     case 0x1FCC:
         return "\u0397\u0345";
     case 0x1FCD:
         return "\u1FBF\u0300";
     case 0x1FCE:
         return "\u1FBF\u0301";
     case 0x1FCF:
         return "\u1FBF\u0342";
     case 0x1FD0:
         return "\u03B9\u0306";
     case 0x1FD1:
         return "\u03B9\u0304";
     case 0x1FD2:
         return "\u03CA\u0300";
     case 0x1FD3:
         return "\u0390";
     case 0x1FD6:
         return "\u03B9\u0342";
     case 0x1FD7:
         return "\u03CA\u0342";
     case 0x1FD8:
         return "\u0399\u0306";
     case 0x1FD9:
         return "\u0399\u0304";
     case 0x1FDA:
         return "\u0399\u0300";
     case 0x1FDB:
         return "\u038A";
     case 0x1FDD:
         return "\u1FFE\u0300";
     case 0x1FDE:
         return "\u1FFE\u0301";
     case 0x1FDF:
         return "\u1FFE\u0342";
     case 0x1FE0:
         return "\u03C5\u0306";
     case 0x1FE1:
         return "\u03C5\u0304";
     case 0x1FE2:
         return "\u03CB\u0300";
     case 0x1FE3:
         return "\u03B0";
     case 0x1FE4:
         return "\u03C1\u0313";
     case 0x1FE5:
         return "\u03C1\u0314";
     case 0x1FE6:
         return "\u03C5\u0342";
     case 0x1FE7:
         return "\u03CB\u0342";
     case 0x1FE8:
         return "\u03A5\u0306";
     case 0x1FE9:
         return "\u03A5\u0304";
     case 0x1FEA:
         return "\u03A5\u0300";
     case 0x1FEB:
         return "\u038E";
     case 0x1FEC:
         return "\u03A1\u0314";
     case 0x1FED:
         return "\u00A8\u0300";
     case 0x1FEE:
         return "\u0385";
     case 0x1FEF:
         return "\u0060";
     case 0x1FF2:
         return "\u1F7C\u0345";
     case 0x1FF3:
         return "\u03C9\u0345";
     case 0x1FF4:
         return "\u03CE\u0345";
     case 0x1FF6:
         return "\u03C9\u0342";
     case 0x1FF7:
         return "\u1FF6\u0345";
     case 0x1FF8:
         return "\u039F\u0300";
     case 0x1FF9:
         return "\u038C";
     case 0x1FFA:
         return "\u03A9\u0300";
     case 0x1FFB:
         return "\u038F";
     case 0x1FFC:
         return "\u03A9\u0345";
     case 0x1FFD:
         return "\u00B4";
     case 0x2000:
         return "\u2002";
     case 0x2001:
         return "\u2003";
     case 0x2126:
         return "\u03A9";
     case 0x212A:
         return "\u004B";
     case 0x212B:
         return "\u00C5";
     case 0x219A:
         return "\u2190\u0338";
     case 0x219B:
         return "\u2192\u0338";
     case 0x21AE:
         return "\u2194\u0338";
     case 0x21CD:
         return "\u21D0\u0338";
     case 0x21CE:
         return "\u21D4\u0338";
     case 0x21CF:
         return "\u21D2\u0338";
     case 0x2204:
         return "\u2203\u0338";
     case 0x2209:
         return "\u2208\u0338";
     case 0x220C:
         return "\u220B\u0338";
     case 0x2224:
         return "\u2223\u0338";
     case 0x2226:
         return "\u2225\u0338";
     case 0x2241:
         return "\u223C\u0338";
     case 0x2244:
         return "\u2243\u0338";
     case 0x2247:
         return "\u2245\u0338";
     case 0x2249:
         return "\u2248\u0338";
     case 0x2260:
         return "\u003D\u0338";
     case 0x2262:
         return "\u2261\u0338";
     case 0x226D:
         return "\u224D\u0338";
     case 0x226E:
         return "\u003C\u0338";
     case 0x226F:
         return "\u003E\u0338";
     case 0x2270:
         return "\u2264\u0338";
     case 0x2271:
         return "\u2265\u0338";
     case 0x2274:
         return "\u2272\u0338";
     case 0x2275:
         return "\u2273\u0338";
     case 0x2278:
         return "\u2276\u0338";
     case 0x2279:
         return "\u2277\u0338";
     case 0x2280:
         return "\u227A\u0338";
     case 0x2281:
         return "\u227B\u0338";
     case 0x2284:
         return "\u2282\u0338";
     case 0x2285:
         return "\u2283\u0338";
     case 0x2288:
         return "\u2286\u0338";
     case 0x2289:
         return "\u2287\u0338";
     case 0x22AC:
         return "\u22A2\u0338";
     case 0x22AD:
         return "\u22A8\u0338";
     case 0x22AE:
         return "\u22A9\u0338";
     case 0x22AF:
         return "\u22AB\u0338";
     case 0x22E0:
         return "\u227C\u0338";
     case 0x22E1:
         return "\u227D\u0338";
     case 0x22E2:
         return "\u2291\u0338";
     case 0x22E3:
         return "\u2292\u0338";
     case 0x22EA:
         return "\u22B2\u0338";
     case 0x22EB:
         return "\u22B3\u0338";
     case 0x22EC:
         return "\u22B4\u0338";
     case 0x22ED:
         return "\u22B5\u0338";
     case 0x2329:
         return "\u3008";
     case 0x232A:
         return "\u3009";
     case 0x2ADC:
         return "\u2ADD\u0338";
     case 0x304C:
         return "\u304B\u3099";
     case 0x304E:
         return "\u304D\u3099";
     case 0x3050:
         return "\u304F\u3099";
     case 0x3052:
         return "\u3051\u3099";
     case 0x3054:
         return "\u3053\u3099";
     case 0x3056:
         return "\u3055\u3099";
     case 0x3058:
         return "\u3057\u3099";
     case 0x305A:
         return "\u3059\u3099";
     case 0x305C:
         return "\u305B\u3099";
     case 0x305E:
         return "\u305D\u3099";
     case 0x3060:
         return "\u305F\u3099";
     case 0x3062:
         return "\u3061\u3099";
     case 0x3065:
         return "\u3064\u3099";
     case 0x3067:
         return "\u3066\u3099";
     case 0x3069:
         return "\u3068\u3099";
     case 0x3070:
         return "\u306F\u3099";
     case 0x3071:
         return "\u306F\u309A";
     case 0x3073:
         return "\u3072\u3099";
     case 0x3074:
         return "\u3072\u309A";
     case 0x3076:
         return "\u3075\u3099";
     case 0x3077:
         return "\u3075\u309A";
     case 0x3079:
         return "\u3078\u3099";
     case 0x307A:
         return "\u3078\u309A";
     case 0x307C:
         return "\u307B\u3099";
     case 0x307D:
         return "\u307B\u309A";
     case 0x3094:
         return "\u3046\u3099";
     case 0x309E:
         return "\u309D\u3099";
     case 0x30AC:
         return "\u30AB\u3099";
     case 0x30AE:
         return "\u30AD\u3099";
     case 0x30B0:
         return "\u30AF\u3099";
     case 0x30B2:
         return "\u30B1\u3099";
     case 0x30B4:
         return "\u30B3\u3099";
     case 0x30B6:
         return "\u30B5\u3099";
     case 0x30B8:
         return "\u30B7\u3099";
     case 0x30BA:
         return "\u30B9\u3099";
     case 0x30BC:
         return "\u30BB\u3099";
     case 0x30BE:
         return "\u30BD\u3099";
     case 0x30C0:
         return "\u30BF\u3099";
     case 0x30C2:
         return "\u30C1\u3099";
     case 0x30C5:
         return "\u30C4\u3099";
     case 0x30C7:
         return "\u30C6\u3099";
     case 0x30C9:
         return "\u30C8\u3099";
     case 0x30D0:
         return "\u30CF\u3099";
     case 0x30D1:
         return "\u30CF\u309A";
     case 0x30D3:
         return "\u30D2\u3099";
     case 0x30D4:
         return "\u30D2\u309A";
     case 0x30D6:
         return "\u30D5\u3099";
     case 0x30D7:
         return "\u30D5\u309A";
     case 0x30D9:
         return "\u30D8\u3099";
     case 0x30DA:
         return "\u30D8\u309A";
     case 0x30DC:
         return "\u30DB\u3099";
     case 0x30DD:
         return "\u30DB\u309A";
     case 0x30F4:
         return "\u30A6\u3099";
     case 0x30F7:
         return "\u30EF\u3099";
     case 0x30F8:
         return "\u30F0\u3099";
     case 0x30F9:
         return "\u30F1\u3099";
     case 0x30FA:
         return "\u30F2\u3099";
     case 0x30FE:
         return "\u30FD\u3099";
     case 0xF900:
         return "\u8C48";
     case 0xF901:
         return "\u66F4";
     case 0xF902:
         return "\u8ECA";
     case 0xF903:
         return "\u8CC8";
     case 0xF904:
         return "\u6ED1";
     case 0xF905:
         return "\u4E32";
     case 0xF906:
         return "\u53E5";
     case 0xF907:
         return "\u9F9C";
     case 0xF908:
         return "\u9F9C";
     case 0xF909:
         return "\u5951";
     case 0xF90A:
         return "\u91D1";
     case 0xF90B:
         return "\u5587";
     case 0xF90C:
         return "\u5948";
     case 0xF90D:
         return "\u61F6";
     case 0xF90E:
         return "\u7669";
     case 0xF90F:
         return "\u7F85";
     case 0xF910:
         return "\u863F";
     case 0xF911:
         return "\u87BA";
     case 0xF912:
         return "\u88F8";
     case 0xF913:
         return "\u908F";
     case 0xF914:
         return "\u6A02";
     case 0xF915:
         return "\u6D1B";
     case 0xF916:
         return "\u70D9";
     case 0xF917:
         return "\u73DE";
     case 0xF918:
         return "\u843D";
     case 0xF919:
         return "\u916A";
     case 0xF91A:
         return "\u99F1";
     case 0xF91B:
         return "\u4E82";
     case 0xF91C:
         return "\u5375";
     case 0xF91D:
         return "\u6B04";
     case 0xF91E:
         return "\u721B";
     case 0xF91F:
         return "\u862D";
     case 0xF920:
         return "\u9E1E";
     case 0xF921:
         return "\u5D50";
     case 0xF922:
         return "\u6FEB";
     case 0xF923:
         return "\u85CD";
     case 0xF924:
         return "\u8964";
     case 0xF925:
         return "\u62C9";
     case 0xF926:
         return "\u81D8";
     case 0xF927:
         return "\u881F";
     case 0xF928:
         return "\u5ECA";
     case 0xF929:
         return "\u6717";
     case 0xF92A:
         return "\u6D6A";
     case 0xF92B:
         return "\u72FC";
     case 0xF92C:
         return "\u90CE";
     case 0xF92D:
         return "\u4F86";
     case 0xF92E:
         return "\u51B7";
     case 0xF92F:
         return "\u52DE";
     case 0xF930:
         return "\u64C4";
     case 0xF931:
         return "\u6AD3";
     case 0xF932:
         return "\u7210";
     case 0xF933:
         return "\u76E7";
     case 0xF934:
         return "\u8001";
     case 0xF935:
         return "\u8606";
     case 0xF936:
         return "\u865C";
     case 0xF937:
         return "\u8DEF";
     case 0xF938:
         return "\u9732";
     case 0xF939:
         return "\u9B6F";
     case 0xF93A:
         return "\u9DFA";
     case 0xF93B:
         return "\u788C";
     case 0xF93C:
         return "\u797F";
     case 0xF93D:
         return "\u7DA0";
     case 0xF93E:
         return "\u83C9";
     case 0xF93F:
         return "\u9304";
     case 0xF940:
         return "\u9E7F";
     case 0xF941:
         return "\u8AD6";
     case 0xF942:
         return "\u58DF";
     case 0xF943:
         return "\u5F04";
     case 0xF944:
         return "\u7C60";
     case 0xF945:
         return "\u807E";
     case 0xF946:
         return "\u7262";
     case 0xF947:
         return "\u78CA";
     case 0xF948:
         return "\u8CC2";
     case 0xF949:
         return "\u96F7";
     case 0xF94A:
         return "\u58D8";
     case 0xF94B:
         return "\u5C62";
     case 0xF94C:
         return "\u6A13";
     case 0xF94D:
         return "\u6DDA";
     case 0xF94E:
         return "\u6F0F";
     case 0xF94F:
         return "\u7D2F";
     case 0xF950:
         return "\u7E37";
     case 0xF951:
         return "\u964B";
     case 0xF952:
         return "\u52D2";
     case 0xF953:
         return "\u808B";
     case 0xF954:
         return "\u51DC";
     case 0xF955:
         return "\u51CC";
     case 0xF956:
         return "\u7A1C";
     case 0xF957:
         return "\u7DBE";
     case 0xF958:
         return "\u83F1";
     case 0xF959:
         return "\u9675";
     case 0xF95A:
         return "\u8B80";
     case 0xF95B:
         return "\u62CF";
     case 0xF95C:
         return "\u6A02";
     case 0xF95D:
         return "\u8AFE";
     case 0xF95E:
         return "\u4E39";
     case 0xF95F:
         return "\u5BE7";
     case 0xF960:
         return "\u6012";
     case 0xF961:
         return "\u7387";
     case 0xF962:
         return "\u7570";
     case 0xF963:
         return "\u5317";
     case 0xF964:
         return "\u78FB";
     case 0xF965:
         return "\u4FBF";
     case 0xF966:
         return "\u5FA9";
     case 0xF967:
         return "\u4E0D";
     case 0xF968:
         return "\u6CCC";
     case 0xF969:
         return "\u6578";
     case 0xF96A:
         return "\u7D22";
     case 0xF96B:
         return "\u53C3";
     case 0xF96C:
         return "\u585E";
     case 0xF96D:
         return "\u7701";
     case 0xF96E:
         return "\u8449";
     case 0xF96F:
         return "\u8AAA";
     case 0xF970:
         return "\u6BBA";
     case 0xF971:
         return "\u8FB0";
     case 0xF972:
         return "\u6C88";
     case 0xF973:
         return "\u62FE";
     case 0xF974:
         return "\u82E5";
     case 0xF975:
         return "\u63A0";
     case 0xF976:
         return "\u7565";
     case 0xF977:
         return "\u4EAE";
     case 0xF978:
         return "\u5169";
     case 0xF979:
         return "\u51C9";
     case 0xF97A:
         return "\u6881";
     case 0xF97B:
         return "\u7CE7";
     case 0xF97C:
         return "\u826F";
     case 0xF97D:
         return "\u8AD2";
     case 0xF97E:
         return "\u91CF";
     case 0xF97F:
         return "\u52F5";
     case 0xF980:
         return "\u5442";
     case 0xF981:
         return "\u5973";
     case 0xF982:
         return "\u5EEC";
     case 0xF983:
         return "\u65C5";
     case 0xF984:
         return "\u6FFE";
     case 0xF985:
         return "\u792A";
     case 0xF986:
         return "\u95AD";
     case 0xF987:
         return "\u9A6A";
     case 0xF988:
         return "\u9E97";
     case 0xF989:
         return "\u9ECE";
     case 0xF98A:
         return "\u529B";
     case 0xF98B:
         return "\u66C6";
     case 0xF98C:
         return "\u6B77";
     case 0xF98D:
         return "\u8F62";
     case 0xF98E:
         return "\u5E74";
     case 0xF98F:
         return "\u6190";
     case 0xF990:
         return "\u6200";
     case 0xF991:
         return "\u649A";
     case 0xF992:
         return "\u6F23";
     case 0xF993:
         return "\u7149";
     case 0xF994:
         return "\u7489";
     case 0xF995:
         return "\u79CA";
     case 0xF996:
         return "\u7DF4";
     case 0xF997:
         return "\u806F";
     case 0xF998:
         return "\u8F26";
     case 0xF999:
         return "\u84EE";
     case 0xF99A:
         return "\u9023";
     case 0xF99B:
         return "\u934A";
     case 0xF99C:
         return "\u5217";
     case 0xF99D:
         return "\u52A3";
     case 0xF99E:
         return "\u54BD";
     case 0xF99F:
         return "\u70C8";
     case 0xF9A0:
         return "\u88C2";
     case 0xF9A1:
         return "\u8AAA";
     case 0xF9A2:
         return "\u5EC9";
     case 0xF9A3:
         return "\u5FF5";
     case 0xF9A4:
         return "\u637B";
     case 0xF9A5:
         return "\u6BAE";
     case 0xF9A6:
         return "\u7C3E";
     case 0xF9A7:
         return "\u7375";
     case 0xF9A8:
         return "\u4EE4";
     case 0xF9A9:
         return "\u56F9";
     case 0xF9AA:
         return "\u5BE7";
     case 0xF9AB:
         return "\u5DBA";
     case 0xF9AC:
         return "\u601C";
     case 0xF9AD:
         return "\u73B2";
     case 0xF9AE:
         return "\u7469";
     case 0xF9AF:
         return "\u7F9A";
     case 0xF9B0:
         return "\u8046";
     case 0xF9B1:
         return "\u9234";
     case 0xF9B2:
         return "\u96F6";
     case 0xF9B3:
         return "\u9748";
     case 0xF9B4:
         return "\u9818";
     case 0xF9B5:
         return "\u4F8B";
     case 0xF9B6:
         return "\u79AE";
     case 0xF9B7:
         return "\u91B4";
     case 0xF9B8:
         return "\u96B8";
     case 0xF9B9:
         return "\u60E1";
     case 0xF9BA:
         return "\u4E86";
     case 0xF9BB:
         return "\u50DA";
     case 0xF9BC:
         return "\u5BEE";
     case 0xF9BD:
         return "\u5C3F";
     case 0xF9BE:
         return "\u6599";
     case 0xF9BF:
         return "\u6A02";
     case 0xF9C0:
         return "\u71CE";
     case 0xF9C1:
         return "\u7642";
     case 0xF9C2:
         return "\u84FC";
     case 0xF9C3:
         return "\u907C";
     case 0xF9C4:
         return "\u9F8D";
     case 0xF9C5:
         return "\u6688";
     case 0xF9C6:
         return "\u962E";
     case 0xF9C7:
         return "\u5289";
     case 0xF9C8:
         return "\u677B";
     case 0xF9C9:
         return "\u67F3";
     case 0xF9CA:
         return "\u6D41";
     case 0xF9CB:
         return "\u6E9C";
     case 0xF9CC:
         return "\u7409";
     case 0xF9CD:
         return "\u7559";
     case 0xF9CE:
         return "\u786B";
     case 0xF9CF:
         return "\u7D10";
     case 0xF9D0:
         return "\u985E";
     case 0xF9D1:
         return "\u516D";
     case 0xF9D2:
         return "\u622E";
     case 0xF9D3:
         return "\u9678";
     case 0xF9D4:
         return "\u502B";
     case 0xF9D5:
         return "\u5D19";
     case 0xF9D6:
         return "\u6DEA";
     case 0xF9D7:
         return "\u8F2A";
     case 0xF9D8:
         return "\u5F8B";
     case 0xF9D9:
         return "\u6144";
     case 0xF9DA:
         return "\u6817";
     case 0xF9DB:
         return "\u7387";
     case 0xF9DC:
         return "\u9686";
     case 0xF9DD:
         return "\u5229";
     case 0xF9DE:
         return "\u540F";
     case 0xF9DF:
         return "\u5C65";
     case 0xF9E0:
         return "\u6613";
     case 0xF9E1:
         return "\u674E";
     case 0xF9E2:
         return "\u68A8";
     case 0xF9E3:
         return "\u6CE5";
     case 0xF9E4:
         return "\u7406";
     case 0xF9E5:
         return "\u75E2";
     case 0xF9E6:
         return "\u7F79";
     case 0xF9E7:
         return "\u88CF";
     case 0xF9E8:
         return "\u88E1";
     case 0xF9E9:
         return "\u91CC";
     case 0xF9EA:
         return "\u96E2";
     case 0xF9EB:
         return "\u533F";
     case 0xF9EC:
         return "\u6EBA";
     case 0xF9ED:
         return "\u541D";
     case 0xF9EE:
         return "\u71D0";
     case 0xF9EF:
         return "\u7498";
     case 0xF9F0:
         return "\u85FA";
     case 0xF9F1:
         return "\u96A3";
     case 0xF9F2:
         return "\u9C57";
     case 0xF9F3:
         return "\u9E9F";
     case 0xF9F4:
         return "\u6797";
     case 0xF9F5:
         return "\u6DCB";
     case 0xF9F6:
         return "\u81E8";
     case 0xF9F7:
         return "\u7ACB";
     case 0xF9F8:
         return "\u7B20";
     case 0xF9F9:
         return "\u7C92";
     case 0xF9FA:
         return "\u72C0";
     case 0xF9FB:
         return "\u7099";
     case 0xF9FC:
         return "\u8B58";
     case 0xF9FD:
         return "\u4EC0";
     case 0xF9FE:
         return "\u8336";
     case 0xF9FF:
         return "\u523A";
     case 0xFA00:
         return "\u5207";
     case 0xFA01:
         return "\u5EA6";
     case 0xFA02:
         return "\u62D3";
     case 0xFA03:
         return "\u7CD6";
     case 0xFA04:
         return "\u5B85";
     case 0xFA05:
         return "\u6D1E";
     case 0xFA06:
         return "\u66B4";
     case 0xFA07:
         return "\u8F3B";
     case 0xFA08:
         return "\u884C";
     case 0xFA09:
         return "\u964D";
     case 0xFA0A:
         return "\u898B";
     case 0xFA0B:
         return "\u5ED3";
     case 0xFA0C:
         return "\u5140";
     case 0xFA0D:
         return "\u55C0";
     case 0xFA10:
         return "\u585A";
     case 0xFA12:
         return "\u6674";
     case 0xFA15:
         return "\u51DE";
     case 0xFA16:
         return "\u732A";
     case 0xFA17:
         return "\u76CA";
     case 0xFA18:
         return "\u793C";
     case 0xFA19:
         return "\u795E";
     case 0xFA1A:
         return "\u7965";
     case 0xFA1B:
         return "\u798F";
     case 0xFA1C:
         return "\u9756";
     case 0xFA1D:
         return "\u7CBE";
     case 0xFA1E:
         return "\u7FBD";
     case 0xFA20:
         return "\u8612";
     case 0xFA22:
         return "\u8AF8";
     case 0xFA25:
         return "\u9038";
     case 0xFA26:
         return "\u90FD";
     case 0xFA2A:
         return "\u98EF";
     case 0xFA2B:
         return "\u98FC";
     case 0xFA2C:
         return "\u9928";
     case 0xFA2D:
         return "\u9DB4";
     case 0xFA30:
         return "\u4FAE";
     case 0xFA31:
         return "\u50E7";
     case 0xFA32:
         return "\u514D";
     case 0xFA33:
         return "\u52C9";
     case 0xFA34:
         return "\u52E4";
     case 0xFA35:
         return "\u5351";
     case 0xFA36:
         return "\u559D";
     case 0xFA37:
         return "\u5606";
     case 0xFA38:
         return "\u5668";
     case 0xFA39:
         return "\u5840";
     case 0xFA3A:
         return "\u58A8";
     case 0xFA3B:
         return "\u5C64";
     case 0xFA3C:
         return "\u5C6E";
     case 0xFA3D:
         return "\u6094";
     case 0xFA3E:
         return "\u6168";
     case 0xFA3F:
         return "\u618E";
     case 0xFA40:
         return "\u61F2";
     case 0xFA41:
         return "\u654F";
     case 0xFA42:
         return "\u65E2";
     case 0xFA43:
         return "\u6691";
     case 0xFA44:
         return "\u6885";
     case 0xFA45:
         return "\u6D77";
     case 0xFA46:
         return "\u6E1A";
     case 0xFA47:
         return "\u6F22";
     case 0xFA48:
         return "\u716E";
     case 0xFA49:
         return "\u722B";
     case 0xFA4A:
         return "\u7422";
     case 0xFA4B:
         return "\u7891";
     case 0xFA4C:
         return "\u793E";
     case 0xFA4D:
         return "\u7949";
     case 0xFA4E:
         return "\u7948";
     case 0xFA4F:
         return "\u7950";
     case 0xFA50:
         return "\u7956";
     case 0xFA51:
         return "\u795D";
     case 0xFA52:
         return "\u798D";
     case 0xFA53:
         return "\u798E";
     case 0xFA54:
         return "\u7A40";
     case 0xFA55:
         return "\u7A81";
     case 0xFA56:
         return "\u7BC0";
     case 0xFA57:
         return "\u7DF4";
     case 0xFA58:
         return "\u7E09";
     case 0xFA59:
         return "\u7E41";
     case 0xFA5A:
         return "\u7F72";
     case 0xFA5B:
         return "\u8005";
     case 0xFA5C:
         return "\u81ED";
     case 0xFA5D:
         return "\u8279";
     case 0xFA5E:
         return "\u8279";
     case 0xFA5F:
         return "\u8457";
     case 0xFA60:
         return "\u8910";
     case 0xFA61:
         return "\u8996";
     case 0xFA62:
         return "\u8B01";
     case 0xFA63:
         return "\u8B39";
     case 0xFA64:
         return "\u8CD3";
     case 0xFA65:
         return "\u8D08";
     case 0xFA66:
         return "\u8FB6";
     case 0xFA67:
         return "\u9038";
     case 0xFA68:
         return "\u96E3";
     case 0xFA69:
         return "\u97FF";
     case 0xFA6A:
         return "\u983B";
     case 0xFA70:
         return "\u4E26";
     case 0xFA71:
         return "\u51B5";
     case 0xFA72:
         return "\u5168";
     case 0xFA73:
         return "\u4F80";
     case 0xFA74:
         return "\u5145";
     case 0xFA75:
         return "\u5180";
     case 0xFA76:
         return "\u52C7";
     case 0xFA77:
         return "\u52FA";
     case 0xFA78:
         return "\u559D";
     case 0xFA79:
         return "\u5555";
     case 0xFA7A:
         return "\u5599";
     case 0xFA7B:
         return "\u55E2";
     case 0xFA7C:
         return "\u585A";
     case 0xFA7D:
         return "\u58B3";
     case 0xFA7E:
         return "\u5944";
     case 0xFA7F:
         return "\u5954";
     case 0xFA80:
         return "\u5A62";
     case 0xFA81:
         return "\u5B28";
     case 0xFA82:
         return "\u5ED2";
     case 0xFA83:
         return "\u5ED9";
     case 0xFA84:
         return "\u5F69";
     case 0xFA85:
         return "\u5FAD";
     case 0xFA86:
         return "\u60D8";
     case 0xFA87:
         return "\u614E";
     case 0xFA88:
         return "\u6108";
     case 0xFA89:
         return "\u618E";
     case 0xFA8A:
         return "\u6160";
     case 0xFA8B:
         return "\u61F2";
     case 0xFA8C:
         return "\u6234";
     case 0xFA8D:
         return "\u63C4";
     case 0xFA8E:
         return "\u641C";
     case 0xFA8F:
         return "\u6452";
     case 0xFA90:
         return "\u6556";
     case 0xFA91:
         return "\u6674";
     case 0xFA92:
         return "\u6717";
     case 0xFA93:
         return "\u671B";
     case 0xFA94:
         return "\u6756";
     case 0xFA95:
         return "\u6B79";
     case 0xFA96:
         return "\u6BBA";
     case 0xFA97:
         return "\u6D41";
     case 0xFA98:
         return "\u6EDB";
     case 0xFA99:
         return "\u6ECB";
     case 0xFA9A:
         return "\u6F22";
     case 0xFA9B:
         return "\u701E";
     case 0xFA9C:
         return "\u716E";
     case 0xFA9D:
         return "\u77A7";
     case 0xFA9E:
         return "\u7235";
     case 0xFA9F:
         return "\u72AF";
     case 0xFAA0:
         return "\u732A";
     case 0xFAA1:
         return "\u7471";
     case 0xFAA2:
         return "\u7506";
     case 0xFAA3:
         return "\u753B";
     case 0xFAA4:
         return "\u761D";
     case 0xFAA5:
         return "\u761F";
     case 0xFAA6:
         return "\u76CA";
     case 0xFAA7:
         return "\u76DB";
     case 0xFAA8:
         return "\u76F4";
     case 0xFAA9:
         return "\u774A";
     case 0xFAAA:
         return "\u7740";
     case 0xFAAB:
         return "\u78CC";
     case 0xFAAC:
         return "\u7AB1";
     case 0xFAAD:
         return "\u7BC0";
     case 0xFAAE:
         return "\u7C7B";
     case 0xFAAF:
         return "\u7D5B";
     case 0xFAB0:
         return "\u7DF4";
     case 0xFAB1:
         return "\u7F3E";
     case 0xFAB2:
         return "\u8005";
     case 0xFAB3:
         return "\u8352";
     case 0xFAB4:
         return "\u83EF";
     case 0xFAB5:
         return "\u8779";
     case 0xFAB6:
         return "\u8941";
     case 0xFAB7:
         return "\u8986";
     case 0xFAB8:
         return "\u8996";
     case 0xFAB9:
         return "\u8ABF";
     case 0xFABA:
         return "\u8AF8";
     case 0xFABB:
         return "\u8ACB";
     case 0xFABC:
         return "\u8B01";
     case 0xFABD:
         return "\u8AFE";
     case 0xFABE:
         return "\u8AED";
     case 0xFABF:
         return "\u8B39";
     case 0xFAC0:
         return "\u8B8A";
     case 0xFAC1:
         return "\u8D08";
     case 0xFAC2:
         return "\u8F38";
     case 0xFAC3:
         return "\u9072";
     case 0xFAC4:
         return "\u9199";
     case 0xFAC5:
         return "\u9276";
     case 0xFAC6:
         return "\u967C";
     case 0xFAC7:
         return "\u96E3";
     case 0xFAC8:
         return "\u9756";
     case 0xFAC9:
         return "\u97DB";
     case 0xFACA:
         return "\u97FF";
     case 0xFACB:
         return "\u980B";
     case 0xFACC:
         return "\u983B";
     case 0xFACD:
         return "\u9B12";
     case 0xFACE:
         return "\u9F9C";
     case 0xFACF:
         return "\ud84a\udc4a";
     case 0xFAD0:
         return "\ud84a\udc44";
     case 0xFAD1:
         return "\ud84c\udfd5";
     case 0xFAD2:
         return "\u3B9D";
     case 0xFAD3:
         return "\u4018";
     case 0xFAD4:
         return "\u4039";
     case 0xFAD5:
         return "\ud854\ude49";
     case 0xFAD6:
         return "\ud857\udcd0";
     case 0xFAD7:
         return "\ud85f\uded3";
     case 0xFAD8:
         return "\u9F43";
     case 0xFAD9:
         return "\u9F8E";
     case 0xFB1D:
         return "\u05D9\u05B4";
     case 0xFB1F:
         return "\u05F2\u05B7";
     case 0xFB2A:
         return "\u05E9\u05C1";
     case 0xFB2B:
         return "\u05E9\u05C2";
     case 0xFB2C:
         return "\uFB49\u05C1";
     case 0xFB2D:
         return "\uFB49\u05C2";
     case 0xFB2E:
         return "\u05D0\u05B7";
     case 0xFB2F:
         return "\u05D0\u05B8";
     case 0xFB30:
         return "\u05D0\u05BC";
     case 0xFB31:
         return "\u05D1\u05BC";
     case 0xFB32:
         return "\u05D2\u05BC";
     case 0xFB33:
         return "\u05D3\u05BC";
     case 0xFB34:
         return "\u05D4\u05BC";
     case 0xFB35:
         return "\u05D5\u05BC";
     case 0xFB36:
         return "\u05D6\u05BC";
     case 0xFB38:
         return "\u05D8\u05BC";
     case 0xFB39:
         return "\u05D9\u05BC";
     case 0xFB3A:
         return "\u05DA\u05BC";
     case 0xFB3B:
         return "\u05DB\u05BC";
     case 0xFB3C:
         return "\u05DC\u05BC";
     case 0xFB3E:
         return "\u05DE\u05BC";
     case 0xFB40:
         return "\u05E0\u05BC";
     case 0xFB41:
         return "\u05E1\u05BC";
     case 0xFB43:
         return "\u05E3\u05BC";
     case 0xFB44:
         return "\u05E4\u05BC";
     case 0xFB46:
         return "\u05E6\u05BC";
     case 0xFB47:
         return "\u05E7\u05BC";
     case 0xFB48:
         return "\u05E8\u05BC";
     case 0xFB49:
         return "\u05E9\u05BC";
     case 0xFB4A:
         return "\u05EA\u05BC";
     case 0xFB4B:
         return "\u05D5\u05B9";
     case 0xFB4C:
         return "\u05D1\u05BF";
     case 0xFB4D:
         return "\u05DB\u05BF";
     case 0xFB4E:
         return "\u05E4\u05BF";
     case 0x1D15E:
         return "\ud834\udd57\ud834\udd65";
     case 0x1D15F:
         return "\ud834\udd58\ud834\udd65";
     case 0x1D160:
         return "\ud834\udd5f\ud834\udd6e";
     case 0x1D161:
         return "\ud834\udd5f\ud834\udd6f";
     case 0x1D162:
         return "\ud834\udd5f\ud834\udd70";
     case 0x1D163:
         return "\ud834\udd5f\ud834\udd71";
     case 0x1D164:
         return "\ud834\udd5f\ud834\udd72";
     case 0x1D1BB:
         return "\ud834\uddb9\ud834\udd65";
     case 0x1D1BC:
         return "\ud834\uddba\ud834\udd65";
     case 0x1D1BD:
         return "\ud834\uddbb\ud834\udd6e";
     case 0x1D1BE:
         return "\ud834\uddbc\ud834\udd6e";
     case 0x1D1BF:
         return "\ud834\uddbb\ud834\udd6f";
     case 0x1D1C0:
         return "\ud834\uddbc\ud834\udd6f";
     case 0x2F800:
         return "\u4E3D";
     case 0x2F801:
         return "\u4E38";
     case 0x2F802:
         return "\u4E41";
     case 0x2F803:
         return "\ud840\udd22";
     case 0x2F804:
         return "\u4F60";
     case 0x2F805:
         return "\u4FAE";
     case 0x2F806:
         return "\u4FBB";
     case 0x2F807:
         return "\u5002";
     case 0x2F808:
         return "\u507A";
     case 0x2F809:
         return "\u5099";
     case 0x2F80A:
         return "\u50E7";
     case 0x2F80B:
         return "\u50CF";
     case 0x2F80C:
         return "\u349E";
     case 0x2F80D:
         return "\ud841\ude3a";
     case 0x2F80E:
         return "\u514D";
     case 0x2F80F:
         return "\u5154";
     case 0x2F810:
         return "\u5164";
     case 0x2F811:
         return "\u5177";
     case 0x2F812:
         return "\ud841\udd1c";
     case 0x2F813:
         return "\u34B9";
     case 0x2F814:
         return "\u5167";
     case 0x2F815:
         return "\u518D";
     case 0x2F816:
         return "\ud841\udd4b";
     case 0x2F817:
         return "\u5197";
     case 0x2F818:
         return "\u51A4";
     case 0x2F819:
         return "\u4ECC";
     case 0x2F81A:
         return "\u51AC";
     case 0x2F81B:
         return "\u51B5";
     case 0x2F81C:
         return "\ud864\udddf";
     case 0x2F81D:
         return "\u51F5";
     case 0x2F81E:
         return "\u5203";
     case 0x2F81F:
         return "\u34DF";
     case 0x2F820:
         return "\u523B";
     case 0x2F821:
         return "\u5246";
     case 0x2F822:
         return "\u5272";
     case 0x2F823:
         return "\u5277";
     case 0x2F824:
         return "\u3515";
     case 0x2F825:
         return "\u52C7";
     case 0x2F826:
         return "\u52C9";
     case 0x2F827:
         return "\u52E4";
     case 0x2F828:
         return "\u52FA";
     case 0x2F829:
         return "\u5305";
     case 0x2F82A:
         return "\u5306";
     case 0x2F82B:
         return "\u5317";
     case 0x2F82C:
         return "\u5349";
     case 0x2F82D:
         return "\u5351";
     case 0x2F82E:
         return "\u535A";
     case 0x2F82F:
         return "\u5373";
     case 0x2F830:
         return "\u537D";
     case 0x2F831:
         return "\u537F";
     case 0x2F832:
         return "\u537F";
     case 0x2F833:
         return "\u537F";
     case 0x2F834:
         return "\ud842\ude2c";
     case 0x2F835:
         return "\u7070";
     case 0x2F836:
         return "\u53CA";
     case 0x2F837:
         return "\u53DF";
     case 0x2F838:
         return "\ud842\udf63";
     case 0x2F839:
         return "\u53EB";
     case 0x2F83A:
         return "\u53F1";
     case 0x2F83B:
         return "\u5406";
     case 0x2F83C:
         return "\u549E";
     case 0x2F83D:
         return "\u5438";
     case 0x2F83E:
         return "\u5448";
     case 0x2F83F:
         return "\u5468";
     case 0x2F840:
         return "\u54A2";
     case 0x2F841:
         return "\u54F6";
     case 0x2F842:
         return "\u5510";
     case 0x2F843:
         return "\u5553";
     case 0x2F844:
         return "\u5563";
     case 0x2F845:
         return "\u5584";
     case 0x2F846:
         return "\u5584";
     case 0x2F847:
         return "\u5599";
     case 0x2F848:
         return "\u55AB";
     case 0x2F849:
         return "\u55B3";
     case 0x2F84A:
         return "\u55C2";
     case 0x2F84B:
         return "\u5716";
     case 0x2F84C:
         return "\u5606";
     case 0x2F84D:
         return "\u5717";
     case 0x2F84E:
         return "\u5651";
     case 0x2F84F:
         return "\u5674";
     case 0x2F850:
         return "\u5207";
     case 0x2F851:
         return "\u58EE";
     case 0x2F852:
         return "\u57CE";
     case 0x2F853:
         return "\u57F4";
     case 0x2F854:
         return "\u580D";
     case 0x2F855:
         return "\u578B";
     case 0x2F856:
         return "\u5832";
     case 0x2F857:
         return "\u5831";
     case 0x2F858:
         return "\u58AC";
     case 0x2F859:
         return "\ud845\udce4";
     case 0x2F85A:
         return "\u58F2";
     case 0x2F85B:
         return "\u58F7";
     case 0x2F85C:
         return "\u5906";
     case 0x2F85D:
         return "\u591A";
     case 0x2F85E:
         return "\u5922";
     case 0x2F85F:
         return "\u5962";
     case 0x2F860:
         return "\ud845\udea8";
     case 0x2F861:
         return "\ud845\udeea";
     case 0x2F862:
         return "\u59EC";
     case 0x2F863:
         return "\u5A1B";
     case 0x2F864:
         return "\u5A27";
     case 0x2F865:
         return "\u59D8";
     case 0x2F866:
         return "\u5A66";
     case 0x2F867:
         return "\u36EE";
     case 0x2F868:
         return "\u36FC";
     case 0x2F869:
         return "\u5B08";
     case 0x2F86A:
         return "\u5B3E";
     case 0x2F86B:
         return "\u5B3E";
     case 0x2F86C:
         return "\ud846\uddc8";
     case 0x2F86D:
         return "\u5BC3";
     case 0x2F86E:
         return "\u5BD8";
     case 0x2F86F:
         return "\u5BE7";
     case 0x2F870:
         return "\u5BF3";
     case 0x2F871:
         return "\ud846\udf18";
     case 0x2F872:
         return "\u5BFF";
     case 0x2F873:
         return "\u5C06";
     case 0x2F874:
         return "\u5F53";
     case 0x2F875:
         return "\u5C22";
     case 0x2F876:
         return "\u3781";
     case 0x2F877:
         return "\u5C60";
     case 0x2F878:
         return "\u5C6E";
     case 0x2F879:
         return "\u5CC0";
     case 0x2F87A:
         return "\u5C8D";
     case 0x2F87B:
         return "\ud847\udde4";
     case 0x2F87C:
         return "\u5D43";
     case 0x2F87D:
         return "\ud847\udde6";
     case 0x2F87E:
         return "\u5D6E";
     case 0x2F87F:
         return "\u5D6B";
     case 0x2F880:
         return "\u5D7C";
     case 0x2F881:
         return "\u5DE1";
     case 0x2F882:
         return "\u5DE2";
     case 0x2F883:
         return "\u382F";
   &n