"Fossies" - the Fresh Open Source Software Archive

Member "edict/edict" (25 Jun 2010, 83330 Bytes) of package /linux/privat/old/edict-2.6.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #!/usr/bin/perl -W
    2 
    3 ##############################################################################
    4 # edict - Your personal command line dictionary
    5 #
    6 # Copyright (c) 2002-2008 Vishal Verma <vermavee@users.sf.net>. 
    7 # All rights reserved.
    8 # 
    9 #    This program is free software; you can redistribute it and/or modify
   10 #    it under the terms of the GNU General Public License as published by
   11 #    the Free Software Foundation; either version 2 of the License, or
   12 #    (at your option) any later version.
   13 #
   14 #    This program is distributed in the hope that it will be useful,
   15 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
   16 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17 #    GNU General Public License for more details.
   18 #
   19 #    You should have received a copy of the GNU General Public License
   20 #    along with this program; if not, write to the Free Software
   21 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   22 #
   23 # ChangeLog is maintained as a separate file.
   24 #
   25 ##############################################################################
   26 
   27 use Socket;
   28 use Getopt::Std;
   29 use strict;
   30 use Text::Wrap;
   31 use File::stat;
   32 $Text::Wrap::columns = 80;
   33 
   34 # this is just a temporary fix for perl 5.8.0. 5.8.1 won't need this
   35 use bytes;
   36 
   37 # error codes returned by gethostbyname: BUG 769932
   38 my @netdb_errors = (    'Success',
   39             'Host not found!',
   40             'Non-authoritative - host not found',
   41             'Non-recoverable errors',
   42             'Valid name, no data record of requested type',
   43             'Internal error' # actually -1. Yes, it's a hack! :)
   44         );
   45                         
   46 
   47 
   48 # sub prototypes
   49 sub edict_parse_cmdline();
   50 sub edict_read_config();
   51 sub edict_lookup($$$$);
   52 sub edict_indexof($$);
   53 sub edict_parse_response($$$);
   54 sub edict_show_suggestions($$$);
   55 sub edict_http_send_and_recv($);
   56 sub edict_edict();
   57 sub edict_list_dictionaries();
   58 sub edict_print_centered($);
   59 sub edict_sugg_trim($$);
   60 sub edict_print_centered($);
   61 sub edict_html2plain($);
   62 sub edict_rid_chunked($);
   63 sub edict_wget($$);
   64 sub edict_show_news();
   65 sub edict_secs_since_last_news();
   66 sub edict_update_last_news_file();
   67 
   68 # global vars
   69 my $version = '2.6';
   70 our ($opt_c, $opt_p, $opt_l, $opt_d, $opt_i, $opt_o, $opt_n);
   71 my %digraph;
   72 my $read_from_stdin = 0; # whether to read the HTTP response from the stdin
   73 my $save_to_file;   # name of the file to save the HTTP response recd.
   74 
   75 # Configuration files
   76 use constant EDICT_CONF_FILE    => '.edictrc';
   77 use constant EDICT_UNIX_CONF    => "/etc/".EDICT_CONF_FILE;
   78 use constant EDICT_UNIX_USER_CONF => exists($ENV{HOME}) ? 
   79     "$ENV{HOME}/".EDICT_CONF_FILE : '';
   80 #use constant EDICT_WIN_CONF    => (-d 'C:\\WINDOWS' ? 
   81 #   'C:\\WINDOWS\\system32\\' : 'C:\\WINNT\\').EDICT_CONF_FILE;
   82 use constant EDICT_WIN_CONF => exists($ENV{SYSTEMROOT}) ?
   83     $ENV{SYSTEMROOT}.'\\'.EDICT_CONF_FILE : '';
   84 use constant EDICT_WIN_USER_CONF => exists($ENV{USERPROFILE}) ?
   85     $ENV{USERPROFILE}.'\\'.EDICT_CONF_FILE : '';
   86 use constant EDICT_NEWS_FILE => ($^O =~ /mswin/oi ?
   87                                 'C:\WINDOWS\TEMP\edict-news.txt' :
   88                                 '/tmp/.edict-news.txt');
   89 # have to use a separate file to track last news because either NTFS or the
   90 # ActivePerl on NTFS doesn't seem to support an access-time attributes on the
   91 # file. I was going to use accesstime to keep track of when last news were
   92 # displayed.
   93 use constant EDICT_LAST_NEWS_FILE => ($^O =~ /mswin/oi ?
   94                                 'C:\WINDOWS\TEMP\edict-news.last' :
   95                                 '/tmp/.edict-news.last');
   96 
   97 # default server, to send HTTP request to. Command line switches may override.
   98 my $proxy_server;
   99 # port, if specified by the user
  100 my $proxy_port;
  101 
  102 # Whether the dictionary should offer suggestions (if available), or not
  103 my $suggest = 1;
  104 my $nsugg = 2;      # how many suggestions to offer by default
  105 
  106 # Whether to use color or not
  107 my $color = 1;
  108 
  109 # Sample HTTP request for use by various dictionaries
  110 my @http_request = ('METHOD',
  111     #'Proxy-Connection: Keep-Alive',
  112     'Accept: text/html',
  113     'HOST',
  114     #'REFERER',
  115     'Connection: Keep-Alive',
  116     'CONTENTTYPE',
  117     'CONTENTLEN',
  118     '',
  119     'CONTENT'
  120 );
  121 
  122 # constants; these are closely related to the request above
  123 my $http_method     = edict_indexof(\@http_request, 'METHOD');
  124 #my $http_referer   = edict_indexof(\@http_request, 'REFERER');
  125 my $http_host       = edict_indexof(\@http_request, 'HOST');
  126 my $http_content_len    = edict_indexof(\@http_request, 'CONTENTLEN');
  127 my $http_content_type   = edict_indexof(\@http_request, 'CONTENTTYPE');
  128 my $http_content    = edict_indexof(\@http_request, 'CONTENT');
  129 
  130 
  131 
  132 
  133 #############  Define each dictionary specific data here #############
  134 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  135 # m-w dictionary
  136 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  137 my %mwdict = (
  138     'TITLE' => 'Merriam Webster Online Dictionary',
  139     'CREATE_REQUEST' => \&mw_create_request,
  140     'PARSE_RESPONSE' => \&mw_parse_response,
  141     'GET_SUGGESTIONS' => \&mw_get_suggestions,
  142 );
  143 
  144 # m-w thesaurus
  145 my %mwthes = (
  146     'TITLE' => 'Merriam Webster Online Thesaurus',
  147     'CREATE_REQUEST' => \&mw_create_request,
  148     'PARSE_RESPONSE' => \&mw_parse_response,
  149     'GET_SUGGESTIONS' => \&mw_get_suggestions,
  150     );
  151 
  152 # m-w function prototypes
  153 sub mw_create_request($$$);
  154 sub mw_create_content($);
  155 sub mw_parse_response($$$);
  156 sub mw_get_suggestions($$$);
  157 
  158 
  159 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  160 # dictionary.com definitions
  161 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  162 my %dictionarydotcom = (
  163     'TITLE' => 'www.dictionary.com',
  164     'CREATE_REQUEST' => \&dictionarydotcom_create_request,
  165     'PARSE_RESPONSE' => \&dictionarydotcom_parse_response,
  166     'GET_SUGGESTIONS' => \&dictionarydotcom_get_suggestions,
  167     );
  168 
  169 my %thesaurusdotcom = (
  170     'TITLE' => 'www.thesaurus.com',
  171     'CREATE_REQUEST' => \&dictionarydotcom_create_request,
  172     'PARSE_RESPONSE' => \&dictionarydotcom_parse_response,
  173     'GET_SUGGESTIONS' => \&dictionarydotcom_get_suggestions,
  174     );
  175 
  176 # dictionary.com functions
  177 sub dictionarydotcom_create_request($$$);
  178 sub dictionarydotcom_parse_response($$$);
  179 sub dictionarydotcom_get_suggestions($$$);
  180 
  181 
  182 
  183 # List of dictionaries. Add your own below.
  184 my %dicts = (
  185     'mwdict', \%mwdict,
  186     'mwthes', \%mwthes,
  187     #'dictionary.com', \%dictionarydotcom,
  188     #'thesaurus.com', \%thesaurusdotcom,
  189     );
  190 
  191 
  192 # Default dictionary to use. Command line/Config options may override this OR 
  193 # you may change it here. The assigned values should be one of the keys of hash
  194 # %dicts which is defined above.
  195 my $cur_dict = 'mwdict';
  196 if ($0 =~ /ethes$/) {
  197     $cur_dict = 'mwthes';
  198 }
  199 
  200 
  201 
  202 
  203 
  204 ##############################################################################
  205 #                           MAIN program                                     #
  206 ##############################################################################
  207 
  208 $0 =~ s/^.*\///o;
  209 $0 =~ s/^.*\\//o;   # Win32: Bug [ 756309 ] Don't show full path in usage
  210 
  211 # show news
  212 edict_show_news;
  213 
  214 # read configuration file
  215 edict_read_config;
  216 
  217 print "edict - Your personal command line dictionary. Version $version.\n";
  218 # parse the command line options
  219 edict_parse_cmdline;
  220 
  221 if (defined $opt_l) {
  222     edict_list_dictionaries;
  223 } elsif (@ARGV <= 0) {
  224     die "Usage:\n    $0 [-cl] [-p proxy:port] [-d <dict>] <word1> [ <word2> ] ...\n";
  225 } else {
  226     if (defined $opt_i) {
  227         $read_from_stdin = 1;
  228     }
  229     edict_edict;
  230 }
  231 
  232 
  233 
  234 
  235 ##############################################################################
  236 # edict_indexof
  237 #
  238 # finds the index of given element in a given array. The elements are assumed
  239 # to be strings.
  240 ##############################################################################
  241 
  242 sub edict_indexof($$)
  243 {
  244     my $list = shift;
  245     my $word = shift;
  246 
  247     my $not_found = 1;
  248     return grep {$not_found &= $word ne $_} @{$list};
  249 }
  250 
  251 ###########################################################################
  252 # edict_show_news
  253 #
  254 # Show news after downloading them
  255 ###########################################################################
  256 
  257 sub edict_show_news()
  258 {
  259     # get the last time we showed news
  260     my $secs_since_last_news = edict_secs_since_last_news();
  261     my $secs_since_last_news_dwnld = edict_secs_since_last_news_dwnld();
  262     my $news;
  263 
  264     if (! -f EDICT_NEWS_FILE || $secs_since_last_news_dwnld > 86400) {
  265         $news = edict_wget(
  266             'http://edictionary.sourceforge.net/edict-news.txt',
  267             EDICT_NEWS_FILE);
  268         # continue silently if can't get news
  269         return unless defined $news;
  270     } else {
  271         my $i=0;
  272         my @news;
  273         open(NEWS, "<".EDICT_NEWS_FILE) || die $!;
  274         while (<NEWS>) {
  275             chomp($news[$i++] = $_);
  276         }
  277         close(NEWS);
  278         $news = \@news;
  279     }
  280     edict_update_last_news_file();
  281 
  282     my $n = shift @{$news};
  283     my ($latest_version, $msg) = split(/;/, $n);;
  284     if ($latest_version =~ /^\d\.\d$/ && $latest_version > $version) {
  285         if (defined $msg) {
  286             print "$msg\n";
  287         } else {
  288             print "--> A new version of edictionary ($latest_version) is now available. <--\n--> Go to http://edictionary.sf.net and click on Download. <--\n";
  289         }
  290     }
  291 
  292     foreach $n (@{$news}) {
  293         my ($interval, $msg) = split(/;/, $n);
  294         #print "last news $secs_since_last_news, interval: $interval\n";
  295         if ($secs_since_last_news > $interval) {
  296             print "--> $msg <--\n";
  297         }
  298     }
  299 }
  300 
  301 
  302 
  303 ###########################################################################
  304 # edict_wget
  305 #
  306 # Grab a URL using HTTP get and return the result as an array of text lines.
  307 ###########################################################################
  308 sub edict_wget($$)
  309 {
  310     my $sin;
  311     my $line = 0;
  312     my ($url, $target) = @_;
  313     $url =~ m#http://([^/]*)(.*$)#o;
  314     my ($host, $path) = ($1, $2);
  315     my $addr = gethostbyname($host);
  316     return undef unless defined $addr;
  317     $sin = sockaddr_in(80, $addr);
  318     socket(URL, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  319     return undef unless connect(URL, $sin);
  320     send URL, "GET $path HTTP/1.1\r\nHOST: $host\r\nAccept: text/html\r\nConnection: close\r\n\r\n", 0;
  321     my @content;
  322     my ($content, $content_length) = ('');
  323     my $content_started = 0;
  324     while (<URL>) {
  325         #print $_;
  326         if (!$content_started) {
  327             if (/Content-length: (\d+)/) {
  328                 $content_length = $1;
  329             }
  330             if (/^\r\n$/) {
  331                 $content_started = 1;
  332             }
  333             next;
  334         }
  335         $content .= $_;
  336     }
  337     if (defined $target) {
  338         open (FILE, ">$target");
  339         print FILE $content;
  340         close FILE;
  341     }
  342 
  343     close(URL);
  344     @content = split(/\n/, $content);
  345     return \@content;
  346 }
  347 
  348 
  349 
  350 sub edict_secs_since_last_news()
  351 {
  352     return 2147483647 unless (-f EDICT_LAST_NEWS_FILE);
  353     my $sb = stat(EDICT_LAST_NEWS_FILE);
  354     return time - $sb->mtime;
  355 }
  356 
  357 sub edict_update_last_news_file()
  358 {
  359     open(NEWS, ">".EDICT_LAST_NEWS_FILE) && close(NEWS);
  360 }
  361 
  362 
  363 sub edict_secs_since_last_news_dwnld()
  364 {
  365     return 2147483647 unless (-f EDICT_NEWS_FILE);
  366     my $sb = stat(EDICT_NEWS_FILE);
  367     return time - $sb->mtime;
  368 }
  369 
  370 
  371 ##############################################################################
  372 # edict_parse_cmdline
  373 #
  374 # parses command line options and sets up various variables accordingly
  375 ##############################################################################
  376 
  377 sub edict_parse_cmdline()
  378 {
  379     getopts('clinp:d:o:');
  380     if (defined $opt_p) {
  381         # if user specified just a port
  382         if ($opt_p =~ /^\d+$/) {
  383             $proxy_port = $opt_p;
  384         } elsif ($opt_p =~ /\w+:\d+/) { # user specified host & port
  385             # split host:port into host & port
  386             ($proxy_server, $proxy_port) = split /:/, $opt_p;
  387         } else {
  388             $proxy_server = $opt_p;
  389         }
  390     }
  391 
  392     if (defined $opt_d) {
  393         # see if the dictionary exists
  394         if (defined $dicts{$opt_d}) {
  395             $cur_dict = $opt_d;
  396         } else {
  397             $cur_dict = undef;
  398             print STDERR "Dictionary \"$opt_d\" not found!\nedict -l shows a list of available dictionaries\n";
  399         }
  400     }
  401 
  402     if (defined $opt_o) {
  403         $save_to_file = $opt_o;
  404     }
  405 
  406     if (defined $opt_c) {
  407         $color = 0;
  408     }
  409 
  410     # RFE 922682 - provide a no suggestions option
  411     if (defined $opt_n) {
  412         $suggest = 0;
  413     }
  414 }
  415 
  416 
  417 
  418 
  419 ##############################################################################
  420 # edict_edict
  421 #
  422 # performs lookup for all the words specified on the commandline
  423 ##############################################################################
  424 sub edict_edict()
  425 {
  426     edict_lookup(shift(@ARGV), $cur_dict, $suggest, $nsugg);
  427     foreach (@ARGV) {
  428         print "----------------------------------------------------------\n";
  429         edict_lookup($_, $cur_dict, $suggest, $nsugg);
  430     }
  431 }
  432 
  433 
  434 
  435 
  436 ##############################################################################
  437 # edict_lookup
  438 #
  439 # looks up the given word in given dictionary for meaning
  440 ##############################################################################
  441 
  442 sub edict_lookup($$$$)
  443 {
  444     my $C = {};         # the context
  445 
  446     # the word and the dict to look it up in
  447     ($C->{word}, $C->{dict}) = (shift, shift);
  448 
  449     return unless defined $C->{dict};
  450 
  451     # whether to show suggestions or not. If not, how many suggestions
  452     my ($suggest, $nsugg) = @_;
  453     # other local vars
  454     my (@suggestions, $choice);
  455     my $start = 0;
  456 
  457     while (1) {
  458 
  459         # create the HTTP request
  460         my $req = &{$dicts{$C->{dict}}{'CREATE_REQUEST'}}
  461                 ($start, $nsugg, $C);
  462 
  463         print "Looking up \"$C->{word}\" in $dicts{$C->{dict}}->{TITLE}...\n" if defined $req;
  464 
  465         # Send the HTTP request
  466         #print defined $req ? join("\n", @{$req}) : "undef", "\n";
  467         $C->{response} = edict_http_send_and_recv($req);
  468         #print ${$C->{response}};
  469 
  470         # if we got a response, parse it
  471         edict_parse_response($start, $nsugg, $C);
  472 
  473         # stop if we are not supposed to offer suggestions
  474         last unless $suggest;
  475             
  476         my $suggestions = &{$dicts{$C->{dict}}{'GET_SUGGESTIONS'}}
  477                             ($start, $nsugg, $C);
  478         #print "# of suggestions: "; 
  479         #print defined $suggestions ? scalar(@{$suggestions}) : 
  480                 #'undef', "\n";
  481 
  482         # delete the word, as we are no longer requesting the word
  483         # meaning if user chooses a suggestion below, it will be set up
  484         # again
  485         delete $C->{word};
  486 
  487         # if suggestions is 'undef', we need to do another iteration to
  488         # find out the suggestions
  489         next unless defined $suggestions;
  490 
  491         # stop if no suggestions were available
  492         last unless @{$suggestions};
  493 
  494         # trim suggestions, if greater than requested
  495         splice @{$suggestions}, $nsugg if @{$suggestions} > $nsugg;
  496 
  497         # show suggestions
  498         edict_show_suggestions($start, $suggestions,
  499                         $C->{nsuggestions});
  500 
  501         print "Your choice: ";
  502         # accept user input
  503         $choice = <STDIN>;
  504         last unless defined $choice;
  505         chomp $choice;
  506     
  507         # user chose one of the sugggestions
  508         if ($choice =~ /^\d+$/o) {
  509             --$choice;
  510             #print "start: $start, choice: $choice, ", scalar(@{$suggestions}), "\n";
  511             last unless $choice >= $start && 
  512                 $choice < $start + @{$suggestions};
  513             $C->{word} = lc($suggestions->[$choice - $start]);
  514             $C->{choice} = $choice;
  515             next;
  516 
  517         } elsif ($choice eq 'n') {  # next page of suggestions
  518             $start += $nsugg;
  519         } elsif ($choice eq 'p') {
  520             $start -= $nsugg;
  521         } elsif ($choice =~ /^g(\d+)$/o) {
  522             $start = $1 - 1;
  523         } else {
  524             last;
  525         }
  526 
  527         $start = 0 if $start < 0;
  528         $start -= $nsugg if $start >= $C->{nsuggestions};
  529         #print "Going to next iteration with start: $start\n";
  530     }
  531 }
  532 
  533 
  534 ##############################################################################
  535 # edict_parse_response
  536 #
  537 # parses the response and takes actions based on whether it was successful
  538 # or not
  539 ##############################################################################
  540 sub edict_parse_response($$$)
  541 {
  542     my ($start, $nsugg, $C) = @_;
  543 
  544     # undefined response => no parsing
  545     return unless defined $C->{response};
  546 
  547     # parse it
  548     &{$dicts{$cur_dict}->{'PARSE_RESPONSE'}}($start, $nsugg, $C);
  549     my $response = ${$C->{response}};
  550 
  551     if (defined $response) {    # display it
  552         $response = wrap('', '', $response);
  553         print $response, "\n";
  554     } else {
  555         # [ 697431 ] edict shows wrong error message for valid words in
  556         # thesaurus
  557         if ($C->{dict} eq 'mwthes') {
  558             print "No thesaurus entries found for $C->{word}.\n";
  559         } else {
  560             print "Don't understand Swahili words like " .
  561                 "$C->{word} ;)!!\n";
  562         }
  563     }
  564 }
  565 
  566 
  567 ##############################################################################
  568 # edict_show_suggestions
  569 #
  570 # Displays given suggestions
  571 ##############################################################################
  572 sub edict_show_suggestions($$$)
  573 {
  574     my ($start, $suggestions, $nsuggestions) = @_;
  575     my $page_info = "[".($start + 1)."-".($start + @{$suggestions}).
  576             " of $nsuggestions]";
  577     print " ------------------------------------------------------------------------------\n";
  578     edict_print_centered("Suggestions/Alternative meanings ".$page_info);
  579     print " ------------------------------------------------------------------------------\n";
  580     # print items two at a time
  581     my $i;
  582     for ($i = 1; $i < @{$suggestions}; $i += 2) {
  583         printf "%2d) %-35s %2d) %-35s\n", 
  584             $start + $i, edict_sugg_trim($suggestions->[$i-1], 35), 
  585             $start + $i+1, edict_sugg_trim($suggestions->[$i], 35);
  586     }
  587     # print the last item if there were odd no. of entries
  588     printf "%2d) %-35s\n", $start + $i, 
  589             edict_sugg_trim($suggestions->[$i-1], 35)
  590             if ((@{$suggestions}) % 2);
  591     print " ------------------------------------------------------------------------------\n";
  592     edict_print_centered("p - prev page; n - next page; gX - jump to Xth entry");
  593 }
  594 
  595 
  596 
  597 
  598 ##############################################################################
  599 # edict_http_send_and_recv
  600 #
  601 # Sends the given HTTP request and returns the response
  602 ##############################################################################
  603 sub edict_http_send_and_recv($)
  604 {
  605     my $req = shift;
  606 
  607     # read the dictionary output from stdin, if user said so
  608     if ($read_from_stdin) {
  609         my $reply = '';
  610         while (<STDIN>) {
  611             $reply .= $_;
  612             last if /<\/html>/;
  613         }
  614         return \$reply;
  615     }
  616     return undef unless defined $req;
  617 
  618     # Get the host from the request
  619     my $req_host = $req->[$http_host];
  620     # keep the hostname, strip the rest
  621     $req_host =~ s/host:\s*//goi;
  622     my $http_server = defined($proxy_server) ?  $proxy_server : $req_host;
  623     die "No valid server to send request to!\n" unless defined $http_server;
  624     my $http_port = defined($proxy_port) ? 
  625                 $proxy_port : getservbyname('http', 'tcp');
  626 
  627     # BUG 915186 - undefined HTTP port number. This should really be fixed
  628     # by each dictionary providing its own port #.
  629     $http_port = 80 unless defined $http_port;
  630 
  631     #print "Port is $http_port, dicthost is $http_server\n";
  632 
  633     die "socket: $!\n" unless
  634         socket(DICT, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  635 
  636     # convert hostname to IP : 769932
  637     my $sin;
  638     if ($http_server =~ /\d+\.\d+\.\d+\.\d+/) {
  639         $sin = sockaddr_in($http_port, inet_aton($http_server));
  640     } else {
  641         my $addr = gethostbyname($http_server);
  642         if (defined $addr) {
  643             #print "connecting to ", inet_ntoa($addr), "\n";
  644             $sin = sockaddr_in($http_port, $addr);
  645         } else {
  646             die "ERROR $http_server: ".$netdb_errors[$?] if $?;
  647         }
  648     }
  649         
  650     #print "connecting to $http_server...\n";
  651     die "connect: $!\n" unless connect(DICT, $sin);
  652 
  653     # send it
  654     my $request = '';
  655     foreach (@{$req}) {
  656         next if $_ eq '--';
  657         $request .= $_."\r\n" if defined $_;
  658     }
  659     send DICT, $request, 0;
  660     #print $request;
  661 
  662     # store reply
  663     my $reply = '';
  664     while (<DICT>) {
  665         #print $_;
  666         $reply .= $_;
  667         last if /<\/html>/;
  668     }
  669     #print "recd reply\n$reply";
  670 
  671     # close connection
  672     close(DICT);
  673 
  674     # save the HTTP response to a file, if asked to do so
  675     if (defined $save_to_file) {
  676         if (open(SAVETO, ">$save_to_file")) {
  677             print SAVETO $reply;
  678             close(SAVETO);
  679         } else {
  680             print STDERR "Couldn't open $save_to_file: $!\n";
  681         }
  682     }
  683 
  684     # return reply
  685     return \$reply;
  686 }
  687 
  688     
  689 
  690 ##############################################################################
  691 # edict_list_dictionaries
  692 #
  693 # Displays the list of available dictionaries
  694 ##############################################################################
  695 sub edict_list_dictionaries()
  696 {
  697     printf "%-25s Description\n", 'Name';
  698     print 
  699 "-------------------------------------------------------------------------------\n";
  700     foreach my $dict (sort keys %dicts) {
  701         printf "%-25s %s\n", $dict, $dicts{$dict}{TITLE};
  702     }
  703 }
  704 
  705 
  706 ##############################################################################
  707 # edict_rid_chunked
  708 #
  709 # Get rid of chunked encoding length indicators from the given text
  710 ##############################################################################
  711 sub edict_rid_chunked($)
  712 {
  713     my $text = shift;
  714 
  715     # Get rid of chunked encoding length indicators
  716     ${$text} =~ s/\r?\n[0-9a-fA-F]+\s*\r?\n//sog;
  717     #print "--------\n", ${$text}, "---------\n";
  718 }
  719 
  720 
  721 ##############################################################################
  722 # edict_html2plain
  723 #
  724 # Convert from HTML to plain text by getting rid of tags
  725 ##############################################################################
  726 sub edict_html2plain($)
  727 {
  728     my $text = shift;
  729     my $subst;
  730 
  731     # fix pronunciation for superscript directives
  732     ${$text} =~ s/<sup>(.)<\/sup>/($1)/sogi;
  733     # fix subscript directives: Bug 771934
  734     ${$text} =~ s/<sub>(\d+)<\/sub>/($1)/sogi;
  735 
  736     # remove other unwanted HTML tags
  737     ${$text} =~ s/<font.*?>//sogi;
  738     ${$text} =~ s/<\/font>//sogi;
  739     ${$text} =~ s/<\/?a(| .*?)>//sogi;
  740     ${$text} =~ s/<img.*?>//sogi;
  741     ${$text} =~ s/<\/?tt>//sogi;
  742     ${$text} =~ s/<\/?t(d|r)>//sogi;
  743     ${$text} =~ s/<\/?table>//sogi;
  744     ${$text} =~ s/<\/?blockquote>//sogi;
  745     ${$text} =~ s/<\/?strong>//sogi;
  746     ${$text} =~ s/<\/?span.*?>//sogi;
  747     ${$text} =~ s/<em class="v">(.*?)<\/em> */\n$1\n/sog;
  748     ${$text} =~ s/<\/?em.*?>//sogi;
  749     ${$text} =~ s/<p.*?>/\n/sogi;
  750     ${$text} =~ s/<\/p>//sogi;
  751     ${$text} =~ s/<br\/>/\n/sog;
  752     ${$text} =~ s/<div.*?>/\n/sogi;
  753     ${$text} =~ s/<\/div>//sogi;
  754     ${$text} =~ s#<input.*?/>##sog;
  755     ${$text} =~ s#<script.*?>.*?</script>##sog;
  756     ${$text} =~ s#<span.*?>##sog;
  757     ${$text} =~ s#</?li>##sog;
  758     ${$text} =~ s#</?ol>##sog;
  759 
  760     # umlauts / digraphs / diacritics
  761     while (${$text} =~ /(&[a-zA-Z]+;)/og) {
  762         $subst = chr($digraph{$1});
  763         ${$text} =~ s/$1/$subst/s;
  764     }
  765 
  766     # characters specified using theri ASCII codes
  767     while (${$text} =~ /(&#(\d+);)/og) {
  768         $subst = chr($2);
  769         ${$text} =~ s/$1/$subst/s;
  770     }
  771 
  772     # Others
  773     #${$text} =~ s/�//og;
  774     #${$text} =~ s/ //og;
  775 }
  776 
  777 
  778 
  779 ##############################################################################
  780 # edict_print_centered
  781 #
  782 # Print a line centered on the screen. Adds a newline at the end.
  783 ##############################################################################
  784 sub edict_print_centered($)
  785 {
  786     my $text = shift;
  787     print " " x ((80 - length($text)) / 2), $text, "\n";
  788 }
  789 
  790 
  791 
  792 ##############################################################################
  793 # edict_sugg_trim
  794 #
  795 # Trims a suggestion by given length
  796 ##############################################################################
  797 sub edict_sugg_trim($$)
  798 {
  799     my ($text, $len) = @_;
  800     my $suffix = '...';
  801     return $text if (length($text) <= $len);
  802     return substr($text, 0, $len - length($suffix)) . $suffix;
  803 }
  804 
  805 
  806 
  807 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  808 #           configuration handling
  809 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  810 
  811 ##############################################################################
  812 # edict_read_config
  813 #
  814 # Reads the configuration files and sets up various parameters that let the
  815 # user customize the operation of edict
  816 ##############################################################################
  817 sub edict_read_config()
  818 {
  819     my @files;
  820 
  821     if (defined $ENV{'EDICT_CONF'}) {
  822         @files = split ':', $ENV{'EDICT_CONF'};
  823     } elsif ($^O =~ /mswin/oi) {        # Windows
  824         @files = (EDICT_WIN_CONF, EDICT_WIN_USER_CONF);
  825     } else {                            # Not Windows. Use UNIX files
  826         @files = (EDICT_UNIX_CONF, EDICT_UNIX_USER_CONF);
  827     }
  828 
  829     foreach my $file (@files) {
  830         unless (open(CONF, $file)) {
  831             # show all errors except "No such file or directory"
  832             print STDERR "$file: $!\n" if -f $file;
  833             next;
  834         }
  835 
  836         my $line = 0;
  837         #print "Reading $file\n";
  838         while (<CONF>) {
  839             ++$line;
  840             next if /^\s*#/o;
  841             my ($token, $val) = ($1, $2) if /\s*(\S+)\s*=\s*(\S+)/o;
  842 
  843             # dict
  844             if ($token eq 'dict') {
  845                 if (defined $dicts{$val}) {
  846                     $cur_dict = $val;
  847                 } else {
  848                     print STDERR "ERROR: $file:$line: Dictionary \"$val\" not found.(Use edict -l).\n";
  849                 }
  850 
  851             # suggperpage
  852             } elsif ($token eq 'suggperpage') {
  853                 if ($val =~ /^\d+$/o) {
  854                     $nsugg = $val;
  855                 } else {
  856                     print STDERR "ERROR: $file:$line: suggperpage should be an integer > 0.\n";
  857                 }
  858 
  859             # suggest
  860             } elsif ($token eq 'suggest') {
  861                 if ($val eq 'yes') {
  862                     $suggest = 1;
  863                 } elsif ($val eq 'no') {
  864                     $suggest = 0;
  865                 } else {
  866                     print STDERR "ERROR: $file:$line: \"suggest\" should be either \"yes\" or \"no\".\n";
  867                 }
  868 
  869             # color
  870             } elsif ($token eq 'color') {
  871                 if ($val eq 'yes') {
  872                     $color = 1;
  873                 } elsif ($val eq 'no') {
  874                     print STDERR "ERROR: $file:$line: \"color\" should be either \"yes\" or \"no\".\n";
  875                 }
  876 
  877             # BUG 1099157: bummer, forgot to code httpproxy
  878             # httpproxy
  879             } elsif ($token eq 'httpproxy') {
  880                 ($proxy_server, $proxy_port) = split /:/, $val;
  881 
  882             # invalid token?
  883             } else {
  884                 print STDERR "ERROR: $file:$line: Syntax error!\n";
  885             }
  886         }
  887     }
  888 }
  889 
  890 
  891 
  892 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  893 #               m-w functions
  894 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  895 
  896 ##############################################################################
  897 # mw_create_request
  898 #
  899 # Creates the HTTP request and 
  900 ##############################################################################
  901 sub mw_create_request($$$)
  902 {
  903     my ($start, $nsugg, $C) = @_;
  904     die "Context is NULL!" unless defined $C;
  905 
  906     return undef unless defined $C->{word};
  907 
  908     # store the word. 
  909     $C->{hdword} = $C->{word} unless defined ${$C->{response}}; 
  910     # NOTE: hdword is a mw specific extension and cannot be assumed to be 
  911     # available in other dictionaries
  912 
  913     my @req = @http_request;
  914     my $target;
  915 
  916     if ($C->{dict} eq 'mwdict') {
  917         $target = 'dictionary';
  918     } elsif ($C->{dict} eq 'mwthes') {
  919         $target = 'thesaurus';
  920     }
  921 
  922     # Make the word HTTP request friendly
  923     $C->{reqword} = $C->{hdword};
  924     $C->{reqword} =~ s/ /%20/;
  925     $C->{reqword} =~ s/\(.*$//;
  926 
  927     unless ($C->{found} && $C->{choice}) {
  928         $req[$http_method] = "GET /$target/$C->{reqword} HTTP/1.1";
  929         $req[$http_content] = '--';
  930         $req[$http_content_len] = '--';
  931         $req[$http_content_type] = '--';
  932     } else {
  933         $req[$http_method] = "POST /$target/$C->{reqword} HTTP/1.1";
  934         $req[$http_content] = mw_create_content($C);
  935         $req[$http_content_len] = 'Content-Length: '.length($req[$http_content]);
  936         $req[$http_content_type] = 'Content-Type: application/x-www-form-urlencoded';
  937     }
  938     $req[$http_host] = 'Host: www.merriam-webster.com';
  939 
  940     return \@req;
  941 }
  942 
  943 
  944 ##############################################################################
  945 # mw_create_content
  946 #
  947 # generates the content for the m-w POST request
  948 ##############################################################################
  949 sub mw_create_content($)
  950 {
  951     my $C = shift;
  952     die "Context is NULL!\n" unless defined $C;
  953 
  954     my $book;
  955 
  956     if ($C->{dict} eq 'mwdict') {
  957         $book = 'Dictionary';
  958     } elsif ($C->{dict} eq 'mwthes') {
  959         $book = 'Thesaurus';
  960     }
  961 
  962     my $content;
  963     $content = "start=0&show=$C->{choice}&ref=\L$book";
  964     return $content;
  965 
  966     unless (defined $C->{meta}) {       # simple case
  967         $content = "book=$book&va=$C->{hdword}";
  968     } else {
  969         # complex case - consider meta information, 
  970         # which is a list of values
  971         # convert non alpha chars in meta to their ascii codes in hex
  972         $C->{meta} =~ s/\[/%5B/og;
  973         $C->{meta} =~ s/\]/%5D/og;
  974         $C->{meta} =~ s/,/%2C/og;
  975         $C->{meta} =~ s/=/%3D/og;
  976         $C->{meta} =~ s/ /%20/og;
  977         my $word = $C->{word};
  978         $word =~ s/\[/%5B/og;
  979         $word =~ s/\]/%5D/og;
  980         $word =~ s/ /%20/og;
  981 
  982         #$content = "hdwd=$C->{hdword}&listword=$C->{hdword}&book=$book&jump=$word&list=$C->{meta}";
  983     }
  984 
  985     #print $content;
  986     return $content;
  987 }
  988 
  989 
  990 
  991 
  992 
  993 
  994 ##############################################################################
  995 # mw_parse_response
  996 #
  997 # parses the response returned by m-w.
  998 ##############################################################################
  999 sub mw_parse_response($$$)
 1000 {
 1001     my ($start, $nsugg, $C) = @_;
 1002     my $word = $C->{word};
 1003 
 1004     my $response = $C->{response};
 1005 
 1006     # no response? do nothing
 1007     return unless defined $response;
 1008 
 1009     # start with no suggestions
 1010     $C->{suggestions} = [];
 1011 
 1012     # get rid of chunked encoding
 1013     edict_rid_chunked($response);
 1014 
 1015     #print "response is : ", ${$response}, "\n";
 1016     # if the word was misspelled, offer suggestions and indicate failure
 1017     if (${$response} =~ s#The word you've entered isn't in the ##s) {
 1018         $C->{found} = 0;
 1019         if (${$response} =~ m#<ol.*?>(.*?)</ol>#so) {
 1020             my $suggestions_text = $1;
 1021             #print "Suggestion text: $suggestions_text\n";
 1022             while ($suggestions_text =~ s#<a .*?>(.*?)</a>##so) {
 1023                 #print "Suggestion: $1\n";
 1024                 push @{$C->{suggestions}}, $1;
 1025                 ++$C->{nsuggestions};
 1026             }
 1027         }
 1028         ${$response} = undef;
 1029         return;
 1030     } else {
 1031         $C->{found} = 1;
 1032     }
 1033 
 1034     # find the number of entries
 1035     if (${$response} =~ s/.*?Entries \d+ to \d+ of (\d+)\.//so) {
 1036         $C->{nsuggestions} = $1;
 1037         #my $nentries = $1;
 1038         #print "entries: $nentries\n";
 1039     } elsif (${$response} =~ s/.*?(\d+) entries found.//so) {
 1040         #print "$C->{nsuggestions} entries found\n";
 1041         $C->{nsuggestions} = $1;
 1042     }
 1043 
 1044     if (defined $C->{nsuggestions} && $C->{nsuggestions} > 10) {
 1045         $C->{nsuggestions} = 10;
 1046     }
 1047 
 1048     while (${$response} =~ s#^.*?class="(dictionary|thesaurus).*?><a.*?>(.*?)</a></li>##so){
 1049         my $sugg = $2;
 1050         $sugg =~ s#<sup>.*?</sup>##og;
 1051         #print "Suggestion $sugg\n";
 1052         push @{$C->{suggestions}}, $sugg;
 1053     }
 1054 
 1055     # -- 8< -- 8< -- edit/prune/splice operations below -- >8 -- >8 --
 1056     # get rid of everything till the start of content
 1057     ${$response} =~ s#^.*?id="mwEntryData".*?<div>##so;
 1058     #print ${$response};
 1059 
 1060     # special case for thesaurus: Print Synonym and other headers with colon
 1061     if ($C->{dict} eq 'mwthes') {
 1062         ${$response} =~ s/Synonyms /Synonyms: /sog;
 1063         ${$response} =~ s/Related Word /Related Words: /sog;
 1064         ${$response} =~ s/Contrasted Words /Contrasted Words: /sog;
 1065     }
 1066 
 1067     # get rid of unwanted trailing html
 1068     ${$response} =~ s#<!--word_definition-->.*##so;
 1069 
 1070     # get rid of html
 1071     edict_html2plain($response);
 1072     #print ${$response}, "\n";
 1073 
 1074     ${$response} =~ s/\xB7/./sog;
 1075 
 1076     # remove unwanted spaces and other misc. changes
 1077     ${$response} =~ s/ {2,}/ /sog;
 1078     ${$response} =~ s/:[^a-zA-Z0-9 ]/: /sogi;
 1079     ${$response} =~ s/(\r?\n){2,}/\n\n/sog; # don't want > 2 consecutive \ns
 1080     ${$response} =~ s/\n\s */\n/sog;
 1081     #print ${$response}, "\n";
 1082 }
 1083 
 1084 
 1085 ##############################################################################
 1086 # mw_get_suggestions
 1087 #
 1088 # Returns $nsugg suggestions starting with $start
 1089 #
 1090 # NOTES specific to m-w implementation:
 1091 # If $C->{suggestions} is 'undef', this means that we couldn't retrieve
 1092 # suggestions. We return 'undef' to communicate that.
 1093 # If $C->{suggestions} is 0, this means we tried to fetch suggestions and
 1094 # no suggestions were available. We return ref to an empty array to 
 1095 # communicate that.
 1096 # If $C->{suggestions} has a +ve value, we return the appropriate number of
 1097 # suggestions.
 1098 ##############################################################################
 1099 sub mw_get_suggestions($$$)
 1100 {
 1101     # start - where to start from
 1102     # nsugg - total number of suggestions
 1103     # C - context
 1104     my ($start, $nsugg, $C) = @_;
 1105     return $C->{suggestions};
 1106     my @sugg = ();
 1107 
 1108     return undef unless defined $C->{suggestions};
 1109     return \@sugg unless @{$C->{suggestions}};
 1110 
 1111     if ($start >= @{$C->{suggestions}} || $nsugg <= 0) {
 1112         return \@sugg;
 1113     }
 1114 
 1115     my $end = $start + $nsugg - 1;
 1116     $end = ($end >= @{$C->{suggestions}}) ? @{$C->{suggestions}} - 1 : $end;
 1117     #print "start: $start, end: $end, nsugg: $nsugg\n";
 1118     for (my $i = $start; $i <= $end; ++$i) {
 1119         push @sugg, $C->{suggestions}->[$i];
 1120     }
 1121     return \@sugg;
 1122 }
 1123 
 1124 
 1125 
 1126 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 1127 # www.dictionary.com functions
 1128 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 1129 
 1130 ##############################################################################
 1131 # dictionarydotcom_create_request
 1132 #
 1133 # generates the HTTP request for dictionary.com
 1134 ##############################################################################
 1135 sub dictionarydotcom_create_request($$$)
 1136 {
 1137     my ($start, $nsugg, $C) = @_;
 1138     die "Context is NULL!" unless defined $C;
 1139 
 1140     return undef unless defined $C->{word};
 1141 
 1142     my @req = @http_request;
 1143     my $target;
 1144 
 1145     if ($C->{dict} eq 'dictionary.com') {
 1146         $target = 'dictionary';
 1147     } elsif ($C->{dict} eq 'thesaurus.com') {
 1148         $target = 'thesaurus';
 1149     }
 1150     $req[$http_method] = "GET http://$target.reference.com/search?q=$C->{word} HTTP/1.1";
 1151     $req[$http_host] = 'Host: dictionary.reference.com';
 1152     $req[$http_content] = undef;
 1153     $req[$http_content_len] = undef;
 1154 
 1155     return \@req;
 1156 }
 1157 
 1158 
 1159 ##############################################################################
 1160 # dictionarydotcom_parse_response
 1161 #
 1162 # Parse the response from dictionary.com
 1163 ##############################################################################
 1164 sub dictionarydotcom_parse_response($$$)
 1165 {
 1166     my ($start, $nsugg, $C) = @_;
 1167     my ($text, $source);
 1168 
 1169     my $response = $C->{response};
 1170 
 1171     # no response? do nothing
 1172     return unless defined $response;
 1173 
 1174     edict_rid_chunked($response);
 1175 
 1176     # start with no suggestions
 1177     $C->{suggestions} = [];
 1178 
 1179     ${$response} =~ s/.*?>(\d+) entr(y|ies) found for .*?h2>//so;
 1180     $C->{nsuggestions} = $1;
 1181     #print $C->{nsuggestions}, " entries found\n";
 1182 
 1183     while (${$response} =~ s/<!-- begin \w+ -->(.*?)<br>.*?<span class.*?<cite>(.*?)<\/cite>.*?<!-- end \w+ -->//so) {
 1184         ($text, $source) = ($1, $2);
 1185         edict_html2plain(\$text);
 1186         edict_html2plain(\$source);
 1187 
 1188         # Do all the color coding stuff at the end
 1189         # change bold, italic tags
 1190         if ($color && $^O =~ /linux/oi) {
 1191             $text =~ s/<b>/\e[1;34m/sogi;
 1192             $text =~ s/<i>/\e[34m/sogi;
 1193             $text =~ s/<\/[bi]>/\e[0m/sogi;
 1194         } else {
 1195             $text =~ s/<\/?[bi]>//sogi;
 1196         }
 1197 
 1198         push @{$C->{suggestions_text}}, $text;
 1199         push @{$C->{suggestions}}, $source;
 1200         
 1201         #print "\n\nSuggestion from $source:\n$text";
 1202     }
 1203     $C->{response} = \$C->{suggestions_text}->[0];
 1204     #print ${$response};
 1205 }
 1206 
 1207 ##############################################################################
 1208 # dictionarydotcom_get_suggestions
 1209 #
 1210 # Return a given number of suggestions for the given context
 1211 ##############################################################################
 1212 sub dictionarydotcom_get_suggestions($$$)
 1213 {
 1214     my ($start, $nsugg, $C) = @_;
 1215 
 1216     return unless @{$C->{suggestions}};
 1217 
 1218     my @sugg = ();
 1219     for (my $i=0; $i < $nsugg; ++$i) {
 1220         push @sugg, $C->{suggestions}->[$start + $i];
 1221     }
 1222     return \@sugg;
 1223 }
 1224 
 1225 
 1226 
 1227 
 1228 
 1229 
 1230 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 1231 # Digraph map - It's more than you need and more than you are used to!
 1232 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 1233 sub BEGIN {
 1234 %digraph = (
 1235     '&aacute;' => 0x000E1,
 1236     '&Aacute;' => 0x000C1,
 1237     '&abreve;' => 0x00103,
 1238     '&Abreve;' => 0x00102,
 1239     '&ac;' => 0x0290F,
 1240     '&acd;' => 0x0223F,
 1241     '&acE;' => 0x029DB,
 1242     '&acirc;' => 0x000E2,
 1243     '&Acirc;' => 0x000C2,
 1244     '&acute;' => 0x000B4,
 1245     '&acy;' => 0x00430,
 1246     '&Acy;' => 0x00410,
 1247     '&aelig;' => 0x000E6,
 1248     '&AElig;' => 0x000C6,
 1249     '&af;' => 0x02061,
 1250     '&agrave;' => 0x000E0,
 1251     '&Agrave;' => 0x000C0,
 1252     '&aleph;' => 0x02135,
 1253     '&alpha;' => 0x003B1,
 1254     '&amacr;' => 0x00101,
 1255     '&Amacr;' => 0x00100,
 1256     '&amalg;' => 0x02A3F,
 1257     '&amp;' => 0x00026,
 1258     '&and;' => 0x02227,
 1259     '&And;' => 0x02A53,
 1260     '&andand;' => 0x02A55,
 1261     '&andd;' => 0x02A5C,
 1262     '&andslope;' => 0x02A58,
 1263     '&andv;' => 0x02A5A,
 1264     '&ang;' => 0x02220,
 1265     '&ange;' => 0x029A4,
 1266     '&angle;' => 0x02220,
 1267     '&angmsd;' => 0x02221,
 1268     '&angmsdaa;' => 0x029A8,
 1269     '&angmsdab;' => 0x029A9,
 1270     '&angmsdac;' => 0x029AA,
 1271     '&angmsdad;' => 0x029AB,
 1272     '&angmsdae;' => 0x029AC,
 1273     '&angmsdaf;' => 0x029AD,
 1274     '&angmsdag;' => 0x029AE,
 1275     '&angmsdah;' => 0x029AF,
 1276     '&angrt;' => 0x0221F,
 1277     '&angrtvb;' => 0x0299,
 1278     '&angrtvbd;' => 0x0299D,
 1279     '&angsph;' => 0x02222,
 1280     '&angst;' => 0x0212B,
 1281     '&angzarr;' => 0x0237C,
 1282     '&aogon;' => 0x00105,
 1283     '&Aogon;' => 0x00104,
 1284     '&ap;' => 0x02248,
 1285     '&apacir;' => 0x02A6F,
 1286     '&ape;' => 0x0224A,
 1287     '&apE;' => 0x0224A,
 1288     '&apid;' => 0x0224B,
 1289     '&apos;' => 0x00027,
 1290     '&ApplyFunction;' => 0x02061,
 1291     '&approx;' => 0x02248,
 1292     '&approxeq;' => 0x0224A,
 1293     '&aring;' => 0x000E5,
 1294     '&Aring;' => 0x000C5,
 1295     '&Assign;' => 0x02254,
 1296     '&ast;' => 0x0002A,
 1297     '&asymp;' => 0x0224D,
 1298     '&atilde;' => 0x000E3,
 1299     '&Atilde;' => 0x000C3,
 1300     '&auml;' => 0x000E4,
 1301     '&Auml;' => 0x000C4,
 1302     '&awconint;' => 0x02233,
 1303     '&awint;' => 0x02A11,
 1304     '&backcong;' => 0x0224C,
 1305     '&backepsilon;' => 0x003F6,
 1306     '&backprime;' => 0x02035,
 1307     '&backsim;' => 0x0223D,
 1308     '&backsimeq;' => 0x022CD,
 1309     '&Backslash;' => 0x02216,
 1310     '&Barv;' => 0x02AE7,
 1311     '&barvee;' => 0x022BD,
 1312     '&barwed;' => 0x022BC,
 1313     '&Barwed;' => 0x02306,
 1314     '&barwedge;' => 0x022BC,
 1315     '&bbrk;' => 0x023B5,
 1316     '&bcong;' => 0x0224C,
 1317     '&bcy;' => 0x00431,
 1318     '&Bcy;' => 0x00411,
 1319     '&becaus;' => 0x02235,
 1320     '&because;' => 0x02235,
 1321     '&Because;' => 0x02235,
 1322     '&bemptyv;' => 0x029B0,
 1323     '&bepsi;' => 0x003F6,
 1324     '&bernou;' => 0x0212C,
 1325     '&Bernoullis;' => 0x0212C,
 1326     '&beta;' => 0x003B2,
 1327     '&beth;' => 0x02136,
 1328     '&between;' => 0x0226C,
 1329     '&bigcap;' => 0x022C2,
 1330     '&bigcirc;' => 0x025EF,
 1331     '&bigcup;' => 0x022C3,
 1332     '&bigodot;' => 0x02299,
 1333     '&bigoplus;' => 0x02295,
 1334     '&bigotimes;' => 0x02297,
 1335     '&bigsqcup;' => 0x02294,
 1336     '&bigstar;' => 0x02605,
 1337     '&bigtriangledown;' => 0x025BD,
 1338     '&bigtriangleup;' => 0x025B3,
 1339     '&biguplus;' => 0x0228E,
 1340     '&bigvee;' => 0x022C1,
 1341     '&bigwedge;' => 0x022C0,
 1342     '&bkarow;' => 0x0290D,
 1343     '&blacklozenge;' => 0x029EB,
 1344     '&blacksquare;' => 0x025AA,
 1345     '&blacktriangle;' => 0x025B4,
 1346     '&blacktriangledown;' => 0x025BE,
 1347     '&blacktriangleleft;' => 0x025C2,
 1348     '&blacktriangleright;' => 0x025B8,
 1349     '&blank;' => 0x02423,
 1350     '&blk12;' => 0x02592,
 1351     '&blk14;' => 0x02591,
 1352     '&blk34;' => 0x02593,
 1353     '&block;' => 0x02588,
 1354     '&bne;' => 0x0003,
 1355     '&bnequiv;' => 0x0226,
 1356     '&bnot;' => 0x02310,
 1357     '&bNot;' => 0x02AED,
 1358     '&bot;' => 0x022A5,
 1359     '&bottom;' => 0x022A5,
 1360     '&bowtie;' => 0x022C8,
 1361     '&boxbox;' => 0x029C9,
 1362     '&boxdl;' => 0x02510,
 1363     '&boxdL;' => 0x02555,
 1364     '&boxDl;' => 0x02556,
 1365     '&boxDL;' => 0x02557,
 1366     '&boxdr;' => 0x0250C,
 1367     '&boxdR;' => 0x02552,
 1368     '&boxDr;' => 0x02553,
 1369     '&boxDR;' => 0x02554,
 1370     '&boxh;' => 0x02500,
 1371     '&boxH;' => 0x02550,
 1372     '&boxhd;' => 0x0252C,
 1373     '&boxhD;' => 0x02565,
 1374     '&boxHd;' => 0x02564,
 1375     '&boxHD;' => 0x02566,
 1376     '&boxhu;' => 0x02534,
 1377     '&boxhU;' => 0x02568,
 1378     '&boxHu;' => 0x02567,
 1379     '&boxHU;' => 0x02569,
 1380     '&boxminus;' => 0x0229F,
 1381     '&boxplus;' => 0x0229E,
 1382     '&boxtimes;' => 0x022A0,
 1383     '&boxul;' => 0x02518,
 1384     '&boxuL;' => 0x0255B,
 1385     '&boxUl;' => 0x0255C,
 1386     '&boxUL;' => 0x0255D,
 1387     '&boxur;' => 0x02514,
 1388     '&boxuR;' => 0x02558,
 1389     '&boxUr;' => 0x02559,
 1390     '&boxUR;' => 0x0255A,
 1391     '&boxv;' => 0x02502,
 1392     '&boxV;' => 0x02551,
 1393     '&boxvh;' => 0x0253C,
 1394     '&boxvH;' => 0x0256A,
 1395     '&boxVh;' => 0x0256B,
 1396     '&boxVH;' => 0x0256C,
 1397     '&boxvl;' => 0x02524,
 1398     '&boxvL;' => 0x02561,
 1399     '&boxVl;' => 0x02562,
 1400     '&boxVL;' => 0x02563,
 1401     '&boxvr;' => 0x0251C,
 1402     '&boxvR;' => 0x0255E,
 1403     '&boxVr;' => 0x0255F,
 1404     '&boxVR;' => 0x02560,
 1405     '&bprime;' => 0x02035,
 1406     '&breve;' => 0x002D8,
 1407     '&Breve;' => 0x002D8,
 1408     '&brvbar;' => 0x000A6,
 1409     '&Bscr;' => 0x0212C,
 1410     '&bsemi;' => 0x0204F,
 1411     '&bsim;' => 0x0223D,
 1412     '&bsime;' => 0x022CD,
 1413     '&bsol;' => 0x0005C,
 1414     '&bsolb;' => 0x029C5,
 1415     '&bsolhsub;' => 0x0005,
 1416     '&bull;' => 0x02022,
 1417     '&bullet;' => 0x02022,
 1418     '&bump;' => 0x0224E,
 1419     '&bumpe;' => 0x0224F,
 1420     '&bumpE;' => 0x02AAE,
 1421     '&bumpeq;' => 0x0224F,
 1422     '&Bumpeq;' => 0x0224E,
 1423     '&cacute;' => 0x00107,
 1424     '&Cacute;' => 0x00106,
 1425     '&cap;' => 0x02229,
 1426     '&Cap;' => 0x022D2,
 1427     '&capand;' => 0x02A44,
 1428     '&capbrcup;' => 0x02A49,
 1429     '&capcap;' => 0x02A4B,
 1430     '&capcup;' => 0x02A47,
 1431     '&capdot;' => 0x02A40,
 1432     '&CapitalDifferentialD;' => 0x02145,
 1433     '&caps;' => 0x0222,
 1434     '&caret;' => 0x02041,
 1435     '&caron;' => 0x002C7,
 1436     '&Cayleys;' => 0x0212D,
 1437     '&ccaps;' => 0x02A4D,
 1438     '&ccaron;' => 0x0010D,
 1439     '&Ccaron;' => 0x0010C,
 1440     '&ccedil;' => 0x000E7,
 1441     '&Ccedil;' => 0x000C7,
 1442     '&ccirc;' => 0x00109,
 1443     '&Ccirc;' => 0x00108,
 1444     '&Cconint;' => 0x02230,
 1445     '&ccups;' => 0x02A4C,
 1446     '&ccupssm;' => 0x02A50,
 1447     '&cdot;' => 0x0010B,
 1448     '&Cdot;' => 0x0010A,
 1449     '&cedil;' => 0x000B8,
 1450     '&Cedilla;' => 0x000B8,
 1451     '&cemptyv;' => 0x029B2,
 1452     '&cent;' => 0x000A2,
 1453     '&centerdot;' => 0x000B7,
 1454     '&CenterDot;' => 0x000B7,
 1455     '&Cfr;' => 0x0212D,
 1456     '&chcy;' => 0x00447,
 1457     '&CHcy;' => 0x00427,
 1458     '&check;' => 0x02713,
 1459     '&checkmark;' => 0x02713,
 1460     '&chi;' => 0x003C7,
 1461     '&cir;' => 0x025CB,
 1462     '&circ;' => 0x0005E,
 1463     '&circeq;' => 0x02257,
 1464     '&circlearrowleft;' => 0x021BA,
 1465     '&circlearrowright;' => 0x021BB,
 1466     '&circledast;' => 0x0229B,
 1467     '&circledcirc;' => 0x0229A,
 1468     '&circleddash;' => 0x0229D,
 1469     '&CircleDot;' => 0x02299,
 1470     '&circledR;' => 0x000AE,
 1471     '&circledS;' => 0x024C8,
 1472     '&CircleMinus;' => 0x02296,
 1473     '&CirclePlus;' => 0x02295,
 1474     '&CircleTimes;' => 0x02297,
 1475     '&cire;' => 0x02257,
 1476     '&cirE;' => 0x029C3,
 1477     '&cirfnint;' => 0x02A10,
 1478     '&cirmid;' => 0x02AEF,
 1479     '&cirscir;' => 0x029C2,
 1480     '&ClockwiseContourIntegral;' => 0x02232,
 1481     '&CloseCurlyDoubleQuote;' => 0x0201D,
 1482     '&CloseCurlyQuote;' => 0x02019,
 1483     '&clubs;' => 0x02663,
 1484     '&clubsuit;' => 0x02663,
 1485     '&colon;' => 0x0003A,
 1486     '&Colon;' => 0x02237,
 1487     '&colone;' => 0x02254,
 1488     '&Colone;' => 0x02A74,
 1489     '&coloneq;' => 0x02254,
 1490     '&comma;' => 0x0002C,
 1491     '&commat;' => 0x00040,
 1492     '&comp;' => 0x02201,
 1493     '&compfn;' => 0x02218,
 1494     '&complement;' => 0x02201,
 1495     '&complexes;' => 0x02102,
 1496     '&cong;' => 0x02245,
 1497     '&congdot;' => 0x02A6D,
 1498     '&Congruent;' => 0x02261,
 1499     '&conint;' => 0x0222E,
 1500     '&Conint;' => 0x0222F,
 1501     '&ContourIntegral;' => 0x0222E,
 1502     '&Copf;' => 0x02102,
 1503     '&coprod;' => 0x02210,
 1504     '&Coproduct;' => 0x02210,
 1505     '&copy;' => 0x000A9,
 1506     '&copysr;' => 0x02117,
 1507     '&CounterClockwiseContourIntegral;' => 0x02233,
 1508     '&cross;' => 0x02717,
 1509     '&Cross;' => 0x02A2F,
 1510     '&csub;' => 0x02ACF,
 1511     '&csube;' => 0x02AD1,
 1512     '&csup;' => 0x02AD0,
 1513     '&csupe;' => 0x02AD2,
 1514     '&ctdot;' => 0x022EF,
 1515     '&cudarrl;' => 0x02938,
 1516     '&cudarrr;' => 0x02935,
 1517     '&cuepr;' => 0x022DE,
 1518     '&cuesc;' => 0x022DF,
 1519     '&cularr;' => 0x021B6,
 1520     '&cularrp;' => 0x0293D,
 1521     '&cup;' => 0x0222A,
 1522     '&Cup;' => 0x022D3,
 1523     '&cupbrcap;' => 0x02A48,
 1524     '&cupcap;' => 0x02A46,
 1525     '&CupCap;' => 0x0224D,
 1526     '&cupcup;' => 0x02A4A,
 1527     '&cupdot;' => 0x0228D,
 1528     '&cupor;' => 0x02A45,
 1529     '&cups;' => 0x0222,
 1530     '&curarr;' => 0x021B7,
 1531     '&curarrm;' => 0x0293C,
 1532     '&curlyeqprec;' => 0x022DE,
 1533     '&curlyeqsucc;' => 0x022DF,
 1534     '&curlyvee;' => 0x022CE,
 1535     '&curlywedge;' => 0x022CF,
 1536     '&curren;' => 0x000A4,
 1537     '&curvearrowleft;' => 0x021B6,
 1538     '&curvearrowright;' => 0x021B7,
 1539     '&cuvee;' => 0x022CE,
 1540     '&cuwed;' => 0x022CF,
 1541     '&cwconint;' => 0x02232,
 1542     '&cwint;' => 0x02231,
 1543     '&cylcty;' => 0x0232D,
 1544     '&dagger;' => 0x02020,
 1545     '&dagger;' => 0x02020,
 1546     '&Dagger;' => 0x02021,
 1547     '&Dagger;' => 0x02021,
 1548     '&daleth;' => 0x02138,
 1549     '&darr;' => 0x02193,
 1550     '&dArr;' => 0x021D3,
 1551     '&Darr;' => 0x021A1,
 1552     '&dash;' => 0x02010,
 1553     '&dashv;' => 0x022A3,
 1554     '&Dashv;' => 0x02AE4,
 1555     '&dbkarow;' => 0x0290F,
 1556     '&dblac;' => 0x002DD,
 1557     '&dcaron;' => 0x0010F,
 1558     '&Dcaron;' => 0x0010E,
 1559     '&dcy;' => 0x00434,
 1560     '&Dcy;' => 0x00414,
 1561     '&dd;' => 0x02146,
 1562     '&DD;' => 0x02145,
 1563     '&ddagger;' => 0x02021,
 1564     '&ddarr;' => 0x021CA,
 1565     '&DDotrahd;' => 0x02911,
 1566     '&ddotseq;' => 0x02A77,
 1567     '&deg;' => 0x000B0,
 1568     '&Del;' => 0x02207,
 1569     '&delta;' => 0x003B4,
 1570     '&Delta;' => 0x00394,
 1571     '&demptyv;' => 0x029B1,
 1572     '&dfisht;' => 0x0297F,
 1573     '&dHar;' => 0x02965,
 1574     '&dharl;' => 0x021C3,
 1575     '&dharr;' => 0x021C2,
 1576     '&DiacriticalAcute;' => 0x000B4,
 1577     '&DiacriticalDot;' => 0x002D9,
 1578     '&DiacriticalDoubleAcute;' => 0x002DD,
 1579     '&DiacriticalGrave;' => 0x00060,
 1580     '&DiacriticalTilde;' => 0x002DC,
 1581     '&diam;' => 0x022C4,
 1582     '&diamond;' => 0x022C4,
 1583     '&Diamond;' => 0x022C4,
 1584     '&diamondsuit;' => 0x02666,
 1585     '&diams;' => 0x02666,
 1586     '&die;' => 0x000A8,
 1587     '&DifferentialD;' => 0x02146,
 1588     '&digamma;' => 0x003DC,
 1589     '&disin;' => 0x022F2,
 1590     '&div;' => 0x000F7,
 1591     '&divide;' => 0x000F7,
 1592     '&divideontimes;' => 0x022C7,
 1593     '&divonx;' => 0x022C7,
 1594     '&djcy;' => 0x00452,
 1595     '&DJcy;' => 0x00402,
 1596     '&dlcorn;' => 0x0231E,
 1597     '&dlcrop;' => 0x0230D,
 1598     '&dollar;' => 0x00024,
 1599     '&dot;' => 0x002D9,
 1600     '&Dot;' => 0x000A8,
 1601     '&DotDot;' => 0x020DC,
 1602     '&doteq;' => 0x02250,
 1603     '&doteqdot;' => 0x02251,
 1604     '&DotEqual;' => 0x02250,
 1605     '&dotminus;' => 0x02238,
 1606     '&dotplus;' => 0x02214,
 1607     '&dotsquare;' => 0x022A1,
 1608     '&doublebarwedge;' => 0x02306,
 1609     '&DoubleContourIntegral;' => 0x0222F,
 1610     '&DoubleDot;' => 0x000A8,
 1611     '&DoubleDownArrow;' => 0x021D3,
 1612     '&DoubleLeftArrow;' => 0x021D0,
 1613     '&DoubleLeftRightArrow;' => 0x021D4,
 1614     '&DoubleLeftTee;' => 0x02AE4,
 1615     '&DoubleLongLeftArrow;' => 0x0F579,
 1616     '&DoubleLongLeftRightArrow;' => 0x0F57B,
 1617     '&DoubleLongRightArrow;' => 0x0F57A,
 1618     '&DoubleRightArrow;' => 0x021D2,
 1619     '&DoubleRightTee;' => 0x022A8,
 1620     '&DoubleUpArrow;' => 0x021D1,
 1621     '&DoubleUpDownArrow;' => 0x021D5,
 1622     '&DoubleVerticalBar;' => 0x02225,
 1623     '&downarrow;' => 0x02193,
 1624     '&Downarrow;' => 0x021D3,
 1625     '&DownArrow;' => 0x02193,
 1626     '&DownArrowBar;' => 0x02913,
 1627     '&DownArrowUpArrow;' => 0x021F5,
 1628     '&DownBreve;' => 0x00311,
 1629     '&downdownarrows;' => 0x021CA,
 1630     '&downharpoonleft;' => 0x021C3,
 1631     '&downharpoonright;' => 0x021C2,
 1632     '&DownLeftRightVector;' => 0x02950,
 1633     '&DownLeftTeeVector;' => 0x0295E,
 1634     '&DownLeftVector;' => 0x021BD,
 1635     '&DownLeftVectorBar;' => 0x02956,
 1636     '&DownRightTeeVector;' => 0x0295F,
 1637     '&DownRightVector;' => 0x021C1,
 1638     '&DownRightVectorBar;' => 0x02957,
 1639     '&DownTee;' => 0x022A4,
 1640     '&DownTeeArrow;' => 0x021A7,
 1641     '&drbkarow;' => 0x02910,
 1642     '&drcorn;' => 0x0231F,
 1643     '&drcrop;' => 0x0230C,
 1644     '&dscy;' => 0x00455,
 1645     '&DScy;' => 0x00405,
 1646     '&dsol;' => 0x029F6,
 1647     '&dstrok;' => 0x00111,
 1648     '&Dstrok;' => 0x00110,
 1649     '&dtdot;' => 0x022F1,
 1650     '&dtri;' => 0x025BF,
 1651     '&dtrif;' => 0x025BE,
 1652     '&duarr;' => 0x021F5,
 1653     '&duhar;' => 0x0296F,
 1654     '&dwangle;' => 0x029A6,
 1655     '&dzcy;' => 0x0045F,
 1656     '&DZcy;' => 0x0040F,
 1657     '&dzigrarr;' => 0x0F5A2,
 1658     '&eacute;' => 0x000E9,
 1659     '&Eacute;' => 0x000C9,
 1660     '&easter;' => 0x0225B,
 1661     '&ecaron;' => 0x0011B,
 1662     '&Ecaron;' => 0x0011A,
 1663     '&ecir;' => 0x02256,
 1664     '&ecirc;' => 0x000EA,
 1665     '&Ecirc;' => 0x000CA,
 1666     '&ecolon;' => 0x02255,
 1667     '&ecy;' => 0x0044D,
 1668     '&Ecy;' => 0x0042D,
 1669     '&eDDot;' => 0x02A77,
 1670     '&edot;' => 0x00117,
 1671     '&eDot;' => 0x02251,
 1672     '&Edot;' => 0x00116,
 1673     '&ee;' => 0x02147,
 1674     '&efDot;' => 0x02252,
 1675     '&eg;' => 0x02A9A,
 1676     '&egrave;' => 0x000E8,
 1677     '&Egrave;' => 0x000C8,
 1678     '&egs;' => 0x022DD,
 1679     '&egsdot;' => 0x02A98,
 1680     '&el;' => 0x02A99,
 1681     '&Element;' => 0x02208,
 1682     '&ell;' => 0x02113,
 1683     '&els;' => 0x022DC,
 1684     '&elsdot;' => 0x02A97,
 1685     '&emacr;' => 0x00113,
 1686     '&Emacr;' => 0x00112,
 1687     '&empty;' => 0x0220,
 1688     '&emptyset;' => 0x0220,
 1689     '&EmptySmallSquare;' => 0x025FD,
 1690     '&emptyv;' => 0x02205,
 1691     '&EmptyVerySmallSquare;' => 0x0F59C,
 1692     '&emsp;' => 0x02003,
 1693     '&emsp13;' => 0x02004,
 1694     '&emsp14;' => 0x02005,
 1695     '&eng;' => 0x0014B,
 1696     '&ENG;' => 0x0014A,
 1697     '&ensp;' => 0x02002,
 1698     '&eogon;' => 0x00119,
 1699     '&Eogon;' => 0x00118,
 1700     '&epar;' => 0x022D5,
 1701     '&eparsl;' => 0x029E3,
 1702     '&eplus;' => 0x02A71,
 1703     '&epsi;' => 0x003B5,
 1704     '&epsiv;' => 0x0025B,
 1705     '&eqcirc;' => 0x02256,
 1706     '&eqcolon;' => 0x02255,
 1707     '&eqsim;' => 0x02242,
 1708     '&eqslantgtr;' => 0x022DD,
 1709     '&eqslantless;' => 0x022DC,
 1710     '&Equal;' => 0x02A75,
 1711     '&equals;' => 0x0003D,
 1712     '&EqualTilde;' => 0x02242,
 1713     '&equest;' => 0x0225F,
 1714     '&Equilibrium;' => 0x021CC,
 1715     '&equiv;' => 0x02261,
 1716     '&equivDD;' => 0x02A78,
 1717     '&eqvparsl;' => 0x029E5,
 1718     '&erarr;' => 0x02971,
 1719     '&erDot;' => 0x02253,
 1720     '&escr;' => 0x0212F,
 1721     '&Escr;' => 0x02130,
 1722     '&esdot;' => 0x02250,
 1723     '&esim;' => 0x02242,
 1724     '&Esim;' => 0x02A73,
 1725     '&eta;' => 0x003B7,
 1726     '&eth;' => 0x000F0,
 1727     '&ETH;' => 0x000D0,
 1728     '&euml;' => 0x000EB,
 1729     '&Euml;' => 0x000CB,
 1730     '&excl;' => 0x00021,
 1731     '&exist;' => 0x02203,
 1732     '&Exists;' => 0x02203,
 1733     '&expectation;' => 0x02130,
 1734     '&exponentiale;' => 0x02147,
 1735     '&ExponentialE;' => 0x02147,
 1736     '&fallingdotseq;' => 0x02252,
 1737     '&fcy;' => 0x00444,
 1738     '&Fcy;' => 0x00424,
 1739     '&female;' => 0x02640,
 1740     '&ffilig;' => 0x0FB03,
 1741     '&fflig;' => 0x0FB00,
 1742     '&ffllig;' => 0x0FB04,
 1743     '&filig;' => 0x0FB01,
 1744     '&FilledSmallSquare;' => 0x025FE,
 1745     '&FilledVerySmallSquare;' => 0x0F59B,
 1746     '&flat;' => 0x0266D,
 1747     '&fllig;' => 0x0FB02,
 1748     '&fnof;' => 0x00192,
 1749     '&forall;' => 0x02200,
 1750     '&ForAll;' => 0x02200,
 1751     '&fork;' => 0x022D4,
 1752     '&forkv;' => 0x02AD9,
 1753     '&Fouriertrf;' => 0x02131,
 1754     '&fpartint;' => 0x02A0D,
 1755     '&frac12;' => 0x000BD,
 1756     '&frac13;' => 0x02153,
 1757     '&frac14;' => 0x000BC,
 1758     '&frac15;' => 0x02155,
 1759     '&frac16;' => 0x02159,
 1760     '&frac18;' => 0x0215B,
 1761     '&frac23;' => 0x02154,
 1762     '&frac25;' => 0x02156,
 1763     '&frac34;' => 0x000BE,
 1764     '&frac35;' => 0x02157,
 1765     '&frac38;' => 0x0215C,
 1766     '&frac45;' => 0x02158,
 1767     '&frac56;' => 0x0215A,
 1768     '&frac58;' => 0x0215D,
 1769     '&frac78;' => 0x0215E,
 1770     '&frown;' => 0x02322,
 1771     '&Fscr;' => 0x02131,
 1772     '&gacute;' => 0x001F5,
 1773     '&gamma;' => 0x003B3,
 1774     '&Gamma;' => 0x00393,
 1775     '&gammad;' => 0x003DC,
 1776     '&Gammad;' => 0x003DC,
 1777     '&gap;' => 0x02273,
 1778     '&gbreve;' => 0x0011F,
 1779     '&Gbreve;' => 0x0011E,
 1780     '&Gcedil;' => 0x00122,
 1781     '&gcirc;' => 0x0011D,
 1782     '&Gcirc;' => 0x0011C,
 1783     '&gcy;' => 0x00433,
 1784     '&Gcy;' => 0x00413,
 1785     '&gdot;' => 0x00121,
 1786     '&Gdot;' => 0x00120,
 1787     '&ge;' => 0x02265,
 1788     '&gE;' => 0x02267,
 1789     '&gel;' => 0x022DB,
 1790     '&gEl;' => 0x022DB,
 1791     '&geq;' => 0x02265,
 1792     '&geqq;' => 0x02267,
 1793     '&geqslant;' => 0x02A7E,
 1794     '&ges;' => 0x02A7E,
 1795     '&gescc;' => 0x02AA9,
 1796     '&gesdot;' => 0x02A80,
 1797     '&gesdoto;' => 0x02A82,
 1798     '&gesdotol;' => 0x02A84,
 1799     '&gesl;' => 0x022D,
 1800     '&gesles;' => 0x02A94,
 1801     '&gg;' => 0x0226B,
 1802     '&Gg;' => 0x022D9,
 1803     '&ggg;' => 0x022D9,
 1804     '&gimel;' => 0x02137,
 1805     '&gjcy;' => 0x00453,
 1806     '&GJcy;' => 0x00403,
 1807     '&gl;' => 0x02277,
 1808     '&gla;' => 0x02AA5,
 1809     '&glE;' => 0x02A92,
 1810     '&glj;' => 0x02AA4,
 1811     '&gnap;' => 0x02A8A,
 1812     '&gnapprox;' => 0x02A8A,
 1813     '&gne;' => 0x02269,
 1814     '&gnE;' => 0x02269,
 1815     '&gneq;' => 0x02269,
 1816     '&gneqq;' => 0x02269,
 1817     '&gnsim;' => 0x022E7,
 1818     '&grave;' => 0x00060,
 1819     '&GreaterEqual;' => 0x02265,
 1820     '&GreaterEqualLess;' => 0x022DB,
 1821     '&GreaterFullEqual;' => 0x02267,
 1822     '&GreaterGreater;' => 0x02AA2,
 1823     '&GreaterLess;' => 0x02277,
 1824     '&GreaterSlantEqual;' => 0x02A7E,
 1825     '&GreaterTilde;' => 0x02273,
 1826     '&gscr;' => 0x0210A,
 1827     '&gsim;' => 0x02273,
 1828     '&gsime;' => 0x02A8E,
 1829     '&gsiml;' => 0x02A90,
 1830     '&gt;' => 0x0003E,
 1831     '&Gt;' => 0x0226B,
 1832     '&gtcc;' => 0x02AA7,
 1833     '&gtcir;' => 0x02A7A,
 1834     '&gtdot;' => 0x022D7,
 1835     '&gtlPar;' => 0x02995,
 1836     '&gtquest;' => 0x02A7C,
 1837     '&gtrapprox;' => 0x02273,
 1838     '&gtrarr;' => 0x02978,
 1839     '&gtrdot;' => 0x022D7,
 1840     '&gtreqless;' => 0x022DB,
 1841     '&gtreqqless;' => 0x022DB,
 1842     '&gtrless;' => 0x02277,
 1843     '&gtrsim;' => 0x02273,
 1844     '&gvertneqq;' => 0x0226,
 1845     '&gvnE;' => 0x0226,
 1846     '&Hacek;' => 0x002C7,
 1847     '&hairsp;' => 0x0200A,
 1848     '&half;' => 0x000BD,
 1849     '&hamilt;' => 0x0210B,
 1850     '&hardcy;' => 0x0044A,
 1851     '&HARDcy;' => 0x0042A,
 1852     '&harr;' => 0x02194,
 1853     '&hArr;' => 0x021D4,
 1854     '&harrcir;' => 0x02948,
 1855     '&harrw;' => 0x021AD,
 1856     '&Hat;' => 0x00302,
 1857     '&hbar;' => 0x0210,
 1858     '&hcirc;' => 0x00125,
 1859     '&Hcirc;' => 0x00124,
 1860     '&heartsuit;' => 0x02661,
 1861     '&hellip;' => 0x02026,
 1862     '&hercon;' => 0x022B9,
 1863     '&Hfr;' => 0x0210C,
 1864     '&HilbertSpace;' => 0x0210B,
 1865     '&hksearow;' => 0x02925,
 1866     '&hkswarow;' => 0x02926,
 1867     '&hoarr;' => 0x021FF,
 1868     '&homtht;' => 0x0223B,
 1869     '&hookleftarrow;' => 0x021A9,
 1870     '&hookrightarrow;' => 0x021AA,
 1871     '&Hopf;' => 0x0210D,
 1872     '&horbar;' => 0x02015,
 1873     '&HorizontalLine;' => 0x02500,
 1874     '&Hscr;' => 0x0210B,
 1875     '&hslash;' => 0x0210F,
 1876     '&hstrok;' => 0x00127,
 1877     '&Hstrok;' => 0x00126,
 1878     '&HumpDownHump;' => 0x0224E,
 1879     '&HumpEqual;' => 0x0224F,
 1880     '&hybull;' => 0x02043,
 1881     '&hyphen;' => 0x02010,
 1882     '&iacute;' => 0x000ED,
 1883     '&Iacute;' => 0x000CD,
 1884     '&ic;' => 0x0200B,
 1885     '&icirc;' => 0x000EE,
 1886     '&Icirc;' => 0x000CE,
 1887     '&icy;' => 0x00438,
 1888     '&Icy;' => 0x00418,
 1889     '&Idot;' => 0x00130,
 1890     '&iecy;' => 0x00435,
 1891     '&IEcy;' => 0x00415,
 1892     '&iexcl;' => 0x000A1,
 1893     '&iff;' => 0x021D4,
 1894     '&Ifr;' => 0x02111,
 1895     '&igrave;' => 0x000EC,
 1896     '&Igrave;' => 0x000CC,
 1897     '&ii;' => 0x02148,
 1898     '&iiiint;' => 0x02A0C,
 1899     '&iiint;' => 0x0222D,
 1900     '&iinfin;' => 0x029DC,
 1901     '&iiota;' => 0x02129,
 1902     '&ijlig;' => 0x00133,
 1903     '&IJlig;' => 0x00132,
 1904     '&Im;' => 0x02111,
 1905     '&imacr;' => 0x0012B,
 1906     '&Imacr;' => 0x0012A,
 1907     '&image;' => 0x02111,
 1908     '&ImaginaryI;' => 0x02148,
 1909     '&imagline;' => 0x02110,
 1910     '&imagpart;' => 0x02111,
 1911     '&imath;' => 0x00131,
 1912     '&imof;' => 0x022B7,
 1913     '&Implies;' => 0x021D2,
 1914     '&in;' => 0x02208,
 1915     '&incare;' => 0x02105,
 1916     '&infin;' => 0x0221E,
 1917     '&inodot;' => 0x00131,
 1918     '&int;' => 0x0222B,
 1919     '&Int;' => 0x0222C,
 1920     '&intcal;' => 0x022BA,
 1921     '&integers;' => 0x02124,
 1922     '&Integral;' => 0x0222B,
 1923     '&intercal;' => 0x022BA,
 1924     '&Intersection;' => 0x022C2,
 1925     '&intlarhk;' => 0x02A17,
 1926     '&intprod;' => 0x02A3C,
 1927     '&InvisibleComma;' => 0x0200B,
 1928     '&InvisibleTimes;' => 0x02062,
 1929     '&iocy;' => 0x00451,
 1930     '&IOcy;' => 0x00401,
 1931     '&iogon;' => 0x0012F,
 1932     '&Iogon;' => 0x0012E,
 1933     '&iota;' => 0x003B9,
 1934     '&iprod;' => 0x02A3C,
 1935     '&iquest;' => 0x000BF,
 1936     '&Iscr;' => 0x02110,
 1937     '&isin;' => 0x02208,
 1938     '&isindot;' => 0x022F5,
 1939     '&isinE;' => 0x022F9,
 1940     '&isins;' => 0x022F4,
 1941     '&isinsv;' => 0x022F3,
 1942     '&isinv;' => 0x02208,
 1943     '&it;' => 0x02062,
 1944     '&itilde;' => 0x00129,
 1945     '&Itilde;' => 0x00128,
 1946     '&iukcy;' => 0x00456,
 1947     '&Iukcy;' => 0x00406,
 1948     '&iuml;' => 0x000EF,
 1949     '&Iuml;' => 0x000CF,
 1950     '&jcirc;' => 0x00135,
 1951     '&Jcirc;' => 0x00134,
 1952     '&jcy;' => 0x00439,
 1953     '&Jcy;' => 0x00419,
 1954     '&jmath;' => 0x0006,
 1955     '&jsercy;' => 0x00458,
 1956     '&Jsercy;' => 0x00408,
 1957     '&jukcy;' => 0x00454,
 1958     '&Jukcy;' => 0x00404,
 1959     '&kappa;' => 0x003BA,
 1960     '&kappav;' => 0x003F0,
 1961     '&kcedil;' => 0x00137,
 1962     '&Kcedil;' => 0x00136,
 1963     '&kcy;' => 0x0043A,
 1964     '&Kcy;' => 0x0041A,
 1965     '&kgreen;' => 0x00138,
 1966     '&khcy;' => 0x00445,
 1967     '&KHcy;' => 0x00425,
 1968     '&kjcy;' => 0x0045C,
 1969     '&KJcy;' => 0x0040C,
 1970     '&lAarr;' => 0x021DA,
 1971     '&lacute;' => 0x0013A,
 1972     '&Lacute;' => 0x00139,
 1973     '&laemptyv;' => 0x029B4,
 1974     '&lagran;' => 0x02112,
 1975     '&lambda;' => 0x003BB,
 1976     '&Lambda;' => 0x0039B,
 1977     '&lang;' => 0x02329,
 1978     '&Lang;' => 0x0300A,
 1979     '&langd;' => 0x02991,
 1980     '&langle;' => 0x02329,
 1981     '&lap;' => 0x02272,
 1982     '&Laplacetrf;' => 0x02112,
 1983     '&laquo;' => 0x000AB,
 1984     '&larr;' => 0x02190,
 1985     '&lArr;' => 0x021D0,
 1986     '&Larr;' => 0x0219E,
 1987     '&larrb;' => 0x021E4,
 1988     '&larrbfs;' => 0x0291F,
 1989     '&larrfs;' => 0x0291D,
 1990     '&larrhk;' => 0x021A9,
 1991     '&larrlp;' => 0x021AB,
 1992     '&larrpl;' => 0x02939,
 1993     '&larrsim;' => 0x02973,
 1994     '&larrtl;' => 0x021A2,
 1995     '&lat;' => 0x02AAB,
 1996     '&latail;' => 0x02919,
 1997     '&lAtail;' => 0x0291B,
 1998     '&late;' => 0x02AAD,
 1999     '&lates;' => 0x02AA,
 2000     '&lbarr;' => 0x0290C,
 2001     '&lBarr;' => 0x0290E,
 2002     '&lbbrk;' => 0x03014,
 2003     '&lbrace;' => 0x0007B,
 2004     '&lbrack;' => 0x0005B,
 2005     '&lbrke;' => 0x0298B,
 2006     '&lbrksld;' => 0x0298F,
 2007     '&lbrkslu;' => 0x0298D,
 2008     '&lcaron;' => 0x0013E,
 2009     '&Lcaron;' => 0x0013D,
 2010     '&lcedil;' => 0x0013C,
 2011     '&Lcedil;' => 0x0013B,
 2012     '&lceil;' => 0x02308,
 2013     '&lcub;' => 0x0007B,
 2014     '&lcy;' => 0x0043B,
 2015     '&Lcy;' => 0x0041B,
 2016     '&ldca;' => 0x02936,
 2017     '&ldquo;' => 0x0201C,
 2018     '&ldquor;' => 0x0201E,
 2019     '&ldrdhar;' => 0x02967,
 2020     '&ldrushar;' => 0x0294B,
 2021     '&ldsh;' => 0x021B2,
 2022     '&le;' => 0x02264,
 2023     '&lE;' => 0x02266,
 2024     '&LeftAngleBracket;' => 0x02329,
 2025     '&leftarrow;' => 0x02190,
 2026     '&Leftarrow;' => 0x021D0,
 2027     '&LeftArrow;' => 0x02190,
 2028     '&LeftArrowBar;' => 0x021E4,
 2029     '&LeftArrowRightArrow;' => 0x021C6,
 2030     '&leftarrowtail;' => 0x021A2,
 2031     '&LeftCeiling;' => 0x02308,
 2032     '&LeftDoubleBracket;' => 0x0301A,
 2033     '&LeftDownTeeVector;' => 0x02961,
 2034     '&LeftDownVector;' => 0x021C3,
 2035     '&LeftDownVectorBar;' => 0x02959,
 2036     '&LeftFloor;' => 0x0230A,
 2037     '&leftharpoondown;' => 0x021BD,
 2038     '&leftharpoonup;' => 0x021BC,
 2039     '&leftleftarrows;' => 0x021C7,
 2040     '&leftrightarrow;' => 0x02194,
 2041     '&Leftrightarrow;' => 0x021D4,
 2042     '&LeftRightArrow;' => 0x02194,
 2043     '&leftrightarrows;' => 0x021C6,
 2044     '&leftrightharpoons;' => 0x021CB,
 2045     '&leftrightsquigarrow;' => 0x021AD,
 2046     '&LeftRightVector;' => 0x0294E,
 2047     '&LeftTee;' => 0x022A3,
 2048     '&LeftTeeArrow;' => 0x021A4,
 2049     '&LeftTeeVector;' => 0x0295A,
 2050     '&leftthreetimes;' => 0x022CB,
 2051     '&LeftTriangle;' => 0x022B2,
 2052     '&LeftTriangleBar;' => 0x029CF,
 2053     '&LeftTriangleEqual;' => 0x022B4,
 2054     '&LeftUpDownVector;' => 0x02951,
 2055     '&LeftUpTeeVector;' => 0x02960,
 2056     '&LeftUpVector;' => 0x021BF,
 2057     '&LeftUpVectorBar;' => 0x02958,
 2058     '&LeftVector;' => 0x021BC,
 2059     '&LeftVectorBar;' => 0x02952,
 2060     '&leg;' => 0x022DA,
 2061     '&lEg;' => 0x022DA,
 2062     '&leq;' => 0x02264,
 2063     '&leqq;' => 0x02266,
 2064     '&leqslant;' => 0x02A7D,
 2065     '&les;' => 0x02A7D,
 2066     '&lescc;' => 0x02AA8,
 2067     '&lesdot;' => 0x02A7F,
 2068     '&lesdoto;' => 0x02A81,
 2069     '&lesdotor;' => 0x02A83,
 2070     '&lesg;' => 0x022D,
 2071     '&lesges;' => 0x02A93,
 2072     '&lessapprox;' => 0x02272,
 2073     '&lessdot;' => 0x022D6,
 2074     '&lesseqgtr;' => 0x022DA,
 2075     '&lesseqqgtr;' => 0x022DA,
 2076     '&LessEqualGreater;' => 0x022DA,
 2077     '&LessFullEqual;' => 0x02266,
 2078     '&LessGreater;' => 0x02276,
 2079     '&lessgtr;' => 0x02276,
 2080     '&LessLess;' => 0x02AA1,
 2081     '&lesssim;' => 0x02272,
 2082     '&LessSlantEqual;' => 0x02A7D,
 2083     '&LessTilde;' => 0x02272,
 2084     '&lfisht;' => 0x0297C,
 2085     '&lfloor;' => 0x0230A,
 2086     '&lg;' => 0x02276,
 2087     '&lgE;' => 0x02A91,
 2088     '&lHar;' => 0x02962,
 2089     '&lhard;' => 0x021BD,
 2090     '&lharu;' => 0x021BC,
 2091     '&lharul;' => 0x0296A,
 2092     '&lhblk;' => 0x02584,
 2093     '&ljcy;' => 0x00459,
 2094     '&LJcy;' => 0x00409,
 2095     '&ll;' => 0x0226A,
 2096     '&Ll;' => 0x022D8,
 2097     '&llarr;' => 0x021C7,
 2098     '&llcorner;' => 0x0231E,
 2099     '&Lleftarrow;' => 0x021DA,
 2100     '&llhard;' => 0x0296B,
 2101     '&lltri;' => 0x025FA,
 2102     '&lmidot;' => 0x00140,
 2103     '&Lmidot;' => 0x0013F,
 2104     '&lmoust;' => 0x023B0,
 2105     '&lmoustache;' => 0x023B0,
 2106     '&lnap;' => 0x02A89,
 2107     '&lnapprox;' => 0x02A89,
 2108     '&lne;' => 0x02268,
 2109     '&lnE;' => 0x02268,
 2110     '&lneq;' => 0x02268,
 2111     '&lneqq;' => 0x02268,
 2112     '&lnsim;' => 0x022E6,
 2113     '&loang;' => 0x0F558,
 2114     '&loarr;' => 0x021FD,
 2115     '&lobrk;' => 0x0301A,
 2116     '&longleftarrow;' => 0x0F576,
 2117     '&Longleftarrow;' => 0x0F579,
 2118     '&LongLeftArrow;' => 0x0F576,
 2119     '&longleftrightarrow;' => 0x0F578,
 2120     '&Longleftrightarrow;' => 0x0F57B,
 2121     '&LongLeftRightArrow;' => 0x0F578,
 2122     '&longmapsto;' => 0x0F57D,
 2123     '&longrightarrow;' => 0x0F577,
 2124     '&Longrightarrow;' => 0x0F57A,
 2125     '&LongRightArrow;' => 0x0F577,
 2126     '&looparrowleft;' => 0x021AB,
 2127     '&looparrowright;' => 0x021AC,
 2128     '&lopar;' => 0x03018,
 2129     '&loplus;' => 0x02A2D,
 2130     '&lotimes;' => 0x02A34,
 2131     '&lowast;' => 0x02217,
 2132     '&lowbar;' => 0x0005F,
 2133     '&LowerLeftArrow;' => 0x02199,
 2134     '&LowerRightArrow;' => 0x02198,
 2135     '&loz;' => 0x025CA,
 2136     '&lozenge;' => 0x025CA,
 2137     '&lozf;' => 0x029EB,
 2138     '&lpar;' => 0x00028,
 2139     '&lparlt;' => 0x02993,
 2140     '&lrarr;' => 0x021C6,
 2141     '&lrcorner;' => 0x0231F,
 2142     '&lrhar;' => 0x021CB,
 2143     '&lrhard;' => 0x0296D,
 2144     '&lrtri;' => 0x022BF,
 2145     '&lscr;' => 0x02113,
 2146     '&Lscr;' => 0x02112,
 2147     '&lsh;' => 0x021B0,
 2148     '&Lsh;' => 0x021B0,
 2149     '&lsim;' => 0x02272,
 2150     '&lsime;' => 0x02A8D,
 2151     '&lsimg;' => 0x02A8F,
 2152     '&lsqb;' => 0x0005B,
 2153     '&lsquo;' => 0x02018,
 2154     '&lsquor;' => 0x0201A,
 2155     '&lstrok;' => 0x00142,
 2156     '&Lstrok;' => 0x00141,
 2157     '&lt;' => 0x0003C,
 2158     '&Lt;' => 0x0226A,
 2159     '&ltcc;' => 0x02AA6,
 2160     '&ltcir;' => 0x02A79,
 2161     '&ltdot;' => 0x022D6,
 2162     '&lthree;' => 0x022CB,
 2163     '&ltimes;' => 0x022C9,
 2164     '&ltlarr;' => 0x02976,
 2165     '&ltquest;' => 0x02A7B,
 2166     '&ltri;' => 0x025C3,
 2167     '&ltrie;' => 0x022B4,
 2168     '&ltrif;' => 0x025C2,
 2169     '&ltrPar;' => 0x02996,
 2170     '&lurdshar;' => 0x0294A,
 2171     '&luruhar;' => 0x02966,
 2172     '&lvertneqq;' => 0x0226,
 2173     '&lvnE;' => 0x0226,
 2174     '&macr;' => 0x000AF,
 2175     '&male;' => 0x02642,
 2176     '&malt;' => 0x02720,
 2177     '&maltese;' => 0x02720,
 2178     '&map;' => 0x021A6,
 2179     '&Map;' => 0x02905,
 2180     '&mapsto;' => 0x021A6,
 2181     '&mapstodown;' => 0x021A7,
 2182     '&mapstoleft;' => 0x021A4,
 2183     '&mapstoup;' => 0x021A5,
 2184     '&marker;' => 0x025AE,
 2185     '&mcomma;' => 0x02A29,
 2186     '&mcy;' => 0x0043C,
 2187     '&Mcy;' => 0x0041C,
 2188     '&mdash;' => 0x02014,
 2189     '&mDDot;' => 0x0223A,
 2190     '&measuredangle;' => 0x02221,
 2191     '&MediumSpace;' => 0x0205F,
 2192     '&Mellintrf;' => 0x02133,
 2193     '&mho;' => 0x02127,
 2194     '&micro;' => 0x000B5,
 2195     '&mid;' => 0x02223,
 2196     '&midast;' => 0x0002A,
 2197     '&midcir;' => 0x02AF0,
 2198     '&middot;' => 0x000B7,
 2199     '&minus;' => 0x02212,
 2200     '&minusb;' => 0x0229F,
 2201     '&minusd;' => 0x02238,
 2202     '&minusdu;' => 0x02A2A,
 2203     '&MinusPlus;' => 0x02213,
 2204     '&mlcp;' => 0x02ADB,
 2205     '&mldr;' => 0x02026,
 2206     '&mnplus;' => 0x02213,
 2207     '&models;' => 0x022A7,
 2208     '&mp;' => 0x02213,
 2209     '&Mscr;' => 0x02133,
 2210     '&mstpos;' => 0x0223E,
 2211     '&mu;' => 0x003BC,
 2212     '&multimap;' => 0x022B8,
 2213     '&mumap;' => 0x022B8,
 2214     '&nabla;' => 0x02207,
 2215     '&nacute;' => 0x00144,
 2216     '&Nacute;' => 0x00143,
 2217     '&nang;' => 0x0222,
 2218     '&nap;' => 0x02249,
 2219     '&napE;' => 0x02A7,
 2220     '&napid;' => 0x0224,
 2221     '&napos;' => 0x00149,
 2222     '&napprox;' => 0x02249,
 2223     '&natur;' => 0x0266E,
 2224     '&natural;' => 0x0266E,
 2225     '&naturals;' => 0x02115,
 2226     '&nbsp;' => 0x000A0,
 2227     '&nbump;' => 0x0224,
 2228     '&nbumpe;' => 0x0224,
 2229     '&ncap;' => 0x02A43,
 2230     '&ncaron;' => 0x00148,
 2231     '&Ncaron;' => 0x00147,
 2232     '&ncedil;' => 0x00146,
 2233     '&Ncedil;' => 0x00145,
 2234     '&ncong;' => 0x02247,
 2235     '&ncongdot;' => 0x02A6,
 2236     '&ncup;' => 0x02A42,
 2237     '&ncy;' => 0x0043D,
 2238     '&Ncy;' => 0x0041D,
 2239     '&ndash;' => 0x02013,
 2240     '&ne;' => 0x02260,
 2241     '&nearhk;' => 0x02924,
 2242     '&nearr;' => 0x02197,
 2243     '&neArr;' => 0x021D7,
 2244     '&nearrow;' => 0x02197,
 2245     '&nedot;' => 0x0226,
 2246     '&NegativeMediumSpace;' => 0x0205,
 2247     '&NegativeThickSpace;' => 0x0200,
 2248     '&NegativeThinSpace;' => 0x0200,
 2249     '&NegativeVeryThinSpace;' => 0x0200,
 2250     '&nequiv;' => 0x02262,
 2251     '&nesear;' => 0x02928,
 2252     '&nesim;' => 0x0224,
 2253     '&NestedGreaterGreater;' => 0x0226B,
 2254     '&NestedLessLess;' => 0x0226A,
 2255     '&NewLine;' => 0x0000A,
 2256     '&nexist;' => 0x02204,
 2257     '&nexists;' => 0x02204,
 2258     '&nge;' => 0x0227,
 2259     '&ngE;' => 0x02271,
 2260     '&ngeq;' => 0x0227,
 2261     '&ngeqq;' => 0x02271,
 2262     '&ngeqslant;' => 0x02271,
 2263     '&nges;' => 0x02271,
 2264     '&nGg;' => 0x022D,
 2265     '&ngsim;' => 0x02275,
 2266     '&ngt;' => 0x0226F,
 2267     '&nGt;' => 0x0226,
 2268     '&ngtr;' => 0x0226F,
 2269     '&nGtv;' => 0x0226B,
 2270     '&nharr;' => 0x021AE,
 2271     '&nhArr;' => 0x021CE,
 2272     '&nhpar;' => 0x02AF2,
 2273     '&ni;' => 0x0220B,
 2274     '&nis;' => 0x022FC,
 2275     '&nisd;' => 0x022FA,
 2276     '&niv;' => 0x0220B,
 2277     '&njcy;' => 0x0045A,
 2278     '&NJcy;' => 0x0040A,
 2279     '&nlarr;' => 0x0219A,
 2280     '&nlArr;' => 0x021CD,
 2281     '&nldr;' => 0x02025,
 2282     '&nle;' => 0x0227,
 2283     '&nlE;' => 0x02270,
 2284     '&nleftarrow;' => 0x0219A,
 2285     '&nLeftarrow;' => 0x021CD,
 2286     '&nleftrightarrow;' => 0x021AE,
 2287     '&nLeftrightarrow;' => 0x021CE,
 2288     '&nleq;' => 0x0227,
 2289     '&nleqq;' => 0x02270,
 2290     '&nleqslant;' => 0x02270,
 2291     '&nles;' => 0x02270,
 2292     '&nless;' => 0x0226E,
 2293     '&nLl;' => 0x022D,
 2294     '&nlsim;' => 0x02274,
 2295     '&nlt;' => 0x0226E,
 2296     '&nLt;' => 0x0226,
 2297     '&nltri;' => 0x022EA,
 2298     '&nltrie;' => 0x022EC,
 2299     '&nLtv;' => 0x0226A,
 2300     '&nmid;' => 0x02224,
 2301     '&NoBreak;' => 0x0FEFF,
 2302     '&NonBreakingSpace;' => 0x000A0,
 2303     '&Nopf;' => 0x02115,
 2304     '&not;' => 0x000AC,
 2305     '&Not;' => 0x02AEC,
 2306     '&NotCongruent;' => 0x02262,
 2307     '&NotCupCap;' => 0x0226D,
 2308     '&NotDoubleVerticalBar;' => 0x02226,
 2309     '&NotElement;' => 0x02209,
 2310     '&NotEqual;' => 0x02260,
 2311     '&NotEqualTilde;' => 0x0224,
 2312     '&NotExists;' => 0x02204,
 2313     '&NotGreater;' => 0x0226F,
 2314     '&NotGreaterEqual;' => 0x0227,
 2315     '&NotGreaterFullEqual;' => 0x02270,
 2316     '&NotGreaterGreater;' => 0x0226B,
 2317     '&NotGreaterLess;' => 0x02279,
 2318     '&NotGreaterSlantEqual;' => 0x02271,
 2319     '&NotGreaterTilde;' => 0x02275,
 2320     '&NotHumpDownHump;' => 0x0224,
 2321     '&NotHumpEqual;' => 0x0224,
 2322     '&notin;' => 0x02209,
 2323     '&notindot;' => 0x022F,
 2324     '&notinva;' => 0x0220,
 2325     '&notinvb;' => 0x022F7,
 2326     '&notinvc;' => 0x022F6,
 2327     '&NotLeftTriangle;' => 0x022EA,
 2328     '&NotLeftTriangleBar;' => 0x029C,
 2329     '&NotLeftTriangleEqual;' => 0x022EC,
 2330     '&NotLess;' => 0x0226E,
 2331     '&NotLessEqual;' => 0x0227,
 2332     '&NotLessGreater;' => 0x02278,
 2333     '&NotLessLess;' => 0x0226A,
 2334     '&NotLessSlantEqual;' => 0x02270,
 2335     '&NotLessTilde;' => 0x02274,
 2336     '&NotNestedGreaterGreater;' => 0x024A,
 2337     '&NotNestedLessLess;' => 0x024A,
 2338     '&notni;' => 0x0220C,
 2339     '&notniva;' => 0x0220C,
 2340     '&notnivb;' => 0x022FE,
 2341     '&notnivc;' => 0x022FD,
 2342     '&NotPrecedes;' => 0x02280,
 2343     '&NotPrecedesEqual;' => 0x02AA,
 2344     '&NotPrecedesSlantEqual;' => 0x022E0,
 2345     '&NotReverseElement;' => 0x0220C,
 2346     '&NotRightTriangle;' => 0x022EB,
 2347     '&NotRightTriangleBar;' => 0x029D,
 2348     '&NotRightTriangleEqual;' => 0x022ED,
 2349     '&NotSquareSubset;' => 0x0228,
 2350     '&NotSquareSubsetEqual;' => 0x022E2,
 2351     '&NotSquareSuperset;' => 0x0229,
 2352     '&NotSquareSupersetEqual;' => 0x022E3,
 2353     '&NotSubset;' => 0x02284,
 2354     '&NotSubsetEqual;' => 0x02288,
 2355     '&NotSucceeds;' => 0x02281,
 2356     '&NotSucceedsEqual;' => 0x02AB,
 2357     '&NotSucceedsSlantEqual;' => 0x022E1,
 2358     '&NotSucceedsTilde;' => 0x0227,
 2359     '&NotSuperset;' => 0x02285,
 2360     '&NotSupersetEqual;' => 0x02289,
 2361     '&NotTilde;' => 0x02241,
 2362     '&NotTildeEqual;' => 0x02244,
 2363     '&NotTildeFullEqual;' => 0x02247,
 2364     '&NotTildeTilde;' => 0x02249,
 2365     '&NotVerticalBar;' => 0x02224,
 2366     '&npar;' => 0x02226,
 2367     '&nparallel;' => 0x02226,
 2368     '&nparsl;' => 0x02225,
 2369     '&npart;' => 0x0220,
 2370     '&npolint;' => 0x02A14,
 2371     '&npr;' => 0x02280,
 2372     '&nprcue;' => 0x022E0,
 2373     '&npre;' => 0x02AA,
 2374     '&nprec;' => 0x02280,
 2375     '&npreceq;' => 0x02AA,
 2376     '&nrarr;' => 0x0219B,
 2377     '&nrArr;' => 0x021CF,
 2378     '&nrarrc;' => 0x0293,
 2379     '&nrarrw;' => 0x0219,
 2380     '&nrightarrow;' => 0x0219B,
 2381     '&nRightarrow;' => 0x021CF,
 2382     '&nrtri;' => 0x022EB,
 2383     '&nrtrie;' => 0x022ED,
 2384     '&nsc;' => 0x02281,
 2385     '&nsccue;' => 0x022E1,
 2386     '&nsce;' => 0x02AB,
 2387     '&nshortmid;' => 0x0222,
 2388     '&nshortparallel;' => 0x0222,
 2389     '&nsim;' => 0x02241,
 2390     '&nsime;' => 0x02244,
 2391     '&nsimeq;' => 0x02244,
 2392     '&nsmid;' => 0x0222,
 2393     '&nspar;' => 0x0222,
 2394     '&nsqsube;' => 0x022E2,
 2395     '&nsqsupe;' => 0x022E3,
 2396     '&nsub;' => 0x02284,
 2397     '&nsube;' => 0x02288,
 2398     '&nsubE;' => 0x02288,
 2399     '&nsubset;' => 0x02284,
 2400     '&nsubseteq;' => 0x02288,
 2401     '&nsubseteqq;' => 0x02288,
 2402     '&nsucc;' => 0x02281,
 2403     '&nsucceq;' => 0x02AB,
 2404     '&nsup;' => 0x02285,
 2405     '&nsupe;' => 0x02289,
 2406     '&nsupE;' => 0x02289,
 2407     '&nsupset;' => 0x02285,
 2408     '&nsupseteq;' => 0x02289,
 2409     '&nsupseteqq;' => 0x02289,
 2410     '&ntgl;' => 0x02279,
 2411     '&ntilde;' => 0x000F1,
 2412     '&Ntilde;' => 0x000D1,
 2413     '&ntlg;' => 0x02278,
 2414     '&ntriangleleft;' => 0x022EA,
 2415     '&ntrianglelefteq;' => 0x022EC,
 2416     '&ntriangleright;' => 0x022EB,
 2417     '&ntrianglerighteq;' => 0x022ED,
 2418     '&nu;' => 0x003BD,
 2419     '&num;' => 0x00023,
 2420     '&numero;' => 0x02116,
 2421     '&numsp;' => 0x02007,
 2422     '&nvap;' => 0x0224,
 2423     '&nvdash;' => 0x022AC,
 2424     '&nvDash;' => 0x022AD,
 2425     '&nVdash;' => 0x022AE,
 2426     '&nVDash;' => 0x022AF,
 2427     '&nvge;' => 0x02271,
 2428     '&nvgt;' => 0x0226F,
 2429     '&nvHarr;' => 0x021CE,
 2430     '&nvinfin;' => 0x029DE,
 2431     '&nvlArr;' => 0x021CD,
 2432     '&nvle;' => 0x02270,
 2433     '&nvlt;' => 0x0226E,
 2434     '&nvltrie;' => 0x022E,
 2435     '&nvrArr;' => 0x021CF,
 2436     '&nvrtrie;' => 0x022E,
 2437     '&nvsim;' => 0x0224,
 2438     '&nwarhk;' => 0x02923,
 2439     '&nwarr;' => 0x02196,
 2440     '&nwArr;' => 0x021D6,
 2441     '&nwarrow;' => 0x02196,
 2442     '&nwnear;' => 0x02927,
 2443     '&oacute;' => 0x000F3,
 2444     '&Oacute;' => 0x000D3,
 2445     '&oast;' => 0x0229B,
 2446     '&ocir;' => 0x0229A,
 2447     '&ocirc;' => 0x000F4,
 2448     '&Ocirc;' => 0x000D4,
 2449     '&ocy;' => 0x0043E,
 2450     '&Ocy;' => 0x0041E,
 2451     '&odash;' => 0x0229D,
 2452     '&odblac;' => 0x00151,
 2453     '&Odblac;' => 0x00150,
 2454     '&odiv;' => 0x02A38,
 2455     '&odot;' => 0x02299,
 2456     '&odsold;' => 0x029BC,
 2457     '&oelig;' => 0x00153,
 2458     '&OElig;' => 0x00152,
 2459     '&ofcir;' => 0x029BF,
 2460     '&ogon;' => 0x002DB,
 2461     '&ograve;' => 0x000F2,
 2462     '&Ograve;' => 0x000D2,
 2463     '&ogt;' => 0x029C1,
 2464     '&ohbar;' => 0x029B5,
 2465     '&ohm;' => 0x02126,
 2466     '&oint;' => 0x0222E,
 2467     '&olarr;' => 0x021BA,
 2468     '&olcir;' => 0x029BE,
 2469     '&olcross;' => 0x029BB,
 2470     '&olt;' => 0x029C0,
 2471     '&omacr;' => 0x0014D,
 2472     '&Omacr;' => 0x0014C,
 2473     '&omega;' => 0x003C9,
 2474     '&Omega;' => 0x003A9,
 2475     '&omid;' => 0x029B6,
 2476     '&ominus;' => 0x02296,
 2477     '&opar;' => 0x029B7,
 2478     '&OpenCurlyDoubleQuote;' => 0x0201C,
 2479     '&OpenCurlyQuote;' => 0x02018,
 2480     '&operp;' => 0x029B9,
 2481     '&oplus;' => 0x02295,
 2482     '&or;' => 0x02228,
 2483     '&Or;' => 0x02A54,
 2484     '&orarr;' => 0x021BB,
 2485     '&ord;' => 0x02A5D,
 2486     '&order;' => 0x02134,
 2487     '&orderof;' => 0x02134,
 2488     '&ordf;' => 0x000AA,
 2489     '&ordm;' => 0x000BA,
 2490     '&origof;' => 0x022B6,
 2491     '&oror;' => 0x02A56,
 2492     '&orslope;' => 0x02A57,
 2493     '&orv;' => 0x02A5B,
 2494     '&oS;' => 0x024C8,
 2495     '&oscr;' => 0x02134,
 2496     '&oslash;' => 0x000F8,
 2497     '&Oslash;' => 0x000D8,
 2498     '&osol;' => 0x02298,
 2499     '&otilde;' => 0x000F5,
 2500     '&Otilde;' => 0x000D5,
 2501     '&otimes;' => 0x02297,
 2502     '&Otimes;' => 0x02A37,
 2503     '&otimesas;' => 0x02A36,
 2504     '&ouml;' => 0x000F6,
 2505     '&Ouml;' => 0x000D6,
 2506     '&ovbar;' => 0x0233D,
 2507     '&OverBar;' => 0x000AF,
 2508     '&OverBrace;' => 0x0FE37,
 2509     '&OverBracket;' => 0x023B4,
 2510     '&OverParenthesis;' => 0x0FE35,
 2511     '&par;' => 0x02225,
 2512     '&para;' => 0x000B6,
 2513     '&parallel;' => 0x02225,
 2514     '&parsim;' => 0x02AF3,
 2515     '&parsl;' => 0x02225,
 2516     '&part;' => 0x02202,
 2517     '&PartialD;' => 0x02202,
 2518     '&pcy;' => 0x0043F,
 2519     '&Pcy;' => 0x0041F,
 2520     '&percnt;' => 0x00025,
 2521     '&period;' => 0x0002E,
 2522     '&permil;' => 0x02030,
 2523     '&perp;' => 0x022A5,
 2524     '&pertenk;' => 0x02031,
 2525     '&phi;' => 0x003C6,
 2526     '&Phi;' => 0x003A6,
 2527     '&phiv;' => 0x003D5,
 2528     '&phmmat;' => 0x02133,
 2529     '&phone;' => 0x0260E,
 2530     '&pi;' => 0x003C0,
 2531     '&Pi;' => 0x003A0,
 2532     '&pitchfork;' => 0x022D4,
 2533     '&piv;' => 0x003D6,
 2534     '&planck;' => 0x0210,
 2535     '&planckh;' => 0x0210E,
 2536     '&plankv;' => 0x0210F,
 2537     '&plus;' => 0x0002B,
 2538     '&plusacir;' => 0x02A23,
 2539     '&plusb;' => 0x0229E,
 2540     '&pluscir;' => 0x02A22,
 2541     '&plusdo;' => 0x02214,
 2542     '&plusdu;' => 0x02A25,
 2543     '&pluse;' => 0x02A72,
 2544     '&PlusMinus;' => 0x000B1,
 2545     '&plusmn;' => 0x000B1,
 2546     '&plussim;' => 0x02A26,
 2547     '&plustwo;' => 0x02A27,
 2548     '&pm;' => 0x000B1,
 2549     '&Poincareplane;' => 0x0210C,
 2550     '&pointint;' => 0x02A15,
 2551     '&Popf;' => 0x02119,
 2552     '&pound;' => 0x000A3,
 2553     '&pr;' => 0x0227A,
 2554     '&Pr;' => 0x02ABB,
 2555     '&prap;' => 0x0227E,
 2556     '&prcue;' => 0x0227C,
 2557     '&pre;' => 0x02AAF,
 2558     '&prE;' => 0x02AAF,
 2559     '&prec;' => 0x0227A,
 2560     '&precapprox;' => 0x0227E,
 2561     '&preccurlyeq;' => 0x0227C,
 2562     '&Precedes;' => 0x0227A,
 2563     '&PrecedesEqual;' => 0x02AAF,
 2564     '&PrecedesSlantEqual;' => 0x0227C,
 2565     '&PrecedesTilde;' => 0x0227E,
 2566     '&preceq;' => 0x02AAF,
 2567     '&precnapprox;' => 0x022E8,
 2568     '&precneqq;' => 0x02AB5,
 2569     '&precnsim;' => 0x022E8,
 2570     '&precsim;' => 0x0227E,
 2571     '&prime;' => 0x02032,
 2572     '&Prime;' => 0x02033,
 2573     '&primes;' => 0x02119,
 2574     '&prnap;' => 0x022E8,
 2575     '&prnE;' => 0x02AB5,
 2576     '&prnsim;' => 0x022E8,
 2577     '&prod;' => 0x0220F,
 2578     '&Product;' => 0x0220F,
 2579     '&profalar;' => 0x0232E,
 2580     '&profline;' => 0x02312,
 2581     '&profsurf;' => 0x02313,
 2582     '&prop;' => 0x0221D,
 2583     '&Proportion;' => 0x02237,
 2584     '&Proportional;' => 0x0221D,
 2585     '&propto;' => 0x0221D,
 2586     '&prsim;' => 0x0227E,
 2587     '&prurel;' => 0x022B0,
 2588     '&psi;' => 0x003C8,
 2589     '&Psi;' => 0x003A8,
 2590     '&puncsp;' => 0x02008,
 2591     '&qint;' => 0x02A0C,
 2592     '&Qopf;' => 0x0211A,
 2593     '&qprime;' => 0x02057,
 2594     '&quaternions;' => 0x0210D,
 2595     '&quatint;' => 0x02A16,
 2596     '&quest;' => 0x0003F,
 2597     '&questeq;' => 0x0225F,
 2598     '&quot;' => 0x00022,
 2599     '&rAarr;' => 0x021DB,
 2600     '&race;' => 0x029DA,
 2601     '&racute;' => 0x00155,
 2602     '&Racute;' => 0x00154,
 2603     '&radic;' => 0x0221A,
 2604     '&raemptyv;' => 0x029B3,
 2605     '&rang;' => 0x0232A,
 2606     '&Rang;' => 0x0300B,
 2607     '&rangd;' => 0x02992,
 2608     '&range;' => 0x029A5,
 2609     '&rangle;' => 0x0232A,
 2610     '&raquo;' => 0x000BB,
 2611     '&rarr;' => 0x02192,
 2612     '&rArr;' => 0x021D2,
 2613     '&Rarr;' => 0x021A0,
 2614     '&rarrap;' => 0x02975,
 2615     '&rarrb;' => 0x021E5,
 2616     '&rarrbfs;' => 0x02920,
 2617     '&rarrc;' => 0x02933,
 2618     '&rarrfs;' => 0x0291E,
 2619     '&rarrhk;' => 0x021AA,
 2620     '&rarrlp;' => 0x021AC,
 2621     '&rarrpl;' => 0x02945,
 2622     '&rarrsim;' => 0x02974,
 2623     '&rarrtl;' => 0x021A3,
 2624     '&Rarrtl;' => 0x02916,
 2625     '&rarrw;' => 0x0219D,
 2626     '&ratail;' => 0x021A3,
 2627     '&rAtail;' => 0x0291C,
 2628     '&ratio;' => 0x02236,
 2629     '&rationals;' => 0x0211A,
 2630     '&rbarr;' => 0x0290D,
 2631     '&rBarr;' => 0x0290F,
 2632     '&RBarr;' => 0x02910,
 2633     '&rbbrk;' => 0x03015,
 2634     '&rbrace;' => 0x0007D,
 2635     '&rbrack;' => 0x0005D,
 2636     '&rbrke;' => 0x0298C,
 2637     '&rbrksld;' => 0x0298E,
 2638     '&rbrkslu;' => 0x02990,
 2639     '&rcaron;' => 0x00159,
 2640     '&Rcaron;' => 0x00158,
 2641     '&rcedil;' => 0x00157,
 2642     '&Rcedil;' => 0x00156,
 2643     '&rceil;' => 0x02309,
 2644     '&rcub;' => 0x0007D,
 2645     '&rcy;' => 0x00440,
 2646     '&Rcy;' => 0x00420,
 2647     '&rdca;' => 0x02937,
 2648     '&rdldhar;' => 0x02969,
 2649     '&rdquo;' => 0x0201D,
 2650     '&rdquor;' => 0x0201D,
 2651     '&rdsh;' => 0x021B3,
 2652     '&Re;' => 0x0211C,
 2653     '&real;' => 0x0211C,
 2654     '&realine;' => 0x0211B,
 2655     '&realpart;' => 0x0211C,
 2656     '&reals;' => 0x0211D,
 2657     '&rect;' => 0x025AD,
 2658     '&reg;' => 0x000AE,
 2659     '&ReverseElement;' => 0x0220B,
 2660     '&ReverseEquilibrium;' => 0x021CB,
 2661     '&ReverseUpEquilibrium;' => 0x0296F,
 2662     '&rfisht;' => 0x0297D,
 2663     '&rfloor;' => 0x0230B,
 2664     '&Rfr;' => 0x0211C,
 2665     '&rHar;' => 0x02964,
 2666     '&rhard;' => 0x021C1,
 2667     '&rharu;' => 0x021C0,
 2668     '&rharul;' => 0x0296C,
 2669     '&rho;' => 0x003C1,
 2670     '&rhov;' => 0x003F1,
 2671     '&RightAngleBracket;' => 0x0232A,
 2672     '&rightarrow;' => 0x02192,
 2673     '&Rightarrow;' => 0x021D2,
 2674     '&RightArrow;' => 0x02192,
 2675     '&RightArrowBar;' => 0x021E5,
 2676     '&RightArrowLeftArrow;' => 0x021C4,
 2677     '&rightarrowtail;' => 0x021A3,
 2678     '&RightCeiling;' => 0x02309,
 2679     '&RightDoubleBracket;' => 0x0301B,
 2680     '&RightDownTeeVector;' => 0x0295D,
 2681     '&RightDownVector;' => 0x021C2,
 2682     '&RightDownVectorBar;' => 0x02955,
 2683     '&RightFloor;' => 0x0230B,
 2684     '&rightharpoondown;' => 0x021C1,
 2685     '&rightharpoonup;' => 0x021C0,
 2686     '&rightleftarrows;' => 0x021C4,
 2687     '&rightleftharpoons;' => 0x021CC,
 2688     '&rightrightarrows;' => 0x021C9,
 2689     '&rightsquigarrow;' => 0x0219D,
 2690     '&RightTee;' => 0x022A2,
 2691     '&RightTeeArrow;' => 0x021A6,
 2692     '&RightTeeVector;' => 0x0295B,
 2693     '&rightthreetimes;' => 0x022CC,
 2694     '&RightTriangle;' => 0x022B3,
 2695     '&RightTriangleBar;' => 0x029D0,
 2696     '&RightTriangleEqual;' => 0x022B5,
 2697     '&RightUpDownVector;' => 0x0294F,
 2698     '&RightUpTeeVector;' => 0x0295C,
 2699     '&RightUpVector;' => 0x021BE,
 2700     '&RightUpVectorBar;' => 0x02954,
 2701     '&RightVector;' => 0x021C0,
 2702     '&RightVectorBar;' => 0x02953,
 2703     '&ring;' => 0x002DA,
 2704     '&risingdotseq;' => 0x02253,
 2705     '&rlarr;' => 0x021C4,
 2706     '&rlhar;' => 0x021CC,
 2707     '&rmoust;' => 0x023B1,
 2708     '&rmoustache;' => 0x023B1,
 2709     '&rnmid;' => 0x02AEE,
 2710     '&roang;' => 0x0F559,
 2711     '&roarr;' => 0x021FE,
 2712     '&robrk;' => 0x0301B,
 2713     '&ropar;' => 0x03019,
 2714     '&Ropf;' => 0x0211D,
 2715     '&roplus;' => 0x02A2E,
 2716     '&rotimes;' => 0x02A35,
 2717     '&RoundImplies;' => 0x02970,
 2718     '&rpar;' => 0x00029,
 2719     '&rpargt;' => 0x02994,
 2720     '&rppolint;' => 0x02A12,
 2721     '&rrarr;' => 0x021C9,
 2722     '&Rrightarrow;' => 0x021DB,
 2723     '&Rscr;' => 0x0211B,
 2724     '&rsh;' => 0x021B1,
 2725     '&Rsh;' => 0x021B1,
 2726     '&rsqb;' => 0x0005D,
 2727     '&rsquo;' => 0x02019,
 2728     '&rsquor;' => 0x02019,
 2729     '&rthree;' => 0x022CC,
 2730     '&rtimes;' => 0x022CA,
 2731     '&rtri;' => 0x025B9,
 2732     '&rtrie;' => 0x022B5,
 2733     '&rtrif;' => 0x025B8,
 2734     '&rtriltri;' => 0x029CE,
 2735     '&RuleDelayed;' => 0x029F4,
 2736     '&ruluhar;' => 0x02968,
 2737     '&rx;' => 0x0211E,
 2738     '&sacute;' => 0x0015B,
 2739     '&Sacute;' => 0x0015A,
 2740     '&sc;' => 0x0227B,
 2741     '&Sc;' => 0x02ABC,
 2742     '&scap;' => 0x0227F,
 2743     '&scaron;' => 0x00161,
 2744     '&Scaron;' => 0x00160,
 2745     '&sccue;' => 0x0227D,
 2746     '&sce;' => 0x0227D,
 2747     '&scE;' => 0x0227E,
 2748     '&scedil;' => 0x0015F,
 2749     '&Scedil;' => 0x0015E,
 2750     '&scirc;' => 0x0015D,
 2751     '&Scirc;' => 0x0015C,
 2752     '&scnap;' => 0x022E9,
 2753     '&scnE;' => 0x02AB6,
 2754     '&scnsim;' => 0x022E9,
 2755     '&scpolint;' => 0x02A13,
 2756     '&scsim;' => 0x0227F,
 2757     '&scy;' => 0x00441,
 2758     '&Scy;' => 0x00421,
 2759     '&sdot;' => 0x022C5,
 2760     '&sdotb;' => 0x022A1,
 2761     '&sdote;' => 0x02A66,
 2762     '&searhk;' => 0x02925,
 2763     '&searr;' => 0x02198,
 2764     '&seArr;' => 0x021D8,
 2765     '&searrow;' => 0x02198,
 2766     '&sect;' => 0x000A7,
 2767     '&semi;' => 0x0003B,
 2768     '&seswar;' => 0x02929,
 2769     '&setminus;' => 0x02216,
 2770     '&setmn;' => 0x02216,
 2771     '&sext;' => 0x02736,
 2772     '&sharp;' => 0x0266F,
 2773     '&shchcy;' => 0x00449,
 2774     '&SHCHcy;' => 0x00429,
 2775     '&shcy;' => 0x00448,
 2776     '&SHcy;' => 0x00428,
 2777     '&ShortDownArrow;' => 0x0230,
 2778     '&ShortLeftArrow;' => 0x0219,
 2779     '&shortmid;' => 0x0222,
 2780     '&shortparallel;' => 0x0222,
 2781     '&ShortRightArrow;' => 0x0219,
 2782     '&ShortUpArrow;' => 0x0230,
 2783     '&shy;' => 0x000AD,
 2784     '&sigma;' => 0x003C3,
 2785     '&Sigma;' => 0x003A3,
 2786     '&sigmav;' => 0x003C2,
 2787     '&sim;' => 0x0223C,
 2788     '&simdot;' => 0x02A6A,
 2789     '&sime;' => 0x02243,
 2790     '&simeq;' => 0x02243,
 2791     '&simg;' => 0x02A9E,
 2792     '&simgE;' => 0x02AA0,
 2793     '&siml;' => 0x02A9D,
 2794     '&simlE;' => 0x02A9F,
 2795     '&simne;' => 0x02246,
 2796     '&simplus;' => 0x02A24,
 2797     '&simrarr;' => 0x02972,
 2798     '&slarr;' => 0x0219,
 2799     '&SmallCircle;' => 0x02218,
 2800     '&smallsetminus;' => 0x0221,
 2801     '&smashp;' => 0x02A33,
 2802     '&smeparsl;' => 0x029E4,
 2803     '&smid;' => 0x0222,
 2804     '&smile;' => 0x02323,
 2805     '&smt;' => 0x02AAA,
 2806     '&smte;' => 0x02AAC,
 2807     '&smtes;' => 0x02AA,
 2808     '&softcy;' => 0x0044C,
 2809     '&SOFTcy;' => 0x0042C,
 2810     '&sol;' => 0x0002F,
 2811     '&solb;' => 0x029C4,
 2812     '&solbar;' => 0x0233F,
 2813     '&spades;' => 0x02660,
 2814     '&spadesuit;' => 0x02660,
 2815     '&spar;' => 0x0222,
 2816     '&sqcap;' => 0x02293,
 2817     '&sqcaps;' => 0x0229,
 2818     '&sqcup;' => 0x02294,
 2819     '&sqcups;' => 0x0229,
 2820     '&Sqrt;' => 0x0221A,
 2821     '&sqsub;' => 0x0228F,
 2822     '&sqsube;' => 0x02291,
 2823     '&sqsubset;' => 0x0228F,
 2824     '&sqsubseteq;' => 0x02291,
 2825     '&sqsup;' => 0x02290,
 2826     '&sqsupe;' => 0x02292,
 2827     '&sqsupset;' => 0x02290,
 2828     '&sqsupseteq;' => 0x02292,
 2829     '&squ;' => 0x025A1,
 2830     '&square;' => 0x025A1,
 2831     '&Square;' => 0x025A1,
 2832     '&SquareIntersection;' => 0x02293,
 2833     '&SquareSubset;' => 0x0228F,
 2834     '&SquareSubsetEqual;' => 0x02291,
 2835     '&SquareSuperset;' => 0x02290,
 2836     '&SquareSupersetEqual;' => 0x02292,
 2837     '&SquareUnion;' => 0x02294,
 2838     '&squarf;' => 0x025AA,
 2839     '&squf;' => 0x025AA,
 2840     '&srarr;' => 0x0219,
 2841     '&ssetmn;' => 0x0221,
 2842     '&sstarf;' => 0x022C6,
 2843     '&star;' => 0x022C6,
 2844     '&Star;' => 0x022C6,
 2845     '&starf;' => 0x02605,
 2846     '&straightepsilon;' => 0x003B5,
 2847     '&straightphi;' => 0x003C6,
 2848     '&sub;' => 0x02282,
 2849     '&Sub;' => 0x022D0,
 2850     '&subdot;' => 0x02ABD,
 2851     '&sube;' => 0x02286,
 2852     '&subE;' => 0x02286,
 2853     '&subedot;' => 0x02AC3,
 2854     '&submult;' => 0x02AC1,
 2855     '&subne;' => 0x0228A,
 2856     '&subnE;' => 0x0228A,
 2857     '&subplus;' => 0x02ABF,
 2858     '&subrarr;' => 0x02979,
 2859     '&subset;' => 0x02282,
 2860     '&Subset;' => 0x022D0,
 2861     '&subseteq;' => 0x02286,
 2862     '&subseteqq;' => 0x02286,
 2863     '&SubsetEqual;' => 0x02286,
 2864     '&subsetneq;' => 0x0228A,
 2865     '&subsetneqq;' => 0x0228A,
 2866     '&subsim;' => 0x02AC7,
 2867     '&subsub;' => 0x02AD5,
 2868     '&subsup;' => 0x02AD3,
 2869     '&succ;' => 0x0227B,
 2870     '&succapprox;' => 0x0227F,
 2871     '&succcurlyeq;' => 0x0227D,
 2872     '&Succeeds;' => 0x0227B,
 2873     '&SucceedsEqual;' => 0x0227D,
 2874     '&SucceedsSlantEqual;' => 0x0227D,
 2875     '&SucceedsTilde;' => 0x0227F,
 2876     '&succeq;' => 0x0227D,
 2877     '&succnapprox;' => 0x022E9,
 2878     '&succneqq;' => 0x02AB6,
 2879     '&succnsim;' => 0x022E9,
 2880     '&succsim;' => 0x0227F,
 2881     '&SuchThat;' => 0x0220B,
 2882     '&sum;' => 0x02211,
 2883     '&Sum;' => 0x02211,
 2884     '&sung;' => 0x0266A,
 2885     '&sup;' => 0x02283,
 2886     '&Sup;' => 0x022D1,
 2887     '&sup1;' => 0x000B9,
 2888     '&sup2;' => 0x000B2,
 2889     '&sup3;' => 0x000B3,
 2890     '&supdot;' => 0x02ABE,
 2891     '&supdsub;' => 0x02AD8,
 2892     '&supe;' => 0x02287,
 2893     '&supE;' => 0x02287,
 2894     '&supedot;' => 0x02AC4,
 2895     '&Superset;' => 0x02283,
 2896     '&SupersetEqual;' => 0x02287,
 2897     '&suphsol;' => 0x0228,
 2898     '&suphsub;' => 0x02AD7,
 2899     '&suplarr;' => 0x0297B,
 2900     '&supmult;' => 0x02AC2,
 2901     '&supne;' => 0x0228B,
 2902     '&supnE;' => 0x0228B,
 2903     '&supplus;' => 0x02AC0,
 2904     '&supset;' => 0x02283,
 2905     '&Supset;' => 0x022D1,
 2906     '&supseteq;' => 0x02287,
 2907     '&supseteqq;' => 0x02287,
 2908     '&supsetneq;' => 0x0228B,
 2909     '&supsetneqq;' => 0x0228B,
 2910     '&supsim;' => 0x02AC8,
 2911     '&supsub;' => 0x02AD4,
 2912     '&supsup;' => 0x02AD6,
 2913     '&swarhk;' => 0x02926,
 2914     '&swarr;' => 0x02199,
 2915     '&swArr;' => 0x021D9,
 2916     '&swarrow;' => 0x02199,
 2917     '&swnwar;' => 0x0292A,
 2918     '&szlig;' => 0x000DF,
 2919     '&Tab;' => 0x00009,
 2920     '&target;' => 0x02316,
 2921     '&tau;' => 0x003C4,
 2922     '&tbrk;' => 0x023B4,
 2923     '&tcaron;' => 0x00165,
 2924     '&Tcaron;' => 0x00164,
 2925     '&tcedil;' => 0x00163,
 2926     '&Tcedil;' => 0x00162,
 2927     '&tcy;' => 0x00442,
 2928     '&Tcy;' => 0x00422,
 2929     '&tdot;' => 0x020DB,
 2930     '&telrec;' => 0x02315,
 2931     '&there4;' => 0x02234,
 2932     '&therefore;' => 0x02234,
 2933     '&Therefore;' => 0x02234,
 2934     '&theta;' => 0x003B8,
 2935     '&Theta;' => 0x00398,
 2936     '&thetav;' => 0x003D1,
 2937     '&thickapprox;' => 0x0224,
 2938     '&thicksim;' => 0x0223,
 2939     '&ThickSpace;' => 0x02009,
 2940     '&thinsp;' => 0x02009,
 2941     '&ThinSpace;' => 0x02009,
 2942     '&thkap;' => 0x0224,
 2943     '&thksim;' => 0x0223,
 2944     '&thorn;' => 0x000FE,
 2945     '&THORN;' => 0x000DE,
 2946     '&tilde;' => 0x002DC,
 2947     '&Tilde;' => 0x0223C,
 2948     '&TildeEqual;' => 0x02243,
 2949     '&TildeFullEqual;' => 0x02245,
 2950     '&TildeTilde;' => 0x02248,
 2951     '&times;' => 0x000D7,
 2952     '&timesb;' => 0x022A0,
 2953     '&timesbar;' => 0x02A31,
 2954     '&timesd;' => 0x02A30,
 2955     '&tint;' => 0x0222D,
 2956     '&toea;' => 0x02928,
 2957     '&top;' => 0x022A4,
 2958     '&topbot;' => 0x02336,
 2959     '&topcir;' => 0x02AF1,
 2960     '&topfork;' => 0x02ADA,
 2961     '&tosa;' => 0x02929,
 2962     '&tprime;' => 0x02034,
 2963     '&trade;' => 0x02122,
 2964     '&triangle;' => 0x025B5,
 2965     '&triangledown;' => 0x025BF,
 2966     '&triangleleft;' => 0x025C3,
 2967     '&trianglelefteq;' => 0x022B4,
 2968     '&triangleq;' => 0x0225C,
 2969     '&triangleright;' => 0x025B9,
 2970     '&trianglerighteq;' => 0x022B5,
 2971     '&tridot;' => 0x025EC,
 2972     '&trie;' => 0x0225C,
 2973     '&triminus;' => 0x02A3A,
 2974     '&TripleDot;' => 0x020DB,
 2975     '&triplus;' => 0x02A39,
 2976     '&trisb;' => 0x029CD,
 2977     '&tritime;' => 0x02A3B,
 2978     '&tscy;' => 0x00446,
 2979     '&TScy;' => 0x00426,
 2980     '&tshcy;' => 0x0045B,
 2981     '&TSHcy;' => 0x0040B,
 2982     '&tstrok;' => 0x00167,
 2983     '&Tstrok;' => 0x00166,
 2984     '&twixt;' => 0x0226C,
 2985     '&twoheadleftarrow;' => 0x0219E,
 2986     '&twoheadrightarrow;' => 0x021A0,
 2987     '&uacute;' => 0x000FA,
 2988     '&Uacute;' => 0x000DA,
 2989     '&uarr;' => 0x02191,
 2990     '&uArr;' => 0x021D1,
 2991     '&Uarr;' => 0x0219F,
 2992     '&Uarrocir;' => 0x02949,
 2993     '&ubrcy;' => 0x0045E,
 2994     '&Ubrcy;' => 0x0040E,
 2995     '&ubreve;' => 0x0016D,
 2996     '&Ubreve;' => 0x0016C,
 2997     '&ucirc;' => 0x000FB,
 2998     '&Ucirc;' => 0x000DB,
 2999     '&ucy;' => 0x00443,
 3000     '&Ucy;' => 0x00423,
 3001     '&udarr;' => 0x021C5,
 3002     '&udblac;' => 0x00171,
 3003     '&Udblac;' => 0x00170,
 3004     '&udhar;' => 0x0296E,
 3005     '&ufisht;' => 0x0297E,
 3006     '&ugrave;' => 0x000F9,
 3007     '&Ugrave;' => 0x000D9,
 3008     '&uHar;' => 0x02963,
 3009     '&uharl;' => 0x021BF,
 3010     '&uharr;' => 0x021BE,
 3011     '&uhblk;' => 0x02580,
 3012     '&ulcorn;' => 0x0231C,
 3013     '&ulcorner;' => 0x0231C,
 3014     '&ulcrop;' => 0x0230F,
 3015     '&ultri;' => 0x025F8,
 3016     '&umacr;' => 0x0016B,
 3017     '&Umacr;' => 0x0016A,
 3018     '&uml;' => 0x000A8,
 3019     '&UnderBar;' => 0x00332,
 3020     '&UnderBrace;' => 0x0FE38,
 3021     '&UnderBracket;' => 0x023B5,
 3022     '&UnderParenthesis;' => 0x0FE36,
 3023     '&Union;' => 0x022C3,
 3024     '&UnionPlus;' => 0x0228E,
 3025     '&uogon;' => 0x00173,
 3026     '&Uogon;' => 0x00172,
 3027     '&uparrow;' => 0x02191,
 3028     '&Uparrow;' => 0x021D1,
 3029     '&UpArrow;' => 0x02191,
 3030     '&UpArrowBar;' => 0x02912,
 3031     '&UpArrowDownArrow;' => 0x021C5,
 3032     '&updownarrow;' => 0x02195,
 3033     '&Updownarrow;' => 0x021D5,
 3034     '&UpDownArrow;' => 0x02195,
 3035     '&UpEquilibrium;' => 0x0296E,
 3036     '&upharpoonleft;' => 0x021BF,
 3037     '&upharpoonright;' => 0x021BE,
 3038     '&uplus;' => 0x0228E,
 3039     '&UpperLeftArrow;' => 0x02196,
 3040     '&UpperRightArrow;' => 0x02197,
 3041     '&upsi;' => 0x003C5,
 3042     '&Upsi;' => 0x003D2,
 3043     '&upsilon;' => 0x003C5,
 3044     '&Upsilon;' => 0x003D2,
 3045     '&UpTee;' => 0x022A5,
 3046     '&UpTeeArrow;' => 0x021A5,
 3047     '&upuparrows;' => 0x021C8,
 3048     '&urcorn;' => 0x0231D,
 3049     '&urcorner;' => 0x0231D,
 3050     '&urcrop;' => 0x0230E,
 3051     '&uring;' => 0x0016F,
 3052     '&Uring;' => 0x0016E,
 3053     '&urtri;' => 0x025F9,
 3054     '&utdot;' => 0x022F0,
 3055     '&utilde;' => 0x00169,
 3056     '&Utilde;' => 0x00168,
 3057     '&utri;' => 0x025B5,
 3058     '&utrif;' => 0x025B4,
 3059     '&uuarr;' => 0x021C8,
 3060     '&uuml;' => 0x000FC,
 3061     '&Uuml;' => 0x000DC,
 3062     '&uwangle;' => 0x029A7,
 3063     '&vangrt;' => 0x022BE,
 3064     '&varepsilon;' => 0x0025B,
 3065     '&varkappa;' => 0x003F0,
 3066     '&varnothing;' => 0x02205,
 3067     '&varphi;' => 0x003D5,
 3068     '&varpi;' => 0x003D6,
 3069     '&varpropto;' => 0x0221D,
 3070     '&varr;' => 0x02195,
 3071     '&vArr;' => 0x021D5,
 3072     '&varrho;' => 0x003F1,
 3073     '&varsigma;' => 0x003C2,
 3074     '&varsubsetneq;' => 0x0228A,
 3075     '&varsubsetneqq;' => 0x0228,
 3076     '&varsupsetneq;' => 0x0228,
 3077     '&varsupsetneqq;' => 0x0228B,
 3078     '&vartheta;' => 0x003D1,
 3079     '&vartriangleleft;' => 0x022B2,
 3080     '&vartriangleright;' => 0x022B3,
 3081     '&vBar;' => 0x02AE8,
 3082     '&Vbar;' => 0x02AEB,
 3083     '&vBarv;' => 0x02AE9,
 3084     '&vcy;' => 0x00432,
 3085     '&Vcy;' => 0x00412,
 3086     '&vdash;' => 0x022A2,
 3087     '&vDash;' => 0x022A8,
 3088     '&Vdash;' => 0x022A9,
 3089     '&VDash;' => 0x022AB,
 3090     '&Vdashl;' => 0x02AE6,
 3091     '&vee;' => 0x02228,
 3092     '&Vee;' => 0x022C1,
 3093     '&veebar;' => 0x022BB,
 3094     '&veeeq;' => 0x0225A,
 3095     '&vellip;' => 0x022EE,
 3096     '&verbar;' => 0x0007C,
 3097     '&Verbar;' => 0x02016,
 3098     '&vert;' => 0x0007C,
 3099     '&Vert;' => 0x02016,
 3100     '&VerticalBar;' => 0x02223,
 3101     '&VerticalLine;' => 0x0007C,
 3102     '&VerticalSeparator;' => 0x02758,
 3103     '&VerticalTilde;' => 0x02240,
 3104     '&VeryThinSpace;' => 0x0200A,
 3105     '&vltri;' => 0x022B2,
 3106     '&vnsub;' => 0x02284,
 3107     '&vnsup;' => 0x02285,
 3108     '&vprop;' => 0x0221D,
 3109     '&vrtri;' => 0x022B3,
 3110     '&vsubne;' => 0x0228A,
 3111     '&vsubnE;' => 0x0228,
 3112     '&vsupne;' => 0x0228,
 3113     '&vsupnE;' => 0x0228B,
 3114     '&Vvdash;' => 0x022AA,
 3115     '&vzigzag;' => 0x0299A,
 3116     '&wcirc;' => 0x00175,
 3117     '&Wcirc;' => 0x00174,
 3118     '&wedbar;' => 0x02A5F,
 3119     '&wedge;' => 0x02227,
 3120     '&Wedge;' => 0x022C0,
 3121     '&wedgeq;' => 0x02259,
 3122     '&weierp;' => 0x02118,
 3123     '&wp;' => 0x02118,
 3124     '&wr;' => 0x02240,
 3125     '&wreath;' => 0x02240,
 3126     '&xcap;' => 0x022C2,
 3127     '&xcirc;' => 0x025EF,
 3128     '&xcup;' => 0x022C3,
 3129     '&xdtri;' => 0x025BD,
 3130     '&xharr;' => 0x0F578,
 3131     '&xhArr;' => 0x0F57B,
 3132     '&xi;' => 0x003BE,
 3133     '&Xi;' => 0x0039E,
 3134     '&xlarr;' => 0x0F576,
 3135     '&xlArr;' => 0x0F579,
 3136     '&xmap;' => 0x0F57D,
 3137     '&xnis;' => 0x022FB,
 3138     '&xodot;' => 0x02299,
 3139     '&xoplus;' => 0x02295,
 3140     '&xotime;' => 0x02297,
 3141     '&xrarr;' => 0x0F577,
 3142     '&xrArr;' => 0x0F57A,
 3143     '&xsqcup;' => 0x02294,
 3144     '&xuplus;' => 0x0228E,
 3145     '&xutri;' => 0x025B3,
 3146     '&xvee;' => 0x022C1,
 3147     '&xwedge;' => 0x022C0,
 3148     '&yacute;' => 0x000FD,
 3149     '&Yacute;' => 0x000DD,
 3150     '&yacy;' => 0x0044F,
 3151     '&YAcy;' => 0x0042F,
 3152     '&ycirc;' => 0x00177,
 3153     '&Ycirc;' => 0x00176,
 3154     '&ycy;' => 0x0044B,
 3155     '&Ycy;' => 0x0042B,
 3156     '&yen;' => 0x000A5,
 3157     '&yicy;' => 0x00457,
 3158     '&YIcy;' => 0x00407,
 3159     '&yucy;' => 0x0044E,
 3160     '&YUcy;' => 0x0042E,
 3161     '&yuml;' => 0x000FF,
 3162     '&Yuml;' => 0x00178,
 3163     '&zacute;' => 0x0017A,
 3164     '&Zacute;' => 0x00179,
 3165     '&zcaron;' => 0x0017E,
 3166     '&Zcaron;' => 0x0017D,
 3167     '&zcy;' => 0x00437,
 3168     '&Zcy;' => 0x00417,
 3169     '&zdot;' => 0x0017C,
 3170     '&Zdot;' => 0x0017B,
 3171     '&zeetrf;' => 0x02128,
 3172     '&ZeroWidthSpace;' => 0x0200B,
 3173     '&zeta;' => 0x003B6,
 3174     '&Zfr;' => 0x02128,
 3175     '&zhcy;' => 0x00436,
 3176     '&ZHcy;' => 0x00416,
 3177     '&zigrarr;' => 0x021DD,
 3178     '&Zopf;' => 0x02124);
 3179 }