chiark / gitweb /
Merge tag 'branchpoint-5.1' into release upstream/release 5.1
authorRichard Kettlewell <rjk@terraraq.org.uk>
Sun, 17 Feb 2013 16:25:28 +0000 (16:25 +0000)
committerRichard Kettlewell <rjk@terraraq.org.uk>
Sun, 17 Feb 2013 16:25:28 +0000 (16:25 +0000)
Branch point for 5.1 release.

Conflicts:
configure.ac
debian/changelog

188 files changed:
.gitignore [moved from .bzrignore with 94% similarity]
CHANGES.html
Makefile.am
README
README.developers
README.upgrades [deleted file]
README.upgrades.html [new file with mode: 0644]
acinclude.m4
autogen.sh
cgi/Makefile.am
cgi/actions.c
cgi/disorder-cgi.h
cgi/lookup.c
cgi/macros-disorder.c
cgi/options.c
clients/Makefile.am
clients/disorder.c
clients/disorderfm.c
clients/filename-bytes.c
clients/playrtp-log
clients/playrtp.c
clients/resample.c
configure.ac
debian/Makefile.am
debian/changelog
debian/conffiles.disorder-server
debian/control
debian/disorder.daily [new file with mode: 0755]
debian/rules
disobedience/Makefile.am
disobedience/choose-menu.c
disobedience/choose-search.c
disobedience/choose.c
disobedience/choose.h
disobedience/control.c
disobedience/disobedience.c
disobedience/disobedience.desktop [new file with mode: 0644]
disobedience/disobedience.h
disobedience/globals.c [new file with mode: 0644]
disobedience/log.c
disobedience/login.c
disobedience/lookup.c
disobedience/manual/properties.html
disobedience/manual/window.html
disobedience/menu.c
disobedience/misc.c
disobedience/playlists.c
disobedience/properties.c
disobedience/queue-generic.c
disobedience/queue-menu.c
disobedience/queue.c
disobedience/rtp.c
doc/disorder-dump.8.in
doc/disorder.cgi.8.in
doc/disorder_config.5.in
doc/disorder_options.5.in
doc/disorder_preferences.5.in
doc/disorder_protocol.5.in
docs.css [new file with mode: 0644]
images/Makefile.am
images/disobedience128x128.png [new file with mode: 0644]
images/disobedience256x256.png [new file with mode: 0644]
images/disobedience48x48.png [new file with mode: 0644]
images/disobedience64x64.png [new file with mode: 0644]
lib/Makefile.am
lib/asprintf.c
lib/authhash.c
lib/authhash.h
lib/cgi.c
lib/charset.h
lib/charsetf.c [new file with mode: 0644]
lib/client-common.c
lib/client-common.h
lib/client-stubs.c [new file with mode: 0644]
lib/client-stubs.h [new file with mode: 0644]
lib/client.c
lib/client.h
lib/configuration.c
lib/configuration.h
lib/eclient-stubs.c [new file with mode: 0644]
lib/eclient-stubs.h [new file with mode: 0644]
lib/eclient.c
lib/eclient.h
lib/eventdist.c
lib/eventlog.c
lib/eventlog.h
lib/fprintf.c
lib/hash.c
lib/hreader.c [new file with mode: 0644]
lib/hreader.h [new file with mode: 0644]
lib/kvp.c
lib/kvp.h
lib/mime.c
lib/queue.c
lib/queue.h
lib/resample.c
lib/resample.h
lib/sendmail.c
lib/signame.c
lib/snprintf.c
lib/strptime.c
lib/strptime.h
lib/syscalls.c
lib/syscalls.h
lib/syscallsrt.c [new file with mode: 0644]
lib/timeval.h
lib/trackdb.c
lib/trackdb.h
lib/uaudio-alsa.c
lib/uaudio-rtp.c
lib/uaudio-thread.c
lib/uaudio.c
lib/uaudio.h
lib/unidata.c
lib/user.c
lib/validity.h
lib/vector.c
lib/vector.h
lib/wav.c
lib/wav.h
lib/xgetdate.c
libtests/Makefile.am
libtests/t-addr.c
libtests/t-basen.c
libtests/t-cgi.c
libtests/t-dateparse.c
libtests/t-eventdist.c
libtests/t-hash.c
libtests/t-hex.c
libtests/t-timeval.c [new file with mode: 0644]
libtests/t-unicode.c
libtests/test.c
libtests/test.h
plugins/Makefile.am
plugins/exec.c
plugins/execraw.c
plugins/tracklength-flac.c [new file with mode: 0644]
plugins/tracklength-mp3.c [new file with mode: 0644]
plugins/tracklength-ogg.c [new file with mode: 0644]
plugins/tracklength-wav.c [new file with mode: 0644]
plugins/tracklength.c
plugins/tracklength.h [new file with mode: 0644]
python/disorder.py.in
scripts/Makefile.am
scripts/dist
scripts/make-unidata
scripts/make-version-string
scripts/protocol [new file with mode: 0755]
server/Makefile.am
server/background.c
server/choose.c
server/daemonize.c
server/dbupgrade.c
server/deadlock.c
server/decode-flac.c [new file with mode: 0644]
server/decode-mp3.c [new file with mode: 0644]
server/decode-ogg.c [new file with mode: 0644]
server/decode-wav.c [new file with mode: 0644]
server/decode.c
server/decode.h [new file with mode: 0644]
server/disorder-server.h
server/disorderd.c
server/dump.c
server/endian.c
server/exports.c
server/mount.c [new file with mode: 0644]
server/play.c
server/plugin.c
server/queue-ops.c
server/rescan.c
server/schedule.c
server/server-queue.c
server/server.c
server/speaker.c
server/state.c
server/stats.c
server/trackname.c
templates/Makefile.am
templates/about.tmpl
templates/macros.tmpl
templates/options
templates/options.columns [deleted file]
tests/Makefile.am
tests/cookie.py
tests/dtest.py
tests/play.py
tests/udplog.c
tests/user-upgrade.py [deleted file]

similarity index 94%
rename from .bzrignore
rename to .gitignore
index 150c85c8e411e76136edf02898f010129caa1bc6..48dbf0ac339351f7a3dddc54b915b54753a00fe9 100644 (file)
@@ -1,11 +1,11 @@
 Makefile.in
-./build
-./configure
-./config.h.in
-./COPYING
-./INSTALL
-./aclocal.m4
-./autom4te.cache
+/build
+/configure
+/config.h.in
+/COPYING
+/INSTALL
+/aclocal.m4
+/autom4te.cache
 config.aux/config.guess
 config.aux/config.sub
 config.aux/depcomp
@@ -14,19 +14,18 @@ config.aux/ltmain.sh
 config.aux/missing
 config.aux/py-compile
 ,*
-ChangeLog.d/bzr-changelog
 *.la
 *.lo
 .deps
 .libs
-./Makefile
-./TAGS
-./config.cache
-./config.h
-./config.log
-./config.status
-./libtool
-./stamp-h1
+/Makefile
+/TAGS
+/config.cache
+/config.h
+/config.log
+/config.status
+/libtool
+/stamp-h1
 clients/Makefile
 clients/disorder
 clients/disorderfm
@@ -82,7 +81,6 @@ server/disorderd
 server/trackname
 sounds/Makefile
 templates/Makefile
-.bzr.backup
 doc/disorder-speaker.8.html
 .gdb_history
 core
@@ -205,3 +203,12 @@ clients/rtpmon
 libtests/t-resample
 clients/resample
 disobedience/manual/Makefile
+/m4
+libtests/t-timeval
+*.[oa]
+*~
+*.pyc
+/GPATH
+/GRTAGS
+/GSYMS
+/GTAGS
index 008cc8757806d62a9d756d37ce2be0aa6ee5eb19..4fbc197cf9c87c271fc9f6ca97d6c9cbf96b49cf 100644 (file)
@@ -1,65 +1,8 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <head>
 <title>DisOrder Change History</title>
-<style type="text/css">
-body {
-  color: black;
-  background-color: white;
-  font-family: times,serif;
-  font-weight: normal;
-  font-size: 12pt;
-  font-variant: normal
-}
-
-div.section {
-  margin-left:1em
-}
-
-h1 {
-  background-color: #e0ffe0;
-  font-family: helvetica,sans-serif;
-  padding: 0.2em
-}
-
-h2 {
-  background-color: #e0ffe0;
-  font-family: helvetica,sans-serif;
-  padding: 0.2em
-}
-
-h3 {
-  background-color: #f0f0f0;
-  font-family: helvetica,sans-serif;
-  padding: 0.2em
-}
-
-h4 {
-  font-family: helvetica,sans-serif
-}
-
-table.bugs {
-  width: 100%;
-  font-size: 12pt;
-  border-collapse: collapse;
-  border:1px
-}
-
-table.bugs th {
-  text-align: left;
-  border: 1px solid black;
-  background-color: black;
-  color: white
-}
-
-table.bugs td {
-  border: 1px solid
-}
-
-span.command {
-  font-family: monospace
-}
-</style>
+<link rel=StyleSheet type="text/css" href="docs.css">
 </head>
 
 <body>
@@ -68,6 +11,96 @@ span.command {
 <p>This file documents recent user-visible changes to <a
  href="http://www.greenend.org.uk/rjk/disorder/">DisOrder</a>.</p>
 
+<p><b>IMPORTANT</b>: you should read <a
+href="README.upgrades.html">README.upgrades</a> before upgrading.</p>
+
+<h2>Changes up to version 5.1</h2>
+
+<div class=section>
+
+  <h3>Removable Device Support</h3>
+
+  <div class=section>
+
+    <p>The server will now automatically initiate a rescan when a filesystem is
+    mounted or unmounted.  (Use the <tt>mount_rescan</tt> option if you want to
+    suppress this behavior.)</p>
+
+    <p>The server takes care not to hold audio files open unnecessarily, so
+    that devices can be unmounted even if tracks from them are currently being
+    buffered.</p>
+
+  </div>
+
+  <h3>Disobedience</h3>
+
+  <div class=section>
+
+    <p>You can now edit the <tt>required-tags</tt> and <tt>prohibited-tags</tt>
+    global preferences in Disobedience
+    (<a href="http://code.google.com/p/disorder/issues/detail?id=29">issue
+    #29</a>).</p>
+
+    <p>The &ldquo;Manage users&rdquo; option is now more reliably greyed out if
+    it will not work.  This depends on a server change too, so it may still be
+    wrong if a new Disobedience is used against an old server.</p>
+
+    <p>A <tt>.desktop</tt> file is now shipped, making Disobedience visible as
+    an application in freedesktop.org-compliant systems.</p>
+
+  </div>
+
+  <h3>Backups</h3>
+
+  <div class=section>
+
+    <p>The Debian package now includes a cronjob that backs up the database
+    daily.  See <tt>/etc/cron.d/disorder</tt>.  You can put settings
+    in <tt>/etc/default/disorder</tt> to turn this off or to control how long
+    the backups are kept for.</p>
+
+    <p>The <tt>disorder-dump -r</tt> option was broken.</p>
+
+    <p><tt>disorder-dump</tt> now gets permissions right automatically (<a
+    href="http://code.google.com/p/disorder/issues/detail?id=56">issue
+    #56</a>).</p>
+
+  </div>
+
+  <h3>General</h3>
+
+  <div class=section>
+
+    <p>Unicode support has been upgraded to <a
+    href="http://www.unicode.org/versions/Unicode6.0.0/">Unicode
+    6.0.0</a>.</p>
+
+    <p>Client programs no longer depend on libdb.</p>
+    
+    <p>The following have been removed:</p>
+
+    <ul>
+
+      <li>The <tt>allow</tt>, <tt>gap</tt>, <tt>lock</tt>, <tt>prefsync</tt>, 
+      <tt>restrict</tt>, <tt>trust</tt> configuration commands.  If they still
+      appear in your configuration file then the server will not start.</li>
+
+      <li>The <tt>columns</tt> web interface option.  It will generate an
+      message in your error log but otherwise be ignored.</li>
+
+      <li>The <tt>--wait-for-device</tt> player option.  If it still appears in
+      any player commands, they will not work.</li>
+
+      <li>Support for automatically importing pre-3.0 users.</li>
+
+    </ul>
+
+    <p>Various minor bug fixes.</p>
+
+  </div>
+
+</div>
+
 <h2>Changes up to version 5.0.3</h2>
 
 <div class=section>
@@ -158,7 +191,7 @@ unless they are properly authorized.</p>
 
       <p>Confirmation URLs should be cleaner (and in particular not end
       with punctuation).  (Please see <a
-      href="README.upgrades">README.upgrades</a> for more about this.)</p>
+      href="README.upgrades.html">README.upgrades</a> for more about this.)</p>
 
     </div>
       
@@ -214,67 +247,67 @@ unless they are properly authorized.</p>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=30">#30</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=30">#30</a></td>
           <td>mini disobedience interface</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=32">#32</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=32">#32</a></td>
           <td>Excessively verbose log chatter on shutdown</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=33">#33</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=33">#33</a></td>
           <td>(Some) plugins need -lm.</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=39">#39</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=39">#39</a></td>
           <td>Double bind() non-multicast AF_INET</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=40">#40</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=40">#40</a></td>
           <td>Missing stub function</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=41">#41</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=41">#41</a></td>
           <td>Missing includes for timeval</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=42">#42</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=42">#42</a></td>
           <td>syntax error in empeg_host section</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=43">#43</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=43">#43</a></td>
           <td>decoder segfault with FLAC 1.2.1</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=44">#44</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=44">#44</a></td>
           <td>gcc 4.3.2-1ubuntu12 SUYB patch</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=45">#45</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=45">#45</a></td>
           <td>disobedience doesn't configure its back end</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=46">#46</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=46">#46</a></td>
           <td>Sort search results in web interface</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=48">#48</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=48">#48</a></td>
           <td>build-time dependency on <tt>oggdec</tt> removed</td>
         </tr>
 
         <tr>
-          <td><a href="http://code.google.com/p/disorder/issues/detail?id=49">#49</a></d>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=49">#49</a></td>
           <td>Disobedience's 'When' column gets out of date</td>
         </tr>
 
@@ -682,7 +715,7 @@ unless they are properly authorized.</p>
 <div class=section>
   
   <p><b>Important</b>!  See <a
-  href="README.upgrades">README.upgrades</a> when upgrading.</p>
+  href="README.upgrades.html">README.upgrades</a> when upgrading.</p>
   
   <h3>Platforms And Installation</h3>
   
index b41014f52b6b97dc04fb1b567632208878d5b588..4f98902a588c5e9a7eca3d54684db4ba2500907a 100644 (file)
 #
 
 EXTRA_DIST=CHANGES.html README.streams BUGS \
-README.upgrades README.client README.raw README.vhost README.developers
+README.upgrades.html README.client README.raw README.vhost README.developers \
+docs.css
 SUBDIRS=@subdirs@
 
 DISTCHECK_CONFIGURE_FLAGS:=httpdir=$(distdir)/_inst/httpdir cgiexecdir=$(shell pwd)/$(distdir)/_inst/cgiexecdir
 
+ACLOCAL_AMFLAGS=-I m4
+
 check-report: before-check check make-coverage-reports
 before-check:
        rm -f */*.gcda */*.gcov
diff --git a/README b/README
index b1ddc92a5bdfe902bbdc1a281745080bb0e308d8..71176aaf52e5acd9d1a730933541af1472167782 100644 (file)
--- a/README
+++ b/README
@@ -13,8 +13,8 @@ DisOrder is a multi-user software jukebox.
      GTK+ interface that runs on Linux and Mac systems.
    * Playing tracks can be paused or cancelled ("scratched").
 
-See CHANGES.html for details of recent changes to DisOrder and README.upgrades
-for upgrade instructions.
+See CHANGES.html for details of recent changes to DisOrder and
+README.upgrades.html for upgrade instructions.
 
 Platform support:
   Linux            Well tested on Debian
@@ -67,7 +67,8 @@ Installation
    "This place'd be a paradise tomorrow, if every department had a supervisor
    with a machine-gun"
 
-IMPORTANT: If you are upgrading from an earlier version, see README.upgrades.
+IMPORTANT: If you are upgrading from an earlier version, see
+README.upgrades.html.
 
 Debian/Ubuntu: steps 1 to 6 are dealt with automatically if you use the .deb
 files.
@@ -264,7 +265,7 @@ Copyright
   "Nothing but another drug, a licence that you buy and sell"
 
 DisOrder - select and play digital audio files
-Copyright (C) 2003-2009 Richard Kettlewell
+Copyright (C) 2003-2013 Richard Kettlewell
 Portions copyright (C) 2007 Ross Younger
 Portions copyright (C) 2007 Mark Wooding
 Portions extracted from MPG321, http://mpg321.sourceforge.net/
index 5c71b07bbdc75f26fb2e6e3e1592c07bdb2fbc9e..692dd12be2bd7d42021b47a0c1829e3f2f8a3c49 100644 (file)
@@ -4,18 +4,17 @@ Dependencies:
      Automake         1.10           1.7 is no good; 1.8/9 might work
      Autoconf         2.61           Slightly older might work too
      Libtool          1.5.22         1.4 is no good
-     Bazaar (bzr)                    You might be able to manage without
+     git                             You might be able to manage without
      Python           2.5.2          2.4 won't work
 
    * On Debian and derivatives this should work:
 
-     apt-get install gcc libc-dev automake autoconf libtool libgtk2.0-dev \
+     apt-get install gcc libc6-dev automake autoconf libtool libgtk2.0-dev \
                     libgc-dev libgcrypt-dev libpcre3-dev libvorbis-dev \
-                    libao-dev libmad0-dev libasound2-dev libdb4.3-dev \
+                    libao-dev libmad0-dev libasound2-dev libdb4.5-dev \
                     libflac-dev vorbis-tools wget libsamplerate0-dev
 
-     On lenny use libdb4.5-deb.  libdb4.6 does not work (and configure will
-     refuse to use it).
+     libdb4.6 does not work (and configure will refuse to use it).
 
    * On FreeBSD you'll need at least these packages:
        autotools bash flac mad boehm-gc db43 gmake gsed libao libgcrypt wget
@@ -30,7 +29,7 @@ Dependencies:
 
 Building:
 
-   * Compiled versions of configure and the makefiles are not included in bzr,
+   * Compiled versions of configure and the makefiles are not included in git,
      so if you didn't use a source tarball, you must start as follows:
 
         bash ./autogen.sh
@@ -107,14 +106,11 @@ The Server:
    * To add a new command:
      1) Add a new c_ function and table entry in server/server.c
      2) Document the new command in doc/disorder_protocol.5.in
-     3) Add a new function to lib/client.c
+     3) Add a new function to scripts/protocol.
      4) Add a new function to lib/eclient.c
      5) Add a new function to python/disorder.py.in
      6) Add a new command to clients/disorder.c and update doc/disorder.1.in
      7) Add a new test somewhere in tests/*.py
-     Depending on the purpose of the command it may be acceptable to leave out
-     some of the client side work - for instance commands only ever used by the
-     web interface are not implemented in lib/eclient.c.
 
    * See disorder_protocol(5) for details of how the status code is
      constructed, and the existing commands for examples.
@@ -127,10 +123,13 @@ The Server:
 
 Web Interface:
 
+   * The support targets are current Firefox, Chrome, IE and Safari.  Obscure,
+     obsolete or text-only browsers are not of significant interest.
+
    * The web interface does not use Javascript or Flash and I would like to
-     keep it that way; Javascript might be acceptable but it must degrade
-     gracefuly if disabled.  Clever use of CSS is OK provided it works well on
-     the mainstream browsers.
+     keep it that way.  Javascript is likely to be acceptable if useful, but it
+     should degrade gracefuly if unavailable.  Clever use of CSS is OK provided
+     it works well on the mainstream browsers.
 
    * Update templates/help.tmpl for any changes you make.
 
@@ -148,7 +147,7 @@ Disobedience:
      a problem for Disobedience than the server.  Use the GLIB event loop to
      deal with long-running operations if you do need any.
 
-   * Update doc/disobedience.1.in for any changes you make.
+   * Update the contents of disobedience/manual/ for any changes you make.
 
 New Platforms:
 
@@ -183,7 +182,7 @@ Code And Patches:
      structure initializers are used; the configure script asks for -std=gnu99
      by default.  Some supported platforms are still on GCC 4.0.
 
-   * Please submit patches either using 'diff -u', or by publishing a bzr
+   * Please submit patches either using 'diff -u', or by publishing a git
      branch somewhere I can get at it.
 
    * Please make it clear that your changes can be distributed under DisOrder's
diff --git a/README.upgrades b/README.upgrades
deleted file mode 100644 (file)
index 1cb6aba..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-* Upgrading DisOrder
-
-The general procedure is:
-
- * stop the old daemon:  /etc/init.d/disorder stop
- * back up your database directory (example below)
- * build and install the new version as described in the README.  Remember to
-   install the new version of the web interface too.
- * update the configuration files (see below)
- * start the new daemon, e.g. with
-     /etc/init.d/disorder start
-
-The rest of this file describes things you must pay attention to when
-upgrading between particular versions.  Minor versions are not
-explicitly mentioned; a version number like 1.1 implicitly includes
-all 1.1.x versions.
-
-If you install from .deb files then much of this work is automated.
-
-* 4.x -> 5.0
-
-** Web Confirmation Strings
-
-The syntax of confirmation strings for online registrations has changed and old
-ones no longer work.  This only affects users who registered before the upgrade
-but have not yet confirmed their login.  You can delete such half-created users
-with 'disorder deluser USERNAME' (as an administrative user, for instance as
-root on the server) and they can start the registration process again.
-
-** Handling Of Configuration Changes
-
-There is a new mechanism to ensure that the search database and aliases are
-reconstructed if any options that affect them change.  Unfortunately this means
-that the reconstruction step always takes place on upgrade from 4.3 or earlier,
-as those versions don't record sufficient information for the server to tell
-whether it needs to reconstruct or not.
-
-The result will be a log message of the form:
-
-new database parameter string dbparams-0-sha256:61609f3e6395ec8dee317ee216fe2848d70c249d347dd03c6a219441a13dd456 - removing old data
-
-...and a slower rescan on startup.  Subsequent restarts should not have this
-problem (unless of course you change a relevant option).
-
-** Deprecation Notices
-
-The player --wait-for-device option is deprecated and will be removed in a
-future version.
-
-The 'lock' option no longer does anything.  You must delete it from any
-configuration files that contain it.  The full set of deprecated options is:
-  allow
-  gap
-  lock
-  prefsync
-  restrict
-  trust
-
-* 3.0 -> 4.x
-
-If you customized any of the templates, you will pretty much have to start from
-scratch as the web interface has been rewritten.  See disorder.cgi(8) for a
-starting point.
-
-The 'gap' directive will no longer work.  You must delete it from any
-configuration files that contain it.
-
-You may prefer to remove any 'smtp_server' directive you have, as the web
-interface will now use the local sendmail executable if available.
-
-If you want to be able to do use management over non-local connections (thereby
-potentially exposing passwords!) you must set 'remote_userman' to 'yes'.
-
-* 2.0 -> 3.0
-
-** Authentication
-
-Users are now stored in the database rather than in 'allow' directives in a
-private configuration file.  'allow' is still understood in this version, but
-is only used to populate the database on startup.  After the first (successful)
-run of the server the remaining 'allow' directives should be deleted.
-
-'restrict' and 'trust' are replaced by a system of per-user rights.  The
-default user rights are based on the 'restrict' setting, and the rights of
-users created frow 'allow' directives preserve the meaning of 'trust', but
-after the first run you should remove these directives and (optionally) add a
-'default_rights' directive.
-
-'allow', 'restrict' and 'trust' will stop working entirely in a future version
-but for now they will generate harmless error messages.  Remove them and the
-error messages will go away.
-
-See README for new setup instructions for the web interface.
-
-** Other Server Configuration
-
-Sensible defaults for 'stopword', 'player' and 'tracklength' are now built into
-the server.  If you haven't modified the values from the example or Debian
-configuration files then you can remove them.
-
-'gap' now defaults to 0 seconds instead of 2.
-
-The sound output API is now configured with the 'api' command although
-'speaker_backend' still works.  If you use 'api alsa' then you may need to
-change your 'mixer' and 'channel' settings.
-
-** Web Interface
-
-The web interface no longer uses HTTP basic authentication and the web server
-configuration imposing access control on it should be removed.  Users now log
-in using their main DisOrder password and the one in the htpassed file is now
-obsolete.  You should revisit the web interface setup instructions in README
-from scratch.
-
-As part of this, the DisOrder URL has changed from (e.g.)
-
-    http://yourserver/cgi-bin/disorder/disorder
-
-to just
-
-    http://yourserver/cgi-bin/disorder
-
-** Checklist
-
-   * delete default 'stopword', 'player' and 'tracklength' directives
-   * set 'gap' if you want a non-0 inter-track gap
-   * set 'api' and maybe 'mixer' and 'channel'
-   * perhaps add 'default_rights' directive
-   * delete 'allow', 'restrict' and 'trust' directives after first run
-   * follow new web interface setup in README
-
-* 1.4/1.5 -> 2.0
-
-** 'transform' and 'namepart' directives
-
-'transform' has moved from the web options to the main configuration file, so
-that they can be used by other interfaces.  The syntax and semantics are
-unchanged.
-
-More importantly however both 'transform' and 'namepart' are now optional, with
-sensible defaults being built in.  So if you were already using the default
-values you can just delete all instances of both.
-
-See disorder_config(5) for the default values.  Hopefuly they will be suitable
-for many configurations.  Please do send feedback.
-
-** 'enabled' and 'random_enabled' directives
-
-These have been removed.  Instead the state persists from one run of the server
-to the next.  If they appear in your configuration file they must be removed;
-the server will not start if they are present.
-
-** Database upgrade
-
-It is strongly recommended that you back up your database before performing the
-upgrade.  For example, as root, with the server STOPPED:
-  cd /var/disorder
-  mkdir BACKUP
-  cp -p * BACKUP
-
-To restore, again as root:
-  cd /var/disorder
-  rm *
-  cp -p BACKUP/* .
-
-The first thing the server does when upgrading from 1.5 is run the
-disorder-dbupgrade program.  This is necessary to modify any non-ASCII track
-names to meet the latest version's stricter normalization practices.  The
-upgrade should succeed automatically; if not it should leave an error message
-in syslog.
-
-* 1.3 -> 1.4
-
-** Raw Format Decoders
-
-You will probably want reconfigure your install to use the new facilities
-(although the old way works fine).  See the example configuration file and
-README.raw for more details.
-
-Depending on how your system is configured you may need to link the disorder
-libao driver into the right directory:
-
-   ln -s /usr/local/lib/ao/plugins-2/libdisorder.so /usr/lib/ao/plugins-2/.
-
-* 1.2 -> 1.3
-
-** Server Environment
-
-It is important that $sbindir is on the server's path.  The example init script
-guarantees this.  You may need to modify the installed one.  You will get
-"deadlock manager unexpectedly terminated" if you get this wrong.
-
-** namepart directives
-
-These have changed in three ways.
-
-Firstly they have changed to substitute in a more convenient way.  Instead of
-matches for the regexp being substituted back into the original track name, the
-replacement string now completely replaces it.  Given the usual uses of
-namepart, this is much more convenient.  If you've stuck with the defaults no
-changes should be needed for this.
-
-Secondly they are matched against the track name with the collection root
-stripped off.
-
-Finally you will need to add an extra line to your config file as follows for
-the new track aliasing mechanisms to work properly:
-
-namepart        ext     "(\\.[a-zA-Z0-9]+)$"                   "$1"    *
-
-* 1.1 -> 1.2
-
-** Web Interface Changes
-
-The web interface now includes static content as well as templates.
-The static content must be given a name visible to HTTP clients which
-maps to its location in the real filesystem.
-
-The README suggests using a rule in httpd.conf to make /static in the
-HTTP namespace point to /usr/local/share/disorder/static, which is
-where DisOrder installs its static content (by default).
-Alternatively you can set the url.static label to the base URL of the
-static content.
-
-** Configuration File Changes
-
-The trackname-part web interface directive has now gone, and the
-options.trackname file with it.
-
-It is replaced by a new namepart directive in the main configuration
-file.  This has exactly the same syntax as trackname-part, only the
-name and location have changed.
-
-The reason for the change is to allow track name parsing to be
-centrally configured, rather than every interface to DisOrder having
-to implement it locally.
-
-If you do not install new namepart directives into the main
-configuration file then track titles will show up blank.
-
-If you do not remove the trackname-part directives from the web
-interface configuration then you will get error messages in the web
-server's error log.
-
-Local Variables:
-mode:outline
-fill-column:79
-End:
diff --git a/README.upgrades.html b/README.upgrades.html
new file mode 100644 (file)
index 0000000..c628b06
--- /dev/null
@@ -0,0 +1,349 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+  <head>
+    <title>Upgrading DisOrder</title>
+    <link rel=StyleSheet type="text/css" href="docs.css">
+  </head>
+  <body>
+    <h1>Upgrading DisOrder</h1>
+
+    <ul>
+      <li><a href="#deb">.deb Installs</a></li>
+      <li><a href="#source">Source Installs</a></li>
+      <li><a href="#ver">Version-Specific Details</a></li>
+    </ul>
+
+    <h2><a name="deb">.deb Installs</a></h2>
+
+    <h3>Take A Backup</h3>
+    
+    <p>You should make a backup of DisOrder's databases before proceeding with
+    any upgrade.  You can generate a backup as follows:</p>
+
+    <pre># disorder-dump --dump <i>PATH</i></pre>
+
+    <p>where <i>PATH</i> is the filename to write the backup to.</p>
+
+    <p>As of version 5.1, the Debian version of the server will take a daily
+    backup of its databases to <tt>/var/lib/disorder/backups</tt>, so it should
+    not be a disaster if you neglect this step in <i>subsequent</i>
+    upgrades.</p>
+
+    <h3>Install The New Packages</h3>
+
+    <pre># dpkg -i *.deb</pre>
+
+    <h3>Upgrade Databases</h3>
+
+    <p>If you have changed version of <tt>libdb</tt> then the new one may not
+    be compatible with the old one's file format.  In this case the server will
+    not start, causing the upgrade to fail.  Remove the database files and
+    restore from the backup you took above.</p>
+
+    <pre># rm /var/lib/disorder/*
+# disorder-dump --restore PATH
+# dpkg --configure -a</pre>
+
+    <h2><a name=source>Source Installs</a></h2>
+
+    <h3>Take A Backup</h3>
+
+    <p>You should make a backup of DisOrder's databases before proceeding with
+    any upgrade.  You can generate a backup as follows:</p>
+
+    <pre># disorder-dump --dump PATH</pre>
+
+    <p>where PATH is the filename to write the backup to.</p>
+
+    <h3>Stop The Server</h3>
+
+    <p>Linux:</p>
+
+    <pre># /etc/init.d/disorder stop</pre>
+
+    <p>Mac:</p>
+
+    <pre># launchctl stop uk.org.greenend.rjk.disorder
+# launchctl unload /Library/LaunchDaemons/uk.org.greenend.rjk.disorder.plist</pre>
+
+    <p>If you are feeling cautious you can also make an exact copy of the
+    database files at this point (they are in
+    <tt>/usr/local/var/disorder</tt>).</p>
+
+    <h3>Build And Install The New Version</h3>
+
+    <p>See the top-level <a href="README">README</a>.</p>
+
+    <h3>Update Configuration Files</h3>
+
+    <p>See version-specific information below.</p>
+
+    <h3>Upgrade Databases</h3>
+
+    <p>If you have changed version of <tt>libdb</tt> you may need to remove the
+    database files and restore from the backup you took above.</p>
+
+    <pre># rm /usr/local/var/disorder/*
+# disorder-dump --restore PATH</pre>
+
+    <h3>Restart The Server</h3>
+
+    <p>Linux:</p>
+
+    <pre># /etc/init.d/disorder start</pre>
+
+    <p>Mac:</p>
+
+    <pre># cp examples/uk.org.greenend.rjk.disorder.plist /Library/LaunchDaemons/.
+# launchctl load /Library/LaunchDaemons
+# launchctl start uk.org.greenend.rjk.disorder</pre>
+
+    <h1><a name=ver>Version-Specific Details</a></h1>
+
+    <h2>4.x -> 5.0</h2>
+
+    <h3>Web Confirmation Strings</h3>
+
+    <p>The syntax of confirmation strings for online registrations has changed
+    and old ones no longer work.  This only affects users who registered before
+    the upgrade but have not yet confirmed their login.  You can delete such
+    half-created users with 'disorder deluser USERNAME' (as an administrative
+    user, for instance as root on the server) and they can start the
+    registration process again.</p>
+
+    <h3>Handling Of Configuration Changes</h3>
+
+    <p>There is a new mechanism to ensure that the search database and aliases
+    are reconstructed if any options that affect them change.  Unfortunately
+    this means that the reconstruction step always takes place on upgrade from
+    4.3 or earlier, as those versions don't record sufficient information for
+    the server to tell whether it needs to reconstruct or not.</p>
+
+    <p>The result will be a log message of the form:</p>
+
+    <pre>new database parameter string dbparams-0-sha256:61609f3e6395ec8dee317ee216fe2848d70c249d347dd03c6a219441a13dd456 - removing old data</pre>
+
+    <p>...and a slower rescan on startup.  Subsequent restarts should not have
+    this problem (unless of course you change a relevant option).</p>
+
+    <h3>Deprecation Notices</h3>
+
+    <p>The player <tt>--wait-for-device</tt> option is deprecated and will be
+    removed in a future version.</p>
+
+    <p>The 'lock' option no longer does anything.  You must delete it from any
+    configuration files that contain it.  The full set of deprecated options
+    is:</p>
+
+    <ul>
+    <li>allow</li>
+    <li>gap</li>
+    <li>lock</li>
+    <li>prefsync</li>
+    <li>restrict</li>
+    <li>trust</li>
+        </ul>
+
+    <p>(As of 5.1 these options are completely gone.)</p>
+
+    <h2>3.0 -> 4.x</h2>
+
+    <p>If you customized any of the templates, you will pretty much have to
+    start from scratch as the web interface has been rewritten.  See
+    disorder.cgi(8) for a starting point.</p>
+
+    <p>The 'gap' directive will no longer work.  You must delete it from any
+    configuration files that contain it.</p>
+
+    <p>You may prefer to remove any 'smtp_server' directive you have, as the
+    web interface will now use the local sendmail executable if available.</p>
+
+    <p>If you want to be able to do use management over non-local connections
+    (thereby potentially exposing passwords!) you must set 'remote_userman' to
+    'yes'.</p>
+
+    <h2>2.0 -> 3.0</h2>
+
+    <h3>Authentication</h3>
+
+    <p>Users are now stored in the database rather than in 'allow' directives
+    in a private configuration file.  'allow' is still understood in this
+    version, but is only used to populate the database on startup.  After the
+    first (successful) run of the server the remaining 'allow' directives
+    should be deleted.</p>
+
+    <p>'restrict' and 'trust' are replaced by a system of per-user rights.  The
+    default user rights are based on the 'restrict' setting, and the rights of
+    users created frow 'allow' directives preserve the meaning of 'trust', but
+    after the first run you should remove these directives and (optionally) add
+    a 'default_rights' directive.</p>
+
+    <p>'allow', 'restrict' and 'trust' will stop working entirely in a future
+    version but for now they will generate harmless error messages.  Remove
+    them and the error messages will go away.</p>
+
+    <p>(Note: these options, and the code for upgrading old users, has been
+    removed entirely in release 5.1.  You must either manually re-create your
+    users, or upgrade via 5.0.3.)</p>
+
+    <p>See README for new setup instructions for the web interface.</p>
+
+    <h3>Other Server Configuration</h3>
+
+    <p>Sensible defaults for 'stopword', 'player' and 'tracklength' are now
+    built into the server.  If you haven't modified the values from the example
+    or Debian configuration files then you can remove them.</p>
+
+    <p>'gap' now defaults to 0 seconds instead of 2.</p>
+
+    <p>The sound output API is now configured with the 'api' command although
+    'speaker_backend' still works.  If you use 'api alsa' then you may need to
+    change your 'mixer' and 'channel' settings.</p>
+
+    <h3>Web Interface</h3>
+
+    <p>The web interface no longer uses HTTP basic authentication and the web
+    server configuration imposing access control on it should be removed.
+    Users now log in using their main DisOrder password and the one in the
+    htpassed file is now obsolete.  You should revisit the web interface setup
+    instructions in README from scratch.</p>
+
+    <p>As part of this, the DisOrder URL has changed from (e.g.)</p>
+
+    <pre>http://yourserver/cgi-bin/disorder/disorder</pre>
+
+    <p>to just</p>
+
+    <pre>http://yourserver/cgi-bin/disorder</pre>
+
+    <h3>Checklist</h3>
+
+    <ul>
+    <li>delete default 'stopword', 'player' and 'tracklength' directives</li>
+    <li>set 'gap' if you want a non-0 inter-track gap</li>
+    <li>set 'api' and maybe 'mixer' and 'channel'</li>
+    <li>perhaps add 'default_rights' directive</li>
+    <li>delete 'allow', 'restrict' and 'trust' directives after first run</li>
+    <li>follow new web interface setup in README</li>
+        </ul>
+
+    <h2>1.4/1.5 -> 2.0</h2>
+
+    <h3>'transform' and 'namepart' directives</h3>
+
+    <p>'transform' has moved from the web options to the main configuration
+    file, so that they can be used by other interfaces.  The syntax and
+    semantics are unchanged.</p>
+
+    <p>More importantly however both 'transform' and 'namepart' are now
+    optional, with sensible defaults being built in.  So if you were already
+    using the default values you can just delete all instances of both.</p>
+
+    <p>See disorder_config(5) for the default values.  Hopefuly they will be
+    suitable for many configurations.  Please do send feedback.</p>
+
+    <h3>'enabled' and 'random_enabled' directives</h3>
+
+    <p>These have been removed.  Instead the state persists from one run of the
+    server to the next.  If they appear in your configuration file they must be
+    removed; the server will not start if they are present.</p>
+
+    <h3>Database upgrade</h3>
+
+    <p>It is strongly recommended that you back up your database before
+    performing the upgrade.  For example, as root, with the server STOPPED:</p>
+
+    <pre># cd /var/disorder
+# mkdir BACKUP
+# cp -p * BACKUP</pre>
+
+    <p>To restore, again as root:</p>
+    <pre># cd /var/disorder
+# rm *
+# cp -p BACKUP/* .</pre>
+
+    <p>The first thing the server does when upgrading from 1.5 is run the
+    disorder-dbupgrade program.  This is necessary to modify any non-ASCII
+    track names to meet the latest version's stricter normalization practices.
+    The upgrade should succeed automtically; if not it should leave an error
+    message in syslog.</p>
+
+    <h2>1.3 -> 1.4</h2>
+
+    <h3>Raw Format Decoders</h3>
+
+    <p>You will probably want reconfigure your install to use the new
+    facilities (although the old way works fine).  See the example
+    configuration file and README.raw for more details.</p>
+
+    <p>Depending on how your system is configured you may need to link the
+    disorder libao driver into the right directory:</p>
+
+    <pre># ln -s /usr/local/lib/ao/plugins-2/libdisorder.so /usr/lib/ao/plugins-2/.</pre>
+
+    <h2>1.2 -> 1.3</h2>
+
+    <h3>Server Environment</h3>
+
+    <p>It is important that $sbindir is on the server's path.  The example init
+    script guarantees this.  You may need to modify the installed one.  You
+    will get "deadlock manager unexpectedly terminated" if you get this
+    wrong.</p>
+
+    <h3>namepart directives</h3>
+
+    <p>These have changed in three ways.</p>
+
+    <p>Firstly they have changed to substitute in a more convenient way.
+    Instead of matches for the regexp being substituted back into the original
+    track name, the replacement string now completely replaces it.  Given the
+    usual uses of namepart, this is much more convenient.  If you've stuck with
+    the defaults no changes should be needed for this.</p>
+
+    <p>Secondly they are matched against the track name with the collection
+    root stripped off.</p>
+
+    <p>Finally you will need to add an extra line to your config file as
+    follows for the new track aliasing mechanisms to work properly:</p>
+
+    <pre>namepart        ext     "(\\.[a-zA-Z0-9]+)$"                   "$1"    *</pre>
+
+    <h2>1.1 -> 1.2</h2>
+
+    <h3>Web Interface Changes</h3>
+
+    <p>The web interface now includes static content as well as templates.  The
+    static content must be given a name visible to HTTP clients which maps to
+    its location in the real filesystem.</p>
+
+    <p>The README suggests using a rule in httpd.conf to make /static in the
+    HTTP namespace point to /usr/local/share/disorder/static, which is where
+    DisOrder installs its static content (by default).  Alternatively you can
+    set the url.static label to the base URL of the static content.</p>
+
+    <h3>Configuration File Changes</h3>
+
+    <p>The trackname-part web interface directive has now gone, and the
+    options.trackname file with it.</p>
+
+    <p>It is replaced by a new namepart directive in the main configuration
+    file.  This has exactly the same syntax as trackname-part, only the name
+    and location have changed.</p>
+
+    <p>The reason for the change is to allow track name parsing to be centrally
+    configured, rather than every interface to DisOrder having to implement it
+    locally.</p>
+
+    <p>If you do not install new namepart directives into the main
+    configuration file then track titles will show up blank.</p>
+
+    <p>If you do not remove the trackname-part directives from the web
+    interface configuration then you will get error messages in the web
+    server's error log.</p>
+
+  </body>
+</html>
+
+<!-- Local Variables: -->
+<!-- fill-column:79 -->
+<!-- End: -->
index 6df1aa39b4048130b4dacf642f1547e45939a760..5ab86727bf3fc512afe005b2c8847ec5d3c67f90 100644 (file)
@@ -17,9 +17,9 @@
 
 AC_DEFUN([RJK_FIND_GC_H],[
   AC_CACHE_CHECK([looking for <gc.h>],[rjk_cv_gc_h],[
-    AC_PREPROC_IFELSE([
+    AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
                       #include <gc.h>
-                     ],
+                     ],[])],
                      [rjk_cv_gc_h="on default include path"],[
       oldCPPFLAGS="${CPPFLAGS}"
       for dir in /usr/include/gc /usr/local/include/gc; do
@@ -28,9 +28,9 @@ AC_DEFUN([RJK_FIND_GC_H],[
        else
          CPPFLAGS="${oldCPPFLAGS} -I$dir"
        fi
-       AC_PREPROC_IFELSE([
+       AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
                           #include <gc.h>
-                         ],
+                         ],[])],
                          [rjk_cv_gc_h=$dir;break],[rjk_cv_gc_h="not found"])
       done
       CPPFLAGS="${oldCPPFLAGS}"
index a63049ad8daa3cb8315df90857bc62adbf6232cf..90a5b88d0c7de7fb9f12314696178e15a72255ce 100755 (executable)
@@ -21,6 +21,7 @@ set -e
 srcdir=$(dirname $0)
 here=$(pwd)
 cd $srcdir
+mkdir -p config.aux
 if test -d $HOME/share/aclocal; then
   aclocal --acdir=$HOME/share/aclocal
 else
index 88cb24d4f2886ea422bca6fcc5d4e248e3395ad6..e762b718ff909c135b65ec967483feced904ede0 100644 (file)
@@ -27,7 +27,4 @@ disorder_LDADD=../lib/libdisorder.a \
 disorder_LDFLAGS=-export-dynamic
 disorder_DEPENDENCIES=../lib/libdisorder.a
 
-install-exec-hook:
-       $(LIBTOOL) --mode=finish $(DESTDIR)$(cgiexecdir)
-
 CLEANFILES=*.gcda *.gcov *.gcno *.c.html index.html
index fae533a7b3f45ee37c4ab6e2ed5838ef71c4a0e4..6e180984cd6bb07650c34e6aac932cfb0f764aeb 100644 (file)
@@ -76,14 +76,13 @@ static void act_playing(void) {
      && dcgi_playing->sofar >= 0) {
     /* Try to put the next refresh at the start of the next track. */
     xtime(&now);
-    fin = now + length - dcgi_playing->sofar + config->gap;
+    fin = now + length - dcgi_playing->sofar;
     if(now + refresh > fin)
       refresh = fin - now;
   }
   if(dcgi_queue && dcgi_queue->origin == origin_scratch) {
-    /* next track is a scratch, don't leave more than the inter-track gap */
-    if(refresh > config->gap)
-      refresh = config->gap;
+    /* next track is a scratch, refresh immediately */
+    refresh = 0;
   }
   if(!dcgi_playing
      && ((dcgi_queue
@@ -91,9 +90,8 @@ static void act_playing(void) {
          || dcgi_random_enabled)
      && dcgi_enabled) {
     /* no track playing but playing is enabled and there is something coming
-     * up, must be in a gap */
-    if(refresh > config->gap)
-      refresh = config->gap;
+     * up, so refresh immediately */
+    refresh = 0;
   }
   /* Bound the refresh interval below as a back-stop against the above
    * calculations coming up with a stupid answer */
@@ -240,16 +238,17 @@ static void act_play(void) {
   char **tracks;
   int ntracks, n;
   struct tracksort_data *tsd;
+  char *id;
   
   if(dcgi_client) {
     if((track = cgi_get("track"))) {
-      disorder_play(dcgi_client, track);
+      disorder_play(dcgi_client, track, &id);
     } else if((dir = cgi_get("dir"))) {
       if(disorder_files(dcgi_client, dir, 0, &tracks, &ntracks))
         ntracks = 0;
       tsd = tracksort_init(ntracks, tracks, "track");
       for(n = 0; n < ntracks; ++n)
-        disorder_play(dcgi_client, tsd[n].track);
+        disorder_play(dcgi_client, tsd[n].track, &id);
     }
   }
   redirect(0);
@@ -612,7 +611,7 @@ static int process_prefs(int numfile) {
     byte_xasprintf((char **)&name, "trackname_%s_%s", context, part);
     disorder_set(dcgi_client, file, name, value);
   }
-  if((value = numbered_arg("random", numfile)))
+  if(numbered_arg("random", numfile))
     disorder_unset(dcgi_client, file, "pick_at_random");
   else
     disorder_set(dcgi_client, file, "pick_at_random", "0");
index 4587e78795b7b17d2079563875b27e4bdba3cad3..e9deab21c295b997d1f4e6d55a5eeb5d1f7cbc3c 100644 (file)
@@ -77,7 +77,6 @@ struct queue_entry *dcgi_findtrack(const char *id);
 void option_set(const char *name, const char *value);
 const char *option_label(const char *key);
 int option_label_exists(const char *key);
-char **option_columns(const char *name, int *ncolumns);
 
 #define DCGI_QUEUE 0x0001
 #define DCGI_PLAYING 0x0002
@@ -92,8 +91,8 @@ extern struct queue_entry *dcgi_queue;
 extern struct queue_entry *dcgi_playing;
 extern struct queue_entry *dcgi_recent;
 
-extern int dcgi_volume_left;
-extern int dcgi_volume_right;
+extern long dcgi_volume_left;
+extern long dcgi_volume_right;
 
 extern char **dcgi_new;
 extern int dcgi_nnew;
index fd94900b9b1c39dfb935276b3be3a736d906b39a..2b6d59432a43d93b0d1087d543e08c4f7c8f1824 100644 (file)
@@ -33,8 +33,8 @@ struct queue_entry *dcgi_queue;
 struct queue_entry *dcgi_playing;
 struct queue_entry *dcgi_recent;
 
-int dcgi_volume_left;
-int dcgi_volume_right;
+long dcgi_volume_left;
+long dcgi_volume_right;
 
 char **dcgi_new;
 int dcgi_nnew;
@@ -68,7 +68,7 @@ void dcgi_lookup(unsigned want) {
     queuemap_add(dcgi_playing);
   }
   if(need & DCGI_NEW)
-    disorder_new_tracks(dcgi_client, &dcgi_new, &dcgi_nnew, 0);
+    disorder_new_tracks(dcgi_client, 0, &dcgi_new, &dcgi_nnew);
   if(need & DCGI_RECENT) {
     /* we need to reverse the order of the list */
     disorder_recent(dcgi_client, &r);
index 29835bbc849c196fcea60124fc55b10969cf6bde..1ef1ee1f3d0ed4f8e2db80197f0b0ecd6b87e41e 100644 (file)
@@ -159,10 +159,11 @@ static int exp_part(int nargs,
       return 0;
   }
   if(dcgi_client
-     && !disorder_part(dcgi_client, (char **)&s,
+     && !disorder_part(dcgi_client,
                        track,
                        !strcmp(context, "short") ? "display" : context,
-                       part)) {
+                       part,
+                       (char **)&s)) {
     if(!strcmp(context, "short"))
       s = truncate_for_display(s, config->short_display);
     return sink_writes(output, cgi_sgmlquote(s)) < 0 ? -1 : 0;
@@ -457,7 +458,7 @@ static int exp_volume(int attribute((unused)) nargs,
                       struct sink *output,
                       void attribute((unused)) *u) {
   dcgi_lookup(DCGI_VOLUME);
-  return sink_printf(output, "%d",
+  return sink_printf(output, "%ld",
                      !strcmp(args[0], "left")
                          ? dcgi_volume_left : dcgi_volume_right) < 0 ? -1 : 0;
 }
@@ -625,7 +626,7 @@ static int exp_trackstate(int attribute((unused)) nargs,
 
   if(!dcgi_client)
     return 0;
-  if(disorder_resolve(dcgi_client, &track, args[0]))
+  if(disorder_resolve(dcgi_client, args[0], &track))
     return 0;
   dcgi_lookup(DCGI_PLAYING);
   if(dcgi_playing && !strcmp(track, dcgi_playing->track))
@@ -661,7 +662,7 @@ static int exp_resolve(int attribute((unused)) nargs,
                        void attribute((unused)) *u) {
   char *r;
 
-  if(dcgi_client && !disorder_resolve(dcgi_client, &r, args[0]))
+  if(dcgi_client && !disorder_resolve(dcgi_client, args[0], &r))
     return sink_writes(output, r) < 0 ? -1 : 0;
   return 0;
 }
@@ -930,7 +931,7 @@ static int exp_dirs(int nargs,
                     const struct mx_node **args,
                     struct sink *output,
                     void *u) {
-  return exp__files_dirs(nargs, args, output, u, "dir", disorder_directories);
+  return exp__files_dirs(nargs, args, output, u, "dir", disorder_dirs);
 }
 
 static int exp__search_shim(disorder_client *c, const char *terms,
index fca5801caa3024d2acb99df61b095ade57afcaa7..521ce354016d1e3dbda11514caca6f5255802e9a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2008, 2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 #include "disorder-cgi.h"
 
-struct column {
-  int ncolumns;
-  char **columns;
-};
-
+/** @brief State for parsing an options file */
 struct read_options_state {
+  /** @brief Filename */
   const char *name;
+
+  /** @brief Line number */
   int line;
 };
 
 static hash *labels;
-static hash *columns;
 
 static void option__readfile(const char *name);
 
@@ -49,21 +47,17 @@ static void option__include(int attribute((unused)) nvec,
   option__readfile(vec[0]);
 }
 
-static void option__columns(int nvec,
-                          char **vec) {
-  struct column c;
-
-  c.ncolumns = nvec - 1;
-  c.columns = &vec[1];
-  hash_add(columns, vec[0], &c, HASH_INSERT_OR_REPLACE);
-}
-
+/** @brief Definition of an option command */
 static struct option {
+  /** @brief Command name */
   const char *name;
-  int minargs, maxargs;
+  /** @brief Minimum number of arguments */
+  int minargs;
+  /** @brief Maximum number of arguments */
+  int maxargs;
+  /** @brief Command handler */
   void (*handler)(int nvec, char **vec);
 } options[] = {
-  { "columns", 1, INT_MAX, option__columns },
   { "include", 1, 1, option__include },
   { "label", 2, 2, option__label },
 };
@@ -118,7 +112,6 @@ static void option__init(void) {
   if(!have_read_options) {
     have_read_options = 1;
     labels = hash_new(sizeof (char *));
-    columns = hash_new(sizeof (struct column));
     option__readfile("options");
   }
 }
@@ -186,27 +179,6 @@ int option_label_exists(const char *key) {
   return !!hash_find(labels, key);
 }
 
-/** @brief Return a column list
- * @param name Context (playing/recent/etc)
- * @param ncolumns Where to store column count or NULL
- * @return Pointer to column list
- */
-char **option_columns(const char *name, int *ncolumns) {
-  struct column *c;
-
-  option__init();
-  c = hash_find(columns, name);
-  if(c) {
-    if(ncolumns)
-      *ncolumns = c->ncolumns;
-    return c->columns;
-  } else {
-    if(ncolumns)
-      *ncolumns = 0;
-    return 0;
-  }
-}
-
 /*
 Local Variables:
 c-basic-offset:2
index 91afc1c4f06ed604840741ce985fa49b6baaaf27..6ed9f4ab60e8c9c26a3942285448a42a3aaa9c6c 100644 (file)
@@ -25,7 +25,7 @@ AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 disorder_SOURCES=disorder.c authorize.c authorize.h \
        ../lib/memgc.c
 disorder_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
-       $(LIBGC) $(LIBGCRYPT) $(LIBPCRE) $(LIBICONV) $(LIBDB) $(LIBPTHREAD)
+       $(LIBGC) $(LIBGCRYPT) $(LIBPCRE) $(LIBICONV) $(LIBPTHREAD)
 disorder_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 
 disorderfm_SOURCES=disorderfm.c \
@@ -36,7 +36,7 @@ disorderfm_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 disorder_playrtp_SOURCES=playrtp.c playrtp.h playrtp-mem.c
 disorder_playrtp_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBASOUND) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT) $(COREAUDIO) \
-       $(LIBDB) $(LIBPTHREAD) -lm
+       $(LIBPTHREAD) -lm
 disorder_playrtp_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 
 rtpmon_SOURCES=rtpmon.c
@@ -47,9 +47,6 @@ filename_bytes_SOURCES=filename-bytes.c
 resample_SOURCES=resample.c
 resample_LDADD=$(LIBOBJS) ../lib/libdisorder.a $(LIBSAMPLERATE)
 
-install-exec-hook:
-       $(LIBTOOL) --mode=finish $(DESTDIR)$(libdir)
-
 check: check-help check-completions
 
 # check everything has working --help and --version
index 1d55b8db6a7f14eedba2f555e69a5e13872dfb88..7966dbc7eda6a18fd2073397e7d391b01026c8bf 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,7 +52,6 @@
 #include "vector.h"
 #include "version.h"
 #include "dateparse.h"
-#include "trackdb.h"
 #include "inputline.h"
 
 static disorder_client *client;
@@ -67,7 +66,6 @@ static const struct option options[] = {
   { "help-commands", no_argument, 0, 'H' },
   { "user", required_argument, 0, 'u' },
   { "password", required_argument, 0, 'p' },
-  { "wait-for-root", no_argument, 0, 'W' },
   { 0, 0, 0, 0 }
 };
 
@@ -98,7 +96,9 @@ static void cf_version(char attribute((unused)) **argv) {
   char *v;
 
   if(disorder_version(getclient(), &v)) exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(v)));
+  v = nullcheck(utf82mb_f(v));
+  xprintf("%s\n", v);
+  xfree(v);
 }
 
 static void print_queue_entry(const struct queue_entry *q) {
@@ -136,8 +136,9 @@ static void cf_playing(char attribute((unused)) **argv) {
 }
 
 static void cf_play(char **argv) {
+  char *id;
   while(*argv)
-    if(disorder_play(getclient(), *argv++)) exit(EXIT_FAILURE);
+    if(disorder_play(getclient(), *argv++, &id)) exit(EXIT_FAILURE);
 }
 
 static void cf_remove(char **argv) {
@@ -173,13 +174,12 @@ static void cf_rescan(char attribute((unused)) **argv) {
 
 static void cf_somequeue(int (*fn)(disorder_client *c,
                                   struct queue_entry **qp)) {
-  struct queue_entry *q;
+  struct queue_entry *q, *qbase;
 
-  if(fn(getclient(), &q)) exit(EXIT_FAILURE);
-  while(q) {
+  if(fn(getclient(), &qbase)) exit(EXIT_FAILURE);
+  for(q = qbase; q; q = q->next)
     print_queue_entry(q);
-    q = q->next;
-  }
+  queue_free(qbase, 1);
 }
 
 static void cf_recent(char attribute((unused)) **argv) {
@@ -225,16 +225,17 @@ static void cf_somelist(char **argv,
                        int (*fn)(disorder_client *c,
                                  const char *arg, const char *re,
                                  char ***vecp, int *nvecp)) {
-  char **vec;
+  char **vec, **base;
   const char *re;
 
   if(argv[1])
     re = xstrdup(argv[1] + 1);
   else
     re = 0;
-  if(fn(getclient(), argv[0], re, &vec, 0)) exit(EXIT_FAILURE);
-  while(*vec)
-    xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+  if(fn(getclient(), argv[0], re, &base, 0)) exit(EXIT_FAILURE);
+  for(vec = base; *vec; ++vec)
+    xprintf("%s\n", nullcheck(utf82mb_f(*vec)));
+  xfree(base);
 }
 
 static int isarg_regexp(const char *s) {
@@ -242,7 +243,7 @@ static int isarg_regexp(const char *s) {
 }
 
 static void cf_dirs(char **argv) {
-  cf_somelist(argv, disorder_directories);
+  cf_somelist(argv, disorder_dirs);
 }
 
 static void cf_files(char **argv) {
@@ -257,7 +258,7 @@ static void cf_get(char **argv) {
   char *value;
 
   if(disorder_get(getclient(), argv[0], argv[1], &value)) exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(value)));
+  xprintf("%s\n", nullcheck(utf82mb_f(value)));
 }
 
 static void cf_length(char **argv) {
@@ -276,12 +277,13 @@ static void cf_unset(char **argv) {
 }
 
 static void cf_prefs(char **argv) {
-  struct kvp *k;
+  struct kvp *k, *base;
 
-  if(disorder_prefs(getclient(), argv[0], &k)) exit(EXIT_FAILURE);
-  for(; k; k = k->next)
+  if(disorder_prefs(getclient(), argv[0], &base)) exit(EXIT_FAILURE);
+  for(k = base; k; k = k->next)
     xprintf("%s = %s\n",
            nullcheck(utf82mb(k->name)), nullcheck(utf82mb(k->value)));
+  kvp_free(base);
 }
 
 static void cf_search(char **argv) {
@@ -291,6 +293,7 @@ static void cf_search(char **argv) {
   if(disorder_search(getclient(), *argv, &results, &nresults)) exit(EXIT_FAILURE);
   for(n = 0; n < nresults; ++n)
     xprintf("%s\n", nullcheck(utf82mb(results[n])));
+  free_strings(nresults, results);
 }
 
 static void cf_random_disable(char attribute((unused)) **argv) {
@@ -303,17 +306,19 @@ static void cf_random_enable(char attribute((unused)) **argv) {
 
 static void cf_stats(char attribute((unused)) **argv) {
   char **vec;
+  int nvec;
 
-  if(disorder_stats(getclient(), &vec, 0)) exit(EXIT_FAILURE);
-  while(*vec)
-      xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+  if(disorder_stats(getclient(), &vec, &nvec)) exit(EXIT_FAILURE);
+  for(int n = 0; n < nvec; ++n)
+    xprintf("%s\n", nullcheck(utf82mb(vec[n])));
+  free_strings(nvec, vec);
 }
 
 static void cf_get_volume(char attribute((unused)) **argv) {
-  int l, r;
+  long l, r;
 
   if(disorder_get_volume(getclient(), &l, &r)) exit(EXIT_FAILURE);
-  xprintf("%d %d\n", l, r);
+  xprintf("%ld %ld\n", l, r);
 }
 
 static void cf_set_volume(char **argv) {
@@ -338,8 +343,8 @@ static void cf_move(char **argv) {
 static void cf_part(char **argv) {
   char *s;
 
-  if(disorder_part(getclient(), &s, argv[0], argv[1], argv[2])) exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(s)));
+  if(disorder_part(getclient(), argv[0], argv[1], argv[2], &s)) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb_f(s)));
 }
 
 static int isarg_filename(const char *s) {
@@ -353,8 +358,8 @@ static void cf_authorize(char **argv) {
 static void cf_resolve(char **argv) {
   char *track;
 
-  if(disorder_resolve(getclient(), &track, argv[0])) exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(track)));
+  if(disorder_resolve(getclient(), argv[0], &track)) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb_f(track)));
 }
 
 static void cf_pause(char attribute((unused)) **argv) {
@@ -385,7 +390,7 @@ static void cf_get_global(char **argv) {
   char *value;
 
   if(disorder_get_global(getclient(), argv[0], &value)) exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(value)));
+  xprintf("%s\n", nullcheck(utf82mb_f(value)));
 }
 
 static void cf_set_global(char **argv) {
@@ -409,7 +414,7 @@ static int isarg_integer(const char *s) {
 static void cf_new(char **argv) {
   char **vec;
 
-  if(disorder_new_tracks(getclient(), &vec, 0, argv[0] ? atoi(argv[0]) : 0))
+  if(disorder_new_tracks(getclient(), argv[0] ? atol(argv[0]) : 0, &vec, 0))
     exit(EXIT_FAILURE);
   while(*vec)
     xprintf("%s\n", nullcheck(utf82mb(*vec++)));
@@ -446,7 +451,7 @@ static void cf_userinfo(char **argv) {
 
   if(disorder_userinfo(getclient(), argv[0], argv[1], &s))
     exit(EXIT_FAILURE);
-  xprintf("%s\n", nullcheck(utf82mb(s)));
+  xprintf("%s\n", nullcheck(utf82mb_f(s)));
 }
 
 static int isarg_option(const char *arg) {
@@ -498,9 +503,15 @@ static void cf_setup_guest(char **argv) {
     exit(EXIT_FAILURE);
 }
 
+/** @brief A scheduled event read from the server */
 struct scheduled_event {
+  /** @brief When event should occur */
   time_t when;
+
+  /** @brief Details of action */
   struct kvp *actiondata;
+
+  /** @brief Event ID */
   char *id;
 };
 
@@ -574,31 +585,27 @@ static void cf_schedule_del(char **argv) {
 }
 
 static void cf_schedule_play(char **argv) {
-  if(disorder_schedule_add(getclient(),
-                          dateparse(argv[0]),
-                          argv[1],
-                          "play",
-                          argv[2]))
+  if(disorder_schedule_add_play(getclient(),
+                                dateparse(argv[0]),
+                                argv[1],
+                                argv[2]))
     exit(EXIT_FAILURE);
 }
 
 static void cf_schedule_set_global(char **argv) {
-  if(disorder_schedule_add(getclient(),
-                          dateparse(argv[0]),
-                          argv[1],
-                          "set-global",
-                          argv[2],
-                          argv[3]))
+  if(disorder_schedule_add_set_global(getclient(),
+                                      dateparse(argv[0]),
+                                      argv[1],
+                                      argv[2],
+                                      argv[3]))
     exit(EXIT_FAILURE);
 }
 
 static void cf_schedule_unset_global(char **argv) {
-  if(disorder_schedule_add(getclient(),
-                          dateparse(argv[0]),
-                          argv[1],
-                          "set-global",
-                          argv[2],
-                          (char *)0))
+  if(disorder_schedule_add_unset_global(getclient(),
+                                        dateparse(argv[0]),
+                                        argv[1],
+                                        argv[2]))
     exit(EXIT_FAILURE);
 }
 
@@ -609,11 +616,13 @@ static void cf_adopt(char **argv) {
 
 static void cf_playlists(char attribute((unused)) **argv) {
   char **vec;
+  int nvec;
 
-  if(disorder_playlists(getclient(), &vec, 0))
+  if(disorder_playlists(getclient(), &vec, &nvec))
     exit(EXIT_FAILURE);
-  while(*vec)
-    xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+  for(int n = 0; n < nvec; ++n)
+    xprintf("%s\n", nullcheck(utf82mb(vec[n])));
+  free_strings(nvec, vec);
 }
 
 static void cf_playlist_del(char **argv) {
@@ -623,11 +632,13 @@ static void cf_playlist_del(char **argv) {
 
 static void cf_playlist_get(char **argv) {
   char **vec;
+  int nvec;
 
-  if(disorder_playlist_get(getclient(), argv[0], &vec, 0))
+  if(disorder_playlist_get(getclient(), argv[0], &vec, &nvec))
     exit(EXIT_FAILURE);
-  while(*vec)
-    xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+  for(int n = 0; n < nvec; ++n)
+    xprintf("%s\n", nullcheck(utf82mb(vec[n])));
+  free_strings(nvec, vec);
 }
 
 static void cf_playlist_set(char **argv) {
@@ -662,12 +673,28 @@ static void cf_playlist_set(char **argv) {
     exit(EXIT_FAILURE);
 }
 
-static const struct command {
+/** @brief Command-line client's definition of a command */
+static const struct client_command {
+  /** @brief Command name */
   const char *name;
-  int min, max;
+
+  /** @brief Minimum number of argument */
+  int min;
+
+  /** @brief Maximum number of argument */
+  int max;
+
+  /** @brief Pointer to function implementing command */
   void (*fn)(char **);
+
+  /** @brief Function to recognize a valid argument, or NULL */
   int (*isarg)(const char *);
-  const char *argstr, *desc;
+
+  /** @brief Summary of arguments */
+  const char *argstr;
+
+  /** @brief Description */
+  const char *desc;
 } commands[] = {
   { "adduser",        2, 3, cf_adduser, isarg_rights, "USERNAME PASSWORD [RIGHTS]",
                       "Create a new user" },
@@ -815,28 +842,8 @@ static void help_commands(void) {
   exit(0);
 }
 
-static void wait_for_root(void) {
-  const char *password;
-
-  while(!trackdb_readable()) {
-    disorder_info("waiting for trackdb...");
-    sleep(1);
-  }
-  trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
-  for(;;) {
-    trackdb_open(TRACKDB_READ_ONLY);
-    password = trackdb_get_password("root");
-    trackdb_close();
-    if(password)
-      break;
-    disorder_info("waiting for root user to be created...");
-    sleep(1);
-  }
-  trackdb_deinit(NULL);
-}
-
 int main(int argc, char **argv) {
-  int n, i, j, local = 0, wfr = 0;
+  int n, i, j, local = 0;
   int status = 0;
   struct vector args;
   const char *user = 0, *password = 0;
@@ -847,7 +854,7 @@ int main(int argc, char **argv) {
   pcre_free = xfree;
   if(!setlocale(LC_CTYPE, "")) disorder_fatal(errno, "error calling setlocale");
   if(!setlocale(LC_TIME, "")) disorder_fatal(errno, "error calling setlocale");
-  while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:W", options, 0)) >= 0) {
+  while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'H': help_commands();
@@ -858,21 +865,21 @@ int main(int argc, char **argv) {
     case 'N': config_per_user = 0; break;
     case 'u': user = optarg; break;
     case 'p': password = optarg; break;
-    case 'W': wfr = 1; break;
     default: disorder_fatal(0, "invalid option");
     }
   }
   if(config_read(0, NULL)) disorder_fatal(0, "cannot read configuration");
   if(user) {
-    config->username = user;
+    xfree(config->username);
+    config->username = xstrdup(user);
     config->password = 0;
   }
-  if(password)
-    config->password = password;
+  if(password) {
+    xfree(config->password);
+    config->password = xstrdup(password);
+  }
   if(local)
     config->connect.af = -1;
-  if(wfr)
-    wait_for_root();
   n = optind;
   optind = 1;                          /* for subsequent getopt calls */
   /* gcrypt initialization */
@@ -889,7 +896,7 @@ int main(int argc, char **argv) {
     vector_init(&args);
     /* Include the command name in the args, but at element -1, for
      * the benefit of subcommand getopt calls */
-    vector_append(&args, argv[n]);
+    vector_append(&args, xstrdup(argv[n]));
     n++;
     for(j = 0; j < commands[i].min; ++j)
       vector_append(&args, nullcheck(mb2utf8(argv[n + j])));
@@ -899,10 +906,13 @@ int main(int argc, char **argv) {
       vector_append(&args, nullcheck(mb2utf8(argv[n + j])));
     vector_terminate(&args);
     commands[i].fn(args.vec + 1);
+    vector_clear(&args);
     n += j;
   }
   if(client && disorder_close(client)) exit(EXIT_FAILURE);
   if(fclose(stdout) < 0) disorder_fatal(errno, "error closing stdout");
+  config_free(config);
+  xfree(client);
   return status;
 }
 
index ed31dd073025ebc66384be48f7f938b00331fd91..14092dad74b1c9aa90d0586a6f237145d4ddb0d1 100644 (file)
@@ -73,7 +73,7 @@ static const char *nativeencoding;
 /* Count of errors */
 static long errors;
 
-/* Included/excluded filename patterns */
+/** @brief Included/excluded filename pattern */
 static struct pattern {
   struct pattern *next;
   const char *pattern;
index 13eea1965361570a2ac23097fd1505a1f529b7fc..eeaeb7c5e27a4f40f55199e6d5297f061034e07a 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004-2008 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 /** @file clients/filename-bytes.c
  * @brief Print out raw bytes of filenames in a directory
  */
index 52e79e25ab4357a9a73e204376ef5d154b06a5f8..85f5c7a98e5a4c49985eaf9705b373a80a41e555 100755 (executable)
@@ -1,4 +1,21 @@
 #! /usr/bin/perl -w
+#
+# This file is part of DisOrder.
+# Copyright (C) 2007 Richard Kettlewell
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
 use strict;
 
 our $last;
index 2ab67906ba5ffff9ab44cee412bb397b7092a6fb..2bd2452321a36e23d8564e5cbaece6b72dafe644 100644 (file)
@@ -678,6 +678,12 @@ int main(int argc, char **argv) {
     }
   }
   if(config_read(0, NULL)) disorder_fatal(0, "cannot read configuration");
+  if(backend == &uaudio_rtp) {
+    /* This means that you have NO local sound output.  This can happen if you
+     * use a non-Apple GCC on a Mac (because it doesn't know how to compile
+     * CoreAudio/AudioHardware.h). */
+    disorder_fatal(0, "cannot play RTP through RTP");
+  }
   if(!maxbuffer)
     maxbuffer = 2 * minbuffer;
   argc -= optind;
index bc41013b6fb343b55d7b0b759b475aab0271a661..6291c8336decc2798fd23e8b6a2b3c2cabcc28f7 100644 (file)
@@ -15,6 +15,9 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+/** @file clients/resample.c
+ * @brief Audio resampler
+ */
 #include "common.h"
 
 #include <unistd.h>
index 1e08101be9ae874ce8a72908e0807fb8f6e616bb..a07f74d5f21e9b92e089ffca542ada4cb419c936 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-AC_INIT([disorder], [5.0.3], [richard+disorder@sfere.greenend.org.uk])
+AC_INIT([disorder], [5.1], [richard+disorder@sfere.greenend.org.uk])
 AC_CONFIG_AUX_DIR([config.aux])
-AM_INIT_AUTOMAKE(disorder, [5.0.3])
+AM_INIT_AUTOMAKE(disorder, [5.1])
 AC_CONFIG_SRCDIR([server/disorderd.c])
 AM_CONFIG_HEADER([config.h])
+AC_CONFIG_MACRO_DIR([m4])
 
 # Find host type
 AC_CANONICAL_HOST
@@ -107,6 +108,7 @@ case "$host" in
  ;;
 *linux* | *Linux* )
   AC_MSG_RESULT([Linux])
+  AC_DEFINE_UNQUOTED([PATH_PROC_MOUNTS],["/proc/mounts"],[path to kernel mount list])
   ;;
 *-apple-darwin* )
   AC_MSG_RESULT([Mac OS X])
@@ -156,7 +158,7 @@ case "$host" in
   # Look for a suitable version of libdb among the versions found in FreeBSD 7.0
   AC_CACHE_CHECK([looking for a libdb install],[rjk_cv_libdb],[
     rjk_cv_libdb="none"
-    for db in db43 db44 db45 db46; do
+    for db in db43 db44 db45 db47; do
       if test -e /usr/local/lib/$db; then
         rjk_cv_libdb=$db
         break
@@ -522,7 +524,6 @@ if test $want_server = yes; then
   AC_CHECK_HEADERS([db.h],[:],[
     missing_headers="$missing_headers $ac_header"
   ])
-  AC_CHECK_HEADERS([FLAC/file_decoder.h])
 fi
 AC_CHECK_HEADERS([dlfcn.h gcrypt.h \
                 getopt.h iconv.h langinfo.h \
@@ -547,6 +548,18 @@ AC_C_BIGENDIAN
 AC_CHECK_TYPES([struct sockaddr_in6],,,[AC_INCLUDES_DEFAULT
 #include <netinet/in.h>])
 
+# Figure out how we'll check for devices being mounted and unmounted
+AC_CACHE_CHECK([for list of mounted filesystems],[rjk_cv_mtab],[
+  if test -e /etc/mtab; then
+    rjk_cv_mtab=/etc/mtab
+  else
+    rjk_cv_mtab=none
+  fi
+])
+if test $rjk_cv_mtab != none; then
+  AC_DEFINE_UNQUOTED([PATH_MTAB],["$rjk_cv_mtab"],[path to file containing mount list])
+fi
+
 # enable -Werror when we check for certain characteristics:
 
 old_CFLAGS="${CFLAGS}"
@@ -639,12 +652,12 @@ if test ! -z "$missing_functions"; then
 fi
 
 # Functions we can take or leave
-AC_CHECK_FUNCS([fls])
+AC_CHECK_FUNCS([fls getfsstat])
 
 if test $want_server = yes; then
   # <db.h> had better be version 3 or later
   AC_CACHE_CHECK([db.h version],[rjk_cv_db_version],[
-    AC_PREPROC_IFELSE([
+    AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
                       #include <db.h>
                       #ifndef DB_VERSION_MAJOR
                       # error cannot determine db version
@@ -655,16 +668,16 @@ if test $want_server = yes; then
                       #if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR <= 2
                       # error inadequate db version
                       #endif
-                     ],
+                     ],[])],
                      [rjk_cv_db_version=ok],
                      [rjk_cv_db_version=inadequate])
     if test $rjk_cv_db_version = ok; then
-      AC_PREPROC_IFELSE([
+      AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
                          #include <db.h>
                          #if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 6
                          # error http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=510270
                          #endif
-                        ],
+                        ],[])],
                         [rjk_cv_db_version=ok],
                         [rjk_cv_db_version=toxic])
     fi
@@ -716,13 +729,13 @@ if test "x$GCC" = xyes; then
     if test $GCC = yes; then
       CC="$CC -Wall -Werror"
     fi
-    AC_COMPILE_IFELSE([
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
       static int x(char *f) {
        return *f;
       }
       int z(const char *g) {
        return x((char *)g);
-      }],
+      }],[])],
       [rjk_cv_pr29478=no],
       [rjk_cv_pr29478=yes]
     )
@@ -738,11 +751,11 @@ if test "x$GCC" = xyes; then
     if test $GCC = yes; then
       CC="$CC -Wreturn-type -Werror"
     fi
-    AC_COMPILE_IFELSE([
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[
       static void *threadfn(void) {
         for(;;)
           ;
-      }],
+      }],[])],
       [rjk_cv_gcc44_stupidity=no],
       [rjk_cv_gcc44_stupidity=yes])
     CC="$old_CC"
@@ -752,7 +765,7 @@ if test "x$GCC" = xyes; then
   fi
 
   # a reasonable default set of warnings
-  CC="${CC} -Wall -W -Wpointer-arith -Wbad-function-cast \
+  CC="${CC} -Wall -W -Wpointer-arith \
        -Wwrite-strings -Wmissing-prototypes \
        -Wmissing-declarations -Wnested-externs"
 
index 293df227d41714d591915ab9a40f68565bd34263..4868419bdb01b85cb1301e69180e1ce8ac297428 100644 (file)
@@ -25,4 +25,5 @@ EXTRA_DIST=README.Debian config.disorder-server control \
           postrm.disorder-server overrides.disorder-server \
           templates.disorder-server conffiles.disorder-server \
           rules changelog usr.share.menu.disobedience \
+          disorder.daily \
           postinst.disobedience disobedience-manual
index 331ec122186306d84dd68c5b3eaae89e68a1a586..793454279ec902192f9f89d0265a44030cbbba51 100644 (file)
@@ -1,3 +1,9 @@
+disorder (5.1) stable; urgency=low
+
+  * DisOrder 5.1
+
+ -- Richard Kettlewell <rjk@terraraq.org.uk>  Sun, 17 Feb 2013 16:22:14 +0000
+
 disorder (5.0.3) stable; urgency=emergency
 
   * Security: Local connections can no longer create and delete users
index 5d44ee4b2f1c2291e5eb21c97239a28c3c7fa9d3..9e1f9541536dbaf6d1aa2e5945bf1be6c72bed73 100644 (file)
@@ -2,3 +2,4 @@
 /etc/disorder/options
 /etc/disorder/options.user
 /etc/init.d/disorder
+/etc/cron.daily/disorder
index 332927871f33b98e568ecfa0d10853438ab36ac0..0c183d31ca3f684b16e541a58233ff5e2ffb3fe2 100644 (file)
@@ -3,8 +3,8 @@ Maintainer: Richard Kettlewell <rjk@greenend.org.uk>
 Section: sound
 Priority: optional
 Standards-Version: 3.8.1.0
-Build-Depends: libgc6-dev | libgc-dev, libgcrypt-dev, libdb4.8-dev, libpcre3-dev, libvorbis-dev, libmad0-dev, libasound2-dev, libao-dev, python, libflac-dev, libgtk2.0-dev (>= 2.12.12)
-Vcs-Bzr: http://www.greenend.org.uk/rjk/bzr/disorder.dev/
+Build-Depends: libgc6-dev | libgc-dev, libgcrypt-dev, libdb4.3-dev | libdb4.5-dev | libdb4.7-dev | libdb4.8-dev, libpcre3-dev, libvorbis-dev, libmad0-dev, libasound2-dev, libao-dev, python, libflac-dev, libgtk2.0-dev (>= 2.12.12)
+Vcs-Git: https://code.google.com/p/disorder/
 Homepage: http://www.greenend.org.uk/rjk/disorder/
 
 Package: disorder
@@ -28,7 +28,7 @@ Package: disorder-server
 Architecture: any
 Section: sound
 Priority: extra
-Depends: disorder,httpd-cgi,sox,debconf,${shlibs:Depends},exim4|mail-transport-agent,adduser
+Depends: disorder,httpd-cgi,sox,debconf,${shlibs:Depends},exim4|mail-transport-agent,adduser,findutils
 Suggests: disorder-playrtp,disobedience
 Description: Play random or selected digital audio files continuously
  DisOrder is a software jukebox.  It can play OGG, MP3, WAV and FLAC files,
diff --git a/debian/disorder.daily b/debian/disorder.daily
new file mode 100755 (executable)
index 0000000..00f2e38
--- /dev/null
@@ -0,0 +1,47 @@
+#! /bin/sh
+#
+# This file is part of DisOrder
+# Copyright (C) 2011 Richard Kettlewell
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+set -e
+
+# Maximum backup age
+MAXAGE=7
+
+# Enable backups
+BACKUP=true
+
+# Enable pruning
+PRUNE=true
+
+# All operator to override settings
+if test -e /etc/default/disorder; then
+  . /etc/default/disorder
+fi
+
+if ${BACKUP}; then
+  # Ensure the backup directory exists
+  mkdir -m 0700 -p /var/lib/disorder/backups
+
+  # Take a backup
+  disorder-dump --dump /var/lib/disorder/backups/$(date +%F)
+fi
+
+if ${PRUNE}; then
+  # Delete old backups
+  find /var/lib/disorder/backups -type f -ctime +${MAXAGE} -print0 \
+  | xargs -r0 rm -f
+fi
index 1861c139e96d8ed71d8d73679fb45e5b7812d8ee..481b2aefd9497f0ab438af77e0e059ae5d0c7ab8 100755 (executable)
@@ -123,7 +123,7 @@ pkg-disorder: build
        dpkg-shlibdeps -Tdebian/substvars.disorder \
                debian/disorder/usr/bin/*
        $(INSTALL_DATA) CHANGES.html README debian/README.Debian \
-               BUGS README.* \
+               BUGS README.* docs.css \
                debian/disorder/usr/share/doc/disorder/.
        gzip -9f debian/disorder/usr/share/doc/disorder/README \
                 debian/disorder/usr/share/doc/disorder/README.* \
@@ -186,6 +186,7 @@ pkg-disorder-server: build
        $(MKDIR) debian/disorder-server/etc/init.d
        $(MKDIR) debian/disorder-server${cgiexecdir}
        $(MKDIR) debian/disorder-server/var/lib/disorder
+       $(MKDIR) debian/disorder-server/etc/cron.daily
        $(INSTALL_SCRIPT) examples/disorder.init \
                debian/disorder-server/etc/init.d/disorder
        $(INSTALL_DATA) debian/etc.disorder.config \
@@ -194,6 +195,7 @@ pkg-disorder-server: build
                debian/disorder-server/etc/disorder/options
        $(INSTALL_DATA) debian/etc.disorder.options.user \
                debian/disorder-server/etc/disorder/options.user
+       $(INSTALL_SCRIPT) debian/disorder.daily debian/disorder-server/etc/cron.daily/disorder
        $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) cgi/disorder \
                $(shell pwd)/debian/disorder-server${cgiexecdir}/disorder
        gzip -9f debian/disorder-server/usr/share/man/man*/*
@@ -323,7 +325,7 @@ binary-arch: pkg-disorder pkg-disorder-server pkg-disorder-playrtp \
 binary-indep: 
 
 clean:
-       test -f Makefile && $(MAKE) distclean
+       if test -f Makefile; then $(MAKE) distclean; fi
        rm -f config.cache
        rm -f debian/files
        rm -f debian/substvars.*
index 7b823c262d9bf6860b58aeaeaf2f91572d862a91..66473d9009997240429942b361f221ba4920109e 100644 (file)
@@ -28,18 +28,34 @@ disobedience_SOURCES=disobedience.h disobedience.c client.c queue.c \
        control.c properties.c menu.c log.c progress.c login.c rtp.c    \
        help.c ../lib/memgc.c settings.c users.c lookup.c choose.h      \
        popup.h playlists.c multidrag.c multidrag.h autoscroll.c        \
-       autoscroll.h
+       autoscroll.h globals.c
 disobedience_LDADD=../lib/libdisorder.a $(LIBPCRE) $(LIBGC) $(LIBGCRYPT) \
-       $(LIBASOUND) $(COREAUDIO) $(LIBDB) $(LIBICONV)
+       $(LIBASOUND) $(COREAUDIO) $(LIBICONV)
 disobedience_LDFLAGS=$(GTK_LIBS)
 
-install-exec-hook:
-       $(LIBTOOL) --mode=finish $(DESTDIR)$(libdir)
+install-data-local:
+       $(MKDIR_P) ${DESTDIR}${datarootdir}/applications
+       $(INSTALL) -m 644 ${srcdir}/disobedience.desktop \
+               ${DESTDIR}${datarootdir}/applications/disobedience.desktop
+       $(MKDIR_P) ${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps
+       $(INSTALL) -m 644 ${top_srcdir}/images/disobedience48x48.png \
+               ${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/disobedience.png
+       $(MKDIR_P) ${DESTDIR}${datarootdir}/icons/hicolor/64x64/apps
+       $(INSTALL) -m 644 ${top_srcdir}/images/disobedience64x64.png \
+               ${DESTDIR}${datarootdir}/icons/hicolor/64x64/apps/disobedience.png
+       $(MKDIR_P) ${DESTDIR}${datarootdir}/icons/hicolor/128x128/apps
+       $(INSTALL) -m 644 ${top_srcdir}/images/disobedience128x128.png \
+               ${DESTDIR}${datarootdir}/icons/hicolor/128x128/apps/disobedience.png
+       $(MKDIR_P) ${DESTDIR}${datarootdir}/icons/hicolor/256x256/apps
+       $(INSTALL) -m 644 ${top_srcdir}/images/disobedience256x256.png \
+               ${DESTDIR}${datarootdir}/icons/hicolor/256x256/apps/disobedience.png
 
 check: check-help
 
 misc.o: ../images/images.h
 
+EXTRA_DIST=disobedience.desktop
+
 # check everything has working --help
 check-help: all
        unset DISPLAY;./disobedience --version > /dev/null
index b0f59b5dad7deb3b6b23f104c6ca8061362f1243..b4aa0ce5acf051e510ab660bc9ccc2468a8c5bad 100644 (file)
@@ -29,7 +29,9 @@ static void choose_playchildren_callback(GtkTreeModel *model,
 static void choose_playchildren_received(void *v,
                                          const char *err,
                                          int nvec, char **vec);
-static void choose_playchildren_played(void *v, const char *err);
+static void choose_playchildren_played(void *v,
+                                       const char *err,
+                                       const char *id);
 
 /** @brief Popup menu */
 static GtkWidget *choose_menu;
@@ -116,7 +118,7 @@ static void choose_play_activate(GtkMenuItem attribute((unused)) *item,
                                       choose_gather_selected_files_callback,
                                       v);
   for(int n = 0; n < v->nvec; ++n)
-    disorder_eclient_play(client, v->vec[n], choose_play_completed, 0);
+    disorder_eclient_play(client, choose_play_completed, v->vec[n], 0);
 }
   
 static int choose_properties_sensitive(void *extra) {
@@ -250,11 +252,12 @@ static void choose_playchildren_received(void attribute((unused)) *v,
     return;
   }
   for(int n = 0; n < nvec; ++n)
-    disorder_eclient_play(client, vec[n], choose_playchildren_played, NULL);
+    disorder_eclient_play(client, choose_playchildren_played, vec[n], NULL);
 }
 
 static void choose_playchildren_played(void attribute((unused)) *v,
-                                       const char *err) {
+                                       const char *err,
+                                       const char attribute((unused)) *id) {
   if(err) {
     popup_protocol_error(0, err);
     return;
index acfddfa8d536c6b735d59585472d86748f51a1fb..60df2ec095b9c6d92e8ae2012f7151d320df3323 100644 (file)
@@ -441,6 +441,7 @@ static gboolean choose_get_visible_range(GtkTreeView *tree_view,
  * @param direction -1 for prev, +1 for next
  */
 static void choose_move(int direction) {
+  assert(direction);                    /* placate analyzer */
   /* Refocus the main view so typahead find continues to work */
   gtk_widget_grab_focus(choose_view);
   /* If there's no results we have nothing to do */
index a1d50c1a62c18f584af0f74435f9bd533f435be8..13a1da00d822d2019ddd7be960ba357409db3f08 100644 (file)
@@ -364,7 +364,8 @@ static void choose_files_completed(void *v,
 }
 
 void choose_play_completed(void attribute((unused)) *v,
-                           const char *err) {
+                           const char *err,
+                           const char attribute((unused)) *id) {
   if(err)
     popup_protocol_error(0, err);
 }
@@ -386,7 +387,7 @@ static void choose_state_toggled
   const char *track = choose_get_track(it);
   if(queued(track))
     return;
-  disorder_eclient_play(client, track, choose_play_completed, 0);
+  disorder_eclient_play(client, choose_play_completed, track, 0);
   
 }
 
index 521333211ec45ee328cfcd9c409bf84749cd68b1..9496abdc493c7fd01cd9dc53e5b42107d722ae70 100644 (file)
@@ -62,8 +62,9 @@ struct choosedata *choose_path_to_data(GtkTreePath *path);
 gboolean choose_button_event(GtkWidget *widget,
                              GdkEventButton *event,
                              gpointer user_data);
-void choose_play_completed(void attribute((unused)) *v,
-                           const char *err);
+void choose_play_completed(void *v,
+                           const char *err,
+                           const char *id);
 char *choose_get_track(GtkTreeIter *iter);
 char *choose_get_sort(GtkTreeIter *iter);
 char *choose_get_display(GtkTreeIter *iter);
index f45492f1e191ed767f273fe452d3f18c26721462..1cdc190b4ea504af212a2b374925b9ee561fcdf6 100644 (file)
@@ -468,9 +468,7 @@ static void toggled_menu(GtkCheckMenuItem attribute((unused)) *menuitem,
 
 /** @brief Called when a volume command completes */
 static void volume_completed(void attribute((unused)) *v,
-                             const char *err,
-                             int attribute((unused)) l,
-                             int attribute((unused)) r) {
+                             const char *err) {
   if(err)
     popup_protocol_error(0, err);
   /* We don't set the UI's notion of the volume here, it is set from the log
@@ -498,10 +496,10 @@ static void volume_adjusted(GtkAdjustment attribute((unused)) *a,
     if(backend && backend->set_volume)
       backend->set_volume(&l, &r);
   } else
-    disorder_eclient_volume(client, volume_completed,
-                            nearbyint(left(v, b) * 100),
-                            nearbyint(right(v, b) * 100),
-                            0);
+    disorder_eclient_set_volume(client, volume_completed,
+                                nearbyint(left(v, b) * 100),
+                                nearbyint(right(v, b) * 100),
+                                0);
 }
 
 /** @brief Formats the volume value */
index 639eb73c2e74efba3e67a618177ba8740cb2ef52..0b6e099d0145f9517f4d9478ab0644df13172574 100644 (file)
@@ -569,6 +569,7 @@ int main(int argc, char **argv) {
   event_register("log-connected", check_rtp_address, 0);
   suppress_actions = 0;
   playlists_init();
+  globals_init();
   /* If no password is set yet pop up a login box */
   if(!config->password)
     login_box();
diff --git a/disobedience/disobedience.desktop b/disobedience/disobedience.desktop
new file mode 100644 (file)
index 0000000..a5bb583
--- /dev/null
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Encoding=UTF-8
+Name=Disobedience
+Comment=User interface for DisOrder network jukebox
+Exec=disobedience
+Icon=disobedience.png
+Terminal=false
+Categories=Audio;AudioVideo;Player;Music;
index 719eea40dc98931e603f22c27c483e00cb42ec38..0ff76d32c570f5854050c15a142bf0d5ea8ec50c 100644 (file)
@@ -237,6 +237,11 @@ void manage_users(void);
 
 void popup_help(const char *what);
 
+/* Filtering */
+
+void popup_globals(void);
+void globals_init(void);
+
 /* RTP */
 
 int rtp_running(void);
diff --git a/disobedience/globals.c b/disobedience/globals.c
new file mode 100644 (file)
index 0000000..a6b4ca4
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file disobedience/globals.c
+ * @brief Track global preferences
+ */
+
+#include "disobedience.h"
+
+static GtkWidget *globals_window;
+
+struct globals_row;
+
+/** @brief Handler for the presentation form of a global preference */
+struct global_handler {
+  /** @brief Initialize */
+  void (*init)(struct globals_row *row);
+
+  /** @brief Convert presentation form to string */
+  const char *(*get)(struct globals_row *row);
+
+  /** @brief Convert string to presentation form */
+  void (*set)(struct globals_row *row, const char *value);
+};
+
+/** @brief Definition of a global preference */
+struct globals_row {
+  const char *label;
+  const char *pref;
+  GtkWidget *widget;
+  const struct global_handler *handler;
+  int initialized;
+};
+
+static void globals_close(GtkButton attribute((unused)) *button,
+                        gpointer attribute((unused)) userdata);
+static void globals_row_changed(struct globals_row *row);
+
+/** @brief Called when the user changes the contents of a string entry */
+static void global_string_entry_changed(GtkEditable attribute((unused)) *editable,
+                                       gpointer user_data) {
+  struct globals_row *row = user_data;
+  globals_row_changed(row);
+}
+
+/** @brief Initialize a global presented as a string */
+static void global_string_init(struct globals_row *row) {
+  row->widget = gtk_entry_new();
+  g_signal_connect(row->widget, "changed",
+                  G_CALLBACK(global_string_entry_changed), row);
+}
+
+static const char *global_string_get(struct globals_row *row) {
+  return gtk_entry_get_text(GTK_ENTRY(row->widget));
+}
+
+static void global_string_set(struct globals_row *row, const char *value) {
+  /* Identify unset and empty lists */
+  if(!value)
+    value = "";
+  /* Skip trivial updates (we'll see one as a consequence of each
+   * update we make...) */
+  if(strcmp(gtk_entry_get_text(GTK_ENTRY(row->widget)), value))
+    gtk_entry_set_text(GTK_ENTRY(row->widget), value);
+}
+
+/** @brief String global preference */
+static const struct global_handler global_string = {
+  global_string_init,
+  global_string_get,
+  global_string_set,
+};
+
+/** @brief Called when the user changes the contents of a string entry */
+static void global_boolean_toggled(GtkToggleButton attribute((unused)) *button,
+                                  gpointer user_data) {
+  struct globals_row *row = user_data;
+  globals_row_changed(row);
+}
+
+static void global_boolean_init(struct globals_row *row) {
+  row->widget = gtk_check_button_new();
+  g_signal_connect(row->widget, "toggled",
+                  G_CALLBACK(global_boolean_toggled), row);
+}
+
+static const char *global_boolean_get(struct globals_row *row) {
+  return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(row->widget)) ? "yes" : "no";
+}
+
+static void global_boolean_set(struct globals_row *row, const char *value) {
+  gboolean new_state = !(value && strcmp(value, "yes"));
+  if(new_state != gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(row->widget)))
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(row->widget), new_state);
+}
+
+/** @brief Boolean global preference */
+static const struct global_handler global_boolean = {
+  global_boolean_init,
+  global_boolean_get,
+  global_boolean_set,
+};
+
+/** @brief Table of global preferences */
+static struct globals_row globals_rows[] = {
+  { "Required tags", "required-tags", NULL, &global_string, 0 },
+  { "Prohibited tags", "prohibited-tags", NULL, &global_string, 0 },
+  { "Playing", "playing", NULL, &global_boolean, 0 },
+  { "Random play", "random-play", NULL, &global_boolean, 0 },
+};
+#define NGLOBALS (sizeof globals_rows / sizeof *globals_rows)
+
+/** @brief Buttons for globals popup */
+static struct button globals_buttons[] = {
+  {
+    .stock = GTK_STOCK_CLOSE,
+    .clicked = globals_close,
+    .tip = "Close window",
+    .pack = gtk_box_pack_end,
+  },
+};
+#define NGLOBALS_BUTTONS (sizeof globals_buttons / sizeof *globals_buttons)
+
+static void globals_close(GtkButton attribute((unused)) *button,
+                        gpointer attribute((unused)) userdata) {
+  gtk_widget_destroy(globals_window);
+}
+
+/** @brief Called with the latest setting for a row */
+static void globals_get_completed(void *v, const char *err,
+                                const char *value) {
+  if(err)
+    popup_protocol_error(0, err);
+  else if(globals_window) {
+    struct globals_row *row = v;
+    row->handler->set(row, value);
+    row->initialized = 1;
+  }
+}
+
+/** @brief Retrieve the latest setting for @p row */
+static void globals_get(struct globals_row *row) {
+  disorder_eclient_get_global(client, globals_get_completed, row->pref, row);
+}
+
+static void globals_row_changed(struct globals_row *row) {
+  if(row->initialized) {
+    const char *new_value = row->handler->get(row);
+    if(new_value)
+      disorder_eclient_set_global(client, NULL, row->pref, new_value, row);
+    else
+      disorder_eclient_unset_global(client, NULL, row->pref, row);
+  }
+}
+
+/** @brief Display the globals window */
+void popup_globals(void) {
+  GtkWidget *label, *table, *hbox;
+  /* Pop up the window if it already exists */
+  if(globals_window) {
+    gtk_window_present(GTK_WINDOW(globals_window));
+    return;
+  }
+  /* Create the window */
+  /* TODO loads of this is very similar to (copied from!) users.c - can we
+   * de-dupe? */
+  globals_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_style(globals_window, tool_style);
+  gtk_window_set_title(GTK_WINDOW(globals_window), "Globals");
+  g_signal_connect(globals_window, "destroy",
+                  G_CALLBACK(gtk_widget_destroyed), &globals_window);
+  table = gtk_table_new(NGLOBALS + 1/*rows*/, 2/*cols*/, FALSE/*homogeneous*/);
+  gtk_widget_set_style(table, tool_style);\
+
+  for(size_t n = 0; n < NGLOBALS; ++n) {
+    globals_rows[n].initialized = 0;
+    label = gtk_label_new(globals_rows[n].label);
+    gtk_widget_set_style(label, tool_style);
+    gtk_misc_set_alignment(GTK_MISC(label), 1/*right*/, 0/*bottom*/);
+    gtk_table_attach(GTK_TABLE(table), label,
+                    0, 1,                /* left/right_attach */
+                    n, n+1,              /* top/bottom_attach */
+                    GTK_FILL, 0,         /* x/yoptions */
+                    1, 1);               /* x/ypadding */
+    globals_rows[n].handler->init(&globals_rows[n]);
+    gtk_widget_set_style(globals_rows[n].widget, tool_style);
+    gtk_table_attach(GTK_TABLE(table), globals_rows[n].widget,
+                    1, 2,                /* left/right_attach */
+                    n, n+1,              /* top/bottom_attach */
+                    GTK_FILL, 0,         /* x/yoptions */
+                    1, 1);               /* x/ypadding */
+    globals_get(&globals_rows[n]);
+  }
+  hbox = create_buttons_box(globals_buttons,
+                           NGLOBALS_BUTTONS,
+                           gtk_hbox_new(FALSE, 1));
+  gtk_table_attach_defaults(GTK_TABLE(table), hbox,
+                           0, 2,                /* left/right_attach */
+                           NGLOBALS, NGLOBALS+1); /* top/bottom_attach */
+
+  gtk_container_add(GTK_CONTAINER(globals_window), frame_widget(table, NULL));
+  gtk_widget_show_all(globals_window);
+}
+
+/** @brief Called when any global pref changes */
+static void globals_pref_changed(const char attribute((unused)) *event,
+                                void *eventdata,
+                                void attribute((unused)) *callbackdata) {
+  const char *pref = eventdata;
+  if(!globals_window)
+    return;                    /* not paying attention */
+  for(size_t n = 0; n < NGLOBALS; ++n) {
+    if(!strcmp(pref, globals_rows[n].pref))
+      globals_get(&globals_rows[n]);
+  }
+}
+
+/** @brief Initialize globals infrastructure */
+void globals_init() {
+  event_register("global-pref", globals_pref_changed, NULL);
+}
index 71d2af04bf32c006e91a4dff7642a251be0d1265..2fd04a10c339acf2aeedabff2aef8295e12a2907 100644 (file)
@@ -48,6 +48,8 @@ static void log_playlist_modified(void *v,
                                   const char *playlist, const char *sharing);
 static void log_playlist_deleted(void *v,
                                  const char *playlist);
+static void log_global_pref(void *v,
+                            const char *name, const char *value);
 
 /** @brief Callbacks for server state monitoring */
 const disorder_eclient_log_callbacks log_callbacks = {
@@ -69,6 +71,7 @@ const disorder_eclient_log_callbacks log_callbacks = {
   .playlist_created = log_playlist_created,
   .playlist_modified = log_playlist_modified,
   .playlist_deleted = log_playlist_deleted,
+  .global_pref = log_global_pref,
 };
 
 /** @brief Update everything */
@@ -238,6 +241,12 @@ static void log_playlist_deleted(void attribute((unused)) *v,
   event_raise("playlist-deleted", (void *)playlist);
 }
 
+static void log_global_pref(void attribute((unused)) *v,
+                            const char *name,
+                            const char attribute((unused)) *value) {
+  event_raise("global-pref", (void *)name);
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index a02c1c6e698188013c2a5e80051a5083ab8d92ed..0c6e7d74dd44756d10f123f6bbaba055aafc59e3 100644 (file)
@@ -120,11 +120,13 @@ static void set_service(struct config *c, const char *s) {
 }
 
 static void set_username(struct config *c, const char *s) {
-  c->username = s;
+  xfree(c->username);
+  c->username = xstrdup(s);
 }
 
 static void set_password(struct config *c, const char *s) {
-  c->password = s;
+  xfree(c->password);
+  c->password = xstrdup(s);
 }
 
 /** @brief Table used to generate the form */
index 68939aef2915f015b925c5699e196a70017ef18c..21bacc47a613431458c5f14b6c23e236dbdfe141 100644 (file)
@@ -74,8 +74,8 @@ static void namepart_fill(const char *track,
   D(("namepart_fill %s %s %s %s", track, context, part, key));
   ++namepart_lookups_outstanding;
   D(("namepart_lookups_outstanding -> %d\n", namepart_lookups_outstanding));
-  disorder_eclient_namepart(client, namepart_completed,
-                            track, context, part, (void *)key);
+  disorder_eclient_part(client, namepart_completed,
+                        track, context, part, (void *)key);
 }
 
 /** @brief Look up a namepart
index 34d215fc06df150f798f3868b304a3b0e8dce00c..bce107dcea3a8c61a9bb422d408ad59cd3e534b9 100644 (file)
@@ -31,7 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
    <p class=image><img src="track-properties.png"></p>
 
    <p>This window can be invoked from any of the four tabs by
-   selecting one or more tracks and then either selected <b>Edit >
+   selecting one or more tracks and then either selecting <b>Edit >
    Track Properties</b> or via the right-click pop-up menu.</p>
 
    <h2><a name=names>4.1 Track Name Parts</a></h2>
@@ -66,13 +66,22 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
    <p>Each track has an associated collection of tags.  These can used
    when searching for tracks in the <b>Choose</b> tab or to control
-   which tracks are picked at random (although this functionality is
-   not readily available in current versions of Disobedience).</p>
+   which tracks are picked at random.</p>
 
    <p>To add tags to a track enter the tags you want to apply to it in
    the <b>Tags</b> field, separated by commas.  Tags cannot contain
    commas and are compared without regard to whitespace.</p>
 
+   <p>To search by tag, prefix it with <tt>tag:</tt> in the search box.</p>
+
+   <p>To control how tracks are picked at random, select <b>Control >
+   Global Preferences</b>.  If <b>Required Tags</b> contains a
+   comma-separated list of tags then only tracks with at least one of
+   the listed tags will be picked at random.  Similarly
+   if <b>Prohibited Tags</b> contains a comma-separated list of tags
+   then no track with any of the listed tags will be picked at
+   random.</p>
+
    <h2><a name=weight>4.3 Track Weight</a></h2>
 
    <p>Every track has an associated weight.  A higher weight makes the
index 72fe5f77ffb2ef3669aefcba061807a511f527a3..a4c1642e53db237a52fc974db785c068ef6f98a8 100644 (file)
@@ -144,10 +144,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
    <p class=image><img src="menu-control.png"></p>
 
    <p>The <b>Control</b> menu options are mostly equivalent to the
-   buttons described above.  The exceptions is <b>Activate
-   Playlist</b> which allows you to play
-   a <A href="playlists.html">playlist</a>, and <b>Compact Mode</b>
-   which switches Disobedience's window to a smaller format.</p>
+   buttons described above.  The exceptions are:</p>
+
+   <ul>
+     <li><b>Compact Mode</b> which switches Disobedience's window to a smaller format.</li>
+     <li><b>Global Preferences</b> which allows global server settings to be modified.</li>
+     <li><b>Activate Playlist</b> which allows you to play a <A href="playlists.html">playlist</a>.</li>
+   </ul>
 
    <p class=image><img src="menu-help.png"></p>
 
index bae0f00d7f0471c018efd2816afbef91af59f79b..b398606b289c28807ba624d21061c87903847d85 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2006-2009 Richard Kettlewell
+ * Copyright (C) 2006-2009, 2011, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -154,7 +154,7 @@ static void about_popup_got_version(void attribute((unused)) *v,
 
   if(!value)
     value = "[error]";
-  byte_xasprintf(&server_version_string, "Server version %s", value);
+  byte_xasprintf(&server_version_string, "DisOrder server version %s", value);
   byte_xasprintf(&short_version_string, "Disobedience %s",
                  disorder_short_version_string);
   w = gtk_dialog_new_with_buttons("About Disobedience",
@@ -182,7 +182,7 @@ static void about_popup_got_version(void attribute((unused)) *v,
                      FALSE/*fill*/,
                      1/*padding*/);
   gtk_box_pack_start(GTK_BOX(vbox),
-                     gtk_label_new("\xC2\xA9 2004-2009 Richard Kettlewell"),
+                     gtk_label_new("\xC2\xA9 2003-2013 Richard Kettlewell et al"),
                      FALSE/*expand*/,
                      FALSE/*fill*/,
                      1/*padding*/);
@@ -215,11 +215,23 @@ void users_set_sensitive(int sensitive) {
   gtk_widget_set_sensitive(w, sensitive);
 }
 
+static void menu_check_userman(void attribute((unused)) *v,
+                               const char *err,
+                               const char attribute((unused)) *value) {
+  if(err && !strncmp(err, "510", 3))
+    users_set_sensitive(FALSE);
+  else
+    users_set_sensitive(TRUE);
+}
+
 /** @brief Called when our rights change */
 static void menu_rights_changed(const char attribute((unused)) *event,
                                 void attribute((unused)) *eventdata,
                                 void attribute((unused)) *callbackdata) {
-  users_set_sensitive(!!(last_rights & RIGHT_ADMIN));
+  if(last_rights & RIGHT_ADMIN)
+    disorder_eclient_userinfo(client, menu_check_userman, "", "email", 0);
+  else
+    users_set_sensitive(FALSE);
 }
 
 /** @brief Create the menu bar widget */
@@ -360,6 +372,14 @@ GtkWidget *menubar(GtkWidget *w) {
       (char *)"<CheckItem>",            /* item_type */
       0                                 /* extra_data */
     },
+    {
+      (char *)"/Control/Global Preferences", /* path */
+      (char *)"<CTRL>G",                /* accelerator */
+      popup_globals,                    /* callback */
+      0,                                /* callback_action */
+      0,                                /* item_type */
+      0                                 /* extra_data */
+    },
     {
       (char *)"/Control/Activate playlist", /* path */
       0,                                /* accelerator */
@@ -386,7 +406,7 @@ GtkWidget *menubar(GtkWidget *w) {
       GTK_STOCK_HELP,                   /* extra_data */
     },
     {
-      (char *)"/Help/About DisOrder",   /* path */
+      (char *)"/Help/About Disobedience", /* path */
       0,                                /* accelerator */
       about_popup,                      /* callback */
       0,                                /* callback_action */
index a1fdf4d5f7b72d9ec2bdb96097d366f62503f788..38788241cd7e875552b679cc5baf3c3c64538900 100644 (file)
 #include "disobedience.h"
 #include "table.h"
 
+/** @brief Embedded image */
 struct image {
+  /** @brief Image name */
   const char *name;
+  /** @brief Image data in GDK pixbuf inline format */
   const guint8 *data;
 };
 
index 4d4194ea76a0e3c5361ed03f2d794ac52920d384..c5273aebad253df8111828b446a0f47f8a33b316 100644 (file)
@@ -253,7 +253,8 @@ static int playlistcmp(const void *ap, const void *bp) {
 /* Playlists menu ----------------------------------------------------------- */
 
 static void playlist_menu_playing(void attribute((unused)) *v,
-                                  const char *err) {
+                                  const char *err,
+                                  const char attribute((unused)) *id) {
   if(err)
     popup_submsg(playlist_window, GTK_MESSAGE_ERROR, err);
 }
@@ -270,7 +271,7 @@ static void playlist_menu_received_content(void attribute((unused)) *v,
     return;
   }
   for(int n = 0; n < nvec; ++n)
-    disorder_eclient_play(client, vec[n], playlist_menu_playing, NULL);
+    disorder_eclient_play(client, playlist_menu_playing, vec[n], NULL);
 }
 
 /** @brief Called to activate a playlist
@@ -579,7 +580,7 @@ static const char *playlist_new_valid(void) {
 /** @brief Get entered new-playlist details
  * @param namep Where to store entered name (or NULL)
  * @param fullnamep Where to store computed full name (or NULL)
- * @param sharep Where to store 'shared' flag (or NULL)
+ * @param sharedp Where to store 'shared' flag (or NULL)
  * @param publicp Where to store 'public' flag (or NULL)
  * @param privatep Where to store 'private' flag (or NULL)
  */
@@ -601,7 +602,7 @@ static void playlist_new_details(char **namep,
   if(privatep) *privatep = private;
   if(namep) *namep = name;
   if(fullnamep) {
-    if(*sharedp) *fullnamep = *namep;
+    if(shared) *fullnamep = name;
     else byte_xasprintf(fullnamep, "%s.%s", config->username, name);
   }
 }
@@ -663,7 +664,8 @@ static void playlist_picker_fill(const char attribute((unused)) *event,
 }
 
 /** @brief Update a section in the picker tree model
- * @param section Section name
+ * @param title Display name of section
+ * @param key Key to search for
  * @param start First entry in @ref playlists
  * @param end Past last entry in @ref playlists
  */
@@ -694,8 +696,7 @@ static void playlist_picker_update_section(const char *title, const char *key,
  * @param title Display name of section
  * @param key Key to search for
  * @param iter Iterator to point at key
- * @param create If TRUE, key will be created if it doesn't exist
- * @param compare Row comparison function
+ * @param create Whether to create the row
  * @return TRUE if key exists else FALSE
  *
  * If the @p key exists then @p iter will point to it and TRUE will be
index 6600cf947ed88b0b7f0ed1caccd7e7cf212cf15d..ded862b77940ebad610696b1d3da60fb56505bb7 100644 (file)
@@ -61,23 +61,26 @@ struct prefdata {
   GtkWidget *widget;
 };
 
-/* The type of a preference is the collection of callbacks needed to get,
- * display and set it */
+/** @brief Type of a track preference
+ *
+ * The type of a preference is the collection of callbacks needed to get,
+ * display and set it.
+ */
 struct preftype {
+  /** @brief Kick off the request to fetch the pref from the server. */
   void (*kickoff)(struct prefdata *f);
-  /* Kick off the request to fetch the pref from the server. */
 
+  /** @brief Called when the value comes back in; creates the widget. */
   void (*completed)(struct prefdata *f);
-  /* Called when the value comes back in; creates the widget. */
 
+  /** @brief Get the edited value from the widget. */
   const char *(*get_edited)(struct prefdata *f);
-  /* Get the edited value from the widget. */
 
   /** @brief Update the edited value */
   void (*set_edited)(struct prefdata *f, const char *value);
 
+  /** @brief Set the new value and (if necessary) arrange for our display to update. */
   void (*set)(struct prefdata *f, const char *value);
-  /* Set the new value and (if necessary) arrange for our display to update. */
 };
 
 /* A namepart pref */
@@ -107,7 +110,7 @@ static const struct preftype preftype_boolean = {
   set_boolean
 };
 
-/* @brief The known prefs for each track */
+/** @brief The known prefs for each track */
 static const struct pref {
   const char *label;                    /**< @brief user-level description */
   const char *part;                     /**< @brief protocol-level tag */
@@ -335,8 +338,8 @@ static void kickoff_namepart(struct prefdata *f) {
    * wanted was the underlying preference, but in fact it should always match
    * and will supply a sane default without having to know how to parse tracks
    * names (which implies knowing collection roots). */
-  disorder_eclient_namepart(client, prefdata_completed,
-                            f->track, "display", f->p->part, f);
+  disorder_eclient_part(client, prefdata_completed,
+                        f->track, "display", f->p->part, f);
 }
 
 static void completed_namepart(struct prefdata *f) {
index 333187aad785e8a0e62bf6a5d9e58bdf6ace4e1f..2c0ac190e221978a02d826076de4fe9ebf6c9b09 100644 (file)
@@ -227,6 +227,10 @@ void ql_update_list_store(struct queuelike *ql) {
   }
 }
 
+/** @brief Old and new queue data
+ *
+ * Used when updating a @ref queuelike with new data from the server.
+ */
 struct newqueue_data {
   struct queue_entry *old, *new;
 };
@@ -636,7 +640,7 @@ static void ql_drag_data_get_collect(GtkTreeModel *model,
  * @param w Source widget (the tree view)
  * @param dc Drag context
  * @param data Where to put the answer
- * @param info_ Target @c info parameter
+ * @param info Target @c info parameter
  * @param time_ Time data requested (for some reason not a @c time_t)
  * @param user_data The queuelike
  *
index ebf85553e688539f994318dad9cb2e669c0504d9..faf16cd67d3e297906664b90a6e6ada45e954d1f 100644 (file)
@@ -129,7 +129,7 @@ static void ql_remove_activate_callback(GtkTreeModel *model,
   struct queue_entry *q = ql_iter_to_q(model, iter);
 
   if(q != playing_track)
-    disorder_eclient_remove(client, q->id, ql_remove_completed, q);
+    disorder_eclient_remove(client, ql_remove_completed, q->id, q);
 }
 
 void ql_remove_activate(GtkMenuItem attribute((unused)) *menuitem,
@@ -148,7 +148,8 @@ int ql_play_sensitive(void *extra) {
     && gtk_tree_selection_count_selected_rows(ql->selection) > 0;
 }
 
-static void ql_play_completed(void attribute((unused)) *v, const char *err) {
+static void ql_play_completed(void attribute((unused)) *v, const char *err,
+                              const char attribute((unused)) *id) {
   if(err)
     popup_protocol_error(0, err);
 }
@@ -159,7 +160,7 @@ static void ql_play_activate_callback(GtkTreeModel *model,
                                       gpointer attribute((unused)) data) {
   struct queue_entry *q = ql_iter_to_q(model, iter);
 
-  disorder_eclient_play(client, q->track, ql_play_completed, q);
+  disorder_eclient_play(client, ql_play_completed, q->track, q);
 }
 
 void ql_play_activate(GtkMenuItem attribute((unused)) *menuitem,
index c495bd85cc6471fb47ee58f0f8cbf6c3363d36a7..95ff0d5efe73d05beb9874b8f9a51c0ff16eea28 100644 (file)
@@ -205,9 +205,10 @@ static void queue_drop(struct queuelike attribute((unused)) *ql,
     /* Tell the server to move them.  The log will tell us about the change (if
      * indeed it succeeds!), so no need to rearrange the model now. */
     disorder_eclient_moveafter(client,
+                               queue_drop_completed,
                                after_me ? after_me->id : "",
-                               ntracks, (const char **)ids,
-                               queue_drop_completed, NULL);
+                               (char **)ids, ntracks,
+                               NULL);
   } else {
     /* You can't tell the server to insert after the playing track by ID, you
      * have to send "". */
@@ -215,9 +216,10 @@ static void queue_drop(struct queuelike attribute((unused)) *ql,
       after_me = NULL;
     /* Play the tracks */
     disorder_eclient_playafter(client,
+                               queue_drop_completed,
                                after_me ? after_me->id : "",
-                               ntracks, (const char **)tracks,
-                               queue_drop_completed, NULL);
+                               (char **)tracks, ntracks,
+                               NULL);
   }
 }
 
index cbedb18aaf8eb4f07b0675f64a6f22df31cf39b9..46931736b42665a205229aafd0289da15d7ef26f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of Disobedience
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007-2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -108,7 +108,7 @@ void start_rtp(void) {
   if(!(pid = xfork())) {
     if(setsid() < 0)
       disorder_fatal(errno, "error calling setsid");
-    if(!(pid = xfork())) {
+    if(!xfork()) {
       /* grandchild */
       exitfn = _exit;
       /* log errors and output somewhere reasonably sane.  rtp_running()
index 3f0b6f0c941fa655a627f322177211eb22d56021..d29562f94ad722011eeba46d341006011b75bfc3 100644 (file)
@@ -60,6 +60,9 @@ Set the configuration file.
 The default is
 .IR /etc/disorder/config .
 .TP
+.B \-\-no\-setuid
+Do not change UID.
+.TP
 .B \-\-debug\fR
 Enable debugging.
 .TP
@@ -99,7 +102,11 @@ No other process should be accessing the database at the time.
 DisOrder does not currently support catastrophic recovery.
 .PP
 This program requires write access to DisOrder's databases.
-Ideally therefore it should be run as the same user as the server or as root.
+Therefore it should be run as the same user as the server or as root.
+.PP
+If a restore is done as root then it will automatically change to the
+server user, so that the new files end up with the right ownership.
+This can be suppressed with the \fB\-\-no\-setuid\fR option.
 .SH FILES
 .TP
 .I pkgconfdir/config
index eecb87f48c3ae1cf034782a301f548a596c30c21..45ef8ab23e09c8157a96dd1a84f1ea1b1a22c259 100644 (file)
@@ -30,7 +30,7 @@ without.
 See \fBdisorder_actions\fR(5) for a description of what the CGI does.
 .PP
 See \fBdisorder_options\fR(5) for CGI-specific configuration and
-\dBdisorder_config\fR(5) for general configuration.
+\fBdisorder_config\fR(5) for general configuration.
 .PP
 See \fBdisorder_templates\fR(5) for the template language used.
 .SH "WHERE IS IT?"
index a5b55ba6f14f878a2e9285b48b4e3ef05af8ef10..68ae6011a85b3eb913af017f5932525d3000f04d 100644 (file)
@@ -54,7 +54,7 @@ DisOrder distinguishes between multiple users.
 This is for access control and reporting, not to provide different
 views of the world: i.e. preferences and so on are global.
 .PP
-Each user has an associated set of rights which contorl which commands they may
+Each user has an associated set of rights which control which commands they may
 execute.
 Normally you would give all users most rights, and expect them to
 cooperate (they are after all presumed to be in a shared sound environment).
@@ -325,7 +325,6 @@ For \fBapi oss\fR the possible values are:
 .RS
 .TP 8
 .B pcm
-
 Output level for the audio device.
 This is probably what you want and is the default.
 .TP
@@ -399,8 +398,7 @@ For the possible values see
 .B "Users And Access Control"
 above.
 .IP
-The default is to allow everything except \fBadmin\fR and \fBregister\fR
-(modified in legacy configurations by the obsolete \fBrestrict\fR directive).
+The default is to allow everything except \fBadmin\fR and \fBregister\fR.
 .TP
 .B device \fINAME\fR
 Sound output device.
@@ -421,9 +419,6 @@ Remember to quote the name.
 The default is \fBdefault\fR, which is intended to map to whatever the system's
 default is.
 .TP
-.B gap \fISECONDS\fR
-This option no longer does anything and will be removed in a future version.
-.TP
 .B history \fIINTEGER\fR
 Specifies the number of recently played tracks to remember (including
 failed tracks and scratches).
@@ -442,9 +437,6 @@ Note that IPv6 is not currently well tested.
 .IP
 Normally the server only listens on a UNIX domain socket.
 .TP
-.B lock yes\fR|\fBno
-This option no longer does anything and will be removed in a future version.
-.TP
 .B mixer \fIDEVICE\fR
 The mixer device name, if it needs to be specified separately from
 \fBdevice\fR.
@@ -457,6 +449,10 @@ The default is 0.
 .IP
 For \fBapi coreaudio\fR, volume setting is not currently supported.
 .TP
+.B mount_rescan yes\fR|\fBno
+Determines whether mounts and unmounts will cause an automatic rescan.
+The default is \fByes\fR.
+.TP
 .B multicast_loop yes\fR|\fBno
 Determines whether multicast packets are loop backed to the sending host.
 The default is \fByes\fR.
@@ -582,14 +578,6 @@ Specifies the player for files matching the glob \fIPATTERN\fR.
 The following options are supported:
 .RS
 .TP
-.B \-\-wait\-for\-device\fR[\fB=\fIDEVICE\fR]
-\fBThis option is deprecated\fR.
-If you want gapless play use raw-format players and the speaker process instead.
-(This the default in any case.)
-.IP
-Waits (for up to a couple of seconds) for the default, or specified, libao
-device to become openable.
-.TP
 .B \-\-
 Defines the end of the list of options.
 Needed if the first argument to the plugin starts with a "\-".
@@ -638,9 +626,6 @@ Although players can be changed during the lifetime of the server, note that
 background decoders will not be stopped and restarted using changed
 configuration once they have been started.
 .TP
-.B prefsync \fISECONDS\fR
-This option no longer does anything and will be removed in a future version.
-.TP
 .B queue_pad \fICOUNT\fR
 The target size of the queue.
 If random play is enabled then randomly picked tracks will be added until
index b8492b63bbe72e0789d0341c550c4be0f9c0a15f..242c0b080b3950aff5ec5a694ff3bf1ff3e86683 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" Copyright (C) 2008 Richard Kettlewell
+.\" Copyright (C) 2008, 2011 Richard Kettlewell
 .\"
 .\" This program is free software: you can redistribute it and/or modify
 .\" it under the terms of the GNU General Public License as published by
@@ -25,15 +25,6 @@ The general syntax is the same as the main configuration file (see
 .SH DIRECTIVES
 Valid directives are:
 .TP
-.B columns \fINAME\fR \fIHEADING\fR...
-Defines the columns used in \fB@playing@\fR and \fB@recent@\fB.
-\fINAME\fR must be either \fBplaying\fR, \fBrecent\fR or \fBsearch\fR.
-\fIHEADING\fR...  is a list of heading names.
-If a column is defined more than once then the last definitions is used.
-.IP
-The heading names \fBbutton\fR, \fBlength\fR, \fBwhen\fR and \fBwho\fR
-are built in.
-.TP
 .B include \fIPATH\fR
 Includes another file.
 If \fIPATH\fR starts with a \fB/\fR then it is taken as is, otherwise
@@ -54,7 +45,7 @@ Otherwise the whole name is used as the value.
 Labels are not individually documented here, see the shipped
 \fIoptions.labels\fR file instead.
 .SH "OPTION FILES"
-The shipped \fIoptions\fR file includes four standard options files.
+The shipped \fIoptions\fR file includes two standard options files.
 In order, they are:
 .TP
 .I options.labels
index 9fbe6fbc8f8729a74cbd795598751280b2e8930f..3ce67d9bfff2ecd0c581e3c1967e3560ff649ae5 100644 (file)
@@ -92,12 +92,10 @@ the listed tags.
 .B playing
 If unset or \fByes\fR then play is enabled.
 Otherwise it is disabled.
-Use \fBdisable\fR rather than setting it directly.
 .TP
 .B random\-play
 If unset or \fByes\fR then random play is enabled.
 Otherwise it is disabled.
-Use \fBdisable\fR rather than setting it directly.
 .PP
 Global preferences starting '_' are read-only (in the sense that you cannot
 modify them; the server may modify them as part of its normal operation).
index bb95ff01e584ebaa68b842e23e1f26769ae28263..8865e8bd91d9b5b816a43da237628af367971c78 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" Copyright (C) 2004-2008 Richard Kettlewell
+.\" Copyright (C) 2004-2011 Richard Kettlewell
 .\"
 .\" This program is free software: you can redistribute it and/or modify
 .\" it under the terms of the GNU General Public License as published by
@@ -21,39 +21,61 @@ disorder_protocol \- DisOrder communication protocol
 The DisOrder client and server communicate via the protocol described
 in this man page.
 .PP
-The protocol is liable to change without notice.
-You are recommended to check the implementation before believing this document.
-.SH "GENERAL SYNTAX"
-Everything is encoded using UTF-8.
-See
-.B "CHARACTER ENCODING"
-below for more detail on character encoding issues.
+The protocol is usually modified in each new version of the server.
+.SH "MESSAGE STRUCTURE"
+A \fIline\fR is a sequence of printable Unicode characters encoded in UTF-8 and
+terminated by the octet 0x0A.
+Note that unlike some other protocols, a carriage return is not used as part of
+the end-of-line sequence.
+.PP
+A \fIcommand message\fR consists of a \fIcommand line\fR followed, in some cases, by a \fIbody\fR.
+Similarly a \fIresponse message\fR consists of a \fIresponse line\fR followed
+sometimes by a \fIbody\fR.
 .PP
-Commands and responses consist of a line perhaps followed (depending on the
-command or response) by a body.
+A \fIbody\fR consists of a sequence of dot-stuffed lines followed by a line
+containing a single full stop character.
+Dot-stuffing means that any line in the body starting with a full stop have
+another full stop inserted at the start prior to transmission, and removed
+again after reception.
 .PP
-The line syntax is the same as described in \fBdisorder_config\fR(5) except
-that comments are prohibited.
+Whether a command message includes a body depends on the specific command being
+sent; see below for details.
+This is also true of reply messages, although it is guaranteed that if the is a
+response body then the reply status code (see below) will end with the digit 3.
 .PP
-Bodies borrow their syntax from RFC821; they consist of zero or more ordinary
-lines, with any initial full stop doubled up, and are terminated by a line
-consisting of a full stop and a line feed.
+Command lines, and some response lines, are split into \fIfields\fR.
+Fields are separated by one or more spaces and may be \fIunquoted\fR or
+\fIquoted\fR.
 .PP
-Commands only have a body if explicitly stated below.
-If they do have a body then the body should always be sent immediately;
-unlike (for instance) the SMTP "DATA" command there is no intermediate step
-where the server asks for the body to be sent.
+An \fIunquoted field\fR can contain any (non-control) characters except for a
+space, quotation mark or apostrophe.
+They are always at least one character long.
+.PP
+A \fIquoted field\fR begins with a quotation mark or apostrophe and is
+terminated by the same character.
+Any occurrence of the backslash or the surrounding quotation mark must be
+escaped.
+The full set of escapes permitted is:
+.TP
+.B \e\e
+Backslash
+.TP
+.B \e"
+Quotation mark
+.\" "
+.TP
+.B \e\(aq
+Apostrophe
+.TP
+.B \en
+Line feed
 .PP
-Replies also only have a body if stated below.
-The presence of a reply body can always be inferred from the response code;
-if the last digit is a 3 then a body is present, otherwise it is not.
 .SH COMMANDS
-Commands always have a command name as the first field of the line; responses
-always have a 3-digit response code as the first field.
-See below for more details about this field.
+Commands always have a command name as the first field of the line.
 .PP
 All commands require the connection to have been already authenticated unless
 stated otherwise.
+See \fBAUTHENTICATION\fR below.
 If not stated otherwise, the \fBread\fR right is sufficient to execute
 the command.
 .TP
@@ -75,7 +97,8 @@ If \fIREGEXP\fR is present only matching files and directories are returned.
 .B confirm \fICONFIRMATION
 Confirm user registration.
 \fICONFIRMATION\fR is as returned from \fBregister\fR below.
-This command can be used without logging in.
+This command logs the user in.
+The response contains the logged-in username.
 .TP
 .B cookie \fICOOKIE
 Log a user back in using a cookie created with \fBmake\-cookie\fR.
@@ -104,6 +127,8 @@ Otherwise the \fBuserinfo\fR right is required and only the
 User properties are syntax-checked before setting.  For instance \fBemail\fR
 must contain an "@" sign or you will get an error.  (Setting an empty value for
 \fBemail\fR is allowed and removes the property.)
+.IP
+See \fBUSER PROPERTIES\fR below.
 .TP
 .B enable
 Re-enable further playing, and is the opposite of \fBdisable\fR.
@@ -340,9 +365,9 @@ Resolve a track name, i.e. if this is an alias then return the real track name.
 Resume the current track after a \fBpause\fR command.
 Requires the \fBpause\fR right.
 .TP
-.B revoke \fBcookie\fR
-Revoke a cookie previously created with \fBmake\-cookie\fR.
-It will not be possible to use this cookie in the future.
+.B revoke
+Revoke the current login's cookie.
+It will not be possible to use the cookie in the future.
 .TP
 .B rtp\-address
 Report the RTP broadcast (or multicast) address, in the form \fIADDRESS
@@ -360,7 +385,8 @@ added to the queue.
 Schedule an event for the future.
 .IP
 .I WHEN
-is the time when it should happen, as \fBtime_t\fR value.
+is the time when it should happen, as a timestamp.
+See \fBTIMESTAMPS\fR below.
 It must refer to a time in the future.
 .IP
 .I PRIORITY
@@ -436,6 +462,10 @@ Requires the \fBprefs\fR right.
 Set a global preference.
 Requires the \fBglobal prefs\fR right.
 .TP
+.B shutdown
+Requests server shutdown.
+Requires the \fBadmin\fR right.
+.TP
 .B stats
 Send server statistics in plain text in a response body.
 .TP
@@ -458,6 +488,7 @@ below.
 .TP
 .B userinfo \fIUSERNAME PROPERTY
 Get a user property.
+See \fBUSER PROPERTIES\fR below.
 .TP
 .B users
 Send the list of currently known users in a response body.
@@ -475,7 +506,10 @@ With one parameter sets both sides to the same value.
 With two parameters sets each side independently.
 Setting the volume requires the \fBvolume\fR right.
 .SH RESPONSES
-Responses are three-digit codes.
+Response lines start with a three-digit status code followed by a space.
+The meaning the response and the interpretation of the rest of the line depends
+on that code.
+.PP
 The first digit distinguishes errors from successful responses:
 .TP
 .B 2
@@ -488,7 +522,6 @@ The second digit breaks down the origin of the response:
 .TP
 .B 0
 Generic responses not specific to the handling of the command.
-Mostly this is parse errors.
 .TP
 .B 1
 51x errors indicate that the user had insufficient rights for the command.
@@ -502,10 +535,12 @@ Responses specific to the handling of the command.
 The third digit provides extra information about the response:
 .TP
 .B 0
-Text part is just commentary.
+Text part is just commentary, intended to be human-readable.
 .TP
 .B 1
-Text part is a constant result e.g. \fBversion\fR.
+Text part is a constant result (e.g. \fBversion\fR).
+It will not change on a subsequent use of the same command on the same
+conneciton.
 .TP
 .B 2
 Text part is a potentially variable result.
@@ -518,7 +553,7 @@ Text part is just commentary; an indefinite dot-stuffed body follows.
 (Used for \fBlog\fR.)
 .TP
 .B 5
-Used with "normal" errors, for instance a preference not being found.
+Used with "harmless" errors, for instance a preference not being found.
 The text part is commentary.
 .TP
 .B 9
@@ -526,24 +561,23 @@ The text part is just commentary (but would normally be a response for this
 command) e.g. \fBplaying\fR.
 .PP
 Result strings (not bodies) intended for machine parsing (i.e. xx1 and xx2
-responses) are quoted.
+responses) are structure into fields in the the same way as command lines.
 .SH AUTHENTICATION
 When a connection is made the server sends a \fB231\fR response before any
 command is received.
 This contains a protocol generation, an algorithm name and a
-challenge encoded in hex, all separated by whitespace.
+challenge encoded in hex, in the fields of the response line.
 .PP
 The current protocol generation is \fB2\fR.
 .PP
 The possible algorithms are (currently) \fBsha1\fR, \fBsha256\fR, \fBsha384\fR
 and \fBsha512\fR.
-\fBSHA1\fR etc work as synonyms.
+Completely upper-case names such as \fBSHA1\fR etc work as synonyms.
 .PP
 The \fBuser\fR response consists of the selected hash of the user's password
 concatenated with the challenge, encoded in hex.
 .SH "TRACK INFORMATION"
-Track information is encoded in a line (i.e. using the usual line syntax) as
-pairs of fields.
+Track information is encoded in a response line as pairs of fields.
 The first is a name, the second a value.
 The names have the following meanings:
 .TP 12
@@ -620,21 +654,10 @@ The wait status of the player in decimal.
 .PP
 Note that \fBorigin\fR is new with DisOrder 4.3, and obsoletes some old
 \fBstate\fR values.
-.SH NOTES
-Times are decimal integers using the server's \fBtime_t\fR.
-.PP
-For file listings, the regexp applies to the basename of the returned file, not
-the whole filename, and letter case is ignored.
-\fBpcrepattern\fR(3) describes the regexp syntax.
-.PP
-Filenames are in UTF-8 even if the collection they come from uses some other
-encoding - if you want to access the real file (in such cases as the filenames
-actually correspond to a real file) you'll have to convert to whatever the
-right encoding is.
 .SH "EVENT LOG"
 The event log consists of lines starting with a hexadecimal timestamp and a
-keyword followed by (optionally) parameters.
-The parameters are quoted in the usual DisOrder way.
+keyword followed by (optionally) parameters, which are structured into fields
+in the same way as command and response lines.
 Currently the following keywords are used:
 .TP
 .B adopted \fIID\fR \fIUSERNAME\fR
@@ -646,6 +669,9 @@ Completed playing \fITRACK\fR
 .B failed \fITRACK\fR \fIERROR\fR
 Completed playing \fITRACK\fR with an error status
 .TP
+.B global_pref \fIPREF\fR [\fIVALUE\fR]
+A global preference was set or unset.
+.TP
 .B moved \fIUSERNAME\fR
 User \fIUSERNAME\fR moved some track(s).
 Further details aren't included any more.
@@ -752,71 +778,97 @@ above.
 .PP
 The \fBuser-*\fR messages are only sent to admin users, and are not sent over
 non-local connections unless \fBremote_userman\fR is enabled.
-.SH "CHARACTER ENCODING"
-All data sent by both server and client is encoded using UTF-8.
-Moreover it must be valid UTF-8, i.e. non-minimal sequences are not
-permitted, nor are surrogates, nor are code points outside the
-Unicode code space.
-.PP
-There are no particular normalization requirements on either side of the
-protocol.
-The server currently converts internally to NFC, the client must
-normalize the responses returned if it needs some normalized form for further
-processing.
-.PP
-The various characters which divide up lines may not be followed by combining
-characters.
-For instance all of the following are prohibited:
-.TP
-.B o
-LINE FEED followed by a combining character.
-For example the sequence LINE FEED, COMBINING GRAVE ACCENT is never permitted.
-.TP
-.B o
-APOSTROPHE or QUOTATION MARK followed by a combining character when used to
-delimit fields.
-For instance a line starting APOSTROPHE, COMBINING CEDILLA is prohibited.
-.IP
-Note that such sequences are not prohibited when the quote character cannot be
-interpreted as a field delimiter.
-For instance APOSTROPHE, REVERSE SOLIDUS, APOSTROPHE, COMBINING CEDILLA,
-APOSTROPHE would be permitted.
-.TP
-.B o
-REVERSE SOLIDUS (BACKSLASH) followed by a combining character in a quoted
-string when it is the first character of an escape sequence.
-For instance a line starting APOSTROPHE, REVERSE SOLIDUS, COMBINING TILDE
-is prohibited.
-.IP
-As above such sequences are not prohibited when the character is not being used
-to start an escape sequence.
-For instance APOSTROPHE, REVERSE SOLIDUS, REVERSE SOLIDS, COMBINING TILDE,
-APOSTROPHE is permitted.
-.TP
-.B o
-Any of the field-splitting whitespace characters followed by a combining
-character when not part of a quoted field.
-For instance a line starting COLON, SPACE, COMBINING CANDRABINDU is prohibited.
-.IP
-As above non-delimiter uses are fine.
+.SH "USER PROPERTIES"
+The following user properties are defined:
 .TP
-.B o
-The FULL STOP characters used to quote or delimit a body.
-.PP
-Furthermore none of these characters are permitted to appear in the context of
-a canonical decomposition (i.e. they must still be present when converted to
-NFC).
-In practice however this is not an issue in Unicode 5.0.
+.B created
+The timestamp when the user was created.
+See \fBTIMESTAMPS\fR below.
+This user property cannot be modified.
+.TP
+.B email
+The user's email address.
+.TP
+.B password
+The user's password.
+.TP
+.B rights
+The rights the user has, separated by commas.
+.SH RIGHTS
+The full set of rights are:
+.TP
+.B read
+User can perform read-only operations
+.TP
+.B play
+User can add tracks to the queue
+.TP
+.B "move any"
+User can move any track
+.TP
+.B "move mine"
+User can move their own tracks
+.TP
+.B "move random"
+User can move randomly chosen tracks
+.TP
+.B "remove any"
+User can remove any track
+.TP
+.B "remove mine"
+User can remove their own tracks
+.TP
+.B "remove random"
+User can remove randomly chosen tracks
+.TP
+.B "scratch any"
+User can scratch any track
+.TP
+.B "scratch mine"
+User can scratch their own tracks
+.TP
+.B "scratch random"
+User can scratch randomly chosen tracks
+.TP
+.B volume
+User can change the volume
+.TP
+.B admin
+User can perform admin operations
+.TP
+.B rescan
+User can initiate a rescan
+.TP
+.B register
+User can register new users.
+Normally only the
+.B guest
+user would have this right.
+.TP
+.B userinfo
+User can edit their own userinfo
+.TP
+.B prefs
+User can modify track preferences
+.TP
+.B "global prefs"
+User can modify global preferences
+.TP
+.B pause
+User can pause/resume
+.SH TIMESTAMPS
+A \fItimestamp\fR is a decimal integer giving a number of seconds past the
+epoch, disregarding counting leap seconds.
+The epoch is midnight, January 1 1970, UTC.
+.SH NOTES
+For file listings, the regexp applies to the basename of the returned file, not
+the whole filename, and letter case is ignored.
+\fBpcrepattern\fR(3) describes the regexp syntax.
 .PP
-These rules are consistent with the observation that the split() function is
-essentially a naive ASCII parser.
-The implication is not that these sequences never actually appear in
-the protocol, merely that the server is not required to honor them in
-any useful way nor be consistent between versions: in current
-versions the result will be lines and fields that start with combining
-characters and are not necessarily split where you expect, but future versions
-may remove them, reject them or ignore some or all of the delimiters that have
-following combining characters, and no notice will be given of any change.
+Filenames are in UTF-8 even if the collection they come from uses some other
+encoding - if you want to access the real file (in such cases as the filenames
+actually correspond to a real file) you'll have to convert to whatever the
+right encoding is.
 .SH "SEE ALSO"
 \fBdisorder\fR(1),
 \fBtime\fR(2),
diff --git a/docs.css b/docs.css
new file mode 100644 (file)
index 0000000..9a7f354
--- /dev/null
+++ b/docs.css
@@ -0,0 +1,56 @@
+body {
+  color: black;
+  background-color: white;
+  font-family: times,serif;
+  font-weight: normal;
+  font-size: 12pt;
+  font-variant: normal
+}
+
+div.section {
+  margin-left:1em
+}
+
+h1 {
+  background-color: #e0ffe0;
+  font-family: helvetica,sans-serif;
+  padding: 0.2em
+}
+
+h2 {
+  background-color: #e0ffe0;
+  font-family: helvetica,sans-serif;
+  padding: 0.2em
+}
+
+h3 {
+  background-color: #f0f0f0;
+  font-family: helvetica,sans-serif;
+  padding: 0.2em
+}
+
+h4 {
+  font-family: helvetica,sans-serif
+}
+
+table.bugs {
+  width: 100%;
+  font-size: 12pt;
+  border-collapse: collapse;
+  border:1px
+}
+
+table.bugs th {
+  text-align: left;
+  border: 1px solid black;
+  background-color: black;
+  color: white
+}
+
+table.bugs td {
+  border: 1px solid
+}
+
+span.command {
+  font-family: monospace
+}
index 36a6ad5cd6047f5756ddb4758ed7f4be2dc44f75..649897bd8a6cc062e5faad73b2bea66bea87bd56 100644 (file)
@@ -28,7 +28,8 @@ query.svg queryon.svg speaker.svg speakeron.svg cross32.png           \
 pause32.png play32.png playdisabled32.png playenabled32.png            \
 randomdisabled32.png randomenabled32.png rtpdisabled32.png             \
 rtpenabled32.png duck55.png cards24.png cards48.png                    \
-cards-simple-fanned.svg cards-thin.svg
+cards-simple-fanned.svg cards-thin.svg disobedience128x128.png                 \
+disobedience256x256.png disobedience48x48.png disobedience64x64.png
 
 DISOBEDIENCE_IMAGES=up.png down.png cards24.png logo256.png duck.png   \
 propagate.png
diff --git a/images/disobedience128x128.png b/images/disobedience128x128.png
new file mode 100644 (file)
index 0000000..45d7800
Binary files /dev/null and b/images/disobedience128x128.png differ
diff --git a/images/disobedience256x256.png b/images/disobedience256x256.png
new file mode 100644 (file)
index 0000000..02ccd4a
Binary files /dev/null and b/images/disobedience256x256.png differ
diff --git a/images/disobedience48x48.png b/images/disobedience48x48.png
new file mode 100644 (file)
index 0000000..4757bab
Binary files /dev/null and b/images/disobedience48x48.png differ
diff --git a/images/disobedience64x64.png b/images/disobedience64x64.png
new file mode 100644 (file)
index 0000000..b99b8b5
Binary files /dev/null and b/images/disobedience64x64.png differ
index be12f1c2680efcbe7337a42f67f8fef735c5939f..241c71e732b91d3dbb4a4e573f2fdd7179f4f0b1 100644 (file)
@@ -1,17 +1,17 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2009 Richard Kettlewell
+# Copyright (C) 2004-2010, 2012, 2013 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
-# 
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
@@ -25,7 +25,7 @@ else
 TRACKDB=trackdb-stub.c
 endif
 
-libdisorder_a_SOURCES=charset.c charset.h              \
+libdisorder_a_SOURCES=charset.c charsetf.c charset.h   \
        addr.c addr.h                                   \
        arcfour.c arcfour.h                             \
        authhash.c authhash.h                           \
@@ -35,14 +35,14 @@ libdisorder_a_SOURCES=charset.c charset.h           \
        byte-order.h                                    \
        cache.c cache.h                                 \
        cgi.c cgi.h                                     \
-       client.c client.h                               \
+       client.c client.h client-stubs.h                \
        client-common.c client-common.h                 \
        configuration.c configuration.h                 \
        cookies.c cookies.h                             \
        coreaudio.c coreaudio.h                         \
        dateparse.c dateparse.h xgetdate.c              \
        defs.c defs.h                                   \
-       eclient.c eclient.h                             \
+       eclient.c eclient.h eclient-stubs.h             \
        email.c                                         \
        eventdist.c eventdist.h                         \
        event.c event.h                                 \
@@ -52,6 +52,7 @@ libdisorder_a_SOURCES=charset.c charset.h             \
        heap.h                                          \
        hex.c hex.h                                     \
        hostname.c hostname.h                           \
+       hreader.c hreader.h                             \
        ifreq.c ifreq.h                                 \
        inputline.c inputline.h                         \
        kvp.c kvp.h                                     \
@@ -75,7 +76,7 @@ libdisorder_a_SOURCES=charset.c charset.h             \
        speaker-protocol.c speaker-protocol.h           \
        split.c split.h                                 \
        strptime.c strptime.h                           \
-       syscalls.c syscalls.h                           \
+       syscalls.c syscallsrt.c syscalls.h              \
        common.h                                        \
        table.c table.h                                 \
        timeval.h                                       \
@@ -133,10 +134,12 @@ definitions.h: Makefile
 defs.o: definitions.h versionstring.h
 defs.lo: definitions.h versionstring.h
 
+client.o: client-stubs.c
+
 rebuild-unicode:
        cd ${srcdir} && ${top_srcdir}/scripts/make-unidata
 
 CLEANFILES=definitions.h definitions.h.new version-string versionstring.h \
           *.gcda *.gcov *.gcno *.c.html index.html
 
-EXTRA_DIST=trackdb.c trackdb-stub.c
+EXTRA_DIST=trackdb.c trackdb-stub.c client-stubs.c eclient-stubs.c
index da37319012c19f5f6a85a9c8f0f7a5577f280d48..fd9fa6cbdce2dde0faadc6e6c1ed48e07469f547 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 int byte_vasprintf(char **ptrp,
                   const char *fmt,
                   va_list ap) {
+  struct sink *s;
   struct dynstr d;
   int n;
 
   dynstr_init(&d);
-  if((n = byte_vsinkprintf(sink_dynstr(&d), fmt, ap)) >= 0) {
+  s = sink_dynstr(&d);
+  n = byte_vsinkprintf(s, fmt, ap);
+  xfree(s);
+  if(n >= 0) {
     dynstr_terminate(&d);
     *ptrp = d.vec;
   }
index 8cc96f904542949d984c5104efe83be04040ff42..c06c233ed26642833a92517ce9ae425a93ba758e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2004, 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2004, 2006, 2007, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -64,10 +64,10 @@ static const struct algorithm algorithms[] = {
  * Computes H(challenge|password) and returns it as a newly allocated hex
  * string, or returns NULL on error.
  */
-const char *authhash(const void *challenge, size_t nchallenge,
-                    const char *password, const char *algo) {
+char *authhash(const void *challenge, size_t nchallenge,
+               const char *password, const char *algo) {
   gcrypt_hash_handle h;
-  const char *res;
+  char *res;
   size_t n;
   int id;
 
index 8604a13948f1a81e602ea15992a87ecc15c35c29..7b73d67ea7acfd8a3b7df235ecbf4b945c40d395 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2006, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2006-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,8 +19,8 @@
 #ifndef AUTHHASH_H
 #define AUTHHASH_H
 
-const char *authhash(const void *challenge, size_t nchallenge,
-                    const char *user, const char *algo);
+char *authhash(const void *challenge, size_t nchallenge,
+               const char *user, const char *algo);
 int valid_authhash(const char *algo);
 
 #endif /* AUTHHASH_H */
index 15b556c483cbc51915c179ee1b72e6e23ccafc4c..9fd42f1d41a929625be9dde37817f55285fbcf0f 100644 (file)
--- a/lib/cgi.c
+++ b/lib/cgi.c
@@ -226,7 +226,6 @@ void cgi_clear(void) {
  */
 char *cgi_sgmlquote(const char *src) {
   uint32_t *ucs, c;
-  int n;
   struct dynstr d[1];
   struct sink *s;
 
@@ -234,7 +233,6 @@ char *cgi_sgmlquote(const char *src) {
     exit(1);
   dynstr_init(d);
   s = sink_dynstr(d);
-  n = 1;
   /* format the string */
   while((c = *ucs++)) {
     switch(c) {
index be2b05a45ae5a3ced48f189fb1b69167b701a330..e3c3a4eb59b560e9a6a9ce4afcd5fd714582e835 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,6 +49,16 @@ char *any2any(const char *from/*encoding or 0*/,
  * that iconv knows.  If FROM and TO are both 0 then ANY is returned
  * unchanged. */
 
+char *mb2utf8_f(char *mb);
+char *utf82mb_f(char *utf8);
+char *any2utf8_f(const char *from/*encoding*/,
+                 char *any/*string*/);
+char *any2mb_f(const char *from/*encoding or 0*/,
+               char *any/*string*/);
+char *any2any_f(const char *from/*encoding or 0*/,
+                const char *to/*encoding to 0*/,
+                char *any/*string*/);
+
 /** @brief Insist that @p s is not null
  * @param s Pointer to check
  * @return @p s
diff --git a/lib/charsetf.c b/lib/charsetf.c
new file mode 100644 (file)
index 0000000..cb27974
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/charsetf.c @brief Character set conversion with free() */
+
+#include "common.h"
+
+#include "charset.h"
+#include "mem.h"
+
+char *mb2utf8_f(char *mb) {
+  char *s = mb2utf8(mb);
+  xfree(mb);
+  return s;
+}
+
+char *utf82mb_f(char *utf8) {
+  char *s = utf82mb(utf8);
+  xfree(utf8);
+  return s;
+}
+
+char *any2utf8_f(const char *from,
+                 char *any) {
+  char *s = any2utf8(from, any);
+  xfree(any);
+  return s;
+}
+
+char *any2mb_f(const char *from,
+               char *any) {
+  char *s = any2mb(from, any);
+  xfree(any);
+  return s;
+}
+
+char *any2any_f(const char *from,
+                const char *to,
+                char *any) {
+  char *s = any2any(from, to, any);
+  xfree(any);
+  return s;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index c55da8939fb6084e9f52e98910ef65ef5b6bfeb6..f88008ffe2e4b8a11e693d281f670d65585f1457 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include <sys/un.h>
 #include <errno.h>
 #include <netdb.h>
+#include <unistd.h>
 
 #include "log.h"
 #include "configuration.h"
@@ -43,7 +44,7 @@ socklen_t find_server(struct config *c,
   struct sockaddr *sa;
   struct sockaddr_un su;
   struct addrinfo *res = 0;
-  char *name;
+  char *name = NULL;
   socklen_t len;
 
   if(c->connect.af != -1) {
@@ -53,7 +54,14 @@ socklen_t find_server(struct config *c,
     sa = res->ai_addr;
     len = res->ai_addrlen;
   } else {
-    name = config_get_file2(c, "socket");
+    /* use the private socket if possible (which it should be) */
+    name = config_get_file2(c, "private/socket");
+    if(access(name, R_OK) != 0) {
+      xfree(name);
+      name = NULL;
+    }
+    if(!name)
+      name = config_get_file2(c, "socket");
     if(strlen(name) >= sizeof su.sun_path) {
       disorder_error(errno, "socket path is too long");
       return -1;
@@ -63,6 +71,7 @@ socklen_t find_server(struct config *c,
     strcpy(su.sun_path, name);
     sa = (struct sockaddr *)&su;
     len = sizeof su;
+    xfree(name);
   }
   *sap = xmalloc_noptr(len);
   memcpy(*sap, sa, len);
@@ -73,6 +82,11 @@ socklen_t find_server(struct config *c,
   return len;
 }
 
+const char disorder__body[1];
+const char disorder__list[1];
+const char disorder__integer[1];
+const char disorder__time[1];
+
 /*
 Local Variables:
 c-basic-offset:2
index 736ac6f209a363cc936ec4b9af39c25e8e2b8483..26db71564faf091e7011694698bc83570d7b11ad 100644 (file)
 
 socklen_t find_server(struct config *c, struct sockaddr **sap, char **namep);
 
+/** @brief Marker for a command body */
+extern const char disorder__body[1];
+
+/** @brief Marker for a list of args */
+extern const char disorder__list[1];
+
+/** @brief Marker for an integer */
+extern const char disorder__integer[1];
+
+/** @brief Marker for a timestamp */
+extern const char disorder__time[1];
+
 #endif /* CLIENT_COMMON_H */
 
 /*
diff --git a/lib/client-stubs.c b/lib/client-stubs.c
new file mode 100644 (file)
index 0000000..10a1fb2
--- /dev/null
@@ -0,0 +1,480 @@
+/*
+ * Automatically generated file, see scripts/protocol
+ *
+ * DO NOT EDIT.
+ */
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2010-11 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/client-stubs.c
+ * @brief Generated client API implementation
+ */
+
+int disorder_adopt(disorder_client *c, const char *id) {
+  return disorder_simple(c, NULL, "adopt", id, (char *)NULL);
+}
+
+int disorder_adduser(disorder_client *c, const char *user, const char *password, const char *rights) {
+  return disorder_simple(c, NULL, "adduser", user, password, rights, (char *)NULL);
+}
+
+int disorder_allfiles(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp) {
+  int rc = disorder_simple(c, NULL, "allfiles", dir, re, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, filesp, nfilesp))
+    return -1;
+  return 0;
+}
+
+int disorder_confirm(disorder_client *c, const char *confirmation) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "confirm", confirmation, (char *)NULL);
+  if(rc)
+    return rc;
+  c->user = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_cookie(disorder_client *c, const char *cookie) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "cookie", cookie, (char *)NULL);
+  if(rc)
+    return rc;
+  c->user = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_deluser(disorder_client *c, const char *user) {
+  return disorder_simple(c, NULL, "deluser", user, (char *)NULL);
+}
+
+int disorder_dirs(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp) {
+  int rc = disorder_simple(c, NULL, "dirs", dir, re, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, filesp, nfilesp))
+    return -1;
+  return 0;
+}
+
+int disorder_disable(disorder_client *c) {
+  return disorder_simple(c, NULL, "disable", (char *)NULL);
+}
+
+int disorder_edituser(disorder_client *c, const char *username, const char *property, const char *value) {
+  return disorder_simple(c, NULL, "edituser", username, property, value, (char *)NULL);
+}
+
+int disorder_enable(disorder_client *c) {
+  return disorder_simple(c, NULL, "enable", (char *)NULL);
+}
+
+int disorder_enabled(disorder_client *c, int *enabledp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "enabled", (char *)NULL);
+  if(rc)
+    return rc;
+  if(boolean("enabled", v[0], enabledp))
+    return -1;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_exists(disorder_client *c, const char *track, int *existsp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "exists", track, (char *)NULL);
+  if(rc)
+    return rc;
+  if(boolean("exists", v[0], existsp))
+    return -1;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_files(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp) {
+  int rc = disorder_simple(c, NULL, "files", dir, re, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, filesp, nfilesp))
+    return -1;
+  return 0;
+}
+
+int disorder_get(disorder_client *c, const char *track, const char *pref, char **valuep) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "get", track, pref, (char *)NULL);
+  if(rc)
+    return rc;
+  *valuep = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_get_global(disorder_client *c, const char *pref, char **valuep) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "get-global", pref, (char *)NULL);
+  if(rc)
+    return rc;
+  *valuep = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_length(disorder_client *c, const char *track, long *lengthp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "length", track, (char *)NULL);
+  if(rc)
+    return rc;
+  *lengthp = atol(v[0]);
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_make_cookie(disorder_client *c, char **cookiep) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "make-cookie", (char *)NULL);
+  if(rc)
+    return rc;
+  *cookiep = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_move(disorder_client *c, const char *track, long delta) {
+  return disorder_simple(c, NULL, "move", track, disorder__integer, delta, (char *)NULL);
+}
+
+int disorder_moveafter(disorder_client *c, const char *target, char **ids, int nids) {
+  return disorder_simple(c, NULL, "moveafter", target, disorder__list, ids, nids, (char *)NULL);
+}
+
+int disorder_new_tracks(disorder_client *c, long max, char ***tracksp, int *ntracksp) {
+  int rc = disorder_simple(c, NULL, "new", disorder__integer, max, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, tracksp, ntracksp))
+    return -1;
+  return 0;
+}
+
+int disorder_nop(disorder_client *c) {
+  return disorder_simple(c, NULL, "nop", (char *)NULL);
+}
+
+int disorder_part(disorder_client *c, const char *track, const char *context, const char *part, char **partp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "part", track, context, part, (char *)NULL);
+  if(rc)
+    return rc;
+  *partp = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_pause(disorder_client *c) {
+  return disorder_simple(c, NULL, "pause", (char *)NULL);
+}
+
+int disorder_play(disorder_client *c, const char *track, char **idp) {
+  return disorder_simple(c, idp, "play", track, (char *)NULL);
+}
+
+int disorder_playafter(disorder_client *c, const char *target, char **tracks, int ntracks) {
+  return disorder_simple(c, NULL, "playafter", target, disorder__list, tracks, ntracks, (char *)NULL);
+}
+
+int disorder_playing(disorder_client *c, struct queue_entry **playingp) {
+  return onequeue(c, "playing", playingp);
+}
+
+int disorder_playlist_delete(disorder_client *c, const char *playlist) {
+  return disorder_simple(c, NULL, "playlist-delete", playlist, (char *)NULL);
+}
+
+int disorder_playlist_get(disorder_client *c, const char *playlist, char ***tracksp, int *ntracksp) {
+  int rc = disorder_simple(c, NULL, "playlist-get", playlist, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, tracksp, ntracksp))
+    return -1;
+  return 0;
+}
+
+int disorder_playlist_get_share(disorder_client *c, const char *playlist, char **sharep) {
+  return disorder_simple(c, sharep, "playlist-get-share", playlist, (char *)NULL);
+}
+
+int disorder_playlist_lock(disorder_client *c, const char *playlist) {
+  return disorder_simple(c, NULL, "playlist-lock", playlist, (char *)NULL);
+}
+
+int disorder_playlist_set(disorder_client *c, const char *playlist, char **tracks, int ntracks) {
+  return disorder_simple(c, NULL, "playlist-set", playlist, disorder__body, tracks, ntracks, (char *)NULL);
+}
+
+int disorder_playlist_set_share(disorder_client *c, const char *playlist, const char *share) {
+  return disorder_simple(c, NULL, "playlist-set-share", playlist, share, (char *)NULL);
+}
+
+int disorder_playlist_unlock(disorder_client *c) {
+  return disorder_simple(c, NULL, "playlist-unlock", (char *)NULL);
+}
+
+int disorder_playlists(disorder_client *c, char ***playlistsp, int *nplaylistsp) {
+  int rc = disorder_simple(c, NULL, "playlists", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, playlistsp, nplaylistsp))
+    return -1;
+  return 0;
+}
+
+int disorder_prefs(disorder_client *c, const char *track, struct kvp **prefsp) {
+  return pairlist(c, prefsp, "prefs", track, (char *)NULL);
+}
+
+int disorder_queue(disorder_client *c, struct queue_entry **queuep) {
+  int rc = disorder_simple(c, NULL, "queue", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readqueue(c, queuep))
+    return -1;
+  return 0;
+}
+
+int disorder_random_disable(disorder_client *c) {
+  return disorder_simple(c, NULL, "random-disable", (char *)NULL);
+}
+
+int disorder_random_enable(disorder_client *c) {
+  return disorder_simple(c, NULL, "random-enable", (char *)NULL);
+}
+
+int disorder_random_enabled(disorder_client *c, int *enabledp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "random-enabled", (char *)NULL);
+  if(rc)
+    return rc;
+  if(boolean("random-enabled", v[0], enabledp))
+    return -1;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_recent(disorder_client *c, struct queue_entry **recentp) {
+  int rc = disorder_simple(c, NULL, "recent", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readqueue(c, recentp))
+    return -1;
+  return 0;
+}
+
+int disorder_reconfigure(disorder_client *c) {
+  return disorder_simple(c, NULL, "reconfigure", (char *)NULL);
+}
+
+int disorder_register(disorder_client *c, const char *username, const char *password, const char *email, char **confirmationp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "register", username, password, email, (char *)NULL);
+  if(rc)
+    return rc;
+  *confirmationp = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_reminder(disorder_client *c, const char *username) {
+  return disorder_simple(c, NULL, "reminder", username, (char *)NULL);
+}
+
+int disorder_remove(disorder_client *c, const char *id) {
+  return disorder_simple(c, NULL, "remove", id, (char *)NULL);
+}
+
+int disorder_rescan(disorder_client *c) {
+  return disorder_simple(c, NULL, "rescan", (char *)NULL);
+}
+
+int disorder_resolve(disorder_client *c, const char *track, char **resolvedp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "resolve", track, (char *)NULL);
+  if(rc)
+    return rc;
+  *resolvedp = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_resume(disorder_client *c) {
+  return disorder_simple(c, NULL, "resume", (char *)NULL);
+}
+
+int disorder_revoke(disorder_client *c) {
+  return disorder_simple(c, NULL, "revoke", (char *)NULL);
+}
+
+int disorder_rtp_address(disorder_client *c, char **addressp, char **portp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 2, "rtp-address", (char *)NULL);
+  if(rc)
+    return rc;
+  *addressp = v[0];
+  v[0] = NULL;
+  *portp = v[1];
+  v[1] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_scratch(disorder_client *c, const char *id) {
+  return disorder_simple(c, NULL, "scratch", id, (char *)NULL);
+}
+
+int disorder_schedule_add_play(disorder_client *c, time_t when, const char *priority, const char *track) {
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "play", track, (char *)NULL);
+}
+
+int disorder_schedule_add_set_global(disorder_client *c, time_t when, const char *priority, const char *pref, const char *value) {
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "set-global", pref, value, (char *)NULL);
+}
+
+int disorder_schedule_add_unset_global(disorder_client *c, time_t when, const char *priority, const char *pref) {
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "set-global", pref, (char *)NULL);
+}
+
+int disorder_schedule_del(disorder_client *c, const char *event) {
+  return disorder_simple(c, NULL, "schedule-del", event, (char *)NULL);
+}
+
+int disorder_schedule_get(disorder_client *c, const char *id, struct kvp **actiondatap) {
+  return pairlist(c, actiondatap, "schedule-get", id, (char *)NULL);
+}
+
+int disorder_schedule_list(disorder_client *c, char ***idsp, int *nidsp) {
+  int rc = disorder_simple(c, NULL, "schedule-list", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, idsp, nidsp))
+    return -1;
+  return 0;
+}
+
+int disorder_search(disorder_client *c, const char *terms, char ***tracksp, int *ntracksp) {
+  int rc = disorder_simple(c, NULL, "search", terms, (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, tracksp, ntracksp))
+    return -1;
+  return 0;
+}
+
+int disorder_set(disorder_client *c, const char *track, const char *pref, const char *value) {
+  return disorder_simple(c, NULL, "set", track, pref, value, (char *)NULL);
+}
+
+int disorder_set_global(disorder_client *c, const char *pref, const char *value) {
+  return disorder_simple(c, NULL, "set-global", pref, value, (char *)NULL);
+}
+
+int disorder_shutdown(disorder_client *c) {
+  return disorder_simple(c, NULL, "shutdown", (char *)NULL);
+}
+
+int disorder_stats(disorder_client *c, char ***statsp, int *nstatsp) {
+  int rc = disorder_simple(c, NULL, "stats", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, statsp, nstatsp))
+    return -1;
+  return 0;
+}
+
+int disorder_tags(disorder_client *c, char ***tagsp, int *ntagsp) {
+  int rc = disorder_simple(c, NULL, "tags", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, tagsp, ntagsp))
+    return -1;
+  return 0;
+}
+
+int disorder_unset(disorder_client *c, const char *track, const char *pref) {
+  return disorder_simple(c, NULL, "unset", track, pref, (char *)NULL);
+}
+
+int disorder_unset_global(disorder_client *c, const char *pref) {
+  return disorder_simple(c, NULL, "unset-global", pref, (char *)NULL);
+}
+
+int disorder_userinfo(disorder_client *c, const char *username, const char *property, char **valuep) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "userinfo", username, property, (char *)NULL);
+  if(rc)
+    return rc;
+  *valuep = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_users(disorder_client *c, char ***usersp, int *nusersp) {
+  int rc = disorder_simple(c, NULL, "users", (char *)NULL);
+  if(rc)
+    return rc;
+  if(readlist(c, usersp, nusersp))
+    return -1;
+  return 0;
+}
+
+int disorder_version(disorder_client *c, char **versionp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 1, "version", (char *)NULL);
+  if(rc)
+    return rc;
+  *versionp = v[0];
+  v[0] = NULL;
+  free_strings(nv, v);
+  return 0;
+}
+
+int disorder_set_volume(disorder_client *c, long left, long right) {
+  return disorder_simple(c, NULL, "volume", disorder__integer, left, disorder__integer, right, (char *)NULL);
+}
+
+int disorder_get_volume(disorder_client *c, long *leftp, long *rightp) {
+  char **v;
+  int nv, rc = disorder_simple_split(c, &v, &nv, 2, "volume", (char *)NULL);
+  if(rc)
+    return rc;
+  *leftp = atol(v[0]);
+  *rightp = atol(v[1]);
+  free_strings(nv, v);
+  return 0;
+}
+
diff --git a/lib/client-stubs.h b/lib/client-stubs.h
new file mode 100644 (file)
index 0000000..1962df2
--- /dev/null
@@ -0,0 +1,773 @@
+/*
+ * Automatically generated file, see scripts/protocol
+ *
+ * DO NOT EDIT.
+ */
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2010-11 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef CLIENT_STUBS_H
+#define CLIENT_STUBS_H
+/** @file lib/client-stubs.h
+ * @brief Generated client API
+ *
+ * Don't include this file directly - use @ref client.h instead.
+ */
+
+/** @brief Adopt a track
+ *
+ * Makes the calling user owner of a randomly picked track.
+ *
+ * @param c Client
+ * @param id Track ID
+ * @return 0 on success, non-0 on error
+ */
+int disorder_adopt(disorder_client *c, const char *id);
+
+/** @brief Create a user
+ *
+ * Create a new user.  Requires the 'admin' right.  Email addresses etc must be filled in in separate commands.
+ *
+ * @param c Client
+ * @param user New username
+ * @param password Initial password
+ * @param rights Initial rights (optional)
+ * @return 0 on success, non-0 on error
+ */
+int disorder_adduser(disorder_client *c, const char *user, const char *password, const char *rights);
+
+/** @brief List files and directories in a directory
+ *
+ * See 'files' and 'dirs' for more specific lists.
+ *
+ * @param c Client
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param filesp List of matching files and directories
+ * @param nfilesp Number of elements in filesp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_allfiles(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp);
+
+/** @brief Confirm registration
+ *
+ * The confirmation string must have been created with 'register'.  The username is returned so the caller knows who they are.
+ *
+ * @param c Client
+ * @param confirmation Confirmation string
+ * @return 0 on success, non-0 on error
+ */
+int disorder_confirm(disorder_client *c, const char *confirmation);
+
+/** @brief Log in with a cookie
+ *
+ * The cookie must have been created with 'make-cookie'.  The username is returned so the caller knows who they are.
+ *
+ * @param c Client
+ * @param cookie Cookie string
+ * @return 0 on success, non-0 on error
+ */
+int disorder_cookie(disorder_client *c, const char *cookie);
+
+/** @brief Delete user
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @param user User to delete
+ * @return 0 on success, non-0 on error
+ */
+int disorder_deluser(disorder_client *c, const char *user);
+
+/** @brief List directories in a directory
+ *
+ * 
+ *
+ * @param c Client
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param filesp List of matching directories
+ * @param nfilesp Number of elements in filesp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_dirs(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp);
+
+/** @brief Disable play
+ *
+ * Play will stop at the end of the current track, if one is playing.  Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_disable(disorder_client *c);
+
+/** @brief Set a user property
+ *
+ * With the 'admin' right you can do anything.  Otherwise you need the 'userinfo' right and can only set 'email' and 'password'.
+ *
+ * @param c Client
+ * @param username User to modify
+ * @param property Property name
+ * @param value New property value
+ * @return 0 on success, non-0 on error
+ */
+int disorder_edituser(disorder_client *c, const char *username, const char *property, const char *value);
+
+/** @brief Enable play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_enable(disorder_client *c);
+
+/** @brief Detect whether play is enabled
+ *
+ * 
+ *
+ * @param c Client
+ * @param enabledp 1 if play is enabled and 0 otherwise
+ * @return 0 on success, non-0 on error
+ */
+int disorder_enabled(disorder_client *c, int *enabledp);
+
+/** @brief Test whether a track exists
+ *
+ * 
+ *
+ * @param c Client
+ * @param track Track name
+ * @param existsp 1 if the track exists and 0 otherwise
+ * @return 0 on success, non-0 on error
+ */
+int disorder_exists(disorder_client *c, const char *track, int *existsp);
+
+/** @brief List files in a directory
+ *
+ * 
+ *
+ * @param c Client
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param filesp List of matching files
+ * @param nfilesp Number of elements in filesp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_files(disorder_client *c, const char *dir, const char *re, char ***filesp, int *nfilesp);
+
+/** @brief Get a track preference
+ *
+ * If the track does not exist that is an error.  If the track exists but the preference does not then a null value is returned.
+ *
+ * @param c Client
+ * @param track Track name
+ * @param pref Preference name
+ * @param valuep Preference value
+ * @return 0 on success, non-0 on error
+ */
+int disorder_get(disorder_client *c, const char *track, const char *pref, char **valuep);
+
+/** @brief Get a global preference
+ *
+ * If the preference does exist not then a null value is returned.
+ *
+ * @param c Client
+ * @param pref Global preference name
+ * @param valuep Preference value
+ * @return 0 on success, non-0 on error
+ */
+int disorder_get_global(disorder_client *c, const char *pref, char **valuep);
+
+/** @brief Get a track's length
+ *
+ * If the track does not exist an error is returned.
+ *
+ * @param c Client
+ * @param track Track name
+ * @param lengthp Track length in seconds
+ * @return 0 on success, non-0 on error
+ */
+int disorder_length(disorder_client *c, const char *track, long *lengthp);
+
+/** @brief Create a login cookie for this user
+ *
+ * The cookie may be redeemed via the 'cookie' command
+ *
+ * @param c Client
+ * @param cookiep Newly created cookie
+ * @return 0 on success, non-0 on error
+ */
+int disorder_make_cookie(disorder_client *c, char **cookiep);
+
+/** @brief Move a track
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param track Track ID or name
+ * @param delta How far to move the track towards the head of the queue
+ * @return 0 on success, non-0 on error
+ */
+int disorder_move(disorder_client *c, const char *track, long delta);
+
+/** @brief Move multiple tracks
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param target Move after this track, or to head if ""
+ * @param ids List of tracks to move by ID
+ * @param nids Length of ids
+ * @return 0 on success, non-0 on error
+ */
+int disorder_moveafter(disorder_client *c, const char *target, char **ids, int nids);
+
+/** @brief List recently added tracks
+ *
+ * 
+ *
+ * @param c Client
+ * @param max Maximum tracks to fetch, or 0 for all available
+ * @param tracksp Recently added tracks
+ * @param ntracksp Number of elements in tracksp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_new_tracks(disorder_client *c, long max, char ***tracksp, int *ntracksp);
+
+/** @brief Do nothing
+ *
+ * Used as a keepalive.  No authentication required.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_nop(disorder_client *c);
+
+/** @brief Get a track name part
+ *
+ * If the name part cannot be constructed an empty string is returned.
+ *
+ * @param c Client
+ * @param track Track name
+ * @param context Context ("sort" or "display")
+ * @param part Name part ("artist", "album" or "title")
+ * @param partp Value of name part
+ * @return 0 on success, non-0 on error
+ */
+int disorder_part(disorder_client *c, const char *track, const char *context, const char *part, char **partp);
+
+/** @brief Pause the currently playing track
+ *
+ * Requires the 'pause' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_pause(disorder_client *c);
+
+/** @brief Play a track
+ *
+ * Requires the 'play' right.
+ *
+ * @param c Client
+ * @param track Track to play
+ * @param idp Queue ID of new track
+ * @return 0 on success, non-0 on error
+ */
+int disorder_play(disorder_client *c, const char *track, char **idp);
+
+/** @brief Play multiple tracks
+ *
+ * Requires the 'play' right.
+ *
+ * @param c Client
+ * @param target Insert into queue after this track, or at head if ""
+ * @param tracks List of track names to play
+ * @param ntracks Length of tracks
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playafter(disorder_client *c, const char *target, char **tracks, int ntracks);
+
+/** @brief Retrieve the playing track
+ *
+ * 
+ *
+ * @param c Client
+ * @param playingp Details of the playing track
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playing(disorder_client *c, struct queue_entry **playingp);
+
+/** @brief Delete a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist.
+ *
+ * @param c Client
+ * @param playlist Playlist to delete
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_delete(disorder_client *c, const char *playlist);
+
+/** @brief List the contents of a playlist
+ *
+ * Requires the 'read' right and oermission to read the playlist.
+ *
+ * @param c Client
+ * @param playlist Playlist name
+ * @param tracksp List of tracks in playlist
+ * @param ntracksp Number of elements in tracksp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_get(disorder_client *c, const char *playlist, char ***tracksp, int *ntracksp);
+
+/** @brief Get a playlist's sharing status
+ *
+ * Requires the 'read' right and permission to read the playlist.
+ *
+ * @param c Client
+ * @param playlist Playlist to read
+ * @param sharep Sharing status ("public", "private" or "shared")
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_get_share(disorder_client *c, const char *playlist, char **sharep);
+
+/** @brief Lock a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist.  A given connection may lock at most one playlist.
+ *
+ * @param c Client
+ * @param playlist Playlist to delete
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_lock(disorder_client *c, const char *playlist);
+
+/** @brief Set the contents of a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist, which must be locked.
+ *
+ * @param c Client
+ * @param playlist Playlist to modify
+ * @param tracks New list of tracks for playlist
+ * @param ntracks Length of tracks
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_set(disorder_client *c, const char *playlist, char **tracks, int ntracks);
+
+/** @brief Set a playlist's sharing status
+ *
+ * Requires the 'play' right and permission to modify the playlist.
+ *
+ * @param c Client
+ * @param playlist Playlist to modify
+ * @param share New sharing status ("public", "private" or "shared")
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_set_share(disorder_client *c, const char *playlist, const char *share);
+
+/** @brief Unlock the locked playlist playlist
+ *
+ * The playlist to unlock is implicit in the connection.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlist_unlock(disorder_client *c);
+
+/** @brief List playlists
+ *
+ * Requires the 'read' right.  Only playlists that you have permission to read are returned.
+ *
+ * @param c Client
+ * @param playlistsp Playlist names
+ * @param nplaylistsp Number of elements in playlistsp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playlists(disorder_client *c, char ***playlistsp, int *nplaylistsp);
+
+/** @brief Get all the preferences for a track
+ *
+ * 
+ *
+ * @param c Client
+ * @param track Track name
+ * @param prefsp Track preferences
+ * @return 0 on success, non-0 on error
+ */
+int disorder_prefs(disorder_client *c, const char *track, struct kvp **prefsp);
+
+/** @brief List the queue
+ *
+ * 
+ *
+ * @param c Client
+ * @param queuep Current queue contents
+ * @return 0 on success, non-0 on error
+ */
+int disorder_queue(disorder_client *c, struct queue_entry **queuep);
+
+/** @brief Disable random play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_random_disable(disorder_client *c);
+
+/** @brief Enable random play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_random_enable(disorder_client *c);
+
+/** @brief Detect whether random play is enabled
+ *
+ * Random play counts as enabled even if play is disabled.
+ *
+ * @param c Client
+ * @param enabledp 1 if random play is enabled and 0 otherwise
+ * @return 0 on success, non-0 on error
+ */
+int disorder_random_enabled(disorder_client *c, int *enabledp);
+
+/** @brief List recently played tracks
+ *
+ * 
+ *
+ * @param c Client
+ * @param recentp Recently played tracks
+ * @return 0 on success, non-0 on error
+ */
+int disorder_recent(disorder_client *c, struct queue_entry **recentp);
+
+/** @brief Re-read configuraiton file.
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_reconfigure(disorder_client *c);
+
+/** @brief Register a new user
+ *
+ * Requires the 'register' right which is usually only available to the 'guest' user.  Redeem the confirmation string via 'confirm' to complete registration.
+ *
+ * @param c Client
+ * @param username Requested new username
+ * @param password Requested initial password
+ * @param email New user's email address
+ * @param confirmationp Confirmation string
+ * @return 0 on success, non-0 on error
+ */
+int disorder_register(disorder_client *c, const char *username, const char *password, const char *email, char **confirmationp);
+
+/** @brief Send a password reminder.
+ *
+ * If the user has no valid email address, or no password, or a reminder has been sent too recently, then no reminder will be sent.
+ *
+ * @param c Client
+ * @param username User to remind
+ * @return 0 on success, non-0 on error
+ */
+int disorder_reminder(disorder_client *c, const char *username);
+
+/** @brief Remove a track form the queue.
+ *
+ * Requires one of the 'remove mine', 'remove random' or 'remove any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param id Track ID
+ * @return 0 on success, non-0 on error
+ */
+int disorder_remove(disorder_client *c, const char *id);
+
+/** @brief Rescan all collections for new or obsolete tracks.
+ *
+ * Requires the 'rescan' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_rescan(disorder_client *c);
+
+/** @brief Resolve a track name
+ *
+ * Converts aliases to non-alias track names
+ *
+ * @param c Client
+ * @param track Track name (might be an alias)
+ * @param resolvedp Resolve track name (definitely not an alias)
+ * @return 0 on success, non-0 on error
+ */
+int disorder_resolve(disorder_client *c, const char *track, char **resolvedp);
+
+/** @brief Resume the currently playing track
+ *
+ * Requires the 'pause' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_resume(disorder_client *c);
+
+/** @brief Revoke a cookie.
+ *
+ * It will not subsequently be possible to log in with the cookie.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_revoke(disorder_client *c);
+
+/** @brief Get the server's RTP address information
+ *
+ * 
+ *
+ * @param c Client
+ * @param addressp Where to store hostname or address
+ * @param portp Where to store service name or port number
+ * @return 0 on success, non-0 on error
+ */
+int disorder_rtp_address(disorder_client *c, char **addressp, char **portp);
+
+/** @brief Terminate the playing track.
+ *
+ * Requires one of the 'scratch mine', 'scratch random' or 'scratch any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param id Track ID (optional)
+ * @return 0 on success, non-0 on error
+ */
+int disorder_scratch(disorder_client *c, const char *id);
+
+/** @brief Schedule a track to play in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param when When to play the track
+ * @param priority Event priority ("normal" or "junk")
+ * @param track Track to play
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_add_play(disorder_client *c, time_t when, const char *priority, const char *track);
+
+/** @brief Schedule a global setting to be changed in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param when When to change the setting
+ * @param priority Event priority ("normal" or "junk")
+ * @param pref Global preference to set
+ * @param value New value of global preference
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_add_set_global(disorder_client *c, time_t when, const char *priority, const char *pref, const char *value);
+
+/** @brief Schedule a global setting to be unset in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param when When to change the setting
+ * @param priority Event priority ("normal" or "junk")
+ * @param pref Global preference to set
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_add_unset_global(disorder_client *c, time_t when, const char *priority, const char *pref);
+
+/** @brief Delete a scheduled event.
+ *
+ * Users can always delete their own scheduled events; with the admin right you can delete any event.
+ *
+ * @param c Client
+ * @param event ID of event to delete
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_del(disorder_client *c, const char *event);
+
+/** @brief Get the details of scheduled event
+ *
+ * 
+ *
+ * @param c Client
+ * @param id Event ID
+ * @param actiondatap Details of event
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_get(disorder_client *c, const char *id, struct kvp **actiondatap);
+
+/** @brief List scheduled events
+ *
+ * This just lists IDs.  Use 'schedule-get' to retrieve more detail
+ *
+ * @param c Client
+ * @param idsp List of event IDs
+ * @param nidsp Number of elements in idsp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_schedule_list(disorder_client *c, char ***idsp, int *nidsp);
+
+/** @brief Search for tracks
+ *
+ * Terms are either keywords or tags formatted as 'tag:TAG-NAME'.
+ *
+ * @param c Client
+ * @param terms List of search terms
+ * @param tracksp List of matching tracks
+ * @param ntracksp Number of elements in tracksp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_search(disorder_client *c, const char *terms, char ***tracksp, int *ntracksp);
+
+/** @brief Set a track preference
+ *
+ * Requires the 'prefs' right.
+ *
+ * @param c Client
+ * @param track Track name
+ * @param pref Preference name
+ * @param value New value
+ * @return 0 on success, non-0 on error
+ */
+int disorder_set(disorder_client *c, const char *track, const char *pref, const char *value);
+
+/** @brief Set a global preference
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param pref Preference name
+ * @param value New value
+ * @return 0 on success, non-0 on error
+ */
+int disorder_set_global(disorder_client *c, const char *pref, const char *value);
+
+/** @brief Request server shutdown
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @return 0 on success, non-0 on error
+ */
+int disorder_shutdown(disorder_client *c);
+
+/** @brief Get server statistics
+ *
+ * The details of what the server reports are not really defined.  The returned strings are intended to be printed out one to a line.
+ *
+ * @param c Client
+ * @param statsp List of server information strings.
+ * @param nstatsp Number of elements in statsp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_stats(disorder_client *c, char ***statsp, int *nstatsp);
+
+/** @brief Get a list of known tags
+ *
+ * Only tags which apply to at least one track are returned.
+ *
+ * @param c Client
+ * @param tagsp List of tags
+ * @param ntagsp Number of elements in tagsp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_tags(disorder_client *c, char ***tagsp, int *ntagsp);
+
+/** @brief Unset a track preference
+ *
+ * Requires the 'prefs' right.
+ *
+ * @param c Client
+ * @param track Track name
+ * @param pref Preference name
+ * @return 0 on success, non-0 on error
+ */
+int disorder_unset(disorder_client *c, const char *track, const char *pref);
+
+/** @brief Set a global preference
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param pref Preference name
+ * @return 0 on success, non-0 on error
+ */
+int disorder_unset_global(disorder_client *c, const char *pref);
+
+/** @brief Get a user property.
+ *
+ * If the user does not exist an error is returned, if the user exists but the property does not then a null value is returned.
+ *
+ * @param c Client
+ * @param username User to read
+ * @param property Property to read
+ * @param valuep Value of property
+ * @return 0 on success, non-0 on error
+ */
+int disorder_userinfo(disorder_client *c, const char *username, const char *property, char **valuep);
+
+/** @brief Get a list of users
+ *
+ * 
+ *
+ * @param c Client
+ * @param usersp List of users
+ * @param nusersp Number of elements in usersp
+ * @return 0 on success, non-0 on error
+ */
+int disorder_users(disorder_client *c, char ***usersp, int *nusersp);
+
+/** @brief Get the server version
+ *
+ * 
+ *
+ * @param c Client
+ * @param versionp Server version string
+ * @return 0 on success, non-0 on error
+ */
+int disorder_version(disorder_client *c, char **versionp);
+
+/** @brief Set the volume
+ *
+ * 
+ *
+ * @param c Client
+ * @param left Left channel volume
+ * @param right Right channel volume
+ * @return 0 on success, non-0 on error
+ */
+int disorder_set_volume(disorder_client *c, long left, long right);
+
+/** @brief Get the volume
+ *
+ * 
+ *
+ * @param c Client
+ * @param leftp Left channel volume
+ * @param rightp Right channel volume
+ * @return 0 on success, non-0 on error
+ */
+int disorder_get_volume(disorder_client *c, long *leftp, long *rightp);
+
+#endif
index 67f8a530f156d6ac0da7d821f48551b164c97c45..55cfe1c838002147e0382a6eac42c0e5a8a5f0cf 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,7 +50,6 @@
 #include "authhash.h"
 #include "client-common.h"
 #include "rights.h"
-#include "trackdb.h"
 #include "kvp.h"
 
 /** @brief Client handle contents */
@@ -141,10 +140,12 @@ static int check_response(disorder_client *c, char **rp) {
   else if(rc / 100 == 2) {
     if(rp)
       *rp = (rc % 10 == 9) ? 0 : xstrdup(r + 4);
+    xfree(r);
     return 0;
   } else {
     if(c->verbose)
       disorder_error(0, "from %s: %s", c->ident, utf82mb(r));
+    xfree(r);
     return rc;
   }
 }
@@ -153,8 +154,6 @@ static int check_response(disorder_client *c, char **rp) {
  * @param c Client
  * @param rp Where to store result, or NULL
  * @param cmd Command
- * @param body Body or NULL
- * @param nbody Length of body or -1
  * @param ap Arguments (UTF-8), terminated by (char *)0
  * @return 0 on success, non-0 on error
  *
@@ -166,22 +165,35 @@ static int check_response(disorder_client *c, char **rp) {
  * NB that the response will NOT be converted to the local encoding
  * nor will quotes be stripped.  See dequote().
  *
- * If @p body is not NULL then the body is sent immediately after the
- * command.  @p nbody should be the number of lines or @c -1 to count
- * them if @p body is NULL-terminated.
+ * Put @ref disorder__body in the argument list followed by a char **
+ * and int giving the body to follow the command.  If the int is @c -1
+ * then the list is assumed to be NULL-terminated.  This may be used
+ * only once.
+ *
+ * Put @ref disorder__list in the argument list followed by a char **
+ * and int giving a list of arguments to include.  If the int is @c -1
+ * then the list is assumed to be NULL-terminated.  This may be used
+ * any number of times.
+ *
+ * Put @ref disorder__integer in the argument list followed by a long to
+ * send its value in decimal.  This may be used any number of times.
+ *
+ * Put @ref disorder__time in the argument list followed by a time_t
+ * to send its value in decimal.  This may be used any number of
+ * times.
  *
  * Usually you would call this via one of the following interfaces:
  * - disorder_simple()
- * - disorder_simple_body()
- * - disorder_simple_list()
  */
 static int disorder_simple_v(disorder_client *c,
                             char **rp,
                             const char *cmd,
-                             char **body, int nbody,
                              va_list ap) {
   const char *arg;
   struct dynstr d;
+  char **body = NULL;
+  int nbody = 0;
+  int has_body = 0;
 
   if(!c->fpout) {
     c->last = "not connected";
@@ -192,15 +204,45 @@ static int disorder_simple_v(disorder_client *c,
     dynstr_init(&d);
     dynstr_append_string(&d, cmd);
     while((arg = va_arg(ap, const char *))) {
-      dynstr_append(&d, ' ');
-      dynstr_append_string(&d, quoteutf8(arg));
+      if(arg == disorder__body) {
+       body = va_arg(ap, char **);
+       nbody = va_arg(ap, int);
+       has_body = 1;
+      } else if(arg == disorder__list) {
+       char **list = va_arg(ap, char **);
+       int nlist = va_arg(ap, int);
+       if(nlist < 0) {
+         for(nlist = 0; list[nlist]; ++nlist)
+           ;
+       }
+       for(int n = 0; n < nlist; ++n) {
+         dynstr_append(&d, ' ');
+         dynstr_append_string(&d, quoteutf8(arg));
+       }
+      } else if(arg == disorder__integer) {
+       long n = va_arg(ap, long);
+       char buffer[16];
+       snprintf(buffer, sizeof buffer, "%ld", n);
+       dynstr_append(&d, ' ');
+       dynstr_append_string(&d, buffer);
+      } else if(arg == disorder__time) {
+       time_t n = va_arg(ap, time_t);
+       char buffer[16];
+       snprintf(buffer, sizeof buffer, "%lld", (long long)n);
+       dynstr_append(&d, ' ');
+       dynstr_append_string(&d, buffer);
+      } else {
+       dynstr_append(&d, ' ');
+       dynstr_append_string(&d, quoteutf8(arg));
+      }
     }
     dynstr_append(&d, '\n');
     dynstr_terminate(&d);
     D(("command: %s", d.vec));
     if(fputs(d.vec, c->fpout) < 0)
       goto write_error;
-    if(body) {
+    xfree(d.vec);
+    if(has_body) {
       if(nbody < 0)
         for(nbody = 0; body[nbody]; ++nbody)
           ;
@@ -250,31 +292,61 @@ static int disorder_simple(disorder_client *c,
   int ret;
 
   va_start(ap, cmd);
-  ret = disorder_simple_v(c, rp, cmd, 0, 0, ap);
+  ret = disorder_simple_v(c, rp, cmd, ap);
   va_end(ap);
   return ret;
 }
 
-/** @brief Issue a command with a body and parse a simple response
+/** @brief Issue a command and split the response
  * @param c Client
- * @param rp Where to store result, or NULL (UTF-8)
- * @param body Pointer to body
- * @param nbody Size of body
+ * @param vecp Where to store results
+ * @param nvecp Where to store count of results
+ * @param expected Expected count (or -1 to not check)
  * @param cmd Command
  * @return 0 on success, non-0 on error
  *
- * See disorder_simple().
+ * The remaining arguments are command arguments, terminated by (char
+ * *)0.  They should be in UTF-8.
+ *
+ * 5xx responses count as errors.
+ *
+ * @p rp will NOT be filled in for xx9 responses (where it is just
+ * commentary for a command where it would normally be meaningful).
+ *
+ * NB that the response will NOT be converted to the local encoding
+ * nor will quotes be stripped.  See dequote().
  */
-static int disorder_simple_body(disorder_client *c,
-                                char **rp,
-                                char **body, int nbody,
-                                const char *cmd, ...) {
+static int disorder_simple_split(disorder_client *c,
+                                char ***vecp,
+                                int *nvecp,
+                                int expected,
+                                const char *cmd, ...) {
   va_list ap;
   int ret;
+  char *r;
+  char **vec;
+  int nvec;
 
   va_start(ap, cmd);
-  ret = disorder_simple_v(c, rp, cmd, body, nbody, ap);
+  ret = disorder_simple_v(c, &r, cmd, ap);
   va_end(ap);
+  if(!ret) {
+    vec = split(r, &nvec, SPLIT_QUOTES, 0, 0);
+    xfree(r);
+    if(expected < 0 || nvec == expected) {
+      *vecp = vec;
+      *nvecp = nvec;
+    } else {
+      disorder_error(0, "malformed reply to %s", cmd);
+      c->last = "malformed reply";
+      ret = -1;
+      free_strings(nvec, vec);
+    }
+  }
+  if(ret) {
+    *vecp = NULL;
+    *nvecp = 0;
+  }
   return ret;
 }
 
@@ -291,7 +363,9 @@ static int dequote(int rc, char **rp) {
 
   if(!rc) {
     if((rr = split(*rp, 0, SPLIT_QUOTES, 0, 0)) && *rr) {
+      xfree(*rp);
       *rp = *rr;
+      xfree(rr);
       return 0;
     }
     disorder_error(0, "invalid reply: %s", *rp);
@@ -316,13 +390,13 @@ int disorder_connect_generic(struct config *conf,
                              const char *username,
                              const char *password,
                              const char *cookie) {
-  int fd = -1, fd2 = -1, nrvec, rc;
-  unsigned char *nonce;
+  int fd = -1, fd2 = -1, nrvec = 0, rc;
+  unsigned char *nonce = NULL;
   size_t nl;
-  const char *res;
-  char *r, **rvec;
+  char *res = NULL;
+  char *r = NULL, **rvec = NULL;
   const char *protocol, *algorithm, *challenge;
-  struct sockaddr *sa;
+  struct sockaddr *sa = NULL;
   socklen_t salen;
 
   if((salen = find_server(conf, &sa, &c->ident)) == (socklen_t)-1)
@@ -364,14 +438,14 @@ int disorder_connect_generic(struct config *conf,
     disorder_error(0, "cannot parse server greeting %s", r);
     goto error;
   }
-  protocol = *rvec++;
+  protocol = rvec[0];
   if(strcmp(protocol, "2")) {
     c->last = "unknown protocol version";
     disorder_error(0, "unknown protocol version: %s", protocol);
     goto error;
   }
-  algorithm = *rvec++;
-  challenge = *rvec++;
+  algorithm = rvec[1];
+  challenge = rvec[2];
   if(!(nonce = unhex(challenge, &nl)))
     goto error;
   if(cookie) {
@@ -391,6 +465,11 @@ int disorder_connect_generic(struct config *conf,
   if((rc = disorder_simple(c, 0, "user", username, res, (char *)0)))
     goto error_rc;
   c->user = xstrdup(username);
+  xfree(res);
+  free_strings(nrvec, rvec);
+  xfree(nonce);
+  xfree(sa);
+  xfree(r);
   return 0;
 error:
   rc = -1;
@@ -441,13 +520,13 @@ int disorder_connect(disorder_client *c) {
     return -1;
   }
   password = config->password;
-  /* Maybe we can read the database */
-  if(!password && trackdb_readable()) {
-    trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
-    trackdb_open(TRACKDB_READ_ONLY);
-    password = trackdb_get_password(username);
-    trackdb_close();
-  }
+  /* If we're connecting as 'root' guess that we're the system root
+   * user (or the jukebox user), both of which can use the privileged
+   * socket.  They can also furtle with the db directly: that is why
+   * privileged socket does not represent a privilege escalation. */
+  if(!password
+     && !strcmp(username, "root"))
+    password = "anything will do for root";
   if(!password) {
     /* Oh well */
     c->last = "no password";
@@ -505,98 +584,11 @@ int disorder_close(disorder_client *c) {
     }
     c->fpout = 0;
   }
+  xfree(c->ident);
   c->ident = 0;
+  xfree(c->user);
   c->user = 0;
-  return 0;
-}
-
-/** @brief Play a track
- * @param c Client
- * @param track Track to play (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_play(disorder_client *c, const char *track) {
-  return disorder_simple(c, 0, "play", track, (char *)0);
-}
-
-/** @brief Remove a track
- * @param c Client
- * @param track Track to remove (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_remove(disorder_client *c, const char *track) {
-  return disorder_simple(c, 0, "remove", track, (char *)0);
-}
-
-/** @brief Move a track
- * @param c Client
- * @param track Track to move (UTF-8)
- * @param delta Distance to move by
- * @return 0 on success, non-0 on error
- */
-int disorder_move(disorder_client *c, const char *track, int delta) {
-  char d[16];
-
-  byte_snprintf(d, sizeof d, "%d", delta);
-  return disorder_simple(c, 0, "move", track, d, (char *)0);
-}
-
-/** @brief Enable play
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_enable(disorder_client *c) {
-  return disorder_simple(c, 0, "enable", (char *)0);
-}
-
-/** @brief Disable play
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_disable(disorder_client *c) {
-  return disorder_simple(c, 0, "disable", (char *)0);
-}
-
-/** @brief Scratch the currently playing track
- * @param id Playing track ID or NULL (UTF-8)
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_scratch(disorder_client *c, const char *id) {
-  return disorder_simple(c, 0, "scratch", id, (char *)0);
-}
-
-/** @brief Shut down the server
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_shutdown(disorder_client *c) {
-  return disorder_simple(c, 0, "shutdown", (char *)0);
-}
-
-/** @brief Make the server re-read its configuration
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_reconfigure(disorder_client *c) {
-  return disorder_simple(c, 0, "reconfigure", (char *)0);
-}
-
-/** @brief Rescan tracks
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_rescan(disorder_client *c) {
-  return disorder_simple(c, 0, "rescan", (char *)0);
-}
-
-/** @brief Get server version number
- * @param c Client
- * @param rp Where to store version string (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_version(disorder_client *c, char **rp) {
-  return dequote(disorder_simple(c, rp, "version", (char *)0), rp);
+  return ret;
 }
 
 static void client_error(const char *msg,
@@ -604,19 +596,19 @@ static void client_error(const char *msg,
   disorder_error(0, "error parsing reply: %s", msg);
 }
 
-/** @brief Get currently playing track
+/** @brief Get a single queue entry
  * @param c Client
+ * @param cmd Command
  * @param qp Where to store track information
  * @return 0 on success, non-0 on error
- *
- * @p qp gets NULL if no track is playing.
  */
-int disorder_playing(disorder_client *c, struct queue_entry **qp) {
+static int onequeue(disorder_client *c, const char *cmd,
+                   struct queue_entry **qp) {
   char *r;
   struct queue_entry *q;
   int rc;
 
-  if((rc = disorder_simple(c, &r, "playing", (char *)0)))
+  if((rc = disorder_simple(c, &r, cmd, (char *)0)))
     return rc;
   if(r) {
     q = xmalloc(sizeof *q);
@@ -629,18 +621,16 @@ int disorder_playing(disorder_client *c, struct queue_entry **qp) {
 }
 
 /** @brief Fetch the queue, recent list, etc */
-static int disorder_somequeue(disorder_client *c,
-                             const char *cmd, struct queue_entry **qp) {
+static int readqueue(disorder_client *c,
+                    struct queue_entry **qp) {
   struct queue_entry *qh, **qt = &qh, *q;
   char *l;
-  int rc;
 
-  if((rc = disorder_simple(c, 0, cmd, (char *)0)))
-    return rc;
   while(inputline(c->ident, c->fpin, &l, '\n') >= 0) {
     if(!strcmp(l, ".")) {
       *qt = 0;
       *qp = qh;
+      xfree(l);
       return 0;
     }
     q = xmalloc(sizeof *q);
@@ -648,39 +638,18 @@ static int disorder_somequeue(disorder_client *c,
       *qt = q;
       qt = &q->next;
     }
+    xfree(l);
   }
   if(ferror(c->fpin)) {
     byte_xasprintf((char **)&c->last, "input error: %s", strerror(errno));
     disorder_error(errno, "error reading %s", c->ident);
   } else {
-    c->last = "input error: unexpxected EOF";
+    c->last = "input error: unexpected EOF";
     disorder_error(0, "error reading %s: unexpected EOF", c->ident);
   }
   return -1;
 }
 
-/** @brief Get recently played tracks
- * @param c Client
- * @param qp Where to store track information
- * @return 0 on success, non-0 on error
- *
- * The last entry in the list is the most recently played track.
- */
-int disorder_recent(disorder_client *c, struct queue_entry **qp) {
-  return disorder_somequeue(c, "recent", qp);
-}
-
-/** @brief Get queue
- * @param c Client
- * @param qp Where to store track information
- * @return 0 on success, non-0 on error
- *
- * The first entry in the list will be played next.
- */
-int disorder_queue(disorder_client *c, struct queue_entry **qp) {
-  return disorder_somequeue(c, "queue", qp);
-}
-
 /** @brief Read a dot-stuffed list
  * @param c Client
  * @param vecp Where to store list (UTF-8)
@@ -700,9 +669,11 @@ static int readlist(disorder_client *c, char ***vecp, int *nvecp) {
       if(nvecp)
        *nvecp = v.nvec;
       *vecp = v.vec;
+      xfree(l);
       return 0;
     }
-    vector_append(&v, l + (*l == '.'));
+    vector_append(&v, xstrdup(l + (*l == '.')));
+    xfree(l);
   }
   if(ferror(c->fpin)) {
     byte_xasprintf((char **)&c->last, "input error: %s", strerror(errno));
@@ -714,72 +685,6 @@ static int readlist(disorder_client *c, char ***vecp, int *nvecp) {
   return -1;
 }
 
-/** @brief Issue a comamnd and get a list response
- * @param c Client
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @param cmd Command
- * @return 0 on success, non-0 on error
- *
- * The remaining arguments are command arguments, terminated by (char
- * *)0.  They should be in UTF-8.
- *
- * 5xx responses count as errors.
- *
- * See disorder_simple().
- */
-static int disorder_simple_list(disorder_client *c,
-                               char ***vecp, int *nvecp,
-                               const char *cmd, ...) {
-  va_list ap;
-  int ret;
-
-  va_start(ap, cmd);
-  ret = disorder_simple_v(c, 0, cmd, 0, 0, ap);
-  va_end(ap);
-  if(ret) return ret;
-  return readlist(c, vecp, nvecp);
-}
-
-/** @brief List directories below @p dir
- * @param c Client
- * @param dir Directory to list, or NULL for root (UTF-8)
- * @param re Regexp that results must match, or NULL (UTF-8)
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_directories(disorder_client *c, const char *dir, const char *re,
-                        char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "dirs", dir, re, (char *)0);
-}
-
-/** @brief List files below @p dir
- * @param c Client
- * @param dir Directory to list, or NULL for root (UTF-8)
- * @param re Regexp that results must match, or NULL (UTF-8)
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_files(disorder_client *c, const char *dir, const char *re,
-                  char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "files", dir, re, (char *)0);
-}
-
-/** @brief List files and directories below @p dir
- * @param c Client
- * @param dir Directory to list, or NULL for root (UTF-8)
- * @param re Regexp that results must match, or NULL (UTF-8)
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_allfiles(disorder_client *c, const char *dir, const char *re,
-                     char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "allfiles", dir, re, (char *)0);
-}
-
 /** @brief Return the user we logged in with
  * @param c Client
  * @return User name (owned by @p c, don't modify)
@@ -788,72 +693,45 @@ char *disorder_user(disorder_client *c) {
   return c->user;
 }
 
-/** @brief Set a track preference
- * @param c Client
- * @param track Track name (UTF-8)
- * @param key Preference name (UTF-8)
- * @param value Preference value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_set(disorder_client *c, const char *track,
-                const char *key, const char *value) {
-  return disorder_simple(c, 0, "set", track, key, value, (char *)0);
-}
-
-/** @brief Unset a track preference
- * @param c Client
- * @param track Track name (UTF-8)
- * @param key Preference name (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_unset(disorder_client *c, const char *track,
-                  const char *key) {
-  return disorder_simple(c, 0, "unset", track, key, (char *)0);
-}
-
-/** @brief Get a track preference
- * @param c Client
- * @param track Track name (UTF-8)
- * @param key Preference name (UTF-8)
- * @param valuep Where to store preference value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_get(disorder_client *c,
-                const char *track, const char *key, char **valuep) {
-  return dequote(disorder_simple(c, valuep, "get", track, key, (char *)0),
-                valuep);
-}
-
-static void pref_error_handler(const char *msg,
+static void pairlist_error_handler(const char *msg,
                               void attribute((unused)) *u) {
-  disorder_error(0, "error handling 'prefs' reply: %s", msg);
+  disorder_error(0, "error handling key-value pair reply: %s", msg);
 }
 
-/** @brief Get all preferences for a trcak
+/** @brief Get a list of key-value pairs
  * @param c Client
- * @param track Track name
  * @param kp Where to store linked list of preferences
+ * @param cmd Command
+ * @param ... Arguments
  * @return 0 on success, non-0 on error
  */
-int disorder_prefs(disorder_client *c, const char *track, struct kvp **kp) {
+static int pairlist(disorder_client *c, struct kvp **kp, const char *cmd, ...) {
   char **vec, **pvec;
   int nvec, npvec, n, rc;
   struct kvp *k;
+  va_list ap;
 
-  if((rc = disorder_simple_list(c, &vec, &nvec, "prefs", track, (char *)0)))
+  va_start(ap, cmd);
+  rc = disorder_simple_v(c, 0, cmd, ap);
+  va_end(ap);
+  if(rc)
     return rc;
+  if((rc = readlist(c, &vec, &nvec)))
+     return rc;
   for(n = 0; n < nvec; ++n) {
-    if(!(pvec = split(vec[n], &npvec, SPLIT_QUOTES, pref_error_handler, 0)))
+    if(!(pvec = split(vec[n], &npvec, SPLIT_QUOTES, pairlist_error_handler, 0)))
       return -1;
     if(npvec != 2) {
-      pref_error_handler("malformed response", 0);
+      pairlist_error_handler("malformed response", 0);
       return -1;
     }
     *kp = k = xmalloc(sizeof *k);
     k->name = pvec[0];
     k->value = pvec[1];
     kp = &k->next;
+    xfree(pvec);
   }
+  free_strings(nvec, vec);
   *kp = 0;
   return 0;
 }
@@ -875,142 +753,6 @@ static int boolean(const char *cmd, const char *value,
   return 0;
 }
 
-/** @brief Test whether a track exists
- * @param c Client
- * @param track Track name (UTF-8)
- * @param existsp Where to store result (non-0 iff does exist)
- * @return 0 on success, non-0 on error
- */
-int disorder_exists(disorder_client *c, const char *track, int *existsp) {
-  char *v;
-  int rc;
-
-  if((rc = disorder_simple(c, &v, "exists", track, (char *)0)))
-    return rc;
-  return boolean("exists", v, existsp);
-}
-
-/** @brief Test whether playing is enabled
- * @param c Client
- * @param enabledp Where to store result (non-0 iff enabled)
- * @return 0 on success, non-0 on error
- */
-int disorder_enabled(disorder_client *c, int *enabledp) {
-  char *v;
-  int rc;
-
-  if((rc = disorder_simple(c, &v, "enabled", (char *)0)))
-    return rc;
-  return boolean("enabled", v, enabledp);
-}
-
-/** @brief Get the length of a track
- * @param c Client
- * @param track Track name (UTF-8)
- * @param valuep Where to store length in seconds
- * @return 0 on success, non-0 on error
- *
- * If the length is unknown 0 is returned.
- */
-int disorder_length(disorder_client *c, const char *track,
-                   long *valuep) {
-  char *value;
-  int rc;
-
-  if((rc = disorder_simple(c, &value, "length", track, (char *)0)))
-    return rc;
-  *valuep = atol(value);
-  return 0;
-}
-
-/** @brief Search for tracks
- * @param c Client
- * @param terms Search terms (UTF-8)
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_search(disorder_client *c, const char *terms,
-                   char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "search", terms, (char *)0);
-}
-
-/** @brief Enable random play
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_random_enable(disorder_client *c) {
-  return disorder_simple(c, 0, "random-enable", (char *)0);
-}
-
-/** @brief Disable random play
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_random_disable(disorder_client *c) {
-  return disorder_simple(c, 0, "random-disable", (char *)0);
-}
-
-/** @brief Test whether random play is enabled
- * @param c Client
- * @param enabledp Where to store result (non-0 iff enabled)
- * @return 0 on success, non-0 on error
- */
-int disorder_random_enabled(disorder_client *c, int *enabledp) {
-  char *v;
-  int rc;
-
-  if((rc = disorder_simple(c, &v, "random-enabled", (char *)0)))
-    return rc;
-  return boolean("random-enabled", v, enabledp);
-}
-
-/** @brief Get server stats
- * @param c Client
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_stats(disorder_client *c,
-                  char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "stats", (char *)0);
-}
-
-/** @brief Set volume
- * @param c Client
- * @param left New left channel value
- * @param right New right channel value
- * @return 0 on success, non-0 on error
- */
-int disorder_set_volume(disorder_client *c, int left, int right) {
-  char *ls, *rs;
-
-  if(byte_asprintf(&ls, "%d", left) < 0
-     || byte_asprintf(&rs, "%d", right) < 0)
-    return -1;
-  return disorder_simple(c, 0, "volume", ls, rs, (char *)0);
-}
-
-/** @brief Get volume
- * @param c Client
- * @param left Where to store left channel value
- * @param right Where to store right channel value
- * @return 0 on success, non-0 on error
- */
-int disorder_get_volume(disorder_client *c, int *left, int *right) {
-  char *r;
-  int rc;
-
-  if((rc = disorder_simple(c, &r, "volume", (char *)0)))
-    return rc;
-  if(sscanf(r, "%d %d", left, right) != 2) {
-    c->last = "malformed volume response";
-    disorder_error(0, "error parsing response to 'volume': '%s'", r);
-    return -1;
-  }
-  return 0;
-}
-
 /** @brief Log to a sink
  * @param c Client
  * @param s Sink to write log lines to
@@ -1032,438 +774,7 @@ int disorder_log(disorder_client *c, struct sink *s) {
   return 0;
 }
 
-/** @brief Look up a track name part
- * @param c Client
- * @param partp Where to store result (UTF-8)
- * @param track Track name (UTF-8)
- * @param context Context (usually "sort" or "display") (UTF-8)
- * @param part Track part (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_part(disorder_client *c, char **partp,
-                 const char *track, const char *context, const char *part) {
-  return dequote(disorder_simple(c, partp, "part",
-                                track, context, part, (char *)0), partp);
-}
-
-/** @brief Resolve aliases
- * @param c Client
- * @param trackp Where to store canonical name (UTF-8)
- * @param track Track name (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_resolve(disorder_client *c, char **trackp, const char *track) {
-  return dequote(disorder_simple(c, trackp, "resolve", track, (char *)0),
-                trackp);
-}
-
-/** @brief Pause the current track
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_pause(disorder_client *c) {
-  return disorder_simple(c, 0, "pause", (char *)0);
-}
-
-/** @brief Resume the current track
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_resume(disorder_client *c) {
-  return disorder_simple(c, 0, "resume", (char *)0);
-}
-
-/** @brief List all known tags
- * @param c Client
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_tags(disorder_client *c,
-                  char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "tags", (char *)0);
-}
-
-/** @brief List all known users
- * @param c Client
- * @param vecp Where to store list (UTF-8)
- * @param nvecp Where to store number of items, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_users(disorder_client *c,
-                  char ***vecp, int *nvecp) {
-  return disorder_simple_list(c, vecp, nvecp, "users", (char *)0);
-}
-
-/** @brief Get recently added tracks
- * @param c Client
- * @param vecp Where to store pointer to list (UTF-8)
- * @param nvecp Where to store count
- * @param max Maximum tracks to fetch, or 0 for all available
- * @return 0 on success, non-0 on error
- */
-int disorder_new_tracks(disorder_client *c,
-                       char ***vecp, int *nvecp,
-                       int max) {
-  char limit[32];
-
-  sprintf(limit, "%d", max);
-  return disorder_simple_list(c, vecp, nvecp, "new", limit, (char *)0);
-}
-
-/** @brief Set a global preference
- * @param c Client
- * @param key Preference name (UTF-8)
- * @param value Preference value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_set_global(disorder_client *c,
-                       const char *key, const char *value) {
-  return disorder_simple(c, 0, "set-global", key, value, (char *)0);
-}
-
-/** @brief Unset a global preference
- * @param c Client
- * @param key Preference name (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_unset_global(disorder_client *c, const char *key) {
-  return disorder_simple(c, 0, "unset-global", key, (char *)0);
-}
-
-/** @brief Get a global preference
- * @param c Client
- * @param key Preference name (UTF-8)
- * @param valuep Where to store preference value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_get_global(disorder_client *c, const char *key, char **valuep) {
-  return dequote(disorder_simple(c, valuep, "get-global", key, (char *)0),
-                valuep);
-}
-
-/** @brief Get server's RTP address information
- * @param c Client
- * @param addressp Where to store address (UTF-8)
- * @param portp Where to store port (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_rtp_address(disorder_client *c, char **addressp, char **portp) {
-  char *r;
-  int rc, n;
-  char **vec;
-
-  if((rc = disorder_simple(c, &r, "rtp-address", (char *)0)))
-    return rc;
-  vec = split(r, &n, SPLIT_QUOTES, 0, 0);
-  if(n != 2) {
-    c->last = "malformed RTP address";
-    disorder_error(0, "malformed rtp-address reply");
-    return -1;
-  }
-  *addressp = vec[0];
-  *portp = vec[1];
-  return 0;
-}
-
-/** @brief Create a user
- * @param c Client
- * @param user Username
- * @param password Password
- * @param rights Initial rights or NULL to use default
- * @return 0 on success, non-0 on error
- */
-int disorder_adduser(disorder_client *c,
-                    const char *user, const char *password,
-                    const char *rights) {
-  return disorder_simple(c, 0, "adduser", user, password, rights, (char *)0);
-}
-
-/** @brief Delete a user
- * @param c Client
- * @param user Username
- * @return 0 on success, non-0 on error
- */
-int disorder_deluser(disorder_client *c, const char *user) {
-  return disorder_simple(c, 0, "deluser", user, (char *)0);
-}
-
-/** @brief Get user information
- * @param c Client
- * @param user Username
- * @param key Property name (UTF-8)
- * @param valuep Where to store value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_userinfo(disorder_client *c, const char *user, const char *key,
-                     char **valuep) {
-  return dequote(disorder_simple(c, valuep, "userinfo", user, key, (char *)0),
-                valuep);
-}
-
-/** @brief Set user information
- * @param c Client
- * @param user Username
- * @param key Property name (UTF-8)
- * @param value New property value (UTF-8)
- * @return 0 on success, non-0 on error
- */
-int disorder_edituser(disorder_client *c, const char *user,
-                     const char *key, const char *value) {
-  return disorder_simple(c, 0, "edituser", user, key, value, (char *)0);
-}
-
-/** @brief Register a user
- * @param c Client
- * @param user Username
- * @param password Password
- * @param email Email address (UTF-8)
- * @param confirmp Where to store confirmation string
- * @return 0 on success, non-0 on error
- */
-int disorder_register(disorder_client *c, const char *user,
-                     const char *password, const char *email,
-                     char **confirmp) {
-  return dequote(disorder_simple(c, confirmp, "register",
-                                user, password, email, (char *)0),
-                confirmp);
-}
-
-/** @brief Confirm a user
- * @param c Client
- * @param confirm Confirmation string
- * @return 0 on success, non-0 on error
- */
-int disorder_confirm(disorder_client *c, const char *confirm) {
-  char *u;
-  int rc;
-  
-  if(!(rc = dequote(disorder_simple(c, &u, "confirm", confirm, (char *)0),
-                   &u)))
-    c->user = u;
-  return rc;
-}
-
-/** @brief Make a cookie for this login
- * @param c Client
- * @param cookiep Where to store cookie string
- * @return 0 on success, non-0 on error
- */
-int disorder_make_cookie(disorder_client *c, char **cookiep) {
-  return dequote(disorder_simple(c, cookiep, "make-cookie", (char *)0),
-                cookiep);
-}
-
-/** @brief Revoke the cookie used by this session
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_revoke(disorder_client *c) {
-  return disorder_simple(c, 0, "revoke", (char *)0);
-}
-
-/** @brief Request a password reminder email
- * @param c Client
- * @param user Username
- * @return 0 on success, non-0 on error
- */
-int disorder_reminder(disorder_client *c, const char *user) {
-  return disorder_simple(c, 0, "reminder", user, (char *)0);
-}
-
-/** @brief List scheduled events
- * @param c Client
- * @param idsp Where to put list of event IDs
- * @param nidsp Where to put count of event IDs, or NULL
- * @return 0 on success, non-0 on error
- */
-int disorder_schedule_list(disorder_client *c, char ***idsp, int *nidsp) {
-  return disorder_simple_list(c, idsp, nidsp, "schedule-list", (char *)0);
-}
-
-/** @brief Delete a scheduled event
- * @param c Client
- * @param id Event ID to delete
- * @return 0 on success, non-0 on error
- */
-int disorder_schedule_del(disorder_client *c, const char *id) {
-  return disorder_simple(c, 0, "schedule-del", id, (char *)0);
-}
-
-/** @brief Get details of a scheduled event
- * @param c Client
- * @param id Event ID
- * @param actiondatap Where to put details
- * @return 0 on success, non-0 on error
- */
-int disorder_schedule_get(disorder_client *c, const char *id,
-                         struct kvp **actiondatap) {
-  char **lines, **bits;
-  int rc, nbits;
-
-  *actiondatap = 0;
-  if((rc = disorder_simple_list(c, &lines, NULL,
-                               "schedule-get", id, (char *)0)))
-    return rc;
-  while(*lines) {
-    if(!(bits = split(*lines++, &nbits, SPLIT_QUOTES, 0, 0))) {
-      disorder_error(0, "invalid schedule-get reply: cannot split line");
-      return -1;
-    }
-    if(nbits != 2) {
-      disorder_error(0, "invalid schedule-get reply: wrong number of fields");
-      return -1;
-    }
-    kvp_set(actiondatap, bits[0], bits[1]);
-  }
-  return 0;
-}
-
-/** @brief Add a scheduled event
- * @param c Client
- * @param when When to trigger the event
- * @param priority Event priority ("normal" or "junk")
- * @param action What action to perform
- * @param ... Action-specific arguments
- * @return 0 on success, non-0 on error
- *
- * For action @c "play" the next argument is the track.
- *
- * For action @c "set-global" next argument is the global preference name
- * and the final argument the value to set it to, or (char *)0 to unset it.
- */
-int disorder_schedule_add(disorder_client *c,
-                         time_t when,
-                         const char *priority,
-                         const char *action,
-                         ...) {
-  va_list ap;
-  char when_str[64];
-  int rc;
-
-  snprintf(when_str, sizeof when_str, "%lld", (long long)when);
-  va_start(ap, action);
-  if(!strcmp(action, "play"))
-    rc = disorder_simple(c, 0, "schedule-add", when_str, priority,
-                        action, va_arg(ap, char *),
-                        (char *)0);
-  else if(!strcmp(action, "set-global")) {
-    const char *key = va_arg(ap, char *);
-    const char *value = va_arg(ap, char *);
-    rc = disorder_simple(c, 0,"schedule-add",  when_str, priority,
-                        action, key, value,
-                        (char *)0);
-  } else
-    disorder_fatal(0, "unknown action '%s'", action);
-  va_end(ap);
-  return rc;
-}
-
-/** @brief Adopt a track
- * @param c Client
- * @param id Track ID to adopt
- * @return 0 on success, non-0 on error
- */
-int disorder_adopt(disorder_client *c, const char *id) {
-  return disorder_simple(c, 0, "adopt", id, (char *)0);
-}
-
-/** @brief Delete a playlist
- * @param c Client
- * @param playlist Playlist to delete
- * @return 0 on success, non-0 on error
- */
-int disorder_playlist_delete(disorder_client *c,
-                             const char *playlist) {
-  return disorder_simple(c, 0, "playlist-delete", playlist, (char *)0);
-}
-
-/** @brief Get the contents of a playlist
- * @param c Client
- * @param playlist Playlist to get
- * @param tracksp Where to put list of tracks
- * @param ntracksp Where to put count of tracks
- * @return 0 on success, non-0 on error
- */
-int disorder_playlist_get(disorder_client *c, const char *playlist,
-                          char ***tracksp, int *ntracksp) {
-  return disorder_simple_list(c, tracksp, ntracksp,
-                              "playlist-get", playlist, (char *)0);
-}
-
-/** @brief List all readable playlists
- * @param c Client
- * @param playlistsp Where to put list of playlists
- * @param nplaylistsp Where to put count of playlists
- * @return 0 on success, non-0 on error
- */
-int disorder_playlists(disorder_client *c,
-                       char ***playlistsp, int *nplaylistsp) {
-  return disorder_simple_list(c, playlistsp, nplaylistsp,
-                              "playlists", (char *)0);
-}
-
-/** @brief Get the sharing status of a playlist
- * @param c Client
- * @param playlist Playlist to inspect
- * @param sharep Where to put sharing status
- * @return 0 on success, non-0 on error
- *
- * Possible @p sharep values are @c public, @c private and @c shared.
- */
-int disorder_playlist_get_share(disorder_client *c, const char *playlist,
-                                char **sharep) {
-  return disorder_simple(c, sharep,
-                         "playlist-get-share", playlist, (char *)0);
-}
-
-/** @brief Get the sharing status of a playlist
- * @param c Client
- * @param playlist Playlist to modify
- * @param share New sharing status
- * @return 0 on success, non-0 on error
- *
- * Possible @p share values are @c public, @c private and @c shared.
- */
-int disorder_playlist_set_share(disorder_client *c, const char *playlist,
-                                const char *share) {
-  return disorder_simple(c, 0,
-                         "playlist-set-share", playlist, share, (char *)0);
-}
-
-/** @brief Lock a playlist for modifications
- * @param c Client
- * @param playlist Playlist to lock
- * @return 0 on success, non-0 on error
- */
-int disorder_playlist_lock(disorder_client *c, const char *playlist) {
-  return disorder_simple(c, 0,
-                         "playlist-lock", playlist, (char *)0);
-}
-
-/** @brief Unlock the locked playlist
- * @param c Client
- * @return 0 on success, non-0 on error
- */
-int disorder_playlist_unlock(disorder_client *c) {
-  return disorder_simple(c, 0,
-                         "playlist-unlock", (char *)0);
-}
-
-/** @brief Set the contents of a playlst
- * @param c Client
- * @param playlist Playlist to modify
- * @param tracks List of tracks
- * @param ntracks Length of @p tracks (or -1 to count up to the first NULL)
- * @return 0 on success, non-0 on error
- */
-int disorder_playlist_set(disorder_client *c,
-                          const char *playlist,
-                          char **tracks,
-                          int ntracks) {
-  return disorder_simple_body(c, 0, tracks, ntracks,
-                              "playlist-set", playlist, (char *)0);
-}
+#include "client-stubs.c"
 
 /*
 Local Variables:
index f7ff7289198a2107c3d33753d33918e72dcd79d0..2513a89e382d756f4e8b1e1bf8c174d19ee521bd 100644 (file)
@@ -18,6 +18,9 @@
 /** @file lib/client.h
  * @brief Simple C client
  *
+ * See @ref lib/client-stubs.h for the (generated) per-command entry
+ * points.
+ *
  * See @ref lib/eclient.h for an asynchronous-capable client
  * implementation.
  */
@@ -47,107 +50,11 @@ int disorder_connect_generic(struct config *conf,
                              const char *password,
                              const char *cookie);
 int disorder_close(disorder_client *c);
-int disorder_version(disorder_client *c, char **versionp);
-int disorder_play(disorder_client *c, const char *track);
-int disorder_remove(disorder_client *c, const char *track);
-int disorder_move(disorder_client *c, const char *track, int delta);
-int disorder_enable(disorder_client *c);
-int disorder_disable(disorder_client *c);
-int disorder_scratch(disorder_client *c, const char *id);
-int disorder_shutdown(disorder_client *c);
-int disorder_reconfigure(disorder_client *c);
-int disorder_rescan(disorder_client *c);
-int disorder_playing(disorder_client *c, struct queue_entry **qp);
-int disorder_recent(disorder_client *c, struct queue_entry **qp);
-int disorder_queue(disorder_client *c, struct queue_entry **qp);
-int disorder_directories(disorder_client *c, const char *dir, const char *re,
-                        char ***vecp, int *nvecp);
-int disorder_files(disorder_client *c, const char *dir, const char *re,
-                  char ***vecp, int *nvecp);
-int disorder_allfiles(disorder_client *c, const char *dir, const char *re,
-                     char ***vecp, int *nvecp);
 char *disorder_user(disorder_client *c);
-int disorder_exists(disorder_client *c, const char *track, int *existsp);
-int disorder_enabled(disorder_client *c, int *enabledp);
-int disorder_set(disorder_client *c, const char *track,
-                const char *key, const char *value);
-int disorder_unset(disorder_client *c, const char *track,
-                  const char *key);
-int disorder_get(disorder_client *c, const char *track, const char *key,
-                char **valuep);
-int disorder_prefs(disorder_client *c, const char *track,
-                  struct kvp **kp);
-int disorder_length(disorder_client *c, const char *track,
-                   long *valuep);
-int disorder_search(disorder_client *c, const char *terms,
-                   char ***vecp, int *nvecp);
-int disorder_random_enable(disorder_client *c);
-int disorder_random_disable(disorder_client *c);
-int disorder_random_enabled(disorder_client *c, int *enabledp);
-int disorder_stats(disorder_client *c,
-                  char ***vecp, int *nvecp);
-int disorder_set_volume(disorder_client *c, int left, int right);
-int disorder_get_volume(disorder_client *c, int *left, int *right);
 int disorder_log(disorder_client *c, struct sink *s);
-int disorder_part(disorder_client *c, char **partp,
-                 const char *track, const char *context, const char *part);
-int disorder_resolve(disorder_client *c, char **trackp, const char *track);
-int disorder_pause(disorder_client *c);
-int disorder_resume(disorder_client *c);
-int disorder_tags(disorder_client *c,
-                  char ***vecp, int *nvecp);
-int disorder_set_global(disorder_client *c,
-                       const char *key, const char *value);
-int disorder_unset_global(disorder_client *c, const char *key);
-int disorder_get_global(disorder_client *c, const char *key, char **valuep);
-int disorder_new_tracks(disorder_client *c,
-                       char ***vecp, int *nvecp,
-                       int max);
-int disorder_rtp_address(disorder_client *c, char **addressp, char **portp);
-int disorder_adduser(disorder_client *c,
-                    const char *user, const char *password,
-                    const char *rights);
-int disorder_deluser(disorder_client *c, const char *user);
-int disorder_userinfo(disorder_client *c, const char *user, const char *key,
-                     char **valuep);
-int disorder_edituser(disorder_client *c, const char *user,
-                     const char *key, const char *value);
-int disorder_users(disorder_client *c,
-                  char ***vecp, int *nvecp);
-int disorder_register(disorder_client *c, const char *user,
-                     const char *password, const char *email,
-                     char **confirmp);
-int disorder_confirm(disorder_client *c, const char *confirm);
-int disorder_make_cookie(disorder_client *c, char **cookiep);
 const char *disorder_last(disorder_client *c);
-int disorder_revoke(disorder_client *c);
-int disorder_reminder(disorder_client *c, const char *user);
-int disorder_schedule_list(disorder_client *c, char ***idsp, int *nidsp);
-int disorder_schedule_del(disorder_client *c, const char *id);
-int disorder_schedule_get(disorder_client *c, const char *id,
-                         struct kvp **actiondatap);
-int disorder_schedule_add(disorder_client *c,
-                         time_t when,
-                         const char *priority,
-                         const char *action,
-                         ...);
-int disorder_adopt(disorder_client *c, const char *id);
-int disorder_playlist_delete(disorder_client *c,
-                             const char *playlist);
-int disorder_playlist_get(disorder_client *c, const char *playlist,
-                          char ***tracksp, int *ntracksp);
-int disorder_playlists(disorder_client *c,
-                       char ***playlistsp, int *nplaylists);
-int disorder_playlist_get_share(disorder_client *c, const char *playlist,
-                                char **sharep);
-int disorder_playlist_set_share(disorder_client *c, const char *playlist,
-                                const char *share);
-int disorder_playlist_lock(disorder_client *c, const char *playlist);
-int disorder_playlist_unlock(disorder_client *c);
-int disorder_playlist_set(disorder_client *c,
-                          const char *playlist,
-                          char **tracks,
-                          int ntracks);
+
+#include "client-stubs.h"
 
 #endif /* CLIENT_H */
 
index 45f232946155facab3c55e9c761b64f446fd16a2..4f21d25bc2e1a11c1a93044ac357c3ad73dca4e0 100644 (file)
@@ -240,6 +240,7 @@ static int set_string(const struct config_state *cs,
                   cs->path, cs->line, whoami->name);
     return -1;
   }
+  xfree(VALUE(cs->config, char *));
   VALUE(cs->config, char *) = xstrdup(vec[0]);
   return 0;
 }
@@ -322,33 +323,6 @@ static int set_string_accum(const struct config_state *cs,
   return 0;
 }
 
-static int set_restrict(const struct config_state *cs,
-                       const struct conf *whoami,
-                       int nvec, char **vec) {
-  unsigned r = 0;
-  int n, i;
-  
-  static const struct restriction {
-    const char *name;
-    unsigned bit;
-  } restrictions[] = {
-    { "remove", RESTRICT_REMOVE },
-    { "scratch", RESTRICT_SCRATCH },
-    { "move", RESTRICT_MOVE },
-  };
-
-  for(n = 0; n < nvec; ++n) {
-    if((i = TABLE_FIND(restrictions, name, vec[n])) < 0) {
-      disorder_error(0, "%s:%d: invalid restriction '%s'",
-                    cs->path, cs->line, vec[n]);
-      return -1;
-    }
-    r |= restrictions[i].bit;
-  }
-  VALUE(cs->config, unsigned) = r;
-  return 0;
-}
-
 static int parse_sample_format(const struct config_state *cs,
                               struct stream_header *format,
                               int nvec, char **vec) {
@@ -520,8 +494,7 @@ static int set_rights(const struct config_state *cs,
                   cs->path, cs->line, vec[0]);
     return -1;
   }
-  *ADDRESS(cs->config, char *) = vec[0];
-  return 0;
+  return set_string(cs, whoami, nvec, vec);
 }
 
 static int set_netaddress(const struct config_state *cs,
@@ -640,11 +613,10 @@ static const struct conftype
   type_stringlist_accum = { set_stringlist_accum, free_stringlistlist },
   type_string_accum = { set_string_accum, free_stringlist },
   type_sample_format = { set_sample_format, free_none },
-  type_restrict = { set_restrict, free_none },
   type_namepart = { set_namepart, free_namepartlist },
   type_transform = { set_transform, free_transformlist },
   type_netaddress = { set_netaddress, free_netaddress },
-  type_rights = { set_rights, free_none };
+  type_rights = { set_rights, free_string };
 
 /* specific validation routine */
 
@@ -750,24 +722,6 @@ static int validate_tracklength(const struct config_state *cs,
   return 0;
 }
 
-/** @brief Validate an allow directive
- * @param cs Configuration state
- * @param nvec Length of (proposed) new value
- * @param vec Elements of new value
- * @return 0 on success, non-0 on error
- *
- * Obsolete - only used for parsing legacy configuration.
- */
-static int validate_allow(const struct config_state *cs,
-                         int nvec,
-                         char attribute((unused)) **vec) {
-  if(nvec != 2) {
-    disorder_error(0, "%s:%d: must be 'allow NAME PASS'", cs->path, cs->line);
-    return -1;
-  }
-  return 0;
-}
-
 /** @brief Validate a non-negative (@c long) integer
  * @param cs Configuration state
  * @param nvec Length of (proposed) new value
@@ -835,9 +789,7 @@ static int validate_positive(const struct config_state *cs,
 static int validate_isauser(const struct config_state *cs,
                            int attribute((unused)) nvec,
                            char **vec) {
-  struct passwd *pw;
-
-  if(!(pw = getpwnam(vec[0]))) {
+  if(!getpwnam(vec[0])) {
     disorder_error(0, "%s:%d: no such user as '%s'", cs->path, cs->line, vec[0]);
     return -1;
   }
@@ -1047,6 +999,7 @@ static int validate_destaddr(const struct config_state attribute((unused)) *cs,
     disorder_error(0, "%s:%d: destination address required", cs->path, cs->line);
     return -1;
   }
+  xfree(na->address);
   return 0;
 }
 
@@ -1058,7 +1011,6 @@ static int validate_destaddr(const struct config_state attribute((unused)) *cs,
 /** @brief All configuration items */
 static const struct conf conf[] = {
   { C(alias),            &type_string,           validate_alias },
-  { C(allow),            &type_stringlist_accum, validate_allow },
   { C(api),              &type_string,           validate_backend },
   { C(authorization_algorithm), &type_string,    validate_algo },
   { C(broadcast),        &type_netaddress,       validate_destaddr },
@@ -1073,13 +1025,12 @@ static const struct conf conf[] = {
   { C(dbversion),        &type_integer,          validate_positive },
   { C(default_rights),   &type_rights,           validate_any },
   { C(device),           &type_string,           validate_any },
-  { C(gap),              &type_integer,          validate_non_negative },
   { C(history),          &type_integer,          validate_positive },
   { C(home),             &type_string,           validate_isabspath },
   { C(listen),           &type_netaddress,       validate_any },
-  { C(lock),             &type_boolean,          validate_any },
   { C(mail_sender),      &type_string,           validate_any },
   { C(mixer),            &type_string,           validate_any },
+  { C(mount_rescan),     &type_boolean,          validate_any },
   { C(multicast_loop),   &type_boolean,          validate_any },
   { C(multicast_ttl),    &type_integer,          validate_non_negative },
   { C(namepart),         &type_namepart,         validate_any },
@@ -1097,15 +1048,14 @@ static const struct conf conf[] = {
   { C(playlist_lock_timeout), &type_integer,     validate_positive },
   { C(playlist_max) ,    &type_integer,          validate_positive },
   { C(plugins),          &type_string_accum,     validate_isdir },
-  { C(prefsync),         &type_integer,          validate_positive },
   { C(queue_pad),        &type_integer,          validate_positive },
   { C(refresh),          &type_integer,          validate_positive },
   { C(refresh_min),      &type_integer,          validate_non_negative },
   { C(reminder_interval), &type_integer,         validate_positive },
   { C(remote_userman),   &type_boolean,          validate_any },
   { C(replay_min),       &type_integer,          validate_non_negative },
-  { C2(restrict, restrictions),         &type_restrict,         validate_any },
   { C(rtp_delay_threshold), &type_integer,       validate_positive },
+  { C(rtp_verbose),      &type_boolean,          validate_any },
   { C(sample_format),    &type_sample_format,    validate_sample_format },
   { C(scratch),          &type_string_accum,     validate_isreg },
   { C(sendmail),         &type_string,           validate_isabspath },
@@ -1119,7 +1069,6 @@ static const struct conf conf[] = {
   { C(templates),        &type_string_accum,     validate_isdir },
   { C(tracklength),      &type_stringlist_accum, validate_tracklength },
   { C(transform),        &type_transform,        validate_any },
-  { C(trust),            &type_string_accum,     validate_any },
   { C(url),              &type_string,           validate_url },
   { C(user),             &type_string,           validate_isauser },
   { C(username),         &type_string,           validate_any },
@@ -1175,7 +1124,9 @@ static int config_set_args(const struct config_state *cs,
     vector_append(v, s);
   va_end(ap);
   vector_terminate(v);
-  return config_set(cs, v->nvec, v->vec);
+  int rc = config_set(cs, v->nvec, v->vec);
+  xfree(v->vec);
+  return rc;
 }
 
 /** @brief Error callback used by config_include()
@@ -1330,7 +1281,6 @@ static struct config *config_default(void) {
   cs.line = 0;
   cs.config = c;
   /* Strings had better be xstrdup'd as they will get freed at some point. */
-  c->gap = 0;
   c->history = 60;
   c->home = xstrdup(pkgstatedir);
   if(!(pw = getpwuid(getuid())))
@@ -1339,10 +1289,8 @@ static struct config *config_default(void) {
   c->username = xstrdup(logname);
   c->refresh = 15;
   c->refresh_min = 1;
-  c->prefsync = 0;
   c->signal = SIGKILL;
   c->alias = xstrdup("{/artist}{/album}{/title}{ext}");
-  c->lock = 1;
   c->device = xstrdup("default");
   c->nice_rescan = 10;
   c->speaker_command = 0;
@@ -1373,6 +1321,7 @@ static struct config *config_default(void) {
   c->sox_generation = DEFAULT_SOX_GENERATION;
   c->playlist_max = INT_MAX;            /* effectively no limit */
   c->playlist_lock_timeout = 10;        /* 10s */
+  c->mount_rescan = 1;
   /* Default stopwords */
   if(config_set(&cs, (int)NDEFAULT_STOPWORDS, (char **)default_stopwords))
     exit(1);
@@ -1417,7 +1366,7 @@ static void set_configfile(void) {
  *
  * @p c is indeterminate after this function is called.
  */
-static void config_free(struct config *c) {
+void config_free(struct config *c) {
   int n;
 
   if(c) {
@@ -1510,18 +1459,7 @@ static void config_postdefaults(struct config *c,
                                     |RIGHT_MOVE__MASK
                                     |RIGHT_SCRATCH__MASK
                                     |RIGHT_REMOVE__MASK);
-    /* The idea is to approximate the meaning of the old 'restrict' directive
-     * in the default rights if they are not overridden. */
-    if(c->restrictions & RESTRICT_SCRATCH)
-      r |= RIGHT_SCRATCH_MINE|RIGHT_SCRATCH_RANDOM;
-    else
-      r |= RIGHT_SCRATCH_ANY;
-    if(!(c->restrictions & RESTRICT_MOVE))
-      r |= RIGHT_MOVE_ANY;
-    if(c->restrictions & RESTRICT_REMOVE)
-      r |= RIGHT_REMOVE_MINE;
-    else
-      r |= RIGHT_REMOVE_ANY;
+    r |= RIGHT_SCRATCH_ANY|RIGHT_MOVE_ANY|RIGHT_REMOVE_ANY;
     c->default_rights = rights_string(r);
   }
 }
@@ -1608,18 +1546,6 @@ int config_read(int server,
   /* everything is good so we shall use the new config */
   config_free(config);
   /* warn about obsolete directives */
-  if(c->restrictions)
-    disorder_error(0, "'restrict' will be removed in a future version");
-  if(c->allow.n)
-    disorder_error(0, "'allow' will be removed in a future version");
-  if(c->trust.n)
-    disorder_error(0, "'trust' will be removed in a future version");
-  if(!c->lock)
-    disorder_error(0, "'lock' will be removed in a future version");
-  if(c->gap)
-    disorder_error(0, "'gap' will be removed in a future version");
-  if(c->prefsync)
-    disorder_error(0, "'prefsync' will be removed in a future version");
   config = c;
   return 0;
 }
index 617d9293480948d5078279515f1bb84780595127..ed6d3f11875929ecc634595a8845be5d335866ef 100644 (file)
@@ -68,6 +68,7 @@ struct collectionlist {
   struct collection *s;
 };
 
+/** @brief A track name part */
 struct namepart {
   char *part;                          /* part */
   pcre *re;                            /* compiled regexp */
@@ -77,11 +78,13 @@ struct namepart {
   unsigned reflags;                    /* regexp flags */
 };
 
+/** @brief A list of track name parts */
 struct namepartlist {
   int n;
   struct namepart *s;
 };
 
+/** @brief A track name transform */
 struct transform {
   char *type;                          /* track or dir */
   char *context;                       /* sort or choose */
@@ -90,6 +93,7 @@ struct transform {
   unsigned flags;                      /* regexp flags */
 };
 
+/** @brief A list of track name transforms */
 struct transformlist {
   int n;
   struct transform *t;
@@ -108,24 +112,15 @@ struct config {
   /** @brief All tracklength plugins */
   struct stringlistlist tracklength;
 
-  /** @brief Allowed users */
-  struct stringlistlist allow;
-
   /** @brief Scratch tracks */
   struct stringlist scratch;
 
-  /** @brief Gap between tracks in seconds */
-  long gap;
-
   /** @brief Maximum number of recent tracks to record in history */
   long history;
 
   /** @brief Expiry limit for noticed.db */
   long noticed_history;
   
-  /** @brief Trusted users */
-  struct stringlist trust;
-
   /** @brief User for server to run as */
   const char *user;
 
@@ -153,17 +148,12 @@ struct config {
   /** @brief Mixer channel to use */
   char *channel;
 
-  long prefsync;                       /* preflog sync interval */
-
   /** @brief Secondary listen address */
   struct netaddress listen;
 
   /** @brief Alias format string */
   const char *alias;
 
-  /** @brief Enable server locking */
-  int lock;
-
   /** @brief Nice value for server */
   long nice_server;
 
@@ -195,10 +185,10 @@ struct config {
   const char *home;
 
   /** @brief Login username */
-  const char *username;
+  char *username;
 
   /** @brief Login password */
-  const char *password;
+  char *password;
 
   /** @brief Address to connect to */
   struct netaddress connect;
@@ -218,16 +208,6 @@ struct config {
   /** @brief Minimum refresh interval for web interface (seconds) */
   long refresh_min;
 
-  /** @brief Facilities restricted to trusted users
-   *
-   * A bitmap of @ref RESTRICT_SCRATCH, @ref RESTRICT_REMOVE and @ref
-   * RESTRICT_MOVE.
-   */
-  unsigned restrictions;               /* restrictions */
-#define RESTRICT_SCRATCH 1             /**< Restrict scratching */
-#define RESTRICT_REMOVE 2              /**< Restrict removal */
-#define RESTRICT_MOVE 4                        /**< Restrict rearrangement */
-
   /** @brief Target queue length */
   long queue_pad;
 
@@ -251,6 +231,9 @@ struct config {
 
   /** @brief RTP delay threshold */
   long rtp_delay_threshold;
+
+  /** @brief Verbose RTP transmission logging */
+  int rtp_verbose;
   
   /** @brief TTL for multicast packets */
   long multicast_ttl;
@@ -290,7 +273,10 @@ struct config {
 
   /** @brief Maximum bias */
   long new_bias;
-  
+
+  /** @brief Rescan on (un)mount */
+  int mount_rescan;
+
   /* derived values: */
   int nparts;                          /* number of distinct name parts */
   char **parts;                                /* name part list  */
@@ -325,6 +311,8 @@ char *config_private(void);
 
 int config_verify(void);
 
+void config_free(struct config *c);
+
 extern char *configfile;
 extern int config_per_user;
 
diff --git a/lib/eclient-stubs.c b/lib/eclient-stubs.c
new file mode 100644 (file)
index 0000000..63f5163
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * Automatically generated file, see scripts/protocol
+ *
+ * DO NOT EDIT.
+ */
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2010-11 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/client-stubs.c
+ * @brief Generated asynchronous client API implementation
+ */
+
+int disorder_eclient_adopt(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "adopt", id, (char *)0);
+}
+
+int disorder_eclient_adduser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *user, const char *password, const char *rights, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "adduser", user, password, rights, (char *)0);
+}
+
+int disorder_eclient_allfiles(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "allfiles", dir, re, (char *)0);
+}
+
+int disorder_eclient_deluser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *user, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "deluser", user, (char *)0);
+}
+
+int disorder_eclient_dirs(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "dirs", dir, re, (char *)0);
+}
+
+int disorder_eclient_disable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "disable", (char *)0);
+}
+
+int disorder_eclient_edituser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *username, const char *property, const char *value, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "edituser", username, property, value, (char *)0);
+}
+
+int disorder_eclient_enable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "enable", (char *)0);
+}
+
+int disorder_eclient_enabled(disorder_eclient *c, disorder_eclient_integer_response *completed, void *v) {
+  return simple(c, integer_response_opcallback, (void (*)())completed, v, "enabled", (char *)0);
+}
+
+int disorder_eclient_exists(disorder_eclient *c, disorder_eclient_integer_response *completed, const char *track, void *v) {
+  return simple(c, integer_response_opcallback, (void (*)())completed, v, "exists", track, (char *)0);
+}
+
+int disorder_eclient_files(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "files", dir, re, (char *)0);
+}
+
+int disorder_eclient_get(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, const char *pref, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "get", track, pref, (char *)0);
+}
+
+int disorder_eclient_get_global(disorder_eclient *c, disorder_eclient_string_response *completed, const char *pref, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "get-global", pref, (char *)0);
+}
+
+int disorder_eclient_length(disorder_eclient *c, disorder_eclient_integer_response *completed, const char *track, void *v) {
+  return simple(c, integer_response_opcallback, (void (*)())completed, v, "length", track, (char *)0);
+}
+
+int disorder_eclient_make_cookie(disorder_eclient *c, disorder_eclient_string_response *completed, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "make-cookie", (char *)0);
+}
+
+int disorder_eclient_move(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, long delta, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "move", track, disorder__integer, delta, (char *)0);
+}
+
+int disorder_eclient_moveafter(disorder_eclient *c, disorder_eclient_no_response *completed, const char *target, char **ids, int nids, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "moveafter", target, disorder__list, ids, nids, (char *)0);
+}
+
+int disorder_eclient_new_tracks(disorder_eclient *c, disorder_eclient_list_response *completed, long max, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "new", disorder__integer, max, (char *)0);
+}
+
+int disorder_eclient_nop(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "nop", (char *)0);
+}
+
+int disorder_eclient_part(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, const char *context, const char *part, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "part", track, context, part, (char *)0);
+}
+
+int disorder_eclient_pause(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "pause", (char *)0);
+}
+
+int disorder_eclient_play(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "play", track, (char *)0);
+}
+
+int disorder_eclient_playafter(disorder_eclient *c, disorder_eclient_no_response *completed, const char *target, char **tracks, int ntracks, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playafter", target, disorder__list, tracks, ntracks, (char *)0);
+}
+
+int disorder_eclient_playing(disorder_eclient *c, disorder_eclient_playing_response *completed, void *v) {
+  return simple(c, playing_response_opcallback, (void (*)())completed, v, "playing", (char *)0);
+}
+
+int disorder_eclient_playlist_delete(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playlist-delete", playlist, (char *)0);
+}
+
+int disorder_eclient_playlist_get(disorder_eclient *c, disorder_eclient_list_response *completed, const char *playlist, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "playlist-get", playlist, (char *)0);
+}
+
+int disorder_eclient_playlist_get_share(disorder_eclient *c, disorder_eclient_string_response *completed, const char *playlist, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "playlist-get-share", playlist, (char *)0);
+}
+
+int disorder_eclient_playlist_lock(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playlist-lock", playlist, (char *)0);
+}
+
+int disorder_eclient_playlist_set(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, char **tracks, int ntracks, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playlist-set", playlist, disorder__body, tracks, ntracks, (char *)0);
+}
+
+int disorder_eclient_playlist_set_share(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, const char *share, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playlist-set-share", playlist, share, (char *)0);
+}
+
+int disorder_eclient_playlist_unlock(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "playlist-unlock", (char *)0);
+}
+
+int disorder_eclient_playlists(disorder_eclient *c, disorder_eclient_list_response *completed, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "playlists", (char *)0);
+}
+
+int disorder_eclient_queue(disorder_eclient *c, disorder_eclient_queue_response *completed, void *v) {
+  return simple(c, queue_response_opcallback, (void (*)())completed, v, "queue", (char *)0);
+}
+
+int disorder_eclient_random_disable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "random-disable", (char *)0);
+}
+
+int disorder_eclient_random_enable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "random-enable", (char *)0);
+}
+
+int disorder_eclient_random_enabled(disorder_eclient *c, disorder_eclient_integer_response *completed, void *v) {
+  return simple(c, integer_response_opcallback, (void (*)())completed, v, "random-enabled", (char *)0);
+}
+
+int disorder_eclient_recent(disorder_eclient *c, disorder_eclient_queue_response *completed, void *v) {
+  return simple(c, queue_response_opcallback, (void (*)())completed, v, "recent", (char *)0);
+}
+
+int disorder_eclient_reconfigure(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "reconfigure", (char *)0);
+}
+
+int disorder_eclient_register(disorder_eclient *c, disorder_eclient_string_response *completed, const char *username, const char *password, const char *email, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "register", username, password, email, (char *)0);
+}
+
+int disorder_eclient_reminder(disorder_eclient *c, disorder_eclient_no_response *completed, const char *username, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "reminder", username, (char *)0);
+}
+
+int disorder_eclient_remove(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "remove", id, (char *)0);
+}
+
+int disorder_eclient_rescan(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "rescan", (char *)0);
+}
+
+int disorder_eclient_resolve(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "resolve", track, (char *)0);
+}
+
+int disorder_eclient_resume(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "resume", (char *)0);
+}
+
+int disorder_eclient_revoke(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "revoke", (char *)0);
+}
+
+int disorder_eclient_scratch(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "scratch", id, (char *)0);
+}
+
+int disorder_eclient_schedule_add_play(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *track, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "play", track, (char *)0);
+}
+
+int disorder_eclient_schedule_add_set_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, const char *value, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "set-global", pref, value, (char *)0);
+}
+
+int disorder_eclient_schedule_add_unset_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "set-global", pref, (char *)0);
+}
+
+int disorder_eclient_schedule_del(disorder_eclient *c, disorder_eclient_no_response *completed, const char *event, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-del", event, (char *)0);
+}
+
+int disorder_eclient_schedule_list(disorder_eclient *c, disorder_eclient_list_response *completed, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "schedule-list", (char *)0);
+}
+
+int disorder_eclient_search(disorder_eclient *c, disorder_eclient_list_response *completed, const char *terms, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "search", terms, (char *)0);
+}
+
+int disorder_eclient_set(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, const char *pref, const char *value, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "set", track, pref, value, (char *)0);
+}
+
+int disorder_eclient_set_global(disorder_eclient *c, disorder_eclient_no_response *completed, const char *pref, const char *value, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "set-global", pref, value, (char *)0);
+}
+
+int disorder_eclient_shutdown(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "shutdown", (char *)0);
+}
+
+int disorder_eclient_stats(disorder_eclient *c, disorder_eclient_list_response *completed, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "stats", (char *)0);
+}
+
+int disorder_eclient_tags(disorder_eclient *c, disorder_eclient_list_response *completed, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "tags", (char *)0);
+}
+
+int disorder_eclient_unset(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, const char *pref, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "unset", track, pref, (char *)0);
+}
+
+int disorder_eclient_unset_global(disorder_eclient *c, disorder_eclient_no_response *completed, const char *pref, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "unset-global", pref, (char *)0);
+}
+
+int disorder_eclient_userinfo(disorder_eclient *c, disorder_eclient_string_response *completed, const char *username, const char *property, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "userinfo", username, property, (char *)0);
+}
+
+int disorder_eclient_users(disorder_eclient *c, disorder_eclient_list_response *completed, void *v) {
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "users", (char *)0);
+}
+
+int disorder_eclient_version(disorder_eclient *c, disorder_eclient_string_response *completed, void *v) {
+  return simple(c, string_response_opcallback, (void (*)())completed, v, "version", (char *)0);
+}
+
+int disorder_eclient_set_volume(disorder_eclient *c, disorder_eclient_no_response *completed, long left, long right, void *v) {
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "volume", disorder__integer, left, disorder__integer, right, (char *)0);
+}
+
+int disorder_eclient_get_volume(disorder_eclient *c, disorder_eclient_pair_integer_response *completed, void *v) {
+  return simple(c, pair_integer_response_opcallback, (void (*)())completed, v, "volume", (char *)0);
+}
+
diff --git a/lib/eclient-stubs.h b/lib/eclient-stubs.h
new file mode 100644 (file)
index 0000000..af3b389
--- /dev/null
@@ -0,0 +1,807 @@
+/*
+ * Automatically generated file, see scripts/protocol
+ *
+ * DO NOT EDIT.
+ */
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2010-11 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef ECLIENT_STUBS_H
+#define ECLIENT_STUBS_H
+/** @file lib/client-stubs.h
+ * @brief Generated asynchronous client API
+ *
+ * Don't include this file directly - use @ref client.h instead.
+ */
+
+/** @brief Adopt a track
+ *
+ * Makes the calling user owner of a randomly picked track.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param id Track ID
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_adopt(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v);
+
+/** @brief Create a user
+ *
+ * Create a new user.  Requires the 'admin' right.  Email addresses etc must be filled in in separate commands.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param user New username
+ * @param password Initial password
+ * @param rights Initial rights (optional)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_adduser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *user, const char *password, const char *rights, void *v);
+
+/** @brief List files and directories in a directory
+ *
+ * See 'files' and 'dirs' for more specific lists.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_allfiles(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v);
+
+/** @brief Delete user
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param user User to delete
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_deluser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *user, void *v);
+
+/** @brief List directories in a directory
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_dirs(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v);
+
+/** @brief Disable play
+ *
+ * Play will stop at the end of the current track, if one is playing.  Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_disable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Set a user property
+ *
+ * With the 'admin' right you can do anything.  Otherwise you need the 'userinfo' right and can only set 'email' and 'password'.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param username User to modify
+ * @param property Property name
+ * @param value New property value
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_edituser(disorder_eclient *c, disorder_eclient_no_response *completed, const char *username, const char *property, const char *value, void *v);
+
+/** @brief Enable play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_enable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Detect whether play is enabled
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_enabled(disorder_eclient *c, disorder_eclient_integer_response *completed, void *v);
+
+/** @brief Test whether a track exists
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_exists(disorder_eclient *c, disorder_eclient_integer_response *completed, const char *track, void *v);
+
+/** @brief List files in a directory
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param dir Directory to list (optional)
+ * @param re Regexp that results must match (optional)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_files(disorder_eclient *c, disorder_eclient_list_response *completed, const char *dir, const char *re, void *v);
+
+/** @brief Get a track preference
+ *
+ * If the track does not exist that is an error.  If the track exists but the preference does not then a null value is returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param pref Preference name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_get(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, const char *pref, void *v);
+
+/** @brief Get a global preference
+ *
+ * If the preference does exist not then a null value is returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param pref Global preference name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_get_global(disorder_eclient *c, disorder_eclient_string_response *completed, const char *pref, void *v);
+
+/** @brief Get a track's length
+ *
+ * If the track does not exist an error is returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_length(disorder_eclient *c, disorder_eclient_integer_response *completed, const char *track, void *v);
+
+/** @brief Create a login cookie for this user
+ *
+ * The cookie may be redeemed via the 'cookie' command
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_make_cookie(disorder_eclient *c, disorder_eclient_string_response *completed, void *v);
+
+/** @brief Move a track
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track ID or name
+ * @param delta How far to move the track towards the head of the queue
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_move(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, long delta, void *v);
+
+/** @brief Move multiple tracks
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param target Move after this track, or to head if ""
+ * @param ids List of tracks to move by ID
+ * @param nids Length of ids
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_moveafter(disorder_eclient *c, disorder_eclient_no_response *completed, const char *target, char **ids, int nids, void *v);
+
+/** @brief List recently added tracks
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param max Maximum tracks to fetch, or 0 for all available
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_new_tracks(disorder_eclient *c, disorder_eclient_list_response *completed, long max, void *v);
+
+/** @brief Do nothing
+ *
+ * Used as a keepalive.  No authentication required.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_nop(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Get a track name part
+ *
+ * If the name part cannot be constructed an empty string is returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param context Context ("sort" or "display")
+ * @param part Name part ("artist", "album" or "title")
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_part(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, const char *context, const char *part, void *v);
+
+/** @brief Pause the currently playing track
+ *
+ * Requires the 'pause' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_pause(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Play a track
+ *
+ * Requires the 'play' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track to play
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_play(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, void *v);
+
+/** @brief Play multiple tracks
+ *
+ * Requires the 'play' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param target Insert into queue after this track, or at head if ""
+ * @param tracks List of track names to play
+ * @param ntracks Length of tracks
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playafter(disorder_eclient *c, disorder_eclient_no_response *completed, const char *target, char **tracks, int ntracks, void *v);
+
+/** @brief Retrieve the playing track
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playing(disorder_eclient *c, disorder_eclient_playing_response *completed, void *v);
+
+/** @brief Delete a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist to delete
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_delete(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, void *v);
+
+/** @brief List the contents of a playlist
+ *
+ * Requires the 'read' right and oermission to read the playlist.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_get(disorder_eclient *c, disorder_eclient_list_response *completed, const char *playlist, void *v);
+
+/** @brief Get a playlist's sharing status
+ *
+ * Requires the 'read' right and permission to read the playlist.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist to read
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_get_share(disorder_eclient *c, disorder_eclient_string_response *completed, const char *playlist, void *v);
+
+/** @brief Lock a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist.  A given connection may lock at most one playlist.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist to delete
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_lock(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, void *v);
+
+/** @brief Set the contents of a playlist
+ *
+ * Requires the 'play' right and permission to modify the playlist, which must be locked.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist to modify
+ * @param tracks New list of tracks for playlist
+ * @param ntracks Length of tracks
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_set(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, char **tracks, int ntracks, void *v);
+
+/** @brief Set a playlist's sharing status
+ *
+ * Requires the 'play' right and permission to modify the playlist.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param playlist Playlist to modify
+ * @param share New sharing status ("public", "private" or "shared")
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_set_share(disorder_eclient *c, disorder_eclient_no_response *completed, const char *playlist, const char *share, void *v);
+
+/** @brief Unlock the locked playlist playlist
+ *
+ * The playlist to unlock is implicit in the connection.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlist_unlock(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief List playlists
+ *
+ * Requires the 'read' right.  Only playlists that you have permission to read are returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_playlists(disorder_eclient *c, disorder_eclient_list_response *completed, void *v);
+
+/** @brief List the queue
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_queue(disorder_eclient *c, disorder_eclient_queue_response *completed, void *v);
+
+/** @brief Disable random play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_random_disable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Enable random play
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_random_enable(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Detect whether random play is enabled
+ *
+ * Random play counts as enabled even if play is disabled.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_random_enabled(disorder_eclient *c, disorder_eclient_integer_response *completed, void *v);
+
+/** @brief List recently played tracks
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_recent(disorder_eclient *c, disorder_eclient_queue_response *completed, void *v);
+
+/** @brief Re-read configuraiton file.
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_reconfigure(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Register a new user
+ *
+ * Requires the 'register' right which is usually only available to the 'guest' user.  Redeem the confirmation string via 'confirm' to complete registration.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param username Requested new username
+ * @param password Requested initial password
+ * @param email New user's email address
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_register(disorder_eclient *c, disorder_eclient_string_response *completed, const char *username, const char *password, const char *email, void *v);
+
+/** @brief Send a password reminder.
+ *
+ * If the user has no valid email address, or no password, or a reminder has been sent too recently, then no reminder will be sent.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param username User to remind
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_reminder(disorder_eclient *c, disorder_eclient_no_response *completed, const char *username, void *v);
+
+/** @brief Remove a track form the queue.
+ *
+ * Requires one of the 'remove mine', 'remove random' or 'remove any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param id Track ID
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_remove(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v);
+
+/** @brief Rescan all collections for new or obsolete tracks.
+ *
+ * Requires the 'rescan' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_rescan(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Resolve a track name
+ *
+ * Converts aliases to non-alias track names
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name (might be an alias)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_resolve(disorder_eclient *c, disorder_eclient_string_response *completed, const char *track, void *v);
+
+/** @brief Resume the currently playing track
+ *
+ * Requires the 'pause' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_resume(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Revoke a cookie.
+ *
+ * It will not subsequently be possible to log in with the cookie.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_revoke(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Terminate the playing track.
+ *
+ * Requires one of the 'scratch mine', 'scratch random' or 'scratch any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param id Track ID (optional)
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_scratch(disorder_eclient *c, disorder_eclient_no_response *completed, const char *id, void *v);
+
+/** @brief Schedule a track to play in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param when When to play the track
+ * @param priority Event priority ("normal" or "junk")
+ * @param track Track to play
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_schedule_add_play(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *track, void *v);
+
+/** @brief Schedule a global setting to be changed in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param when When to change the setting
+ * @param priority Event priority ("normal" or "junk")
+ * @param pref Global preference to set
+ * @param value New value of global preference
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_schedule_add_set_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, const char *value, void *v);
+
+/** @brief Schedule a global setting to be unset in the future
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param when When to change the setting
+ * @param priority Event priority ("normal" or "junk")
+ * @param pref Global preference to set
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_schedule_add_unset_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, void *v);
+
+/** @brief Delete a scheduled event.
+ *
+ * Users can always delete their own scheduled events; with the admin right you can delete any event.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param event ID of event to delete
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_schedule_del(disorder_eclient *c, disorder_eclient_no_response *completed, const char *event, void *v);
+
+/** @brief List scheduled events
+ *
+ * This just lists IDs.  Use 'schedule-get' to retrieve more detail
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_schedule_list(disorder_eclient *c, disorder_eclient_list_response *completed, void *v);
+
+/** @brief Search for tracks
+ *
+ * Terms are either keywords or tags formatted as 'tag:TAG-NAME'.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param terms List of search terms
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_search(disorder_eclient *c, disorder_eclient_list_response *completed, const char *terms, void *v);
+
+/** @brief Set a track preference
+ *
+ * Requires the 'prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param pref Preference name
+ * @param value New value
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_set(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, const char *pref, const char *value, void *v);
+
+/** @brief Set a global preference
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param pref Preference name
+ * @param value New value
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_set_global(disorder_eclient *c, disorder_eclient_no_response *completed, const char *pref, const char *value, void *v);
+
+/** @brief Request server shutdown
+ *
+ * Requires the 'admin' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_shutdown(disorder_eclient *c, disorder_eclient_no_response *completed, void *v);
+
+/** @brief Get server statistics
+ *
+ * The details of what the server reports are not really defined.  The returned strings are intended to be printed out one to a line.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_stats(disorder_eclient *c, disorder_eclient_list_response *completed, void *v);
+
+/** @brief Get a list of known tags
+ *
+ * Only tags which apply to at least one track are returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_tags(disorder_eclient *c, disorder_eclient_list_response *completed, void *v);
+
+/** @brief Unset a track preference
+ *
+ * Requires the 'prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param track Track name
+ * @param pref Preference name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_unset(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, const char *pref, void *v);
+
+/** @brief Set a global preference
+ *
+ * Requires the 'global prefs' right.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param pref Preference name
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_unset_global(disorder_eclient *c, disorder_eclient_no_response *completed, const char *pref, void *v);
+
+/** @brief Get a user property.
+ *
+ * If the user does not exist an error is returned, if the user exists but the property does not then a null value is returned.
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param username User to read
+ * @param property Property to read
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_userinfo(disorder_eclient *c, disorder_eclient_string_response *completed, const char *username, const char *property, void *v);
+
+/** @brief Get a list of users
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_users(disorder_eclient *c, disorder_eclient_list_response *completed, void *v);
+
+/** @brief Get the server version
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_version(disorder_eclient *c, disorder_eclient_string_response *completed, void *v);
+
+/** @brief Set the volume
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param left Left channel volume
+ * @param right Right channel volume
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_set_volume(disorder_eclient *c, disorder_eclient_no_response *completed, long left, long right, void *v);
+
+/** @brief Get the volume
+ *
+ * 
+ *
+ * @param c Client
+ * @param completed Called upon completion
+ * @param v Passed to @p completed
+ * @return 0 if the command was queued successfuly, non-0 on error
+ */
+int disorder_eclient_get_volume(disorder_eclient *c, disorder_eclient_pair_integer_response *completed, void *v);
+
+#endif
index 5eda674ff03431d62e735c22adc6a3837e04647b..fad416ad07be6fad813fb3173a696423e1d491ad 100644 (file)
@@ -193,6 +193,7 @@ static void logentry_adopted(disorder_eclient *c, int nvec, char **vec);
 static void logentry_playlist_created(disorder_eclient *c, int nvec, char **vec);
 static void logentry_playlist_deleted(disorder_eclient *c, int nvec, char **vec);
 static void logentry_playlist_modified(disorder_eclient *c, int nvec, char **vec);
+static void logentry_global_pref(disorder_eclient *c, int nvec, char **vec);
 
 /* Tables ********************************************************************/
 
@@ -212,6 +213,7 @@ static const struct logentry_handler logentry_handlers[] = {
   LE(adopted, 2, 2),
   LE(completed, 1, 1),
   LE(failed, 2, 2),
+  LE(global_pref, 1, 2),
   LE(moved, 1, 1),
   LE(playing, 1, 2),
   LE(playlist_created, 2, 2),
@@ -584,7 +586,7 @@ static void authbanner_opcallback(disorder_eclient *c,
      || !(rvec = split(c->line + 4, &nrvec, SPLIT_QUOTES, 0, 0))
      || nrvec < 1) {
     /* Banner told us to go away, or was malformed.  We cannot proceed. */
-    protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+    protocol_error(c, op, c->rc, "%s [%s]", c->line, c->ident);
     disorder_eclient_close(c);
     return;
   }
@@ -605,21 +607,21 @@ static void authbanner_opcallback(disorder_eclient *c,
     challenge = *rvec++;
     break;
   default:
-    protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+    protocol_error(c, op, c->rc, "%s [%s]", c->line, c->ident);
     disorder_eclient_close(c);
     return;
   }
   c->protocol = atoi(protocol);
   if(c->protocol < 1 || c->protocol > 2) {
-    protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+    protocol_error(c, op, c->rc, "%s [%s]", c->line, c->ident);
     disorder_eclient_close(c);
     return;
   }
   nonce = unhex(challenge, &nonce_len);
   res = authhash(nonce, nonce_len, config->password, algorithm);
   if(!res) {
-    protocol_error(c, op, c->rc, "%s: unknown authentication algorithm '%s'",
-                   c->ident, algorithm);
+    protocol_error(c, op, c->rc, "unknown authentication algorithm '%s' [%s]",
+                   algorithm, c->ident);
     disorder_eclient_close(c);
     return;
   }
@@ -637,7 +639,7 @@ static void authuser_opcallback(disorder_eclient *c,
   D(("authuser_opcallback"));
   if(c->rc / 100 != 2) {
     /* Wrong password or something.  We cannot proceed. */
-    protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+    protocol_error(c, op, c->rc, "%s [%s]", c->line, c->ident);
     c->enabled = 0;
     disorder_eclient_close(c);
     return;
@@ -874,8 +876,31 @@ static void vstash_command(disorder_eclient *c,
   if(cmd) {
     vector_init(&vec);
     vector_append(&vec, (char *)cmd);
-    while((arg = va_arg(ap, char *)))
-      vector_append(&vec, arg);
+    while((arg = va_arg(ap, char *))) {
+      if(arg == disorder__list) {
+       char **list = va_arg(ap, char **);
+       int nlist = va_arg(ap, int);
+       if(nlist < 0) {
+         for(nlist = 0; list[nlist]; ++nlist)
+           ;
+       }
+        vector_append_many(&vec, list, nlist);
+      } else if(arg == disorder__body) {
+       body = va_arg(ap, char **);
+       nbody = va_arg(ap, int);
+      } else if(arg == disorder__integer) {
+        long n = va_arg(ap, long);
+        char buffer[16];
+        snprintf(buffer, sizeof buffer, "%ld", n);
+        vector_append(&vec, xstrdup(buffer));
+      } else if(arg == disorder__time) {
+        time_t n = va_arg(ap, time_t);
+        char buffer[16];
+        snprintf(buffer, sizeof buffer, "%lld", (long long)n);
+        vector_append(&vec, xstrdup(buffer));
+      } else
+        vector_append(&vec, arg);
+    }
     stash_command_vector(c, queuejump, opcallback, completed, v, 
                          nbody, body, vec.nvec, vec.vec);
   } else
@@ -905,7 +930,7 @@ static void stash_command(disorder_eclient *c,
 static const char *errorstring(disorder_eclient *c) {
   char *s;
 
-  byte_xasprintf(&s, "%s: %s: %d", c->ident, c->line, c->rc);
+  byte_xasprintf(&s, "%s [%s]", c->line, c->ident);
   return s;
 }
 
@@ -916,8 +941,8 @@ static void string_response_opcallback(disorder_eclient *c,
     = (disorder_eclient_string_response *)op->completed;
     
   D(("string_response_callback"));
-  if(c->rc / 100 == 2 || c->rc == 555) {
-    if(op->completed) {
+  if(completed) {
+    if(c->rc / 100 == 2 || c->rc == 555) {
       if(c->rc == 555)
         completed(op->v, NULL, NULL);
       else if(c->protocol >= 2) {
@@ -931,9 +956,9 @@ static void string_response_opcallback(disorder_eclient *c,
           completed(op->v, "error parsing response", NULL);
       } else
         completed(op->v, NULL, c->line + 4);
-    }
-  } else
-    completed(op->v, errorstring(c), NULL);
+    } else
+      completed(op->v, errorstring(c), NULL);
+  }
 }
 
 /* for commands with a simple integer response */ 
@@ -963,10 +988,12 @@ static void no_response_opcallback(disorder_eclient *c,
     = (disorder_eclient_no_response *)op->completed;
 
   D(("no_response_callback"));
-  if(c->rc / 100 == 2)
-    completed(op->v, NULL);
-  else
-    completed(op->v, errorstring(c));
+  if(completed) {
+    if(c->rc / 100 == 2)
+      completed(op->v, NULL);
+    else
+      completed(op->v, errorstring(c));
+  }
 }
 
 /* error callback for queue_unmarshall */
@@ -1055,16 +1082,16 @@ static void list_response_opcallback(disorder_eclient *c,
 }
 
 /* for volume */
-static void volume_response_opcallback(disorder_eclient *c,
-                                       struct operation *op) {
-  disorder_eclient_volume_response *completed
-    = (disorder_eclient_volume_response *)op->completed;
-  int l, r;
+static void pair_integer_response_opcallback(disorder_eclient *c,
+                                             struct operation *op) {
+  disorder_eclient_pair_integer_response *completed
+    = (disorder_eclient_pair_integer_response *)op->completed;
+  long l, r;
 
   D(("volume_response_callback"));
   if(c->rc / 100 == 2) {
     if(op->completed) {
-      if(sscanf(c->line + 4, "%d %d", &l, &r) != 2 || l < 0 || r < 0)
+      if(sscanf(c->line + 4, "%ld %ld", &l, &r) != 2 || l < 0 || r < 0)
         completed(op->v, "cannot parse volume response", 0, 0);
       else
         completed(op->v, 0, l, r);
@@ -1088,291 +1115,12 @@ static int simple(disorder_eclient *c,
   return 0;
 }
 
-static int simple_body(disorder_eclient *c,
-                       operation_callback *opcallback,
-                       void (*completed)(),
-                       void *v,
-                       int nbody,
-                       char **body,
-                       const char *cmd, ...) {
-  va_list ap;
-
-  va_start(ap, cmd);
-  vstash_command(c, 0/*queuejump*/, opcallback, completed, v, nbody, body, cmd, ap);
-  va_end(ap);
-  /* Give the state machine a kick, since we might be in state_idle */
-  disorder_eclient_polled(c, 0);
-  return 0;
-}
-
 /* Commands ******************************************************************/
-int disorder_eclient_version(disorder_eclient *c,
-                             disorder_eclient_string_response *completed,
-                             void *v) {
-  return simple(c, string_response_opcallback, (void (*)())completed, v,
-                "version", (char *)0);
-}
-
-int disorder_eclient_namepart(disorder_eclient *c,
-                              disorder_eclient_string_response *completed,
-                              const char *track,
-                              const char *context,
-                              const char *part,
-                              void *v) {
-  return simple(c, string_response_opcallback, (void (*)())completed, v,
-                "part", track, context, part, (char *)0);
-}
-
-int disorder_eclient_play(disorder_eclient *c,
-                          const char *track,
-                          disorder_eclient_no_response *completed,
-                          void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "play", track, (char *)0);
-}
-
-int disorder_eclient_playafter(disorder_eclient *c,
-                               const char *target,
-                               int ntracks,
-                               const char **tracks,
-                               disorder_eclient_no_response *completed,
-                               void *v) {
-  struct vector vec;
-  int n;
-
-  if(!target)
-    target = "";
-  vector_init(&vec);
-  vector_append(&vec, (char *)"playafter");
-  vector_append(&vec, (char *)target);
-  for(n = 0; n < ntracks; ++n)
-    vector_append(&vec, (char *)tracks[n]);
-  stash_command_vector(c, 0/*queuejump*/, no_response_opcallback, completed, v,
-                       -1, 0, vec.nvec, vec.vec);
-  disorder_eclient_polled(c, 0);
-  return 0;
-}
-
-int disorder_eclient_pause(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "pause", (char *)0);
-}
-
-int disorder_eclient_resume(disorder_eclient *c,
-                            disorder_eclient_no_response *completed,
-                            void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "resume", (char *)0);
-}
-
-int disorder_eclient_scratch(disorder_eclient *c,
-                             const char *id,
-                             disorder_eclient_no_response *completed,
-                             void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "scratch", id, (char *)0);
-}
 
 int disorder_eclient_scratch_playing(disorder_eclient *c,
                                      disorder_eclient_no_response *completed,
                                      void *v) {
-  return disorder_eclient_scratch(c, 0, completed, v);
-}
-
-int disorder_eclient_remove(disorder_eclient *c,
-                            const char *id,
-                            disorder_eclient_no_response *completed,
-                            void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "remove", id, (char *)0);
-}
-
-int disorder_eclient_moveafter(disorder_eclient *c,
-                               const char *target,
-                               int nids,
-                               const char **ids,
-                               disorder_eclient_no_response *completed,
-                               void *v) {
-  struct vector vec;
-  int n;
-
-  vector_init(&vec);
-  vector_append(&vec, (char *)"moveafter");
-  vector_append(&vec, (char *)target);
-  for(n = 0; n < nids; ++n)
-    vector_append(&vec, (char *)ids[n]);
-  stash_command_vector(c, 0/*queuejump*/, no_response_opcallback, completed, v,
-                       -1, 0, vec.nvec, vec.vec);
-  disorder_eclient_polled(c, 0);
-  return 0;
-}
-
-int disorder_eclient_recent(disorder_eclient *c,
-                            disorder_eclient_queue_response *completed,
-                            void *v) {
-  return simple(c, queue_response_opcallback, (void (*)())completed, v,
-                "recent", (char *)0);
-}
-
-int disorder_eclient_queue(disorder_eclient *c,
-                            disorder_eclient_queue_response *completed,
-                            void *v) {
-  return simple(c, queue_response_opcallback, (void (*)())completed, v,
-                "queue", (char *)0);
-}
-
-int disorder_eclient_files(disorder_eclient *c,
-                           disorder_eclient_list_response *completed,
-                           const char *dir,
-                           const char *re,
-                           void *v) {
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "files", dir, re, (char *)0);
-}
-
-int disorder_eclient_dirs(disorder_eclient *c,
-                          disorder_eclient_list_response *completed,
-                          const char *dir,
-                          const char *re,
-                          void *v) {
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "dirs", dir, re, (char *)0);
-}
-
-int disorder_eclient_playing(disorder_eclient *c,
-                             disorder_eclient_queue_response *completed,
-                             void *v) {
-  return simple(c, playing_response_opcallback, (void (*)())completed, v,
-                "playing", (char *)0);
-}
-
-int disorder_eclient_length(disorder_eclient *c,
-                            disorder_eclient_integer_response *completed,
-                            const char *track,
-                            void *v) {
-  return simple(c, integer_response_opcallback, (void (*)())completed, v,
-                "length", track, (char *)0);
-}
-
-int disorder_eclient_volume(disorder_eclient *c,
-                            disorder_eclient_volume_response *completed,
-                            int l, int r,
-                            void *v) {
-  char sl[64], sr[64];
-
-  if(l < 0 && r < 0) {
-    return simple(c, volume_response_opcallback, (void (*)())completed, v,
-                  "volume", (char *)0);
-  } else if(l >= 0 && r >= 0) {
-    assert(l <= 100);
-    assert(r <= 100);
-    byte_snprintf(sl, sizeof sl, "%d", l);
-    byte_snprintf(sr, sizeof sr, "%d", r);
-    return simple(c, volume_response_opcallback, (void (*)())completed, v,
-                  "volume", sl, sr, (char *)0);
-  } else {
-    assert(!"invalid arguments to disorder_eclient_volume");
-    return -1;                          /* gcc is being dim */
-  }
-}
-
-int disorder_eclient_enable(disorder_eclient *c,
-                            disorder_eclient_no_response *completed,
-                            void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "enable", (char *)0);
-}
-
-int disorder_eclient_disable(disorder_eclient *c,
-                             disorder_eclient_no_response *completed,
-                             void *v){
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "disable", (char *)0);
-}
-
-int disorder_eclient_random_enable(disorder_eclient *c,
-                                   disorder_eclient_no_response *completed,
-                                   void *v){
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "random-enable", (char *)0);
-}
-
-int disorder_eclient_random_disable(disorder_eclient *c,
-                                    disorder_eclient_no_response *completed,
-                                    void *v){
-  return simple(c, no_response_opcallback, (void (*)())completed, v,
-                "random-disable", (char *)0);
-}
-
-int disorder_eclient_get(disorder_eclient *c,
-                         disorder_eclient_string_response *completed,
-                         const char *track, const char *pref,
-                         void *v) {
-  return simple(c, string_response_opcallback, (void (*)())completed, v, 
-                "get", track, pref, (char *)0);
-}
-
-int disorder_eclient_set(disorder_eclient *c,
-                         disorder_eclient_no_response *completed,
-                         const char *track, const char *pref, 
-                         const char *value,
-                         void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "set", track, pref, value, (char *)0);
-}
-
-int disorder_eclient_unset(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           const char *track, const char *pref, 
-                           void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "unset", track, pref, (char *)0);
-}
-
-int disorder_eclient_resolve(disorder_eclient *c,
-                             disorder_eclient_string_response *completed,
-                             const char *track,
-                             void *v) {
-  return simple(c, string_response_opcallback,  (void (*)())completed, v, 
-                "resolve", track, (char *)0);
-}
-
-int disorder_eclient_search(disorder_eclient *c,
-                            disorder_eclient_list_response *completed,
-                            const char *terms,
-                            void *v) {
-  if(!split(terms, 0, SPLIT_QUOTES, 0, 0)) return -1;
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "search", terms, (char *)0);
-}
-
-int disorder_eclient_nop(disorder_eclient *c,
-                         disorder_eclient_no_response *completed,
-                         void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "nop", (char *)0);
-}
-
-/** @brief Get the last @p max added tracks
- * @param c Client
- * @param completed Called with list
- * @param max Number of tracks to get, 0 for all
- * @param v Passed to @p completed
- *
- * The first track in the list is the most recently added.
- */
-int disorder_eclient_new_tracks(disorder_eclient *c,
-                                disorder_eclient_list_response *completed,
-                                int max,
-                                void *v) {
-  char limit[32];
-
-  sprintf(limit, "%d", max);
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "new", limit, (char *)0);
+  return disorder_eclient_scratch(c, completed, 0, v);
 }
 
 static void rtp_response_opcallback(disorder_eclient *c,
@@ -1407,217 +1155,6 @@ int disorder_eclient_rtp_address(disorder_eclient *c,
                 "rtp-address", (char *)0);
 }
 
-/** @brief Get the list of users
- * @param c Client
- * @param completed Called with list of users
- * @param v Passed to @p completed
- *
- * The user list is not sorted in any particular order.
- */
-int disorder_eclient_users(disorder_eclient *c,
-                           disorder_eclient_list_response *completed,
-                           void *v) {
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "users", (char *)0);
-}
-
-/** @brief Delete a user
- * @param c Client
- * @param completed Called on completion
- * @param user User to delete
- * @param v Passed to @p completed
- */
-int disorder_eclient_deluser(disorder_eclient *c,
-                             disorder_eclient_no_response *completed,
-                             const char *user,
-                             void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "deluser", user, (char *)0);
-}
-
-/** @brief Get a user property
- * @param c Client
- * @param completed Called on completion
- * @param user User to look up
- * @param property Property to look up
- * @param v Passed to @p completed
- */
-int disorder_eclient_userinfo(disorder_eclient *c,
-                              disorder_eclient_string_response *completed,
-                              const char *user,
-                              const char *property,
-                              void *v) {
-  return simple(c, string_response_opcallback,  (void (*)())completed, v, 
-                "userinfo", user, property, (char *)0);
-}
-
-/** @brief Modify a user property
- * @param c Client
- * @param completed Called on completion
- * @param user User to modify
- * @param property Property to modify
- * @param value New property value
- * @param v Passed to @p completed
- */
-int disorder_eclient_edituser(disorder_eclient *c,
-                              disorder_eclient_no_response *completed,
-                              const char *user,
-                              const char *property,
-                              const char *value,
-                              void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "edituser", user, property, value, (char *)0);
-}
-
-/** @brief Create a new user
- * @param c Client
- * @param completed Called on completion
- * @param user User to create
- * @param password Initial password
- * @param rights Initial rights or NULL
- * @param v Passed to @p completed
- */
-int disorder_eclient_adduser(disorder_eclient *c,
-                             disorder_eclient_no_response *completed,
-                             const char *user,
-                             const char *password,
-                             const char *rights,
-                             void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "adduser", user, password, rights, (char *)0);
-}
-
-/** @brief Adopt a track
- * @param c Client
- * @param completed Called on completion
- * @param id Track ID
- * @param v Passed to @p completed
- */
-int disorder_eclient_adopt(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           const char *id,
-                           void *v) {
-  return simple(c, no_response_opcallback, (void (*)())completed, v, 
-                "adopt", id, (char *)0);
-}
-
-/** @brief Get the list of playlists
- * @param c Client
- * @param completed Called with list of playlists
- * @param v Passed to @p completed
- *
- * The playlist list is not sorted in any particular order.
- */
-int disorder_eclient_playlists(disorder_eclient *c,
-                               disorder_eclient_list_response *completed,
-                               void *v) {
-  return simple(c, list_response_opcallback, (void (*)())completed, v,
-                "playlists", (char *)0);
-}
-
-/** @brief Delete a playlist
- * @param c Client
- * @param completed Called on completion
- * @param playlist Playlist to delete
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_delete(disorder_eclient *c,
-                                     disorder_eclient_no_response *completed,
-                                     const char *playlist,
-                                     void *v) {
-  return simple(c, no_response_opcallback,  (void (*)())completed, v,
-                "playlist-delete", playlist, (char *)0);
-}
-
-/** @brief Lock a playlist
- * @param c Client
- * @param completed Called on completion
- * @param playlist Playlist to lock
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_lock(disorder_eclient *c,
-                                   disorder_eclient_no_response *completed,
-                                   const char *playlist,
-                                   void *v) {
-  return simple(c, no_response_opcallback,  (void (*)())completed, v,
-                "playlist-lock", playlist, (char *)0);
-}
-
-/** @brief Unlock the locked a playlist
- * @param c Client
- * @param completed Called on completion
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_unlock(disorder_eclient *c,
-                                     disorder_eclient_no_response *completed,
-                                     void *v) {
-  return simple(c, no_response_opcallback,  (void (*)())completed, v,
-                "playlist-unlock", (char *)0);
-}
-
-/** @brief Set a playlist's sharing
- * @param c Client
- * @param completed Called on completion
- * @param playlist Playlist to modify
- * @param sharing @c "public" or @c "private"
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_set_share(disorder_eclient *c,
-                                        disorder_eclient_no_response *completed,
-                                        const char *playlist,
-                                        const char *sharing,
-                                        void *v) {
-  return simple(c, no_response_opcallback,  (void (*)())completed, v,
-                "playlist-set-share", playlist, sharing, (char *)0);
-}
-
-/** @brief Get a playlist's sharing
- * @param c Client
- * @param completed Called with sharing status
- * @param playlist Playlist to inspect
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_get_share(disorder_eclient *c,
-                                        disorder_eclient_string_response *completed,
-                                        const char *playlist,
-                                        void *v) {
-  return simple(c, string_response_opcallback,  (void (*)())completed, v,
-                "playlist-get-share", playlist, (char *)0);
-}
-
-/** @brief Set a playlist
- * @param c Client
- * @param completed Called on completion
- * @param playlist Playlist to modify
- * @param tracks List of tracks
- * @param ntracks Number of tracks
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_set(disorder_eclient *c,
-                                  disorder_eclient_no_response *completed,
-                                  const char *playlist,
-                                  char **tracks,
-                                  int ntracks,
-                                  void *v) {
-  return simple_body(c, no_response_opcallback, (void (*)())completed, v,
-                     ntracks, tracks,
-                     "playlist-set", playlist, (char *)0);
-}
-
-/** @brief Get a playlist's contents
- * @param c Client
- * @param completed Called with playlist contents
- * @param playlist Playlist to inspect
- * @param v Passed to @p completed
- */
-int disorder_eclient_playlist_get(disorder_eclient *c,
-                                  disorder_eclient_list_response *completed,
-                                  const char *playlist,
-                                  void *v) {
-  return simple(c, list_response_opcallback,  (void (*)())completed, v,
-                "playlist-get", playlist, (char *)0);
-}
-
 /* Log clients ***************************************************************/
 
 /** @brief Monitor the server log
@@ -1919,6 +1456,14 @@ static void logentry_adopted(disorder_eclient *c,
     c->log_callbacks->adopted(c->log_v, vec[0], vec[1]);
 }
 
+static void logentry_global_pref(disorder_eclient *c,
+                                 int nvec, char **vec) {
+  if(c->log_callbacks->global_pref) 
+    c->log_callbacks->global_pref(c->log_v, vec[0], nvec > 1 ? vec[1] : 0);
+}
+
+#include "eclient-stubs.c"
+
 /*
 Local Variables:
 c-basic-offset:2
index b100106c04abd55f25e4ebdf6c1593b957efe140..876e2c6d3af17c774f8d37f7f5928834fc49a1bb 100644 (file)
@@ -17,6 +17,8 @@
  */
 /** @file lib/eclient.h
  * @brief Client code for event-driven programs
+ *
+ * See @ref lib/eclient-stubs.h for the (generated) per-command entry points.
  */
 
 #ifndef ECLIENT_H
@@ -177,6 +179,9 @@ typedef struct disorder_eclient_log_callbacks {
 
   /** @brief Called when a new playlist is deleted */
   void (*playlist_deleted)(void *v, const char *playlist);
+
+  /** @brief Called when a global pref is changed or delete */
+  void (*global_pref)(void *v, const char *pref, const char *value/*or NULL*/);
 } disorder_eclient_log_callbacks;
 
 /* State bits */
@@ -240,7 +245,7 @@ typedef void disorder_eclient_string_response(void *v,
                                               const char *err,
                                               const char *value);
 
-/** @brief String result completion callback
+/** @brief Integer result completion callback
  * @param v User data
  * @param err Error string or NULL on succes
  * @param value Result or 0
@@ -264,9 +269,9 @@ typedef void disorder_eclient_integer_response(void *v,
  * @p error will be non-NULL on failure.  In this case @p l and @p r are always
  * 0.
  */
-typedef void disorder_eclient_volume_response(void *v,
-                                              const char *err,
-                                              int l, int r);
+typedef void disorder_eclient_pair_integer_response(void *v,
+                                                    const char *err,
+                                                    long l, long r);
 
 /** @brief Queue request completion callback
  * @param v User data
@@ -284,6 +289,8 @@ typedef void disorder_eclient_queue_response(void *v,
                                              const char *err,
                                              struct queue_entry *q);
 
+#define disorder_eclient_playing_response disorder_eclient_queue_response
+
 /** @brief List request completion callback
  * @param v User data
  * @param err Error string or NULL on success
@@ -314,234 +321,25 @@ void disorder_eclient_polled(disorder_eclient *c, unsigned mode);
 /* Should be called when c's FD is readable and/or writable, and in any case
  * from time to time (so that retries work). */
 
-int disorder_eclient_version(disorder_eclient *c,
-                             disorder_eclient_string_response *completed,
-                             void *v);
-/* fetch the server version */
-
-int disorder_eclient_play(disorder_eclient *c,
-                          const char *track,
-                          disorder_eclient_no_response *completed,
-                          void *v);
-/* add a track to the queue */
-
-int disorder_eclient_playafter(disorder_eclient *c,
-                               const char *target,
-                               int ntracks,
-                               const char **tracks,
-                               disorder_eclient_no_response *completed,
-                               void *v);
-/* insert multiple tracks to an arbitrary point in the queue */
-
-int disorder_eclient_pause(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           void *v);
-/* add a track to the queue */
-
-int disorder_eclient_resume(disorder_eclient *c,
-                            disorder_eclient_no_response *completed,
-                            void *v);
-/* add a track to the queue */
-
-int disorder_eclient_scratch(disorder_eclient *c,
-                             const char *id,
-                             disorder_eclient_no_response *completed,
-                             void *v);
-/* scratch a track by ID */
-
 int disorder_eclient_scratch_playing(disorder_eclient *c,
                                      disorder_eclient_no_response *completed,
                                      void *v);
 /* scratch the playing track whatever it is */
 
-int disorder_eclient_remove(disorder_eclient *c,
-                            const char *id,
-                            disorder_eclient_no_response *completed,
-                            void *v);
-/* remove a track from the queue */
-
-int disorder_eclient_moveafter(disorder_eclient *c,
-                               const char *target,
-                               int nids,
-                               const char **ids,
-                               disorder_eclient_no_response *completed,
-                               void *v);
-/* move tracks within the queue */
-
-int disorder_eclient_playing(disorder_eclient *c,
-                             disorder_eclient_queue_response *completed,
-                             void *v);
-/* find the currently playing track (0 for none) */
-
-int disorder_eclient_queue(disorder_eclient *c,
-                           disorder_eclient_queue_response *completed,
-                           void *v);
-/* list recently played tracks */
-
-int disorder_eclient_recent(disorder_eclient *c,
-                            disorder_eclient_queue_response *completed,
-                            void *v);
-/* list recently played tracks */
-
-int disorder_eclient_files(disorder_eclient *c,
-                           disorder_eclient_list_response *completed,
-                           const char *dir,
-                           const char *re,
-                           void *v);
-/* list files in a directory, matching RE if not a null pointer */
-
-int disorder_eclient_dirs(disorder_eclient *c,
-                          disorder_eclient_list_response *completed,
-                          const char *dir,
-                          const char *re,
-                          void *v);
-/* list directories in a directory, matching RE if not a null pointer */
-
-int disorder_eclient_namepart(disorder_eclient *c,
-                              disorder_eclient_string_response *completed,
-                              const char *track,
-                              const char *context,
-                              const char *part,
-                              void *v);
-/* look up a track name part */
-
-int disorder_eclient_length(disorder_eclient *c,
-                            disorder_eclient_integer_response *completed,
-                            const char *track,
-                            void *v);
-/* look up a track name length */
-
-int disorder_eclient_volume(disorder_eclient *c,
-                            disorder_eclient_volume_response *callback,
-                            int l, int r,
-                            void *v);
-/* If L and R are both -ve gets the volume.
- * If neither are -ve then sets the volume.
- * Otherwise asserts!
- */
-
-int disorder_eclient_enable(disorder_eclient *c,
-                            disorder_eclient_no_response *callback,
-                            void *v);
-int disorder_eclient_disable(disorder_eclient *c,
-                             disorder_eclient_no_response *callback,
-                             void *v);
-int disorder_eclient_random_enable(disorder_eclient *c,
-                                   disorder_eclient_no_response *callback,
-                                   void *v);
-int disorder_eclient_random_disable(disorder_eclient *c,
-                                    disorder_eclient_no_response *callback,
-                                    void *v);
-/* Enable/disable play/random play */
-
-int disorder_eclient_resolve(disorder_eclient *c,
-                             disorder_eclient_string_response *completed,
-                             const char *track,
-                             void *v);
-/* Resolve aliases */
-
 int disorder_eclient_log(disorder_eclient *c,
                          const disorder_eclient_log_callbacks *callbacks,
                          void *v);
 /* Make this a log client (forever - it automatically becomes one again upon
  * reconnection) */
 
-int disorder_eclient_get(disorder_eclient *c,
-                         disorder_eclient_string_response *completed,
-                         const char *track, const char *pref,
-                         void *v);
-int disorder_eclient_set(disorder_eclient *c,
-                         disorder_eclient_no_response *completed,
-                         const char *track, const char *pref, 
-                         const char *value,
-                         void *v);
-int disorder_eclient_unset(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           const char *track, const char *pref, 
-                           void *v);
-/* Get/set preference values */
-
-int disorder_eclient_search(disorder_eclient *c,
-                            disorder_eclient_list_response *completed,
-                            const char *terms,
-                            void *v);
-
-int disorder_eclient_nop(disorder_eclient *c,
-                         disorder_eclient_no_response *completed,
-                         void *v);
-
-int disorder_eclient_new_tracks(disorder_eclient *c,
-                                disorder_eclient_list_response *completed,
-                                int max,
-                                void *v);
-
 int disorder_eclient_rtp_address(disorder_eclient *c,
                                  disorder_eclient_list_response *completed,
                                  void *v);
 
-int disorder_eclient_users(disorder_eclient *c,
-                           disorder_eclient_list_response *completed,
-                           void *v);
-int disorder_eclient_deluser(disorder_eclient *c,
-                             disorder_eclient_no_response *completed,
-                             const char *user,
-                             void *v);
-int disorder_eclient_userinfo(disorder_eclient *c,
-                              disorder_eclient_string_response *completed,
-                              const char *user,
-                              const char *property,
-                              void *v);
-int disorder_eclient_edituser(disorder_eclient *c,
-                              disorder_eclient_no_response *completed,
-                              const char *user,
-                              const char *property,
-                              const char *value,
-                              void *v);
-int disorder_eclient_adduser(disorder_eclient *c,
-                             disorder_eclient_no_response *completed,
-                             const char *user,
-                             const char *password,
-                             const char *rights,
-                             void *v);
 void disorder_eclient_enable_connect(disorder_eclient *c);
 void disorder_eclient_disable_connect(disorder_eclient *c);
-int disorder_eclient_adopt(disorder_eclient *c,
-                           disorder_eclient_no_response *completed,
-                           const char *id,
-                           void *v);  
-int disorder_eclient_playlists(disorder_eclient *c,
-                               disorder_eclient_list_response *completed,
-                               void *v);
-int disorder_eclient_playlist_delete(disorder_eclient *c,
-                                     disorder_eclient_no_response *completed,
-                                     const char *playlist,
-                                     void *v);
-int disorder_eclient_playlist_lock(disorder_eclient *c,
-                                   disorder_eclient_no_response *completed,
-                                   const char *playlist,
-                                   void *v);
-int disorder_eclient_playlist_unlock(disorder_eclient *c,
-                                     disorder_eclient_no_response *completed,
-                                     void *v);
-int disorder_eclient_playlist_set_share(disorder_eclient *c,
-                                        disorder_eclient_no_response *completed,
-                                        const char *playlist,
-                                        const char *sharing,
-                                        void *v);
-int disorder_eclient_playlist_get_share(disorder_eclient *c,
-                                        disorder_eclient_string_response *completed,
-                                        const char *playlist,
-                                        void *v);
-int disorder_eclient_playlist_set(disorder_eclient *c,
-                                  disorder_eclient_no_response *completed,
-                                  const char *playlist,
-                                  char **tracks,
-                                  int ntracks,
-                                  void *v);
-int disorder_eclient_playlist_get(disorder_eclient *c,
-                                  disorder_eclient_list_response *completed,
-                                  const char *playlist,
-                                  void *v);
+
+#include "eclient-stubs.h"
 
 #endif
 
index 37893b6ef1cc30fd5dfdf6d60441ea00002b5e0d..e0fb0fa9b4256aeb8d4aecf835b85395a73e9732 100644 (file)
 #include "eventdist.h"
 #include "hash.h"
 
+/** @brief Event data
+ *
+ * @c event_data structures form linked lists; one list per event and one node
+ * per handler.
+ */
 struct event_data {
+  /** @brief Next handler */
   struct event_data *next;
+
+  /** @brief Name of event */
   const char *event;
+
+  /** @brief Handler callback */
   event_handler *callback;
+
+  /** @brief Passed to @ref callback */
   void *callbackdata;
 };
 
index a56884b33d50b3874f3f537eca2b5daedbfb3b5a..9ca22926719870db7d7622fdc7c0de64a1914473 100644 (file)
@@ -28,6 +28,7 @@
 #include "eventlog.h"
 #include "split.h"
 
+/** @brief Linked list of event logs */
 static struct eventlog_output *outputs;
 
 void eventlog_add(struct eventlog_output *lo) {
@@ -44,6 +45,11 @@ void eventlog_remove(struct eventlog_output *lo) {
     *pp = lo->next;
 }
 
+/** @brief Write to the event log
+ * @param keyword Distinguishing keyword for event
+ * @param raw Unformatted data
+ * @param ap Extra data, terminated by (char *)0
+ */
 static void veventlog(const char *keyword, const char *raw, va_list ap) {
   struct eventlog_output *p, *pnext;
   struct dynstr d;
index 87eea513495368e51c3ee588b54477f00cf40923..e29fcfc7db300c13fb9d4c1c46f4a3c0b55dd1b9 100644 (file)
 #ifndef EVENTLOG_H
 #define EVENTLOG_H
 
-/* definition of an event log output.  The caller must allocate these
- * (since log.c isn't allowed to perform memory allocation). */
+/** @brief An output for the event log
+ *
+ * The caller must allocate these (since log.c isn't allowed to perform memory
+ * allocation).  They form a linked list, using eventlog_add() and
+ * eventlog_remove().
+ */
 struct eventlog_output {
+  /** @brief Next output */
   struct eventlog_output *next;
+
+  /** @brief Handler for this output */
   void (*fn)(const char *msg, void *user);
+
+  /** @brief Passed to @ref fn */
   void *user;
 };
 
+/** @brief Add an event log output
+ * @param lo Pointer to output to add
+ */
 void eventlog_add(struct eventlog_output *lo);
-/* add a log output */
 
+/** @brief Remove an event log output
+ * @param lo Pointer to output to remove
+ */
 void eventlog_remove(struct eventlog_output *lo);
-/* remove a log output */
 
+/** @brief Send a message to the event log
+ * @param keyword Distinguishing keyword for event
+ * @param ... Extra data, terminated by (char *)0
+ */
 void eventlog(const char *keyword, ...);
+
+/** @brief Send a message to the event log
+ * @param keyword Distinguishing keyword for event
+ * @param raw Unformatted data
+ * @param ... Extra data, terminated by (char *)0
+ */
 void eventlog_raw(const char *keyword, const char *raw, ...);
-/* send a message to the event log */
 
 #endif /* EVENTLOG_H */
 
index ac0c0d813f8e070acc2df1e258403234ea53df9b..3227f12f38fd3f5af07de8b255d424257613d3dd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
 
 #include "printf.h"
 #include "sink.h"
+#include "mem.h"
 
 /** @brief vfprintf() workalike that always accepts UTF-8
  * @param fp Stream to write to
  * @return -1 on error or bytes written on success
  */
 int byte_vfprintf(FILE *fp, const char *fmt, va_list ap) {
-  return byte_vsinkprintf(sink_stdio(0, fp), fmt, ap);
+  struct sink *s = sink_stdio(0, fp);
+  int rc = byte_vsinkprintf(s, fmt, ap);
+  xfree(s);
+  return rc;
 }
 
 /** @brief fprintf() workalike that always accepts UTF-8
index 573b50aa91b9a235294a0e59338ccb474f8a0faa..9dc346950680a2d83eb7d439ac3a0d7419437e5e 100644 (file)
@@ -25,6 +25,7 @@
 #include "log.h"
 #include "kvp.h"
 
+/** @brief One entry in a hash table */
 struct entry {
   struct entry *next;                   /* next entry same key */
   size_t h;                             /* hash of KEY */
@@ -32,6 +33,7 @@ struct entry {
   void *value;                          /* value of this entry */
 };
 
+/** @brief A hash table */
 struct hash {
   size_t nslots;                        /* number of slots */
   size_t nitems;                        /* total number of entries */
diff --git a/lib/hreader.c b/lib/hreader.c
new file mode 100644 (file)
index 0000000..bdf3c07
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2010 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/hreader.c
+ * @brief Hands-off reader - read files without keeping them open
+ */
+#include <config.h>
+#include "hreader.h"
+#include "mem.h"
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+
+static int hreader_fill(struct hreader *h, off_t offset);
+
+int hreader_init(const char *path, struct hreader *h) {
+  struct stat sb;
+  if(stat(path, &sb) < 0)
+    return -1;
+  memset(h, 0, sizeof *h);
+  h->path = xstrdup(path);
+  h->size = sb.st_size;
+  h->bufsize = 65536;
+  h->buffer = xmalloc_noptr(h->bufsize);
+  return 0;
+}
+
+void hreader_close(struct hreader *h) {
+  xfree(h->path);
+  xfree(h->buffer);
+}
+
+int hreader_read(struct hreader *h, void *buffer, size_t n) {
+  int r = hreader_pread(h, buffer, n, h->read_offset);
+  if(r > 0)
+    h->read_offset += r;
+  return r;
+}
+
+int hreader_pread(struct hreader *h, void *buffer, size_t n, off_t offset) {
+  size_t bytes_read = 0;
+
+  while(bytes_read < n) {
+    // If the desired byte range is outside the file, fetch new contents
+    if(offset < h->buf_offset || offset >= h->buf_offset + (off_t)h->bytes) {
+      int r = hreader_fill(h, offset);
+      if(r < 0)
+        return -1;                      /* disaster! */
+      else if(r == 0)
+        break;                          /* end of file */
+    }
+    // Figure out how much we can read this time round
+    size_t left = h->bytes - (offset - h->buf_offset);
+    // Truncate the read if we don't want that much
+    if(left > (n - bytes_read))
+      left = n - bytes_read;
+    memcpy((char *)buffer + bytes_read,
+           h->buffer + (offset - h->buf_offset),
+           left);
+    offset += left;
+    bytes_read += left;
+  }
+  return bytes_read;
+}
+
+static int hreader_fill(struct hreader *h, off_t offset) {
+  int fd = open(h->path, O_RDONLY);
+  if(fd < 0)
+    return -1;
+  int n = pread(fd, h->buffer, h->bufsize, offset);
+  close(fd);
+  if(n < 0)
+    return -1;
+  h->buf_offset = offset;
+  h->bytes = n;
+  return n;
+}
+
+off_t hreader_seek(struct hreader *h, off_t offset, int whence) {
+  switch(whence) {
+  case SEEK_SET: break;
+  case SEEK_CUR: offset += h->read_offset; break;
+  case SEEK_END: offset += h->size; break;
+  default: einval: errno = EINVAL; return -1;
+  }
+  if(offset < 0) goto einval;
+  h->read_offset = offset;
+  return offset;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/hreader.h b/lib/hreader.h
new file mode 100644 (file)
index 0000000..90431c1
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2010 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/hreader.h
+ * @brief Hands-off reader - read files without keeping them open
+ */
+#ifndef HREADER_H
+#define HREADER_H
+
+#include <unistd.h>
+
+/** @brief A hands-off reader
+ *
+ * Allows files to be read without holding them open.
+ */
+struct hreader {
+  char *path;                   /* file to read */
+  off_t size;                   /* file size */
+  off_t read_offset;            /* for next hreader_read() */
+  off_t buf_offset;             /* offset of start of buffer */
+  char *buffer;                        /* input buffer */
+  size_t bufsize;              /* buffer size */
+  size_t bytes;                        /* size of last read */
+};
+
+/** @brief Initialize a hands-off reader
+ * @param path File to read
+ * @param h Reader to initialize
+ * @return 0 on success, -1 on error
+ */
+int hreader_init(const char *path, struct hreader *h);
+
+/** @brief Close a hands-off reader
+ * @param h Reader to close
+ */
+void hreader_close(struct hreader *h);
+
+/** @brief Read some bytes
+ * @param h Reader to read from
+ * @param buffer Where to store bytes
+ * @param n Maximum bytes to read
+ * @return Bytes read, or 0 at EOF, or -1 on error
+ */
+int hreader_read(struct hreader *h, void *buffer, size_t n);
+
+/** @brief Read some bytes at a given offset
+ * @param h Reader to read from
+ * @param offset Offset to read at
+ * @param buffer Where to store bytes
+ * @param n Maximum bytes to read
+ * @return Bytes read, or 0 at EOF, or -1 on error
+ */
+int hreader_pread(struct hreader *h, void *buffer, size_t n, off_t offset);
+
+/** @brief Seek within a file
+ * @param h Reader to seek
+ * @param offset Offset
+ * @param whence SEEK_*
+ * @return Result offset
+ */
+off_t hreader_seek(struct hreader *h, off_t offset, int whence);
+
+/** @brief Return file size
+ * @param h Reader to find size of
+ * @return Size in bytes
+ */
+static inline off_t hreader_size(const struct hreader *h) {
+  return h->size;
+}
+
+/** @brief Test for end of file
+ * @param h Reader to test
+ * @return 1 at eof, 0 otherwise
+ *
+ * This tells you whether the next read will return 0 bytes, rather than
+ * whether the last read reached end of file.  So it is slightly different to
+ * feof().
+ */
+static inline int hreader_eof(const struct hreader *h) {
+  return h->read_offset == h->size;
+}
+
+#endif /* HREADER_H */
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 45aa03c190f3533540b95f323d473e9e95b0b594..f17cdc1edb05c9ac77ed63b3332465409b07edd6 100644 (file)
--- a/lib/kvp.c
+++ b/lib/kvp.c
@@ -287,6 +287,15 @@ struct kvp *kvp_make(const char *name, ...) {
   return kvp;
 }
 
+void kvp_free(struct kvp *k) {
+  if(k) {
+    kvp_free(k->next);
+    xfree((void *)k->name);
+    xfree((void *)k->value);
+    xfree(k);
+  }
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index 0a7e4780d0af3691c25ea3a10043406f78e26c0f..732a8a68623613be96154d3a0d3c95a57baaffeb 100644 (file)
--- a/lib/kvp.h
+++ b/lib/kvp.h
@@ -71,6 +71,8 @@ char *urlencodestring(const char *s);
 char *urldecodestring(const char *s, size_t ns);
 struct kvp *kvp_make(const char *key, ...);
 
+void kvp_free(struct kvp *k);
+
 #endif /* KVP_H */
 
 /*
index 9cc54d64fc9c9e382b586a6f5629661d19685f86..48354b3d7ed636958bc2765cbfa3f1c97f99da44 100644 (file)
@@ -110,7 +110,7 @@ static const char *skipwhite(const char *s, int rfc822_comments) {
   int c, depth;
   
   for(;;) {
-    switch(c = *s) {
+    switch(*s) {
     case ' ':
     case '\t':
     case '\r':
@@ -402,7 +402,7 @@ int mime_multipart(const char *s,
  * @param s Start of field
  * @param dispositionp Where to store disposition
  * @param parameternamep Where to store parameter name
- * @param parametervaluep Wher to store parameter value
+ * @param parametervaluep Where to store parameter value
  * @return 0 on success, non-0 on error
  *
  * See <a href="http://tools.ietf.org/html/rfc2388#section-3">RFC 2388 s3</a>
index 69a798696737e9f2d2efe629cffc62e3839d444b..e39ca5f3f92fb36c28429bdb0fb74335833d9036 100644 (file)
@@ -30,6 +30,7 @@
 #include "syscalls.h"
 #include "table.h"
 #include "printf.h"
+#include "vector.h"
 
 const char *const playing_states[] = {
   "failed",
@@ -95,11 +96,17 @@ static const char *marshall_long(const struct queue_entry *q, size_t offset) {
   return xstrdup(buffer);
 }
 
+static void free_none(struct queue_entry attribute((unused)) *q,
+                      size_t attribute((unused)) offset) {
+}
+
+#define free_long free_none
+
 static int unmarshall_string(char *data, struct queue_entry *q,
                             size_t offset,
                             void attribute((unused)) (*error_handler)(const char *, void *),
                             void attribute((unused)) *u) {
-  VALUE(q, offset, char *) = data;
+  VALUE(q, offset, char *) = xstrdup(data);
   return 0;
 }
 
@@ -107,6 +114,10 @@ static const char *marshall_string(const struct queue_entry *q, size_t offset) {
   return VALUE(q, offset, char *);
 }
 
+static void free_string(struct queue_entry *q, size_t offset) {
+  xfree(VALUE(q, offset, char *));
+}
+
 static int unmarshall_time_t(char *data, struct queue_entry *q,
                             size_t offset,
                             void (*error_handler)(const char *, void *),
@@ -134,6 +145,8 @@ static const char *marshall_time_t(const struct queue_entry *q, size_t offset) {
   return xstrdup(buffer);
 }
 
+#define free_time_t free_none
+
 static int unmarshall_state(char *data, struct queue_entry *q,
                            size_t offset,
                            void (*error_handler)(const char *, void *),
@@ -176,15 +189,29 @@ static const char *marshall_origin(const struct queue_entry *q, size_t offset) {
   return track_origins[VALUE(q, offset, enum track_origin)];
 }
 
-#define F(n, h) { #n, offsetof(struct queue_entry, n), marshall_##h, unmarshall_##h }
+#define free_state free_none
+#define free_origin free_none
+
+#define F(n, h) { #n, offsetof(struct queue_entry, n), marshall_##h, unmarshall_##h, free_##h }
 
-static const struct field {
+/** @brief A field in a @ref queue_entry */
+static const struct queue_field {
+  /** @brief Field name */
   const char *name;
+
+  /** @brief Offset of value in @ref queue_entry structure */
   size_t offset;
+
+  /** @brief Marshaling function */
   const char *(*marshall)(const struct queue_entry *q, size_t offset);
+
+  /** @brief Unmarshaling function */
   int (*unmarshall)(char *data, struct queue_entry *q, size_t offset,
                    void (*error_handler)(const char *, void *),
                    void *u);
+
+  /** @brief Destructor */
+  void (*free)(struct queue_entry *q, size_t offset);
 } fields[] = {
   /* Keep this table sorted. */
   F(expected, time_t),
@@ -199,6 +226,7 @@ static const struct field {
   F(when, time_t),
   F(wstat, long)
 };
+#define NFIELDS (sizeof fields / sizeof *fields)
 
 int queue_unmarshall(struct queue_entry *q, const char *s,
                     void (*error_handler)(const char *, void *),
@@ -209,7 +237,9 @@ int queue_unmarshall(struct queue_entry *q, const char *s,
   q->pid = -1;                          /* =none */
   if(!(vec = split(s, &nvec, SPLIT_QUOTES, error_handler, u)))
     return -1;
-  return queue_unmarshall_vec(q, nvec, vec, error_handler, u);
+  int rc = queue_unmarshall_vec(q, nvec, vec, error_handler, u);
+  free_strings(nvec, vec);
+  return rc;
 }
 
 int queue_unmarshall_vec(struct queue_entry *q, int nvec, char **vec,
@@ -258,6 +288,16 @@ char *queue_marshall(const struct queue_entry *q) {
   return r;
 }
 
+void queue_free(struct queue_entry *q, int rest) {
+  if(!q)
+    return;
+  if(rest)
+    queue_free(q->next, rest);
+  for(unsigned n = 0; n < NFIELDS; ++n)
+    fields[n].free(q, fields[n].offset);
+  xfree(q);
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index c287ebe950afd4eb9ce55e989be998c6c1713796..9bad76e11d6b9b6658583d7aad0e16695b0e7937 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -220,6 +220,12 @@ struct queue_entry {
   
   /** @brief Decoder (or player) process ID */
   pid_t pid;
+
+  /** @brief Termination signal sent to subprocess
+   *
+   * Used to supress 'terminated' messages.
+   */
+  int killed;
 };
 
 void queue_insert_entry(struct queue_entry *b, struct queue_entry *n);
@@ -238,6 +244,8 @@ int queue_unmarshall_vec(struct queue_entry *q, int nvec, char **vec,
 char *queue_marshall(const struct queue_entry *q);
 /* marshall @q@ into a UTF-8 string */
 
+void queue_free(struct queue_entry *q, int rest);
+
 #endif /* QUEUE_H */
 
 /*
index 39514ed37c3cf6497ba05a1e530053932db39d57..bee3d951394a74c80f88fdf8ced77c83711a7729 100644 (file)
  * @param input_channels Number of input channels
  * @param input_signed Whether input samples are signed or unsigned
  * @param input_rate Frames/second in input
+ * @param input_endian Input endianness (@c ENDIAN_BIG or @c ENDIAN_LITTLE)
  * @param output_bits Bits/sample in output
  * @param output_channels Number of output channels
  * @param output_rate Frames/second in output
  * @param output_signed Whether output samples are signed or unsigned
+ * @param output_endian Output endianness (@c ENDIAN_BIG or @c ENDIAN_LITTLE)
  *
  * For formats with more than two channels it's assume that the first
  * two channels are left and right.  No particular meaning is attached
@@ -199,7 +201,7 @@ static size_t resample_put_sample(const struct resampler *rs,
 /** @brief Convert input samples to floats
  * @param rs Resampler state
  * @param bytes Input bytes
- * @param nbytes Number of input bytes
+ * @param nframes Number of input frames
  * @param floats Where to store converted data
  *
  * @p floats must be big enough.  As well as converting to floats this
index e99aaeb3455de23d77fef9a981f61bcf0157120a..a78932571726afbe4b5ae11f59cebe9db7e49864 100644 (file)
 
 #include "byte-order.h"
 
+/** @brief An audio resampler */
 struct resampler {
-  int input_bits, input_channels, input_rate, input_signed, input_endian;
-  int output_bits, output_channels, output_rate, output_signed, output_endian;
+  /** @brief Bits/sample in input */
+  int input_bits;
+
+  /** @brief Number of input channels */
+  int input_channels;
+
+  /** @brief Frames/second in input */
+  int input_rate;
+
+  /** @brief Whether input samples are signed or unsigned */
+  int input_signed;
+
+  /** @brief Input endianness (@c ENDIAN_BIG or @c ENDIAN_LITTLE) */
+  int input_endian;
+
+  /** @brief Bits/sample in output */
+  int output_bits;
+
+  /** @brief Number of output channels */
+  int output_channels;
+
+  /** @brief Frames/second in output */
+  int output_rate;
+
+  /** @brief Whether output samples are signed or unsigned */
+  int output_signed;
+
+  /** @brief Output endianness (@c ENDIAN_BIG or @c ENDIAN_LITTLE) */
+  int output_endian;
+
+  /** @brief  */
   int input_bytes_per_sample;
+
+  /** @brief  */
   int input_bytes_per_frame;
 #if HAVE_SAMPLERATE_H
+  /** @brief Libsamplerate handle */
   SRC_STATE *state;
 #endif
 };
index 524f68d97fb88449f624dba7014f48c75dac7f0e..0c5f4db0f7a70e9797a861169d561a5ea9fc79ab 100644 (file)
@@ -118,7 +118,7 @@ static int sendmailfp(const char *tag, FILE *in, FILE *out,
                      const char *encoding,
                      const char *content_type,
                      const char *body) {
-  int rc, sol = 1;
+  int sol = 1;
   const char *ptr;
   uint8_t idbuf[20];
   char *id;
@@ -131,23 +131,23 @@ static int sendmailfp(const char *tag, FILE *in, FILE *out,
   strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S +0000", &ut);
   gcry_create_nonce(idbuf, sizeof idbuf);
   id = mime_to_base64(idbuf, sizeof idbuf);
-  if((rc = getresponse(tag, in)) / 100 != 2)
+  if(getresponse(tag, in) / 100 != 2)
     return -1;
   if(sendcommand(tag, out, "HELO %s", local_hostname()))
     return -1;
-  if((rc = getresponse(tag, in)) / 100 != 2)
+  if(getresponse(tag, in) / 100 != 2)
     return -1;
   if(sendcommand(tag, out, "MAIL FROM:<%s>", sender))
     return -1;
-  if((rc = getresponse(tag, in)) / 100 != 2)
+  if(getresponse(tag, in) / 100 != 2)
     return -1;
   if(sendcommand(tag, out, "RCPT TO:<%s>", recipient))
     return -1;
-  if((rc = getresponse(tag, in)) / 100 != 2)
+  if(getresponse(tag, in) / 100 != 2)
     return -1;
   if(sendcommand(tag, out, "DATA", sender))
     return -1;
-  if((rc = getresponse(tag, in)) / 100 != 3)
+  if(getresponse(tag, in) / 100 != 3)
     return -1;
   if(fprintf(out, "From: %s\r\n", pubsender) < 0
      || fprintf(out, "To: %s\r\n", recipient) < 0
@@ -181,7 +181,7 @@ static int sendmailfp(const char *tag, FILE *in, FILE *out,
   if(fprintf(out, ".\r\n") < 0
      || fflush(out) < 0)
     goto write_error;
-  if((rc = getresponse(tag, in)) / 100 != 2)
+  if(getresponse(tag, in) / 100 != 2)
     return -1;
   return 0;
 }
index 27f9509c49653419b7f19fdf8a0e3460035fe23b..316fe6a441fb217e186753d988716f0b741f1934 100644 (file)
 #include "table.h"
 #include "signame.h"
 
+/** @brief Mapping between signal names and numbers */
 static const struct sigtable {
+  /** @brief Signal number */
   int signal;
+
+  /* @brief Signal name ("SIGwhatever") */
   const char *name;
 } signals[] = {
 #define S(sig) { sig, #sig }
index e62e3c9434a80c0698d5ab69141710cff950f812..f272dc77fb96352c82cd845b56b217ead0c23993 100644 (file)
 #include "printf.h"
 #include "sink.h"
 
+/** @brief A @ref sink that stores to a fixed buffer
+ *
+ * If there is too much output, it is truncated.
+ */
 struct fixedstr_sink {
+  /** @brief Base */
   struct sink s;
+
+  /** @brief Output buffer */
   char *buffer;
+
+  /** @brief Bytes written so far */
   int nbytes;
+
+  /** @brief Size of buffer */
   size_t size;
 };
 
index 83d010da60d1b1eebe587156f93aae123854c133..46761b065490d496138eb4a8af587bb60c4d91e3 100644 (file)
@@ -1,6 +1,6 @@
 /* strptime.c - partial strptime() reimplementation
  *
- * (c) 2008 Richard Kettlewell.
+ * Copyright (c) 2008, 2011 Richard Kettlewell.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-
-/* strptime() is here reimplemented because the FreeBSD (and older MacOS) one
+/** @file lib/strptime.c
+ * @brief strptime() reimplementation
+ *
+ * strptime() is here reimplemented because the FreeBSD (and older MacOS) one
  * is broken and does not report errors properly.  See TODO remarks below for
- * some missing bits. */
+ * some missing bits.
+ */
 
 #include <ctype.h>
 #include <limits.h>
 #include <langinfo.h>
 #include "strptime.h"
 
+/** @brief Lookup table entry for locale-specific strings */
 struct locale_item_match {
+  /** @brief Locale key to try */
   nl_item key;
+
+  /** @brief Value to return if value of @ref key matches subject string */
   int value;
 };
 
index 324f88d1bd8d133986b6bcb43ae4646998ca4aab..e8e1a73eceb50c7ee3f2f308e583953ad98b9668 100644 (file)
@@ -1,5 +1,36 @@
+/* strptime.h - partial strptime() reimplementation
+ *
+ * Copyright (c) 2008, 2011 Richard Kettlewell.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 #ifndef STRPTIME_H
 #define STRPTIME_H
+/** @file lib/strptime.h
+ * @brief strptime() reimplementation
+ */
 
 #include <time.h>
 
index e13922e2d69a616fa6e280a51d15b64f7ea0b5c7..b894ca39bfb80885917dc6bd903c9d47f9c1ae63 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007, 2008, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <signal.h>
+#include <time.h>
 
 #include "syscalls.h"
 #include "log.h"
@@ -159,6 +160,10 @@ time_t xtime(time_t *whenp) {
   return tv.tv_sec;
 }
 
+void xnanosleep(const struct timespec *req, struct timespec *rem) {
+  mustnotbeminus1("nanosleep", nanosleep(req, rem));
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index e45125a8473449666cf9b86058470a1c34421c7e..af60335d83796810b9ab3fd4a9c873b509bbdc17 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,6 +49,8 @@ void xfclose(FILE *);
 int xnice(int);
 void xgettimeofday(struct timeval *, struct timezone *);
 time_t xtime(time_t *when);
+void xgettime(clockid_t clk_id, struct timespec *tp);
+void xnanosleep(const struct timespec *req, struct timespec *rem);
 /* the above all call @fatal@ if the system call fails */
 
 void nonblock(int fd);
diff --git a/lib/syscallsrt.c b/lib/syscallsrt.c
new file mode 100644 (file)
index 0000000..314c206
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2013 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/syscallsrt.c
+ * @brief Error-checking library call wrappers
+ */
+#include "common.h"
+
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <time.h>
+
+#include "syscalls.h"
+#include "log.h"
+#include "printf.h"
+
+void xgettime(clockid_t clk_id, struct timespec *tp) {
+  mustnotbeminus1("clock_gettime", clock_gettime(clk_id, tp));
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+End:
+*/
index fe2906c7d7566836d1d97f973309bd67d35f1b5c..e1e64da2031a57512a79baea49c09161185a1e0c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2007-2009 Richard Kettlewell
+ * Copyright (C) 2007-2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 
 #include <time.h>
 #include <sys/time.h>
+#include <math.h>
 
 static inline struct timeval tvsub(const struct timeval a,
                                    const struct timeval b) {
@@ -99,6 +100,57 @@ static inline int tvle(const struct timeval *a, const struct timeval *b) {
   return !tvgt(a, b);
 }
 
+/** @brief Return the sum of two timespecs */
+static inline struct timespec tsadd(const struct timespec a,
+                                    const struct timespec b) {
+  struct timespec r;
+
+  r.tv_sec = a.tv_sec + b.tv_sec;
+  r.tv_nsec = a.tv_nsec + b.tv_nsec;
+  if(r.tv_nsec < 0) {
+    r.tv_nsec += 1000000;
+    r.tv_sec--;
+  }
+  if(r.tv_nsec > 999999) {
+    r.tv_nsec -= 1000000;
+    r.tv_sec++;
+  }
+  return r;
+}
+
+/** @brief Subtract one timespec from another */
+static inline struct timespec tssub(const struct timespec a,
+                                    const struct timespec b) {
+  struct timespec r;
+
+  r.tv_sec = a.tv_sec - b.tv_sec;
+  r.tv_nsec = a.tv_nsec - b.tv_nsec;
+  if(r.tv_nsec < 0) {
+    r.tv_nsec += 1000000;
+    r.tv_sec--;
+  }
+  if(r.tv_nsec > 999999) {
+    r.tv_nsec -= 1000000;
+    r.tv_sec++;
+  }
+  return r;
+}
+
+/** @brief Convert a timespec to a double */
+static inline double ts_to_double(const struct timespec ts) {
+  return ts.tv_sec + ts.tv_nsec / 1000000000.0;
+}
+
+/** @brief Convert a double to a timespec */
+static inline struct timespec double_to_ts(double n) {
+  double i, f;
+  struct timespec r;
+  f = modf(n, &i);
+  r.tv_sec = i;
+  r.tv_nsec = 1000000000 * f;
+  return r;
+}
+
 #endif /* TIMEVAL_H */
 
 /*
index 628498a0cbcc89e7bfaaea6d6412246e8bdc5dff..7fbdeb5817debecb902306176468d1b4cf6191a1 100644 (file)
@@ -840,7 +840,7 @@ static char **dedupe(char **vec, int nvec) {
   int m, n;
 
   qsort(vec, nvec, sizeof (char *), wordcmp);
-  m = n = 0;
+  m = 0;
   if(nvec) {
     vec[m++] = vec[0];
     for(n = 1; n < nvec; ++n)
@@ -1389,6 +1389,7 @@ int trackdb_obsolete(const char *track, DB_TXN *tid) {
 #define H(name) { #name, offsetof(DB_HASH_STAT, name) }
 #define B(name) { #name, offsetof(DB_BTREE_STAT, name) }
 
+/** @brief Table of libdb stats to return */
 static const struct statinfo {
   const char *name;
   size_t offset;
@@ -1823,7 +1824,7 @@ int trackdb_set(const char *track,
         if(trackdb_putdata(trackdb_prefsdb, track, p, tid, 0))
           goto fail;
       /* compute the new alias name */
-      if((err = compute_alias(&newalias, track, p, tid))) goto fail;
+      if(compute_alias(&newalias, track, p, tid)) goto fail;
       /* check whether alias has changed */
       if(!(oldalias == newalias
            || (oldalias && newalias && !strcmp(oldalias, newalias)))) {
@@ -2176,13 +2177,13 @@ const char *trackdb_getpart(const char *track,
   DB_TXN *tid;
   char *pref;
   const char *actual;
-  int used_db, err;
+  int used_db;
 
   /* construct the full pref */
   byte_xasprintf(&pref, "trackname_%s_%s", context, part);
   for(;;) {
     tid = trackdb_begin_transaction();
-    if((err = gettrackdata(track, 0, &p, &actual, 0, tid)) == DB_LOCK_DEADLOCK)
+    if(gettrackdata(track, 0, &p, &actual, 0, tid) == DB_LOCK_DEADLOCK)
       goto fail;
     break;
 fail:
@@ -2493,6 +2494,9 @@ char **trackdb_search(char **wordlist, int nwordlist, int *ntracks) {
     }
     if(trackdb_closecursor(cursor)) err = DB_LOCK_DEADLOCK;
     cursor = 0;
+    if(err)
+      goto fail;
+    cursor = 0;
     /* do a naive search over that (hopefuly fairly small) list of tracks */
     u.nvec = 0;
     for(n = 0; n < v.nvec; ++n) {
@@ -2733,17 +2737,18 @@ int trackdb_rescan_underway(void) {
  * @param name Global preference name
  * @param value New value
  * @param who Who is setting it
+ * @return 0 on success, -1 on error
  */
-void trackdb_set_global(const char *name,
+int trackdb_set_global(const char *name,
                         const char *value,
                         const char *who) {
   DB_TXN *tid;
-  int err;
-  int state;
+  int state, err;
 
   for(;;) {
     tid = trackdb_begin_transaction();
-    if(!(err = trackdb_set_global_tid(name, value, tid)))
+    err = trackdb_set_global_tid(name, value, tid);
+    if(err != DB_LOCK_DEADLOCK)
       break;
     trackdb_abort_transaction(tid);
   }
@@ -2763,6 +2768,8 @@ void trackdb_set_global(const char *name,
                   who ? who : "-");
     eventlog("state", state ? "enable_random" : "disable_random", (char *)0);
   }
+  eventlog("global_pref", name, value, (char *)0);
+  return err == 0 ? 0 : -1;
 }
 
 /** @brief Set a global preference
@@ -2788,7 +2795,7 @@ int trackdb_set_global_tid(const char *name,
     err = trackdb_globaldb->put(trackdb_globaldb, tid, &k, &d, 0);
   else
     err = trackdb_globaldb->del(trackdb_globaldb, tid, &k, 0);
-  if(err == DB_LOCK_DEADLOCK) return err;
+  if(err == DB_LOCK_DEADLOCK || err == DB_NOTFOUND) return err;
   if(err)
     disorder_fatal(0, "error updating database: %s", db_strerror(err));
   return 0;
@@ -2800,12 +2807,11 @@ int trackdb_set_global_tid(const char *name,
  */
 const char *trackdb_get_global(const char *name) {
   DB_TXN *tid;
-  int err;
   const char *r;
 
   for(;;) {
     tid = trackdb_begin_transaction();
-    if(!(err = trackdb_get_global_tid(name, tid, &r)))
+    if(!trackdb_get_global_tid(name, tid, &r))
       break;
     trackdb_abort_transaction(tid);
   }
@@ -2909,7 +2915,7 @@ static char **trackdb_new_tid(int *ntracksp,
   default:
     disorder_fatal(0, "error reading noticed.db: %s", db_strerror(err));
   }
-  if((err = trackdb_closecursor(c)))
+  if(trackdb_closecursor(c))
     return 0;                           /* deadlock */
   vector_terminate(tracks);
   if(ntracksp)
@@ -2999,21 +3005,6 @@ void trackdb_gc(void) {
 
 /* user database *************************************************************/
 
-/** @brief Return true if @p user is trusted
- * @param user User to look up
- * @return Nonzero if they are in the 'trusted' list
- *
- * Now used only in upgrade from old versions.
- */
-static int trusted(const char *user) {
-  int n;
-
-  for(n = 0; (n < config->trust.n
-             && strcmp(config->trust.s[n], user)); ++n)
-    ;
-  return n < config->trust.n;
-}
-
 /** @brief Add a user
  * @param user Username
  * @param password Initial password or NULL
@@ -3056,75 +3047,6 @@ static int create_user(const char *user,
   return trackdb_putdata(trackdb_usersdb, user, k, tid, flags);
 }
 
-/** @brief Add one pre-existing user 
- * @param user Username
- * @param password password
- * @param tid Owning transaction
- * @return 0, DB_KEYEXIST or DB_LOCK_DEADLOCK
- *
- * Used only in upgrade from old versions.
- */
-static int one_old_user(const char *user, const char *password,
-                        DB_TXN *tid) {
-  const char *rights;
-
-  /* www-data doesn't get added */
-  if(!strcmp(user, "www-data")) {
-    disorder_info("not adding www-data to user database");
-    return 0;
-  }
-  /* pick rights */
-  if(!strcmp(user, "root"))
-    rights = "all";
-  else if(trusted(user)) {
-    rights_type r;
-
-    parse_rights(config->default_rights, &r, 1);
-    r &= ~(rights_type)(RIGHT_SCRATCH__MASK|RIGHT_MOVE__MASK|RIGHT_REMOVE__MASK);
-    r |= (RIGHT_ADMIN|RIGHT_RESCAN
-          |RIGHT_SCRATCH_ANY|RIGHT_MOVE_ANY|RIGHT_REMOVE_ANY);
-    rights = rights_string(r);
-  } else
-    rights = config->default_rights;
-  return create_user(user, password, rights, 0/*email*/, 0/*confirmation*/,
-                     tid, DB_NOOVERWRITE);
-}
-
-/** @brief Upgrade old users
- * @param tid Owning transaction
- * @return 0 or DB_LOCK_DEADLOCK
- */
-static int trackdb_old_users_tid(DB_TXN *tid) {
-  int n;
-
-  for(n = 0; n < config->allow.n; ++n) {
-    switch(one_old_user(config->allow.s[n].s[0], config->allow.s[n].s[1],
-                        tid)) {
-    case 0:
-      disorder_info("created user %s from 'allow' directive",
-                    config->allow.s[n].s[0]);
-      break;
-    case DB_KEYEXIST:
-      disorder_error(0, "user %s already exists, delete 'allow' directive",
-            config->allow.s[n].s[0]);
-          /* This won't ever become fatal - eventually 'allow' will be
-           * disabled. */
-      break;
-    case DB_LOCK_DEADLOCK:
-      return DB_LOCK_DEADLOCK;
-    }
-  }
-  return 0;
-}
-
-/** @brief Read old 'allow' directives and copy them to the users database */
-void trackdb_old_users(void) {
-  int e;
-
-  if(config->allow.n)
-    WITH_TRANSACTION(trackdb_old_users_tid(tid));
-}
-
 /** @brief Create a root user in the user database if there is none */
 void trackdb_create_root(void) {
   int e;
index 1d7c8e97cf02d94e25498a32527eee21622cef79..1a74bb7fd176e74129c5a89656f6ab619f16921f 100644 (file)
@@ -148,9 +148,9 @@ int trackdb_rescan_cancel(void);
 void trackdb_gc(void);
 /* tidy up old database log files */
 
-void trackdb_set_global(const char *name,
-                        const char *value,
-                        const char *who);
+int trackdb_set_global(const char *name,
+                       const char *value,
+                       const char *who);
 /* set a global pref (remove if value=0). */
 
 const char *trackdb_get_global(const char *name);
@@ -159,7 +159,6 @@ const char *trackdb_get_global(const char *name);
 char **trackdb_new(int *ntracksp, int maxtracks);
 
 void trackdb_expire_noticed(time_t when);
-void trackdb_old_users(void);
 void trackdb_create_root(void);
 const char *trackdb_get_password(const char *user);
 int trackdb_adduser(const char *user,
index d5bff351830e68963e1151e3ae385bd3dfaaed3a..93c8e4190a79af4e4d232b9f0a988488f2a2c822 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2009 Richard Kettlewell
+ * Copyright (C) 2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -105,6 +105,7 @@ static void alsa_open(void) {
                         SND_PCM_STREAM_PLAYBACK,
                         0)))
     disorder_fatal(0, "error from snd_pcm_open: %d", err);
+  /* Hardware parameters */
   snd_pcm_hw_params_t *hwparams;
   snd_pcm_hw_params_alloca(&hwparams);
   if((err = snd_pcm_hw_params_any(alsa_pcm, hwparams)) < 0)
@@ -131,7 +132,16 @@ static void alsa_open(void) {
           uaudio_channels, err);
   if((err = snd_pcm_hw_params(alsa_pcm, hwparams)) < 0)
     disorder_fatal(0, "error calling snd_pcm_hw_params: %d", err);
-  
+  /* Software parameters */
+  snd_pcm_sw_params_t *swparams;
+  snd_pcm_sw_params_alloca(&swparams);
+  if((err = snd_pcm_sw_params_current(alsa_pcm, swparams)) < 0)
+    disorder_fatal(-err, "error calling snd_pcm_sw_params_current");
+  /* Bump the start threshold a bit since Pulseaudio sulks with the defaults */
+  if((err = snd_pcm_sw_params_set_start_threshold(alsa_pcm, swparams, 1024)) < 0)
+    disorder_fatal(-err, "error calling snd_pcm_sw_params_set_start_threshold");
+  if((err = snd_pcm_sw_params(alsa_pcm, swparams)) < 0)
+    disorder_fatal(-err, "error calling snd_pcm_sw_params");
 }
 
 static void alsa_start(uaudio_callback *callback,
@@ -170,7 +180,7 @@ static void alsa_open_mixer(void) {
   snd_mixer_selem_id_t *id;
   const char *device = uaudio_get("device", "default");
   const char *mixer = uaudio_get("mixer-control", "0");
-  const char *channel = uaudio_get("mixer-channel", "PCM");
+  const char *channel = uaudio_get("mixer-channel", "Master");
 
   snd_mixer_selem_id_alloca(&id);
   if((err = snd_mixer_open(&alsa_mixer_handle, 0)))
index c8e2ef2985aa88792412f615b3ba5acf7bdfdb4c..3ce1cbe6b54cb3c25f6cb4c017d35c0a10c7e822 100644 (file)
@@ -164,6 +164,20 @@ static size_t rtp_play(void *buffer, size_t nsamples, unsigned flags) {
   vec[1].iov_len = nsamples * uaudio_sample_size;
   const uint32_t timestamp = uaudio_schedule_sync();
   header.timestamp = htonl(rtp_base + (uint32_t)timestamp);
+
+  /* We send ~120 packets a second with current arrangements.  So if we log
+   * once every 8192 packets we log about once a minute. */
+
+  if(!(ntohs(header.seq) & 8191)
+     && config->rtp_verbose)
+    disorder_info("RTP: seq %04"PRIx16" %08"PRIx32"+%08"PRIx32"=%08"PRIx32" ns %zu%s",
+                  ntohs(header.seq),
+                  rtp_base,
+                  timestamp,
+                  header.timestamp,
+                  nsamples,
+                  flags & UAUDIO_PAUSED ? " [paused]" : "");
+
   /* If we're paused don't actually end a packet, we just pretend */
   if(flags & UAUDIO_PAUSED) {
     uaudio_schedule_sent(nsamples);
@@ -293,6 +307,8 @@ static void rtp_open(void) {
   if(connect(rtp_fd, res->ai_addr, res->ai_addrlen) < 0)
     disorder_fatal(errno, "error connecting broadcast socket to %s", 
                    format_sockaddr(res->ai_addr));
+  if(config->rtp_verbose)
+    disorder_info("RTP: prepared socket");
 }
 
 static void rtp_start(uaudio_callback *callback,
@@ -309,14 +325,22 @@ static void rtp_start(uaudio_callback *callback,
   else
     disorder_fatal(0, "asked for %d/%d/%d 16/44100/1 and 16/44100/2",
                    uaudio_bits, uaudio_rate, uaudio_channels); 
+  if(config->rtp_verbose)
+    disorder_info("RTP: %d channels %d bits %d Hz payload type %d",
+                  uaudio_channels, uaudio_bits, uaudio_rate, rtp_payload);
   /* Various fields are required to have random initial values by RFC3550.  The
    * packet contents are highly public so there's no point asking for very
    * strong randomness. */
   gcry_create_nonce(&rtp_id, sizeof rtp_id);
   gcry_create_nonce(&rtp_base, sizeof rtp_base);
   gcry_create_nonce(&rtp_sequence, sizeof rtp_sequence);
+  if(config->rtp_verbose)
+    disorder_info("RTP: id %08"PRIx32" base %08"PRIx32" initial seq %08"PRIx16,
+                  rtp_id, rtp_base, rtp_sequence);
   rtp_open();
   uaudio_schedule_init();
+  if(config->rtp_verbose)
+    disorder_info("RTP: initialized schedule");
   uaudio_thread_start(callback,
                       userdata,
                       rtp_play,
@@ -324,6 +348,8 @@ static void rtp_start(uaudio_callback *callback,
                       (NETWORK_BYTES - sizeof(struct rtp_header))
                       / uaudio_sample_size,
                       0);
+  if(config->rtp_verbose)
+    disorder_info("RTP: created thread");
 }
 
 static void rtp_stop(void) {
@@ -344,6 +370,8 @@ static void rtp_configure(void) {
   snprintf(buffer, sizeof buffer, "%ld", config->multicast_ttl);
   uaudio_set("multicast-ttl", buffer);
   uaudio_set("multicast-loop", config->multicast_loop ? "yes" : "no");
+  if(config->rtp_verbose)
+    disorder_info("RTP: configured");
 }
 
 const struct uaudio uaudio_rtp = {
index e42980c211cd10cc22c95cb6a81c7f7586d3598e..113932f1e3004e09d7303abe7506506de6811026 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2009 Richard Kettlewell
+ * Copyright (C) 2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,8 @@
 #include "uaudio.h"
 #include "log.h"
 #include "mem.h"
+#include "syscalls.h"
+#include "timeval.h"
 
 /** @brief Number of buffers
  *
@@ -145,6 +147,44 @@ static void *uaudio_collect_thread_fn(void attribute((unused)) *arg) {
   return NULL;
 }
 
+static size_t uaudio_play_samples(void *buffer, size_t samples, unsigned flags) {
+  static struct timespec base;
+  static int64_t frames_supplied;
+  struct timespec now;
+  struct timespec delay_ts;
+  double target, delay;
+
+  if(!base.tv_sec)
+    xgettime(CLOCK_MONOTONIC, &base);
+  samples = uaudio_thread_play_callback(buffer, samples, flags);
+  frames_supplied += samples / uaudio_channels;
+  /* Set target to the approximate point at which we run out of buffered audio.
+   * If no buffer size has been specified, use 1/16th of a second. */
+  target = (frames_supplied - (uaudio_buffer ? uaudio_buffer : uaudio_rate / 16))
+    / (double)uaudio_rate + ts_to_double(base);
+  for(;;) {
+    xgettime(CLOCK_MONOTONIC, &now);
+    delay = target - ts_to_double(now);
+    if(delay <= 0) {
+      //putc('.', stderr);
+      break;
+    }
+    //putc('!', stderr);
+    /*
+    fprintf(stderr, "frames supplied %ld (%lds) base %f target %f now %f want delay %g\n", 
+            frames_supplied,
+            frames_supplied / uaudio_rate,
+            ts_to_double(base),
+            target, 
+            ts_to_double(now),
+            delay);
+    */
+    delay_ts = double_to_ts(delay);
+    xnanosleep(&delay_ts, NULL);
+  }
+  return samples;
+}
+
 /** @brief Background thread for audio playing 
  *
  * This thread plays data as long as there is something to play.  So the
@@ -163,8 +203,7 @@ static void *uaudio_play_thread_fn(void attribute((unused)) *arg) {
       unsigned flags = UAUDIO_PAUSED;
       if(last_flags & UAUDIO_PLAYING)
         flags |= UAUDIO_PAUSE;
-      uaudio_thread_play_callback(zero, uaudio_thread_max,
-                                  last_flags = flags);
+      uaudio_play_samples(zero, uaudio_thread_max, last_flags = flags);
       /* We expect the play callback to block for a reasonable period */
       pthread_mutex_lock(&uaudio_thread_lock);
       continue;
@@ -187,10 +226,10 @@ static void *uaudio_play_thread_fn(void attribute((unused)) *arg) {
         unsigned flags = UAUDIO_PLAYING;
         if(last_flags & UAUDIO_PAUSED)
           flags |= UAUDIO_RESUME;
-        played += uaudio_thread_play_callback((char *)b->samples
-                                              + played * uaudio_sample_size,
-                                              b->nsamples - played,
-                                              last_flags = flags);
+        played += uaudio_play_samples((char *)b->samples
+                                      + played * uaudio_sample_size,
+                                      b->nsamples - played,
+                                      last_flags = flags);
       }
       pthread_mutex_lock(&uaudio_thread_lock);
       /* Move to next buffer */
index e793045ce77c995cb2f13ef52e4ae736e6168cdd..343290df1fb68006d30731f1f431d3d4343d5f33 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2009 Richard Kettlewell
+ * Copyright (C) 2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,6 +41,9 @@ int uaudio_channels;
 /** @brief Whether samples are signed or unsigned */
 int uaudio_signed;
 
+/** @brief Frames of buffer to tolerate inside chosen API */
+int uaudio_buffer;
+
 /** @brief Sample size in bytes
  *
  * NB one sample is a single point sample; up to @c uaudio_channels samples may
index 6592d5353a4c43380781e3bfe2f2373f2a7a8efe..709979ec544acc80bffc9f2af6739128710f6bc6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2009 Richard Kettlewell
+ * Copyright (C) 2009, 2013 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,6 +28,7 @@ extern int uaudio_bits;
 extern int uaudio_channels;
 extern int uaudio_signed;
 extern size_t uaudio_sample_size;
+extern int uaudio_buffer;
 
 /** @brief Callback to get audio data
  * @param buffer Where to put audio data
index 87b90f59353d32b9c523aeccd773c8d33e1edde4..e33b275eac3117c0d595339ef7bdebcff4064d59 100644 (file)
@@ -1235,3787 +1235,3901 @@ dd1106[]={70,65,88,0},
 dd1107[]={915,0},
 dd1108[]={928,0},
 dd1109[]={8721,0},
-dd1110[]={49,8260,51,0},
-dd1111[]={50,8260,51,0},
-dd1112[]={49,8260,53,0},
-dd1113[]={50,8260,53,0},
-dd1114[]={51,8260,53,0},
-dd1115[]={52,8260,53,0},
-dd1116[]={49,8260,54,0},
-dd1117[]={53,8260,54,0},
-dd1118[]={49,8260,56,0},
-dd1119[]={51,8260,56,0},
-dd1120[]={53,8260,56,0},
-dd1121[]={55,8260,56,0},
-dd1122[]={49,8260,0},
-dd1123[]={73,73,0},
-dd1124[]={73,73,73,0},
-dd1125[]={73,86,0},
-dd1126[]={86,0},
-dd1127[]={86,73,0},
-dd1128[]={86,73,73,0},
-dd1129[]={86,73,73,73,0},
-dd1130[]={73,88,0},
-dd1131[]={88,0},
-dd1132[]={88,73,0},
-dd1133[]={88,73,73,0},
-dd1134[]={105,105,0},
-dd1135[]={105,105,105,0},
-dd1136[]={105,118,0},
-dd1137[]={118,105,0},
-dd1138[]={118,105,105,0},
-dd1139[]={118,105,105,105,0},
-dd1140[]={105,120,0},
-dd1141[]={120,105,0},
-dd1142[]={120,105,105,0},
-dd1143[]={8592,824,0},
-dd1144[]={8594,824,0},
-dd1145[]={8596,824,0},
-dd1146[]={8656,824,0},
-dd1147[]={8660,824,0},
-dd1148[]={8658,824,0},
-dd1149[]={8707,824,0},
-dd1150[]={8712,824,0},
-dd1151[]={8715,824,0},
-dd1152[]={8739,824,0},
-dd1153[]={8741,824,0},
-dd1154[]={8747,8747,0},
-dd1155[]={8747,8747,8747,0},
-dd1156[]={8750,8750,0},
-dd1157[]={8750,8750,8750,0},
-dd1158[]={8764,824,0},
-dd1159[]={8771,824,0},
-dd1160[]={8773,824,0},
-dd1161[]={8776,824,0},
-dd1162[]={61,824,0},
-dd1163[]={8801,824,0},
-dd1164[]={8781,824,0},
-dd1165[]={60,824,0},
-dd1166[]={62,824,0},
-dd1167[]={8804,824,0},
-dd1168[]={8805,824,0},
-dd1169[]={8818,824,0},
-dd1170[]={8819,824,0},
-dd1171[]={8822,824,0},
-dd1172[]={8823,824,0},
-dd1173[]={8826,824,0},
-dd1174[]={8827,824,0},
-dd1175[]={8834,824,0},
-dd1176[]={8835,824,0},
-dd1177[]={8838,824,0},
-dd1178[]={8839,824,0},
-dd1179[]={8866,824,0},
-dd1180[]={8872,824,0},
-dd1181[]={8873,824,0},
-dd1182[]={8875,824,0},
-dd1183[]={8828,824,0},
-dd1184[]={8829,824,0},
-dd1185[]={8849,824,0},
-dd1186[]={8850,824,0},
-dd1187[]={8882,824,0},
-dd1188[]={8883,824,0},
-dd1189[]={8884,824,0},
-dd1190[]={8885,824,0},
-dd1191[]={12296,0},
-dd1192[]={12297,0},
-dd1193[]={49,48,0},
-dd1194[]={49,49,0},
-dd1195[]={49,50,0},
-dd1196[]={49,51,0},
-dd1197[]={49,52,0},
-dd1198[]={49,53,0},
-dd1199[]={49,54,0},
-dd1200[]={49,55,0},
-dd1201[]={49,56,0},
-dd1202[]={49,57,0},
-dd1203[]={50,48,0},
-dd1204[]={40,49,41,0},
-dd1205[]={40,50,41,0},
-dd1206[]={40,51,41,0},
-dd1207[]={40,52,41,0},
-dd1208[]={40,53,41,0},
-dd1209[]={40,54,41,0},
-dd1210[]={40,55,41,0},
-dd1211[]={40,56,41,0},
-dd1212[]={40,57,41,0},
-dd1213[]={40,49,48,41,0},
-dd1214[]={40,49,49,41,0},
-dd1215[]={40,49,50,41,0},
-dd1216[]={40,49,51,41,0},
-dd1217[]={40,49,52,41,0},
-dd1218[]={40,49,53,41,0},
-dd1219[]={40,49,54,41,0},
-dd1220[]={40,49,55,41,0},
-dd1221[]={40,49,56,41,0},
-dd1222[]={40,49,57,41,0},
-dd1223[]={40,50,48,41,0},
-dd1224[]={49,46,0},
-dd1225[]={50,46,0},
-dd1226[]={51,46,0},
-dd1227[]={52,46,0},
-dd1228[]={53,46,0},
-dd1229[]={54,46,0},
-dd1230[]={55,46,0},
-dd1231[]={56,46,0},
-dd1232[]={57,46,0},
-dd1233[]={49,48,46,0},
-dd1234[]={49,49,46,0},
-dd1235[]={49,50,46,0},
-dd1236[]={49,51,46,0},
-dd1237[]={49,52,46,0},
-dd1238[]={49,53,46,0},
-dd1239[]={49,54,46,0},
-dd1240[]={49,55,46,0},
-dd1241[]={49,56,46,0},
-dd1242[]={49,57,46,0},
-dd1243[]={50,48,46,0},
-dd1244[]={40,97,41,0},
-dd1245[]={40,98,41,0},
-dd1246[]={40,99,41,0},
-dd1247[]={40,100,41,0},
-dd1248[]={40,101,41,0},
-dd1249[]={40,102,41,0},
-dd1250[]={40,103,41,0},
-dd1251[]={40,104,41,0},
-dd1252[]={40,105,41,0},
-dd1253[]={40,106,41,0},
-dd1254[]={40,107,41,0},
-dd1255[]={40,108,41,0},
-dd1256[]={40,109,41,0},
-dd1257[]={40,110,41,0},
-dd1258[]={40,111,41,0},
-dd1259[]={40,112,41,0},
-dd1260[]={40,113,41,0},
-dd1261[]={40,114,41,0},
-dd1262[]={40,115,41,0},
-dd1263[]={40,116,41,0},
-dd1264[]={40,117,41,0},
-dd1265[]={40,118,41,0},
-dd1266[]={40,119,41,0},
-dd1267[]={40,120,41,0},
-dd1268[]={40,121,41,0},
-dd1269[]={40,122,41,0},
-dd1270[]={83,0},
-dd1271[]={89,0},
-dd1272[]={113,0},
-dd1273[]={8747,8747,8747,8747,0},
-dd1274[]={58,58,61,0},
-dd1275[]={61,61,0},
-dd1276[]={61,61,61,0},
-dd1277[]={10973,824,0},
-dd1278[]={11617,0},
-dd1279[]={27597,0},
-dd1280[]={40863,0},
-dd1281[]={19968,0},
-dd1282[]={20008,0},
-dd1283[]={20022,0},
-dd1284[]={20031,0},
-dd1285[]={20057,0},
-dd1286[]={20101,0},
-dd1287[]={20108,0},
-dd1288[]={20128,0},
-dd1289[]={20154,0},
-dd1290[]={20799,0},
-dd1291[]={20837,0},
-dd1292[]={20843,0},
-dd1293[]={20866,0},
-dd1294[]={20886,0},
-dd1295[]={20907,0},
-dd1296[]={20960,0},
-dd1297[]={20981,0},
-dd1298[]={20992,0},
-dd1299[]={21147,0},
-dd1300[]={21241,0},
-dd1301[]={21269,0},
-dd1302[]={21274,0},
-dd1303[]={21304,0},
-dd1304[]={21313,0},
-dd1305[]={21340,0},
-dd1306[]={21353,0},
-dd1307[]={21378,0},
-dd1308[]={21430,0},
-dd1309[]={21448,0},
-dd1310[]={21475,0},
-dd1311[]={22231,0},
-dd1312[]={22303,0},
-dd1313[]={22763,0},
-dd1314[]={22786,0},
-dd1315[]={22794,0},
-dd1316[]={22805,0},
-dd1317[]={22823,0},
-dd1318[]={22899,0},
-dd1319[]={23376,0},
-dd1320[]={23424,0},
-dd1321[]={23544,0},
-dd1322[]={23567,0},
-dd1323[]={23586,0},
-dd1324[]={23608,0},
-dd1325[]={23662,0},
-dd1326[]={23665,0},
-dd1327[]={24027,0},
-dd1328[]={24037,0},
-dd1329[]={24049,0},
-dd1330[]={24062,0},
-dd1331[]={24178,0},
-dd1332[]={24186,0},
-dd1333[]={24191,0},
-dd1334[]={24308,0},
-dd1335[]={24318,0},
-dd1336[]={24331,0},
-dd1337[]={24339,0},
-dd1338[]={24400,0},
-dd1339[]={24417,0},
-dd1340[]={24435,0},
-dd1341[]={24515,0},
-dd1342[]={25096,0},
-dd1343[]={25142,0},
-dd1344[]={25163,0},
-dd1345[]={25903,0},
-dd1346[]={25908,0},
-dd1347[]={25991,0},
-dd1348[]={26007,0},
-dd1349[]={26020,0},
-dd1350[]={26041,0},
-dd1351[]={26080,0},
-dd1352[]={26085,0},
-dd1353[]={26352,0},
-dd1354[]={26376,0},
-dd1355[]={26408,0},
-dd1356[]={27424,0},
-dd1357[]={27490,0},
-dd1358[]={27513,0},
-dd1359[]={27571,0},
-dd1360[]={27595,0},
-dd1361[]={27604,0},
-dd1362[]={27611,0},
-dd1363[]={27663,0},
-dd1364[]={27668,0},
-dd1365[]={27700,0},
-dd1366[]={28779,0},
-dd1367[]={29226,0},
-dd1368[]={29238,0},
-dd1369[]={29243,0},
-dd1370[]={29247,0},
-dd1371[]={29255,0},
-dd1372[]={29273,0},
-dd1373[]={29275,0},
-dd1374[]={29356,0},
-dd1375[]={29572,0},
-dd1376[]={29577,0},
-dd1377[]={29916,0},
-dd1378[]={29926,0},
-dd1379[]={29976,0},
-dd1380[]={29983,0},
-dd1381[]={29992,0},
-dd1382[]={30000,0},
-dd1383[]={30091,0},
-dd1384[]={30098,0},
-dd1385[]={30326,0},
-dd1386[]={30333,0},
-dd1387[]={30382,0},
-dd1388[]={30399,0},
-dd1389[]={30446,0},
-dd1390[]={30683,0},
-dd1391[]={30690,0},
-dd1392[]={30707,0},
-dd1393[]={31034,0},
-dd1394[]={31160,0},
-dd1395[]={31166,0},
-dd1396[]={31348,0},
-dd1397[]={31435,0},
-dd1398[]={31481,0},
-dd1399[]={31859,0},
-dd1400[]={31992,0},
-dd1401[]={32566,0},
-dd1402[]={32593,0},
-dd1403[]={32650,0},
-dd1404[]={32701,0},
-dd1405[]={32769,0},
-dd1406[]={32780,0},
-dd1407[]={32786,0},
-dd1408[]={32819,0},
-dd1409[]={32895,0},
-dd1410[]={32905,0},
-dd1411[]={33251,0},
-dd1412[]={33258,0},
-dd1413[]={33267,0},
-dd1414[]={33276,0},
-dd1415[]={33292,0},
-dd1416[]={33307,0},
-dd1417[]={33311,0},
-dd1418[]={33390,0},
-dd1419[]={33394,0},
-dd1420[]={33400,0},
-dd1421[]={34381,0},
-dd1422[]={34411,0},
-dd1423[]={34880,0},
-dd1424[]={34892,0},
-dd1425[]={34915,0},
-dd1426[]={35198,0},
-dd1427[]={35211,0},
-dd1428[]={35282,0},
-dd1429[]={35328,0},
-dd1430[]={35895,0},
-dd1431[]={35910,0},
-dd1432[]={35925,0},
-dd1433[]={35960,0},
-dd1434[]={35997,0},
-dd1435[]={36196,0},
-dd1436[]={36208,0},
-dd1437[]={36275,0},
-dd1438[]={36523,0},
-dd1439[]={36554,0},
-dd1440[]={36763,0},
-dd1441[]={36784,0},
-dd1442[]={36789,0},
-dd1443[]={37009,0},
-dd1444[]={37193,0},
-dd1445[]={37318,0},
-dd1446[]={37324,0},
-dd1447[]={37329,0},
-dd1448[]={38263,0},
-dd1449[]={38272,0},
-dd1450[]={38428,0},
-dd1451[]={38582,0},
-dd1452[]={38585,0},
-dd1453[]={38632,0},
-dd1454[]={38737,0},
-dd1455[]={38750,0},
-dd1456[]={38754,0},
-dd1457[]={38761,0},
-dd1458[]={38859,0},
-dd1459[]={38893,0},
-dd1460[]={38899,0},
-dd1461[]={38913,0},
-dd1462[]={39080,0},
-dd1463[]={39131,0},
-dd1464[]={39135,0},
-dd1465[]={39318,0},
-dd1466[]={39321,0},
-dd1467[]={39340,0},
-dd1468[]={39592,0},
-dd1469[]={39640,0},
-dd1470[]={39647,0},
-dd1471[]={39717,0},
-dd1472[]={39727,0},
-dd1473[]={39730,0},
-dd1474[]={39740,0},
-dd1475[]={39770,0},
-dd1476[]={40165,0},
-dd1477[]={40565,0},
-dd1478[]={40575,0},
-dd1479[]={40613,0},
-dd1480[]={40635,0},
-dd1481[]={40643,0},
-dd1482[]={40653,0},
-dd1483[]={40657,0},
-dd1484[]={40697,0},
-dd1485[]={40701,0},
-dd1486[]={40718,0},
-dd1487[]={40723,0},
-dd1488[]={40736,0},
-dd1489[]={40763,0},
-dd1490[]={40778,0},
-dd1491[]={40786,0},
-dd1492[]={40845,0},
-dd1493[]={40860,0},
-dd1494[]={40864,0},
-dd1495[]={12306,0},
-dd1496[]={21316,0},
-dd1497[]={21317,0},
-dd1498[]={12363,12441,0},
-dd1499[]={12365,12441,0},
-dd1500[]={12367,12441,0},
-dd1501[]={12369,12441,0},
-dd1502[]={12371,12441,0},
-dd1503[]={12373,12441,0},
-dd1504[]={12375,12441,0},
-dd1505[]={12377,12441,0},
-dd1506[]={12379,12441,0},
-dd1507[]={12381,12441,0},
-dd1508[]={12383,12441,0},
-dd1509[]={12385,12441,0},
-dd1510[]={12388,12441,0},
-dd1511[]={12390,12441,0},
-dd1512[]={12392,12441,0},
-dd1513[]={12399,12441,0},
-dd1514[]={12399,12442,0},
-dd1515[]={12402,12441,0},
-dd1516[]={12402,12442,0},
-dd1517[]={12405,12441,0},
-dd1518[]={12405,12442,0},
-dd1519[]={12408,12441,0},
-dd1520[]={12408,12442,0},
-dd1521[]={12411,12441,0},
-dd1522[]={12411,12442,0},
-dd1523[]={12358,12441,0},
-dd1524[]={32,12441,0},
-dd1525[]={32,12442,0},
-dd1526[]={12445,12441,0},
-dd1527[]={12424,12426,0},
-dd1528[]={12459,12441,0},
-dd1529[]={12461,12441,0},
-dd1530[]={12463,12441,0},
-dd1531[]={12465,12441,0},
-dd1532[]={12467,12441,0},
-dd1533[]={12469,12441,0},
-dd1534[]={12471,12441,0},
-dd1535[]={12473,12441,0},
-dd1536[]={12475,12441,0},
-dd1537[]={12477,12441,0},
-dd1538[]={12479,12441,0},
-dd1539[]={12481,12441,0},
-dd1540[]={12484,12441,0},
-dd1541[]={12486,12441,0},
-dd1542[]={12488,12441,0},
-dd1543[]={12495,12441,0},
-dd1544[]={12495,12442,0},
-dd1545[]={12498,12441,0},
-dd1546[]={12498,12442,0},
-dd1547[]={12501,12441,0},
-dd1548[]={12501,12442,0},
-dd1549[]={12504,12441,0},
-dd1550[]={12504,12442,0},
-dd1551[]={12507,12441,0},
-dd1552[]={12507,12442,0},
-dd1553[]={12454,12441,0},
-dd1554[]={12527,12441,0},
-dd1555[]={12528,12441,0},
-dd1556[]={12529,12441,0},
-dd1557[]={12530,12441,0},
-dd1558[]={12541,12441,0},
-dd1559[]={12467,12488,0},
-dd1560[]={4352,0},
-dd1561[]={4353,0},
-dd1562[]={4522,0},
-dd1563[]={4354,0},
-dd1564[]={4524,0},
-dd1565[]={4525,0},
-dd1566[]={4355,0},
-dd1567[]={4356,0},
-dd1568[]={4357,0},
-dd1569[]={4528,0},
-dd1570[]={4529,0},
-dd1571[]={4530,0},
-dd1572[]={4531,0},
-dd1573[]={4532,0},
-dd1574[]={4533,0},
-dd1575[]={4378,0},
-dd1576[]={4358,0},
-dd1577[]={4359,0},
-dd1578[]={4360,0},
-dd1579[]={4385,0},
-dd1580[]={4361,0},
-dd1581[]={4362,0},
-dd1582[]={4363,0},
-dd1583[]={4364,0},
-dd1584[]={4365,0},
-dd1585[]={4366,0},
-dd1586[]={4367,0},
-dd1587[]={4368,0},
-dd1588[]={4369,0},
-dd1589[]={4370,0},
-dd1590[]={4449,0},
-dd1591[]={4450,0},
-dd1592[]={4451,0},
-dd1593[]={4452,0},
-dd1594[]={4453,0},
-dd1595[]={4454,0},
-dd1596[]={4455,0},
-dd1597[]={4456,0},
-dd1598[]={4457,0},
-dd1599[]={4458,0},
-dd1600[]={4459,0},
-dd1601[]={4460,0},
-dd1602[]={4461,0},
-dd1603[]={4462,0},
-dd1604[]={4463,0},
-dd1605[]={4464,0},
-dd1606[]={4465,0},
-dd1607[]={4466,0},
-dd1608[]={4467,0},
-dd1609[]={4468,0},
-dd1610[]={4469,0},
-dd1611[]={4448,0},
-dd1612[]={4372,0},
-dd1613[]={4373,0},
-dd1614[]={4551,0},
-dd1615[]={4552,0},
-dd1616[]={4556,0},
-dd1617[]={4558,0},
-dd1618[]={4563,0},
-dd1619[]={4567,0},
-dd1620[]={4569,0},
-dd1621[]={4380,0},
-dd1622[]={4573,0},
-dd1623[]={4575,0},
-dd1624[]={4381,0},
-dd1625[]={4382,0},
-dd1626[]={4384,0},
-dd1627[]={4386,0},
-dd1628[]={4387,0},
-dd1629[]={4391,0},
-dd1630[]={4393,0},
-dd1631[]={4395,0},
-dd1632[]={4396,0},
-dd1633[]={4397,0},
-dd1634[]={4398,0},
-dd1635[]={4399,0},
-dd1636[]={4402,0},
-dd1637[]={4406,0},
-dd1638[]={4416,0},
-dd1639[]={4423,0},
-dd1640[]={4428,0},
-dd1641[]={4593,0},
-dd1642[]={4594,0},
-dd1643[]={4439,0},
-dd1644[]={4440,0},
-dd1645[]={4441,0},
-dd1646[]={4484,0},
-dd1647[]={4485,0},
-dd1648[]={4488,0},
-dd1649[]={4497,0},
-dd1650[]={4498,0},
-dd1651[]={4500,0},
-dd1652[]={4510,0},
-dd1653[]={4513,0},
-dd1654[]={19977,0},
-dd1655[]={22235,0},
-dd1656[]={19978,0},
-dd1657[]={20013,0},
-dd1658[]={19979,0},
-dd1659[]={30002,0},
-dd1660[]={19993,0},
-dd1661[]={19969,0},
-dd1662[]={22825,0},
-dd1663[]={22320,0},
-dd1664[]={40,4352,41,0},
-dd1665[]={40,4354,41,0},
-dd1666[]={40,4355,41,0},
-dd1667[]={40,4357,41,0},
-dd1668[]={40,4358,41,0},
-dd1669[]={40,4359,41,0},
-dd1670[]={40,4361,41,0},
-dd1671[]={40,4363,41,0},
-dd1672[]={40,4364,41,0},
-dd1673[]={40,4366,41,0},
-dd1674[]={40,4367,41,0},
-dd1675[]={40,4368,41,0},
-dd1676[]={40,4369,41,0},
-dd1677[]={40,4370,41,0},
-dd1678[]={40,4352,4449,41,0},
-dd1679[]={40,4354,4449,41,0},
-dd1680[]={40,4355,4449,41,0},
-dd1681[]={40,4357,4449,41,0},
-dd1682[]={40,4358,4449,41,0},
-dd1683[]={40,4359,4449,41,0},
-dd1684[]={40,4361,4449,41,0},
-dd1685[]={40,4363,4449,41,0},
-dd1686[]={40,4364,4449,41,0},
-dd1687[]={40,4366,4449,41,0},
-dd1688[]={40,4367,4449,41,0},
-dd1689[]={40,4368,4449,41,0},
-dd1690[]={40,4369,4449,41,0},
-dd1691[]={40,4370,4449,41,0},
-dd1692[]={40,4364,4462,41,0},
-dd1693[]={40,4363,4457,4364,4453,4523,41,0},
-dd1694[]={40,4363,4457,4370,4462,41,0},
-dd1695[]={40,19968,41,0},
-dd1696[]={40,20108,41,0},
-dd1697[]={40,19977,41,0},
-dd1698[]={40,22235,41,0},
-dd1699[]={40,20116,41,0},
-dd1700[]={40,20845,41,0},
-dd1701[]={40,19971,41,0},
-dd1702[]={40,20843,41,0},
-dd1703[]={40,20061,41,0},
-dd1704[]={40,21313,41,0},
-dd1705[]={40,26376,41,0},
-dd1706[]={40,28779,41,0},
-dd1707[]={40,27700,41,0},
-dd1708[]={40,26408,41,0},
-dd1709[]={40,37329,41,0},
-dd1710[]={40,22303,41,0},
-dd1711[]={40,26085,41,0},
-dd1712[]={40,26666,41,0},
-dd1713[]={40,26377,41,0},
-dd1714[]={40,31038,41,0},
-dd1715[]={40,21517,41,0},
-dd1716[]={40,29305,41,0},
-dd1717[]={40,36001,41,0},
-dd1718[]={40,31069,41,0},
-dd1719[]={40,21172,41,0},
-dd1720[]={40,20195,41,0},
-dd1721[]={40,21628,41,0},
-dd1722[]={40,23398,41,0},
-dd1723[]={40,30435,41,0},
-dd1724[]={40,20225,41,0},
-dd1725[]={40,36039,41,0},
-dd1726[]={40,21332,41,0},
-dd1727[]={40,31085,41,0},
-dd1728[]={40,20241,41,0},
-dd1729[]={40,33258,41,0},
-dd1730[]={40,33267,41,0},
-dd1731[]={80,84,69,0},
-dd1732[]={50,49,0},
-dd1733[]={50,50,0},
-dd1734[]={50,51,0},
-dd1735[]={50,52,0},
-dd1736[]={50,53,0},
-dd1737[]={50,54,0},
-dd1738[]={50,55,0},
-dd1739[]={50,56,0},
-dd1740[]={50,57,0},
-dd1741[]={51,48,0},
-dd1742[]={51,49,0},
-dd1743[]={51,50,0},
-dd1744[]={51,51,0},
-dd1745[]={51,52,0},
-dd1746[]={51,53,0},
-dd1747[]={4352,4449,0},
-dd1748[]={4354,4449,0},
-dd1749[]={4355,4449,0},
-dd1750[]={4357,4449,0},
-dd1751[]={4358,4449,0},
-dd1752[]={4359,4449,0},
-dd1753[]={4361,4449,0},
-dd1754[]={4363,4449,0},
-dd1755[]={4364,4449,0},
-dd1756[]={4366,4449,0},
-dd1757[]={4367,4449,0},
-dd1758[]={4368,4449,0},
-dd1759[]={4369,4449,0},
-dd1760[]={4370,4449,0},
-dd1761[]={4366,4449,4535,4352,4457,0},
-dd1762[]={4364,4462,4363,4468,0},
-dd1763[]={4363,4462,0},
-dd1764[]={20116,0},
-dd1765[]={20845,0},
-dd1766[]={19971,0},
-dd1767[]={20061,0},
-dd1768[]={26666,0},
-dd1769[]={26377,0},
-dd1770[]={31038,0},
-dd1771[]={21517,0},
-dd1772[]={29305,0},
-dd1773[]={36001,0},
-dd1774[]={31069,0},
-dd1775[]={21172,0},
-dd1776[]={31192,0},
-dd1777[]={30007,0},
-dd1778[]={36969,0},
-dd1779[]={20778,0},
-dd1780[]={21360,0},
-dd1781[]={27880,0},
-dd1782[]={38917,0},
-dd1783[]={20241,0},
-dd1784[]={20889,0},
-dd1785[]={27491,0},
-dd1786[]={24038,0},
-dd1787[]={21491,0},
-dd1788[]={21307,0},
-dd1789[]={23447,0},
-dd1790[]={23398,0},
-dd1791[]={30435,0},
-dd1792[]={20225,0},
-dd1793[]={36039,0},
-dd1794[]={21332,0},
-dd1795[]={22812,0},
-dd1796[]={51,54,0},
-dd1797[]={51,55,0},
-dd1798[]={51,56,0},
-dd1799[]={51,57,0},
-dd1800[]={52,48,0},
-dd1801[]={52,49,0},
-dd1802[]={52,50,0},
-dd1803[]={52,51,0},
-dd1804[]={52,52,0},
-dd1805[]={52,53,0},
-dd1806[]={52,54,0},
-dd1807[]={52,55,0},
-dd1808[]={52,56,0},
-dd1809[]={52,57,0},
-dd1810[]={53,48,0},
-dd1811[]={49,26376,0},
-dd1812[]={50,26376,0},
-dd1813[]={51,26376,0},
-dd1814[]={52,26376,0},
-dd1815[]={53,26376,0},
-dd1816[]={54,26376,0},
-dd1817[]={55,26376,0},
-dd1818[]={56,26376,0},
-dd1819[]={57,26376,0},
-dd1820[]={49,48,26376,0},
-dd1821[]={49,49,26376,0},
-dd1822[]={49,50,26376,0},
-dd1823[]={72,103,0},
-dd1824[]={101,114,103,0},
-dd1825[]={101,86,0},
-dd1826[]={76,84,68,0},
-dd1827[]={12450,0},
-dd1828[]={12452,0},
-dd1829[]={12454,0},
-dd1830[]={12456,0},
-dd1831[]={12458,0},
-dd1832[]={12459,0},
-dd1833[]={12461,0},
-dd1834[]={12463,0},
-dd1835[]={12465,0},
-dd1836[]={12467,0},
-dd1837[]={12469,0},
-dd1838[]={12471,0},
-dd1839[]={12473,0},
-dd1840[]={12475,0},
-dd1841[]={12477,0},
-dd1842[]={12479,0},
-dd1843[]={12481,0},
-dd1844[]={12484,0},
-dd1845[]={12486,0},
-dd1846[]={12488,0},
-dd1847[]={12490,0},
-dd1848[]={12491,0},
-dd1849[]={12492,0},
-dd1850[]={12493,0},
-dd1851[]={12494,0},
-dd1852[]={12495,0},
-dd1853[]={12498,0},
-dd1854[]={12501,0},
-dd1855[]={12504,0},
-dd1856[]={12507,0},
-dd1857[]={12510,0},
-dd1858[]={12511,0},
-dd1859[]={12512,0},
-dd1860[]={12513,0},
-dd1861[]={12514,0},
-dd1862[]={12516,0},
-dd1863[]={12518,0},
-dd1864[]={12520,0},
-dd1865[]={12521,0},
-dd1866[]={12522,0},
-dd1867[]={12523,0},
-dd1868[]={12524,0},
-dd1869[]={12525,0},
-dd1870[]={12527,0},
-dd1871[]={12528,0},
-dd1872[]={12529,0},
-dd1873[]={12530,0},
-dd1874[]={12450,12497,12540,12488,0},
-dd1875[]={12450,12523,12501,12449,0},
-dd1876[]={12450,12531,12506,12450,0},
-dd1877[]={12450,12540,12523,0},
-dd1878[]={12452,12491,12531,12464,0},
-dd1879[]={12452,12531,12481,0},
-dd1880[]={12454,12457,12531,0},
-dd1881[]={12456,12473,12463,12540,12489,0},
-dd1882[]={12456,12540,12459,12540,0},
-dd1883[]={12458,12531,12473,0},
-dd1884[]={12458,12540,12512,0},
-dd1885[]={12459,12452,12522,0},
-dd1886[]={12459,12521,12483,12488,0},
-dd1887[]={12459,12525,12522,12540,0},
-dd1888[]={12460,12525,12531,0},
-dd1889[]={12460,12531,12510,0},
-dd1890[]={12462,12460,0},
-dd1891[]={12462,12491,12540,0},
-dd1892[]={12461,12517,12522,12540,0},
-dd1893[]={12462,12523,12480,12540,0},
-dd1894[]={12461,12525,0},
-dd1895[]={12461,12525,12464,12521,12512,0},
-dd1896[]={12461,12525,12513,12540,12488,12523,0},
-dd1897[]={12461,12525,12527,12483,12488,0},
-dd1898[]={12464,12521,12512,0},
-dd1899[]={12464,12521,12512,12488,12531,0},
-dd1900[]={12463,12523,12476,12452,12525,0},
-dd1901[]={12463,12525,12540,12493,0},
-dd1902[]={12465,12540,12473,0},
-dd1903[]={12467,12523,12490,0},
-dd1904[]={12467,12540,12509,0},
-dd1905[]={12469,12452,12463,12523,0},
-dd1906[]={12469,12531,12481,12540,12512,0},
-dd1907[]={12471,12522,12531,12464,0},
-dd1908[]={12475,12531,12481,0},
-dd1909[]={12475,12531,12488,0},
-dd1910[]={12480,12540,12473,0},
-dd1911[]={12487,12471,0},
-dd1912[]={12489,12523,0},
-dd1913[]={12488,12531,0},
-dd1914[]={12490,12494,0},
-dd1915[]={12494,12483,12488,0},
-dd1916[]={12495,12452,12484,0},
-dd1917[]={12497,12540,12475,12531,12488,0},
-dd1918[]={12497,12540,12484,0},
-dd1919[]={12496,12540,12524,12523,0},
-dd1920[]={12500,12450,12473,12488,12523,0},
-dd1921[]={12500,12463,12523,0},
-dd1922[]={12500,12467,0},
-dd1923[]={12499,12523,0},
-dd1924[]={12501,12449,12521,12483,12489,0},
-dd1925[]={12501,12451,12540,12488,0},
-dd1926[]={12502,12483,12471,12455,12523,0},
-dd1927[]={12501,12521,12531,0},
-dd1928[]={12504,12463,12479,12540,12523,0},
-dd1929[]={12506,12477,0},
-dd1930[]={12506,12491,12498,0},
-dd1931[]={12504,12523,12484,0},
-dd1932[]={12506,12531,12473,0},
-dd1933[]={12506,12540,12472,0},
-dd1934[]={12505,12540,12479,0},
-dd1935[]={12509,12452,12531,12488,0},
-dd1936[]={12508,12523,12488,0},
-dd1937[]={12507,12531,0},
-dd1938[]={12509,12531,12489,0},
-dd1939[]={12507,12540,12523,0},
-dd1940[]={12507,12540,12531,0},
-dd1941[]={12510,12452,12463,12525,0},
-dd1942[]={12510,12452,12523,0},
-dd1943[]={12510,12483,12495,0},
-dd1944[]={12510,12523,12463,0},
-dd1945[]={12510,12531,12471,12519,12531,0},
-dd1946[]={12511,12463,12525,12531,0},
-dd1947[]={12511,12522,0},
-dd1948[]={12511,12522,12496,12540,12523,0},
-dd1949[]={12513,12460,0},
-dd1950[]={12513,12460,12488,12531,0},
-dd1951[]={12513,12540,12488,12523,0},
-dd1952[]={12516,12540,12489,0},
-dd1953[]={12516,12540,12523,0},
-dd1954[]={12518,12450,12531,0},
-dd1955[]={12522,12483,12488,12523,0},
-dd1956[]={12522,12521,0},
-dd1957[]={12523,12500,12540,0},
-dd1958[]={12523,12540,12502,12523,0},
-dd1959[]={12524,12512,0},
-dd1960[]={12524,12531,12488,12466,12531,0},
-dd1961[]={12527,12483,12488,0},
-dd1962[]={48,28857,0},
-dd1963[]={49,28857,0},
-dd1964[]={50,28857,0},
-dd1965[]={51,28857,0},
-dd1966[]={52,28857,0},
-dd1967[]={53,28857,0},
-dd1968[]={54,28857,0},
-dd1969[]={55,28857,0},
-dd1970[]={56,28857,0},
-dd1971[]={57,28857,0},
-dd1972[]={49,48,28857,0},
-dd1973[]={49,49,28857,0},
-dd1974[]={49,50,28857,0},
-dd1975[]={49,51,28857,0},
-dd1976[]={49,52,28857,0},
-dd1977[]={49,53,28857,0},
-dd1978[]={49,54,28857,0},
-dd1979[]={49,55,28857,0},
-dd1980[]={49,56,28857,0},
-dd1981[]={49,57,28857,0},
-dd1982[]={50,48,28857,0},
-dd1983[]={50,49,28857,0},
-dd1984[]={50,50,28857,0},
-dd1985[]={50,51,28857,0},
-dd1986[]={50,52,28857,0},
-dd1987[]={104,80,97,0},
-dd1988[]={100,97,0},
-dd1989[]={65,85,0},
-dd1990[]={98,97,114,0},
-dd1991[]={111,86,0},
-dd1992[]={112,99,0},
-dd1993[]={100,109,0},
-dd1994[]={100,109,178,0},
-dd1995[]={100,109,179,0},
-dd1996[]={73,85,0},
-dd1997[]={24179,25104,0},
-dd1998[]={26157,21644,0},
-dd1999[]={22823,27491,0},
-dd2000[]={26126,27835,0},
-dd2001[]={26666,24335,20250,31038,0},
-dd2002[]={112,65,0},
-dd2003[]={110,65,0},
-dd2004[]={956,65,0},
-dd2005[]={109,65,0},
-dd2006[]={107,65,0},
-dd2007[]={75,66,0},
-dd2008[]={77,66,0},
-dd2009[]={71,66,0},
-dd2010[]={99,97,108,0},
-dd2011[]={107,99,97,108,0},
-dd2012[]={112,70,0},
-dd2013[]={110,70,0},
-dd2014[]={956,70,0},
-dd2015[]={956,103,0},
-dd2016[]={109,103,0},
-dd2017[]={107,103,0},
-dd2018[]={72,122,0},
-dd2019[]={107,72,122,0},
-dd2020[]={77,72,122,0},
-dd2021[]={71,72,122,0},
-dd2022[]={84,72,122,0},
-dd2023[]={956,8467,0},
-dd2024[]={109,8467,0},
-dd2025[]={100,8467,0},
-dd2026[]={107,8467,0},
-dd2027[]={102,109,0},
-dd2028[]={110,109,0},
-dd2029[]={956,109,0},
-dd2030[]={109,109,0},
-dd2031[]={99,109,0},
-dd2032[]={107,109,0},
-dd2033[]={109,109,178,0},
-dd2034[]={99,109,178,0},
-dd2035[]={109,178,0},
-dd2036[]={107,109,178,0},
-dd2037[]={109,109,179,0},
-dd2038[]={99,109,179,0},
-dd2039[]={109,179,0},
-dd2040[]={107,109,179,0},
-dd2041[]={109,8725,115,0},
-dd2042[]={109,8725,115,178,0},
-dd2043[]={80,97,0},
-dd2044[]={107,80,97,0},
-dd2045[]={77,80,97,0},
-dd2046[]={71,80,97,0},
-dd2047[]={114,97,100,0},
-dd2048[]={114,97,100,8725,115,0},
-dd2049[]={114,97,100,8725,115,178,0},
-dd2050[]={112,115,0},
-dd2051[]={110,115,0},
-dd2052[]={956,115,0},
-dd2053[]={109,115,0},
-dd2054[]={112,86,0},
-dd2055[]={110,86,0},
-dd2056[]={956,86,0},
-dd2057[]={109,86,0},
-dd2058[]={107,86,0},
-dd2059[]={77,86,0},
-dd2060[]={112,87,0},
-dd2061[]={110,87,0},
-dd2062[]={956,87,0},
-dd2063[]={109,87,0},
-dd2064[]={107,87,0},
-dd2065[]={77,87,0},
-dd2066[]={107,937,0},
-dd2067[]={77,937,0},
-dd2068[]={97,46,109,46,0},
-dd2069[]={66,113,0},
-dd2070[]={99,99,0},
-dd2071[]={99,100,0},
-dd2072[]={67,8725,107,103,0},
-dd2073[]={67,111,46,0},
-dd2074[]={100,66,0},
-dd2075[]={71,121,0},
-dd2076[]={104,97,0},
-dd2077[]={72,80,0},
-dd2078[]={105,110,0},
-dd2079[]={75,75,0},
-dd2080[]={75,77,0},
-dd2081[]={107,116,0},
-dd2082[]={108,109,0},
-dd2083[]={108,110,0},
-dd2084[]={108,111,103,0},
-dd2085[]={108,120,0},
-dd2086[]={109,98,0},
-dd2087[]={109,105,108,0},
-dd2088[]={109,111,108,0},
-dd2089[]={80,72,0},
-dd2090[]={112,46,109,46,0},
-dd2091[]={80,80,77,0},
-dd2092[]={80,82,0},
-dd2093[]={115,114,0},
-dd2094[]={83,118,0},
-dd2095[]={87,98,0},
-dd2096[]={86,8725,109,0},
-dd2097[]={65,8725,109,0},
-dd2098[]={49,26085,0},
-dd2099[]={50,26085,0},
-dd2100[]={51,26085,0},
-dd2101[]={52,26085,0},
-dd2102[]={53,26085,0},
-dd2103[]={54,26085,0},
-dd2104[]={55,26085,0},
-dd2105[]={56,26085,0},
-dd2106[]={57,26085,0},
-dd2107[]={49,48,26085,0},
-dd2108[]={49,49,26085,0},
-dd2109[]={49,50,26085,0},
-dd2110[]={49,51,26085,0},
-dd2111[]={49,52,26085,0},
-dd2112[]={49,53,26085,0},
-dd2113[]={49,54,26085,0},
-dd2114[]={49,55,26085,0},
-dd2115[]={49,56,26085,0},
-dd2116[]={49,57,26085,0},
-dd2117[]={50,48,26085,0},
-dd2118[]={50,49,26085,0},
-dd2119[]={50,50,26085,0},
-dd2120[]={50,51,26085,0},
-dd2121[]={50,52,26085,0},
-dd2122[]={50,53,26085,0},
-dd2123[]={50,54,26085,0},
-dd2124[]={50,55,26085,0},
-dd2125[]={50,56,26085,0},
-dd2126[]={50,57,26085,0},
-dd2127[]={51,48,26085,0},
-dd2128[]={51,49,26085,0},
-dd2129[]={103,97,108,0},
-dd2130[]={42863,0},
-dd2131[]={35912,0},
-dd2132[]={26356,0},
-dd2133[]={36040,0},
-dd2134[]={28369,0},
-dd2135[]={20018,0},
-dd2136[]={21477,0},
-dd2137[]={22865,0},
-dd2138[]={21895,0},
-dd2139[]={22856,0},
-dd2140[]={25078,0},
-dd2141[]={30313,0},
-dd2142[]={32645,0},
-dd2143[]={34367,0},
-dd2144[]={34746,0},
-dd2145[]={35064,0},
-dd2146[]={37007,0},
-dd2147[]={27138,0},
-dd2148[]={27931,0},
-dd2149[]={28889,0},
-dd2150[]={29662,0},
-dd2151[]={33853,0},
-dd2152[]={37226,0},
-dd2153[]={39409,0},
-dd2154[]={20098,0},
-dd2155[]={21365,0},
-dd2156[]={27396,0},
-dd2157[]={29211,0},
-dd2158[]={34349,0},
-dd2159[]={40478,0},
-dd2160[]={23888,0},
-dd2161[]={28651,0},
-dd2162[]={34253,0},
-dd2163[]={35172,0},
-dd2164[]={25289,0},
-dd2165[]={33240,0},
-dd2166[]={34847,0},
-dd2167[]={24266,0},
-dd2168[]={26391,0},
-dd2169[]={28010,0},
-dd2170[]={29436,0},
-dd2171[]={37070,0},
-dd2172[]={20358,0},
-dd2173[]={20919,0},
-dd2174[]={21214,0},
-dd2175[]={25796,0},
-dd2176[]={27347,0},
-dd2177[]={29200,0},
-dd2178[]={30439,0},
-dd2179[]={34310,0},
-dd2180[]={34396,0},
-dd2181[]={36335,0},
-dd2182[]={38706,0},
-dd2183[]={39791,0},
-dd2184[]={40442,0},
-dd2185[]={30860,0},
-dd2186[]={31103,0},
-dd2187[]={32160,0},
-dd2188[]={33737,0},
-dd2189[]={37636,0},
-dd2190[]={35542,0},
-dd2191[]={22751,0},
-dd2192[]={24324,0},
-dd2193[]={31840,0},
-dd2194[]={32894,0},
-dd2195[]={29282,0},
-dd2196[]={30922,0},
-dd2197[]={36034,0},
-dd2198[]={38647,0},
-dd2199[]={22744,0},
-dd2200[]={23650,0},
-dd2201[]={27155,0},
-dd2202[]={28122,0},
-dd2203[]={28431,0},
-dd2204[]={32047,0},
-dd2205[]={32311,0},
-dd2206[]={38475,0},
-dd2207[]={21202,0},
-dd2208[]={32907,0},
-dd2209[]={20956,0},
-dd2210[]={20940,0},
-dd2211[]={31260,0},
-dd2212[]={32190,0},
-dd2213[]={33777,0},
-dd2214[]={38517,0},
-dd2215[]={35712,0},
-dd2216[]={25295,0},
-dd2217[]={35582,0},
-dd2218[]={20025,0},
-dd2219[]={23527,0},
-dd2220[]={24594,0},
-dd2221[]={29575,0},
-dd2222[]={30064,0},
-dd2223[]={21271,0},
-dd2224[]={30971,0},
-dd2225[]={20415,0},
-dd2226[]={24489,0},
-dd2227[]={19981,0},
-dd2228[]={27852,0},
-dd2229[]={25976,0},
-dd2230[]={32034,0},
-dd2231[]={21443,0},
-dd2232[]={22622,0},
-dd2233[]={30465,0},
-dd2234[]={33865,0},
-dd2235[]={35498,0},
-dd2236[]={27578,0},
-dd2237[]={27784,0},
-dd2238[]={25342,0},
-dd2239[]={33509,0},
-dd2240[]={25504,0},
-dd2241[]={30053,0},
-dd2242[]={20142,0},
-dd2243[]={20841,0},
-dd2244[]={20937,0},
-dd2245[]={26753,0},
-dd2246[]={31975,0},
-dd2247[]={33391,0},
-dd2248[]={35538,0},
-dd2249[]={37327,0},
-dd2250[]={21237,0},
-dd2251[]={21570,0},
-dd2252[]={24300,0},
-dd2253[]={26053,0},
-dd2254[]={28670,0},
-dd2255[]={31018,0},
-dd2256[]={38317,0},
-dd2257[]={39530,0},
-dd2258[]={40599,0},
-dd2259[]={40654,0},
-dd2260[]={26310,0},
-dd2261[]={27511,0},
-dd2262[]={36706,0},
-dd2263[]={24180,0},
-dd2264[]={24976,0},
-dd2265[]={25088,0},
-dd2266[]={25754,0},
-dd2267[]={28451,0},
-dd2268[]={29001,0},
-dd2269[]={29833,0},
-dd2270[]={31178,0},
-dd2271[]={32244,0},
-dd2272[]={32879,0},
-dd2273[]={36646,0},
-dd2274[]={34030,0},
-dd2275[]={36899,0},
-dd2276[]={37706,0},
-dd2277[]={21015,0},
-dd2278[]={21155,0},
-dd2279[]={21693,0},
-dd2280[]={28872,0},
-dd2281[]={35010,0},
-dd2282[]={24265,0},
-dd2283[]={24565,0},
-dd2284[]={25467,0},
-dd2285[]={27566,0},
-dd2286[]={31806,0},
-dd2287[]={29557,0},
-dd2288[]={20196,0},
-dd2289[]={22265,0},
-dd2290[]={23994,0},
-dd2291[]={24604,0},
-dd2292[]={29618,0},
-dd2293[]={29801,0},
-dd2294[]={32666,0},
-dd2295[]={32838,0},
-dd2296[]={37428,0},
-dd2297[]={38646,0},
-dd2298[]={38728,0},
-dd2299[]={38936,0},
-dd2300[]={20363,0},
-dd2301[]={31150,0},
-dd2302[]={37300,0},
-dd2303[]={38584,0},
-dd2304[]={24801,0},
-dd2305[]={20102,0},
-dd2306[]={20698,0},
-dd2307[]={23534,0},
-dd2308[]={23615,0},
-dd2309[]={26009,0},
-dd2310[]={29134,0},
-dd2311[]={30274,0},
-dd2312[]={34044,0},
-dd2313[]={36988,0},
-dd2314[]={26248,0},
-dd2315[]={38446,0},
-dd2316[]={21129,0},
-dd2317[]={26491,0},
-dd2318[]={26611,0},
-dd2319[]={27969,0},
-dd2320[]={28316,0},
-dd2321[]={29705,0},
-dd2322[]={30041,0},
-dd2323[]={30827,0},
-dd2324[]={32016,0},
-dd2325[]={39006,0},
-dd2326[]={25134,0},
-dd2327[]={38520,0},
-dd2328[]={20523,0},
-dd2329[]={23833,0},
-dd2330[]={28138,0},
-dd2331[]={36650,0},
-dd2332[]={24459,0},
-dd2333[]={24900,0},
-dd2334[]={26647,0},
-dd2335[]={38534,0},
-dd2336[]={21033,0},
-dd2337[]={21519,0},
-dd2338[]={23653,0},
-dd2339[]={26131,0},
-dd2340[]={26446,0},
-dd2341[]={26792,0},
-dd2342[]={27877,0},
-dd2343[]={29702,0},
-dd2344[]={30178,0},
-dd2345[]={32633,0},
-dd2346[]={35023,0},
-dd2347[]={35041,0},
-dd2348[]={38626,0},
-dd2349[]={21311,0},
-dd2350[]={28346,0},
-dd2351[]={21533,0},
-dd2352[]={29136,0},
-dd2353[]={29848,0},
-dd2354[]={34298,0},
-dd2355[]={38563,0},
-dd2356[]={40023,0},
-dd2357[]={40607,0},
-dd2358[]={26519,0},
-dd2359[]={28107,0},
-dd2360[]={33256,0},
-dd2361[]={31520,0},
-dd2362[]={31890,0},
-dd2363[]={29376,0},
-dd2364[]={28825,0},
-dd2365[]={35672,0},
-dd2366[]={20160,0},
-dd2367[]={33590,0},
-dd2368[]={21050,0},
-dd2369[]={20999,0},
-dd2370[]={24230,0},
-dd2371[]={25299,0},
-dd2372[]={31958,0},
-dd2373[]={23429,0},
-dd2374[]={27934,0},
-dd2375[]={26292,0},
-dd2376[]={36667,0},
-dd2377[]={38477,0},
-dd2378[]={24275,0},
-dd2379[]={20800,0},
-dd2380[]={21952,0},
-dd2381[]={22618,0},
-dd2382[]={26228,0},
-dd2383[]={20958,0},
-dd2384[]={29482,0},
-dd2385[]={30410,0},
-dd2386[]={31036,0},
-dd2387[]={31070,0},
-dd2388[]={31077,0},
-dd2389[]={31119,0},
-dd2390[]={38742,0},
-dd2391[]={31934,0},
-dd2392[]={34322,0},
-dd2393[]={35576,0},
-dd2394[]={36920,0},
-dd2395[]={37117,0},
-dd2396[]={39151,0},
-dd2397[]={39164,0},
-dd2398[]={39208,0},
-dd2399[]={40372,0},
-dd2400[]={20398,0},
-dd2401[]={20711,0},
-dd2402[]={20813,0},
-dd2403[]={21193,0},
-dd2404[]={21220,0},
-dd2405[]={21329,0},
-dd2406[]={21917,0},
-dd2407[]={22022,0},
-dd2408[]={22120,0},
-dd2409[]={22592,0},
-dd2410[]={22696,0},
-dd2411[]={23652,0},
-dd2412[]={24724,0},
-dd2413[]={24936,0},
-dd2414[]={24974,0},
-dd2415[]={25074,0},
-dd2416[]={25935,0},
-dd2417[]={26082,0},
-dd2418[]={26257,0},
-dd2419[]={26757,0},
-dd2420[]={28023,0},
-dd2421[]={28186,0},
-dd2422[]={28450,0},
-dd2423[]={29038,0},
-dd2424[]={29227,0},
-dd2425[]={29730,0},
-dd2426[]={30865,0},
-dd2427[]={31049,0},
-dd2428[]={31048,0},
-dd2429[]={31056,0},
-dd2430[]={31062,0},
-dd2431[]={31117,0},
-dd2432[]={31118,0},
-dd2433[]={31296,0},
-dd2434[]={31361,0},
-dd2435[]={31680,0},
-dd2436[]={32265,0},
-dd2437[]={32321,0},
-dd2438[]={32626,0},
-dd2439[]={32773,0},
-dd2440[]={33261,0},
-dd2441[]={33401,0},
-dd2442[]={33879,0},
-dd2443[]={35088,0},
-dd2444[]={35222,0},
-dd2445[]={35585,0},
-dd2446[]={35641,0},
-dd2447[]={36051,0},
-dd2448[]={36104,0},
-dd2449[]={36790,0},
-dd2450[]={38627,0},
-dd2451[]={38911,0},
-dd2452[]={38971,0},
-dd2453[]={20006,0},
-dd2454[]={20917,0},
-dd2455[]={20840,0},
-dd2456[]={20352,0},
-dd2457[]={20805,0},
-dd2458[]={20864,0},
-dd2459[]={21191,0},
-dd2460[]={21242,0},
-dd2461[]={21845,0},
-dd2462[]={21913,0},
-dd2463[]={21986,0},
-dd2464[]={22707,0},
-dd2465[]={22852,0},
-dd2466[]={22868,0},
-dd2467[]={23138,0},
-dd2468[]={23336,0},
-dd2469[]={24274,0},
-dd2470[]={24281,0},
-dd2471[]={24425,0},
-dd2472[]={24493,0},
-dd2473[]={24792,0},
-dd2474[]={24910,0},
-dd2475[]={24840,0},
-dd2476[]={24928,0},
-dd2477[]={25140,0},
-dd2478[]={25540,0},
-dd2479[]={25628,0},
-dd2480[]={25682,0},
-dd2481[]={25942,0},
-dd2482[]={26395,0},
-dd2483[]={26454,0},
-dd2484[]={28379,0},
-dd2485[]={28363,0},
-dd2486[]={28702,0},
-dd2487[]={30631,0},
-dd2488[]={29237,0},
-dd2489[]={29359,0},
-dd2490[]={29809,0},
-dd2491[]={29958,0},
-dd2492[]={30011,0},
-dd2493[]={30237,0},
-dd2494[]={30239,0},
-dd2495[]={30427,0},
-dd2496[]={30452,0},
-dd2497[]={30538,0},
-dd2498[]={30528,0},
-dd2499[]={30924,0},
-dd2500[]={31409,0},
-dd2501[]={31867,0},
-dd2502[]={32091,0},
-dd2503[]={32574,0},
-dd2504[]={33618,0},
-dd2505[]={33775,0},
-dd2506[]={34681,0},
-dd2507[]={35137,0},
-dd2508[]={35206,0},
-dd2509[]={35519,0},
-dd2510[]={35531,0},
-dd2511[]={35565,0},
-dd2512[]={35722,0},
-dd2513[]={36664,0},
-dd2514[]={36978,0},
-dd2515[]={37273,0},
-dd2516[]={37494,0},
-dd2517[]={38524,0},
-dd2518[]={38875,0},
-dd2519[]={38923,0},
-dd2520[]={39698,0},
-dd2521[]={141386,0},
-dd2522[]={141380,0},
-dd2523[]={144341,0},
-dd2524[]={15261,0},
-dd2525[]={16408,0},
-dd2526[]={16441,0},
-dd2527[]={152137,0},
-dd2528[]={154832,0},
-dd2529[]={163539,0},
-dd2530[]={40771,0},
-dd2531[]={40846,0},
-dd2532[]={102,102,0},
-dd2533[]={102,105,0},
-dd2534[]={102,108,0},
-dd2535[]={102,102,105,0},
-dd2536[]={102,102,108,0},
-dd2537[]={383,116,0},
-dd2538[]={115,116,0},
-dd2539[]={1396,1398,0},
-dd2540[]={1396,1381,0},
-dd2541[]={1396,1387,0},
-dd2542[]={1406,1398,0},
-dd2543[]={1396,1389,0},
-dd2544[]={1497,1460,0},
-dd2545[]={1522,1463,0},
-dd2546[]={1506,0},
-dd2547[]={1492,0},
-dd2548[]={1499,0},
-dd2549[]={1500,0},
-dd2550[]={1501,0},
-dd2551[]={1512,0},
-dd2552[]={1514,0},
-dd2553[]={1513,1473,0},
-dd2554[]={1513,1474,0},
-dd2555[]={64329,1473,0},
-dd2556[]={64329,1474,0},
-dd2557[]={1488,1463,0},
-dd2558[]={1488,1464,0},
-dd2559[]={1488,1468,0},
-dd2560[]={1489,1468,0},
-dd2561[]={1490,1468,0},
-dd2562[]={1491,1468,0},
-dd2563[]={1492,1468,0},
-dd2564[]={1493,1468,0},
-dd2565[]={1494,1468,0},
-dd2566[]={1496,1468,0},
-dd2567[]={1497,1468,0},
-dd2568[]={1498,1468,0},
-dd2569[]={1499,1468,0},
-dd2570[]={1500,1468,0},
-dd2571[]={1502,1468,0},
-dd2572[]={1504,1468,0},
-dd2573[]={1505,1468,0},
-dd2574[]={1507,1468,0},
-dd2575[]={1508,1468,0},
-dd2576[]={1510,1468,0},
-dd2577[]={1511,1468,0},
-dd2578[]={1512,1468,0},
-dd2579[]={1513,1468,0},
-dd2580[]={1514,1468,0},
-dd2581[]={1493,1465,0},
-dd2582[]={1489,1471,0},
-dd2583[]={1499,1471,0},
-dd2584[]={1508,1471,0},
-dd2585[]={1488,1500,0},
-dd2586[]={1649,0},
-dd2587[]={1659,0},
-dd2588[]={1662,0},
-dd2589[]={1664,0},
-dd2590[]={1658,0},
-dd2591[]={1663,0},
-dd2592[]={1657,0},
-dd2593[]={1700,0},
-dd2594[]={1702,0},
-dd2595[]={1668,0},
-dd2596[]={1667,0},
-dd2597[]={1670,0},
-dd2598[]={1671,0},
-dd2599[]={1677,0},
-dd2600[]={1676,0},
-dd2601[]={1678,0},
-dd2602[]={1672,0},
-dd2603[]={1688,0},
-dd2604[]={1681,0},
-dd2605[]={1705,0},
-dd2606[]={1711,0},
-dd2607[]={1715,0},
-dd2608[]={1713,0},
-dd2609[]={1722,0},
-dd2610[]={1723,0},
-dd2611[]={1728,0},
-dd2612[]={1729,0},
-dd2613[]={1726,0},
-dd2614[]={1746,0},
-dd2615[]={1747,0},
-dd2616[]={1709,0},
-dd2617[]={1735,0},
-dd2618[]={1734,0},
-dd2619[]={1736,0},
-dd2620[]={1655,0},
-dd2621[]={1739,0},
-dd2622[]={1733,0},
-dd2623[]={1737,0},
-dd2624[]={1744,0},
-dd2625[]={1609,0},
-dd2626[]={1574,1575,0},
-dd2627[]={1574,1749,0},
-dd2628[]={1574,1608,0},
-dd2629[]={1574,1735,0},
-dd2630[]={1574,1734,0},
-dd2631[]={1574,1736,0},
-dd2632[]={1574,1744,0},
-dd2633[]={1574,1609,0},
-dd2634[]={1740,0},
-dd2635[]={1574,1580,0},
-dd2636[]={1574,1581,0},
-dd2637[]={1574,1605,0},
-dd2638[]={1574,1610,0},
-dd2639[]={1576,1580,0},
-dd2640[]={1576,1581,0},
-dd2641[]={1576,1582,0},
-dd2642[]={1576,1605,0},
-dd2643[]={1576,1609,0},
-dd2644[]={1576,1610,0},
-dd2645[]={1578,1580,0},
-dd2646[]={1578,1581,0},
-dd2647[]={1578,1582,0},
-dd2648[]={1578,1605,0},
-dd2649[]={1578,1609,0},
-dd2650[]={1578,1610,0},
-dd2651[]={1579,1580,0},
-dd2652[]={1579,1605,0},
-dd2653[]={1579,1609,0},
-dd2654[]={1579,1610,0},
-dd2655[]={1580,1581,0},
-dd2656[]={1580,1605,0},
-dd2657[]={1581,1580,0},
-dd2658[]={1581,1605,0},
-dd2659[]={1582,1580,0},
-dd2660[]={1582,1581,0},
-dd2661[]={1582,1605,0},
-dd2662[]={1587,1580,0},
-dd2663[]={1587,1581,0},
-dd2664[]={1587,1582,0},
-dd2665[]={1587,1605,0},
-dd2666[]={1589,1581,0},
-dd2667[]={1589,1605,0},
-dd2668[]={1590,1580,0},
-dd2669[]={1590,1581,0},
-dd2670[]={1590,1582,0},
-dd2671[]={1590,1605,0},
-dd2672[]={1591,1581,0},
-dd2673[]={1591,1605,0},
-dd2674[]={1592,1605,0},
-dd2675[]={1593,1580,0},
-dd2676[]={1593,1605,0},
-dd2677[]={1594,1580,0},
-dd2678[]={1594,1605,0},
-dd2679[]={1601,1580,0},
-dd2680[]={1601,1581,0},
-dd2681[]={1601,1582,0},
-dd2682[]={1601,1605,0},
-dd2683[]={1601,1609,0},
-dd2684[]={1601,1610,0},
-dd2685[]={1602,1581,0},
-dd2686[]={1602,1605,0},
-dd2687[]={1602,1609,0},
-dd2688[]={1602,1610,0},
-dd2689[]={1603,1575,0},
-dd2690[]={1603,1580,0},
-dd2691[]={1603,1581,0},
-dd2692[]={1603,1582,0},
-dd2693[]={1603,1604,0},
-dd2694[]={1603,1605,0},
-dd2695[]={1603,1609,0},
-dd2696[]={1603,1610,0},
-dd2697[]={1604,1580,0},
-dd2698[]={1604,1581,0},
-dd2699[]={1604,1582,0},
-dd2700[]={1604,1605,0},
-dd2701[]={1604,1609,0},
-dd2702[]={1604,1610,0},
-dd2703[]={1605,1580,0},
-dd2704[]={1605,1581,0},
-dd2705[]={1605,1582,0},
-dd2706[]={1605,1605,0},
-dd2707[]={1605,1609,0},
-dd2708[]={1605,1610,0},
-dd2709[]={1606,1580,0},
-dd2710[]={1606,1581,0},
-dd2711[]={1606,1582,0},
-dd2712[]={1606,1605,0},
-dd2713[]={1606,1609,0},
-dd2714[]={1606,1610,0},
-dd2715[]={1607,1580,0},
-dd2716[]={1607,1605,0},
-dd2717[]={1607,1609,0},
-dd2718[]={1607,1610,0},
-dd2719[]={1610,1580,0},
-dd2720[]={1610,1581,0},
-dd2721[]={1610,1582,0},
-dd2722[]={1610,1605,0},
-dd2723[]={1610,1609,0},
-dd2724[]={1610,1610,0},
-dd2725[]={1584,1648,0},
-dd2726[]={1585,1648,0},
-dd2727[]={1609,1648,0},
-dd2728[]={32,1612,1617,0},
-dd2729[]={32,1613,1617,0},
-dd2730[]={32,1614,1617,0},
-dd2731[]={32,1615,1617,0},
-dd2732[]={32,1616,1617,0},
-dd2733[]={32,1617,1648,0},
-dd2734[]={1574,1585,0},
-dd2735[]={1574,1586,0},
-dd2736[]={1574,1606,0},
-dd2737[]={1576,1585,0},
-dd2738[]={1576,1586,0},
-dd2739[]={1576,1606,0},
-dd2740[]={1578,1585,0},
-dd2741[]={1578,1586,0},
-dd2742[]={1578,1606,0},
-dd2743[]={1579,1585,0},
-dd2744[]={1579,1586,0},
-dd2745[]={1579,1606,0},
-dd2746[]={1605,1575,0},
-dd2747[]={1606,1585,0},
-dd2748[]={1606,1586,0},
-dd2749[]={1606,1606,0},
-dd2750[]={1610,1585,0},
-dd2751[]={1610,1586,0},
-dd2752[]={1610,1606,0},
-dd2753[]={1574,1582,0},
-dd2754[]={1574,1607,0},
-dd2755[]={1576,1607,0},
-dd2756[]={1578,1607,0},
-dd2757[]={1589,1582,0},
-dd2758[]={1604,1607,0},
-dd2759[]={1606,1607,0},
-dd2760[]={1607,1648,0},
-dd2761[]={1610,1607,0},
-dd2762[]={1579,1607,0},
-dd2763[]={1587,1607,0},
-dd2764[]={1588,1605,0},
-dd2765[]={1588,1607,0},
-dd2766[]={1600,1614,1617,0},
-dd2767[]={1600,1615,1617,0},
-dd2768[]={1600,1616,1617,0},
-dd2769[]={1591,1609,0},
-dd2770[]={1591,1610,0},
-dd2771[]={1593,1609,0},
-dd2772[]={1593,1610,0},
-dd2773[]={1594,1609,0},
-dd2774[]={1594,1610,0},
-dd2775[]={1587,1609,0},
-dd2776[]={1587,1610,0},
-dd2777[]={1588,1609,0},
-dd2778[]={1588,1610,0},
-dd2779[]={1581,1609,0},
-dd2780[]={1581,1610,0},
-dd2781[]={1580,1609,0},
-dd2782[]={1580,1610,0},
-dd2783[]={1582,1609,0},
-dd2784[]={1582,1610,0},
-dd2785[]={1589,1609,0},
-dd2786[]={1589,1610,0},
-dd2787[]={1590,1609,0},
-dd2788[]={1590,1610,0},
-dd2789[]={1588,1580,0},
-dd2790[]={1588,1581,0},
-dd2791[]={1588,1582,0},
-dd2792[]={1588,1585,0},
-dd2793[]={1587,1585,0},
-dd2794[]={1589,1585,0},
-dd2795[]={1590,1585,0},
-dd2796[]={1575,1611,0},
-dd2797[]={1578,1580,1605,0},
-dd2798[]={1578,1581,1580,0},
-dd2799[]={1578,1581,1605,0},
-dd2800[]={1578,1582,1605,0},
-dd2801[]={1578,1605,1580,0},
-dd2802[]={1578,1605,1581,0},
-dd2803[]={1578,1605,1582,0},
-dd2804[]={1580,1605,1581,0},
-dd2805[]={1581,1605,1610,0},
-dd2806[]={1581,1605,1609,0},
-dd2807[]={1587,1581,1580,0},
-dd2808[]={1587,1580,1581,0},
-dd2809[]={1587,1580,1609,0},
-dd2810[]={1587,1605,1581,0},
-dd2811[]={1587,1605,1580,0},
-dd2812[]={1587,1605,1605,0},
-dd2813[]={1589,1581,1581,0},
-dd2814[]={1589,1605,1605,0},
-dd2815[]={1588,1581,1605,0},
-dd2816[]={1588,1580,1610,0},
-dd2817[]={1588,1605,1582,0},
-dd2818[]={1588,1605,1605,0},
-dd2819[]={1590,1581,1609,0},
-dd2820[]={1590,1582,1605,0},
-dd2821[]={1591,1605,1581,0},
-dd2822[]={1591,1605,1605,0},
-dd2823[]={1591,1605,1610,0},
-dd2824[]={1593,1580,1605,0},
-dd2825[]={1593,1605,1605,0},
-dd2826[]={1593,1605,1609,0},
-dd2827[]={1594,1605,1605,0},
-dd2828[]={1594,1605,1610,0},
-dd2829[]={1594,1605,1609,0},
-dd2830[]={1601,1582,1605,0},
-dd2831[]={1602,1605,1581,0},
-dd2832[]={1602,1605,1605,0},
-dd2833[]={1604,1581,1605,0},
-dd2834[]={1604,1581,1610,0},
-dd2835[]={1604,1581,1609,0},
-dd2836[]={1604,1580,1580,0},
-dd2837[]={1604,1582,1605,0},
-dd2838[]={1604,1605,1581,0},
-dd2839[]={1605,1581,1580,0},
-dd2840[]={1605,1581,1605,0},
-dd2841[]={1605,1581,1610,0},
-dd2842[]={1605,1580,1581,0},
-dd2843[]={1605,1580,1605,0},
-dd2844[]={1605,1582,1580,0},
-dd2845[]={1605,1582,1605,0},
-dd2846[]={1605,1580,1582,0},
-dd2847[]={1607,1605,1580,0},
-dd2848[]={1607,1605,1605,0},
-dd2849[]={1606,1581,1605,0},
-dd2850[]={1606,1581,1609,0},
-dd2851[]={1606,1580,1605,0},
-dd2852[]={1606,1580,1609,0},
-dd2853[]={1606,1605,1610,0},
-dd2854[]={1606,1605,1609,0},
-dd2855[]={1610,1605,1605,0},
-dd2856[]={1576,1582,1610,0},
-dd2857[]={1578,1580,1610,0},
-dd2858[]={1578,1580,1609,0},
-dd2859[]={1578,1582,1610,0},
-dd2860[]={1578,1582,1609,0},
-dd2861[]={1578,1605,1610,0},
-dd2862[]={1578,1605,1609,0},
-dd2863[]={1580,1605,1610,0},
-dd2864[]={1580,1581,1609,0},
-dd2865[]={1580,1605,1609,0},
-dd2866[]={1587,1582,1609,0},
-dd2867[]={1589,1581,1610,0},
-dd2868[]={1588,1581,1610,0},
-dd2869[]={1590,1581,1610,0},
-dd2870[]={1604,1580,1610,0},
-dd2871[]={1604,1605,1610,0},
-dd2872[]={1610,1581,1610,0},
-dd2873[]={1610,1580,1610,0},
-dd2874[]={1610,1605,1610,0},
-dd2875[]={1605,1605,1610,0},
-dd2876[]={1602,1605,1610,0},
-dd2877[]={1606,1581,1610,0},
-dd2878[]={1593,1605,1610,0},
-dd2879[]={1603,1605,1610,0},
-dd2880[]={1606,1580,1581,0},
-dd2881[]={1605,1582,1610,0},
-dd2882[]={1604,1580,1605,0},
-dd2883[]={1603,1605,1605,0},
-dd2884[]={1580,1581,1610,0},
-dd2885[]={1581,1580,1610,0},
-dd2886[]={1605,1580,1610,0},
-dd2887[]={1601,1605,1610,0},
-dd2888[]={1576,1581,1610,0},
-dd2889[]={1587,1582,1610,0},
-dd2890[]={1606,1580,1610,0},
-dd2891[]={1589,1604,1746,0},
-dd2892[]={1602,1604,1746,0},
-dd2893[]={1575,1604,1604,1607,0},
-dd2894[]={1575,1603,1576,1585,0},
-dd2895[]={1605,1581,1605,1583,0},
-dd2896[]={1589,1604,1593,1605,0},
-dd2897[]={1585,1587,1608,1604,0},
-dd2898[]={1593,1604,1610,1607,0},
-dd2899[]={1608,1587,1604,1605,0},
-dd2900[]={1589,1604,1609,0},
-dd2901[]={1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605,0},
-dd2902[]={1580,1604,32,1580,1604,1575,1604,1607,0},
-dd2903[]={1585,1740,1575,1604,0},
-dd2904[]={44,0},
-dd2905[]={12289,0},
-dd2906[]={12290,0},
-dd2907[]={58,0},
-dd2908[]={33,0},
-dd2909[]={63,0},
-dd2910[]={12310,0},
-dd2911[]={12311,0},
-dd2912[]={8230,0},
-dd2913[]={8229,0},
-dd2914[]={8212,0},
-dd2915[]={8211,0},
-dd2916[]={95,0},
-dd2917[]={123,0},
-dd2918[]={125,0},
-dd2919[]={12308,0},
-dd2920[]={12309,0},
-dd2921[]={12304,0},
-dd2922[]={12305,0},
-dd2923[]={12298,0},
-dd2924[]={12299,0},
-dd2925[]={12300,0},
-dd2926[]={12301,0},
-dd2927[]={12302,0},
-dd2928[]={12303,0},
-dd2929[]={91,0},
-dd2930[]={93,0},
-dd2931[]={8254,0},
-dd2932[]={35,0},
-dd2933[]={38,0},
-dd2934[]={42,0},
-dd2935[]={45,0},
-dd2936[]={60,0},
-dd2937[]={62,0},
-dd2938[]={92,0},
-dd2939[]={36,0},
-dd2940[]={37,0},
-dd2941[]={64,0},
-dd2942[]={32,1611,0},
-dd2943[]={1600,1611,0},
-dd2944[]={32,1612,0},
-dd2945[]={32,1613,0},
-dd2946[]={32,1614,0},
-dd2947[]={1600,1614,0},
-dd2948[]={32,1615,0},
-dd2949[]={1600,1615,0},
-dd2950[]={32,1616,0},
-dd2951[]={1600,1616,0},
-dd2952[]={32,1617,0},
-dd2953[]={1600,1617,0},
-dd2954[]={32,1618,0},
-dd2955[]={1600,1618,0},
-dd2956[]={1569,0},
-dd2957[]={1570,0},
-dd2958[]={1571,0},
-dd2959[]={1572,0},
-dd2960[]={1573,0},
-dd2961[]={1574,0},
-dd2962[]={1575,0},
-dd2963[]={1576,0},
-dd2964[]={1577,0},
-dd2965[]={1578,0},
-dd2966[]={1579,0},
-dd2967[]={1580,0},
-dd2968[]={1581,0},
-dd2969[]={1582,0},
-dd2970[]={1583,0},
-dd2971[]={1584,0},
-dd2972[]={1585,0},
-dd2973[]={1586,0},
-dd2974[]={1587,0},
-dd2975[]={1588,0},
-dd2976[]={1589,0},
-dd2977[]={1590,0},
-dd2978[]={1591,0},
-dd2979[]={1592,0},
-dd2980[]={1593,0},
-dd2981[]={1594,0},
-dd2982[]={1601,0},
-dd2983[]={1602,0},
-dd2984[]={1603,0},
-dd2985[]={1604,0},
-dd2986[]={1605,0},
-dd2987[]={1606,0},
-dd2988[]={1607,0},
-dd2989[]={1608,0},
-dd2990[]={1610,0},
-dd2991[]={1604,1570,0},
-dd2992[]={1604,1571,0},
-dd2993[]={1604,1573,0},
-dd2994[]={1604,1575,0},
-dd2995[]={34,0},
-dd2996[]={39,0},
-dd2997[]={47,0},
-dd2998[]={94,0},
-dd2999[]={124,0},
-dd3000[]={126,0},
-dd3001[]={10629,0},
-dd3002[]={10630,0},
-dd3003[]={12539,0},
-dd3004[]={12449,0},
-dd3005[]={12451,0},
-dd3006[]={12453,0},
-dd3007[]={12455,0},
-dd3008[]={12457,0},
-dd3009[]={12515,0},
-dd3010[]={12517,0},
-dd3011[]={12519,0},
-dd3012[]={12483,0},
-dd3013[]={12540,0},
-dd3014[]={12531,0},
-dd3015[]={12441,0},
-dd3016[]={12442,0},
-dd3017[]={12644,0},
-dd3018[]={12593,0},
-dd3019[]={12594,0},
-dd3020[]={12595,0},
-dd3021[]={12596,0},
-dd3022[]={12597,0},
-dd3023[]={12598,0},
-dd3024[]={12599,0},
-dd3025[]={12600,0},
-dd3026[]={12601,0},
-dd3027[]={12602,0},
-dd3028[]={12603,0},
-dd3029[]={12604,0},
-dd3030[]={12605,0},
-dd3031[]={12606,0},
-dd3032[]={12607,0},
-dd3033[]={12608,0},
-dd3034[]={12609,0},
-dd3035[]={12610,0},
-dd3036[]={12611,0},
-dd3037[]={12612,0},
-dd3038[]={12613,0},
-dd3039[]={12614,0},
-dd3040[]={12615,0},
-dd3041[]={12616,0},
-dd3042[]={12617,0},
-dd3043[]={12618,0},
-dd3044[]={12619,0},
-dd3045[]={12620,0},
-dd3046[]={12621,0},
-dd3047[]={12622,0},
-dd3048[]={12623,0},
-dd3049[]={12624,0},
-dd3050[]={12625,0},
-dd3051[]={12626,0},
-dd3052[]={12627,0},
-dd3053[]={12628,0},
-dd3054[]={12629,0},
-dd3055[]={12630,0},
-dd3056[]={12631,0},
-dd3057[]={12632,0},
-dd3058[]={12633,0},
-dd3059[]={12634,0},
-dd3060[]={12635,0},
-dd3061[]={12636,0},
-dd3062[]={12637,0},
-dd3063[]={12638,0},
-dd3064[]={12639,0},
-dd3065[]={12640,0},
-dd3066[]={12641,0},
-dd3067[]={12642,0},
-dd3068[]={12643,0},
-dd3069[]={162,0},
-dd3070[]={163,0},
-dd3071[]={172,0},
-dd3072[]={175,0},
-dd3073[]={166,0},
-dd3074[]={165,0},
-dd3075[]={8361,0},
-dd3076[]={9474,0},
-dd3077[]={8592,0},
-dd3078[]={8593,0},
-dd3079[]={8594,0},
-dd3080[]={8595,0},
-dd3081[]={9632,0},
-dd3082[]={9675,0},
-dd3083[]={119127,119141,0},
-dd3084[]={119128,119141,0},
-dd3085[]={119135,119150,0},
-dd3086[]={119135,119151,0},
-dd3087[]={119135,119152,0},
-dd3088[]={119135,119153,0},
-dd3089[]={119135,119154,0},
-dd3090[]={119225,119141,0},
-dd3091[]={119226,119141,0},
-dd3092[]={119227,119150,0},
-dd3093[]={119228,119150,0},
-dd3094[]={119227,119151,0},
-dd3095[]={119228,119151,0},
-dd3096[]={305,0},
-dd3097[]={567,0},
-dd3098[]={913,0},
-dd3099[]={914,0},
-dd3100[]={916,0},
-dd3101[]={917,0},
-dd3102[]={918,0},
-dd3103[]={919,0},
-dd3104[]={921,0},
-dd3105[]={922,0},
-dd3106[]={923,0},
-dd3107[]={924,0},
-dd3108[]={925,0},
-dd3109[]={926,0},
-dd3110[]={927,0},
-dd3111[]={929,0},
-dd3112[]={1012,0},
-dd3113[]={932,0},
-dd3114[]={934,0},
-dd3115[]={935,0},
-dd3116[]={936,0},
-dd3117[]={8711,0},
-dd3118[]={945,0},
-dd3119[]={950,0},
-dd3120[]={951,0},
-dd3121[]={955,0},
-dd3122[]={957,0},
-dd3123[]={958,0},
-dd3124[]={959,0},
-dd3125[]={963,0},
-dd3126[]={964,0},
-dd3127[]={965,0},
-dd3128[]={968,0},
-dd3129[]={969,0},
-dd3130[]={8706,0},
-dd3131[]={1013,0},
-dd3132[]={977,0},
-dd3133[]={1008,0},
-dd3134[]={981,0},
-dd3135[]={1009,0},
-dd3136[]={982,0},
-dd3137[]={988,0},
-dd3138[]={989,0},
-dd3139[]={20029,0},
-dd3140[]={20024,0},
-dd3141[]={20033,0},
-dd3142[]={131362,0},
-dd3143[]={20320,0},
-dd3144[]={20411,0},
-dd3145[]={20482,0},
-dd3146[]={20602,0},
-dd3147[]={20633,0},
-dd3148[]={20687,0},
-dd3149[]={13470,0},
-dd3150[]={132666,0},
-dd3151[]={20820,0},
-dd3152[]={20836,0},
-dd3153[]={20855,0},
-dd3154[]={132380,0},
-dd3155[]={13497,0},
-dd3156[]={20839,0},
-dd3157[]={20877,0},
-dd3158[]={132427,0},
-dd3159[]={20887,0},
-dd3160[]={20900,0},
-dd3161[]={20172,0},
-dd3162[]={20908,0},
-dd3163[]={168415,0},
-dd3164[]={20995,0},
-dd3165[]={13535,0},
-dd3166[]={21051,0},
-dd3167[]={21062,0},
-dd3168[]={21106,0},
-dd3169[]={21111,0},
-dd3170[]={13589,0},
-dd3171[]={21253,0},
-dd3172[]={21254,0},
-dd3173[]={21321,0},
-dd3174[]={21338,0},
-dd3175[]={21363,0},
-dd3176[]={21373,0},
-dd3177[]={21375,0},
-dd3178[]={133676,0},
-dd3179[]={28784,0},
-dd3180[]={21450,0},
-dd3181[]={21471,0},
-dd3182[]={133987,0},
-dd3183[]={21483,0},
-dd3184[]={21489,0},
-dd3185[]={21510,0},
-dd3186[]={21662,0},
-dd3187[]={21560,0},
-dd3188[]={21576,0},
-dd3189[]={21608,0},
-dd3190[]={21666,0},
-dd3191[]={21750,0},
-dd3192[]={21776,0},
-dd3193[]={21843,0},
-dd3194[]={21859,0},
-dd3195[]={21892,0},
-dd3196[]={21931,0},
-dd3197[]={21939,0},
-dd3198[]={21954,0},
-dd3199[]={22294,0},
-dd3200[]={22295,0},
-dd3201[]={22097,0},
-dd3202[]={22132,0},
-dd3203[]={22766,0},
-dd3204[]={22478,0},
-dd3205[]={22516,0},
-dd3206[]={22541,0},
-dd3207[]={22411,0},
-dd3208[]={22578,0},
-dd3209[]={22577,0},
-dd3210[]={22700,0},
-dd3211[]={136420,0},
-dd3212[]={22770,0},
-dd3213[]={22775,0},
-dd3214[]={22790,0},
-dd3215[]={22810,0},
-dd3216[]={22818,0},
-dd3217[]={22882,0},
-dd3218[]={136872,0},
-dd3219[]={136938,0},
-dd3220[]={23020,0},
-dd3221[]={23067,0},
-dd3222[]={23079,0},
-dd3223[]={23000,0},
-dd3224[]={23142,0},
-dd3225[]={14062,0},
-dd3226[]={14076,0},
-dd3227[]={23304,0},
-dd3228[]={23358,0},
-dd3229[]={137672,0},
-dd3230[]={23491,0},
-dd3231[]={23512,0},
-dd3232[]={23539,0},
-dd3233[]={138008,0},
-dd3234[]={23551,0},
-dd3235[]={23558,0},
-dd3236[]={24403,0},
-dd3237[]={14209,0},
-dd3238[]={23648,0},
-dd3239[]={23744,0},
-dd3240[]={23693,0},
-dd3241[]={138724,0},
-dd3242[]={23875,0},
-dd3243[]={138726,0},
-dd3244[]={23918,0},
-dd3245[]={23915,0},
-dd3246[]={23932,0},
-dd3247[]={24033,0},
-dd3248[]={24034,0},
-dd3249[]={14383,0},
-dd3250[]={24061,0},
-dd3251[]={24104,0},
-dd3252[]={24125,0},
-dd3253[]={24169,0},
-dd3254[]={14434,0},
-dd3255[]={139651,0},
-dd3256[]={14460,0},
-dd3257[]={24240,0},
-dd3258[]={24243,0},
-dd3259[]={24246,0},
-dd3260[]={172946,0},
-dd3261[]={140081,0},
-dd3262[]={33281,0},
-dd3263[]={24354,0},
-dd3264[]={14535,0},
-dd3265[]={144056,0},
-dd3266[]={156122,0},
-dd3267[]={24418,0},
-dd3268[]={24427,0},
-dd3269[]={14563,0},
-dd3270[]={24474,0},
-dd3271[]={24525,0},
-dd3272[]={24535,0},
-dd3273[]={24569,0},
-dd3274[]={24705,0},
-dd3275[]={14650,0},
-dd3276[]={14620,0},
-dd3277[]={141012,0},
-dd3278[]={24775,0},
-dd3279[]={24904,0},
-dd3280[]={24908,0},
-dd3281[]={24954,0},
-dd3282[]={25010,0},
-dd3283[]={24996,0},
-dd3284[]={25007,0},
-dd3285[]={25054,0},
-dd3286[]={25104,0},
-dd3287[]={25115,0},
-dd3288[]={25181,0},
-dd3289[]={25265,0},
-dd3290[]={25300,0},
-dd3291[]={25424,0},
-dd3292[]={142092,0},
-dd3293[]={25405,0},
-dd3294[]={25340,0},
-dd3295[]={25448,0},
-dd3296[]={25475,0},
-dd3297[]={25572,0},
-dd3298[]={142321,0},
-dd3299[]={25634,0},
-dd3300[]={25541,0},
-dd3301[]={25513,0},
-dd3302[]={14894,0},
-dd3303[]={25705,0},
-dd3304[]={25726,0},
-dd3305[]={25757,0},
-dd3306[]={25719,0},
-dd3307[]={14956,0},
-dd3308[]={25964,0},
-dd3309[]={143370,0},
-dd3310[]={26083,0},
-dd3311[]={26360,0},
-dd3312[]={26185,0},
-dd3313[]={15129,0},
-dd3314[]={15112,0},
-dd3315[]={15076,0},
-dd3316[]={20882,0},
-dd3317[]={20885,0},
-dd3318[]={26368,0},
-dd3319[]={26268,0},
-dd3320[]={32941,0},
-dd3321[]={17369,0},
-dd3322[]={26401,0},
-dd3323[]={26462,0},
-dd3324[]={26451,0},
-dd3325[]={144323,0},
-dd3326[]={15177,0},
-dd3327[]={26618,0},
-dd3328[]={26501,0},
-dd3329[]={26706,0},
-dd3330[]={144493,0},
-dd3331[]={26766,0},
-dd3332[]={26655,0},
-dd3333[]={26900,0},
-dd3334[]={26946,0},
-dd3335[]={27043,0},
-dd3336[]={27114,0},
-dd3337[]={27304,0},
-dd3338[]={145059,0},
-dd3339[]={27355,0},
-dd3340[]={15384,0},
-dd3341[]={27425,0},
-dd3342[]={145575,0},
-dd3343[]={27476,0},
-dd3344[]={15438,0},
-dd3345[]={27506,0},
-dd3346[]={27551,0},
-dd3347[]={27579,0},
-dd3348[]={146061,0},
-dd3349[]={138507,0},
-dd3350[]={146170,0},
-dd3351[]={27726,0},
-dd3352[]={146620,0},
-dd3353[]={27839,0},
-dd3354[]={27853,0},
-dd3355[]={27751,0},
-dd3356[]={27926,0},
-dd3357[]={27966,0},
-dd3358[]={28009,0},
-dd3359[]={28024,0},
-dd3360[]={28037,0},
-dd3361[]={146718,0},
-dd3362[]={27956,0},
-dd3363[]={28207,0},
-dd3364[]={28270,0},
-dd3365[]={15667,0},
-dd3366[]={28359,0},
-dd3367[]={147153,0},
-dd3368[]={28153,0},
-dd3369[]={28526,0},
-dd3370[]={147294,0},
-dd3371[]={147342,0},
-dd3372[]={28614,0},
-dd3373[]={28729,0},
-dd3374[]={28699,0},
-dd3375[]={15766,0},
-dd3376[]={28746,0},
-dd3377[]={28797,0},
-dd3378[]={28791,0},
-dd3379[]={28845,0},
-dd3380[]={132389,0},
-dd3381[]={28997,0},
-dd3382[]={148067,0},
-dd3383[]={29084,0},
-dd3384[]={148395,0},
-dd3385[]={29224,0},
-dd3386[]={29264,0},
-dd3387[]={149000,0},
-dd3388[]={29312,0},
-dd3389[]={29333,0},
-dd3390[]={149301,0},
-dd3391[]={149524,0},
-dd3392[]={29562,0},
-dd3393[]={29579,0},
-dd3394[]={16044,0},
-dd3395[]={29605,0},
-dd3396[]={16056,0},
-dd3397[]={29767,0},
-dd3398[]={29788,0},
-dd3399[]={29829,0},
-dd3400[]={29898,0},
-dd3401[]={16155,0},
-dd3402[]={29988,0},
-dd3403[]={150582,0},
-dd3404[]={30014,0},
-dd3405[]={150674,0},
-dd3406[]={139679,0},
-dd3407[]={30224,0},
-dd3408[]={151457,0},
-dd3409[]={151480,0},
-dd3410[]={151620,0},
-dd3411[]={16380,0},
-dd3412[]={16392,0},
-dd3413[]={151795,0},
-dd3414[]={151794,0},
-dd3415[]={151833,0},
-dd3416[]={151859,0},
-dd3417[]={30494,0},
-dd3418[]={30495,0},
-dd3419[]={30603,0},
-dd3420[]={16454,0},
-dd3421[]={16534,0},
-dd3422[]={152605,0},
-dd3423[]={30798,0},
-dd3424[]={16611,0},
-dd3425[]={153126,0},
-dd3426[]={153242,0},
-dd3427[]={153285,0},
-dd3428[]={31211,0},
-dd3429[]={16687,0},
-dd3430[]={31306,0},
-dd3431[]={31311,0},
-dd3432[]={153980,0},
-dd3433[]={154279,0},
-dd3434[]={31470,0},
-dd3435[]={16898,0},
-dd3436[]={154539,0},
-dd3437[]={31686,0},
-dd3438[]={31689,0},
-dd3439[]={16935,0},
-dd3440[]={154752,0},
-dd3441[]={31954,0},
-dd3442[]={17056,0},
-dd3443[]={31976,0},
-dd3444[]={31971,0},
-dd3445[]={32000,0},
-dd3446[]={155526,0},
-dd3447[]={32099,0},
-dd3448[]={17153,0},
-dd3449[]={32199,0},
-dd3450[]={32258,0},
-dd3451[]={32325,0},
-dd3452[]={17204,0},
-dd3453[]={156200,0},
-dd3454[]={156231,0},
-dd3455[]={17241,0},
-dd3456[]={156377,0},
-dd3457[]={32634,0},
-dd3458[]={156478,0},
-dd3459[]={32661,0},
-dd3460[]={32762,0},
-dd3461[]={156890,0},
-dd3462[]={156963,0},
-dd3463[]={32864,0},
-dd3464[]={157096,0},
-dd3465[]={32880,0},
-dd3466[]={144223,0},
-dd3467[]={17365,0},
-dd3468[]={32946,0},
-dd3469[]={33027,0},
-dd3470[]={17419,0},
-dd3471[]={33086,0},
-dd3472[]={23221,0},
-dd3473[]={157607,0},
-dd3474[]={157621,0},
-dd3475[]={144275,0},
-dd3476[]={144284,0},
-dd3477[]={33284,0},
-dd3478[]={36766,0},
-dd3479[]={17515,0},
-dd3480[]={33425,0},
-dd3481[]={33419,0},
-dd3482[]={33437,0},
-dd3483[]={21171,0},
-dd3484[]={33457,0},
-dd3485[]={33459,0},
-dd3486[]={33469,0},
-dd3487[]={33510,0},
-dd3488[]={158524,0},
-dd3489[]={33565,0},
-dd3490[]={33635,0},
-dd3491[]={33709,0},
-dd3492[]={33571,0},
-dd3493[]={33725,0},
-dd3494[]={33767,0},
-dd3495[]={33619,0},
-dd3496[]={33738,0},
-dd3497[]={33740,0},
-dd3498[]={33756,0},
-dd3499[]={158774,0},
-dd3500[]={159083,0},
-dd3501[]={158933,0},
-dd3502[]={17707,0},
-dd3503[]={34033,0},
-dd3504[]={34035,0},
-dd3505[]={34070,0},
-dd3506[]={160714,0},
-dd3507[]={34148,0},
-dd3508[]={159532,0},
-dd3509[]={17757,0},
-dd3510[]={17761,0},
-dd3511[]={159665,0},
-dd3512[]={159954,0},
-dd3513[]={17771,0},
-dd3514[]={34384,0},
-dd3515[]={34407,0},
-dd3516[]={34409,0},
-dd3517[]={34473,0},
-dd3518[]={34440,0},
-dd3519[]={34574,0},
-dd3520[]={34530,0},
-dd3521[]={34600,0},
-dd3522[]={34667,0},
-dd3523[]={34694,0},
-dd3524[]={17879,0},
-dd3525[]={34785,0},
-dd3526[]={34817,0},
-dd3527[]={17913,0},
-dd3528[]={34912,0},
-dd3529[]={161383,0},
-dd3530[]={35031,0},
-dd3531[]={35038,0},
-dd3532[]={17973,0},
-dd3533[]={35066,0},
-dd3534[]={13499,0},
-dd3535[]={161966,0},
-dd3536[]={162150,0},
-dd3537[]={18110,0},
-dd3538[]={18119,0},
-dd3539[]={35488,0},
-dd3540[]={162984,0},
-dd3541[]={36011,0},
-dd3542[]={36033,0},
-dd3543[]={36123,0},
-dd3544[]={36215,0},
-dd3545[]={163631,0},
-dd3546[]={133124,0},
-dd3547[]={36299,0},
-dd3548[]={36284,0},
-dd3549[]={36336,0},
-dd3550[]={133342,0},
-dd3551[]={36564,0},
-dd3552[]={165330,0},
-dd3553[]={165357,0},
-dd3554[]={37012,0},
-dd3555[]={37105,0},
-dd3556[]={37137,0},
-dd3557[]={165678,0},
-dd3558[]={37147,0},
-dd3559[]={37432,0},
-dd3560[]={37591,0},
-dd3561[]={37592,0},
-dd3562[]={37500,0},
-dd3563[]={37881,0},
-dd3564[]={37909,0},
-dd3565[]={166906,0},
-dd3566[]={38283,0},
-dd3567[]={18837,0},
-dd3568[]={38327,0},
-dd3569[]={167287,0},
-dd3570[]={18918,0},
-dd3571[]={38595,0},
-dd3572[]={23986,0},
-dd3573[]={38691,0},
-dd3574[]={168261,0},
-dd3575[]={168474,0},
-dd3576[]={19054,0},
-dd3577[]={19062,0},
-dd3578[]={38880,0},
-dd3579[]={168970,0},
-dd3580[]={19122,0},
-dd3581[]={169110,0},
-dd3582[]={38953,0},
-dd3583[]={169398,0},
-dd3584[]={39138,0},
-dd3585[]={19251,0},
-dd3586[]={39209,0},
-dd3587[]={39335,0},
-dd3588[]={39362,0},
-dd3589[]={39422,0},
-dd3590[]={19406,0},
-dd3591[]={170800,0},
-dd3592[]={40000,0},
-dd3593[]={40189,0},
-dd3594[]={19662,0},
-dd3595[]={19693,0},
-dd3596[]={40295,0},
-dd3597[]={172238,0},
-dd3598[]={19704,0},
-dd3599[]={172293,0},
-dd3600[]={172558,0},
-dd3601[]={172689,0},
-dd3602[]={19798,0},
-dd3603[]={40702,0},
-dd3604[]={40709,0},
-dd3605[]={40719,0},
-dd3606[]={40726,0},
-dd3607[]={173568,0},
-dd3608[]={8814,0},
-dd3609[]={8800,0},
-dd3610[]={8815,0},
-dd3611[]={192,193,194,195,196,197,256,258,260,461,512,514,550,7680,7840,7842,0},
-dd3612[]={7682,7684,7686,0},
-dd3613[]={199,262,264,266,268,0},
-dd3614[]={270,7690,7692,7694,7696,7698,0},
-dd3615[]={200,201,202,203,274,276,278,280,282,516,518,552,7704,7706,7864,7866,7868,0},
-dd3616[]={7710,0},
-dd3617[]={284,286,288,290,486,500,7712,0},
-dd3618[]={292,542,7714,7716,7718,7720,7722,0},
-dd3619[]={204,205,206,207,296,298,300,302,304,463,520,522,7724,7880,7882,0},
-dd3620[]={308,0},
-dd3621[]={310,488,7728,7730,7732,0},
-dd3622[]={313,315,317,7734,7738,7740,0},
-dd3623[]={7742,7744,7746,0},
-dd3624[]={209,323,325,327,504,7748,7750,7752,7754,0},
-dd3625[]={210,211,212,213,214,332,334,336,416,465,490,524,526,558,7884,7886,0},
-dd3626[]={7764,7766,0},
-dd3627[]={340,342,344,528,530,7768,7770,7774,0},
-dd3628[]={346,348,350,352,536,7776,7778,0},
-dd3629[]={354,356,538,7786,7788,7790,7792,0},
-dd3630[]={217,218,219,220,360,362,364,366,368,370,431,467,532,534,7794,7796,7798,7908,7910,0},
-dd3631[]={7804,7806,0},
-dd3632[]={372,7808,7810,7812,7814,7816,0},
-dd3633[]={7818,7820,0},
-dd3634[]={221,374,376,562,7822,7922,7924,7926,7928,0},
-dd3635[]={377,379,381,7824,7826,7828,0},
-dd3636[]={224,225,226,227,228,229,257,259,261,462,513,515,551,7681,7841,7843,0},
-dd3637[]={7683,7685,7687,0},
-dd3638[]={231,263,265,267,269,0},
-dd3639[]={271,7691,7693,7695,7697,7699,0},
-dd3640[]={232,233,234,235,275,277,279,281,283,517,519,553,7705,7707,7865,7867,7869,0},
-dd3641[]={7711,0},
-dd3642[]={285,287,289,291,487,501,7713,0},
-dd3643[]={293,543,7715,7717,7719,7721,7723,7830,0},
-dd3644[]={236,237,238,239,297,299,301,303,464,521,523,7725,7881,7883,0},
-dd3645[]={309,496,0},
-dd3646[]={311,489,7729,7731,7733,0},
-dd3647[]={314,316,318,7735,7739,7741,0},
-dd3648[]={7743,7745,7747,0},
-dd3649[]={241,324,326,328,505,7749,7751,7753,7755,0},
-dd3650[]={242,243,244,245,246,333,335,337,417,466,491,525,527,559,7885,7887,0},
-dd3651[]={7765,7767,0},
-dd3652[]={341,343,345,529,531,7769,7771,7775,0},
-dd3653[]={347,349,351,353,537,7777,7779,0},
-dd3654[]={355,357,539,7787,7789,7791,7793,7831,0},
-dd3655[]={249,250,251,252,361,363,365,367,369,371,432,468,533,535,7795,7797,7799,7909,7911,0},
-dd3656[]={7805,7807,0},
-dd3657[]={373,7809,7811,7813,7815,7817,7832,0},
-dd3658[]={7819,7821,0},
-dd3659[]={253,255,375,563,7823,7833,7923,7925,7927,7929,0},
-dd3660[]={378,380,382,7825,7827,7829,0},
-dd3661[]={901,8129,8173,0},
-dd3662[]={7844,7846,7848,7850,0},
-dd3663[]={478,0},
-dd3664[]={506,0},
-dd3665[]={482,508,0},
-dd3666[]={7688,0},
-dd3667[]={7870,7872,7874,7876,0},
-dd3668[]={7726,0},
-dd3669[]={7888,7890,7892,7894,0},
-dd3670[]={556,7756,7758,0},
-dd3671[]={554,0},
-dd3672[]={510,0},
-dd3673[]={469,471,473,475,0},
-dd3674[]={7845,7847,7849,7851,0},
-dd3675[]={479,0},
-dd3676[]={507,0},
-dd3677[]={483,509,0},
-dd3678[]={7689,0},
-dd3679[]={7871,7873,7875,7877,0},
-dd3680[]={7727,0},
-dd3681[]={7889,7891,7893,7895,0},
-dd3682[]={557,7757,7759,0},
-dd3683[]={555,0},
-dd3684[]={511,0},
-dd3685[]={470,472,474,476,0},
-dd3686[]={7854,7856,7858,7860,0},
-dd3687[]={7855,7857,7859,7861,0},
-dd3688[]={7700,7702,0},
-dd3689[]={7701,7703,0},
-dd3690[]={7760,7762,0},
-dd3691[]={7761,7763,0},
-dd3692[]={7780,0},
-dd3693[]={7781,0},
-dd3694[]={7782,0},
-dd3695[]={7783,0},
-dd3696[]={7800,0},
-dd3697[]={7801,0},
-dd3698[]={7802,0},
-dd3699[]={7803,0},
-dd3700[]={7835,0},
-dd3701[]={7898,7900,7902,7904,7906,0},
-dd3702[]={7899,7901,7903,7905,7907,0},
-dd3703[]={7912,7914,7916,7918,7920,0},
-dd3704[]={7913,7915,7917,7919,7921,0},
-dd3705[]={494,0},
-dd3706[]={492,0},
-dd3707[]={493,0},
-dd3708[]={480,0},
-dd3709[]={481,0},
-dd3710[]={7708,0},
-dd3711[]={7709,0},
-dd3712[]={560,0},
-dd3713[]={561,0},
-dd3714[]={495,0},
-dd3715[]={902,7944,7945,8120,8121,8122,8124,0},
-dd3716[]={904,7960,7961,8136,0},
-dd3717[]={905,7976,7977,8138,8140,0},
-dd3718[]={906,938,7992,7993,8152,8153,8154,0},
-dd3719[]={908,8008,8009,8184,0},
-dd3720[]={8172,0},
-dd3721[]={910,939,8025,8168,8169,8170,0},
-dd3722[]={911,8040,8041,8186,8188,0},
-dd3723[]={8116,0},
-dd3724[]={8132,0},
-dd3725[]={940,7936,7937,8048,8112,8113,8115,8118,0},
-dd3726[]={941,7952,7953,8050,0},
-dd3727[]={942,7968,7969,8052,8131,8134,0},
-dd3728[]={943,970,7984,7985,8054,8144,8145,8150,0},
-dd3729[]={972,8000,8001,8056,0},
-dd3730[]={8164,8165,0},
-dd3731[]={971,973,8016,8017,8058,8160,8161,8166,0},
-dd3732[]={974,8032,8033,8060,8179,8182,0},
-dd3733[]={912,8146,8151,0},
-dd3734[]={944,8162,8167,0},
-dd3735[]={8180,0},
-dd3736[]={979,980,0},
-dd3737[]={1031,0},
-dd3738[]={1232,1234,0},
-dd3739[]={1027,0},
-dd3740[]={1024,1025,1238,0},
-dd3741[]={1217,1244,0},
-dd3742[]={1246,0},
-dd3743[]={1037,1049,1250,1252,0},
-dd3744[]={1036,0},
-dd3745[]={1254,0},
-dd3746[]={1038,1262,1264,1266,0},
-dd3747[]={1268,0},
-dd3748[]={1272,0},
-dd3749[]={1260,0},
-dd3750[]={1233,1235,0},
-dd3751[]={1107,0},
-dd3752[]={1104,1105,1239,0},
-dd3753[]={1218,1245,0},
-dd3754[]={1247,0},
-dd3755[]={1081,1117,1251,1253,0},
-dd3756[]={1116,0},
-dd3757[]={1255,0},
-dd3758[]={1118,1263,1265,1267,0},
-dd3759[]={1269,0},
-dd3760[]={1273,0},
-dd3761[]={1261,0},
-dd3762[]={1111,0},
-dd3763[]={1142,0},
-dd3764[]={1143,0},
-dd3765[]={1242,0},
-dd3766[]={1243,0},
-dd3767[]={1258,0},
-dd3768[]={1259,0},
-dd3769[]={1570,1571,1573,0},
-dd3770[]={1730,0},
-dd3771[]={2345,0},
-dd3772[]={2353,0},
-dd3773[]={2356,0},
-dd3774[]={2507,2508,0},
-dd3775[]={2888,2891,2892,0},
-dd3776[]={2964,0},
-dd3777[]={3018,3020,0},
-dd3778[]={3019,0},
-dd3779[]={3144,0},
-dd3780[]={3264,0},
-dd3781[]={3271,3272,3274,0},
-dd3782[]={3275,0},
-dd3783[]={3402,3404,0},
-dd3784[]={3403,0},
-dd3785[]={3546,3548,3550,0},
-dd3786[]={3549,0},
-dd3787[]={4134,0},
-dd3788[]={6918,0},
-dd3789[]={6920,0},
-dd3790[]={6922,0},
-dd3791[]={6924,0},
-dd3792[]={6926,0},
-dd3793[]={6930,0},
-dd3794[]={6971,0},
-dd3795[]={6973,0},
-dd3796[]={6976,0},
-dd3797[]={6977,0},
-dd3798[]={6979,0},
-dd3799[]={7736,0},
-dd3800[]={7737,0},
-dd3801[]={7772,0},
-dd3802[]={7773,0},
-dd3803[]={7784,0},
-dd3804[]={7785,0},
-dd3805[]={7852,7862,0},
-dd3806[]={7853,7863,0},
-dd3807[]={7878,0},
-dd3808[]={7879,0},
-dd3809[]={7896,0},
-dd3810[]={7897,0},
-dd3811[]={7938,7940,7942,8064,0},
-dd3812[]={7939,7941,7943,8065,0},
-dd3813[]={8066,0},
-dd3814[]={8067,0},
-dd3815[]={8068,0},
-dd3816[]={8069,0},
-dd3817[]={8070,0},
-dd3818[]={8071,0},
-dd3819[]={7946,7948,7950,8072,0},
-dd3820[]={7947,7949,7951,8073,0},
-dd3821[]={8074,0},
-dd3822[]={8075,0},
-dd3823[]={8076,0},
-dd3824[]={8077,0},
-dd3825[]={8078,0},
-dd3826[]={8079,0},
-dd3827[]={7954,7956,0},
-dd3828[]={7955,7957,0},
-dd3829[]={7962,7964,0},
-dd3830[]={7963,7965,0},
-dd3831[]={7970,7972,7974,8080,0},
-dd3832[]={7971,7973,7975,8081,0},
-dd3833[]={8082,0},
-dd3834[]={8083,0},
-dd3835[]={8084,0},
-dd3836[]={8085,0},
-dd3837[]={8086,0},
-dd3838[]={8087,0},
-dd3839[]={7978,7980,7982,8088,0},
-dd3840[]={7979,7981,7983,8089,0},
-dd3841[]={8090,0},
-dd3842[]={8091,0},
-dd3843[]={8092,0},
-dd3844[]={8093,0},
-dd3845[]={8094,0},
-dd3846[]={8095,0},
-dd3847[]={7986,7988,7990,0},
-dd3848[]={7987,7989,7991,0},
-dd3849[]={7994,7996,7998,0},
-dd3850[]={7995,7997,7999,0},
-dd3851[]={8002,8004,0},
-dd3852[]={8003,8005,0},
-dd3853[]={8010,8012,0},
-dd3854[]={8011,8013,0},
-dd3855[]={8018,8020,8022,0},
-dd3856[]={8019,8021,8023,0},
-dd3857[]={8027,8029,8031,0},
-dd3858[]={8034,8036,8038,8096,0},
-dd3859[]={8035,8037,8039,8097,0},
-dd3860[]={8098,0},
-dd3861[]={8099,0},
-dd3862[]={8100,0},
-dd3863[]={8101,0},
-dd3864[]={8102,0},
-dd3865[]={8103,0},
-dd3866[]={8042,8044,8046,8104,0},
-dd3867[]={8043,8045,8047,8105,0},
-dd3868[]={8106,0},
-dd3869[]={8107,0},
-dd3870[]={8108,0},
-dd3871[]={8109,0},
-dd3872[]={8110,0},
-dd3873[]={8111,0},
-dd3874[]={8114,0},
-dd3875[]={8130,0},
-dd3876[]={8178,0},
-dd3877[]={8119,0},
-dd3878[]={8141,8142,8143,0},
-dd3879[]={8135,0},
-dd3880[]={8183,0},
-dd3881[]={8157,8158,8159,0},
-dd3882[]={8602,0},
-dd3883[]={8603,0},
-dd3884[]={8622,0},
-dd3885[]={8653,0},
-dd3886[]={8655,0},
-dd3887[]={8654,0},
-dd3888[]={8708,0},
-dd3889[]={8713,0},
-dd3890[]={8716,0},
-dd3891[]={8740,0},
-dd3892[]={8742,0},
-dd3893[]={8769,0},
-dd3894[]={8772,0},
-dd3895[]={8775,0},
-dd3896[]={8777,0},
-dd3897[]={8813,0},
-dd3898[]={8802,0},
-dd3899[]={8816,0},
-dd3900[]={8817,0},
-dd3901[]={8820,0},
-dd3902[]={8821,0},
-dd3903[]={8824,0},
-dd3904[]={8825,0},
-dd3905[]={8832,0},
-dd3906[]={8833,0},
-dd3907[]={8928,0},
-dd3908[]={8929,0},
-dd3909[]={8836,0},
-dd3910[]={8837,0},
-dd3911[]={8840,0},
-dd3912[]={8841,0},
-dd3913[]={8930,0},
-dd3914[]={8931,0},
-dd3915[]={8876,0},
-dd3916[]={8877,0},
-dd3917[]={8878,0},
-dd3918[]={8879,0},
-dd3919[]={8938,0},
-dd3920[]={8939,0},
-dd3921[]={8940,0},
-dd3922[]={8941,0},
-dd3923[]={12436,0},
-dd3924[]={12364,0},
-dd3925[]={12366,0},
-dd3926[]={12368,0},
-dd3927[]={12370,0},
-dd3928[]={12372,0},
-dd3929[]={12374,0},
-dd3930[]={12376,0},
-dd3931[]={12378,0},
-dd3932[]={12380,0},
-dd3933[]={12382,0},
-dd3934[]={12384,0},
-dd3935[]={12386,0},
-dd3936[]={12389,0},
-dd3937[]={12391,0},
-dd3938[]={12393,0},
-dd3939[]={12400,12401,0},
-dd3940[]={12403,12404,0},
-dd3941[]={12406,12407,0},
-dd3942[]={12409,12410,0},
-dd3943[]={12412,12413,0},
-dd3944[]={12446,0},
-dd3945[]={12532,0},
-dd3946[]={12460,0},
-dd3947[]={12462,0},
-dd3948[]={12464,0},
-dd3949[]={12466,0},
-dd3950[]={12468,0},
-dd3951[]={12470,0},
-dd3952[]={12472,0},
-dd3953[]={12474,0},
-dd3954[]={12476,0},
-dd3955[]={12478,0},
-dd3956[]={12480,0},
-dd3957[]={12482,0},
-dd3958[]={12485,0},
-dd3959[]={12487,0},
-dd3960[]={12489,0},
-dd3961[]={12496,12497,0},
-dd3962[]={12499,12500,0},
-dd3963[]={12502,12503,0},
-dd3964[]={12505,12506,0},
-dd3965[]={12508,12509,0},
-dd3966[]={12535,0},
-dd3967[]={12536,0},
-dd3968[]={12537,0},
-dd3969[]={12538,0},
-dd3970[]={12542,0},
-dd3971[]={224,0},
-dd3972[]={225,0},
-dd3973[]={226,0},
-dd3974[]={227,0},
-dd3975[]={228,0},
-dd3976[]={229,0},
-dd3977[]={230,0},
-dd3978[]={231,0},
-dd3979[]={232,0},
-dd3980[]={233,0},
-dd3981[]={234,0},
-dd3982[]={235,0},
-dd3983[]={236,0},
-dd3984[]={237,0},
-dd3985[]={238,0},
-dd3986[]={239,0},
-dd3987[]={241,0},
-dd3988[]={242,0},
-dd3989[]={243,0},
-dd3990[]={244,0},
-dd3991[]={245,0},
-dd3992[]={246,0},
-dd3993[]={248,0},
-dd3994[]={249,0},
-dd3995[]={250,0},
-dd3996[]={251,0},
-dd3997[]={252,0},
-dd3998[]={253,0},
-dd3999[]={254,0},
-dd4000[]={115,115,0},
-dd4001[]={257,0},
-dd4002[]={259,0},
-dd4003[]={261,0},
-dd4004[]={263,0},
-dd4005[]={265,0},
-dd4006[]={267,0},
-dd4007[]={269,0},
-dd4008[]={271,0},
-dd4009[]={273,0},
-dd4010[]={275,0},
-dd4011[]={277,0},
-dd4012[]={279,0},
-dd4013[]={281,0},
-dd4014[]={283,0},
-dd4015[]={285,0},
-dd4016[]={287,0},
-dd4017[]={289,0},
-dd4018[]={291,0},
-dd4019[]={293,0},
-dd4020[]={297,0},
-dd4021[]={299,0},
-dd4022[]={301,0},
-dd4023[]={303,0},
-dd4024[]={105,775,0},
-dd4025[]={307,0},
-dd4026[]={309,0},
-dd4027[]={311,0},
-dd4028[]={314,0},
-dd4029[]={316,0},
-dd4030[]={318,0},
-dd4031[]={320,0},
-dd4032[]={322,0},
-dd4033[]={324,0},
-dd4034[]={326,0},
-dd4035[]={328,0},
-dd4036[]={333,0},
-dd4037[]={335,0},
-dd4038[]={337,0},
-dd4039[]={339,0},
-dd4040[]={341,0},
-dd4041[]={343,0},
-dd4042[]={345,0},
-dd4043[]={347,0},
-dd4044[]={349,0},
-dd4045[]={351,0},
-dd4046[]={353,0},
-dd4047[]={355,0},
-dd4048[]={357,0},
-dd4049[]={359,0},
-dd4050[]={361,0},
-dd4051[]={363,0},
-dd4052[]={365,0},
-dd4053[]={367,0},
-dd4054[]={369,0},
-dd4055[]={371,0},
-dd4056[]={373,0},
-dd4057[]={375,0},
-dd4058[]={255,0},
-dd4059[]={378,0},
-dd4060[]={380,0},
-dd4061[]={382,0},
-dd4062[]={595,0},
-dd4063[]={387,0},
-dd4064[]={389,0},
-dd4065[]={392,0},
-dd4066[]={598,0},
-dd4067[]={599,0},
-dd4068[]={396,0},
-dd4069[]={477,0},
-dd4070[]={402,0},
-dd4071[]={608,0},
-dd4072[]={409,0},
-dd4073[]={417,0},
-dd4074[]={419,0},
-dd4075[]={421,0},
-dd4076[]={640,0},
-dd4077[]={424,0},
-dd4078[]={429,0},
-dd4079[]={648,0},
-dd4080[]={432,0},
-dd4081[]={436,0},
-dd4082[]={438,0},
-dd4083[]={441,0},
-dd4084[]={445,0},
-dd4085[]={454,0},
-dd4086[]={457,0},
-dd4087[]={460,0},
-dd4088[]={462,0},
-dd4089[]={464,0},
-dd4090[]={466,0},
-dd4091[]={468,0},
-dd4092[]={470,0},
-dd4093[]={472,0},
-dd4094[]={474,0},
-dd4095[]={476,0},
-dd4096[]={483,0},
-dd4097[]={485,0},
-dd4098[]={487,0},
-dd4099[]={489,0},
-dd4100[]={491,0},
-dd4101[]={499,0},
-dd4102[]={501,0},
-dd4103[]={405,0},
-dd4104[]={447,0},
-dd4105[]={505,0},
-dd4106[]={509,0},
-dd4107[]={513,0},
-dd4108[]={515,0},
-dd4109[]={517,0},
-dd4110[]={519,0},
-dd4111[]={521,0},
-dd4112[]={523,0},
-dd4113[]={525,0},
-dd4114[]={527,0},
-dd4115[]={529,0},
-dd4116[]={531,0},
-dd4117[]={533,0},
-dd4118[]={535,0},
-dd4119[]={537,0},
-dd4120[]={539,0},
-dd4121[]={541,0},
-dd4122[]={543,0},
-dd4123[]={414,0},
-dd4124[]={547,0},
-dd4125[]={549,0},
-dd4126[]={551,0},
-dd4127[]={553,0},
-dd4128[]={557,0},
-dd4129[]={559,0},
-dd4130[]={563,0},
-dd4131[]={11365,0},
-dd4132[]={572,0},
-dd4133[]={410,0},
-dd4134[]={11366,0},
-dd4135[]={578,0},
-dd4136[]={384,0},
-dd4137[]={583,0},
-dd4138[]={585,0},
-dd4139[]={587,0},
-dd4140[]={589,0},
-dd4141[]={591,0},
-dd4142[]={881,0},
-dd4143[]={883,0},
-dd4144[]={887,0},
-dd4145[]={953,776,769,0},
-dd4146[]={970,0},
-dd4147[]={971,0},
-dd4148[]={965,776,769,0},
-dd4149[]={983,0},
-dd4150[]={985,0},
-dd4151[]={987,0},
-dd4152[]={991,0},
-dd4153[]={993,0},
-dd4154[]={995,0},
-dd4155[]={997,0},
-dd4156[]={999,0},
-dd4157[]={1001,0},
-dd4158[]={1003,0},
-dd4159[]={1005,0},
-dd4160[]={1007,0},
-dd4161[]={1016,0},
-dd4162[]={1010,0},
-dd4163[]={1019,0},
-dd4164[]={891,0},
-dd4165[]={892,0},
-dd4166[]={893,0},
-dd4167[]={1104,0},
-dd4168[]={1105,0},
-dd4169[]={1106,0},
-dd4170[]={1108,0},
-dd4171[]={1109,0},
-dd4172[]={1110,0},
-dd4173[]={1112,0},
-dd4174[]={1113,0},
-dd4175[]={1114,0},
-dd4176[]={1115,0},
-dd4177[]={1117,0},
-dd4178[]={1118,0},
-dd4179[]={1119,0},
-dd4180[]={1072,0},
-dd4181[]={1073,0},
-dd4182[]={1074,0},
-dd4183[]={1075,0},
-dd4184[]={1076,0},
-dd4185[]={1077,0},
-dd4186[]={1078,0},
-dd4187[]={1079,0},
-dd4188[]={1080,0},
-dd4189[]={1081,0},
-dd4190[]={1082,0},
-dd4191[]={1083,0},
-dd4192[]={1084,0},
-dd4193[]={1086,0},
-dd4194[]={1087,0},
-dd4195[]={1088,0},
-dd4196[]={1089,0},
-dd4197[]={1090,0},
-dd4198[]={1091,0},
-dd4199[]={1092,0},
-dd4200[]={1093,0},
-dd4201[]={1094,0},
-dd4202[]={1095,0},
-dd4203[]={1096,0},
-dd4204[]={1097,0},
-dd4205[]={1098,0},
-dd4206[]={1099,0},
-dd4207[]={1100,0},
-dd4208[]={1101,0},
-dd4209[]={1102,0},
-dd4210[]={1103,0},
-dd4211[]={1121,0},
-dd4212[]={1123,0},
-dd4213[]={1125,0},
-dd4214[]={1127,0},
-dd4215[]={1129,0},
-dd4216[]={1131,0},
-dd4217[]={1133,0},
-dd4218[]={1135,0},
-dd4219[]={1137,0},
-dd4220[]={1139,0},
-dd4221[]={1141,0},
-dd4222[]={1145,0},
-dd4223[]={1147,0},
-dd4224[]={1149,0},
-dd4225[]={1151,0},
-dd4226[]={1153,0},
-dd4227[]={1163,0},
-dd4228[]={1165,0},
-dd4229[]={1167,0},
-dd4230[]={1169,0},
-dd4231[]={1171,0},
-dd4232[]={1173,0},
-dd4233[]={1175,0},
-dd4234[]={1177,0},
-dd4235[]={1179,0},
-dd4236[]={1181,0},
-dd4237[]={1183,0},
-dd4238[]={1185,0},
-dd4239[]={1187,0},
-dd4240[]={1189,0},
-dd4241[]={1191,0},
-dd4242[]={1193,0},
-dd4243[]={1195,0},
-dd4244[]={1197,0},
-dd4245[]={1199,0},
-dd4246[]={1201,0},
-dd4247[]={1203,0},
-dd4248[]={1205,0},
-dd4249[]={1207,0},
-dd4250[]={1209,0},
-dd4251[]={1211,0},
-dd4252[]={1213,0},
-dd4253[]={1215,0},
-dd4254[]={1231,0},
-dd4255[]={1218,0},
-dd4256[]={1220,0},
-dd4257[]={1222,0},
-dd4258[]={1224,0},
-dd4259[]={1226,0},
-dd4260[]={1228,0},
-dd4261[]={1230,0},
-dd4262[]={1233,0},
-dd4263[]={1235,0},
-dd4264[]={1237,0},
-dd4265[]={1239,0},
-dd4266[]={1241,0},
-dd4267[]={1245,0},
-dd4268[]={1249,0},
-dd4269[]={1251,0},
-dd4270[]={1253,0},
-dd4271[]={1257,0},
-dd4272[]={1263,0},
-dd4273[]={1265,0},
-dd4274[]={1267,0},
-dd4275[]={1271,0},
-dd4276[]={1275,0},
-dd4277[]={1277,0},
-dd4278[]={1279,0},
-dd4279[]={1281,0},
-dd4280[]={1283,0},
-dd4281[]={1285,0},
-dd4282[]={1287,0},
-dd4283[]={1289,0},
-dd4284[]={1291,0},
-dd4285[]={1293,0},
-dd4286[]={1295,0},
-dd4287[]={1297,0},
-dd4288[]={1299,0},
-dd4289[]={1301,0},
-dd4290[]={1303,0},
-dd4291[]={1305,0},
-dd4292[]={1307,0},
-dd4293[]={1309,0},
-dd4294[]={1311,0},
-dd4295[]={1313,0},
-dd4296[]={1315,0},
-dd4297[]={1377,0},
-dd4298[]={1378,0},
-dd4299[]={1379,0},
-dd4300[]={1380,0},
-dd4301[]={1381,0},
-dd4302[]={1382,0},
-dd4303[]={1383,0},
-dd4304[]={1384,0},
-dd4305[]={1385,0},
-dd4306[]={1386,0},
-dd4307[]={1387,0},
-dd4308[]={1388,0},
-dd4309[]={1389,0},
-dd4310[]={1390,0},
-dd4311[]={1391,0},
-dd4312[]={1392,0},
-dd4313[]={1393,0},
-dd4314[]={1394,0},
-dd4315[]={1395,0},
-dd4316[]={1396,0},
-dd4317[]={1397,0},
-dd4318[]={1398,0},
-dd4319[]={1399,0},
-dd4320[]={1400,0},
-dd4321[]={1401,0},
-dd4322[]={1402,0},
-dd4323[]={1403,0},
-dd4324[]={1404,0},
-dd4325[]={1405,0},
-dd4326[]={1406,0},
-dd4327[]={1407,0},
-dd4328[]={1408,0},
-dd4329[]={1409,0},
-dd4330[]={1410,0},
-dd4331[]={1411,0},
-dd4332[]={1412,0},
-dd4333[]={1413,0},
-dd4334[]={1414,0},
-dd4335[]={11520,0},
-dd4336[]={11521,0},
-dd4337[]={11522,0},
-dd4338[]={11523,0},
-dd4339[]={11524,0},
-dd4340[]={11525,0},
-dd4341[]={11526,0},
-dd4342[]={11527,0},
-dd4343[]={11528,0},
-dd4344[]={11529,0},
-dd4345[]={11530,0},
-dd4346[]={11531,0},
-dd4347[]={11532,0},
-dd4348[]={11533,0},
-dd4349[]={11534,0},
-dd4350[]={11535,0},
-dd4351[]={11536,0},
-dd4352[]={11537,0},
-dd4353[]={11538,0},
-dd4354[]={11539,0},
-dd4355[]={11540,0},
-dd4356[]={11541,0},
-dd4357[]={11542,0},
-dd4358[]={11543,0},
-dd4359[]={11544,0},
-dd4360[]={11545,0},
-dd4361[]={11546,0},
-dd4362[]={11547,0},
-dd4363[]={11548,0},
-dd4364[]={11549,0},
-dd4365[]={11550,0},
-dd4366[]={11551,0},
-dd4367[]={11552,0},
-dd4368[]={11553,0},
-dd4369[]={11554,0},
-dd4370[]={11555,0},
-dd4371[]={11556,0},
-dd4372[]={11557,0},
-dd4373[]={7681,0},
-dd4374[]={7683,0},
-dd4375[]={7685,0},
-dd4376[]={7687,0},
-dd4377[]={7691,0},
-dd4378[]={7693,0},
-dd4379[]={7695,0},
-dd4380[]={7697,0},
-dd4381[]={7699,0},
-dd4382[]={7701,0},
-dd4383[]={7703,0},
-dd4384[]={7705,0},
-dd4385[]={7707,0},
-dd4386[]={7713,0},
-dd4387[]={7715,0},
-dd4388[]={7717,0},
-dd4389[]={7719,0},
-dd4390[]={7721,0},
-dd4391[]={7723,0},
-dd4392[]={7725,0},
-dd4393[]={7729,0},
-dd4394[]={7731,0},
-dd4395[]={7733,0},
-dd4396[]={7735,0},
-dd4397[]={7739,0},
-dd4398[]={7741,0},
-dd4399[]={7743,0},
-dd4400[]={7745,0},
-dd4401[]={7747,0},
-dd4402[]={7749,0},
-dd4403[]={7751,0},
-dd4404[]={7753,0},
-dd4405[]={7755,0},
-dd4406[]={7757,0},
-dd4407[]={7759,0},
-dd4408[]={7761,0},
-dd4409[]={7763,0},
-dd4410[]={7765,0},
-dd4411[]={7767,0},
-dd4412[]={7769,0},
-dd4413[]={7771,0},
-dd4414[]={7775,0},
-dd4415[]={7777,0},
-dd4416[]={7779,0},
-dd4417[]={7787,0},
-dd4418[]={7789,0},
-dd4419[]={7791,0},
-dd4420[]={7793,0},
-dd4421[]={7795,0},
-dd4422[]={7797,0},
-dd4423[]={7799,0},
-dd4424[]={7805,0},
-dd4425[]={7807,0},
-dd4426[]={7809,0},
-dd4427[]={7811,0},
-dd4428[]={7813,0},
-dd4429[]={7815,0},
-dd4430[]={7817,0},
-dd4431[]={7819,0},
-dd4432[]={7821,0},
-dd4433[]={7823,0},
-dd4434[]={7825,0},
-dd4435[]={7827,0},
-dd4436[]={7829,0},
-dd4437[]={7841,0},
-dd4438[]={7843,0},
-dd4439[]={7845,0},
-dd4440[]={7847,0},
-dd4441[]={7849,0},
-dd4442[]={7851,0},
-dd4443[]={7853,0},
-dd4444[]={7855,0},
-dd4445[]={7857,0},
-dd4446[]={7859,0},
-dd4447[]={7861,0},
-dd4448[]={7863,0},
-dd4449[]={7865,0},
-dd4450[]={7867,0},
-dd4451[]={7869,0},
-dd4452[]={7871,0},
-dd4453[]={7873,0},
-dd4454[]={7875,0},
-dd4455[]={7877,0},
-dd4456[]={7881,0},
-dd4457[]={7883,0},
-dd4458[]={7885,0},
-dd4459[]={7887,0},
-dd4460[]={7889,0},
-dd4461[]={7891,0},
-dd4462[]={7893,0},
-dd4463[]={7895,0},
-dd4464[]={7899,0},
-dd4465[]={7901,0},
-dd4466[]={7903,0},
-dd4467[]={7905,0},
-dd4468[]={7907,0},
-dd4469[]={7909,0},
-dd4470[]={7911,0},
-dd4471[]={7913,0},
-dd4472[]={7915,0},
-dd4473[]={7917,0},
-dd4474[]={7919,0},
-dd4475[]={7921,0},
-dd4476[]={7923,0},
-dd4477[]={7925,0},
-dd4478[]={7927,0},
-dd4479[]={7929,0},
-dd4480[]={7931,0},
-dd4481[]={7933,0},
-dd4482[]={7935,0},
-dd4483[]={7936,0},
-dd4484[]={7937,0},
-dd4485[]={7938,0},
-dd4486[]={7939,0},
-dd4487[]={7940,0},
-dd4488[]={7941,0},
-dd4489[]={7942,0},
-dd4490[]={7943,0},
-dd4491[]={7952,0},
-dd4492[]={7953,0},
-dd4493[]={7954,0},
-dd4494[]={7955,0},
-dd4495[]={7956,0},
-dd4496[]={7957,0},
-dd4497[]={7968,0},
-dd4498[]={7969,0},
-dd4499[]={7970,0},
-dd4500[]={7971,0},
-dd4501[]={7972,0},
-dd4502[]={7973,0},
-dd4503[]={7974,0},
-dd4504[]={7975,0},
-dd4505[]={7984,0},
-dd4506[]={7985,0},
-dd4507[]={7986,0},
-dd4508[]={7987,0},
-dd4509[]={7988,0},
-dd4510[]={7989,0},
-dd4511[]={7990,0},
-dd4512[]={7991,0},
-dd4513[]={8000,0},
-dd4514[]={8001,0},
-dd4515[]={8002,0},
-dd4516[]={8003,0},
-dd4517[]={8004,0},
-dd4518[]={8005,0},
-dd4519[]={965,787,768,0},
-dd4520[]={965,787,769,0},
-dd4521[]={965,787,834,0},
-dd4522[]={8017,0},
-dd4523[]={8019,0},
-dd4524[]={8021,0},
-dd4525[]={8023,0},
-dd4526[]={8032,0},
-dd4527[]={8033,0},
-dd4528[]={8034,0},
-dd4529[]={8035,0},
-dd4530[]={8036,0},
-dd4531[]={8037,0},
-dd4532[]={8038,0},
-dd4533[]={8039,0},
-dd4534[]={7936,953,0},
-dd4535[]={7937,953,0},
-dd4536[]={7938,953,0},
-dd4537[]={7939,953,0},
-dd4538[]={7940,953,0},
-dd4539[]={7941,953,0},
-dd4540[]={7942,953,0},
-dd4541[]={7943,953,0},
-dd4542[]={7968,953,0},
-dd4543[]={7969,953,0},
-dd4544[]={7970,953,0},
-dd4545[]={7971,953,0},
-dd4546[]={7972,953,0},
-dd4547[]={7973,953,0},
-dd4548[]={7974,953,0},
-dd4549[]={7975,953,0},
-dd4550[]={8032,953,0},
-dd4551[]={8033,953,0},
-dd4552[]={8034,953,0},
-dd4553[]={8035,953,0},
-dd4554[]={8036,953,0},
-dd4555[]={8037,953,0},
-dd4556[]={8038,953,0},
-dd4557[]={8039,953,0},
-dd4558[]={8048,953,0},
-dd4559[]={945,953,0},
-dd4560[]={940,953,0},
-dd4561[]={945,834,953,0},
-dd4562[]={8112,0},
-dd4563[]={8113,0},
-dd4564[]={8048,0},
-dd4565[]={8049,0},
-dd4566[]={8052,953,0},
-dd4567[]={951,953,0},
-dd4568[]={942,953,0},
-dd4569[]={951,834,953,0},
-dd4570[]={8050,0},
-dd4571[]={8051,0},
-dd4572[]={8052,0},
-dd4573[]={8053,0},
-dd4574[]={953,776,768,0},
-dd4575[]={953,776,834,0},
-dd4576[]={8144,0},
-dd4577[]={8145,0},
-dd4578[]={8054,0},
-dd4579[]={8055,0},
-dd4580[]={965,776,768,0},
-dd4581[]={965,776,834,0},
-dd4582[]={8160,0},
-dd4583[]={8161,0},
-dd4584[]={8058,0},
-dd4585[]={8059,0},
-dd4586[]={8165,0},
-dd4587[]={8060,953,0},
-dd4588[]={969,953,0},
-dd4589[]={974,953,0},
-dd4590[]={969,834,953,0},
-dd4591[]={8056,0},
-dd4592[]={8057,0},
-dd4593[]={8060,0},
-dd4594[]={8061,0},
-dd4595[]={8526,0},
-dd4596[]={8560,0},
-dd4597[]={8561,0},
-dd4598[]={8562,0},
-dd4599[]={8563,0},
-dd4600[]={8564,0},
-dd4601[]={8565,0},
-dd4602[]={8566,0},
-dd4603[]={8567,0},
-dd4604[]={8568,0},
-dd4605[]={8569,0},
-dd4606[]={8570,0},
-dd4607[]={8571,0},
-dd4608[]={8572,0},
-dd4609[]={8573,0},
-dd4610[]={8574,0},
-dd4611[]={8575,0},
-dd4612[]={8580,0},
-dd4613[]={9424,0},
-dd4614[]={9425,0},
-dd4615[]={9426,0},
-dd4616[]={9427,0},
-dd4617[]={9428,0},
-dd4618[]={9429,0},
-dd4619[]={9430,0},
-dd4620[]={9431,0},
-dd4621[]={9432,0},
-dd4622[]={9433,0},
-dd4623[]={9434,0},
-dd4624[]={9435,0},
-dd4625[]={9436,0},
-dd4626[]={9437,0},
-dd4627[]={9438,0},
-dd4628[]={9439,0},
-dd4629[]={9440,0},
-dd4630[]={9441,0},
-dd4631[]={9442,0},
-dd4632[]={9443,0},
-dd4633[]={9444,0},
-dd4634[]={9445,0},
-dd4635[]={9446,0},
-dd4636[]={9447,0},
-dd4637[]={9448,0},
-dd4638[]={9449,0},
-dd4639[]={11312,0},
-dd4640[]={11313,0},
-dd4641[]={11314,0},
-dd4642[]={11315,0},
-dd4643[]={11316,0},
-dd4644[]={11317,0},
-dd4645[]={11318,0},
-dd4646[]={11319,0},
-dd4647[]={11320,0},
-dd4648[]={11321,0},
-dd4649[]={11322,0},
-dd4650[]={11323,0},
-dd4651[]={11324,0},
-dd4652[]={11325,0},
-dd4653[]={11326,0},
-dd4654[]={11327,0},
-dd4655[]={11328,0},
-dd4656[]={11329,0},
-dd4657[]={11330,0},
-dd4658[]={11331,0},
-dd4659[]={11332,0},
-dd4660[]={11333,0},
-dd4661[]={11334,0},
-dd4662[]={11335,0},
-dd4663[]={11336,0},
-dd4664[]={11337,0},
-dd4665[]={11338,0},
-dd4666[]={11339,0},
-dd4667[]={11340,0},
-dd4668[]={11341,0},
-dd4669[]={11342,0},
-dd4670[]={11343,0},
-dd4671[]={11344,0},
-dd4672[]={11345,0},
-dd4673[]={11346,0},
-dd4674[]={11347,0},
-dd4675[]={11348,0},
-dd4676[]={11349,0},
-dd4677[]={11350,0},
-dd4678[]={11351,0},
-dd4679[]={11352,0},
-dd4680[]={11353,0},
-dd4681[]={11354,0},
-dd4682[]={11355,0},
-dd4683[]={11356,0},
-dd4684[]={11357,0},
-dd4685[]={11358,0},
-dd4686[]={11361,0},
-dd4687[]={619,0},
-dd4688[]={7549,0},
-dd4689[]={637,0},
-dd4690[]={11368,0},
-dd4691[]={11370,0},
-dd4692[]={11372,0},
-dd4693[]={11379,0},
-dd4694[]={11382,0},
-dd4695[]={11393,0},
-dd4696[]={11395,0},
-dd4697[]={11397,0},
-dd4698[]={11399,0},
-dd4699[]={11401,0},
-dd4700[]={11403,0},
-dd4701[]={11405,0},
-dd4702[]={11407,0},
-dd4703[]={11409,0},
-dd4704[]={11411,0},
-dd4705[]={11413,0},
-dd4706[]={11415,0},
-dd4707[]={11417,0},
-dd4708[]={11419,0},
-dd4709[]={11421,0},
-dd4710[]={11423,0},
-dd4711[]={11425,0},
-dd4712[]={11427,0},
-dd4713[]={11429,0},
-dd4714[]={11431,0},
-dd4715[]={11433,0},
-dd4716[]={11435,0},
-dd4717[]={11437,0},
-dd4718[]={11439,0},
-dd4719[]={11441,0},
-dd4720[]={11443,0},
-dd4721[]={11445,0},
-dd4722[]={11447,0},
-dd4723[]={11449,0},
-dd4724[]={11451,0},
-dd4725[]={11453,0},
-dd4726[]={11455,0},
-dd4727[]={11457,0},
-dd4728[]={11459,0},
-dd4729[]={11461,0},
-dd4730[]={11463,0},
-dd4731[]={11465,0},
-dd4732[]={11467,0},
-dd4733[]={11469,0},
-dd4734[]={11471,0},
-dd4735[]={11473,0},
-dd4736[]={11475,0},
-dd4737[]={11477,0},
-dd4738[]={11479,0},
-dd4739[]={11481,0},
-dd4740[]={11483,0},
-dd4741[]={11485,0},
-dd4742[]={11487,0},
-dd4743[]={11489,0},
-dd4744[]={11491,0},
-dd4745[]={42561,0},
-dd4746[]={42563,0},
-dd4747[]={42565,0},
-dd4748[]={42567,0},
-dd4749[]={42569,0},
-dd4750[]={42571,0},
-dd4751[]={42573,0},
-dd4752[]={42575,0},
-dd4753[]={42577,0},
-dd4754[]={42579,0},
-dd4755[]={42581,0},
-dd4756[]={42583,0},
-dd4757[]={42585,0},
-dd4758[]={42587,0},
-dd4759[]={42589,0},
-dd4760[]={42591,0},
-dd4761[]={42595,0},
-dd4762[]={42597,0},
-dd4763[]={42599,0},
-dd4764[]={42601,0},
-dd4765[]={42603,0},
-dd4766[]={42605,0},
-dd4767[]={42625,0},
-dd4768[]={42627,0},
-dd4769[]={42629,0},
-dd4770[]={42631,0},
-dd4771[]={42633,0},
-dd4772[]={42635,0},
-dd4773[]={42637,0},
-dd4774[]={42639,0},
-dd4775[]={42641,0},
-dd4776[]={42643,0},
-dd4777[]={42645,0},
-dd4778[]={42647,0},
-dd4779[]={42787,0},
-dd4780[]={42789,0},
-dd4781[]={42791,0},
-dd4782[]={42793,0},
-dd4783[]={42795,0},
-dd4784[]={42797,0},
-dd4785[]={42799,0},
-dd4786[]={42803,0},
-dd4787[]={42805,0},
-dd4788[]={42807,0},
-dd4789[]={42809,0},
-dd4790[]={42811,0},
-dd4791[]={42813,0},
-dd4792[]={42815,0},
-dd4793[]={42817,0},
-dd4794[]={42819,0},
-dd4795[]={42821,0},
-dd4796[]={42823,0},
-dd4797[]={42825,0},
-dd4798[]={42827,0},
-dd4799[]={42829,0},
-dd4800[]={42831,0},
-dd4801[]={42833,0},
-dd4802[]={42835,0},
-dd4803[]={42837,0},
-dd4804[]={42839,0},
-dd4805[]={42841,0},
-dd4806[]={42843,0},
-dd4807[]={42845,0},
-dd4808[]={42847,0},
-dd4809[]={42849,0},
-dd4810[]={42851,0},
-dd4811[]={42853,0},
-dd4812[]={42855,0},
-dd4813[]={42857,0},
-dd4814[]={42859,0},
-dd4815[]={42861,0},
-dd4816[]={42874,0},
-dd4817[]={42876,0},
-dd4818[]={7545,0},
-dd4819[]={42879,0},
-dd4820[]={42881,0},
-dd4821[]={42883,0},
-dd4822[]={42885,0},
-dd4823[]={42887,0},
-dd4824[]={42892,0},
-dd4825[]={65345,0},
-dd4826[]={65346,0},
-dd4827[]={65347,0},
-dd4828[]={65348,0},
-dd4829[]={65349,0},
-dd4830[]={65350,0},
-dd4831[]={65351,0},
-dd4832[]={65352,0},
-dd4833[]={65353,0},
-dd4834[]={65354,0},
-dd4835[]={65355,0},
-dd4836[]={65356,0},
-dd4837[]={65357,0},
-dd4838[]={65358,0},
-dd4839[]={65359,0},
-dd4840[]={65360,0},
-dd4841[]={65361,0},
-dd4842[]={65362,0},
-dd4843[]={65363,0},
-dd4844[]={65364,0},
-dd4845[]={65365,0},
-dd4846[]={65366,0},
-dd4847[]={65367,0},
-dd4848[]={65368,0},
-dd4849[]={65369,0},
-dd4850[]={65370,0},
-dd4851[]={66600,0},
-dd4852[]={66601,0},
-dd4853[]={66602,0},
-dd4854[]={66603,0},
-dd4855[]={66604,0},
-dd4856[]={66605,0},
-dd4857[]={66606,0},
-dd4858[]={66607,0},
-dd4859[]={66608,0},
-dd4860[]={66609,0},
-dd4861[]={66610,0},
-dd4862[]={66611,0},
-dd4863[]={66612,0},
-dd4864[]={66613,0},
-dd4865[]={66614,0},
-dd4866[]={66615,0},
-dd4867[]={66616,0},
-dd4868[]={66617,0},
-dd4869[]={66618,0},
-dd4870[]={66619,0},
-dd4871[]={66620,0},
-dd4872[]={66621,0},
-dd4873[]={66622,0},
-dd4874[]={66623,0},
-dd4875[]={66624,0},
-dd4876[]={66625,0},
-dd4877[]={66626,0},
-dd4878[]={66627,0},
-dd4879[]={66628,0},
-dd4880[]={66629,0},
-dd4881[]={66630,0},
-dd4882[]={66631,0},
-dd4883[]={66632,0},
-dd4884[]={66633,0},
-dd4885[]={66634,0},
-dd4886[]={66635,0},
-dd4887[]={66636,0},
-dd4888[]={66637,0},
-dd4889[]={66638,0},
-dd4890[]={66639,0};
+dd1110[]={49,8260,55,0},
+dd1111[]={49,8260,57,0},
+dd1112[]={49,8260,49,48,0},
+dd1113[]={49,8260,51,0},
+dd1114[]={50,8260,51,0},
+dd1115[]={49,8260,53,0},
+dd1116[]={50,8260,53,0},
+dd1117[]={51,8260,53,0},
+dd1118[]={52,8260,53,0},
+dd1119[]={49,8260,54,0},
+dd1120[]={53,8260,54,0},
+dd1121[]={49,8260,56,0},
+dd1122[]={51,8260,56,0},
+dd1123[]={53,8260,56,0},
+dd1124[]={55,8260,56,0},
+dd1125[]={49,8260,0},
+dd1126[]={73,73,0},
+dd1127[]={73,73,73,0},
+dd1128[]={73,86,0},
+dd1129[]={86,0},
+dd1130[]={86,73,0},
+dd1131[]={86,73,73,0},
+dd1132[]={86,73,73,73,0},
+dd1133[]={73,88,0},
+dd1134[]={88,0},
+dd1135[]={88,73,0},
+dd1136[]={88,73,73,0},
+dd1137[]={105,105,0},
+dd1138[]={105,105,105,0},
+dd1139[]={105,118,0},
+dd1140[]={118,105,0},
+dd1141[]={118,105,105,0},
+dd1142[]={118,105,105,105,0},
+dd1143[]={105,120,0},
+dd1144[]={120,105,0},
+dd1145[]={120,105,105,0},
+dd1146[]={48,8260,51,0},
+dd1147[]={8592,824,0},
+dd1148[]={8594,824,0},
+dd1149[]={8596,824,0},
+dd1150[]={8656,824,0},
+dd1151[]={8660,824,0},
+dd1152[]={8658,824,0},
+dd1153[]={8707,824,0},
+dd1154[]={8712,824,0},
+dd1155[]={8715,824,0},
+dd1156[]={8739,824,0},
+dd1157[]={8741,824,0},
+dd1158[]={8747,8747,0},
+dd1159[]={8747,8747,8747,0},
+dd1160[]={8750,8750,0},
+dd1161[]={8750,8750,8750,0},
+dd1162[]={8764,824,0},
+dd1163[]={8771,824,0},
+dd1164[]={8773,824,0},
+dd1165[]={8776,824,0},
+dd1166[]={61,824,0},
+dd1167[]={8801,824,0},
+dd1168[]={8781,824,0},
+dd1169[]={60,824,0},
+dd1170[]={62,824,0},
+dd1171[]={8804,824,0},
+dd1172[]={8805,824,0},
+dd1173[]={8818,824,0},
+dd1174[]={8819,824,0},
+dd1175[]={8822,824,0},
+dd1176[]={8823,824,0},
+dd1177[]={8826,824,0},
+dd1178[]={8827,824,0},
+dd1179[]={8834,824,0},
+dd1180[]={8835,824,0},
+dd1181[]={8838,824,0},
+dd1182[]={8839,824,0},
+dd1183[]={8866,824,0},
+dd1184[]={8872,824,0},
+dd1185[]={8873,824,0},
+dd1186[]={8875,824,0},
+dd1187[]={8828,824,0},
+dd1188[]={8829,824,0},
+dd1189[]={8849,824,0},
+dd1190[]={8850,824,0},
+dd1191[]={8882,824,0},
+dd1192[]={8883,824,0},
+dd1193[]={8884,824,0},
+dd1194[]={8885,824,0},
+dd1195[]={12296,0},
+dd1196[]={12297,0},
+dd1197[]={49,48,0},
+dd1198[]={49,49,0},
+dd1199[]={49,50,0},
+dd1200[]={49,51,0},
+dd1201[]={49,52,0},
+dd1202[]={49,53,0},
+dd1203[]={49,54,0},
+dd1204[]={49,55,0},
+dd1205[]={49,56,0},
+dd1206[]={49,57,0},
+dd1207[]={50,48,0},
+dd1208[]={40,49,41,0},
+dd1209[]={40,50,41,0},
+dd1210[]={40,51,41,0},
+dd1211[]={40,52,41,0},
+dd1212[]={40,53,41,0},
+dd1213[]={40,54,41,0},
+dd1214[]={40,55,41,0},
+dd1215[]={40,56,41,0},
+dd1216[]={40,57,41,0},
+dd1217[]={40,49,48,41,0},
+dd1218[]={40,49,49,41,0},
+dd1219[]={40,49,50,41,0},
+dd1220[]={40,49,51,41,0},
+dd1221[]={40,49,52,41,0},
+dd1222[]={40,49,53,41,0},
+dd1223[]={40,49,54,41,0},
+dd1224[]={40,49,55,41,0},
+dd1225[]={40,49,56,41,0},
+dd1226[]={40,49,57,41,0},
+dd1227[]={40,50,48,41,0},
+dd1228[]={49,46,0},
+dd1229[]={50,46,0},
+dd1230[]={51,46,0},
+dd1231[]={52,46,0},
+dd1232[]={53,46,0},
+dd1233[]={54,46,0},
+dd1234[]={55,46,0},
+dd1235[]={56,46,0},
+dd1236[]={57,46,0},
+dd1237[]={49,48,46,0},
+dd1238[]={49,49,46,0},
+dd1239[]={49,50,46,0},
+dd1240[]={49,51,46,0},
+dd1241[]={49,52,46,0},
+dd1242[]={49,53,46,0},
+dd1243[]={49,54,46,0},
+dd1244[]={49,55,46,0},
+dd1245[]={49,56,46,0},
+dd1246[]={49,57,46,0},
+dd1247[]={50,48,46,0},
+dd1248[]={40,97,41,0},
+dd1249[]={40,98,41,0},
+dd1250[]={40,99,41,0},
+dd1251[]={40,100,41,0},
+dd1252[]={40,101,41,0},
+dd1253[]={40,102,41,0},
+dd1254[]={40,103,41,0},
+dd1255[]={40,104,41,0},
+dd1256[]={40,105,41,0},
+dd1257[]={40,106,41,0},
+dd1258[]={40,107,41,0},
+dd1259[]={40,108,41,0},
+dd1260[]={40,109,41,0},
+dd1261[]={40,110,41,0},
+dd1262[]={40,111,41,0},
+dd1263[]={40,112,41,0},
+dd1264[]={40,113,41,0},
+dd1265[]={40,114,41,0},
+dd1266[]={40,115,41,0},
+dd1267[]={40,116,41,0},
+dd1268[]={40,117,41,0},
+dd1269[]={40,118,41,0},
+dd1270[]={40,119,41,0},
+dd1271[]={40,120,41,0},
+dd1272[]={40,121,41,0},
+dd1273[]={40,122,41,0},
+dd1274[]={83,0},
+dd1275[]={89,0},
+dd1276[]={113,0},
+dd1277[]={8747,8747,8747,8747,0},
+dd1278[]={58,58,61,0},
+dd1279[]={61,61,0},
+dd1280[]={61,61,61,0},
+dd1281[]={10973,824,0},
+dd1282[]={11617,0},
+dd1283[]={27597,0},
+dd1284[]={40863,0},
+dd1285[]={19968,0},
+dd1286[]={20008,0},
+dd1287[]={20022,0},
+dd1288[]={20031,0},
+dd1289[]={20057,0},
+dd1290[]={20101,0},
+dd1291[]={20108,0},
+dd1292[]={20128,0},
+dd1293[]={20154,0},
+dd1294[]={20799,0},
+dd1295[]={20837,0},
+dd1296[]={20843,0},
+dd1297[]={20866,0},
+dd1298[]={20886,0},
+dd1299[]={20907,0},
+dd1300[]={20960,0},
+dd1301[]={20981,0},
+dd1302[]={20992,0},
+dd1303[]={21147,0},
+dd1304[]={21241,0},
+dd1305[]={21269,0},
+dd1306[]={21274,0},
+dd1307[]={21304,0},
+dd1308[]={21313,0},
+dd1309[]={21340,0},
+dd1310[]={21353,0},
+dd1311[]={21378,0},
+dd1312[]={21430,0},
+dd1313[]={21448,0},
+dd1314[]={21475,0},
+dd1315[]={22231,0},
+dd1316[]={22303,0},
+dd1317[]={22763,0},
+dd1318[]={22786,0},
+dd1319[]={22794,0},
+dd1320[]={22805,0},
+dd1321[]={22823,0},
+dd1322[]={22899,0},
+dd1323[]={23376,0},
+dd1324[]={23424,0},
+dd1325[]={23544,0},
+dd1326[]={23567,0},
+dd1327[]={23586,0},
+dd1328[]={23608,0},
+dd1329[]={23662,0},
+dd1330[]={23665,0},
+dd1331[]={24027,0},
+dd1332[]={24037,0},
+dd1333[]={24049,0},
+dd1334[]={24062,0},
+dd1335[]={24178,0},
+dd1336[]={24186,0},
+dd1337[]={24191,0},
+dd1338[]={24308,0},
+dd1339[]={24318,0},
+dd1340[]={24331,0},
+dd1341[]={24339,0},
+dd1342[]={24400,0},
+dd1343[]={24417,0},
+dd1344[]={24435,0},
+dd1345[]={24515,0},
+dd1346[]={25096,0},
+dd1347[]={25142,0},
+dd1348[]={25163,0},
+dd1349[]={25903,0},
+dd1350[]={25908,0},
+dd1351[]={25991,0},
+dd1352[]={26007,0},
+dd1353[]={26020,0},
+dd1354[]={26041,0},
+dd1355[]={26080,0},
+dd1356[]={26085,0},
+dd1357[]={26352,0},
+dd1358[]={26376,0},
+dd1359[]={26408,0},
+dd1360[]={27424,0},
+dd1361[]={27490,0},
+dd1362[]={27513,0},
+dd1363[]={27571,0},
+dd1364[]={27595,0},
+dd1365[]={27604,0},
+dd1366[]={27611,0},
+dd1367[]={27663,0},
+dd1368[]={27668,0},
+dd1369[]={27700,0},
+dd1370[]={28779,0},
+dd1371[]={29226,0},
+dd1372[]={29238,0},
+dd1373[]={29243,0},
+dd1374[]={29247,0},
+dd1375[]={29255,0},
+dd1376[]={29273,0},
+dd1377[]={29275,0},
+dd1378[]={29356,0},
+dd1379[]={29572,0},
+dd1380[]={29577,0},
+dd1381[]={29916,0},
+dd1382[]={29926,0},
+dd1383[]={29976,0},
+dd1384[]={29983,0},
+dd1385[]={29992,0},
+dd1386[]={30000,0},
+dd1387[]={30091,0},
+dd1388[]={30098,0},
+dd1389[]={30326,0},
+dd1390[]={30333,0},
+dd1391[]={30382,0},
+dd1392[]={30399,0},
+dd1393[]={30446,0},
+dd1394[]={30683,0},
+dd1395[]={30690,0},
+dd1396[]={30707,0},
+dd1397[]={31034,0},
+dd1398[]={31160,0},
+dd1399[]={31166,0},
+dd1400[]={31348,0},
+dd1401[]={31435,0},
+dd1402[]={31481,0},
+dd1403[]={31859,0},
+dd1404[]={31992,0},
+dd1405[]={32566,0},
+dd1406[]={32593,0},
+dd1407[]={32650,0},
+dd1408[]={32701,0},
+dd1409[]={32769,0},
+dd1410[]={32780,0},
+dd1411[]={32786,0},
+dd1412[]={32819,0},
+dd1413[]={32895,0},
+dd1414[]={32905,0},
+dd1415[]={33251,0},
+dd1416[]={33258,0},
+dd1417[]={33267,0},
+dd1418[]={33276,0},
+dd1419[]={33292,0},
+dd1420[]={33307,0},
+dd1421[]={33311,0},
+dd1422[]={33390,0},
+dd1423[]={33394,0},
+dd1424[]={33400,0},
+dd1425[]={34381,0},
+dd1426[]={34411,0},
+dd1427[]={34880,0},
+dd1428[]={34892,0},
+dd1429[]={34915,0},
+dd1430[]={35198,0},
+dd1431[]={35211,0},
+dd1432[]={35282,0},
+dd1433[]={35328,0},
+dd1434[]={35895,0},
+dd1435[]={35910,0},
+dd1436[]={35925,0},
+dd1437[]={35960,0},
+dd1438[]={35997,0},
+dd1439[]={36196,0},
+dd1440[]={36208,0},
+dd1441[]={36275,0},
+dd1442[]={36523,0},
+dd1443[]={36554,0},
+dd1444[]={36763,0},
+dd1445[]={36784,0},
+dd1446[]={36789,0},
+dd1447[]={37009,0},
+dd1448[]={37193,0},
+dd1449[]={37318,0},
+dd1450[]={37324,0},
+dd1451[]={37329,0},
+dd1452[]={38263,0},
+dd1453[]={38272,0},
+dd1454[]={38428,0},
+dd1455[]={38582,0},
+dd1456[]={38585,0},
+dd1457[]={38632,0},
+dd1458[]={38737,0},
+dd1459[]={38750,0},
+dd1460[]={38754,0},
+dd1461[]={38761,0},
+dd1462[]={38859,0},
+dd1463[]={38893,0},
+dd1464[]={38899,0},
+dd1465[]={38913,0},
+dd1466[]={39080,0},
+dd1467[]={39131,0},
+dd1468[]={39135,0},
+dd1469[]={39318,0},
+dd1470[]={39321,0},
+dd1471[]={39340,0},
+dd1472[]={39592,0},
+dd1473[]={39640,0},
+dd1474[]={39647,0},
+dd1475[]={39717,0},
+dd1476[]={39727,0},
+dd1477[]={39730,0},
+dd1478[]={39740,0},
+dd1479[]={39770,0},
+dd1480[]={40165,0},
+dd1481[]={40565,0},
+dd1482[]={40575,0},
+dd1483[]={40613,0},
+dd1484[]={40635,0},
+dd1485[]={40643,0},
+dd1486[]={40653,0},
+dd1487[]={40657,0},
+dd1488[]={40697,0},
+dd1489[]={40701,0},
+dd1490[]={40718,0},
+dd1491[]={40723,0},
+dd1492[]={40736,0},
+dd1493[]={40763,0},
+dd1494[]={40778,0},
+dd1495[]={40786,0},
+dd1496[]={40845,0},
+dd1497[]={40860,0},
+dd1498[]={40864,0},
+dd1499[]={12306,0},
+dd1500[]={21316,0},
+dd1501[]={21317,0},
+dd1502[]={12363,12441,0},
+dd1503[]={12365,12441,0},
+dd1504[]={12367,12441,0},
+dd1505[]={12369,12441,0},
+dd1506[]={12371,12441,0},
+dd1507[]={12373,12441,0},
+dd1508[]={12375,12441,0},
+dd1509[]={12377,12441,0},
+dd1510[]={12379,12441,0},
+dd1511[]={12381,12441,0},
+dd1512[]={12383,12441,0},
+dd1513[]={12385,12441,0},
+dd1514[]={12388,12441,0},
+dd1515[]={12390,12441,0},
+dd1516[]={12392,12441,0},
+dd1517[]={12399,12441,0},
+dd1518[]={12399,12442,0},
+dd1519[]={12402,12441,0},
+dd1520[]={12402,12442,0},
+dd1521[]={12405,12441,0},
+dd1522[]={12405,12442,0},
+dd1523[]={12408,12441,0},
+dd1524[]={12408,12442,0},
+dd1525[]={12411,12441,0},
+dd1526[]={12411,12442,0},
+dd1527[]={12358,12441,0},
+dd1528[]={32,12441,0},
+dd1529[]={32,12442,0},
+dd1530[]={12445,12441,0},
+dd1531[]={12424,12426,0},
+dd1532[]={12459,12441,0},
+dd1533[]={12461,12441,0},
+dd1534[]={12463,12441,0},
+dd1535[]={12465,12441,0},
+dd1536[]={12467,12441,0},
+dd1537[]={12469,12441,0},
+dd1538[]={12471,12441,0},
+dd1539[]={12473,12441,0},
+dd1540[]={12475,12441,0},
+dd1541[]={12477,12441,0},
+dd1542[]={12479,12441,0},
+dd1543[]={12481,12441,0},
+dd1544[]={12484,12441,0},
+dd1545[]={12486,12441,0},
+dd1546[]={12488,12441,0},
+dd1547[]={12495,12441,0},
+dd1548[]={12495,12442,0},
+dd1549[]={12498,12441,0},
+dd1550[]={12498,12442,0},
+dd1551[]={12501,12441,0},
+dd1552[]={12501,12442,0},
+dd1553[]={12504,12441,0},
+dd1554[]={12504,12442,0},
+dd1555[]={12507,12441,0},
+dd1556[]={12507,12442,0},
+dd1557[]={12454,12441,0},
+dd1558[]={12527,12441,0},
+dd1559[]={12528,12441,0},
+dd1560[]={12529,12441,0},
+dd1561[]={12530,12441,0},
+dd1562[]={12541,12441,0},
+dd1563[]={12467,12488,0},
+dd1564[]={4352,0},
+dd1565[]={4353,0},
+dd1566[]={4522,0},
+dd1567[]={4354,0},
+dd1568[]={4524,0},
+dd1569[]={4525,0},
+dd1570[]={4355,0},
+dd1571[]={4356,0},
+dd1572[]={4357,0},
+dd1573[]={4528,0},
+dd1574[]={4529,0},
+dd1575[]={4530,0},
+dd1576[]={4531,0},
+dd1577[]={4532,0},
+dd1578[]={4533,0},
+dd1579[]={4378,0},
+dd1580[]={4358,0},
+dd1581[]={4359,0},
+dd1582[]={4360,0},
+dd1583[]={4385,0},
+dd1584[]={4361,0},
+dd1585[]={4362,0},
+dd1586[]={4363,0},
+dd1587[]={4364,0},
+dd1588[]={4365,0},
+dd1589[]={4366,0},
+dd1590[]={4367,0},
+dd1591[]={4368,0},
+dd1592[]={4369,0},
+dd1593[]={4370,0},
+dd1594[]={4449,0},
+dd1595[]={4450,0},
+dd1596[]={4451,0},
+dd1597[]={4452,0},
+dd1598[]={4453,0},
+dd1599[]={4454,0},
+dd1600[]={4455,0},
+dd1601[]={4456,0},
+dd1602[]={4457,0},
+dd1603[]={4458,0},
+dd1604[]={4459,0},
+dd1605[]={4460,0},
+dd1606[]={4461,0},
+dd1607[]={4462,0},
+dd1608[]={4463,0},
+dd1609[]={4464,0},
+dd1610[]={4465,0},
+dd1611[]={4466,0},
+dd1612[]={4467,0},
+dd1613[]={4468,0},
+dd1614[]={4469,0},
+dd1615[]={4448,0},
+dd1616[]={4372,0},
+dd1617[]={4373,0},
+dd1618[]={4551,0},
+dd1619[]={4552,0},
+dd1620[]={4556,0},
+dd1621[]={4558,0},
+dd1622[]={4563,0},
+dd1623[]={4567,0},
+dd1624[]={4569,0},
+dd1625[]={4380,0},
+dd1626[]={4573,0},
+dd1627[]={4575,0},
+dd1628[]={4381,0},
+dd1629[]={4382,0},
+dd1630[]={4384,0},
+dd1631[]={4386,0},
+dd1632[]={4387,0},
+dd1633[]={4391,0},
+dd1634[]={4393,0},
+dd1635[]={4395,0},
+dd1636[]={4396,0},
+dd1637[]={4397,0},
+dd1638[]={4398,0},
+dd1639[]={4399,0},
+dd1640[]={4402,0},
+dd1641[]={4406,0},
+dd1642[]={4416,0},
+dd1643[]={4423,0},
+dd1644[]={4428,0},
+dd1645[]={4593,0},
+dd1646[]={4594,0},
+dd1647[]={4439,0},
+dd1648[]={4440,0},
+dd1649[]={4441,0},
+dd1650[]={4484,0},
+dd1651[]={4485,0},
+dd1652[]={4488,0},
+dd1653[]={4497,0},
+dd1654[]={4498,0},
+dd1655[]={4500,0},
+dd1656[]={4510,0},
+dd1657[]={4513,0},
+dd1658[]={19977,0},
+dd1659[]={22235,0},
+dd1660[]={19978,0},
+dd1661[]={20013,0},
+dd1662[]={19979,0},
+dd1663[]={30002,0},
+dd1664[]={19993,0},
+dd1665[]={19969,0},
+dd1666[]={22825,0},
+dd1667[]={22320,0},
+dd1668[]={40,4352,41,0},
+dd1669[]={40,4354,41,0},
+dd1670[]={40,4355,41,0},
+dd1671[]={40,4357,41,0},
+dd1672[]={40,4358,41,0},
+dd1673[]={40,4359,41,0},
+dd1674[]={40,4361,41,0},
+dd1675[]={40,4363,41,0},
+dd1676[]={40,4364,41,0},
+dd1677[]={40,4366,41,0},
+dd1678[]={40,4367,41,0},
+dd1679[]={40,4368,41,0},
+dd1680[]={40,4369,41,0},
+dd1681[]={40,4370,41,0},
+dd1682[]={40,4352,4449,41,0},
+dd1683[]={40,4354,4449,41,0},
+dd1684[]={40,4355,4449,41,0},
+dd1685[]={40,4357,4449,41,0},
+dd1686[]={40,4358,4449,41,0},
+dd1687[]={40,4359,4449,41,0},
+dd1688[]={40,4361,4449,41,0},
+dd1689[]={40,4363,4449,41,0},
+dd1690[]={40,4364,4449,41,0},
+dd1691[]={40,4366,4449,41,0},
+dd1692[]={40,4367,4449,41,0},
+dd1693[]={40,4368,4449,41,0},
+dd1694[]={40,4369,4449,41,0},
+dd1695[]={40,4370,4449,41,0},
+dd1696[]={40,4364,4462,41,0},
+dd1697[]={40,4363,4457,4364,4453,4523,41,0},
+dd1698[]={40,4363,4457,4370,4462,41,0},
+dd1699[]={40,19968,41,0},
+dd1700[]={40,20108,41,0},
+dd1701[]={40,19977,41,0},
+dd1702[]={40,22235,41,0},
+dd1703[]={40,20116,41,0},
+dd1704[]={40,20845,41,0},
+dd1705[]={40,19971,41,0},
+dd1706[]={40,20843,41,0},
+dd1707[]={40,20061,41,0},
+dd1708[]={40,21313,41,0},
+dd1709[]={40,26376,41,0},
+dd1710[]={40,28779,41,0},
+dd1711[]={40,27700,41,0},
+dd1712[]={40,26408,41,0},
+dd1713[]={40,37329,41,0},
+dd1714[]={40,22303,41,0},
+dd1715[]={40,26085,41,0},
+dd1716[]={40,26666,41,0},
+dd1717[]={40,26377,41,0},
+dd1718[]={40,31038,41,0},
+dd1719[]={40,21517,41,0},
+dd1720[]={40,29305,41,0},
+dd1721[]={40,36001,41,0},
+dd1722[]={40,31069,41,0},
+dd1723[]={40,21172,41,0},
+dd1724[]={40,20195,41,0},
+dd1725[]={40,21628,41,0},
+dd1726[]={40,23398,41,0},
+dd1727[]={40,30435,41,0},
+dd1728[]={40,20225,41,0},
+dd1729[]={40,36039,41,0},
+dd1730[]={40,21332,41,0},
+dd1731[]={40,31085,41,0},
+dd1732[]={40,20241,41,0},
+dd1733[]={40,33258,41,0},
+dd1734[]={40,33267,41,0},
+dd1735[]={21839,0},
+dd1736[]={24188,0},
+dd1737[]={31631,0},
+dd1738[]={80,84,69,0},
+dd1739[]={50,49,0},
+dd1740[]={50,50,0},
+dd1741[]={50,51,0},
+dd1742[]={50,52,0},
+dd1743[]={50,53,0},
+dd1744[]={50,54,0},
+dd1745[]={50,55,0},
+dd1746[]={50,56,0},
+dd1747[]={50,57,0},
+dd1748[]={51,48,0},
+dd1749[]={51,49,0},
+dd1750[]={51,50,0},
+dd1751[]={51,51,0},
+dd1752[]={51,52,0},
+dd1753[]={51,53,0},
+dd1754[]={4352,4449,0},
+dd1755[]={4354,4449,0},
+dd1756[]={4355,4449,0},
+dd1757[]={4357,4449,0},
+dd1758[]={4358,4449,0},
+dd1759[]={4359,4449,0},
+dd1760[]={4361,4449,0},
+dd1761[]={4363,4449,0},
+dd1762[]={4364,4449,0},
+dd1763[]={4366,4449,0},
+dd1764[]={4367,4449,0},
+dd1765[]={4368,4449,0},
+dd1766[]={4369,4449,0},
+dd1767[]={4370,4449,0},
+dd1768[]={4366,4449,4535,4352,4457,0},
+dd1769[]={4364,4462,4363,4468,0},
+dd1770[]={4363,4462,0},
+dd1771[]={20116,0},
+dd1772[]={20845,0},
+dd1773[]={19971,0},
+dd1774[]={20061,0},
+dd1775[]={26666,0},
+dd1776[]={26377,0},
+dd1777[]={31038,0},
+dd1778[]={21517,0},
+dd1779[]={29305,0},
+dd1780[]={36001,0},
+dd1781[]={31069,0},
+dd1782[]={21172,0},
+dd1783[]={31192,0},
+dd1784[]={30007,0},
+dd1785[]={36969,0},
+dd1786[]={20778,0},
+dd1787[]={21360,0},
+dd1788[]={27880,0},
+dd1789[]={38917,0},
+dd1790[]={20241,0},
+dd1791[]={20889,0},
+dd1792[]={27491,0},
+dd1793[]={24038,0},
+dd1794[]={21491,0},
+dd1795[]={21307,0},
+dd1796[]={23447,0},
+dd1797[]={23398,0},
+dd1798[]={30435,0},
+dd1799[]={20225,0},
+dd1800[]={36039,0},
+dd1801[]={21332,0},
+dd1802[]={22812,0},
+dd1803[]={51,54,0},
+dd1804[]={51,55,0},
+dd1805[]={51,56,0},
+dd1806[]={51,57,0},
+dd1807[]={52,48,0},
+dd1808[]={52,49,0},
+dd1809[]={52,50,0},
+dd1810[]={52,51,0},
+dd1811[]={52,52,0},
+dd1812[]={52,53,0},
+dd1813[]={52,54,0},
+dd1814[]={52,55,0},
+dd1815[]={52,56,0},
+dd1816[]={52,57,0},
+dd1817[]={53,48,0},
+dd1818[]={49,26376,0},
+dd1819[]={50,26376,0},
+dd1820[]={51,26376,0},
+dd1821[]={52,26376,0},
+dd1822[]={53,26376,0},
+dd1823[]={54,26376,0},
+dd1824[]={55,26376,0},
+dd1825[]={56,26376,0},
+dd1826[]={57,26376,0},
+dd1827[]={49,48,26376,0},
+dd1828[]={49,49,26376,0},
+dd1829[]={49,50,26376,0},
+dd1830[]={72,103,0},
+dd1831[]={101,114,103,0},
+dd1832[]={101,86,0},
+dd1833[]={76,84,68,0},
+dd1834[]={12450,0},
+dd1835[]={12452,0},
+dd1836[]={12454,0},
+dd1837[]={12456,0},
+dd1838[]={12458,0},
+dd1839[]={12459,0},
+dd1840[]={12461,0},
+dd1841[]={12463,0},
+dd1842[]={12465,0},
+dd1843[]={12467,0},
+dd1844[]={12469,0},
+dd1845[]={12471,0},
+dd1846[]={12473,0},
+dd1847[]={12475,0},
+dd1848[]={12477,0},
+dd1849[]={12479,0},
+dd1850[]={12481,0},
+dd1851[]={12484,0},
+dd1852[]={12486,0},
+dd1853[]={12488,0},
+dd1854[]={12490,0},
+dd1855[]={12491,0},
+dd1856[]={12492,0},
+dd1857[]={12493,0},
+dd1858[]={12494,0},
+dd1859[]={12495,0},
+dd1860[]={12498,0},
+dd1861[]={12501,0},
+dd1862[]={12504,0},
+dd1863[]={12507,0},
+dd1864[]={12510,0},
+dd1865[]={12511,0},
+dd1866[]={12512,0},
+dd1867[]={12513,0},
+dd1868[]={12514,0},
+dd1869[]={12516,0},
+dd1870[]={12518,0},
+dd1871[]={12520,0},
+dd1872[]={12521,0},
+dd1873[]={12522,0},
+dd1874[]={12523,0},
+dd1875[]={12524,0},
+dd1876[]={12525,0},
+dd1877[]={12527,0},
+dd1878[]={12528,0},
+dd1879[]={12529,0},
+dd1880[]={12530,0},
+dd1881[]={12450,12497,12540,12488,0},
+dd1882[]={12450,12523,12501,12449,0},
+dd1883[]={12450,12531,12506,12450,0},
+dd1884[]={12450,12540,12523,0},
+dd1885[]={12452,12491,12531,12464,0},
+dd1886[]={12452,12531,12481,0},
+dd1887[]={12454,12457,12531,0},
+dd1888[]={12456,12473,12463,12540,12489,0},
+dd1889[]={12456,12540,12459,12540,0},
+dd1890[]={12458,12531,12473,0},
+dd1891[]={12458,12540,12512,0},
+dd1892[]={12459,12452,12522,0},
+dd1893[]={12459,12521,12483,12488,0},
+dd1894[]={12459,12525,12522,12540,0},
+dd1895[]={12460,12525,12531,0},
+dd1896[]={12460,12531,12510,0},
+dd1897[]={12462,12460,0},
+dd1898[]={12462,12491,12540,0},
+dd1899[]={12461,12517,12522,12540,0},
+dd1900[]={12462,12523,12480,12540,0},
+dd1901[]={12461,12525,0},
+dd1902[]={12461,12525,12464,12521,12512,0},
+dd1903[]={12461,12525,12513,12540,12488,12523,0},
+dd1904[]={12461,12525,12527,12483,12488,0},
+dd1905[]={12464,12521,12512,0},
+dd1906[]={12464,12521,12512,12488,12531,0},
+dd1907[]={12463,12523,12476,12452,12525,0},
+dd1908[]={12463,12525,12540,12493,0},
+dd1909[]={12465,12540,12473,0},
+dd1910[]={12467,12523,12490,0},
+dd1911[]={12467,12540,12509,0},
+dd1912[]={12469,12452,12463,12523,0},
+dd1913[]={12469,12531,12481,12540,12512,0},
+dd1914[]={12471,12522,12531,12464,0},
+dd1915[]={12475,12531,12481,0},
+dd1916[]={12475,12531,12488,0},
+dd1917[]={12480,12540,12473,0},
+dd1918[]={12487,12471,0},
+dd1919[]={12489,12523,0},
+dd1920[]={12488,12531,0},
+dd1921[]={12490,12494,0},
+dd1922[]={12494,12483,12488,0},
+dd1923[]={12495,12452,12484,0},
+dd1924[]={12497,12540,12475,12531,12488,0},
+dd1925[]={12497,12540,12484,0},
+dd1926[]={12496,12540,12524,12523,0},
+dd1927[]={12500,12450,12473,12488,12523,0},
+dd1928[]={12500,12463,12523,0},
+dd1929[]={12500,12467,0},
+dd1930[]={12499,12523,0},
+dd1931[]={12501,12449,12521,12483,12489,0},
+dd1932[]={12501,12451,12540,12488,0},
+dd1933[]={12502,12483,12471,12455,12523,0},
+dd1934[]={12501,12521,12531,0},
+dd1935[]={12504,12463,12479,12540,12523,0},
+dd1936[]={12506,12477,0},
+dd1937[]={12506,12491,12498,0},
+dd1938[]={12504,12523,12484,0},
+dd1939[]={12506,12531,12473,0},
+dd1940[]={12506,12540,12472,0},
+dd1941[]={12505,12540,12479,0},
+dd1942[]={12509,12452,12531,12488,0},
+dd1943[]={12508,12523,12488,0},
+dd1944[]={12507,12531,0},
+dd1945[]={12509,12531,12489,0},
+dd1946[]={12507,12540,12523,0},
+dd1947[]={12507,12540,12531,0},
+dd1948[]={12510,12452,12463,12525,0},
+dd1949[]={12510,12452,12523,0},
+dd1950[]={12510,12483,12495,0},
+dd1951[]={12510,12523,12463,0},
+dd1952[]={12510,12531,12471,12519,12531,0},
+dd1953[]={12511,12463,12525,12531,0},
+dd1954[]={12511,12522,0},
+dd1955[]={12511,12522,12496,12540,12523,0},
+dd1956[]={12513,12460,0},
+dd1957[]={12513,12460,12488,12531,0},
+dd1958[]={12513,12540,12488,12523,0},
+dd1959[]={12516,12540,12489,0},
+dd1960[]={12516,12540,12523,0},
+dd1961[]={12518,12450,12531,0},
+dd1962[]={12522,12483,12488,12523,0},
+dd1963[]={12522,12521,0},
+dd1964[]={12523,12500,12540,0},
+dd1965[]={12523,12540,12502,12523,0},
+dd1966[]={12524,12512,0},
+dd1967[]={12524,12531,12488,12466,12531,0},
+dd1968[]={12527,12483,12488,0},
+dd1969[]={48,28857,0},
+dd1970[]={49,28857,0},
+dd1971[]={50,28857,0},
+dd1972[]={51,28857,0},
+dd1973[]={52,28857,0},
+dd1974[]={53,28857,0},
+dd1975[]={54,28857,0},
+dd1976[]={55,28857,0},
+dd1977[]={56,28857,0},
+dd1978[]={57,28857,0},
+dd1979[]={49,48,28857,0},
+dd1980[]={49,49,28857,0},
+dd1981[]={49,50,28857,0},
+dd1982[]={49,51,28857,0},
+dd1983[]={49,52,28857,0},
+dd1984[]={49,53,28857,0},
+dd1985[]={49,54,28857,0},
+dd1986[]={49,55,28857,0},
+dd1987[]={49,56,28857,0},
+dd1988[]={49,57,28857,0},
+dd1989[]={50,48,28857,0},
+dd1990[]={50,49,28857,0},
+dd1991[]={50,50,28857,0},
+dd1992[]={50,51,28857,0},
+dd1993[]={50,52,28857,0},
+dd1994[]={104,80,97,0},
+dd1995[]={100,97,0},
+dd1996[]={65,85,0},
+dd1997[]={98,97,114,0},
+dd1998[]={111,86,0},
+dd1999[]={112,99,0},
+dd2000[]={100,109,0},
+dd2001[]={100,109,178,0},
+dd2002[]={100,109,179,0},
+dd2003[]={73,85,0},
+dd2004[]={24179,25104,0},
+dd2005[]={26157,21644,0},
+dd2006[]={22823,27491,0},
+dd2007[]={26126,27835,0},
+dd2008[]={26666,24335,20250,31038,0},
+dd2009[]={112,65,0},
+dd2010[]={110,65,0},
+dd2011[]={956,65,0},
+dd2012[]={109,65,0},
+dd2013[]={107,65,0},
+dd2014[]={75,66,0},
+dd2015[]={77,66,0},
+dd2016[]={71,66,0},
+dd2017[]={99,97,108,0},
+dd2018[]={107,99,97,108,0},
+dd2019[]={112,70,0},
+dd2020[]={110,70,0},
+dd2021[]={956,70,0},
+dd2022[]={956,103,0},
+dd2023[]={109,103,0},
+dd2024[]={107,103,0},
+dd2025[]={72,122,0},
+dd2026[]={107,72,122,0},
+dd2027[]={77,72,122,0},
+dd2028[]={71,72,122,0},
+dd2029[]={84,72,122,0},
+dd2030[]={956,8467,0},
+dd2031[]={109,8467,0},
+dd2032[]={100,8467,0},
+dd2033[]={107,8467,0},
+dd2034[]={102,109,0},
+dd2035[]={110,109,0},
+dd2036[]={956,109,0},
+dd2037[]={109,109,0},
+dd2038[]={99,109,0},
+dd2039[]={107,109,0},
+dd2040[]={109,109,178,0},
+dd2041[]={99,109,178,0},
+dd2042[]={109,178,0},
+dd2043[]={107,109,178,0},
+dd2044[]={109,109,179,0},
+dd2045[]={99,109,179,0},
+dd2046[]={109,179,0},
+dd2047[]={107,109,179,0},
+dd2048[]={109,8725,115,0},
+dd2049[]={109,8725,115,178,0},
+dd2050[]={80,97,0},
+dd2051[]={107,80,97,0},
+dd2052[]={77,80,97,0},
+dd2053[]={71,80,97,0},
+dd2054[]={114,97,100,0},
+dd2055[]={114,97,100,8725,115,0},
+dd2056[]={114,97,100,8725,115,178,0},
+dd2057[]={112,115,0},
+dd2058[]={110,115,0},
+dd2059[]={956,115,0},
+dd2060[]={109,115,0},
+dd2061[]={112,86,0},
+dd2062[]={110,86,0},
+dd2063[]={956,86,0},
+dd2064[]={109,86,0},
+dd2065[]={107,86,0},
+dd2066[]={77,86,0},
+dd2067[]={112,87,0},
+dd2068[]={110,87,0},
+dd2069[]={956,87,0},
+dd2070[]={109,87,0},
+dd2071[]={107,87,0},
+dd2072[]={77,87,0},
+dd2073[]={107,937,0},
+dd2074[]={77,937,0},
+dd2075[]={97,46,109,46,0},
+dd2076[]={66,113,0},
+dd2077[]={99,99,0},
+dd2078[]={99,100,0},
+dd2079[]={67,8725,107,103,0},
+dd2080[]={67,111,46,0},
+dd2081[]={100,66,0},
+dd2082[]={71,121,0},
+dd2083[]={104,97,0},
+dd2084[]={72,80,0},
+dd2085[]={105,110,0},
+dd2086[]={75,75,0},
+dd2087[]={75,77,0},
+dd2088[]={107,116,0},
+dd2089[]={108,109,0},
+dd2090[]={108,110,0},
+dd2091[]={108,111,103,0},
+dd2092[]={108,120,0},
+dd2093[]={109,98,0},
+dd2094[]={109,105,108,0},
+dd2095[]={109,111,108,0},
+dd2096[]={80,72,0},
+dd2097[]={112,46,109,46,0},
+dd2098[]={80,80,77,0},
+dd2099[]={80,82,0},
+dd2100[]={115,114,0},
+dd2101[]={83,118,0},
+dd2102[]={87,98,0},
+dd2103[]={86,8725,109,0},
+dd2104[]={65,8725,109,0},
+dd2105[]={49,26085,0},
+dd2106[]={50,26085,0},
+dd2107[]={51,26085,0},
+dd2108[]={52,26085,0},
+dd2109[]={53,26085,0},
+dd2110[]={54,26085,0},
+dd2111[]={55,26085,0},
+dd2112[]={56,26085,0},
+dd2113[]={57,26085,0},
+dd2114[]={49,48,26085,0},
+dd2115[]={49,49,26085,0},
+dd2116[]={49,50,26085,0},
+dd2117[]={49,51,26085,0},
+dd2118[]={49,52,26085,0},
+dd2119[]={49,53,26085,0},
+dd2120[]={49,54,26085,0},
+dd2121[]={49,55,26085,0},
+dd2122[]={49,56,26085,0},
+dd2123[]={49,57,26085,0},
+dd2124[]={50,48,26085,0},
+dd2125[]={50,49,26085,0},
+dd2126[]={50,50,26085,0},
+dd2127[]={50,51,26085,0},
+dd2128[]={50,52,26085,0},
+dd2129[]={50,53,26085,0},
+dd2130[]={50,54,26085,0},
+dd2131[]={50,55,26085,0},
+dd2132[]={50,56,26085,0},
+dd2133[]={50,57,26085,0},
+dd2134[]={51,48,26085,0},
+dd2135[]={51,49,26085,0},
+dd2136[]={103,97,108,0},
+dd2137[]={42863,0},
+dd2138[]={35912,0},
+dd2139[]={26356,0},
+dd2140[]={36040,0},
+dd2141[]={28369,0},
+dd2142[]={20018,0},
+dd2143[]={21477,0},
+dd2144[]={22865,0},
+dd2145[]={21895,0},
+dd2146[]={22856,0},
+dd2147[]={25078,0},
+dd2148[]={30313,0},
+dd2149[]={32645,0},
+dd2150[]={34367,0},
+dd2151[]={34746,0},
+dd2152[]={35064,0},
+dd2153[]={37007,0},
+dd2154[]={27138,0},
+dd2155[]={27931,0},
+dd2156[]={28889,0},
+dd2157[]={29662,0},
+dd2158[]={33853,0},
+dd2159[]={37226,0},
+dd2160[]={39409,0},
+dd2161[]={20098,0},
+dd2162[]={21365,0},
+dd2163[]={27396,0},
+dd2164[]={29211,0},
+dd2165[]={34349,0},
+dd2166[]={40478,0},
+dd2167[]={23888,0},
+dd2168[]={28651,0},
+dd2169[]={34253,0},
+dd2170[]={35172,0},
+dd2171[]={25289,0},
+dd2172[]={33240,0},
+dd2173[]={34847,0},
+dd2174[]={24266,0},
+dd2175[]={26391,0},
+dd2176[]={28010,0},
+dd2177[]={29436,0},
+dd2178[]={37070,0},
+dd2179[]={20358,0},
+dd2180[]={20919,0},
+dd2181[]={21214,0},
+dd2182[]={25796,0},
+dd2183[]={27347,0},
+dd2184[]={29200,0},
+dd2185[]={30439,0},
+dd2186[]={34310,0},
+dd2187[]={34396,0},
+dd2188[]={36335,0},
+dd2189[]={38706,0},
+dd2190[]={39791,0},
+dd2191[]={40442,0},
+dd2192[]={30860,0},
+dd2193[]={31103,0},
+dd2194[]={32160,0},
+dd2195[]={33737,0},
+dd2196[]={37636,0},
+dd2197[]={35542,0},
+dd2198[]={22751,0},
+dd2199[]={24324,0},
+dd2200[]={31840,0},
+dd2201[]={32894,0},
+dd2202[]={29282,0},
+dd2203[]={30922,0},
+dd2204[]={36034,0},
+dd2205[]={38647,0},
+dd2206[]={22744,0},
+dd2207[]={23650,0},
+dd2208[]={27155,0},
+dd2209[]={28122,0},
+dd2210[]={28431,0},
+dd2211[]={32047,0},
+dd2212[]={32311,0},
+dd2213[]={38475,0},
+dd2214[]={21202,0},
+dd2215[]={32907,0},
+dd2216[]={20956,0},
+dd2217[]={20940,0},
+dd2218[]={31260,0},
+dd2219[]={32190,0},
+dd2220[]={33777,0},
+dd2221[]={38517,0},
+dd2222[]={35712,0},
+dd2223[]={25295,0},
+dd2224[]={35582,0},
+dd2225[]={20025,0},
+dd2226[]={23527,0},
+dd2227[]={24594,0},
+dd2228[]={29575,0},
+dd2229[]={30064,0},
+dd2230[]={21271,0},
+dd2231[]={30971,0},
+dd2232[]={20415,0},
+dd2233[]={24489,0},
+dd2234[]={19981,0},
+dd2235[]={27852,0},
+dd2236[]={25976,0},
+dd2237[]={32034,0},
+dd2238[]={21443,0},
+dd2239[]={22622,0},
+dd2240[]={30465,0},
+dd2241[]={33865,0},
+dd2242[]={35498,0},
+dd2243[]={27578,0},
+dd2244[]={27784,0},
+dd2245[]={25342,0},
+dd2246[]={33509,0},
+dd2247[]={25504,0},
+dd2248[]={30053,0},
+dd2249[]={20142,0},
+dd2250[]={20841,0},
+dd2251[]={20937,0},
+dd2252[]={26753,0},
+dd2253[]={31975,0},
+dd2254[]={33391,0},
+dd2255[]={35538,0},
+dd2256[]={37327,0},
+dd2257[]={21237,0},
+dd2258[]={21570,0},
+dd2259[]={24300,0},
+dd2260[]={26053,0},
+dd2261[]={28670,0},
+dd2262[]={31018,0},
+dd2263[]={38317,0},
+dd2264[]={39530,0},
+dd2265[]={40599,0},
+dd2266[]={40654,0},
+dd2267[]={26310,0},
+dd2268[]={27511,0},
+dd2269[]={36706,0},
+dd2270[]={24180,0},
+dd2271[]={24976,0},
+dd2272[]={25088,0},
+dd2273[]={25754,0},
+dd2274[]={28451,0},
+dd2275[]={29001,0},
+dd2276[]={29833,0},
+dd2277[]={31178,0},
+dd2278[]={32244,0},
+dd2279[]={32879,0},
+dd2280[]={36646,0},
+dd2281[]={34030,0},
+dd2282[]={36899,0},
+dd2283[]={37706,0},
+dd2284[]={21015,0},
+dd2285[]={21155,0},
+dd2286[]={21693,0},
+dd2287[]={28872,0},
+dd2288[]={35010,0},
+dd2289[]={24265,0},
+dd2290[]={24565,0},
+dd2291[]={25467,0},
+dd2292[]={27566,0},
+dd2293[]={31806,0},
+dd2294[]={29557,0},
+dd2295[]={20196,0},
+dd2296[]={22265,0},
+dd2297[]={23994,0},
+dd2298[]={24604,0},
+dd2299[]={29618,0},
+dd2300[]={29801,0},
+dd2301[]={32666,0},
+dd2302[]={32838,0},
+dd2303[]={37428,0},
+dd2304[]={38646,0},
+dd2305[]={38728,0},
+dd2306[]={38936,0},
+dd2307[]={20363,0},
+dd2308[]={31150,0},
+dd2309[]={37300,0},
+dd2310[]={38584,0},
+dd2311[]={24801,0},
+dd2312[]={20102,0},
+dd2313[]={20698,0},
+dd2314[]={23534,0},
+dd2315[]={23615,0},
+dd2316[]={26009,0},
+dd2317[]={29134,0},
+dd2318[]={30274,0},
+dd2319[]={34044,0},
+dd2320[]={36988,0},
+dd2321[]={26248,0},
+dd2322[]={38446,0},
+dd2323[]={21129,0},
+dd2324[]={26491,0},
+dd2325[]={26611,0},
+dd2326[]={27969,0},
+dd2327[]={28316,0},
+dd2328[]={29705,0},
+dd2329[]={30041,0},
+dd2330[]={30827,0},
+dd2331[]={32016,0},
+dd2332[]={39006,0},
+dd2333[]={25134,0},
+dd2334[]={38520,0},
+dd2335[]={20523,0},
+dd2336[]={23833,0},
+dd2337[]={28138,0},
+dd2338[]={36650,0},
+dd2339[]={24459,0},
+dd2340[]={24900,0},
+dd2341[]={26647,0},
+dd2342[]={38534,0},
+dd2343[]={21033,0},
+dd2344[]={21519,0},
+dd2345[]={23653,0},
+dd2346[]={26131,0},
+dd2347[]={26446,0},
+dd2348[]={26792,0},
+dd2349[]={27877,0},
+dd2350[]={29702,0},
+dd2351[]={30178,0},
+dd2352[]={32633,0},
+dd2353[]={35023,0},
+dd2354[]={35041,0},
+dd2355[]={38626,0},
+dd2356[]={21311,0},
+dd2357[]={28346,0},
+dd2358[]={21533,0},
+dd2359[]={29136,0},
+dd2360[]={29848,0},
+dd2361[]={34298,0},
+dd2362[]={38563,0},
+dd2363[]={40023,0},
+dd2364[]={40607,0},
+dd2365[]={26519,0},
+dd2366[]={28107,0},
+dd2367[]={33256,0},
+dd2368[]={31520,0},
+dd2369[]={31890,0},
+dd2370[]={29376,0},
+dd2371[]={28825,0},
+dd2372[]={35672,0},
+dd2373[]={20160,0},
+dd2374[]={33590,0},
+dd2375[]={21050,0},
+dd2376[]={20999,0},
+dd2377[]={24230,0},
+dd2378[]={25299,0},
+dd2379[]={31958,0},
+dd2380[]={23429,0},
+dd2381[]={27934,0},
+dd2382[]={26292,0},
+dd2383[]={36667,0},
+dd2384[]={38477,0},
+dd2385[]={24275,0},
+dd2386[]={20800,0},
+dd2387[]={21952,0},
+dd2388[]={22618,0},
+dd2389[]={26228,0},
+dd2390[]={20958,0},
+dd2391[]={29482,0},
+dd2392[]={30410,0},
+dd2393[]={31036,0},
+dd2394[]={31070,0},
+dd2395[]={31077,0},
+dd2396[]={31119,0},
+dd2397[]={38742,0},
+dd2398[]={31934,0},
+dd2399[]={34322,0},
+dd2400[]={35576,0},
+dd2401[]={36920,0},
+dd2402[]={37117,0},
+dd2403[]={39151,0},
+dd2404[]={39164,0},
+dd2405[]={39208,0},
+dd2406[]={40372,0},
+dd2407[]={20398,0},
+dd2408[]={20711,0},
+dd2409[]={20813,0},
+dd2410[]={21193,0},
+dd2411[]={21220,0},
+dd2412[]={21329,0},
+dd2413[]={21917,0},
+dd2414[]={22022,0},
+dd2415[]={22120,0},
+dd2416[]={22592,0},
+dd2417[]={22696,0},
+dd2418[]={23652,0},
+dd2419[]={24724,0},
+dd2420[]={24936,0},
+dd2421[]={24974,0},
+dd2422[]={25074,0},
+dd2423[]={25935,0},
+dd2424[]={26082,0},
+dd2425[]={26257,0},
+dd2426[]={26757,0},
+dd2427[]={28023,0},
+dd2428[]={28186,0},
+dd2429[]={28450,0},
+dd2430[]={29038,0},
+dd2431[]={29227,0},
+dd2432[]={29730,0},
+dd2433[]={30865,0},
+dd2434[]={31049,0},
+dd2435[]={31048,0},
+dd2436[]={31056,0},
+dd2437[]={31062,0},
+dd2438[]={31117,0},
+dd2439[]={31118,0},
+dd2440[]={31296,0},
+dd2441[]={31361,0},
+dd2442[]={31680,0},
+dd2443[]={32265,0},
+dd2444[]={32321,0},
+dd2445[]={32626,0},
+dd2446[]={32773,0},
+dd2447[]={33261,0},
+dd2448[]={33401,0},
+dd2449[]={33879,0},
+dd2450[]={35088,0},
+dd2451[]={35222,0},
+dd2452[]={35585,0},
+dd2453[]={35641,0},
+dd2454[]={36051,0},
+dd2455[]={36104,0},
+dd2456[]={36790,0},
+dd2457[]={38627,0},
+dd2458[]={38911,0},
+dd2459[]={38971,0},
+dd2460[]={24693,0},
+dd2461[]={148206,0},
+dd2462[]={33304,0},
+dd2463[]={20006,0},
+dd2464[]={20917,0},
+dd2465[]={20840,0},
+dd2466[]={20352,0},
+dd2467[]={20805,0},
+dd2468[]={20864,0},
+dd2469[]={21191,0},
+dd2470[]={21242,0},
+dd2471[]={21845,0},
+dd2472[]={21913,0},
+dd2473[]={21986,0},
+dd2474[]={22707,0},
+dd2475[]={22852,0},
+dd2476[]={22868,0},
+dd2477[]={23138,0},
+dd2478[]={23336,0},
+dd2479[]={24274,0},
+dd2480[]={24281,0},
+dd2481[]={24425,0},
+dd2482[]={24493,0},
+dd2483[]={24792,0},
+dd2484[]={24910,0},
+dd2485[]={24840,0},
+dd2486[]={24928,0},
+dd2487[]={25140,0},
+dd2488[]={25540,0},
+dd2489[]={25628,0},
+dd2490[]={25682,0},
+dd2491[]={25942,0},
+dd2492[]={26395,0},
+dd2493[]={26454,0},
+dd2494[]={28379,0},
+dd2495[]={28363,0},
+dd2496[]={28702,0},
+dd2497[]={30631,0},
+dd2498[]={29237,0},
+dd2499[]={29359,0},
+dd2500[]={29809,0},
+dd2501[]={29958,0},
+dd2502[]={30011,0},
+dd2503[]={30237,0},
+dd2504[]={30239,0},
+dd2505[]={30427,0},
+dd2506[]={30452,0},
+dd2507[]={30538,0},
+dd2508[]={30528,0},
+dd2509[]={30924,0},
+dd2510[]={31409,0},
+dd2511[]={31867,0},
+dd2512[]={32091,0},
+dd2513[]={32574,0},
+dd2514[]={33618,0},
+dd2515[]={33775,0},
+dd2516[]={34681,0},
+dd2517[]={35137,0},
+dd2518[]={35206,0},
+dd2519[]={35519,0},
+dd2520[]={35531,0},
+dd2521[]={35565,0},
+dd2522[]={35722,0},
+dd2523[]={36664,0},
+dd2524[]={36978,0},
+dd2525[]={37273,0},
+dd2526[]={37494,0},
+dd2527[]={38524,0},
+dd2528[]={38875,0},
+dd2529[]={38923,0},
+dd2530[]={39698,0},
+dd2531[]={141386,0},
+dd2532[]={141380,0},
+dd2533[]={144341,0},
+dd2534[]={15261,0},
+dd2535[]={16408,0},
+dd2536[]={16441,0},
+dd2537[]={152137,0},
+dd2538[]={154832,0},
+dd2539[]={163539,0},
+dd2540[]={40771,0},
+dd2541[]={40846,0},
+dd2542[]={102,102,0},
+dd2543[]={102,105,0},
+dd2544[]={102,108,0},
+dd2545[]={102,102,105,0},
+dd2546[]={102,102,108,0},
+dd2547[]={383,116,0},
+dd2548[]={115,116,0},
+dd2549[]={1396,1398,0},
+dd2550[]={1396,1381,0},
+dd2551[]={1396,1387,0},
+dd2552[]={1406,1398,0},
+dd2553[]={1396,1389,0},
+dd2554[]={1497,1460,0},
+dd2555[]={1522,1463,0},
+dd2556[]={1506,0},
+dd2557[]={1492,0},
+dd2558[]={1499,0},
+dd2559[]={1500,0},
+dd2560[]={1501,0},
+dd2561[]={1512,0},
+dd2562[]={1514,0},
+dd2563[]={1513,1473,0},
+dd2564[]={1513,1474,0},
+dd2565[]={64329,1473,0},
+dd2566[]={64329,1474,0},
+dd2567[]={1488,1463,0},
+dd2568[]={1488,1464,0},
+dd2569[]={1488,1468,0},
+dd2570[]={1489,1468,0},
+dd2571[]={1490,1468,0},
+dd2572[]={1491,1468,0},
+dd2573[]={1492,1468,0},
+dd2574[]={1493,1468,0},
+dd2575[]={1494,1468,0},
+dd2576[]={1496,1468,0},
+dd2577[]={1497,1468,0},
+dd2578[]={1498,1468,0},
+dd2579[]={1499,1468,0},
+dd2580[]={1500,1468,0},
+dd2581[]={1502,1468,0},
+dd2582[]={1504,1468,0},
+dd2583[]={1505,1468,0},
+dd2584[]={1507,1468,0},
+dd2585[]={1508,1468,0},
+dd2586[]={1510,1468,0},
+dd2587[]={1511,1468,0},
+dd2588[]={1512,1468,0},
+dd2589[]={1513,1468,0},
+dd2590[]={1514,1468,0},
+dd2591[]={1493,1465,0},
+dd2592[]={1489,1471,0},
+dd2593[]={1499,1471,0},
+dd2594[]={1508,1471,0},
+dd2595[]={1488,1500,0},
+dd2596[]={1649,0},
+dd2597[]={1659,0},
+dd2598[]={1662,0},
+dd2599[]={1664,0},
+dd2600[]={1658,0},
+dd2601[]={1663,0},
+dd2602[]={1657,0},
+dd2603[]={1700,0},
+dd2604[]={1702,0},
+dd2605[]={1668,0},
+dd2606[]={1667,0},
+dd2607[]={1670,0},
+dd2608[]={1671,0},
+dd2609[]={1677,0},
+dd2610[]={1676,0},
+dd2611[]={1678,0},
+dd2612[]={1672,0},
+dd2613[]={1688,0},
+dd2614[]={1681,0},
+dd2615[]={1705,0},
+dd2616[]={1711,0},
+dd2617[]={1715,0},
+dd2618[]={1713,0},
+dd2619[]={1722,0},
+dd2620[]={1723,0},
+dd2621[]={1728,0},
+dd2622[]={1729,0},
+dd2623[]={1726,0},
+dd2624[]={1746,0},
+dd2625[]={1747,0},
+dd2626[]={1709,0},
+dd2627[]={1735,0},
+dd2628[]={1734,0},
+dd2629[]={1736,0},
+dd2630[]={1655,0},
+dd2631[]={1739,0},
+dd2632[]={1733,0},
+dd2633[]={1737,0},
+dd2634[]={1744,0},
+dd2635[]={1609,0},
+dd2636[]={1574,1575,0},
+dd2637[]={1574,1749,0},
+dd2638[]={1574,1608,0},
+dd2639[]={1574,1735,0},
+dd2640[]={1574,1734,0},
+dd2641[]={1574,1736,0},
+dd2642[]={1574,1744,0},
+dd2643[]={1574,1609,0},
+dd2644[]={1740,0},
+dd2645[]={1574,1580,0},
+dd2646[]={1574,1581,0},
+dd2647[]={1574,1605,0},
+dd2648[]={1574,1610,0},
+dd2649[]={1576,1580,0},
+dd2650[]={1576,1581,0},
+dd2651[]={1576,1582,0},
+dd2652[]={1576,1605,0},
+dd2653[]={1576,1609,0},
+dd2654[]={1576,1610,0},
+dd2655[]={1578,1580,0},
+dd2656[]={1578,1581,0},
+dd2657[]={1578,1582,0},
+dd2658[]={1578,1605,0},
+dd2659[]={1578,1609,0},
+dd2660[]={1578,1610,0},
+dd2661[]={1579,1580,0},
+dd2662[]={1579,1605,0},
+dd2663[]={1579,1609,0},
+dd2664[]={1579,1610,0},
+dd2665[]={1580,1581,0},
+dd2666[]={1580,1605,0},
+dd2667[]={1581,1580,0},
+dd2668[]={1581,1605,0},
+dd2669[]={1582,1580,0},
+dd2670[]={1582,1581,0},
+dd2671[]={1582,1605,0},
+dd2672[]={1587,1580,0},
+dd2673[]={1587,1581,0},
+dd2674[]={1587,1582,0},
+dd2675[]={1587,1605,0},
+dd2676[]={1589,1581,0},
+dd2677[]={1589,1605,0},
+dd2678[]={1590,1580,0},
+dd2679[]={1590,1581,0},
+dd2680[]={1590,1582,0},
+dd2681[]={1590,1605,0},
+dd2682[]={1591,1581,0},
+dd2683[]={1591,1605,0},
+dd2684[]={1592,1605,0},
+dd2685[]={1593,1580,0},
+dd2686[]={1593,1605,0},
+dd2687[]={1594,1580,0},
+dd2688[]={1594,1605,0},
+dd2689[]={1601,1580,0},
+dd2690[]={1601,1581,0},
+dd2691[]={1601,1582,0},
+dd2692[]={1601,1605,0},
+dd2693[]={1601,1609,0},
+dd2694[]={1601,1610,0},
+dd2695[]={1602,1581,0},
+dd2696[]={1602,1605,0},
+dd2697[]={1602,1609,0},
+dd2698[]={1602,1610,0},
+dd2699[]={1603,1575,0},
+dd2700[]={1603,1580,0},
+dd2701[]={1603,1581,0},
+dd2702[]={1603,1582,0},
+dd2703[]={1603,1604,0},
+dd2704[]={1603,1605,0},
+dd2705[]={1603,1609,0},
+dd2706[]={1603,1610,0},
+dd2707[]={1604,1580,0},
+dd2708[]={1604,1581,0},
+dd2709[]={1604,1582,0},
+dd2710[]={1604,1605,0},
+dd2711[]={1604,1609,0},
+dd2712[]={1604,1610,0},
+dd2713[]={1605,1580,0},
+dd2714[]={1605,1581,0},
+dd2715[]={1605,1582,0},
+dd2716[]={1605,1605,0},
+dd2717[]={1605,1609,0},
+dd2718[]={1605,1610,0},
+dd2719[]={1606,1580,0},
+dd2720[]={1606,1581,0},
+dd2721[]={1606,1582,0},
+dd2722[]={1606,1605,0},
+dd2723[]={1606,1609,0},
+dd2724[]={1606,1610,0},
+dd2725[]={1607,1580,0},
+dd2726[]={1607,1605,0},
+dd2727[]={1607,1609,0},
+dd2728[]={1607,1610,0},
+dd2729[]={1610,1580,0},
+dd2730[]={1610,1581,0},
+dd2731[]={1610,1582,0},
+dd2732[]={1610,1605,0},
+dd2733[]={1610,1609,0},
+dd2734[]={1610,1610,0},
+dd2735[]={1584,1648,0},
+dd2736[]={1585,1648,0},
+dd2737[]={1609,1648,0},
+dd2738[]={32,1612,1617,0},
+dd2739[]={32,1613,1617,0},
+dd2740[]={32,1614,1617,0},
+dd2741[]={32,1615,1617,0},
+dd2742[]={32,1616,1617,0},
+dd2743[]={32,1617,1648,0},
+dd2744[]={1574,1585,0},
+dd2745[]={1574,1586,0},
+dd2746[]={1574,1606,0},
+dd2747[]={1576,1585,0},
+dd2748[]={1576,1586,0},
+dd2749[]={1576,1606,0},
+dd2750[]={1578,1585,0},
+dd2751[]={1578,1586,0},
+dd2752[]={1578,1606,0},
+dd2753[]={1579,1585,0},
+dd2754[]={1579,1586,0},
+dd2755[]={1579,1606,0},
+dd2756[]={1605,1575,0},
+dd2757[]={1606,1585,0},
+dd2758[]={1606,1586,0},
+dd2759[]={1606,1606,0},
+dd2760[]={1610,1585,0},
+dd2761[]={1610,1586,0},
+dd2762[]={1610,1606,0},
+dd2763[]={1574,1582,0},
+dd2764[]={1574,1607,0},
+dd2765[]={1576,1607,0},
+dd2766[]={1578,1607,0},
+dd2767[]={1589,1582,0},
+dd2768[]={1604,1607,0},
+dd2769[]={1606,1607,0},
+dd2770[]={1607,1648,0},
+dd2771[]={1610,1607,0},
+dd2772[]={1579,1607,0},
+dd2773[]={1587,1607,0},
+dd2774[]={1588,1605,0},
+dd2775[]={1588,1607,0},
+dd2776[]={1600,1614,1617,0},
+dd2777[]={1600,1615,1617,0},
+dd2778[]={1600,1616,1617,0},
+dd2779[]={1591,1609,0},
+dd2780[]={1591,1610,0},
+dd2781[]={1593,1609,0},
+dd2782[]={1593,1610,0},
+dd2783[]={1594,1609,0},
+dd2784[]={1594,1610,0},
+dd2785[]={1587,1609,0},
+dd2786[]={1587,1610,0},
+dd2787[]={1588,1609,0},
+dd2788[]={1588,1610,0},
+dd2789[]={1581,1609,0},
+dd2790[]={1581,1610,0},
+dd2791[]={1580,1609,0},
+dd2792[]={1580,1610,0},
+dd2793[]={1582,1609,0},
+dd2794[]={1582,1610,0},
+dd2795[]={1589,1609,0},
+dd2796[]={1589,1610,0},
+dd2797[]={1590,1609,0},
+dd2798[]={1590,1610,0},
+dd2799[]={1588,1580,0},
+dd2800[]={1588,1581,0},
+dd2801[]={1588,1582,0},
+dd2802[]={1588,1585,0},
+dd2803[]={1587,1585,0},
+dd2804[]={1589,1585,0},
+dd2805[]={1590,1585,0},
+dd2806[]={1575,1611,0},
+dd2807[]={1578,1580,1605,0},
+dd2808[]={1578,1581,1580,0},
+dd2809[]={1578,1581,1605,0},
+dd2810[]={1578,1582,1605,0},
+dd2811[]={1578,1605,1580,0},
+dd2812[]={1578,1605,1581,0},
+dd2813[]={1578,1605,1582,0},
+dd2814[]={1580,1605,1581,0},
+dd2815[]={1581,1605,1610,0},
+dd2816[]={1581,1605,1609,0},
+dd2817[]={1587,1581,1580,0},
+dd2818[]={1587,1580,1581,0},
+dd2819[]={1587,1580,1609,0},
+dd2820[]={1587,1605,1581,0},
+dd2821[]={1587,1605,1580,0},
+dd2822[]={1587,1605,1605,0},
+dd2823[]={1589,1581,1581,0},
+dd2824[]={1589,1605,1605,0},
+dd2825[]={1588,1581,1605,0},
+dd2826[]={1588,1580,1610,0},
+dd2827[]={1588,1605,1582,0},
+dd2828[]={1588,1605,1605,0},
+dd2829[]={1590,1581,1609,0},
+dd2830[]={1590,1582,1605,0},
+dd2831[]={1591,1605,1581,0},
+dd2832[]={1591,1605,1605,0},
+dd2833[]={1591,1605,1610,0},
+dd2834[]={1593,1580,1605,0},
+dd2835[]={1593,1605,1605,0},
+dd2836[]={1593,1605,1609,0},
+dd2837[]={1594,1605,1605,0},
+dd2838[]={1594,1605,1610,0},
+dd2839[]={1594,1605,1609,0},
+dd2840[]={1601,1582,1605,0},
+dd2841[]={1602,1605,1581,0},
+dd2842[]={1602,1605,1605,0},
+dd2843[]={1604,1581,1605,0},
+dd2844[]={1604,1581,1610,0},
+dd2845[]={1604,1581,1609,0},
+dd2846[]={1604,1580,1580,0},
+dd2847[]={1604,1582,1605,0},
+dd2848[]={1604,1605,1581,0},
+dd2849[]={1605,1581,1580,0},
+dd2850[]={1605,1581,1605,0},
+dd2851[]={1605,1581,1610,0},
+dd2852[]={1605,1580,1581,0},
+dd2853[]={1605,1580,1605,0},
+dd2854[]={1605,1582,1580,0},
+dd2855[]={1605,1582,1605,0},
+dd2856[]={1605,1580,1582,0},
+dd2857[]={1607,1605,1580,0},
+dd2858[]={1607,1605,1605,0},
+dd2859[]={1606,1581,1605,0},
+dd2860[]={1606,1581,1609,0},
+dd2861[]={1606,1580,1605,0},
+dd2862[]={1606,1580,1609,0},
+dd2863[]={1606,1605,1610,0},
+dd2864[]={1606,1605,1609,0},
+dd2865[]={1610,1605,1605,0},
+dd2866[]={1576,1582,1610,0},
+dd2867[]={1578,1580,1610,0},
+dd2868[]={1578,1580,1609,0},
+dd2869[]={1578,1582,1610,0},
+dd2870[]={1578,1582,1609,0},
+dd2871[]={1578,1605,1610,0},
+dd2872[]={1578,1605,1609,0},
+dd2873[]={1580,1605,1610,0},
+dd2874[]={1580,1581,1609,0},
+dd2875[]={1580,1605,1609,0},
+dd2876[]={1587,1582,1609,0},
+dd2877[]={1589,1581,1610,0},
+dd2878[]={1588,1581,1610,0},
+dd2879[]={1590,1581,1610,0},
+dd2880[]={1604,1580,1610,0},
+dd2881[]={1604,1605,1610,0},
+dd2882[]={1610,1581,1610,0},
+dd2883[]={1610,1580,1610,0},
+dd2884[]={1610,1605,1610,0},
+dd2885[]={1605,1605,1610,0},
+dd2886[]={1602,1605,1610,0},
+dd2887[]={1606,1581,1610,0},
+dd2888[]={1593,1605,1610,0},
+dd2889[]={1603,1605,1610,0},
+dd2890[]={1606,1580,1581,0},
+dd2891[]={1605,1582,1610,0},
+dd2892[]={1604,1580,1605,0},
+dd2893[]={1603,1605,1605,0},
+dd2894[]={1580,1581,1610,0},
+dd2895[]={1581,1580,1610,0},
+dd2896[]={1605,1580,1610,0},
+dd2897[]={1601,1605,1610,0},
+dd2898[]={1576,1581,1610,0},
+dd2899[]={1587,1582,1610,0},
+dd2900[]={1606,1580,1610,0},
+dd2901[]={1589,1604,1746,0},
+dd2902[]={1602,1604,1746,0},
+dd2903[]={1575,1604,1604,1607,0},
+dd2904[]={1575,1603,1576,1585,0},
+dd2905[]={1605,1581,1605,1583,0},
+dd2906[]={1589,1604,1593,1605,0},
+dd2907[]={1585,1587,1608,1604,0},
+dd2908[]={1593,1604,1610,1607,0},
+dd2909[]={1608,1587,1604,1605,0},
+dd2910[]={1589,1604,1609,0},
+dd2911[]={1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605,0},
+dd2912[]={1580,1604,32,1580,1604,1575,1604,1607,0},
+dd2913[]={1585,1740,1575,1604,0},
+dd2914[]={44,0},
+dd2915[]={12289,0},
+dd2916[]={12290,0},
+dd2917[]={58,0},
+dd2918[]={33,0},
+dd2919[]={63,0},
+dd2920[]={12310,0},
+dd2921[]={12311,0},
+dd2922[]={8230,0},
+dd2923[]={8229,0},
+dd2924[]={8212,0},
+dd2925[]={8211,0},
+dd2926[]={95,0},
+dd2927[]={123,0},
+dd2928[]={125,0},
+dd2929[]={12308,0},
+dd2930[]={12309,0},
+dd2931[]={12304,0},
+dd2932[]={12305,0},
+dd2933[]={12298,0},
+dd2934[]={12299,0},
+dd2935[]={12300,0},
+dd2936[]={12301,0},
+dd2937[]={12302,0},
+dd2938[]={12303,0},
+dd2939[]={91,0},
+dd2940[]={93,0},
+dd2941[]={8254,0},
+dd2942[]={35,0},
+dd2943[]={38,0},
+dd2944[]={42,0},
+dd2945[]={45,0},
+dd2946[]={60,0},
+dd2947[]={62,0},
+dd2948[]={92,0},
+dd2949[]={36,0},
+dd2950[]={37,0},
+dd2951[]={64,0},
+dd2952[]={32,1611,0},
+dd2953[]={1600,1611,0},
+dd2954[]={32,1612,0},
+dd2955[]={32,1613,0},
+dd2956[]={32,1614,0},
+dd2957[]={1600,1614,0},
+dd2958[]={32,1615,0},
+dd2959[]={1600,1615,0},
+dd2960[]={32,1616,0},
+dd2961[]={1600,1616,0},
+dd2962[]={32,1617,0},
+dd2963[]={1600,1617,0},
+dd2964[]={32,1618,0},
+dd2965[]={1600,1618,0},
+dd2966[]={1569,0},
+dd2967[]={1570,0},
+dd2968[]={1571,0},
+dd2969[]={1572,0},
+dd2970[]={1573,0},
+dd2971[]={1574,0},
+dd2972[]={1575,0},
+dd2973[]={1576,0},
+dd2974[]={1577,0},
+dd2975[]={1578,0},
+dd2976[]={1579,0},
+dd2977[]={1580,0},
+dd2978[]={1581,0},
+dd2979[]={1582,0},
+dd2980[]={1583,0},
+dd2981[]={1584,0},
+dd2982[]={1585,0},
+dd2983[]={1586,0},
+dd2984[]={1587,0},
+dd2985[]={1588,0},
+dd2986[]={1589,0},
+dd2987[]={1590,0},
+dd2988[]={1591,0},
+dd2989[]={1592,0},
+dd2990[]={1593,0},
+dd2991[]={1594,0},
+dd2992[]={1601,0},
+dd2993[]={1602,0},
+dd2994[]={1603,0},
+dd2995[]={1604,0},
+dd2996[]={1605,0},
+dd2997[]={1606,0},
+dd2998[]={1607,0},
+dd2999[]={1608,0},
+dd3000[]={1610,0},
+dd3001[]={1604,1570,0},
+dd3002[]={1604,1571,0},
+dd3003[]={1604,1573,0},
+dd3004[]={1604,1575,0},
+dd3005[]={34,0},
+dd3006[]={39,0},
+dd3007[]={47,0},
+dd3008[]={94,0},
+dd3009[]={124,0},
+dd3010[]={126,0},
+dd3011[]={10629,0},
+dd3012[]={10630,0},
+dd3013[]={12539,0},
+dd3014[]={12449,0},
+dd3015[]={12451,0},
+dd3016[]={12453,0},
+dd3017[]={12455,0},
+dd3018[]={12457,0},
+dd3019[]={12515,0},
+dd3020[]={12517,0},
+dd3021[]={12519,0},
+dd3022[]={12483,0},
+dd3023[]={12540,0},
+dd3024[]={12531,0},
+dd3025[]={12441,0},
+dd3026[]={12442,0},
+dd3027[]={12644,0},
+dd3028[]={12593,0},
+dd3029[]={12594,0},
+dd3030[]={12595,0},
+dd3031[]={12596,0},
+dd3032[]={12597,0},
+dd3033[]={12598,0},
+dd3034[]={12599,0},
+dd3035[]={12600,0},
+dd3036[]={12601,0},
+dd3037[]={12602,0},
+dd3038[]={12603,0},
+dd3039[]={12604,0},
+dd3040[]={12605,0},
+dd3041[]={12606,0},
+dd3042[]={12607,0},
+dd3043[]={12608,0},
+dd3044[]={12609,0},
+dd3045[]={12610,0},
+dd3046[]={12611,0},
+dd3047[]={12612,0},
+dd3048[]={12613,0},
+dd3049[]={12614,0},
+dd3050[]={12615,0},
+dd3051[]={12616,0},
+dd3052[]={12617,0},
+dd3053[]={12618,0},
+dd3054[]={12619,0},
+dd3055[]={12620,0},
+dd3056[]={12621,0},
+dd3057[]={12622,0},
+dd3058[]={12623,0},
+dd3059[]={12624,0},
+dd3060[]={12625,0},
+dd3061[]={12626,0},
+dd3062[]={12627,0},
+dd3063[]={12628,0},
+dd3064[]={12629,0},
+dd3065[]={12630,0},
+dd3066[]={12631,0},
+dd3067[]={12632,0},
+dd3068[]={12633,0},
+dd3069[]={12634,0},
+dd3070[]={12635,0},
+dd3071[]={12636,0},
+dd3072[]={12637,0},
+dd3073[]={12638,0},
+dd3074[]={12639,0},
+dd3075[]={12640,0},
+dd3076[]={12641,0},
+dd3077[]={12642,0},
+dd3078[]={12643,0},
+dd3079[]={162,0},
+dd3080[]={163,0},
+dd3081[]={172,0},
+dd3082[]={175,0},
+dd3083[]={166,0},
+dd3084[]={165,0},
+dd3085[]={8361,0},
+dd3086[]={9474,0},
+dd3087[]={8592,0},
+dd3088[]={8593,0},
+dd3089[]={8594,0},
+dd3090[]={8595,0},
+dd3091[]={9632,0},
+dd3092[]={9675,0},
+dd3093[]={69785,69818,0},
+dd3094[]={69787,69818,0},
+dd3095[]={69797,69818,0},
+dd3096[]={119127,119141,0},
+dd3097[]={119128,119141,0},
+dd3098[]={119135,119150,0},
+dd3099[]={119135,119151,0},
+dd3100[]={119135,119152,0},
+dd3101[]={119135,119153,0},
+dd3102[]={119135,119154,0},
+dd3103[]={119225,119141,0},
+dd3104[]={119226,119141,0},
+dd3105[]={119227,119150,0},
+dd3106[]={119228,119150,0},
+dd3107[]={119227,119151,0},
+dd3108[]={119228,119151,0},
+dd3109[]={305,0},
+dd3110[]={567,0},
+dd3111[]={913,0},
+dd3112[]={914,0},
+dd3113[]={916,0},
+dd3114[]={917,0},
+dd3115[]={918,0},
+dd3116[]={919,0},
+dd3117[]={921,0},
+dd3118[]={922,0},
+dd3119[]={923,0},
+dd3120[]={924,0},
+dd3121[]={925,0},
+dd3122[]={926,0},
+dd3123[]={927,0},
+dd3124[]={929,0},
+dd3125[]={1012,0},
+dd3126[]={932,0},
+dd3127[]={934,0},
+dd3128[]={935,0},
+dd3129[]={936,0},
+dd3130[]={8711,0},
+dd3131[]={945,0},
+dd3132[]={950,0},
+dd3133[]={951,0},
+dd3134[]={955,0},
+dd3135[]={957,0},
+dd3136[]={958,0},
+dd3137[]={959,0},
+dd3138[]={963,0},
+dd3139[]={964,0},
+dd3140[]={965,0},
+dd3141[]={968,0},
+dd3142[]={969,0},
+dd3143[]={8706,0},
+dd3144[]={1013,0},
+dd3145[]={977,0},
+dd3146[]={1008,0},
+dd3147[]={981,0},
+dd3148[]={1009,0},
+dd3149[]={982,0},
+dd3150[]={988,0},
+dd3151[]={989,0},
+dd3152[]={48,46,0},
+dd3153[]={48,44,0},
+dd3154[]={49,44,0},
+dd3155[]={50,44,0},
+dd3156[]={51,44,0},
+dd3157[]={52,44,0},
+dd3158[]={53,44,0},
+dd3159[]={54,44,0},
+dd3160[]={55,44,0},
+dd3161[]={56,44,0},
+dd3162[]={57,44,0},
+dd3163[]={40,65,41,0},
+dd3164[]={40,66,41,0},
+dd3165[]={40,67,41,0},
+dd3166[]={40,68,41,0},
+dd3167[]={40,69,41,0},
+dd3168[]={40,70,41,0},
+dd3169[]={40,71,41,0},
+dd3170[]={40,72,41,0},
+dd3171[]={40,73,41,0},
+dd3172[]={40,74,41,0},
+dd3173[]={40,75,41,0},
+dd3174[]={40,76,41,0},
+dd3175[]={40,77,41,0},
+dd3176[]={40,78,41,0},
+dd3177[]={40,79,41,0},
+dd3178[]={40,80,41,0},
+dd3179[]={40,81,41,0},
+dd3180[]={40,82,41,0},
+dd3181[]={40,83,41,0},
+dd3182[]={40,84,41,0},
+dd3183[]={40,85,41,0},
+dd3184[]={40,86,41,0},
+dd3185[]={40,87,41,0},
+dd3186[]={40,88,41,0},
+dd3187[]={40,89,41,0},
+dd3188[]={40,90,41,0},
+dd3189[]={12308,83,12309,0},
+dd3190[]={67,68,0},
+dd3191[]={87,90,0},
+dd3192[]={72,86,0},
+dd3193[]={83,68,0},
+dd3194[]={83,83,0},
+dd3195[]={80,80,86,0},
+dd3196[]={87,67,0},
+dd3197[]={68,74,0},
+dd3198[]={12411,12363,0},
+dd3199[]={12467,12467,0},
+dd3200[]={23383,0},
+dd3201[]={21452,0},
+dd3202[]={12487,0},
+dd3203[]={22810,0},
+dd3204[]={35299,0},
+dd3205[]={20132,0},
+dd3206[]={26144,0},
+dd3207[]={28961,0},
+dd3208[]={21069,0},
+dd3209[]={24460,0},
+dd3210[]={20877,0},
+dd3211[]={26032,0},
+dd3212[]={21021,0},
+dd3213[]={32066,0},
+dd3214[]={36009,0},
+dd3215[]={22768,0},
+dd3216[]={21561,0},
+dd3217[]={28436,0},
+dd3218[]={25237,0},
+dd3219[]={25429,0},
+dd3220[]={36938,0},
+dd3221[]={25351,0},
+dd3222[]={25171,0},
+dd3223[]={31105,0},
+dd3224[]={31354,0},
+dd3225[]={21512,0},
+dd3226[]={28288,0},
+dd3227[]={30003,0},
+dd3228[]={21106,0},
+dd3229[]={21942,0},
+dd3230[]={12308,26412,12309,0},
+dd3231[]={12308,19977,12309,0},
+dd3232[]={12308,20108,12309,0},
+dd3233[]={12308,23433,12309,0},
+dd3234[]={12308,28857,12309,0},
+dd3235[]={12308,25171,12309,0},
+dd3236[]={12308,30423,12309,0},
+dd3237[]={12308,21213,12309,0},
+dd3238[]={12308,25943,12309,0},
+dd3239[]={24471,0},
+dd3240[]={21487,0},
+dd3241[]={20029,0},
+dd3242[]={20024,0},
+dd3243[]={20033,0},
+dd3244[]={131362,0},
+dd3245[]={20320,0},
+dd3246[]={20411,0},
+dd3247[]={20482,0},
+dd3248[]={20602,0},
+dd3249[]={20633,0},
+dd3250[]={20687,0},
+dd3251[]={13470,0},
+dd3252[]={132666,0},
+dd3253[]={20820,0},
+dd3254[]={20836,0},
+dd3255[]={20855,0},
+dd3256[]={132380,0},
+dd3257[]={13497,0},
+dd3258[]={20839,0},
+dd3259[]={132427,0},
+dd3260[]={20887,0},
+dd3261[]={20900,0},
+dd3262[]={20172,0},
+dd3263[]={20908,0},
+dd3264[]={168415,0},
+dd3265[]={20995,0},
+dd3266[]={13535,0},
+dd3267[]={21051,0},
+dd3268[]={21062,0},
+dd3269[]={21111,0},
+dd3270[]={13589,0},
+dd3271[]={21253,0},
+dd3272[]={21254,0},
+dd3273[]={21321,0},
+dd3274[]={21338,0},
+dd3275[]={21363,0},
+dd3276[]={21373,0},
+dd3277[]={21375,0},
+dd3278[]={133676,0},
+dd3279[]={28784,0},
+dd3280[]={21450,0},
+dd3281[]={21471,0},
+dd3282[]={133987,0},
+dd3283[]={21483,0},
+dd3284[]={21489,0},
+dd3285[]={21510,0},
+dd3286[]={21662,0},
+dd3287[]={21560,0},
+dd3288[]={21576,0},
+dd3289[]={21608,0},
+dd3290[]={21666,0},
+dd3291[]={21750,0},
+dd3292[]={21776,0},
+dd3293[]={21843,0},
+dd3294[]={21859,0},
+dd3295[]={21892,0},
+dd3296[]={21931,0},
+dd3297[]={21939,0},
+dd3298[]={21954,0},
+dd3299[]={22294,0},
+dd3300[]={22295,0},
+dd3301[]={22097,0},
+dd3302[]={22132,0},
+dd3303[]={22766,0},
+dd3304[]={22478,0},
+dd3305[]={22516,0},
+dd3306[]={22541,0},
+dd3307[]={22411,0},
+dd3308[]={22578,0},
+dd3309[]={22577,0},
+dd3310[]={22700,0},
+dd3311[]={136420,0},
+dd3312[]={22770,0},
+dd3313[]={22775,0},
+dd3314[]={22790,0},
+dd3315[]={22818,0},
+dd3316[]={22882,0},
+dd3317[]={136872,0},
+dd3318[]={136938,0},
+dd3319[]={23020,0},
+dd3320[]={23067,0},
+dd3321[]={23079,0},
+dd3322[]={23000,0},
+dd3323[]={23142,0},
+dd3324[]={14062,0},
+dd3325[]={14076,0},
+dd3326[]={23304,0},
+dd3327[]={23358,0},
+dd3328[]={137672,0},
+dd3329[]={23491,0},
+dd3330[]={23512,0},
+dd3331[]={23539,0},
+dd3332[]={138008,0},
+dd3333[]={23551,0},
+dd3334[]={23558,0},
+dd3335[]={24403,0},
+dd3336[]={14209,0},
+dd3337[]={23648,0},
+dd3338[]={23744,0},
+dd3339[]={23693,0},
+dd3340[]={138724,0},
+dd3341[]={23875,0},
+dd3342[]={138726,0},
+dd3343[]={23918,0},
+dd3344[]={23915,0},
+dd3345[]={23932,0},
+dd3346[]={24033,0},
+dd3347[]={24034,0},
+dd3348[]={14383,0},
+dd3349[]={24061,0},
+dd3350[]={24104,0},
+dd3351[]={24125,0},
+dd3352[]={24169,0},
+dd3353[]={14434,0},
+dd3354[]={139651,0},
+dd3355[]={14460,0},
+dd3356[]={24240,0},
+dd3357[]={24243,0},
+dd3358[]={24246,0},
+dd3359[]={172946,0},
+dd3360[]={140081,0},
+dd3361[]={33281,0},
+dd3362[]={24354,0},
+dd3363[]={14535,0},
+dd3364[]={144056,0},
+dd3365[]={156122,0},
+dd3366[]={24418,0},
+dd3367[]={24427,0},
+dd3368[]={14563,0},
+dd3369[]={24474,0},
+dd3370[]={24525,0},
+dd3371[]={24535,0},
+dd3372[]={24569,0},
+dd3373[]={24705,0},
+dd3374[]={14650,0},
+dd3375[]={14620,0},
+dd3376[]={141012,0},
+dd3377[]={24775,0},
+dd3378[]={24904,0},
+dd3379[]={24908,0},
+dd3380[]={24954,0},
+dd3381[]={25010,0},
+dd3382[]={24996,0},
+dd3383[]={25007,0},
+dd3384[]={25054,0},
+dd3385[]={25104,0},
+dd3386[]={25115,0},
+dd3387[]={25181,0},
+dd3388[]={25265,0},
+dd3389[]={25300,0},
+dd3390[]={25424,0},
+dd3391[]={142092,0},
+dd3392[]={25405,0},
+dd3393[]={25340,0},
+dd3394[]={25448,0},
+dd3395[]={25475,0},
+dd3396[]={25572,0},
+dd3397[]={142321,0},
+dd3398[]={25634,0},
+dd3399[]={25541,0},
+dd3400[]={25513,0},
+dd3401[]={14894,0},
+dd3402[]={25705,0},
+dd3403[]={25726,0},
+dd3404[]={25757,0},
+dd3405[]={25719,0},
+dd3406[]={14956,0},
+dd3407[]={25964,0},
+dd3408[]={143370,0},
+dd3409[]={26083,0},
+dd3410[]={26360,0},
+dd3411[]={26185,0},
+dd3412[]={15129,0},
+dd3413[]={15112,0},
+dd3414[]={15076,0},
+dd3415[]={20882,0},
+dd3416[]={20885,0},
+dd3417[]={26368,0},
+dd3418[]={26268,0},
+dd3419[]={32941,0},
+dd3420[]={17369,0},
+dd3421[]={26401,0},
+dd3422[]={26462,0},
+dd3423[]={26451,0},
+dd3424[]={144323,0},
+dd3425[]={15177,0},
+dd3426[]={26618,0},
+dd3427[]={26501,0},
+dd3428[]={26706,0},
+dd3429[]={144493,0},
+dd3430[]={26766,0},
+dd3431[]={26655,0},
+dd3432[]={26900,0},
+dd3433[]={26946,0},
+dd3434[]={27043,0},
+dd3435[]={27114,0},
+dd3436[]={27304,0},
+dd3437[]={145059,0},
+dd3438[]={27355,0},
+dd3439[]={15384,0},
+dd3440[]={27425,0},
+dd3441[]={145575,0},
+dd3442[]={27476,0},
+dd3443[]={15438,0},
+dd3444[]={27506,0},
+dd3445[]={27551,0},
+dd3446[]={27579,0},
+dd3447[]={146061,0},
+dd3448[]={138507,0},
+dd3449[]={146170,0},
+dd3450[]={27726,0},
+dd3451[]={146620,0},
+dd3452[]={27839,0},
+dd3453[]={27853,0},
+dd3454[]={27751,0},
+dd3455[]={27926,0},
+dd3456[]={27966,0},
+dd3457[]={28009,0},
+dd3458[]={28024,0},
+dd3459[]={28037,0},
+dd3460[]={146718,0},
+dd3461[]={27956,0},
+dd3462[]={28207,0},
+dd3463[]={28270,0},
+dd3464[]={15667,0},
+dd3465[]={28359,0},
+dd3466[]={147153,0},
+dd3467[]={28153,0},
+dd3468[]={28526,0},
+dd3469[]={147294,0},
+dd3470[]={147342,0},
+dd3471[]={28614,0},
+dd3472[]={28729,0},
+dd3473[]={28699,0},
+dd3474[]={15766,0},
+dd3475[]={28746,0},
+dd3476[]={28797,0},
+dd3477[]={28791,0},
+dd3478[]={28845,0},
+dd3479[]={132389,0},
+dd3480[]={28997,0},
+dd3481[]={148067,0},
+dd3482[]={29084,0},
+dd3483[]={148395,0},
+dd3484[]={29224,0},
+dd3485[]={29264,0},
+dd3486[]={149000,0},
+dd3487[]={29312,0},
+dd3488[]={29333,0},
+dd3489[]={149301,0},
+dd3490[]={149524,0},
+dd3491[]={29562,0},
+dd3492[]={29579,0},
+dd3493[]={16044,0},
+dd3494[]={29605,0},
+dd3495[]={16056,0},
+dd3496[]={29767,0},
+dd3497[]={29788,0},
+dd3498[]={29829,0},
+dd3499[]={29898,0},
+dd3500[]={16155,0},
+dd3501[]={29988,0},
+dd3502[]={150582,0},
+dd3503[]={30014,0},
+dd3504[]={150674,0},
+dd3505[]={139679,0},
+dd3506[]={30224,0},
+dd3507[]={151457,0},
+dd3508[]={151480,0},
+dd3509[]={151620,0},
+dd3510[]={16380,0},
+dd3511[]={16392,0},
+dd3512[]={151795,0},
+dd3513[]={151794,0},
+dd3514[]={151833,0},
+dd3515[]={151859,0},
+dd3516[]={30494,0},
+dd3517[]={30495,0},
+dd3518[]={30603,0},
+dd3519[]={16454,0},
+dd3520[]={16534,0},
+dd3521[]={152605,0},
+dd3522[]={30798,0},
+dd3523[]={16611,0},
+dd3524[]={153126,0},
+dd3525[]={153242,0},
+dd3526[]={153285,0},
+dd3527[]={31211,0},
+dd3528[]={16687,0},
+dd3529[]={31306,0},
+dd3530[]={31311,0},
+dd3531[]={153980,0},
+dd3532[]={154279,0},
+dd3533[]={31470,0},
+dd3534[]={16898,0},
+dd3535[]={154539,0},
+dd3536[]={31686,0},
+dd3537[]={31689,0},
+dd3538[]={16935,0},
+dd3539[]={154752,0},
+dd3540[]={31954,0},
+dd3541[]={17056,0},
+dd3542[]={31976,0},
+dd3543[]={31971,0},
+dd3544[]={32000,0},
+dd3545[]={155526,0},
+dd3546[]={32099,0},
+dd3547[]={17153,0},
+dd3548[]={32199,0},
+dd3549[]={32258,0},
+dd3550[]={32325,0},
+dd3551[]={17204,0},
+dd3552[]={156200,0},
+dd3553[]={156231,0},
+dd3554[]={17241,0},
+dd3555[]={156377,0},
+dd3556[]={32634,0},
+dd3557[]={156478,0},
+dd3558[]={32661,0},
+dd3559[]={32762,0},
+dd3560[]={156890,0},
+dd3561[]={156963,0},
+dd3562[]={32864,0},
+dd3563[]={157096,0},
+dd3564[]={32880,0},
+dd3565[]={144223,0},
+dd3566[]={17365,0},
+dd3567[]={32946,0},
+dd3568[]={33027,0},
+dd3569[]={17419,0},
+dd3570[]={33086,0},
+dd3571[]={23221,0},
+dd3572[]={157607,0},
+dd3573[]={157621,0},
+dd3574[]={144275,0},
+dd3575[]={144284,0},
+dd3576[]={33284,0},
+dd3577[]={36766,0},
+dd3578[]={17515,0},
+dd3579[]={33425,0},
+dd3580[]={33419,0},
+dd3581[]={33437,0},
+dd3582[]={21171,0},
+dd3583[]={33457,0},
+dd3584[]={33459,0},
+dd3585[]={33469,0},
+dd3586[]={33510,0},
+dd3587[]={158524,0},
+dd3588[]={33565,0},
+dd3589[]={33635,0},
+dd3590[]={33709,0},
+dd3591[]={33571,0},
+dd3592[]={33725,0},
+dd3593[]={33767,0},
+dd3594[]={33619,0},
+dd3595[]={33738,0},
+dd3596[]={33740,0},
+dd3597[]={33756,0},
+dd3598[]={158774,0},
+dd3599[]={159083,0},
+dd3600[]={158933,0},
+dd3601[]={17707,0},
+dd3602[]={34033,0},
+dd3603[]={34035,0},
+dd3604[]={34070,0},
+dd3605[]={160714,0},
+dd3606[]={34148,0},
+dd3607[]={159532,0},
+dd3608[]={17757,0},
+dd3609[]={17761,0},
+dd3610[]={159665,0},
+dd3611[]={159954,0},
+dd3612[]={17771,0},
+dd3613[]={34384,0},
+dd3614[]={34407,0},
+dd3615[]={34409,0},
+dd3616[]={34473,0},
+dd3617[]={34440,0},
+dd3618[]={34574,0},
+dd3619[]={34530,0},
+dd3620[]={34600,0},
+dd3621[]={34667,0},
+dd3622[]={34694,0},
+dd3623[]={17879,0},
+dd3624[]={34785,0},
+dd3625[]={34817,0},
+dd3626[]={17913,0},
+dd3627[]={34912,0},
+dd3628[]={161383,0},
+dd3629[]={35031,0},
+dd3630[]={35038,0},
+dd3631[]={17973,0},
+dd3632[]={35066,0},
+dd3633[]={13499,0},
+dd3634[]={161966,0},
+dd3635[]={162150,0},
+dd3636[]={18110,0},
+dd3637[]={18119,0},
+dd3638[]={35488,0},
+dd3639[]={162984,0},
+dd3640[]={36011,0},
+dd3641[]={36033,0},
+dd3642[]={36123,0},
+dd3643[]={36215,0},
+dd3644[]={163631,0},
+dd3645[]={133124,0},
+dd3646[]={36299,0},
+dd3647[]={36284,0},
+dd3648[]={36336,0},
+dd3649[]={133342,0},
+dd3650[]={36564,0},
+dd3651[]={165330,0},
+dd3652[]={165357,0},
+dd3653[]={37012,0},
+dd3654[]={37105,0},
+dd3655[]={37137,0},
+dd3656[]={165678,0},
+dd3657[]={37147,0},
+dd3658[]={37432,0},
+dd3659[]={37591,0},
+dd3660[]={37592,0},
+dd3661[]={37500,0},
+dd3662[]={37881,0},
+dd3663[]={37909,0},
+dd3664[]={166906,0},
+dd3665[]={38283,0},
+dd3666[]={18837,0},
+dd3667[]={38327,0},
+dd3668[]={167287,0},
+dd3669[]={18918,0},
+dd3670[]={38595,0},
+dd3671[]={23986,0},
+dd3672[]={38691,0},
+dd3673[]={168261,0},
+dd3674[]={168474,0},
+dd3675[]={19054,0},
+dd3676[]={19062,0},
+dd3677[]={38880,0},
+dd3678[]={168970,0},
+dd3679[]={19122,0},
+dd3680[]={169110,0},
+dd3681[]={38953,0},
+dd3682[]={169398,0},
+dd3683[]={39138,0},
+dd3684[]={19251,0},
+dd3685[]={39209,0},
+dd3686[]={39335,0},
+dd3687[]={39362,0},
+dd3688[]={39422,0},
+dd3689[]={19406,0},
+dd3690[]={170800,0},
+dd3691[]={40000,0},
+dd3692[]={40189,0},
+dd3693[]={19662,0},
+dd3694[]={19693,0},
+dd3695[]={40295,0},
+dd3696[]={172238,0},
+dd3697[]={19704,0},
+dd3698[]={172293,0},
+dd3699[]={172558,0},
+dd3700[]={172689,0},
+dd3701[]={19798,0},
+dd3702[]={40702,0},
+dd3703[]={40709,0},
+dd3704[]={40719,0},
+dd3705[]={40726,0},
+dd3706[]={173568,0},
+dd3707[]={8814,0},
+dd3708[]={8800,0},
+dd3709[]={8815,0},
+dd3710[]={192,193,194,195,196,197,256,258,260,461,512,514,550,7680,7840,7842,0},
+dd3711[]={7682,7684,7686,0},
+dd3712[]={199,262,264,266,268,0},
+dd3713[]={270,7690,7692,7694,7696,7698,0},
+dd3714[]={200,201,202,203,274,276,278,280,282,516,518,552,7704,7706,7864,7866,7868,0},
+dd3715[]={7710,0},
+dd3716[]={284,286,288,290,486,500,7712,0},
+dd3717[]={292,542,7714,7716,7718,7720,7722,0},
+dd3718[]={204,205,206,207,296,298,300,302,304,463,520,522,7724,7880,7882,0},
+dd3719[]={308,0},
+dd3720[]={310,488,7728,7730,7732,0},
+dd3721[]={313,315,317,7734,7738,7740,0},
+dd3722[]={7742,7744,7746,0},
+dd3723[]={209,323,325,327,504,7748,7750,7752,7754,0},
+dd3724[]={210,211,212,213,214,332,334,336,416,465,490,524,526,558,7884,7886,0},
+dd3725[]={7764,7766,0},
+dd3726[]={340,342,344,528,530,7768,7770,7774,0},
+dd3727[]={346,348,350,352,536,7776,7778,0},
+dd3728[]={354,356,538,7786,7788,7790,7792,0},
+dd3729[]={217,218,219,220,360,362,364,366,368,370,431,467,532,534,7794,7796,7798,7908,7910,0},
+dd3730[]={7804,7806,0},
+dd3731[]={372,7808,7810,7812,7814,7816,0},
+dd3732[]={7818,7820,0},
+dd3733[]={221,374,376,562,7822,7922,7924,7926,7928,0},
+dd3734[]={377,379,381,7824,7826,7828,0},
+dd3735[]={224,225,226,227,228,229,257,259,261,462,513,515,551,7681,7841,7843,0},
+dd3736[]={7683,7685,7687,0},
+dd3737[]={231,263,265,267,269,0},
+dd3738[]={271,7691,7693,7695,7697,7699,0},
+dd3739[]={232,233,234,235,275,277,279,281,283,517,519,553,7705,7707,7865,7867,7869,0},
+dd3740[]={7711,0},
+dd3741[]={285,287,289,291,487,501,7713,0},
+dd3742[]={293,543,7715,7717,7719,7721,7723,7830,0},
+dd3743[]={236,237,238,239,297,299,301,303,464,521,523,7725,7881,7883,0},
+dd3744[]={309,496,0},
+dd3745[]={311,489,7729,7731,7733,0},
+dd3746[]={314,316,318,7735,7739,7741,0},
+dd3747[]={7743,7745,7747,0},
+dd3748[]={241,324,326,328,505,7749,7751,7753,7755,0},
+dd3749[]={242,243,244,245,246,333,335,337,417,466,491,525,527,559,7885,7887,0},
+dd3750[]={7765,7767,0},
+dd3751[]={341,343,345,529,531,7769,7771,7775,0},
+dd3752[]={347,349,351,353,537,7777,7779,0},
+dd3753[]={355,357,539,7787,7789,7791,7793,7831,0},
+dd3754[]={249,250,251,252,361,363,365,367,369,371,432,468,533,535,7795,7797,7799,7909,7911,0},
+dd3755[]={7805,7807,0},
+dd3756[]={373,7809,7811,7813,7815,7817,7832,0},
+dd3757[]={7819,7821,0},
+dd3758[]={253,255,375,563,7823,7833,7923,7925,7927,7929,0},
+dd3759[]={378,380,382,7825,7827,7829,0},
+dd3760[]={901,8129,8173,0},
+dd3761[]={7844,7846,7848,7850,0},
+dd3762[]={478,0},
+dd3763[]={506,0},
+dd3764[]={482,508,0},
+dd3765[]={7688,0},
+dd3766[]={7870,7872,7874,7876,0},
+dd3767[]={7726,0},
+dd3768[]={7888,7890,7892,7894,0},
+dd3769[]={556,7756,7758,0},
+dd3770[]={554,0},
+dd3771[]={510,0},
+dd3772[]={469,471,473,475,0},
+dd3773[]={7845,7847,7849,7851,0},
+dd3774[]={479,0},
+dd3775[]={507,0},
+dd3776[]={483,509,0},
+dd3777[]={7689,0},
+dd3778[]={7871,7873,7875,7877,0},
+dd3779[]={7727,0},
+dd3780[]={7889,7891,7893,7895,0},
+dd3781[]={557,7757,7759,0},
+dd3782[]={555,0},
+dd3783[]={511,0},
+dd3784[]={470,472,474,476,0},
+dd3785[]={7854,7856,7858,7860,0},
+dd3786[]={7855,7857,7859,7861,0},
+dd3787[]={7700,7702,0},
+dd3788[]={7701,7703,0},
+dd3789[]={7760,7762,0},
+dd3790[]={7761,7763,0},
+dd3791[]={7780,0},
+dd3792[]={7781,0},
+dd3793[]={7782,0},
+dd3794[]={7783,0},
+dd3795[]={7800,0},
+dd3796[]={7801,0},
+dd3797[]={7802,0},
+dd3798[]={7803,0},
+dd3799[]={7835,0},
+dd3800[]={7898,7900,7902,7904,7906,0},
+dd3801[]={7899,7901,7903,7905,7907,0},
+dd3802[]={7912,7914,7916,7918,7920,0},
+dd3803[]={7913,7915,7917,7919,7921,0},
+dd3804[]={494,0},
+dd3805[]={492,0},
+dd3806[]={493,0},
+dd3807[]={480,0},
+dd3808[]={481,0},
+dd3809[]={7708,0},
+dd3810[]={7709,0},
+dd3811[]={560,0},
+dd3812[]={561,0},
+dd3813[]={495,0},
+dd3814[]={902,7944,7945,8120,8121,8122,8124,0},
+dd3815[]={904,7960,7961,8136,0},
+dd3816[]={905,7976,7977,8138,8140,0},
+dd3817[]={906,938,7992,7993,8152,8153,8154,0},
+dd3818[]={908,8008,8009,8184,0},
+dd3819[]={8172,0},
+dd3820[]={910,939,8025,8168,8169,8170,0},
+dd3821[]={911,8040,8041,8186,8188,0},
+dd3822[]={8116,0},
+dd3823[]={8132,0},
+dd3824[]={940,7936,7937,8048,8112,8113,8115,8118,0},
+dd3825[]={941,7952,7953,8050,0},
+dd3826[]={942,7968,7969,8052,8131,8134,0},
+dd3827[]={943,970,7984,7985,8054,8144,8145,8150,0},
+dd3828[]={972,8000,8001,8056,0},
+dd3829[]={8164,8165,0},
+dd3830[]={971,973,8016,8017,8058,8160,8161,8166,0},
+dd3831[]={974,8032,8033,8060,8179,8182,0},
+dd3832[]={912,8146,8151,0},
+dd3833[]={944,8162,8167,0},
+dd3834[]={8180,0},
+dd3835[]={979,980,0},
+dd3836[]={1031,0},
+dd3837[]={1232,1234,0},
+dd3838[]={1027,0},
+dd3839[]={1024,1025,1238,0},
+dd3840[]={1217,1244,0},
+dd3841[]={1246,0},
+dd3842[]={1037,1049,1250,1252,0},
+dd3843[]={1036,0},
+dd3844[]={1254,0},
+dd3845[]={1038,1262,1264,1266,0},
+dd3846[]={1268,0},
+dd3847[]={1272,0},
+dd3848[]={1260,0},
+dd3849[]={1233,1235,0},
+dd3850[]={1107,0},
+dd3851[]={1104,1105,1239,0},
+dd3852[]={1218,1245,0},
+dd3853[]={1247,0},
+dd3854[]={1081,1117,1251,1253,0},
+dd3855[]={1116,0},
+dd3856[]={1255,0},
+dd3857[]={1118,1263,1265,1267,0},
+dd3858[]={1269,0},
+dd3859[]={1273,0},
+dd3860[]={1261,0},
+dd3861[]={1111,0},
+dd3862[]={1142,0},
+dd3863[]={1143,0},
+dd3864[]={1242,0},
+dd3865[]={1243,0},
+dd3866[]={1258,0},
+dd3867[]={1259,0},
+dd3868[]={1570,1571,1573,0},
+dd3869[]={1730,0},
+dd3870[]={2345,0},
+dd3871[]={2353,0},
+dd3872[]={2356,0},
+dd3873[]={2507,2508,0},
+dd3874[]={2888,2891,2892,0},
+dd3875[]={2964,0},
+dd3876[]={3018,3020,0},
+dd3877[]={3019,0},
+dd3878[]={3144,0},
+dd3879[]={3264,0},
+dd3880[]={3271,3272,3274,0},
+dd3881[]={3275,0},
+dd3882[]={3402,3404,0},
+dd3883[]={3403,0},
+dd3884[]={3546,3548,3550,0},
+dd3885[]={3549,0},
+dd3886[]={4134,0},
+dd3887[]={6918,0},
+dd3888[]={6920,0},
+dd3889[]={6922,0},
+dd3890[]={6924,0},
+dd3891[]={6926,0},
+dd3892[]={6930,0},
+dd3893[]={6971,0},
+dd3894[]={6973,0},
+dd3895[]={6976,0},
+dd3896[]={6977,0},
+dd3897[]={6979,0},
+dd3898[]={7736,0},
+dd3899[]={7737,0},
+dd3900[]={7772,0},
+dd3901[]={7773,0},
+dd3902[]={7784,0},
+dd3903[]={7785,0},
+dd3904[]={7852,7862,0},
+dd3905[]={7853,7863,0},
+dd3906[]={7878,0},
+dd3907[]={7879,0},
+dd3908[]={7896,0},
+dd3909[]={7897,0},
+dd3910[]={7938,7940,7942,8064,0},
+dd3911[]={7939,7941,7943,8065,0},
+dd3912[]={8066,0},
+dd3913[]={8067,0},
+dd3914[]={8068,0},
+dd3915[]={8069,0},
+dd3916[]={8070,0},
+dd3917[]={8071,0},
+dd3918[]={7946,7948,7950,8072,0},
+dd3919[]={7947,7949,7951,8073,0},
+dd3920[]={8074,0},
+dd3921[]={8075,0},
+dd3922[]={8076,0},
+dd3923[]={8077,0},
+dd3924[]={8078,0},
+dd3925[]={8079,0},
+dd3926[]={7954,7956,0},
+dd3927[]={7955,7957,0},
+dd3928[]={7962,7964,0},
+dd3929[]={7963,7965,0},
+dd3930[]={7970,7972,7974,8080,0},
+dd3931[]={7971,7973,7975,8081,0},
+dd3932[]={8082,0},
+dd3933[]={8083,0},
+dd3934[]={8084,0},
+dd3935[]={8085,0},
+dd3936[]={8086,0},
+dd3937[]={8087,0},
+dd3938[]={7978,7980,7982,8088,0},
+dd3939[]={7979,7981,7983,8089,0},
+dd3940[]={8090,0},
+dd3941[]={8091,0},
+dd3942[]={8092,0},
+dd3943[]={8093,0},
+dd3944[]={8094,0},
+dd3945[]={8095,0},
+dd3946[]={7986,7988,7990,0},
+dd3947[]={7987,7989,7991,0},
+dd3948[]={7994,7996,7998,0},
+dd3949[]={7995,7997,7999,0},
+dd3950[]={8002,8004,0},
+dd3951[]={8003,8005,0},
+dd3952[]={8010,8012,0},
+dd3953[]={8011,8013,0},
+dd3954[]={8018,8020,8022,0},
+dd3955[]={8019,8021,8023,0},
+dd3956[]={8027,8029,8031,0},
+dd3957[]={8034,8036,8038,8096,0},
+dd3958[]={8035,8037,8039,8097,0},
+dd3959[]={8098,0},
+dd3960[]={8099,0},
+dd3961[]={8100,0},
+dd3962[]={8101,0},
+dd3963[]={8102,0},
+dd3964[]={8103,0},
+dd3965[]={8042,8044,8046,8104,0},
+dd3966[]={8043,8045,8047,8105,0},
+dd3967[]={8106,0},
+dd3968[]={8107,0},
+dd3969[]={8108,0},
+dd3970[]={8109,0},
+dd3971[]={8110,0},
+dd3972[]={8111,0},
+dd3973[]={8114,0},
+dd3974[]={8130,0},
+dd3975[]={8178,0},
+dd3976[]={8119,0},
+dd3977[]={8141,8142,8143,0},
+dd3978[]={8135,0},
+dd3979[]={8183,0},
+dd3980[]={8157,8158,8159,0},
+dd3981[]={8602,0},
+dd3982[]={8603,0},
+dd3983[]={8622,0},
+dd3984[]={8653,0},
+dd3985[]={8655,0},
+dd3986[]={8654,0},
+dd3987[]={8708,0},
+dd3988[]={8713,0},
+dd3989[]={8716,0},
+dd3990[]={8740,0},
+dd3991[]={8742,0},
+dd3992[]={8769,0},
+dd3993[]={8772,0},
+dd3994[]={8775,0},
+dd3995[]={8777,0},
+dd3996[]={8813,0},
+dd3997[]={8802,0},
+dd3998[]={8816,0},
+dd3999[]={8817,0},
+dd4000[]={8820,0},
+dd4001[]={8821,0},
+dd4002[]={8824,0},
+dd4003[]={8825,0},
+dd4004[]={8832,0},
+dd4005[]={8833,0},
+dd4006[]={8928,0},
+dd4007[]={8929,0},
+dd4008[]={8836,0},
+dd4009[]={8837,0},
+dd4010[]={8840,0},
+dd4011[]={8841,0},
+dd4012[]={8930,0},
+dd4013[]={8931,0},
+dd4014[]={8876,0},
+dd4015[]={8877,0},
+dd4016[]={8878,0},
+dd4017[]={8879,0},
+dd4018[]={8938,0},
+dd4019[]={8939,0},
+dd4020[]={8940,0},
+dd4021[]={8941,0},
+dd4022[]={12436,0},
+dd4023[]={12364,0},
+dd4024[]={12366,0},
+dd4025[]={12368,0},
+dd4026[]={12370,0},
+dd4027[]={12372,0},
+dd4028[]={12374,0},
+dd4029[]={12376,0},
+dd4030[]={12378,0},
+dd4031[]={12380,0},
+dd4032[]={12382,0},
+dd4033[]={12384,0},
+dd4034[]={12386,0},
+dd4035[]={12389,0},
+dd4036[]={12391,0},
+dd4037[]={12393,0},
+dd4038[]={12400,12401,0},
+dd4039[]={12403,12404,0},
+dd4040[]={12406,12407,0},
+dd4041[]={12409,12410,0},
+dd4042[]={12412,12413,0},
+dd4043[]={12446,0},
+dd4044[]={12532,0},
+dd4045[]={12460,0},
+dd4046[]={12462,0},
+dd4047[]={12464,0},
+dd4048[]={12466,0},
+dd4049[]={12468,0},
+dd4050[]={12470,0},
+dd4051[]={12472,0},
+dd4052[]={12474,0},
+dd4053[]={12476,0},
+dd4054[]={12478,0},
+dd4055[]={12480,0},
+dd4056[]={12482,0},
+dd4057[]={12485,0},
+dd4058[]={12489,0},
+dd4059[]={12496,12497,0},
+dd4060[]={12499,12500,0},
+dd4061[]={12502,12503,0},
+dd4062[]={12505,12506,0},
+dd4063[]={12508,12509,0},
+dd4064[]={12535,0},
+dd4065[]={12536,0},
+dd4066[]={12537,0},
+dd4067[]={12538,0},
+dd4068[]={12542,0},
+dd4069[]={69786,0},
+dd4070[]={69788,0},
+dd4071[]={69803,0},
+dd4072[]={224,0},
+dd4073[]={225,0},
+dd4074[]={226,0},
+dd4075[]={227,0},
+dd4076[]={228,0},
+dd4077[]={229,0},
+dd4078[]={230,0},
+dd4079[]={231,0},
+dd4080[]={232,0},
+dd4081[]={233,0},
+dd4082[]={234,0},
+dd4083[]={235,0},
+dd4084[]={236,0},
+dd4085[]={237,0},
+dd4086[]={238,0},
+dd4087[]={239,0},
+dd4088[]={241,0},
+dd4089[]={242,0},
+dd4090[]={243,0},
+dd4091[]={244,0},
+dd4092[]={245,0},
+dd4093[]={246,0},
+dd4094[]={248,0},
+dd4095[]={249,0},
+dd4096[]={250,0},
+dd4097[]={251,0},
+dd4098[]={252,0},
+dd4099[]={253,0},
+dd4100[]={254,0},
+dd4101[]={115,115,0},
+dd4102[]={257,0},
+dd4103[]={259,0},
+dd4104[]={261,0},
+dd4105[]={263,0},
+dd4106[]={265,0},
+dd4107[]={267,0},
+dd4108[]={269,0},
+dd4109[]={271,0},
+dd4110[]={273,0},
+dd4111[]={275,0},
+dd4112[]={277,0},
+dd4113[]={279,0},
+dd4114[]={281,0},
+dd4115[]={283,0},
+dd4116[]={285,0},
+dd4117[]={287,0},
+dd4118[]={289,0},
+dd4119[]={291,0},
+dd4120[]={293,0},
+dd4121[]={297,0},
+dd4122[]={299,0},
+dd4123[]={301,0},
+dd4124[]={303,0},
+dd4125[]={105,775,0},
+dd4126[]={307,0},
+dd4127[]={309,0},
+dd4128[]={311,0},
+dd4129[]={314,0},
+dd4130[]={316,0},
+dd4131[]={318,0},
+dd4132[]={320,0},
+dd4133[]={322,0},
+dd4134[]={324,0},
+dd4135[]={326,0},
+dd4136[]={328,0},
+dd4137[]={333,0},
+dd4138[]={335,0},
+dd4139[]={337,0},
+dd4140[]={339,0},
+dd4141[]={341,0},
+dd4142[]={343,0},
+dd4143[]={345,0},
+dd4144[]={347,0},
+dd4145[]={349,0},
+dd4146[]={351,0},
+dd4147[]={353,0},
+dd4148[]={355,0},
+dd4149[]={357,0},
+dd4150[]={359,0},
+dd4151[]={361,0},
+dd4152[]={363,0},
+dd4153[]={365,0},
+dd4154[]={367,0},
+dd4155[]={369,0},
+dd4156[]={371,0},
+dd4157[]={373,0},
+dd4158[]={375,0},
+dd4159[]={255,0},
+dd4160[]={378,0},
+dd4161[]={380,0},
+dd4162[]={382,0},
+dd4163[]={595,0},
+dd4164[]={387,0},
+dd4165[]={389,0},
+dd4166[]={392,0},
+dd4167[]={598,0},
+dd4168[]={599,0},
+dd4169[]={396,0},
+dd4170[]={477,0},
+dd4171[]={402,0},
+dd4172[]={608,0},
+dd4173[]={409,0},
+dd4174[]={417,0},
+dd4175[]={419,0},
+dd4176[]={421,0},
+dd4177[]={640,0},
+dd4178[]={424,0},
+dd4179[]={429,0},
+dd4180[]={648,0},
+dd4181[]={432,0},
+dd4182[]={436,0},
+dd4183[]={438,0},
+dd4184[]={441,0},
+dd4185[]={445,0},
+dd4186[]={454,0},
+dd4187[]={457,0},
+dd4188[]={460,0},
+dd4189[]={462,0},
+dd4190[]={464,0},
+dd4191[]={466,0},
+dd4192[]={468,0},
+dd4193[]={470,0},
+dd4194[]={472,0},
+dd4195[]={474,0},
+dd4196[]={476,0},
+dd4197[]={483,0},
+dd4198[]={485,0},
+dd4199[]={487,0},
+dd4200[]={489,0},
+dd4201[]={491,0},
+dd4202[]={499,0},
+dd4203[]={501,0},
+dd4204[]={405,0},
+dd4205[]={447,0},
+dd4206[]={505,0},
+dd4207[]={509,0},
+dd4208[]={513,0},
+dd4209[]={515,0},
+dd4210[]={517,0},
+dd4211[]={519,0},
+dd4212[]={521,0},
+dd4213[]={523,0},
+dd4214[]={525,0},
+dd4215[]={527,0},
+dd4216[]={529,0},
+dd4217[]={531,0},
+dd4218[]={533,0},
+dd4219[]={535,0},
+dd4220[]={537,0},
+dd4221[]={539,0},
+dd4222[]={541,0},
+dd4223[]={543,0},
+dd4224[]={414,0},
+dd4225[]={547,0},
+dd4226[]={549,0},
+dd4227[]={551,0},
+dd4228[]={553,0},
+dd4229[]={557,0},
+dd4230[]={559,0},
+dd4231[]={563,0},
+dd4232[]={11365,0},
+dd4233[]={572,0},
+dd4234[]={410,0},
+dd4235[]={11366,0},
+dd4236[]={578,0},
+dd4237[]={384,0},
+dd4238[]={583,0},
+dd4239[]={585,0},
+dd4240[]={587,0},
+dd4241[]={589,0},
+dd4242[]={591,0},
+dd4243[]={881,0},
+dd4244[]={883,0},
+dd4245[]={887,0},
+dd4246[]={953,776,769,0},
+dd4247[]={970,0},
+dd4248[]={971,0},
+dd4249[]={965,776,769,0},
+dd4250[]={983,0},
+dd4251[]={985,0},
+dd4252[]={987,0},
+dd4253[]={991,0},
+dd4254[]={993,0},
+dd4255[]={995,0},
+dd4256[]={997,0},
+dd4257[]={999,0},
+dd4258[]={1001,0},
+dd4259[]={1003,0},
+dd4260[]={1005,0},
+dd4261[]={1007,0},
+dd4262[]={1016,0},
+dd4263[]={1010,0},
+dd4264[]={1019,0},
+dd4265[]={891,0},
+dd4266[]={892,0},
+dd4267[]={893,0},
+dd4268[]={1104,0},
+dd4269[]={1105,0},
+dd4270[]={1106,0},
+dd4271[]={1108,0},
+dd4272[]={1109,0},
+dd4273[]={1110,0},
+dd4274[]={1112,0},
+dd4275[]={1113,0},
+dd4276[]={1114,0},
+dd4277[]={1115,0},
+dd4278[]={1117,0},
+dd4279[]={1118,0},
+dd4280[]={1119,0},
+dd4281[]={1072,0},
+dd4282[]={1073,0},
+dd4283[]={1074,0},
+dd4284[]={1075,0},
+dd4285[]={1076,0},
+dd4286[]={1077,0},
+dd4287[]={1078,0},
+dd4288[]={1079,0},
+dd4289[]={1080,0},
+dd4290[]={1081,0},
+dd4291[]={1082,0},
+dd4292[]={1083,0},
+dd4293[]={1084,0},
+dd4294[]={1086,0},
+dd4295[]={1087,0},
+dd4296[]={1088,0},
+dd4297[]={1089,0},
+dd4298[]={1090,0},
+dd4299[]={1091,0},
+dd4300[]={1092,0},
+dd4301[]={1093,0},
+dd4302[]={1094,0},
+dd4303[]={1095,0},
+dd4304[]={1096,0},
+dd4305[]={1097,0},
+dd4306[]={1098,0},
+dd4307[]={1099,0},
+dd4308[]={1100,0},
+dd4309[]={1101,0},
+dd4310[]={1102,0},
+dd4311[]={1103,0},
+dd4312[]={1121,0},
+dd4313[]={1123,0},
+dd4314[]={1125,0},
+dd4315[]={1127,0},
+dd4316[]={1129,0},
+dd4317[]={1131,0},
+dd4318[]={1133,0},
+dd4319[]={1135,0},
+dd4320[]={1137,0},
+dd4321[]={1139,0},
+dd4322[]={1141,0},
+dd4323[]={1145,0},
+dd4324[]={1147,0},
+dd4325[]={1149,0},
+dd4326[]={1151,0},
+dd4327[]={1153,0},
+dd4328[]={1163,0},
+dd4329[]={1165,0},
+dd4330[]={1167,0},
+dd4331[]={1169,0},
+dd4332[]={1171,0},
+dd4333[]={1173,0},
+dd4334[]={1175,0},
+dd4335[]={1177,0},
+dd4336[]={1179,0},
+dd4337[]={1181,0},
+dd4338[]={1183,0},
+dd4339[]={1185,0},
+dd4340[]={1187,0},
+dd4341[]={1189,0},
+dd4342[]={1191,0},
+dd4343[]={1193,0},
+dd4344[]={1195,0},
+dd4345[]={1197,0},
+dd4346[]={1199,0},
+dd4347[]={1201,0},
+dd4348[]={1203,0},
+dd4349[]={1205,0},
+dd4350[]={1207,0},
+dd4351[]={1209,0},
+dd4352[]={1211,0},
+dd4353[]={1213,0},
+dd4354[]={1215,0},
+dd4355[]={1231,0},
+dd4356[]={1218,0},
+dd4357[]={1220,0},
+dd4358[]={1222,0},
+dd4359[]={1224,0},
+dd4360[]={1226,0},
+dd4361[]={1228,0},
+dd4362[]={1230,0},
+dd4363[]={1233,0},
+dd4364[]={1235,0},
+dd4365[]={1237,0},
+dd4366[]={1239,0},
+dd4367[]={1241,0},
+dd4368[]={1245,0},
+dd4369[]={1249,0},
+dd4370[]={1251,0},
+dd4371[]={1253,0},
+dd4372[]={1257,0},
+dd4373[]={1263,0},
+dd4374[]={1265,0},
+dd4375[]={1267,0},
+dd4376[]={1271,0},
+dd4377[]={1275,0},
+dd4378[]={1277,0},
+dd4379[]={1279,0},
+dd4380[]={1281,0},
+dd4381[]={1283,0},
+dd4382[]={1285,0},
+dd4383[]={1287,0},
+dd4384[]={1289,0},
+dd4385[]={1291,0},
+dd4386[]={1293,0},
+dd4387[]={1295,0},
+dd4388[]={1297,0},
+dd4389[]={1299,0},
+dd4390[]={1301,0},
+dd4391[]={1303,0},
+dd4392[]={1305,0},
+dd4393[]={1307,0},
+dd4394[]={1309,0},
+dd4395[]={1311,0},
+dd4396[]={1313,0},
+dd4397[]={1315,0},
+dd4398[]={1317,0},
+dd4399[]={1319,0},
+dd4400[]={1377,0},
+dd4401[]={1378,0},
+dd4402[]={1379,0},
+dd4403[]={1380,0},
+dd4404[]={1381,0},
+dd4405[]={1382,0},
+dd4406[]={1383,0},
+dd4407[]={1384,0},
+dd4408[]={1385,0},
+dd4409[]={1386,0},
+dd4410[]={1387,0},
+dd4411[]={1388,0},
+dd4412[]={1389,0},
+dd4413[]={1390,0},
+dd4414[]={1391,0},
+dd4415[]={1392,0},
+dd4416[]={1393,0},
+dd4417[]={1394,0},
+dd4418[]={1395,0},
+dd4419[]={1396,0},
+dd4420[]={1397,0},
+dd4421[]={1398,0},
+dd4422[]={1399,0},
+dd4423[]={1400,0},
+dd4424[]={1401,0},
+dd4425[]={1402,0},
+dd4426[]={1403,0},
+dd4427[]={1404,0},
+dd4428[]={1405,0},
+dd4429[]={1406,0},
+dd4430[]={1407,0},
+dd4431[]={1408,0},
+dd4432[]={1409,0},
+dd4433[]={1410,0},
+dd4434[]={1411,0},
+dd4435[]={1412,0},
+dd4436[]={1413,0},
+dd4437[]={1414,0},
+dd4438[]={11520,0},
+dd4439[]={11521,0},
+dd4440[]={11522,0},
+dd4441[]={11523,0},
+dd4442[]={11524,0},
+dd4443[]={11525,0},
+dd4444[]={11526,0},
+dd4445[]={11527,0},
+dd4446[]={11528,0},
+dd4447[]={11529,0},
+dd4448[]={11530,0},
+dd4449[]={11531,0},
+dd4450[]={11532,0},
+dd4451[]={11533,0},
+dd4452[]={11534,0},
+dd4453[]={11535,0},
+dd4454[]={11536,0},
+dd4455[]={11537,0},
+dd4456[]={11538,0},
+dd4457[]={11539,0},
+dd4458[]={11540,0},
+dd4459[]={11541,0},
+dd4460[]={11542,0},
+dd4461[]={11543,0},
+dd4462[]={11544,0},
+dd4463[]={11545,0},
+dd4464[]={11546,0},
+dd4465[]={11547,0},
+dd4466[]={11548,0},
+dd4467[]={11549,0},
+dd4468[]={11550,0},
+dd4469[]={11551,0},
+dd4470[]={11552,0},
+dd4471[]={11553,0},
+dd4472[]={11554,0},
+dd4473[]={11555,0},
+dd4474[]={11556,0},
+dd4475[]={11557,0},
+dd4476[]={7681,0},
+dd4477[]={7683,0},
+dd4478[]={7685,0},
+dd4479[]={7687,0},
+dd4480[]={7691,0},
+dd4481[]={7693,0},
+dd4482[]={7695,0},
+dd4483[]={7697,0},
+dd4484[]={7699,0},
+dd4485[]={7701,0},
+dd4486[]={7703,0},
+dd4487[]={7705,0},
+dd4488[]={7707,0},
+dd4489[]={7713,0},
+dd4490[]={7715,0},
+dd4491[]={7717,0},
+dd4492[]={7719,0},
+dd4493[]={7721,0},
+dd4494[]={7723,0},
+dd4495[]={7725,0},
+dd4496[]={7729,0},
+dd4497[]={7731,0},
+dd4498[]={7733,0},
+dd4499[]={7735,0},
+dd4500[]={7739,0},
+dd4501[]={7741,0},
+dd4502[]={7743,0},
+dd4503[]={7745,0},
+dd4504[]={7747,0},
+dd4505[]={7749,0},
+dd4506[]={7751,0},
+dd4507[]={7753,0},
+dd4508[]={7755,0},
+dd4509[]={7757,0},
+dd4510[]={7759,0},
+dd4511[]={7761,0},
+dd4512[]={7763,0},
+dd4513[]={7765,0},
+dd4514[]={7767,0},
+dd4515[]={7769,0},
+dd4516[]={7771,0},
+dd4517[]={7775,0},
+dd4518[]={7777,0},
+dd4519[]={7779,0},
+dd4520[]={7787,0},
+dd4521[]={7789,0},
+dd4522[]={7791,0},
+dd4523[]={7793,0},
+dd4524[]={7795,0},
+dd4525[]={7797,0},
+dd4526[]={7799,0},
+dd4527[]={7805,0},
+dd4528[]={7807,0},
+dd4529[]={7809,0},
+dd4530[]={7811,0},
+dd4531[]={7813,0},
+dd4532[]={7815,0},
+dd4533[]={7817,0},
+dd4534[]={7819,0},
+dd4535[]={7821,0},
+dd4536[]={7823,0},
+dd4537[]={7825,0},
+dd4538[]={7827,0},
+dd4539[]={7829,0},
+dd4540[]={7841,0},
+dd4541[]={7843,0},
+dd4542[]={7845,0},
+dd4543[]={7847,0},
+dd4544[]={7849,0},
+dd4545[]={7851,0},
+dd4546[]={7853,0},
+dd4547[]={7855,0},
+dd4548[]={7857,0},
+dd4549[]={7859,0},
+dd4550[]={7861,0},
+dd4551[]={7863,0},
+dd4552[]={7865,0},
+dd4553[]={7867,0},
+dd4554[]={7869,0},
+dd4555[]={7871,0},
+dd4556[]={7873,0},
+dd4557[]={7875,0},
+dd4558[]={7877,0},
+dd4559[]={7881,0},
+dd4560[]={7883,0},
+dd4561[]={7885,0},
+dd4562[]={7887,0},
+dd4563[]={7889,0},
+dd4564[]={7891,0},
+dd4565[]={7893,0},
+dd4566[]={7895,0},
+dd4567[]={7899,0},
+dd4568[]={7901,0},
+dd4569[]={7903,0},
+dd4570[]={7905,0},
+dd4571[]={7907,0},
+dd4572[]={7909,0},
+dd4573[]={7911,0},
+dd4574[]={7913,0},
+dd4575[]={7915,0},
+dd4576[]={7917,0},
+dd4577[]={7919,0},
+dd4578[]={7921,0},
+dd4579[]={7923,0},
+dd4580[]={7925,0},
+dd4581[]={7927,0},
+dd4582[]={7929,0},
+dd4583[]={7931,0},
+dd4584[]={7933,0},
+dd4585[]={7935,0},
+dd4586[]={7936,0},
+dd4587[]={7937,0},
+dd4588[]={7938,0},
+dd4589[]={7939,0},
+dd4590[]={7940,0},
+dd4591[]={7941,0},
+dd4592[]={7942,0},
+dd4593[]={7943,0},
+dd4594[]={7952,0},
+dd4595[]={7953,0},
+dd4596[]={7954,0},
+dd4597[]={7955,0},
+dd4598[]={7956,0},
+dd4599[]={7957,0},
+dd4600[]={7968,0},
+dd4601[]={7969,0},
+dd4602[]={7970,0},
+dd4603[]={7971,0},
+dd4604[]={7972,0},
+dd4605[]={7973,0},
+dd4606[]={7974,0},
+dd4607[]={7975,0},
+dd4608[]={7984,0},
+dd4609[]={7985,0},
+dd4610[]={7986,0},
+dd4611[]={7987,0},
+dd4612[]={7988,0},
+dd4613[]={7989,0},
+dd4614[]={7990,0},
+dd4615[]={7991,0},
+dd4616[]={8000,0},
+dd4617[]={8001,0},
+dd4618[]={8002,0},
+dd4619[]={8003,0},
+dd4620[]={8004,0},
+dd4621[]={8005,0},
+dd4622[]={965,787,768,0},
+dd4623[]={965,787,769,0},
+dd4624[]={965,787,834,0},
+dd4625[]={8017,0},
+dd4626[]={8019,0},
+dd4627[]={8021,0},
+dd4628[]={8023,0},
+dd4629[]={8032,0},
+dd4630[]={8033,0},
+dd4631[]={8034,0},
+dd4632[]={8035,0},
+dd4633[]={8036,0},
+dd4634[]={8037,0},
+dd4635[]={8038,0},
+dd4636[]={8039,0},
+dd4637[]={7936,953,0},
+dd4638[]={7937,953,0},
+dd4639[]={7938,953,0},
+dd4640[]={7939,953,0},
+dd4641[]={7940,953,0},
+dd4642[]={7941,953,0},
+dd4643[]={7942,953,0},
+dd4644[]={7943,953,0},
+dd4645[]={7968,953,0},
+dd4646[]={7969,953,0},
+dd4647[]={7970,953,0},
+dd4648[]={7971,953,0},
+dd4649[]={7972,953,0},
+dd4650[]={7973,953,0},
+dd4651[]={7974,953,0},
+dd4652[]={7975,953,0},
+dd4653[]={8032,953,0},
+dd4654[]={8033,953,0},
+dd4655[]={8034,953,0},
+dd4656[]={8035,953,0},
+dd4657[]={8036,953,0},
+dd4658[]={8037,953,0},
+dd4659[]={8038,953,0},
+dd4660[]={8039,953,0},
+dd4661[]={8048,953,0},
+dd4662[]={945,953,0},
+dd4663[]={940,953,0},
+dd4664[]={945,834,953,0},
+dd4665[]={8112,0},
+dd4666[]={8113,0},
+dd4667[]={8048,0},
+dd4668[]={8049,0},
+dd4669[]={8052,953,0},
+dd4670[]={951,953,0},
+dd4671[]={942,953,0},
+dd4672[]={951,834,953,0},
+dd4673[]={8050,0},
+dd4674[]={8051,0},
+dd4675[]={8052,0},
+dd4676[]={8053,0},
+dd4677[]={953,776,768,0},
+dd4678[]={953,776,834,0},
+dd4679[]={8144,0},
+dd4680[]={8145,0},
+dd4681[]={8054,0},
+dd4682[]={8055,0},
+dd4683[]={965,776,768,0},
+dd4684[]={965,776,834,0},
+dd4685[]={8160,0},
+dd4686[]={8161,0},
+dd4687[]={8058,0},
+dd4688[]={8059,0},
+dd4689[]={8165,0},
+dd4690[]={8060,953,0},
+dd4691[]={969,953,0},
+dd4692[]={974,953,0},
+dd4693[]={969,834,953,0},
+dd4694[]={8056,0},
+dd4695[]={8057,0},
+dd4696[]={8060,0},
+dd4697[]={8061,0},
+dd4698[]={8526,0},
+dd4699[]={8560,0},
+dd4700[]={8561,0},
+dd4701[]={8562,0},
+dd4702[]={8563,0},
+dd4703[]={8564,0},
+dd4704[]={8565,0},
+dd4705[]={8566,0},
+dd4706[]={8567,0},
+dd4707[]={8568,0},
+dd4708[]={8569,0},
+dd4709[]={8570,0},
+dd4710[]={8571,0},
+dd4711[]={8572,0},
+dd4712[]={8573,0},
+dd4713[]={8574,0},
+dd4714[]={8575,0},
+dd4715[]={8580,0},
+dd4716[]={9424,0},
+dd4717[]={9425,0},
+dd4718[]={9426,0},
+dd4719[]={9427,0},
+dd4720[]={9428,0},
+dd4721[]={9429,0},
+dd4722[]={9430,0},
+dd4723[]={9431,0},
+dd4724[]={9432,0},
+dd4725[]={9433,0},
+dd4726[]={9434,0},
+dd4727[]={9435,0},
+dd4728[]={9436,0},
+dd4729[]={9437,0},
+dd4730[]={9438,0},
+dd4731[]={9439,0},
+dd4732[]={9440,0},
+dd4733[]={9441,0},
+dd4734[]={9442,0},
+dd4735[]={9443,0},
+dd4736[]={9444,0},
+dd4737[]={9445,0},
+dd4738[]={9446,0},
+dd4739[]={9447,0},
+dd4740[]={9448,0},
+dd4741[]={9449,0},
+dd4742[]={11312,0},
+dd4743[]={11313,0},
+dd4744[]={11314,0},
+dd4745[]={11315,0},
+dd4746[]={11316,0},
+dd4747[]={11317,0},
+dd4748[]={11318,0},
+dd4749[]={11319,0},
+dd4750[]={11320,0},
+dd4751[]={11321,0},
+dd4752[]={11322,0},
+dd4753[]={11323,0},
+dd4754[]={11324,0},
+dd4755[]={11325,0},
+dd4756[]={11326,0},
+dd4757[]={11327,0},
+dd4758[]={11328,0},
+dd4759[]={11329,0},
+dd4760[]={11330,0},
+dd4761[]={11331,0},
+dd4762[]={11332,0},
+dd4763[]={11333,0},
+dd4764[]={11334,0},
+dd4765[]={11335,0},
+dd4766[]={11336,0},
+dd4767[]={11337,0},
+dd4768[]={11338,0},
+dd4769[]={11339,0},
+dd4770[]={11340,0},
+dd4771[]={11341,0},
+dd4772[]={11342,0},
+dd4773[]={11343,0},
+dd4774[]={11344,0},
+dd4775[]={11345,0},
+dd4776[]={11346,0},
+dd4777[]={11347,0},
+dd4778[]={11348,0},
+dd4779[]={11349,0},
+dd4780[]={11350,0},
+dd4781[]={11351,0},
+dd4782[]={11352,0},
+dd4783[]={11353,0},
+dd4784[]={11354,0},
+dd4785[]={11355,0},
+dd4786[]={11356,0},
+dd4787[]={11357,0},
+dd4788[]={11358,0},
+dd4789[]={11361,0},
+dd4790[]={619,0},
+dd4791[]={7549,0},
+dd4792[]={637,0},
+dd4793[]={11368,0},
+dd4794[]={11370,0},
+dd4795[]={11372,0},
+dd4796[]={11379,0},
+dd4797[]={11382,0},
+dd4798[]={575,0},
+dd4799[]={576,0},
+dd4800[]={11393,0},
+dd4801[]={11395,0},
+dd4802[]={11397,0},
+dd4803[]={11399,0},
+dd4804[]={11401,0},
+dd4805[]={11403,0},
+dd4806[]={11405,0},
+dd4807[]={11407,0},
+dd4808[]={11409,0},
+dd4809[]={11411,0},
+dd4810[]={11413,0},
+dd4811[]={11415,0},
+dd4812[]={11417,0},
+dd4813[]={11419,0},
+dd4814[]={11421,0},
+dd4815[]={11423,0},
+dd4816[]={11425,0},
+dd4817[]={11427,0},
+dd4818[]={11429,0},
+dd4819[]={11431,0},
+dd4820[]={11433,0},
+dd4821[]={11435,0},
+dd4822[]={11437,0},
+dd4823[]={11439,0},
+dd4824[]={11441,0},
+dd4825[]={11443,0},
+dd4826[]={11445,0},
+dd4827[]={11447,0},
+dd4828[]={11449,0},
+dd4829[]={11451,0},
+dd4830[]={11453,0},
+dd4831[]={11455,0},
+dd4832[]={11457,0},
+dd4833[]={11459,0},
+dd4834[]={11461,0},
+dd4835[]={11463,0},
+dd4836[]={11465,0},
+dd4837[]={11467,0},
+dd4838[]={11469,0},
+dd4839[]={11471,0},
+dd4840[]={11473,0},
+dd4841[]={11475,0},
+dd4842[]={11477,0},
+dd4843[]={11479,0},
+dd4844[]={11481,0},
+dd4845[]={11483,0},
+dd4846[]={11485,0},
+dd4847[]={11487,0},
+dd4848[]={11489,0},
+dd4849[]={11491,0},
+dd4850[]={11500,0},
+dd4851[]={11502,0},
+dd4852[]={42561,0},
+dd4853[]={42563,0},
+dd4854[]={42565,0},
+dd4855[]={42567,0},
+dd4856[]={42569,0},
+dd4857[]={42571,0},
+dd4858[]={42573,0},
+dd4859[]={42575,0},
+dd4860[]={42577,0},
+dd4861[]={42579,0},
+dd4862[]={42581,0},
+dd4863[]={42583,0},
+dd4864[]={42585,0},
+dd4865[]={42587,0},
+dd4866[]={42589,0},
+dd4867[]={42591,0},
+dd4868[]={42593,0},
+dd4869[]={42595,0},
+dd4870[]={42597,0},
+dd4871[]={42599,0},
+dd4872[]={42601,0},
+dd4873[]={42603,0},
+dd4874[]={42605,0},
+dd4875[]={42625,0},
+dd4876[]={42627,0},
+dd4877[]={42629,0},
+dd4878[]={42631,0},
+dd4879[]={42633,0},
+dd4880[]={42635,0},
+dd4881[]={42637,0},
+dd4882[]={42639,0},
+dd4883[]={42641,0},
+dd4884[]={42643,0},
+dd4885[]={42645,0},
+dd4886[]={42647,0},
+dd4887[]={42787,0},
+dd4888[]={42789,0},
+dd4889[]={42791,0},
+dd4890[]={42793,0},
+dd4891[]={42795,0},
+dd4892[]={42797,0},
+dd4893[]={42799,0},
+dd4894[]={42803,0},
+dd4895[]={42805,0},
+dd4896[]={42807,0},
+dd4897[]={42809,0},
+dd4898[]={42811,0},
+dd4899[]={42813,0},
+dd4900[]={42815,0},
+dd4901[]={42817,0},
+dd4902[]={42819,0},
+dd4903[]={42821,0},
+dd4904[]={42823,0},
+dd4905[]={42825,0},
+dd4906[]={42827,0},
+dd4907[]={42829,0},
+dd4908[]={42831,0},
+dd4909[]={42833,0},
+dd4910[]={42835,0},
+dd4911[]={42837,0},
+dd4912[]={42839,0},
+dd4913[]={42841,0},
+dd4914[]={42843,0},
+dd4915[]={42845,0},
+dd4916[]={42847,0},
+dd4917[]={42849,0},
+dd4918[]={42851,0},
+dd4919[]={42853,0},
+dd4920[]={42855,0},
+dd4921[]={42857,0},
+dd4922[]={42859,0},
+dd4923[]={42861,0},
+dd4924[]={42874,0},
+dd4925[]={42876,0},
+dd4926[]={7545,0},
+dd4927[]={42879,0},
+dd4928[]={42881,0},
+dd4929[]={42883,0},
+dd4930[]={42885,0},
+dd4931[]={42887,0},
+dd4932[]={42892,0},
+dd4933[]={42897,0},
+dd4934[]={42913,0},
+dd4935[]={42915,0},
+dd4936[]={42917,0},
+dd4937[]={42919,0},
+dd4938[]={42921,0},
+dd4939[]={65345,0},
+dd4940[]={65346,0},
+dd4941[]={65347,0},
+dd4942[]={65348,0},
+dd4943[]={65349,0},
+dd4944[]={65350,0},
+dd4945[]={65351,0},
+dd4946[]={65352,0},
+dd4947[]={65353,0},
+dd4948[]={65354,0},
+dd4949[]={65355,0},
+dd4950[]={65356,0},
+dd4951[]={65357,0},
+dd4952[]={65358,0},
+dd4953[]={65359,0},
+dd4954[]={65360,0},
+dd4955[]={65361,0},
+dd4956[]={65362,0},
+dd4957[]={65363,0},
+dd4958[]={65364,0},
+dd4959[]={65365,0},
+dd4960[]={65366,0},
+dd4961[]={65367,0},
+dd4962[]={65368,0},
+dd4963[]={65369,0},
+dd4964[]={65370,0},
+dd4965[]={66600,0},
+dd4966[]={66601,0},
+dd4967[]={66602,0},
+dd4968[]={66603,0},
+dd4969[]={66604,0},
+dd4970[]={66605,0},
+dd4971[]={66606,0},
+dd4972[]={66607,0},
+dd4973[]={66608,0},
+dd4974[]={66609,0},
+dd4975[]={66610,0},
+dd4976[]={66611,0},
+dd4977[]={66612,0},
+dd4978[]={66613,0},
+dd4979[]={66614,0},
+dd4980[]={66615,0},
+dd4981[]={66616,0},
+dd4982[]={66617,0},
+dd4983[]={66618,0},
+dd4984[]={66619,0},
+dd4985[]={66620,0},
+dd4986[]={66621,0},
+dd4987[]={66622,0},
+dd4988[]={66623,0},
+dd4989[]={66624,0},
+dd4990[]={66625,0},
+dd4991[]={66626,0},
+dd4992[]={66627,0},
+dd4993[]={66628,0},
+dd4994[]={66629,0},
+dd4995[]={66630,0},
+dd4996[]={66631,0},
+dd4997[]={66632,0},
+dd4998[]={66633,0},
+dd4999[]={66634,0},
+dd5000[]={66635,0},
+dd5001[]={66636,0},
+dd5002[]={66637,0},
+dd5003[]={66638,0},
+dd5004[]={66639,0};
 /* 0000-000F */
 static const struct unidata st0[] = {
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
@@ -5087,43 +5201,43 @@ static const struct unidata st3[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Po,0,GBOther,WBMidLetter,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBMidNum,SBOther},
-{0,0,dd3608,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3609,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3610,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3707,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3708,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3709,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* 0040-004F */
 static const struct unidata st4[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,dd2,dd3611,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd515,dd3612,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd541,dd3613,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd516,dd3614,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd517,dd3615,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd544,dd3616,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd521,dd3617,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd284,dd3618,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd538,dd3619,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd286,dd3620,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd522,dd3621,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd300,dd3622,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd523,dd3623,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd1082,dd3624,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd10,dd3625,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd2,dd3710,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd515,dd3711,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd541,dd3712,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd516,dd3713,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd517,dd3714,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd544,dd3715,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd521,dd3716,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd284,dd3717,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd538,dd3718,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd286,dd3719,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd522,dd3720,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd300,dd3721,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd523,dd3722,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd1082,dd3723,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd10,dd3724,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0050-005F */
 static const struct unidata st5[] = {
-{0,dd528,dd3626,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd1272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd287,dd3627,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd180,dd3628,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd529,dd3629,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd530,dd3630,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd533,dd3631,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd291,dd3632,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd301,dd3633,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd292,dd3634,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd571,dd3635,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd528,dd3725,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd1276,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd287,dd3726,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd180,dd3727,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd529,dd3728,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd530,dd3729,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd533,dd3730,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd291,dd3731,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd301,dd3732,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd292,dd3733,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd571,dd3734,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -5133,35 +5247,35 @@ static const struct unidata st5[] = {
 /* 0060-006F */
 static const struct unidata st6[] = {
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,dd3636,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3637,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3638,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3639,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3640,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3641,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3642,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3643,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3644,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3645,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3646,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3647,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3648,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3649,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3650,0,Ll,0,GBOther,WBALetter,SBLower}
+{0,0,dd3735,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3736,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3737,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3738,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3739,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3740,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3741,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3742,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3743,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3744,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3745,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3746,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3747,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3748,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3749,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0070-007F */
 static const struct unidata st7[] = {
-{0,0,dd3651,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3652,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3653,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3654,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3655,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3656,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3657,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3658,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3659,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3660,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3750,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3751,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3752,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3753,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3754,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3755,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3756,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3757,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3758,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3759,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -5197,7 +5311,7 @@ static const struct unidata st9[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1,0,dd3661,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd1,0,dd3760,0,Sk,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
@@ -5227,60 +5341,60 @@ static const struct unidata st10[] = {
 };
 /* 00C0-00CF */
 static const struct unidata st11[] = {
-{dd14,dd3971,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd15,dd3972,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd16,dd3973,dd3662,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd17,dd3974,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd18,dd3975,dd3663,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd19,dd3976,dd3664,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3977,dd3665,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd20,dd3978,dd3666,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd21,dd3979,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd22,dd3980,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd23,dd3981,dd3667,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd24,dd3982,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd25,dd3983,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd26,dd3984,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd27,dd3985,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd28,dd3986,dd3668,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd14,dd4072,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd15,dd4073,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd16,dd4074,dd3761,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd17,dd4075,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd18,dd4076,dd3762,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd19,dd4077,dd3763,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4078,dd3764,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd20,dd4079,dd3765,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd21,dd4080,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd22,dd4081,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd23,dd4082,dd3766,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd24,dd4083,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd25,dd4084,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd26,dd4085,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd27,dd4086,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd28,dd4087,dd3767,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 00D0-00DF */
 static const struct unidata st12[] = {
 {0,dd543,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd29,dd3987,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd30,dd3988,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd31,dd3989,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd32,dd3990,dd3669,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd33,dd3991,dd3670,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd34,dd3992,dd3671,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,dd3993,dd3672,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd35,dd3994,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd36,dd3995,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd37,dd3996,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd38,dd3997,dd3673,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd39,dd3998,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3999,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4000,0,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd29,dd4088,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd30,dd4089,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd31,dd4090,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd32,dd4091,dd3768,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd33,dd4092,dd3769,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd34,dd4093,dd3770,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,dd4094,dd3771,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd35,dd4095,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd36,dd4096,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd37,dd4097,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd38,dd4098,dd3772,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd39,dd4099,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4100,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4101,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 00E0-00EF */
 static const struct unidata st13[] = {
 {dd40,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd41,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd42,0,dd3674,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd42,0,dd3773,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd43,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd44,0,dd3675,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd45,0,dd3676,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3677,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd46,0,dd3678,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd44,0,dd3774,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd45,0,dd3775,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3776,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd46,0,dd3777,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd47,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd48,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd49,0,dd3679,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd49,0,dd3778,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd50,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd51,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd52,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd53,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd54,0,dd3680,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd54,0,dd3779,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 00F0-00FF */
 static const struct unidata st14[] = {
@@ -5288,201 +5402,201 @@ static const struct unidata st14[] = {
 {dd55,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd56,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd57,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd58,0,dd3681,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd59,0,dd3682,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd60,0,dd3683,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd58,0,dd3780,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd59,0,dd3781,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd60,0,dd3782,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3684,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3783,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd61,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd62,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd63,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd64,0,dd3685,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd64,0,dd3784,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd65,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd66,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0100-010F */
 static const struct unidata st15[] = {
-{dd67,dd4001,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd67,dd4102,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd68,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd69,dd4002,dd3686,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd70,0,dd3687,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd71,dd4003,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd69,dd4103,dd3785,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd70,0,dd3786,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd71,dd4104,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd72,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd73,dd4004,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd73,dd4105,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd74,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd75,dd4005,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd75,dd4106,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd76,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd77,dd4006,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd77,dd4107,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd78,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd79,dd4007,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd79,dd4108,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd80,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd81,dd4008,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd81,dd4109,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd82,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0110-011F */
 static const struct unidata st16[] = {
-{0,dd4009,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4110,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd83,dd4010,dd3688,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd84,0,dd3689,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd85,dd4011,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd83,dd4111,dd3787,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd84,0,dd3788,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd85,dd4112,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd86,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd87,dd4012,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd87,dd4113,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd88,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd89,dd4013,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd89,dd4114,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd90,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd91,dd4014,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd91,dd4115,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd92,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd93,dd4015,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd93,dd4116,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd94,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd95,dd4016,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd95,dd4117,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd96,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0120-012F */
 static const struct unidata st17[] = {
-{dd97,dd4017,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd97,dd4118,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd98,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd99,dd4018,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd99,dd4119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd100,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd101,dd4019,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd101,dd4120,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd102,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd1092,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd103,dd4020,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd103,dd4121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd104,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd105,dd4021,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd105,dd4122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd106,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd107,dd4022,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd107,dd4123,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd108,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd109,dd4023,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd109,dd4124,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd110,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0130-013F */
 static const struct unidata st18[] = {
-{dd111,dd4024,0,0,Lu,NBC,GBOther,WBALetter,SBUpper},
+{dd111,dd4125,0,0,Lu,NBC,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd112,dd4025,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd112,dd4126,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd113,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd114,dd4026,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd114,dd4127,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd115,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd116,dd4027,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd116,dd4128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd117,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd118,dd4028,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd118,dd4129,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd119,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd120,dd4029,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd120,dd4130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd121,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd122,dd4030,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd122,dd4131,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd123,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd124,dd4031,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd124,dd4132,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 0140-014F */
 static const struct unidata st19[] = {
 {dd125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,dd4032,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4133,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd126,dd4033,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd126,dd4134,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd127,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd128,dd4034,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd128,dd4135,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd129,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd130,dd4035,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd130,dd4136,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd131,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd132,dd132,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,dd524,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd133,dd4036,dd3690,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd134,0,dd3691,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd135,dd4037,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd133,dd4137,dd3789,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd134,0,dd3790,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd135,dd4138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd136,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0150-015F */
 static const struct unidata st20[] = {
-{dd137,dd4038,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd137,dd4139,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd138,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4039,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4140,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd139,dd4040,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd139,dd4141,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd140,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd141,dd4041,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd141,dd4142,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd142,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd143,dd4042,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd143,dd4143,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd144,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd145,dd4043,dd3692,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd146,0,dd3693,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd147,dd4044,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd145,dd4144,dd3791,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd146,0,dd3792,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd147,dd4145,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd148,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd149,dd4045,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd149,dd4146,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd150,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0160-016F */
 static const struct unidata st21[] = {
-{dd151,dd4046,dd3694,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd152,0,dd3695,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd153,dd4047,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd151,dd4147,dd3793,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd152,0,dd3794,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd153,dd4148,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd154,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd155,dd4048,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd155,dd4149,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd156,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4049,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4150,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd157,dd4050,dd3696,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd158,0,dd3697,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd159,dd4051,dd3698,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd160,0,dd3699,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd161,dd4052,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd157,dd4151,dd3795,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd158,0,dd3796,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd159,dd4152,dd3797,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd160,0,dd3798,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd161,dd4153,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd162,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd163,dd4053,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd163,dd4154,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd164,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0170-017F */
 static const struct unidata st22[] = {
-{dd165,dd4054,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd165,dd4155,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd166,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd167,dd4055,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd167,dd4156,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd168,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd169,dd4056,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd169,dd4157,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd170,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd171,dd4057,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd171,dd4158,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd172,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd173,dd4058,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd174,dd4059,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd173,dd4159,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd174,dd4160,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd175,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd176,dd4060,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd176,dd4161,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd177,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd178,dd4061,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd178,dd4162,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd179,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd180,dd180,dd3700,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd180,dd180,dd3799,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 0180-018F */
 static const struct unidata st23[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4062,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4063,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4163,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4164,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4064,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4165,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd525,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4065,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4166,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4066,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4067,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4068,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4167,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4168,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4169,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4069,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4170,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd518,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0190-019F */
 static const struct unidata st24[] = {
 {0,dd519,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4070,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4171,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4071,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4172,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd299,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd549,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd548,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4072,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4173,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5493,38 +5607,38 @@ static const struct unidata st24[] = {
 };
 /* 01A0-01AF */
 static const struct unidata st25[] = {
-{dd181,dd4073,dd3701,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd182,0,dd3702,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4074,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd181,dd4174,dd3800,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd182,0,dd3801,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4175,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4075,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4176,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4076,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4077,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4177,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4178,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd564,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4078,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4179,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4079,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd183,dd4080,dd3703,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4180,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd183,dd4181,dd3802,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 01B0-01BF */
 static const struct unidata st26[] = {
-{dd184,0,dd3704,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd184,0,dd3803,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd567,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd569,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4081,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4182,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4082,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4183,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd574,dd3705,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4083,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd574,dd3804,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4184,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,dd4084,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4185,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
@@ -5535,138 +5649,138 @@ static const struct unidata st27[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd185,dd4085,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd186,dd4085,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd185,dd4186,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd186,dd4186,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd187,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd188,dd4086,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd189,dd4086,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd188,dd4187,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd189,dd4187,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd190,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd191,dd4087,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd192,dd4087,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd191,dd4188,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd192,dd4188,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd193,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd194,dd4088,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd194,dd4189,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd195,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd196,dd4089,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd196,dd4190,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 01D0-01DF */
 static const struct unidata st28[] = {
 {dd197,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd198,dd4090,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd198,dd4191,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd199,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd200,dd4091,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd200,dd4192,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd201,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd202,dd4092,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd202,dd4193,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd203,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd204,dd4093,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd204,dd4194,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd205,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd206,dd4094,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd206,dd4195,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd207,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd208,dd4095,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd208,dd4196,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd209,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd210,dd3675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd210,dd3774,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd211,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 01E0-01EF */
 static const struct unidata st29[] = {
-{dd212,dd3709,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd212,dd3808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd213,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd214,dd4096,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd214,dd4197,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd215,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4097,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4198,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd216,dd4098,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd216,dd4199,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd217,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd218,dd4099,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd218,dd4200,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd219,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd220,dd4100,dd3706,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd221,0,dd3707,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd222,dd3707,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd220,dd4201,dd3805,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd221,0,dd3806,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd222,dd3806,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd223,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd224,dd3714,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd224,dd3813,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd225,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 01F0-01FF */
 static const struct unidata st30[] = {
 {dd226,dd226,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd227,dd4101,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd228,dd4101,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd227,dd4202,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd228,dd4202,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd229,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd230,dd4102,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd230,dd4203,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd231,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4103,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4104,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd232,dd4105,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4204,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4205,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd232,dd4206,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd233,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd234,dd3676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd234,dd3775,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd235,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd236,dd4106,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd236,dd4207,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd237,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd238,dd3684,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd238,dd3783,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd239,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0200-020F */
 static const struct unidata st31[] = {
-{dd240,dd4107,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd240,dd4208,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd241,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd242,dd4108,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd242,dd4209,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd243,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd244,dd4109,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd244,dd4210,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd245,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd246,dd4110,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd246,dd4211,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd247,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd248,dd4111,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd248,dd4212,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd249,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd250,dd4112,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd250,dd4213,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd251,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd252,dd4113,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd252,dd4214,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd253,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd254,dd4114,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd254,dd4215,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd255,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0210-021F */
 static const struct unidata st32[] = {
-{dd256,dd4115,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd256,dd4216,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd257,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd258,dd4116,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd258,dd4217,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd259,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd260,dd4117,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd260,dd4218,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd261,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd262,dd4118,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd262,dd4219,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd263,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd264,dd4119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd264,dd4220,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd265,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd266,dd4120,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd266,dd4221,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd267,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4222,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd268,dd4122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd268,dd4223,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd269,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0220-022F */
 static const struct unidata st33[] = {
-{0,dd4123,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4224,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4124,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4225,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4125,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4226,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd270,dd4126,dd3708,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd271,0,dd3709,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd272,dd4127,dd3710,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd273,0,dd3711,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd274,dd3683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd270,dd4227,dd3807,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd271,0,dd3808,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd272,dd4228,dd3809,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd273,0,dd3810,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd274,dd3782,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd275,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd276,dd4128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd276,dd4229,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd277,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd278,dd4129,dd3712,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd279,0,dd3713,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd278,dd4230,dd3811,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd279,0,dd3812,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0230-023F */
 static const struct unidata st34[] = {
-{dd280,dd3713,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd280,dd3812,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd281,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd282,dd4130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd282,dd4231,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd283,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5674,30 +5788,30 @@ static const struct unidata st34[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4131,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4132,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4232,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4233,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4133,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4134,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4234,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4235,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0240-024F */
 static const struct unidata st35[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4135,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4236,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4136,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4237,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd566,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4137,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4238,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4239,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4139,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4240,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4140,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4241,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4141,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4242,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0250-025F */
@@ -5723,7 +5837,7 @@ static const struct unidata st36[] = {
 static const struct unidata st37[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3714,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3813,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5968,13 +6082,13 @@ static const struct unidata st49[] = {
 };
 /* 0370-037F */
 static const struct unidata st50[] = {
-{0,dd4142,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4243,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4143,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4244,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd307,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,dd4144,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4245,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -6006,116 +6120,116 @@ static const struct unidata st51[] = {
 };
 /* 0390-039F */
 static const struct unidata st52[] = {
-{dd319,dd4145,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{0,dd3118,dd3715,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd319,dd4246,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{0,dd3131,dd3814,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd535,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd536,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd343,dd3716,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3120,dd3717,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd343,dd3815,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3132,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3133,dd3816,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd996,dd3718,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd996,dd3817,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd339,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3134,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd7,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3123,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3124,dd3719,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd3135,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3136,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3137,dd3818,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 03A0-03AF */
 static const struct unidata st53[] = {
 {0,dd338,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd340,dd3720,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd340,dd3819,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,dd3125,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3126,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3127,dd3721,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3139,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3140,dd3820,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd337,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd537,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3129,dd3722,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd320,dd4146,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd321,dd4147,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd322,0,dd3723,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd3141,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3142,dd3821,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd320,dd4247,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd321,dd4248,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd322,0,dd3822,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd323,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd324,0,dd3724,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd324,0,dd3823,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd325,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03B0-03BF */
 static const struct unidata st54[] = {
-{dd326,dd4148,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{0,0,dd3725,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd326,dd4249,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{0,0,dd3824,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3726,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3825,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3727,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3826,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3728,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3827,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3729,0,Ll,0,GBOther,WBALetter,SBLower}
+{0,0,dd3828,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03C0-03CF */
 static const struct unidata st55[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3730,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd3125,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3829,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd3138,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3731,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3830,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3732,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd327,0,dd3733,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd328,0,dd3734,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3831,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd327,0,dd3832,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd328,0,dd3833,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd329,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd330,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd331,0,dd3735,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4149,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd331,0,dd3834,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4250,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 03D0-03DF */
 static const struct unidata st56[] = {
 {dd332,dd332,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,dd333,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd334,0,dd3736,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,dd3835,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd335,0,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd336,0,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd337,dd337,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,dd338,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4150,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4251,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4151,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4252,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd3138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3151,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4152,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4253,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03E0-03EF */
 static const struct unidata st57[] = {
-{0,dd4153,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4254,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4154,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4255,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4155,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4256,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4156,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4257,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4157,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4258,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4158,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4259,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4159,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4260,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4160,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4261,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03F0-03FF */
@@ -6127,90 +6241,90 @@ static const struct unidata st58[] = {
 {dd342,dd333,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd343,dd343,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,dd4161,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4262,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd344,dd4162,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,dd4163,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd344,dd4263,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,dd4264,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4164,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4165,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4166,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4265,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4266,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4267,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0400-040F */
 static const struct unidata st59[] = {
-{dd345,dd4167,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd346,dd4168,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4169,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd347,dd3751,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4170,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4171,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4172,dd3737,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd348,dd3762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4173,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4174,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4175,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4176,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd349,dd3756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd350,dd4177,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd351,dd4178,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4179,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd345,dd4268,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd346,dd4269,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4270,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd347,dd3850,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4271,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4273,dd3836,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd348,dd3861,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4274,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4275,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4276,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4277,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd349,dd3855,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd350,dd4278,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd351,dd4279,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4280,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0410-041F */
 static const struct unidata st60[] = {
-{0,dd4180,dd3738,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4181,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4182,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4183,dd3739,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4184,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4185,dd3740,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4186,dd3741,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4187,dd3742,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4188,dd3743,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd352,dd4189,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4190,dd3744,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4191,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4192,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4281,dd3837,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4282,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4283,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4284,dd3838,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4285,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4286,dd3839,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4287,dd3840,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4288,dd3841,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4289,dd3842,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd352,dd4290,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4291,dd3843,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4292,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4293,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd539,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4193,dd3745,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4194,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4294,dd3844,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4295,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0420-042F */
 static const struct unidata st61[] = {
-{0,dd4195,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4196,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4197,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4198,dd3746,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4199,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4200,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4201,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4202,dd3747,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4203,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4204,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4205,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4206,dd3748,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4207,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4208,dd3749,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4209,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4210,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4296,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4297,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4298,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4299,dd3845,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4300,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4301,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4302,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4303,dd3846,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4304,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4305,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4306,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4307,dd3847,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4308,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4309,dd3848,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4310,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4311,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0430-043F */
 static const struct unidata st62[] = {
-{0,0,dd3750,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3849,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3751,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3850,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3752,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3753,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3754,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3755,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3851,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3852,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3853,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3854,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd353,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3756,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3855,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3757,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3856,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0440-044F */
@@ -6218,17 +6332,17 @@ static const struct unidata st63[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3758,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3857,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3759,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3858,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3760,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3859,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3761,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3860,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
@@ -6240,7 +6354,7 @@ static const struct unidata st64[] = {
 {dd356,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3762,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3861,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd357,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -6253,45 +6367,45 @@ static const struct unidata st64[] = {
 };
 /* 0460-046F */
 static const struct unidata st65[] = {
-{0,dd4211,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4312,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4212,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4313,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4213,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4314,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4214,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4315,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4215,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4316,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4216,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4317,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4217,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4318,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4218,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4319,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0470-047F */
 static const struct unidata st66[] = {
-{0,dd4219,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4320,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4220,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4321,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4221,dd3763,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3764,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd361,dd3764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4322,dd3862,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3863,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd361,dd3863,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd362,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4222,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4323,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4223,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4324,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4224,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4325,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4225,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4326,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0480-048F */
 static const struct unidata st67[] = {
-{0,dd4226,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4327,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -6301,194 +6415,194 @@ static const struct unidata st67[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
-{0,dd4227,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4328,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4228,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4329,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4229,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4330,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0490-049F */
 static const struct unidata st68[] = {
-{0,dd4230,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4331,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4231,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4232,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4233,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4334,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4234,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4335,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4235,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4336,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4236,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4337,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4237,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4338,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04A0-04AF */
 static const struct unidata st69[] = {
-{0,dd4238,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4339,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4239,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4340,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4240,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4341,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4241,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4342,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4242,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4343,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4243,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4344,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4244,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4345,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4245,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4346,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04B0-04BF */
 static const struct unidata st70[] = {
-{0,dd4246,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4347,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4247,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4348,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4248,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4349,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4249,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4350,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4250,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4351,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4251,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4352,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4252,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4353,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4253,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4354,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04C0-04CF */
 static const struct unidata st71[] = {
-{0,dd4254,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd363,dd4255,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4355,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd363,dd4356,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd364,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4256,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4357,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4257,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4358,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4258,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4359,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4259,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4360,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4260,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4361,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4261,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4362,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04D0-04DF */
 static const struct unidata st72[] = {
-{dd365,dd4262,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd365,dd4363,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd366,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd367,dd4263,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd367,dd4364,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd368,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4264,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4365,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd369,dd4265,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd369,dd4366,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd370,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4266,dd3765,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3766,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd371,dd3766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4367,dd3864,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3865,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd371,dd3865,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd372,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd373,dd4267,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd373,dd4368,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd374,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd375,dd3754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd375,dd3853,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd376,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04E0-04EF */
 static const struct unidata st73[] = {
-{0,dd4268,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4369,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd377,dd4269,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd377,dd4370,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd378,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd379,dd4270,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd379,dd4371,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd380,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd381,dd3757,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd381,dd3856,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd382,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4271,dd3767,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3768,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd383,dd3768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4372,dd3866,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3867,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd383,dd3867,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd384,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd385,dd3761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd385,dd3860,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd386,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd387,dd4272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd387,dd4373,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd388,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04F0-04FF */
 static const struct unidata st74[] = {
-{dd389,dd4273,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd389,dd4374,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd390,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd391,dd4274,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd391,dd4375,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd392,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd393,dd3759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd393,dd3858,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd394,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4275,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4376,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd395,dd3760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd395,dd3859,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd396,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4276,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4377,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4277,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4378,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4278,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4379,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0500-050F */
 static const struct unidata st75[] = {
-{0,dd4279,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4380,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4280,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4381,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4281,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4382,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4282,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4383,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4283,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4384,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4284,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4385,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4285,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4386,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4286,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4387,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0510-051F */
 static const struct unidata st76[] = {
-{0,dd4287,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4388,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4288,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4389,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4289,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4390,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4290,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4391,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4291,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4392,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4292,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4393,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4293,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4394,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4294,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4395,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0520-052F */
 static const struct unidata st77[] = {
-{0,dd4295,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4396,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4296,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4397,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4398,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4399,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -6501,50 +6615,50 @@ static const struct unidata st77[] = {
 /* 0530-053F */
 static const struct unidata st78[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,dd4297,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4298,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4299,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4300,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4301,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4302,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4303,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4304,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4305,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4306,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4307,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4308,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4309,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4310,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4311,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4400,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4401,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4402,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4403,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4404,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4405,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4406,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4407,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4408,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4409,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4410,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4411,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4412,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4413,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4414,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0540-054F */
 static const struct unidata st79[] = {
-{0,dd4312,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4313,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4314,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4315,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4316,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4317,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4318,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4319,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4320,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4321,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4322,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4323,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4324,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4325,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4326,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4327,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4415,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4416,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4417,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4418,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4419,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4420,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4421,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4422,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4423,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4424,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4425,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4426,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4427,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4428,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4429,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4430,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0550-055F */
 static const struct unidata st80[] = {
-{0,dd4328,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4329,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4330,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4331,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4334,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4431,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4432,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4433,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4434,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4435,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4436,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4437,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
@@ -6766,14 +6880,14 @@ static const struct unidata st91[] = {
 };
 /* 0620-062F */
 static const struct unidata st92[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd398,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd399,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd400,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd401,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd402,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3769,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3868,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6793,9 +6907,9 @@ static const struct unidata st93[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2959,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2969,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2961,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2971,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,27,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,28,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,29,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -6819,7 +6933,7 @@ static const struct unidata st94[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0660-066F */
 static const struct unidata st95[] = {
@@ -6862,7 +6976,7 @@ static const struct unidata st96[] = {
 /* 06C0-06CF */
 static const struct unidata st97[] = {
 {dd407,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3770,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3869,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd408,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6882,10 +6996,10 @@ static const struct unidata st97[] = {
 static const struct unidata st98[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2615,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2625,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd409,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
-{0,0,dd2611,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2621,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -6894,7 +7008,7 @@ static const struct unidata st98[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 06E0-06EF */
@@ -7106,29 +7220,105 @@ static const struct unidata st109[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 0800-080F */
+/* 0810-081F */
 static const struct unidata st110[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 0900-090F */
-static const struct unidata st111[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 0820-082F */
+static const struct unidata st111[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0830-083F */
+static const struct unidata st112[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0850-085F */
+static const struct unidata st113[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0860-086F */
+static const struct unidata st114[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0900-090F */
+static const struct unidata st115[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7145,7 +7335,7 @@ static const struct unidata st111[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0920-092F */
-static const struct unidata st112[] = {
+static const struct unidata st116[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7154,7 +7344,7 @@ static const struct unidata st112[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3771,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3870,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd410,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7164,26 +7354,26 @@ static const struct unidata st112[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0930-093F */
-static const struct unidata st113[] = {
-{0,0,dd3772,0,Lo,0,GBOther,WBALetter,SBOLetter},
+static const struct unidata st117[] = {
+{0,0,dd3871,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd411,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3773,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3872,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd412,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0940-094F */
-static const struct unidata st114[] = {
+static const struct unidata st118[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7198,19 +7388,19 @@ static const struct unidata st114[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0950-095F */
-static const struct unidata st115[] = {
+static const struct unidata st119[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd413,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd414,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd415,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7221,7 +7411,7 @@ static const struct unidata st115[] = {
 {dd420,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0960-096F */
-static const struct unidata st116[] = {
+static const struct unidata st120[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7240,18 +7430,18 @@ static const struct unidata st116[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
 };
 /* 0970-097F */
-static const struct unidata st117[] = {
+static const struct unidata st121[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7259,7 +7449,7 @@ static const struct unidata st117[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0980-098F */
-static const struct unidata st118[] = {
+static const struct unidata st122[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -7278,7 +7468,7 @@ static const struct unidata st118[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0990-099F */
-static const struct unidata st119[] = {
+static const struct unidata st123[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7297,7 +7487,7 @@ static const struct unidata st119[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 09A0-09AF */
-static const struct unidata st120[] = {
+static const struct unidata st124[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7316,7 +7506,7 @@ static const struct unidata st120[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 09B0-09BF */
-static const struct unidata st121[] = {
+static const struct unidata st125[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7335,7 +7525,7 @@ static const struct unidata st121[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 09C0-09CF */
-static const struct unidata st122[] = {
+static const struct unidata st126[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7343,7 +7533,7 @@ static const struct unidata st122[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3774,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3873,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7354,7 +7544,7 @@ static const struct unidata st122[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 09D0-09DF */
-static const struct unidata st123[] = {
+static const struct unidata st127[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7373,7 +7563,7 @@ static const struct unidata st123[] = {
 {dd425,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 09E0-09EF */
-static const struct unidata st124[] = {
+static const struct unidata st128[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7392,7 +7582,7 @@ static const struct unidata st124[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
 };
 /* 09F0-09FF */
-static const struct unidata st125[] = {
+static const struct unidata st129[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
@@ -7404,14 +7594,14 @@ static const struct unidata st125[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0A00-0A0F */
-static const struct unidata st126[] = {
+static const struct unidata st130[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7430,7 +7620,7 @@ static const struct unidata st126[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0A30-0A3F */
-static const struct unidata st127[] = {
+static const struct unidata st131[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7449,7 +7639,7 @@ static const struct unidata st127[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0A40-0A4F */
-static const struct unidata st128[] = {
+static const struct unidata st132[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7468,7 +7658,7 @@ static const struct unidata st128[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0A50-0A5F */
-static const struct unidata st129[] = {
+static const struct unidata st133[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7487,7 +7677,7 @@ static const struct unidata st129[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0A60-0A6F */
-static const struct unidata st130[] = {
+static const struct unidata st134[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7506,7 +7696,7 @@ static const struct unidata st130[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
 };
 /* 0A70-0A7F */
-static const struct unidata st131[] = {
+static const struct unidata st135[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7525,7 +7715,7 @@ static const struct unidata st131[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0A80-0A8F */
-static const struct unidata st132[] = {
+static const struct unidata st136[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7544,7 +7734,7 @@ static const struct unidata st132[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0A90-0A9F */
-static const struct unidata st133[] = {
+static const struct unidata st137[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7563,7 +7753,7 @@ static const struct unidata st133[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0AB0-0ABF */
-static const struct unidata st134[] = {
+static const struct unidata st138[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7582,7 +7772,7 @@ static const struct unidata st134[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0AC0-0ACF */
-static const struct unidata st135[] = {
+static const struct unidata st139[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7601,7 +7791,7 @@ static const struct unidata st135[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0AD0-0ADF */
-static const struct unidata st136[] = {
+static const struct unidata st140[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7620,7 +7810,7 @@ static const struct unidata st136[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0AF0-0AFF */
-static const struct unidata st137[] = {
+static const struct unidata st141[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7639,7 +7829,7 @@ static const struct unidata st137[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0B30-0B3F */
-static const struct unidata st138[] = {
+static const struct unidata st142[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7658,7 +7848,7 @@ static const struct unidata st138[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0B40-0B4F */
-static const struct unidata st139[] = {
+static const struct unidata st143[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7666,7 +7856,7 @@ static const struct unidata st139[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3775,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3874,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd432,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7677,7 +7867,7 @@ static const struct unidata st139[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0B50-0B5F */
-static const struct unidata st140[] = {
+static const struct unidata st144[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7696,15 +7886,15 @@ static const struct unidata st140[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0B70-0B7F */
-static const struct unidata st141[] = {
+static const struct unidata st145[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7715,7 +7905,7 @@ static const struct unidata st141[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0B80-0B8F */
-static const struct unidata st142[] = {
+static const struct unidata st146[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7734,10 +7924,10 @@ static const struct unidata st142[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0B90-0B9F */
-static const struct unidata st143[] = {
+static const struct unidata st147[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3776,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3875,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd437,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7753,7 +7943,7 @@ static const struct unidata st143[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0BA0-0BAF */
-static const struct unidata st144[] = {
+static const struct unidata st148[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7772,7 +7962,7 @@ static const struct unidata st144[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0BB0-0BBF */
-static const struct unidata st145[] = {
+static const struct unidata st149[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7791,15 +7981,15 @@ static const struct unidata st145[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0BC0-0BCF */
-static const struct unidata st146[] = {
+static const struct unidata st150[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3777,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3778,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3876,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3877,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd438,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -7810,7 +8000,7 @@ static const struct unidata st146[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0BD0-0BDF */
-static const struct unidata st147[] = {
+static const struct unidata st151[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7829,7 +8019,7 @@ static const struct unidata st147[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0BF0-0BFF */
-static const struct unidata st148[] = {
+static const struct unidata st152[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -7848,7 +8038,7 @@ static const struct unidata st148[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0C00-0C0F */
-static const struct unidata st149[] = {
+static const struct unidata st153[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -7867,7 +8057,7 @@ static const struct unidata st149[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0C10-0C1F */
-static const struct unidata st150[] = {
+static const struct unidata st154[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7886,7 +8076,7 @@ static const struct unidata st150[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0C30-0C3F */
-static const struct unidata st151[] = {
+static const struct unidata st155[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7905,14 +8095,14 @@ static const struct unidata st151[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0C40-0C4F */
-static const struct unidata st152[] = {
+static const struct unidata st156[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3779,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3878,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd441,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7924,7 +8114,7 @@ static const struct unidata st152[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0C50-0C5F */
-static const struct unidata st153[] = {
+static const struct unidata st157[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7943,7 +8133,7 @@ static const struct unidata st153[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0C70-0C7F */
-static const struct unidata st154[] = {
+static const struct unidata st158[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7962,7 +8152,7 @@ static const struct unidata st154[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0C80-0C8F */
-static const struct unidata st155[] = {
+static const struct unidata st159[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -7981,7 +8171,7 @@ static const struct unidata st155[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0CB0-0CBF */
-static const struct unidata st156[] = {
+static const struct unidata st160[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7997,21 +8187,21 @@ static const struct unidata st156[] = {
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3780,0,Mn,0,GBExtend,WBExtend,SBExtend}
+{0,0,dd3879,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0CC0-0CCF */
-static const struct unidata st157[] = {
+static const struct unidata st161[] = {
 {dd442,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3781,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3880,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd443,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd444,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd445,0,dd3782,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd445,0,dd3881,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd446,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8019,7 +8209,7 @@ static const struct unidata st157[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0CD0-0CDF */
-static const struct unidata st158[] = {
+static const struct unidata st162[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8038,10 +8228,10 @@ static const struct unidata st158[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0CF0-0CFF */
-static const struct unidata st159[] = {
+static const struct unidata st163[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8057,7 +8247,8 @@ static const struct unidata st159[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0D30-0D3F */
-static const struct unidata st160[] = {
+static const struct unidata st164[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8068,7 +8259,6 @@ static const struct unidata st160[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8076,26 +8266,26 @@ static const struct unidata st160[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0D40-0D4F */
-static const struct unidata st161[] = {
+static const struct unidata st165[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3783,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3784,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3882,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3883,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd447,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd448,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd449,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0D50-0D5F */
-static const struct unidata st162[] = {
+static const struct unidata st166[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8114,7 +8304,7 @@ static const struct unidata st162[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0D70-0D7F */
-static const struct unidata st163[] = {
+static const struct unidata st167[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -8133,7 +8323,7 @@ static const struct unidata st163[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0D80-0D8F */
-static const struct unidata st164[] = {
+static const struct unidata st168[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -8152,7 +8342,7 @@ static const struct unidata st164[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0D90-0D9F */
-static const struct unidata st165[] = {
+static const struct unidata st169[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8171,7 +8361,7 @@ static const struct unidata st165[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0DB0-0DBF */
-static const struct unidata st166[] = {
+static const struct unidata st170[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8190,7 +8380,7 @@ static const struct unidata st166[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0DC0-0DCF */
-static const struct unidata st167[] = {
+static const struct unidata st171[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8209,7 +8399,7 @@ static const struct unidata st167[] = {
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0DD0-0DDF */
-static const struct unidata st168[] = {
+static const struct unidata st172[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8219,16 +8409,16 @@ static const struct unidata st168[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3785,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3884,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd450,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{dd451,0,dd3786,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd451,0,dd3885,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd452,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd453,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0DF0-0DFF */
-static const struct unidata st169[] = {
+static const struct unidata st173[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -8247,7 +8437,7 @@ static const struct unidata st169[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E00-0E0F */
-static const struct unidata st170[] = {
+static const struct unidata st174[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8266,7 +8456,7 @@ static const struct unidata st170[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0E10-0E1F */
-static const struct unidata st171[] = {
+static const struct unidata st175[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8285,11 +8475,11 @@ static const struct unidata st171[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0E30-0E3F */
-static const struct unidata st172[] = {
-{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
+static const struct unidata st176[] = {
+{0,0,0,0,Lo,0,GBSpacingMark,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
-{dd454,0,0,0,Lo,CD,GBExtend,WBExtend,SBOLetter},
+{0,0,0,0,Lo,0,GBSpacingMark,WBOther,SBOLetter},
+{dd454,0,0,0,Lo,CD,GBSpacingMark,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8304,13 +8494,13 @@ static const struct unidata st172[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther}
 };
 /* 0E40-0E4F */
-static const struct unidata st173[] = {
+static const struct unidata st177[] = {
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
+{0,0,0,0,Lo,0,GBSpacingMark,WBOther,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,107,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8323,7 +8513,7 @@ static const struct unidata st173[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 0E50-0E5F */
-static const struct unidata st174[] = {
+static const struct unidata st178[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8342,7 +8532,7 @@ static const struct unidata st174[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E80-0E8F */
-static const struct unidata st175[] = {
+static const struct unidata st179[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8361,7 +8551,7 @@ static const struct unidata st175[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E90-0E9F */
-static const struct unidata st176[] = {
+static const struct unidata st180[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8380,7 +8570,7 @@ static const struct unidata st176[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0EA0-0EAF */
-static const struct unidata st177[] = {
+static const struct unidata st181[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8399,11 +8589,11 @@ static const struct unidata st177[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0EB0-0EBF */
-static const struct unidata st178[] = {
-{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
+static const struct unidata st182[] = {
+{0,0,0,0,Lo,0,GBSpacingMark,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
-{dd455,0,0,0,Lo,CD,GBExtend,WBExtend,SBOLetter},
+{0,0,0,0,Lo,0,GBSpacingMark,WBOther,SBOLetter},
+{dd455,0,0,0,Lo,CD,GBSpacingMark,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8418,7 +8608,7 @@ static const struct unidata st178[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0EC0-0ECF */
-static const struct unidata st179[] = {
+static const struct unidata st183[] = {
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
@@ -8437,7 +8627,7 @@ static const struct unidata st179[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0ED0-0EDF */
-static const struct unidata st180[] = {
+static const struct unidata st184[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8456,7 +8646,7 @@ static const struct unidata st180[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0F00-0F0F */
-static const struct unidata st181[] = {
+static const struct unidata st185[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -8475,7 +8665,7 @@ static const struct unidata st181[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 0F10-0F1F */
-static const struct unidata st182[] = {
+static const struct unidata st186[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -8494,7 +8684,7 @@ static const struct unidata st182[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0F20-0F2F */
-static const struct unidata st183[] = {
+static const struct unidata st187[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8513,7 +8703,7 @@ static const struct unidata st183[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 0F30-0F3F */
-static const struct unidata st184[] = {
+static const struct unidata st188[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -8532,7 +8722,7 @@ static const struct unidata st184[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0F40-0F4F */
-static const struct unidata st185[] = {
+static const struct unidata st189[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8551,7 +8741,7 @@ static const struct unidata st185[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0F50-0F5F */
-static const struct unidata st186[] = {
+static const struct unidata st190[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd461,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8570,7 +8760,7 @@ static const struct unidata st186[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0F60-0F6F */
-static const struct unidata st187[] = {
+static const struct unidata st191[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8589,7 +8779,7 @@ static const struct unidata st187[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0F70-0F7F */
-static const struct unidata st188[] = {
+static const struct unidata st192[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,129,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8608,7 +8798,7 @@ static const struct unidata st188[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0F80-0F8F */
-static const struct unidata st189[] = {
+static const struct unidata st193[] = {
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd471,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8621,13 +8811,13 @@ static const struct unidata st189[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0F90-0F9F */
-static const struct unidata st190[] = {
+static const struct unidata st194[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8646,7 +8836,7 @@ static const struct unidata st190[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0FA0-0FAF */
-static const struct unidata st191[] = {
+static const struct unidata st195[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd474,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8665,7 +8855,7 @@ static const struct unidata st191[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0FB0-0FBF */
-static const struct unidata st192[] = {
+static const struct unidata st196[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8684,7 +8874,7 @@ static const struct unidata st192[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0FC0-0FCF */
-static const struct unidata st193[] = {
+static const struct unidata st197[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -8703,18 +8893,18 @@ static const struct unidata st193[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0FD0-0FDF */
-static const struct unidata st194[] = {
+static const struct unidata st198[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8722,13 +8912,13 @@ static const struct unidata st194[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1020-102F */
-static const struct unidata st195[] = {
+static const struct unidata st199[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3787,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3886,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8741,7 +8931,7 @@ static const struct unidata st195[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1030-103F */
-static const struct unidata st196[] = {
+static const struct unidata st200[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8760,7 +8950,7 @@ static const struct unidata st196[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 1040-104F */
-static const struct unidata st197[] = {
+static const struct unidata st201[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8779,7 +8969,7 @@ static const struct unidata st197[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 1050-105F */
-static const struct unidata st198[] = {
+static const struct unidata st202[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8798,7 +8988,7 @@ static const struct unidata st198[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1060-106F */
-static const struct unidata st199[] = {
+static const struct unidata st203[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -8817,7 +9007,7 @@ static const struct unidata st199[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 1070-107F */
-static const struct unidata st200[] = {
+static const struct unidata st204[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8836,7 +9026,7 @@ static const struct unidata st200[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 1080-108F */
-static const struct unidata st201[] = {
+static const struct unidata st205[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8855,7 +9045,7 @@ static const struct unidata st201[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 1090-109F */
-static const struct unidata st202[] = {
+static const struct unidata st206[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8866,59 +9056,59 @@ static const struct unidata st202[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 10A0-10AF */
-static const struct unidata st203[] = {
-{0,dd4335,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4336,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4337,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4338,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4339,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4340,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4341,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4342,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4343,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4344,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4345,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4346,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4347,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4348,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4349,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4350,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st207[] = {
+{0,dd4438,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4439,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4440,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4441,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4442,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4443,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4444,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4445,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4446,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4447,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4448,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4449,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4450,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4451,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4452,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4453,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 10B0-10BF */
-static const struct unidata st204[] = {
-{0,dd4351,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4352,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4353,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4354,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4355,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4356,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4357,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4358,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4359,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4360,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4361,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4362,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4363,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4364,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4365,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4366,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st208[] = {
+{0,dd4454,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4455,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4456,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4457,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4458,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4459,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4460,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4461,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4462,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4463,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4464,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4465,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4466,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4467,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4468,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4469,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 10C0-10CF */
-static const struct unidata st205[] = {
-{0,dd4367,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4368,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4369,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4370,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4371,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4372,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st209[] = {
+{0,dd4470,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4471,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4472,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4473,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4474,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4475,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8931,7 +9121,7 @@ static const struct unidata st205[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10F0-10FF */
-static const struct unidata st206[] = {
+static const struct unidata st210[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8950,26 +9140,12 @@ static const struct unidata st206[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1100-110F */
-static const struct unidata st207[] = {
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+static const struct unidata st211[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter}
-};
-/* 1150-115F */
-static const struct unidata st208[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
@@ -8980,15 +9156,10 @@ static const struct unidata st208[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter}
 };
 /* 1160-116F */
-static const struct unidata st209[] = {
+static const struct unidata st212[] = {
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
@@ -9007,15 +9178,15 @@ static const struct unidata st209[] = {
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter}
 };
 /* 11A0-11AF */
-static const struct unidata st210[] = {
+static const struct unidata st213[] = {
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
@@ -9026,7 +9197,7 @@ static const struct unidata st210[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter}
 };
 /* 11B0-11BF */
-static const struct unidata st211[] = {
+static const struct unidata st214[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
@@ -9044,27 +9215,8 @@ static const struct unidata st211[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter}
 };
-/* 11F0-11FF */
-static const struct unidata st212[] = {
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
 /* 1240-124F */
-static const struct unidata st213[] = {
+static const struct unidata st215[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9083,7 +9235,7 @@ static const struct unidata st213[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1250-125F */
-static const struct unidata st214[] = {
+static const struct unidata st216[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9102,7 +9254,7 @@ static const struct unidata st214[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 12B0-12BF */
-static const struct unidata st215[] = {
+static const struct unidata st217[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9121,7 +9273,7 @@ static const struct unidata st215[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 12C0-12CF */
-static const struct unidata st216[] = {
+static const struct unidata st218[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9140,7 +9292,7 @@ static const struct unidata st216[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 12D0-12DF */
-static const struct unidata st217[] = {
+static const struct unidata st219[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9159,7 +9311,7 @@ static const struct unidata st217[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1350-135F */
-static const struct unidata st218[] = {
+static const struct unidata st220[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9173,12 +9325,12 @@ static const struct unidata st218[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1360-136F */
-static const struct unidata st219[] = {
+static const struct unidata st221[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
@@ -9197,7 +9349,7 @@ static const struct unidata st219[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 1370-137F */
-static const struct unidata st220[] = {
+static const struct unidata st222[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -9216,7 +9368,7 @@ static const struct unidata st220[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1390-139F */
-static const struct unidata st221[] = {
+static const struct unidata st223[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -9235,7 +9387,7 @@ static const struct unidata st221[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 13F0-13FF */
-static const struct unidata st222[] = {
+static const struct unidata st224[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9254,8 +9406,8 @@ static const struct unidata st222[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1400-140F */
-static const struct unidata st223[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st225[] = {
+{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9273,7 +9425,7 @@ static const struct unidata st223[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1660-166F */
-static const struct unidata st224[] = {
+static const struct unidata st226[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9291,27 +9443,8 @@ static const struct unidata st224[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1670-167F */
-static const struct unidata st225[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
 /* 1680-168F */
-static const struct unidata st226[] = {
+static const struct unidata st227[] = {
 {0,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9330,7 +9463,7 @@ static const struct unidata st226[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1690-169F */
-static const struct unidata st227[] = {
+static const struct unidata st228[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9349,7 +9482,7 @@ static const struct unidata st227[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 16E0-16EF */
-static const struct unidata st228[] = {
+static const struct unidata st229[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9368,7 +9501,7 @@ static const struct unidata st228[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
 };
 /* 16F0-16FF */
-static const struct unidata st229[] = {
+static const struct unidata st230[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9387,7 +9520,7 @@ static const struct unidata st229[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1700-170F */
-static const struct unidata st230[] = {
+static const struct unidata st231[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9406,7 +9539,7 @@ static const struct unidata st230[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1710-171F */
-static const struct unidata st231[] = {
+static const struct unidata st232[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9425,14 +9558,14 @@ static const struct unidata st231[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1730-173F */
-static const struct unidata st232[] = {
+static const struct unidata st233[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9444,7 +9577,7 @@ static const struct unidata st232[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1750-175F */
-static const struct unidata st233[] = {
+static const struct unidata st234[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9463,7 +9596,7 @@ static const struct unidata st233[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1770-177F */
-static const struct unidata st234[] = {
+static const struct unidata st235[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9482,7 +9615,7 @@ static const struct unidata st234[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17B0-17BF */
-static const struct unidata st235[] = {
+static const struct unidata st236[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9501,7 +9634,7 @@ static const struct unidata st235[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 17C0-17CF */
-static const struct unidata st236[] = {
+static const struct unidata st237[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -9520,7 +9653,7 @@ static const struct unidata st236[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 17D0-17DF */
-static const struct unidata st237[] = {
+static const struct unidata st238[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9539,7 +9672,7 @@ static const struct unidata st237[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17E0-17EF */
-static const struct unidata st238[] = {
+static const struct unidata st239[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9558,7 +9691,7 @@ static const struct unidata st238[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17F0-17FF */
-static const struct unidata st239[] = {
+static const struct unidata st240[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -9577,7 +9710,7 @@ static const struct unidata st239[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1800-180F */
-static const struct unidata st240[] = {
+static const struct unidata st241[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
@@ -9596,7 +9729,7 @@ static const struct unidata st240[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1840-184F */
-static const struct unidata st241[] = {
+static const struct unidata st242[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9615,7 +9748,7 @@ static const struct unidata st241[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1870-187F */
-static const struct unidata st242[] = {
+static const struct unidata st243[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9634,7 +9767,7 @@ static const struct unidata st242[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 18A0-18AF */
-static const struct unidata st243[] = {
+static const struct unidata st244[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9652,8 +9785,27 @@ static const struct unidata st243[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* 18F0-18FF */
+static const struct unidata st245[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 1910-191F */
-static const struct unidata st244[] = {
+static const struct unidata st246[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9672,7 +9824,7 @@ static const struct unidata st244[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1920-192F */
-static const struct unidata st245[] = {
+static const struct unidata st247[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9691,7 +9843,7 @@ static const struct unidata st245[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1930-193F */
-static const struct unidata st246[] = {
+static const struct unidata st248[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9710,7 +9862,7 @@ static const struct unidata st246[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1940-194F */
-static const struct unidata st247[] = {
+static const struct unidata st249[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9729,7 +9881,7 @@ static const struct unidata st247[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
 };
 /* 1960-196F */
-static const struct unidata st248[] = {
+static const struct unidata st250[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9748,7 +9900,7 @@ static const struct unidata st248[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1970-197F */
-static const struct unidata st249[] = {
+static const struct unidata st251[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9767,7 +9919,9 @@ static const struct unidata st249[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19A0-19AF */
-static const struct unidata st250[] = {
+static const struct unidata st252[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9778,15 +9932,13 @@ static const struct unidata st250[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19B0-19BF */
-static const struct unidata st251[] = {
+static const struct unidata st253[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -9805,7 +9957,7 @@ static const struct unidata st251[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 19C0-19CF */
-static const struct unidata st252[] = {
+static const struct unidata st254[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9824,7 +9976,7 @@ static const struct unidata st252[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19D0-19DF */
-static const struct unidata st253[] = {
+static const struct unidata st255[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9835,15 +9987,15 @@ static const struct unidata st253[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 19E0-19EF */
-static const struct unidata st254[] = {
+static const struct unidata st256[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -9862,7 +10014,7 @@ static const struct unidata st254[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 1A10-1A1F */
-static const struct unidata st255[] = {
+static const struct unidata st257[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9880,29 +10032,105 @@ static const struct unidata st255[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
+/* 1A50-1A5F */
+static const struct unidata st258[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1A60-1A6F */
+static const struct unidata st259[] = {
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+};
+/* 1A70-1A7F */
+static const struct unidata st260[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1AA0-1AAF */
+static const struct unidata st261[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 1B00-1B0F */
-static const struct unidata st256[] = {
+static const struct unidata st262[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3788,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3887,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd480,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3789,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3888,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd481,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3790,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3889,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd482,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3791,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3890,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd483,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3792,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3891,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd484,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1B10-1B1F */
-static const struct unidata st257[] = {
+static const struct unidata st263[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3793,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3892,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd485,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9919,7 +10147,7 @@ static const struct unidata st257[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1B30-1B3F */
-static const struct unidata st258[] = {
+static const struct unidata st264[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9930,18 +10158,18 @@ static const struct unidata st258[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,dd3794,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3893,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd486,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3795,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3894,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd487,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3796,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3797,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+{0,0,dd3895,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3896,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 1B40-1B4F */
-static const struct unidata st259[] = {
+static const struct unidata st265[] = {
 {dd488,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {dd489,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,dd3798,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3897,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd490,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9957,7 +10185,7 @@ static const struct unidata st259[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1B50-1B5F */
-static const struct unidata st260[] = {
+static const struct unidata st266[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9976,7 +10204,7 @@ static const struct unidata st260[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* 1B60-1B6F */
-static const struct unidata st261[] = {
+static const struct unidata st267[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -9995,7 +10223,7 @@ static const struct unidata st261[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1B70-1B7F */
-static const struct unidata st262[] = {
+static const struct unidata st268[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10014,7 +10242,7 @@ static const struct unidata st262[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1B80-1B8F */
-static const struct unidata st263[] = {
+static const struct unidata st269[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -10033,7 +10261,7 @@ static const struct unidata st263[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1BA0-1BAF */
-static const struct unidata st264[] = {
+static const struct unidata st270[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10051,8 +10279,46 @@ static const struct unidata st264[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
+/* 1BE0-1BEF */
+static const struct unidata st271[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1BF0-1BFF */
+static const struct unidata st272[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
 /* 1C20-1C2F */
-static const struct unidata st265[] = {
+static const struct unidata st273[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -10071,7 +10337,7 @@ static const struct unidata st265[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1C30-1C3F */
-static const struct unidata st266[] = {
+static const struct unidata st274[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10090,7 +10356,7 @@ static const struct unidata st266[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 1C40-1C4F */
-static const struct unidata st267[] = {
+static const struct unidata st275[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -10109,7 +10375,7 @@ static const struct unidata st267[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1C70-1C7F */
-static const struct unidata st268[] = {
+static const struct unidata st276[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -10127,46 +10393,103 @@ static const struct unidata st268[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
-/* 1D20-1D2F */
-static const struct unidata st269[] = {
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd492,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd493,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBLower}
+/* 1CD0-1CDF */
+static const struct unidata st277[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* 1D30-1D3F */
-static const struct unidata st270[] = {
-{dd494,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd495,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd496,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd497,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd498,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd499,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd500,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd501,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd502,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd503,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd504,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBLower},
-{dd505,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{dd506,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+/* 1CE0-1CEF */
+static const struct unidata st278[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 1CF0-1CFF */
+static const struct unidata st279[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1D20-1D2F */
+static const struct unidata st280[] = {
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd492,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd493,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBLower}
+};
+/* 1D30-1D3F */
+static const struct unidata st281[] = {
+{dd494,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd495,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd496,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd497,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd498,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd499,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd500,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd501,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd502,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd503,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd504,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBLower},
+{dd505,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{dd506,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd507,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd508,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D40-1D4F */
-static const struct unidata st271[] = {
+static const struct unidata st282[] = {
 {dd509,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd510,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd511,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -10185,7 +10508,7 @@ static const struct unidata st271[] = {
 {dd522,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D50-1D5F */
-static const struct unidata st272[] = {
+static const struct unidata st283[] = {
 {dd523,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd524,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -10204,7 +10527,7 @@ static const struct unidata st272[] = {
 {dd536,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D60-1D6F */
-static const struct unidata st273[] = {
+static const struct unidata st284[] = {
 {dd337,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -10223,7 +10546,7 @@ static const struct unidata st273[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1D70-1D7F */
-static const struct unidata st274[] = {
+static const struct unidata st285[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -10242,7 +10565,7 @@ static const struct unidata st274[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1D90-1D9F */
-static const struct unidata st275[] = {
+static const struct unidata st286[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -10261,7 +10584,7 @@ static const struct unidata st275[] = {
 {dd520,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DA0-1DAF */
-static const struct unidata st276[] = {
+static const struct unidata st287[] = {
 {dd544,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd545,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd546,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -10280,7 +10603,7 @@ static const struct unidata st276[] = {
 {dd559,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DB0-1DBF */
-static const struct unidata st277[] = {
+static const struct unidata st288[] = {
 {dd560,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd561,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd562,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -10299,7 +10622,7 @@ static const struct unidata st277[] = {
 {dd333,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DC0-1DCF */
-static const struct unidata st278[] = {
+static const struct unidata st289[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10318,7 +10641,7 @@ static const struct unidata st278[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1DD0-1DDF */
-static const struct unidata st279[] = {
+static const struct unidata st290[] = {
 {0,0,0,202,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10337,7 +10660,7 @@ static const struct unidata st279[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1DE0-1DEF */
-static const struct unidata st280[] = {
+static const struct unidata st291[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10356,9 +10679,7 @@ static const struct unidata st280[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1DF0-1DFF */
-static const struct unidata st281[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st292[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -10371,453 +10692,455 @@ static const struct unidata st281[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,233,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1E00-1E0F */
-static const struct unidata st282[] = {
-{dd575,dd4373,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st293[] = {
+{dd575,dd4476,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd576,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd577,dd4374,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd577,dd4477,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd578,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd579,dd4375,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd579,dd4478,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd580,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd581,dd4376,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd581,dd4479,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd582,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd583,dd3678,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd583,dd3777,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd584,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd585,dd4377,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd585,dd4480,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd586,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd587,dd4378,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd587,dd4481,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd588,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd589,dd4379,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd589,dd4482,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd590,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E10-1E1F */
-static const struct unidata st283[] = {
-{dd591,dd4380,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st294[] = {
+{dd591,dd4483,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd592,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd593,dd4381,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd593,dd4484,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd594,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd595,dd4382,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd595,dd4485,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd596,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd597,dd4383,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd597,dd4486,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd598,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd599,dd4384,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd599,dd4487,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd600,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd601,dd4385,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd601,dd4488,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd602,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd603,dd3711,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd603,dd3810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd604,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd605,dd3641,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd605,dd3740,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd606,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E20-1E2F */
-static const struct unidata st284[] = {
-{dd607,dd4386,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st295[] = {
+{dd607,dd4489,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd608,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd609,dd4387,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd609,dd4490,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd610,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd611,dd4388,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd611,dd4491,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd612,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd613,dd4389,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd613,dd4492,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd614,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd615,dd4390,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd615,dd4493,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd616,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd617,dd4391,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd617,dd4494,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd618,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd619,dd4392,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd619,dd4495,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd620,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd621,dd3680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd621,dd3779,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd622,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E30-1E3F */
-static const struct unidata st285[] = {
-{dd623,dd4393,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st296[] = {
+{dd623,dd4496,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd624,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd625,dd4394,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd625,dd4497,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd626,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd627,dd4395,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd627,dd4498,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd628,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd629,dd4396,dd3799,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd630,0,dd3800,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd631,dd3800,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd629,dd4499,dd3898,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd630,0,dd3899,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd631,dd3899,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd632,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd633,dd4397,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd633,dd4500,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd634,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd635,dd4398,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd635,dd4501,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd636,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd637,dd4399,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd637,dd4502,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd638,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E40-1E4F */
-static const struct unidata st286[] = {
-{dd639,dd4400,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st297[] = {
+{dd639,dd4503,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd640,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd641,dd4401,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd641,dd4504,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd642,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd643,dd4402,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd643,dd4505,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd644,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd645,dd4403,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd645,dd4506,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd646,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd647,dd4404,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd647,dd4507,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd648,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd649,dd4405,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd649,dd4508,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd650,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd651,dd4406,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd651,dd4509,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd652,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd653,dd4407,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd653,dd4510,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd654,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E50-1E5F */
-static const struct unidata st287[] = {
-{dd655,dd4408,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st298[] = {
+{dd655,dd4511,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd656,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd657,dd4409,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd657,dd4512,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd658,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd659,dd4410,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd659,dd4513,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd660,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd661,dd4411,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd661,dd4514,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd662,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd663,dd4412,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd663,dd4515,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd664,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd665,dd4413,dd3801,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd666,0,dd3802,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd667,dd3802,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd665,dd4516,dd3900,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd666,0,dd3901,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd667,dd3901,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd668,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd669,dd4414,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd669,dd4517,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd670,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E60-1E6F */
-static const struct unidata st288[] = {
-{dd671,dd4415,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st299[] = {
+{dd671,dd4518,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd672,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd673,dd4416,dd3803,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd674,0,dd3804,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd675,dd3693,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd673,dd4519,dd3902,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd674,0,dd3903,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd675,dd3792,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd676,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd677,dd3695,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd677,dd3794,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd678,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd679,dd3804,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd679,dd3903,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd680,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd681,dd4417,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd681,dd4520,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd682,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd683,dd4418,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd683,dd4521,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd684,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd685,dd4419,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd685,dd4522,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd686,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E70-1E7F */
-static const struct unidata st289[] = {
-{dd687,dd4420,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st300[] = {
+{dd687,dd4523,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd688,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd689,dd4421,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd689,dd4524,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd690,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd691,dd4422,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd691,dd4525,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd692,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd693,dd4423,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd693,dd4526,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd694,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd695,dd3697,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd695,dd3796,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd696,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd697,dd3699,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd697,dd3798,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd698,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd699,dd4424,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd699,dd4527,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd700,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd701,dd4425,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd701,dd4528,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd702,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E80-1E8F */
-static const struct unidata st290[] = {
-{dd703,dd4426,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st301[] = {
+{dd703,dd4529,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd704,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd705,dd4427,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd705,dd4530,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd706,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd707,dd4428,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd707,dd4531,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd708,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd709,dd4429,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd709,dd4532,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd710,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd711,dd4430,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd711,dd4533,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd712,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd713,dd4431,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd713,dd4534,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd714,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd715,dd4432,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd715,dd4535,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd716,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd717,dd4433,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd717,dd4536,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd718,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E90-1E9F */
-static const struct unidata st291[] = {
-{dd719,dd4434,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st302[] = {
+{dd719,dd4537,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd720,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd721,dd4435,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd721,dd4538,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd722,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd723,dd4436,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd723,dd4539,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd724,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd725,dd725,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd726,dd726,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd727,dd727,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd728,dd728,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd729,dd729,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd730,dd4415,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd730,dd4518,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4000,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4101,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EA0-1EAF */
-static const struct unidata st292[] = {
-{dd731,dd4437,dd3805,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd732,0,dd3806,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd733,dd4438,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st303[] = {
+{dd731,dd4540,dd3904,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd732,0,dd3905,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd733,dd4541,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd734,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd735,dd4439,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd735,dd4542,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd736,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd737,dd4440,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd737,dd4543,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd738,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd739,dd4441,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd739,dd4544,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd740,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd741,dd4442,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd741,dd4545,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd742,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd743,dd4443,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd743,dd4546,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd744,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd745,dd4444,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd745,dd4547,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd746,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EB0-1EBF */
-static const struct unidata st293[] = {
-{dd747,dd4445,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st304[] = {
+{dd747,dd4548,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd748,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd749,dd4446,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd749,dd4549,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd750,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd751,dd4447,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd751,dd4550,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd752,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd753,dd4448,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd753,dd4551,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd754,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd755,dd4449,dd3807,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd756,0,dd3808,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd757,dd4450,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd755,dd4552,dd3906,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd756,0,dd3907,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd757,dd4553,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd758,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd759,dd4451,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd759,dd4554,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd760,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd761,dd4452,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd761,dd4555,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd762,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EC0-1ECF */
-static const struct unidata st294[] = {
-{dd763,dd4453,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st305[] = {
+{dd763,dd4556,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd764,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd765,dd4454,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd765,dd4557,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd766,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd767,dd4455,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd767,dd4558,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd768,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd769,dd3808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd769,dd3907,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd770,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd771,dd4456,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd771,dd4559,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd772,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd773,dd4457,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd773,dd4560,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd774,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd775,dd4458,dd3809,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd776,0,dd3810,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd777,dd4459,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd775,dd4561,dd3908,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd776,0,dd3909,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd777,dd4562,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd778,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1ED0-1EDF */
-static const struct unidata st295[] = {
-{dd779,dd4460,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st306[] = {
+{dd779,dd4563,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd780,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd781,dd4461,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd781,dd4564,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd782,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd783,dd4462,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd783,dd4565,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd784,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd785,dd4463,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd785,dd4566,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd786,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd787,dd3810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd787,dd3909,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd788,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd789,dd4464,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd789,dd4567,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd790,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd791,dd4465,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd791,dd4568,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd792,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd793,dd4466,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd793,dd4569,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd794,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EE0-1EEF */
-static const struct unidata st296[] = {
-{dd795,dd4467,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st307[] = {
+{dd795,dd4570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd796,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd797,dd4468,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd797,dd4571,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd798,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd799,dd4469,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd799,dd4572,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd800,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd801,dd4470,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd801,dd4573,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd802,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd803,dd4471,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd803,dd4574,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd804,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd805,dd4472,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd805,dd4575,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd806,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd807,dd4473,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd807,dd4576,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd808,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd809,dd4474,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd809,dd4577,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd810,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EF0-1EFF */
-static const struct unidata st297[] = {
-{dd811,dd4475,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st308[] = {
+{dd811,dd4578,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd812,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd813,dd4476,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd813,dd4579,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd814,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd815,dd4477,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd815,dd4580,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd816,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd817,dd4478,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd817,dd4581,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd818,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd819,dd4479,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd819,dd4582,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd820,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4480,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4583,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4481,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4584,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4482,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4585,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1F00-1F0F */
-static const struct unidata st298[] = {
-{dd821,0,dd3811,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd822,0,dd3812,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd823,0,dd3813,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd824,0,dd3814,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd825,0,dd3815,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd826,0,dd3816,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd827,0,dd3817,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd828,0,dd3818,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd829,dd4483,dd3819,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd830,dd4484,dd3820,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd831,dd4485,dd3821,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd832,dd4486,dd3822,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd833,dd4487,dd3823,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd834,dd4488,dd3824,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd835,dd4489,dd3825,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd836,dd4490,dd3826,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st309[] = {
+{dd821,0,dd3910,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd822,0,dd3911,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd823,0,dd3912,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd824,0,dd3913,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd825,0,dd3914,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd826,0,dd3915,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd827,0,dd3916,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd828,0,dd3917,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd829,dd4586,dd3918,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd830,dd4587,dd3919,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd831,dd4588,dd3920,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd832,dd4589,dd3921,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd833,dd4590,dd3922,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd834,dd4591,dd3923,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd835,dd4592,dd3924,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd836,dd4593,dd3925,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F10-1F1F */
-static const struct unidata st299[] = {
-{dd837,0,dd3827,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd838,0,dd3828,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st310[] = {
+{dd837,0,dd3926,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd838,0,dd3927,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd839,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd840,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd841,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd842,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd843,dd4491,dd3829,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd844,dd4492,dd3830,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd845,dd4493,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd846,dd4494,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd847,dd4495,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd848,dd4496,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd843,dd4594,dd3928,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd844,dd4595,dd3929,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd845,dd4596,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd846,dd4597,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd847,dd4598,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd848,dd4599,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F20-1F2F */
-static const struct unidata st300[] = {
-{dd849,0,dd3831,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd850,0,dd3832,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd851,0,dd3833,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd852,0,dd3834,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd853,0,dd3835,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd854,0,dd3836,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd855,0,dd3837,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd856,0,dd3838,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd857,dd4497,dd3839,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd858,dd4498,dd3840,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd859,dd4499,dd3841,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd860,dd4500,dd3842,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd861,dd4501,dd3843,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd862,dd4502,dd3844,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd863,dd4503,dd3845,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd864,dd4504,dd3846,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st311[] = {
+{dd849,0,dd3930,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd850,0,dd3931,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd851,0,dd3932,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd852,0,dd3933,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd853,0,dd3934,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd854,0,dd3935,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd855,0,dd3936,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd856,0,dd3937,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd857,dd4600,dd3938,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd858,dd4601,dd3939,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd859,dd4602,dd3940,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd860,dd4603,dd3941,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd861,dd4604,dd3942,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd862,dd4605,dd3943,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd863,dd4606,dd3944,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd864,dd4607,dd3945,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F30-1F3F */
-static const struct unidata st301[] = {
-{dd865,0,dd3847,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd866,0,dd3848,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st312[] = {
+{dd865,0,dd3946,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd866,0,dd3947,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd867,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd868,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd869,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd870,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd871,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd872,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd873,dd4505,dd3849,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd874,dd4506,dd3850,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd875,dd4507,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd876,dd4508,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd877,dd4509,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd878,dd4510,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd879,dd4511,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd880,dd4512,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd873,dd4608,dd3948,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd874,dd4609,dd3949,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd875,dd4610,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd876,dd4611,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd877,dd4612,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd878,dd4613,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd879,dd4614,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd880,dd4615,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F40-1F4F */
-static const struct unidata st302[] = {
-{dd881,0,dd3851,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd882,0,dd3852,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st313[] = {
+{dd881,0,dd3950,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd882,0,dd3951,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd883,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd884,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd885,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd886,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd887,dd4513,dd3853,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd888,dd4514,dd3854,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd889,dd4515,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd890,dd4516,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd891,dd4517,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd892,dd4518,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd887,dd4616,dd3952,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd888,dd4617,dd3953,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd889,dd4618,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd890,dd4619,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd891,dd4620,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd892,dd4621,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F50-1F5F */
-static const struct unidata st303[] = {
-{dd893,dd893,dd3855,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd894,0,dd3856,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd895,dd4519,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+static const struct unidata st314[] = {
+{dd893,dd893,dd3954,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd894,0,dd3955,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd895,dd4622,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd896,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd897,dd4520,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd897,dd4623,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd898,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd899,dd4521,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd899,dd4624,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd900,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd901,dd4522,dd3857,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd901,dd4625,dd3956,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd902,dd4523,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd902,dd4626,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd903,dd4524,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd903,dd4627,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd904,dd4525,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd904,dd4628,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F60-1F6F */
-static const struct unidata st304[] = {
-{dd905,0,dd3858,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd906,0,dd3859,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd907,0,dd3860,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd908,0,dd3861,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd909,0,dd3862,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd910,0,dd3863,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd911,0,dd3864,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd912,0,dd3865,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd913,dd4526,dd3866,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd914,dd4527,dd3867,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd915,dd4528,dd3868,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd916,dd4529,dd3869,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd917,dd4530,dd3870,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd918,dd4531,dd3871,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd919,dd4532,dd3872,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd920,dd4533,dd3873,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st315[] = {
+{dd905,0,dd3957,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd906,0,dd3958,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd907,0,dd3959,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd908,0,dd3960,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd909,0,dd3961,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd910,0,dd3962,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd911,0,dd3963,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd912,0,dd3964,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd913,dd4629,dd3965,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd914,dd4630,dd3966,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd915,dd4631,dd3967,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd916,dd4632,dd3968,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd917,dd4633,dd3969,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd918,dd4634,dd3970,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd919,dd4635,dd3971,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd920,dd4636,dd3972,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F70-1F7F */
-static const struct unidata st305[] = {
-{dd921,0,dd3874,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st316[] = {
+{dd921,0,dd3973,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd922,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd923,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd924,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd925,0,dd3875,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd925,0,dd3974,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd926,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd927,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd928,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -10825,165 +11148,165 @@ static const struct unidata st305[] = {
 {dd930,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd931,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd932,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd933,0,dd3876,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd933,0,dd3975,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd934,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F80-1F8F */
-static const struct unidata st306[] = {
-{dd935,dd4534,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd936,dd4535,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd937,dd4536,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd938,dd4537,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd939,dd4538,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd940,dd4539,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd941,dd4540,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd942,dd4541,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd943,dd4534,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd944,dd4535,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd945,dd4536,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd946,dd4537,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd947,dd4538,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd948,dd4539,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd949,dd4540,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd950,dd4541,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st317[] = {
+{dd935,dd4637,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd936,dd4638,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd937,dd4639,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd938,dd4640,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd939,dd4641,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd940,dd4642,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd941,dd4643,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd942,dd4644,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd943,dd4637,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd944,dd4638,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd945,dd4639,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd946,dd4640,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd947,dd4641,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd948,dd4642,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd949,dd4643,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd950,dd4644,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F90-1F9F */
-static const struct unidata st307[] = {
-{dd951,dd4542,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd952,dd4543,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd953,dd4544,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd954,dd4545,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd955,dd4546,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd956,dd4547,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd957,dd4548,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd958,dd4549,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd959,dd4542,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd960,dd4543,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd961,dd4544,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd962,dd4545,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd963,dd4546,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd964,dd4547,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd965,dd4548,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd966,dd4549,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st318[] = {
+{dd951,dd4645,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd952,dd4646,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd953,dd4647,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd954,dd4648,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd955,dd4649,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd956,dd4650,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd957,dd4651,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd958,dd4652,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd959,dd4645,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd960,dd4646,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd961,dd4647,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd962,dd4648,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd963,dd4649,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd964,dd4650,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd965,dd4651,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd966,dd4652,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1FA0-1FAF */
-static const struct unidata st308[] = {
-{dd967,dd4550,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd968,dd4551,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd969,dd4552,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd970,dd4553,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd971,dd4554,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd972,dd4555,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd973,dd4556,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd974,dd4557,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd975,dd4550,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd976,dd4551,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd977,dd4552,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd978,dd4553,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd979,dd4554,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd980,dd4555,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd981,dd4556,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd982,dd4557,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st319[] = {
+{dd967,dd4653,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd968,dd4654,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd969,dd4655,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd970,dd4656,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd971,dd4657,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd972,dd4658,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd973,dd4659,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd974,dd4660,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd975,dd4653,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd976,dd4654,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd977,dd4655,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd978,dd4656,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd979,dd4657,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd980,dd4658,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd981,dd4659,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd982,dd4660,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1FB0-1FBF */
-static const struct unidata st309[] = {
+static const struct unidata st320[] = {
 {dd983,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd984,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd985,dd4558,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd986,dd4559,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd987,dd4560,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd988,dd988,dd3877,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd989,dd4561,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd990,dd4562,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd991,dd4563,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd992,dd4564,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd993,dd4565,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd994,dd4559,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd985,dd4661,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd986,dd4662,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd987,dd4663,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd988,dd988,dd3976,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd989,dd4664,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd990,dd4665,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd991,dd4666,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd992,dd4667,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd993,dd4668,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd994,dd4662,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd995,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd996,dd996,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd995,0,dd3878,0,Sk,CD,GBOther,WBOther,SBOther}
+{dd995,0,dd3977,0,Sk,CD,GBOther,WBOther,SBOther}
 };
 /* 1FC0-1FCF */
-static const struct unidata st310[] = {
+static const struct unidata st321[] = {
 {dd997,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd998,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{dd999,dd4566,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1000,dd4567,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1001,dd4568,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1002,dd1002,dd3879,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1003,dd4569,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1004,dd4570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1005,dd4571,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1006,dd4572,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1007,dd4573,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1008,dd4567,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd999,dd4669,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1000,dd4670,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1001,dd4671,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1002,dd1002,dd3978,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1003,dd4672,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1004,dd4673,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1005,dd4674,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1006,dd4675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1007,dd4676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1008,dd4670,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd1009,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1010,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1011,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FD0-1FDF */
-static const struct unidata st311[] = {
+static const struct unidata st322[] = {
 {dd1012,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1013,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1014,dd4574,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1015,dd4145,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1014,dd4677,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1015,dd4246,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1016,dd1016,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1017,dd4575,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1018,dd4576,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1019,dd4577,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1020,dd4578,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1021,dd4579,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1017,dd4678,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1018,dd4679,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1019,dd4680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1020,dd4681,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1021,dd4682,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1022,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1023,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1024,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FE0-1FEF */
-static const struct unidata st312[] = {
+static const struct unidata st323[] = {
 {dd1025,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1026,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1027,dd4580,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1028,dd4148,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1027,dd4683,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1028,dd4249,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd1029,dd1029,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd1030,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1031,dd1031,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1032,dd4581,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1033,dd4582,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1034,dd4583,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1035,dd4584,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1036,dd4585,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1037,dd4586,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1032,dd4684,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1033,dd4685,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1034,dd4686,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1035,dd4687,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1036,dd4688,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1037,dd4689,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd1038,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1039,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1040,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FF0-1FFF */
-static const struct unidata st313[] = {
+static const struct unidata st324[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1041,dd4587,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1042,dd4588,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1043,dd4589,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1041,dd4690,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1042,dd4691,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1043,dd4692,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1044,dd1044,dd3880,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1045,dd4590,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1046,dd4591,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1047,dd4592,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1048,dd4593,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1049,dd4594,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1050,dd4588,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd1044,dd1044,dd3979,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1045,dd4693,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1046,dd4694,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1047,dd4695,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1048,dd4696,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1049,dd4697,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1050,dd4691,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd1051,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{dd1052,0,dd3881,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd1052,0,dd3980,0,Sk,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2000-200F */
-static const struct unidata st314[] = {
+static const struct unidata st325[] = {
 {dd1053,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {dd1054,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
@@ -10995,14 +11318,14 @@ static const struct unidata st314[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBOther,SBFormat},
 {0,0,0,0,Cf,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cf,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
 /* 2010-201F */
-static const struct unidata st315[] = {
+static const struct unidata st326[] = {
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {dd1055,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
@@ -11021,7 +11344,7 @@ static const struct unidata st315[] = {
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose}
 };
 /* 2020-202F */
-static const struct unidata st316[] = {
+static const struct unidata st327[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -11040,7 +11363,7 @@ static const struct unidata st316[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp}
 };
 /* 2030-203F */
-static const struct unidata st317[] = {
+static const struct unidata st328[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -11059,7 +11382,7 @@ static const struct unidata st317[] = {
 {0,0,0,0,Pc,0,GBOther,WBExtendNumLet,SBOther}
 };
 /* 2040-204F */
-static const struct unidata st318[] = {
+static const struct unidata st329[] = {
 {0,0,0,0,Pc,0,GBOther,WBExtendNumLet,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -11078,7 +11401,7 @@ static const struct unidata st318[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2050-205F */
-static const struct unidata st319[] = {
+static const struct unidata st330[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11097,7 +11420,7 @@ static const struct unidata st319[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp}
 };
 /* 2060-206F */
-static const struct unidata st320[] = {
+static const struct unidata st331[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
@@ -11116,9 +11439,9 @@ static const struct unidata st320[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
 /* 2070-207F */
-static const struct unidata st321[] = {
+static const struct unidata st332[] = {
 {dd1070,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1071,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11132,10 +11455,10 @@ static const struct unidata st321[] = {
 {dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd1082,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 2080-208F */
-static const struct unidata st322[] = {
+static const struct unidata st333[] = {
 {dd1070,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd9,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd4,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11154,26 +11477,26 @@ static const struct unidata st322[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2090-209F */
-static const struct unidata st323[] = {
+static const struct unidata st334[] = {
 {dd2,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd517,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd301,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd518,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd284,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd522,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd300,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd523,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd1082,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd528,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd180,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
+{dd529,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 20A0-20AF */
-static const struct unidata st324[] = {
+static const struct unidata st335[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
@@ -11192,17 +11515,17 @@ static const struct unidata st324[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther}
 };
 /* 20B0-20BF */
-static const struct unidata st325[] = {
+static const struct unidata st336[] = {
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11211,7 +11534,7 @@ static const struct unidata st325[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 20D0-20DF */
-static const struct unidata st326[] = {
+static const struct unidata st337[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -11230,7 +11553,7 @@ static const struct unidata st326[] = {
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend}
 };
 /* 20E0-20EF */
-static const struct unidata st327[] = {
+static const struct unidata st338[] = {
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
@@ -11249,7 +11572,7 @@ static const struct unidata st327[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 20F0-20FF */
-static const struct unidata st328[] = {
+static const struct unidata st339[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11268,7 +11591,7 @@ static const struct unidata st328[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2100-210F */
-static const struct unidata st329[] = {
+static const struct unidata st340[] = {
 {dd1084,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1085,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -11287,7 +11610,7 @@ static const struct unidata st329[] = {
 {dd1092,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 2110-211F */
-static const struct unidata st330[] = {
+static const struct unidata st341[] = {
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -11296,7 +11619,7 @@ static const struct unidata st330[] = {
 {dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1093,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -11306,29 +11629,29 @@ static const struct unidata st330[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2120-212F */
-static const struct unidata st331[] = {
+static const struct unidata st342[] = {
 {dd1095,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1096,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1097,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1099,dd3129,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1099,dd3142,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd501,dd522,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1100,dd3976,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1100,dd4077,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 2130-213F */
-static const struct unidata st332[] = {
+static const struct unidata st343[] = {
 {dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,dd4595,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4698,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd1102,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -11344,7 +11667,7 @@ static const struct unidata st332[] = {
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 2140-214F */
-static const struct unidata st333[] = {
+static const struct unidata st344[] = {
 {dd1109,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11363,10 +11686,7 @@ static const struct unidata st333[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2150-215F */
-static const struct unidata st334[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st345[] = {
 {dd1110,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1111,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1112,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11379,58 +11699,61 @@ static const struct unidata st334[] = {
 {dd1119,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1120,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1121,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1122,0,0,0,No,CD,GBOther,WBOther,SBOther}
+{dd1122,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1123,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1124,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1125,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 2160-216F */
-static const struct unidata st335[] = {
-{dd499,dd4596,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1123,dd4597,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1124,dd4598,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1125,dd4599,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4600,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1127,dd4601,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1128,dd4602,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1129,dd4603,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1130,dd4604,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4605,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1132,dd4606,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1133,dd4607,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4608,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4609,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4610,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4611,0,0,Nl,CD,GBOther,WBALetter,SBUpper}
+static const struct unidata st346[] = {
+{dd499,dd4699,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1126,dd4700,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1127,dd4701,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1128,dd4702,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1129,dd4703,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1130,dd4704,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1131,dd4705,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1132,dd4706,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1133,dd4707,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1134,dd4708,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1135,dd4709,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1136,dd4710,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4711,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4712,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4713,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4714,0,0,Nl,CD,GBOther,WBALetter,SBUpper}
 };
 /* 2170-217F */
-static const struct unidata st336[] = {
+static const struct unidata st347[] = {
 {dd538,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
-{dd1134,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
-{dd1135,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
-{dd1136,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1137,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1138,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1139,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1140,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1141,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1142,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
+{dd1143,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
+{dd1144,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
+{dd1145,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd300,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd541,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd516,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd523,0,0,0,Nl,CD,GBOther,WBALetter,SBLower}
 };
 /* 2180-218F */
-static const struct unidata st337[] = {
+static const struct unidata st348[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,dd4612,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4715,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1146,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11439,26 +11762,26 @@ static const struct unidata st337[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2190-219F */
-static const struct unidata st338[] = {
-{0,0,dd3882,0,Sm,0,GBOther,WBOther,SBOther},
+static const struct unidata st349[] = {
+{0,0,dd3981,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3883,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3982,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3884,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3983,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1143,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1144,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1147,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1148,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21A0-21AF */
-static const struct unidata st339[] = {
+static const struct unidata st350[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11473,11 +11796,11 @@ static const struct unidata st339[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1145,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1149,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21C0-21CF */
-static const struct unidata st340[] = {
+static const struct unidata st351[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11491,17 +11814,17 @@ static const struct unidata st340[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1146,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1147,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1148,0,0,0,Sm,0,GBOther,WBOther,SBOther}
+{dd1150,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd1151,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1152,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 21D0-21DF */
-static const struct unidata st341[] = {
-{0,0,dd3885,0,So,0,GBOther,WBOther,SBOther},
+static const struct unidata st352[] = {
+{0,0,dd3984,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,dd3886,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3985,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,dd3887,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3986,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11515,7 +11838,7 @@ static const struct unidata st341[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21F0-21FF */
-static const struct unidata st342[] = {
+static const struct unidata st353[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11534,26 +11857,26 @@ static const struct unidata st342[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2200-220F */
-static const struct unidata st343[] = {
+static const struct unidata st354[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3888,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1149,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3987,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1153,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3889,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1150,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3988,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1154,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3890,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1151,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3989,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1155,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2210-221F */
-static const struct unidata st344[] = {
+static const struct unidata st355[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11572,27 +11895,27 @@ static const struct unidata st344[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2220-222F */
-static const struct unidata st345[] = {
+static const struct unidata st356[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3891,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1152,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3892,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1153,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3990,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1156,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3991,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1157,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1154,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd1155,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1158,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1159,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1156,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+{dd1160,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
 };
 /* 2230-223F */
-static const struct unidata st346[] = {
-{dd1157,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+static const struct unidata st357[] = {
+{dd1161,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11604,38 +11927,38 @@ static const struct unidata st346[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3893,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3992,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2240-224F */
-static const struct unidata st347[] = {
+static const struct unidata st358[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1158,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1162,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3894,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1159,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3895,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3993,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1163,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3994,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1160,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3896,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1161,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1164,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3995,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1165,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3897,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3996,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2260-226F */
-static const struct unidata st348[] = {
-{dd1162,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3898,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1163,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+static const struct unidata st359[] = {
+{dd1166,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3997,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1167,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3899,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3900,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3998,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3999,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11643,41 +11966,41 @@ static const struct unidata st348[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1164,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1165,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1166,0,0,0,Sm,0,GBOther,WBOther,SBOther}
-};
-/* 2270-227F */
-static const struct unidata st349[] = {
-{dd1167,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1168,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3901,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3902,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1169,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1170,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3903,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3904,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1170,0,0,0,Sm,0,GBOther,WBOther,SBOther}
+};
+/* 2270-227F */
+static const struct unidata st360[] = {
 {dd1171,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1172,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3905,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3906,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3907,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3908,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
-};
-/* 2280-228F */
-static const struct unidata st350[] = {
+{0,0,dd4000,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4001,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1173,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1174,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3909,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3910,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4002,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4003,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1175,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1176,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3911,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3912,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4004,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4005,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4006,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4007,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
+};
+/* 2280-228F */
+static const struct unidata st361[] = {
 {dd1177,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1178,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4008,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4009,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1179,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1180,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4010,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4011,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1181,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1182,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11686,10 +12009,10 @@ static const struct unidata st350[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2290-229F */
-static const struct unidata st351[] = {
+static const struct unidata st362[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3913,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3914,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4012,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4013,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11705,32 +12028,32 @@ static const struct unidata st351[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22A0-22AF */
-static const struct unidata st352[] = {
+static const struct unidata st363[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3915,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4014,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3916,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3917,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4015,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4016,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3918,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1179,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1180,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1181,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1182,0,0,0,Sm,0,GBOther,WBOther,SBOther}
+{0,0,dd4017,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1183,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1184,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1185,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1186,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22B0-22BF */
-static const struct unidata st353[] = {
+static const struct unidata st364[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3919,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3920,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3921,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3922,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4018,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4019,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4020,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd4021,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11743,26 +12066,26 @@ static const struct unidata st353[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22E0-22EF */
-static const struct unidata st354[] = {
-{dd1183,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1184,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1185,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1186,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+static const struct unidata st365[] = {
+{dd1187,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1188,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1189,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1190,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1187,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1188,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1189,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1190,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1191,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1192,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1193,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1194,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2300-230F */
-static const struct unidata st355[] = {
+static const struct unidata st366[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11781,7 +12104,7 @@ static const struct unidata st355[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2320-232F */
-static const struct unidata st356[] = {
+static const struct unidata st367[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11791,8 +12114,8 @@ static const struct unidata st356[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1191,0,0,0,Ps,0,GBOther,WBOther,SBClose},
-{dd1192,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{dd1195,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{dd1196,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11800,7 +12123,7 @@ static const struct unidata st356[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2370-237F */
-static const struct unidata st357[] = {
+static const struct unidata st368[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11819,7 +12142,7 @@ static const struct unidata st357[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2390-239F */
-static const struct unidata st358[] = {
+static const struct unidata st369[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11838,7 +12161,7 @@ static const struct unidata st358[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 23B0-23BF */
-static const struct unidata st359[] = {
+static const struct unidata st370[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11857,7 +12180,7 @@ static const struct unidata st359[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 23D0-23DF */
-static const struct unidata st360[] = {
+static const struct unidata st371[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11876,7 +12199,7 @@ static const struct unidata st360[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 23E0-23EF */
-static const struct unidata st361[] = {
+static const struct unidata st372[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11885,6 +12208,25 @@ static const struct unidata st361[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 23F0-23FF */
+static const struct unidata st373[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11895,7 +12237,7 @@ static const struct unidata st361[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2420-242F */
-static const struct unidata st362[] = {
+static const struct unidata st374[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11914,7 +12256,7 @@ static const struct unidata st362[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2440-244F */
-static const struct unidata st363[] = {
+static const struct unidata st375[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11933,7 +12275,7 @@ static const struct unidata st363[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2460-246F */
-static const struct unidata st364[] = {
+static const struct unidata st376[] = {
 {dd9,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd4,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd5,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11943,20 +12285,16 @@ static const struct unidata st364[] = {
 {dd1074,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1075,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1076,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1193,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1194,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1195,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1196,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1197,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1198,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1199,0,0,0,No,CD,GBOther,WBOther,SBOther}
-};
-/* 2470-247F */
-static const struct unidata st365[] = {
+{dd1199,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1200,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1201,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1202,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1203,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1203,0,0,0,No,CD,GBOther,WBOther,SBOther}
+};
+/* 2470-247F */
+static const struct unidata st377[] = {
 {dd1204,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1205,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1206,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11968,14 +12306,14 @@ static const struct unidata st365[] = {
 {dd1212,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1213,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1214,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1215,0,0,0,No,CD,GBOther,WBOther,SBOther}
-};
-/* 2480-248F */
-static const struct unidata st366[] = {
+{dd1215,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1216,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1217,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1218,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1219,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1219,0,0,0,No,CD,GBOther,WBOther,SBOther}
+};
+/* 2480-248F */
+static const struct unidata st378[] = {
 {dd1220,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1221,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1222,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11987,14 +12325,14 @@ static const struct unidata st366[] = {
 {dd1228,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1229,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1230,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1231,0,0,0,No,CD,GBOther,WBOther,SBOther}
-};
-/* 2490-249F */
-static const struct unidata st367[] = {
+{dd1231,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1232,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1233,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1234,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1235,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1235,0,0,0,No,CD,GBOther,WBOther,SBOther}
+};
+/* 2490-249F */
+static const struct unidata st379[] = {
 {dd1236,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1237,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1238,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -12003,17 +12341,17 @@ static const struct unidata st367[] = {
 {dd1241,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1242,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1243,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1244,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1245,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1246,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1247,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 24A0-24AF */
-static const struct unidata st368[] = {
+{dd1244,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1245,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1246,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1247,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1248,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1249,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1250,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1251,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1251,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 24A0-24AF */
+static const struct unidata st380[] = {
 {dd1252,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1253,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1254,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12025,48 +12363,52 @@ static const struct unidata st368[] = {
 {dd1260,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1261,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1262,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1263,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 24B0-24BF */
-static const struct unidata st369[] = {
+{dd1263,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1264,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1265,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1266,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1267,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1267,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 24B0-24BF */
+static const struct unidata st381[] = {
 {dd1268,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1269,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd491,dd4613,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd493,dd4614,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4615,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4616,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd495,dd4617,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1101,dd4618,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd497,dd4619,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd498,dd4620,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd499,dd4621,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd500,dd4622,0,0,So,CD,GBOther,WBALetter,SBUpper}
+{dd1270,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1271,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1272,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1273,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd491,dd4716,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd493,dd4717,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4718,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4719,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd495,dd4720,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1101,dd4721,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd497,dd4722,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd498,dd4723,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd499,dd4724,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd500,dd4725,0,0,So,CD,GBOther,WBALetter,SBUpper}
 };
 /* 24C0-24CF */
-static const struct unidata st370[] = {
-{dd501,dd4623,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4624,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4625,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd504,dd4626,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd505,dd4627,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd507,dd4628,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1094,dd4629,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd508,dd4630,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1270,dd4631,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd509,dd4632,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd510,dd4633,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4634,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd511,dd4635,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4636,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1271,dd4637,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1098,dd4638,0,0,So,CD,GBOther,WBALetter,SBUpper}
+static const struct unidata st382[] = {
+{dd501,dd4726,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4727,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4728,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd504,dd4729,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd505,dd4730,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd507,dd4731,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1094,dd4732,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd508,dd4733,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1274,dd4734,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd509,dd4735,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd510,dd4736,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1129,dd4737,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd511,dd4738,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1134,dd4739,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1275,dd4740,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1098,dd4741,0,0,So,CD,GBOther,WBALetter,SBUpper}
 };
 /* 24D0-24DF */
-static const struct unidata st371[] = {
+static const struct unidata st383[] = {
 {dd2,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd541,0,0,0,So,CD,GBOther,WBALetter,SBLower},
@@ -12085,8 +12427,8 @@ static const struct unidata st371[] = {
 {dd528,0,0,0,So,CD,GBOther,WBALetter,SBLower}
 };
 /* 24E0-24EF */
-static const struct unidata st372[] = {
-{dd1272,0,0,0,So,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st384[] = {
+{dd1276,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,So,CD,GBOther,WBALetter,SBLower},
@@ -12104,7 +12446,7 @@ static const struct unidata st372[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 24F0-24FF */
-static const struct unidata st373[] = {
+static const struct unidata st385[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -12123,7 +12465,7 @@ static const struct unidata st373[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 25B0-25BF */
-static const struct unidata st374[] = {
+static const struct unidata st386[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12142,7 +12484,7 @@ static const struct unidata st374[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 25C0-25CF */
-static const struct unidata st375[] = {
+static const struct unidata st387[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12161,7 +12503,7 @@ static const struct unidata st375[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 25F0-25FF */
-static const struct unidata st376[] = {
+static const struct unidata st388[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12180,7 +12522,7 @@ static const struct unidata st376[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2660-266F */
-static const struct unidata st377[] = {
+static const struct unidata st389[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12198,93 +12540,17 @@ static const struct unidata st377[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
-/* 2690-269F */
-static const struct unidata st378[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 26B0-26BF */
-static const struct unidata st379[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 26C0-26CF */
-static const struct unidata st380[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
 /* 2700-270F */
-static const struct unidata st381[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st390[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
-};
-/* 2720-272F */
-static const struct unidata st382[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12293,35 +12559,16 @@ static const struct unidata st382[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 2740-274F */
-static const struct unidata st383[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+/* 2750-275F */
+static const struct unidata st391[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
-};
-/* 2750-275F */
-static const struct unidata st384[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12329,11 +12576,11 @@ static const struct unidata st384[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBClose},
 {0,0,0,0,So,0,GBOther,WBOther,SBClose},
 {0,0,0,0,So,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2760-276F */
-static const struct unidata st385[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st392[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12351,7 +12598,7 @@ static const struct unidata st385[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 2770-277F */
-static const struct unidata st386[] = {
+static const struct unidata st393[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
@@ -12370,31 +12617,12 @@ static const struct unidata st386[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 2790-279F */
-static const struct unidata st387[] = {
+static const struct unidata st394[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
-};
-/* 27B0-27BF */
-static const struct unidata st388[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12405,10 +12633,10 @@ static const struct unidata st388[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 27C0-27CF */
-static const struct unidata st389[] = {
+static const struct unidata st395[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12423,11 +12651,11 @@ static const struct unidata st389[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 27E0-27EF */
-static const struct unidata st390[] = {
+static const struct unidata st396[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12446,7 +12674,7 @@ static const struct unidata st390[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 2980-298F */
-static const struct unidata st391[] = {
+static const struct unidata st397[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12465,7 +12693,7 @@ static const struct unidata st391[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose}
 };
 /* 2990-299F */
-static const struct unidata st392[] = {
+static const struct unidata st398[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -12484,7 +12712,7 @@ static const struct unidata st392[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 29D0-29DF */
-static const struct unidata st393[] = {
+static const struct unidata st399[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12503,7 +12731,7 @@ static const struct unidata st393[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 29F0-29FF */
-static const struct unidata st394[] = {
+static const struct unidata st400[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12522,7 +12750,7 @@ static const struct unidata st394[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2A00-2A0F */
-static const struct unidata st395[] = {
+static const struct unidata st401[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12535,20 +12763,20 @@ static const struct unidata st395[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1273,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1277,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2A70-2A7F */
-static const struct unidata st396[] = {
+static const struct unidata st402[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1274,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd1275,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd1276,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1278,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1279,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1280,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12560,7 +12788,7 @@ static const struct unidata st396[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2AD0-2ADF */
-static const struct unidata st397[] = {
+static const struct unidata st403[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12573,13 +12801,13 @@ static const struct unidata st397[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1277,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1281,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2B40-2B4F */
-static const struct unidata st398[] = {
+static const struct unidata st404[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12597,84 +12825,65 @@ static const struct unidata st398[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2B50-2B5F */
-static const struct unidata st399[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
 /* 2C00-2C0F */
-static const struct unidata st400[] = {
-{0,dd4639,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4640,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4641,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4642,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4643,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4644,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4645,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4646,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4647,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4648,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4649,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4650,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4651,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4652,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4653,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4654,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st405[] = {
+{0,dd4742,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4743,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4744,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4745,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4746,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4747,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4748,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4749,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4750,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4751,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4752,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4753,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4755,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4757,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 2C10-2C1F */
-static const struct unidata st401[] = {
-{0,dd4655,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4656,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4657,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4658,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4659,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4660,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4661,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4662,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4663,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4664,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4665,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4666,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4667,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4668,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4669,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4670,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st406[] = {
+{0,dd4758,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4763,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4765,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4767,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4769,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4770,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4771,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4772,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4773,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 2C20-2C2F */
-static const struct unidata st402[] = {
-{0,dd4671,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4672,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4673,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4674,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4677,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4678,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4679,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4681,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4682,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4684,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4685,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st407[] = {
+{0,dd4774,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4775,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4776,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4777,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4778,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4779,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4780,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4781,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4782,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4783,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4784,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4785,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4786,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4787,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4788,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2C50-2C5F */
-static const struct unidata st403[] = {
+static const struct unidata st408[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -12693,32 +12902,32 @@ static const struct unidata st403[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2C60-2C6F */
-static const struct unidata st404[] = {
-{0,dd4686,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st409[] = {
+{0,dd4789,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4687,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4688,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4689,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4790,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4791,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4792,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4690,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4793,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4691,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4794,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4692,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4795,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd513,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd556,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd512,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 2C70-2C7F */
-static const struct unidata st405[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st410[] = {
+{0,dd540,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4693,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4796,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4694,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4797,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -12726,129 +12935,129 @@ static const struct unidata st405[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1126,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd1129,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{0,dd4798,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4799,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 2C80-2C8F */
-static const struct unidata st406[] = {
-{0,dd4695,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st411[] = {
+{0,dd4800,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4696,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4801,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4697,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4802,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4698,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4803,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4699,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4804,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4700,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4805,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4701,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4806,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4702,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4807,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2C90-2C9F */
-static const struct unidata st407[] = {
-{0,dd4703,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st412[] = {
+{0,dd4808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4704,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4809,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4705,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4706,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4811,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4707,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4812,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4708,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4813,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4709,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4814,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4710,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4815,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CA0-2CAF */
-static const struct unidata st408[] = {
-{0,dd4711,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st413[] = {
+{0,dd4816,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4712,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4817,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4713,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4818,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4714,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4819,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4715,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4820,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4716,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4821,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4717,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4822,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4718,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4823,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CB0-2CBF */
-static const struct unidata st409[] = {
-{0,dd4719,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st414[] = {
+{0,dd4824,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4720,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4825,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4721,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4826,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4722,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4827,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4723,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4828,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4724,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4829,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4725,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4830,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4726,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4831,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CC0-2CCF */
-static const struct unidata st410[] = {
-{0,dd4727,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st415[] = {
+{0,dd4832,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4728,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4833,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4729,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4834,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4730,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4835,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4731,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4836,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4732,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4837,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4733,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4838,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4734,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4839,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CD0-2CDF */
-static const struct unidata st411[] = {
-{0,dd4735,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st416[] = {
+{0,dd4840,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4736,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4841,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4737,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4842,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4738,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4843,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4739,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4844,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4740,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4845,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4741,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4846,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4742,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4847,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CE0-2CEF */
-static const struct unidata st412[] = {
-{0,dd4743,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st417[] = {
+{0,dd4848,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4744,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4849,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12857,16 +13066,16 @@ static const struct unidata st412[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,dd4850,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4851,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 2CF0-2CFF */
-static const struct unidata st413[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st418[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -12883,7 +13092,7 @@ static const struct unidata st413[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2D20-2D2F */
-static const struct unidata st414[] = {
+static const struct unidata st419[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -12902,7 +13111,7 @@ static const struct unidata st414[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2D60-2D6F */
-static const struct unidata st415[] = {
+static const struct unidata st420[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -12918,10 +13127,48 @@ static const struct unidata st415[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1278,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter}
+{dd1282,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 2D70-2D7F */
+static const struct unidata st421[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 2D90-2D9F */
+static const struct unidata st422[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2DA0-2DAF */
-static const struct unidata st416[] = {
+static const struct unidata st423[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -12940,7 +13187,7 @@ static const struct unidata st416[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2E00-2E0F */
-static const struct unidata st417[] = {
+static const struct unidata st424[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Po,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
@@ -12959,7 +13206,7 @@ static const struct unidata st417[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2E10-2E1F */
-static const struct unidata st418[] = {
+static const struct unidata st425[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -12978,7 +13225,7 @@ static const struct unidata st418[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2E20-2E2F */
-static const struct unidata st419[] = {
+static const struct unidata st426[] = {
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pf,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
@@ -12997,9 +13244,9 @@ static const struct unidata st419[] = {
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
 };
 /* 2E30-2E3F */
-static const struct unidata st420[] = {
+static const struct unidata st427[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -13016,7 +13263,7 @@ static const struct unidata st420[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2E90-2E9F */
-static const struct unidata st421[] = {
+static const struct unidata st428[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -13032,14 +13279,14 @@ static const struct unidata st421[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1279,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1283,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2EF0-2EFF */
-static const struct unidata st422[] = {
+static const struct unidata st429[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1280,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1284,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -13054,11 +13301,7 @@ static const struct unidata st422[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2F00-2F0F */
-static const struct unidata st423[] = {
-{dd1281,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1282,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1283,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1284,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st430[] = {
 {dd1285,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1286,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1287,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13070,14 +13313,14 @@ static const struct unidata st423[] = {
 {dd1293,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1294,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1295,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1296,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F10-2F1F */
-static const struct unidata st424[] = {
+{dd1296,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1297,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1298,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1299,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1300,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1300,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F10-2F1F */
+static const struct unidata st431[] = {
 {dd1301,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1302,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1303,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13089,14 +13332,14 @@ static const struct unidata st424[] = {
 {dd1309,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1310,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1311,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1312,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F20-2F2F */
-static const struct unidata st425[] = {
+{dd1312,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1313,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1314,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1315,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1316,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1316,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F20-2F2F */
+static const struct unidata st432[] = {
 {dd1317,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1318,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1319,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13108,14 +13351,14 @@ static const struct unidata st425[] = {
 {dd1325,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1326,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1327,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1328,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F30-2F3F */
-static const struct unidata st426[] = {
+{dd1328,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1329,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1330,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1331,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1332,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1332,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F30-2F3F */
+static const struct unidata st433[] = {
 {dd1333,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1334,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1335,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13127,14 +13370,14 @@ static const struct unidata st426[] = {
 {dd1341,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1342,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1343,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1344,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F40-2F4F */
-static const struct unidata st427[] = {
+{dd1344,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1345,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1346,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1347,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1348,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1348,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F40-2F4F */
+static const struct unidata st434[] = {
 {dd1349,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1350,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1351,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13146,14 +13389,14 @@ static const struct unidata st427[] = {
 {dd1357,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1358,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1359,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1360,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F50-2F5F */
-static const struct unidata st428[] = {
+{dd1360,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1361,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1362,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1363,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1364,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1364,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F50-2F5F */
+static const struct unidata st435[] = {
 {dd1365,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1366,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1367,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13165,14 +13408,14 @@ static const struct unidata st428[] = {
 {dd1373,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1374,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1375,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1376,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F60-2F6F */
-static const struct unidata st429[] = {
+{dd1376,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1377,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1378,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1379,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1380,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1380,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F60-2F6F */
+static const struct unidata st436[] = {
 {dd1381,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1382,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1383,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13184,14 +13427,14 @@ static const struct unidata st429[] = {
 {dd1389,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1390,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1391,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1392,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F70-2F7F */
-static const struct unidata st430[] = {
+{dd1392,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1393,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1394,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1395,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1396,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1396,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F70-2F7F */
+static const struct unidata st437[] = {
 {dd1397,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1398,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1399,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13203,14 +13446,14 @@ static const struct unidata st430[] = {
 {dd1405,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1406,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1407,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1408,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F80-2F8F */
-static const struct unidata st431[] = {
+{dd1408,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1409,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1410,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1411,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1412,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1412,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F80-2F8F */
+static const struct unidata st438[] = {
 {dd1413,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1414,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1415,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13222,14 +13465,14 @@ static const struct unidata st431[] = {
 {dd1421,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1422,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1423,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1424,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2F90-2F9F */
-static const struct unidata st432[] = {
+{dd1424,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1425,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1426,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1427,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1428,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1428,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2F90-2F9F */
+static const struct unidata st439[] = {
 {dd1429,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1430,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1431,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13241,14 +13484,14 @@ static const struct unidata st432[] = {
 {dd1437,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1438,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1439,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1440,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2FA0-2FAF */
-static const struct unidata st433[] = {
+{dd1440,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1441,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1442,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1443,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1444,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1444,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2FA0-2FAF */
+static const struct unidata st440[] = {
 {dd1445,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1446,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1447,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13260,14 +13503,14 @@ static const struct unidata st433[] = {
 {dd1453,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1454,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1455,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1456,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2FB0-2FBF */
-static const struct unidata st434[] = {
+{dd1456,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1457,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1458,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1459,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1460,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1460,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2FB0-2FBF */
+static const struct unidata st441[] = {
 {dd1461,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1462,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1463,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13279,14 +13522,14 @@ static const struct unidata st434[] = {
 {dd1469,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1470,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1471,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1472,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2FC0-2FCF */
-static const struct unidata st435[] = {
+{dd1472,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1473,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1474,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1475,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1476,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1476,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2FC0-2FCF */
+static const struct unidata st442[] = {
 {dd1477,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1478,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1479,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13298,16 +13541,20 @@ static const struct unidata st435[] = {
 {dd1485,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1486,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1487,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1488,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 2FD0-2FDF */
-static const struct unidata st436[] = {
+{dd1488,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1489,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1490,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1491,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1492,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1492,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 2FD0-2FDF */
+static const struct unidata st443[] = {
 {dd1493,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1494,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1495,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1496,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1497,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1498,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -13320,7 +13567,7 @@ static const struct unidata st436[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2FF0-2FFF */
-static const struct unidata st437[] = {
+static const struct unidata st444[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -13339,7 +13586,7 @@ static const struct unidata st437[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3000-300F */
-static const struct unidata st438[] = {
+static const struct unidata st445[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
@@ -13358,7 +13605,7 @@ static const struct unidata st438[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 3010-301F */
-static const struct unidata st439[] = {
+static const struct unidata st446[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -13377,7 +13624,7 @@ static const struct unidata st439[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 3020-302F */
-static const struct unidata st440[] = {
+static const struct unidata st447[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Nl,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBOther,SBOLetter},
@@ -13396,18 +13643,18 @@ static const struct unidata st440[] = {
 {0,0,0,224,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 3030-303F */
-static const struct unidata st441[] = {
+static const struct unidata st448[] = {
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
-{dd1495,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1499,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1304,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
-{dd1496,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
-{dd1497,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
+{dd1308,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
+{dd1500,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
+{dd1501,0,0,0,Nl,CD,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -13415,178 +13662,178 @@ static const struct unidata st441[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 3040-304F */
-static const struct unidata st442[] = {
+static const struct unidata st449[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3923,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4022,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3924,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3925,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3926,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 3050-305F */
-static const struct unidata st443[] = {
-{dd1500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3927,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3928,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4023,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3929,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4024,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3930,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4025,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 3050-305F */
+static const struct unidata st450[] = {
 {dd1504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3931,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4026,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3932,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4027,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3933,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4028,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3934,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 3060-306F */
-static const struct unidata st444[] = {
+{0,0,dd4029,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3935,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4030,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3936,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4031,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3937,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4032,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3938,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4033,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 3060-306F */
+static const struct unidata st451[] = {
 {dd1512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4034,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4035,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4036,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4037,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3939,0,Lo,0,GBOther,WBOther,SBOLetter}
+{0,0,dd4038,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3070-307F */
-static const struct unidata st445[] = {
-{dd1513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3940,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3941,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st452[] = {
 {dd1517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3942,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4039,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3943,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4040,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4041,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd4042,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3090-309F */
-static const struct unidata st446[] = {
+static const struct unidata st453[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,8,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,8,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd1524,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
-{dd1525,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
-{0,0,dd3944,0,Lm,0,GBOther,WBOther,SBOLetter},
-{dd1526,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
-{dd1527,0,0,0,Lo,CD,GBOther,WBOther,SBOLetter}
+{dd1528,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
+{dd1529,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
+{0,0,dd4043,0,Lm,0,GBOther,WBOther,SBOLetter},
+{dd1530,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
+{dd1531,0,0,0,Lo,CD,GBOther,WBOther,SBOLetter}
 };
 /* 30A0-30AF */
-static const struct unidata st447[] = {
+static const struct unidata st454[] = {
 {0,0,0,0,Pd,0,GBOther,WBKatakana,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3945,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4044,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3946,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1528,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3947,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1529,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3948,0,Lo,0,GBOther,WBKatakana,SBOLetter}
-};
-/* 30B0-30BF */
-static const struct unidata st448[] = {
-{dd1530,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3949,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1531,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3950,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4045,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1532,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3951,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4046,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1533,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3952,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4047,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+};
+/* 30B0-30BF */
+static const struct unidata st455[] = {
 {dd1534,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3953,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4048,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1535,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3954,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4049,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1536,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3955,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4050,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1537,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3956,0,Lo,0,GBOther,WBKatakana,SBOLetter}
-};
-/* 30C0-30CF */
-static const struct unidata st449[] = {
+{0,0,dd4051,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1538,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3957,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4052,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1539,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3958,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4053,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1540,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3959,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4054,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1541,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3960,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4055,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+};
+/* 30C0-30CF */
+static const struct unidata st456[] = {
 {dd1542,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4056,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1543,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4057,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1544,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3202,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1545,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4058,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1546,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3961,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd4059,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30D0-30DF */
-static const struct unidata st450[] = {
-{dd1543,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1544,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3962,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1545,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1546,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3963,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+static const struct unidata st457[] = {
 {dd1547,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1548,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3964,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4060,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1549,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1550,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3965,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4061,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1551,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1552,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4062,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1553,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1554,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4063,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1555,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1556,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30E0-30EF */
-static const struct unidata st451[] = {
+static const struct unidata st458[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
@@ -13602,29 +13849,29 @@ static const struct unidata st451[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3966,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd4064,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30F0-30FF */
-static const struct unidata st452[] = {
-{0,0,dd3967,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3968,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3969,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+static const struct unidata st459[] = {
+{0,0,dd4065,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4066,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd4067,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1553,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1557,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1554,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1555,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1556,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1557,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1558,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1559,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1560,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1561,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3970,0,Lm,0,GBOther,WBKatakana,SBOLetter},
-{dd1558,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
-{dd1559,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+{0,0,dd4068,0,Lm,0,GBOther,WBKatakana,SBOLetter},
+{dd1562,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
+{dd1563,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
 };
 /* 3100-310F */
-static const struct unidata st453[] = {
+static const struct unidata st460[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -13643,7 +13890,7 @@ static const struct unidata st453[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 3120-312F */
-static const struct unidata st454[] = {
+static const struct unidata st461[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -13662,12 +13909,8 @@ static const struct unidata st454[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3130-313F */
-static const struct unidata st455[] = {
+static const struct unidata st462[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1560,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1561,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1562,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1563,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1564,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1565,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1566,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13678,14 +13921,14 @@ static const struct unidata st455[] = {
 {dd1571,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1572,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1573,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1574,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* 3140-314F */
-static const struct unidata st456[] = {
+{dd1574,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1575,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1576,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1577,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1578,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1578,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 3140-314F */
+static const struct unidata st463[] = {
 {dd1579,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1580,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1581,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13697,14 +13940,14 @@ static const struct unidata st456[] = {
 {dd1587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* 3150-315F */
-static const struct unidata st457[] = {
+{dd1590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 3150-315F */
+static const struct unidata st464[] = {
 {dd1595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13716,14 +13959,14 @@ static const struct unidata st457[] = {
 {dd1603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* 3160-316F */
-static const struct unidata st458[] = {
+{dd1606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 3160-316F */
+static const struct unidata st465[] = {
 {dd1611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13735,14 +13978,14 @@ static const struct unidata st458[] = {
 {dd1619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* 3170-317F */
-static const struct unidata st459[] = {
+{dd1622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 3170-317F */
+static const struct unidata st466[] = {
 {dd1627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13754,14 +13997,14 @@ static const struct unidata st459[] = {
 {dd1635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* 3180-318F */
-static const struct unidata st460[] = {
+{dd1638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* 3180-318F */
+static const struct unidata st467[] = {
 {dd1643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13773,29 +14016,33 @@ static const struct unidata st460[] = {
 {dd1651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3190-319F */
-static const struct unidata st461[] = {
+static const struct unidata st468[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1281,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1287,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1654,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1655,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1656,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1657,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1658,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1659,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1285,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1285,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1291,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1658,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1659,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1660,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1661,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1662,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1663,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1289,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1289,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1664,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1665,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1666,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1667,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1293,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 31F0-31FF */
-static const struct unidata st462[] = {
+static const struct unidata st469[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
@@ -13814,11 +14061,7 @@ static const struct unidata st462[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 3200-320F */
-static const struct unidata st463[] = {
-{dd1664,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1665,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1666,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1667,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st470[] = {
 {dd1668,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1669,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1670,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13830,14 +14073,14 @@ static const struct unidata st463[] = {
 {dd1676,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1677,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1678,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1679,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3210-321F */
-static const struct unidata st464[] = {
+{dd1679,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1680,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1681,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1682,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1683,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1683,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3210-321F */
+static const struct unidata st471[] = {
 {dd1684,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1685,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1686,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13849,33 +14092,33 @@ static const struct unidata st464[] = {
 {dd1692,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1693,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1694,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1695,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1696,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1697,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1698,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3220-322F */
-static const struct unidata st465[] = {
-{dd1695,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1696,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1697,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1698,0,0,0,No,CD,GBOther,WBOther,SBOther},
+static const struct unidata st472[] = {
 {dd1699,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1700,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1701,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1702,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1703,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1704,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1705,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1706,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1707,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1708,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1705,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1706,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1707,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1708,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1709,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1710,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3230-323F */
-static const struct unidata st466[] = {
+{dd1710,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1711,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1712,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1713,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1714,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1714,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3230-323F */
+static const struct unidata st473[] = {
 {dd1715,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1716,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1717,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13887,37 +14130,34 @@ static const struct unidata st466[] = {
 {dd1723,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1724,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1725,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1726,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3240-324F */
-static const struct unidata st467[] = {
+{dd1726,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1727,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1728,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1729,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1730,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd1730,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
-/* 3250-325F */
-static const struct unidata st468[] = {
+/* 3240-324F */
+static const struct unidata st474[] = {
 {dd1731,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1732,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1733,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1734,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1735,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1736,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1737,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1738,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1732,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1733,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1734,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1735,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1736,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1351,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1737,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 3250-325F */
+static const struct unidata st475[] = {
+{dd1738,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1739,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1740,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1741,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13925,36 +14165,36 @@ static const struct unidata st468[] = {
 {dd1743,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1744,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1745,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1746,0,0,0,No,CD,GBOther,WBOther,SBOther}
+{dd1746,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1747,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1748,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1749,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1750,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1751,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1752,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1753,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 3260-326F */
-static const struct unidata st469[] = {
-{dd1560,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1563,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1566,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1568,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1576,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1577,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st476[] = {
+{dd1564,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1567,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1570,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1572,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1580,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1582,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1583,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1585,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1581,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1584,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1586,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1587,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1588,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1589,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1747,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1748,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1590,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1591,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1592,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1593,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1754,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1755,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3270-327F */
-static const struct unidata st470[] = {
-{dd1749,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1750,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1751,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1752,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1753,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1754,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1755,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st477[] = {
 {dd1756,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1757,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1758,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13963,75 +14203,75 @@ static const struct unidata st470[] = {
 {dd1761,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1762,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1763,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1764,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1765,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1766,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1767,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1768,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1769,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1770,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 3280-328F */
-static const struct unidata st471[] = {
-{dd1281,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1287,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1654,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1655,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1764,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1765,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1766,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1292,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1767,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1304,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1354,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1366,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1365,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1355,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1447,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1312,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st478[] = {
+{dd1285,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1291,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1658,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1659,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1771,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1772,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1773,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1296,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1774,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1308,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1358,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1370,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1369,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1359,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1451,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1316,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3290-329F */
-static const struct unidata st472[] = {
-{dd1352,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1768,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1769,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1770,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1771,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1772,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1773,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1774,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st479[] = {
+{dd1356,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1775,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1776,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1777,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1318,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1778,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1779,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1780,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1781,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 32A0-32AF */
-static const struct unidata st473[] = {
+{dd1781,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1782,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1783,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1784,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1322,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1785,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1656,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1657,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1658,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1786,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1787,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1788,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1788,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 32A0-32AF */
+static const struct unidata st480[] = {
 {dd1789,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1790,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1791,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1792,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1660,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1661,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1662,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1793,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1794,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1794,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1795,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1796,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1797,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1798,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1799,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1800,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1801,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 32B0-32BF */
-static const struct unidata st474[] = {
-{dd1795,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1796,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1797,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1798,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1799,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1800,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1801,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1802,0,0,0,No,CD,GBOther,WBOther,SBOther},
+static const struct unidata st481[] = {
+{dd1802,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1803,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1804,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1805,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -14039,17 +14279,17 @@ static const struct unidata st474[] = {
 {dd1807,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1808,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1809,0,0,0,No,CD,GBOther,WBOther,SBOther},
-{dd1810,0,0,0,No,CD,GBOther,WBOther,SBOther}
+{dd1810,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1811,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1812,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1813,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1814,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1815,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1816,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd1817,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 32C0-32CF */
-static const struct unidata st475[] = {
-{dd1811,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1812,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1813,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1814,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1815,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1816,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1817,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st482[] = {
 {dd1818,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1819,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1820,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14058,17 +14298,17 @@ static const struct unidata st475[] = {
 {dd1823,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1824,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1825,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1826,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1826,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1827,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1828,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1829,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1830,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1831,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1832,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1833,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 32D0-32DF */
-static const struct unidata st476[] = {
-{dd1827,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1828,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1829,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1830,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1831,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1832,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1833,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+static const struct unidata st483[] = {
 {dd1834,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1835,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1836,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14077,17 +14317,17 @@ static const struct unidata st476[] = {
 {dd1839,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1840,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1841,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1842,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 32E0-32EF */
-static const struct unidata st477[] = {
+{dd1842,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1843,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1844,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1845,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1846,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1847,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1848,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1849,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1849,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 32E0-32EF */
+static const struct unidata st484[] = {
 {dd1850,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1851,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1852,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14096,17 +14336,17 @@ static const struct unidata st477[] = {
 {dd1855,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1856,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1857,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1858,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 32F0-32FF */
-static const struct unidata st478[] = {
+{dd1858,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1859,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1860,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1861,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1862,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1863,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1864,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1865,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1865,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 32F0-32FF */
+static const struct unidata st485[] = {
 {dd1866,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1867,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1868,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14115,10 +14355,6 @@ static const struct unidata st478[] = {
 {dd1871,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1872,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1873,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 3300-330F */
-static const struct unidata st479[] = {
 {dd1874,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1875,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1876,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14126,6 +14362,10 @@ static const struct unidata st479[] = {
 {dd1878,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1879,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1880,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 3300-330F */
+static const struct unidata st486[] = {
 {dd1881,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1882,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1883,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14134,17 +14374,17 @@ static const struct unidata st479[] = {
 {dd1886,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1887,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1888,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1889,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 3310-331F */
-static const struct unidata st480[] = {
+{dd1889,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1890,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1891,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1892,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1893,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1894,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1895,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1896,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1896,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 3310-331F */
+static const struct unidata st487[] = {
 {dd1897,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1898,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1899,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14153,17 +14393,17 @@ static const struct unidata st480[] = {
 {dd1902,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1903,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1904,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1905,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 3320-332F */
-static const struct unidata st481[] = {
+{dd1905,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1906,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1907,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1908,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1909,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1910,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1911,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1912,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1912,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 3320-332F */
+static const struct unidata st488[] = {
 {dd1913,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1914,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1915,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14172,17 +14412,17 @@ static const struct unidata st481[] = {
 {dd1918,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1919,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1920,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1921,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 3330-333F */
-static const struct unidata st482[] = {
+{dd1921,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1922,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1923,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1924,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1925,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1926,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1927,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1928,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1928,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 3330-333F */
+static const struct unidata st489[] = {
 {dd1929,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1930,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1931,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14191,17 +14431,17 @@ static const struct unidata st482[] = {
 {dd1934,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1935,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1936,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1937,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 3340-334F */
-static const struct unidata st483[] = {
+{dd1937,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1938,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1939,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1940,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1941,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1942,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1943,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1944,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1944,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
+};
+/* 3340-334F */
+static const struct unidata st490[] = {
 {dd1945,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1946,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1947,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
@@ -14210,36 +14450,36 @@ static const struct unidata st483[] = {
 {dd1950,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1951,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1952,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1953,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
-};
-/* 3350-335F */
-static const struct unidata st484[] = {
+{dd1953,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1954,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1955,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1956,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1957,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1958,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1959,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1960,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1961,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
-{dd1962,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1963,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1964,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1965,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1966,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1967,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1968,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1969,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd1960,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
-/* 3360-336F */
-static const struct unidata st485[] = {
+/* 3350-335F */
+static const struct unidata st491[] = {
+{dd1961,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1962,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1963,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1964,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1965,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1966,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1967,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1968,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1969,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1970,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1971,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1972,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1973,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1974,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1975,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1976,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1976,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3360-336F */
+static const struct unidata st492[] = {
 {dd1977,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1978,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1979,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14248,17 +14488,17 @@ static const struct unidata st485[] = {
 {dd1982,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1983,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1984,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1985,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3370-337F */
-static const struct unidata st486[] = {
+{dd1985,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1986,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1987,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1988,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1989,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1990,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1991,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1992,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1992,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3370-337F */
+static const struct unidata st493[] = {
 {dd1993,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1994,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1995,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14267,17 +14507,17 @@ static const struct unidata st486[] = {
 {dd1998,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1999,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2000,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2001,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3380-338F */
-static const struct unidata st487[] = {
+{dd2001,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2002,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2003,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2004,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2005,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2006,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2007,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2008,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2008,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3380-338F */
+static const struct unidata st494[] = {
 {dd2009,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2010,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2011,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14286,17 +14526,17 @@ static const struct unidata st487[] = {
 {dd2014,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2015,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2016,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2017,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 3390-339F */
-static const struct unidata st488[] = {
+{dd2017,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2018,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2019,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2020,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2021,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2022,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2023,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2024,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2024,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 3390-339F */
+static const struct unidata st495[] = {
 {dd2025,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2026,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2027,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14305,17 +14545,17 @@ static const struct unidata st488[] = {
 {dd2030,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2031,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2032,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2033,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33A0-33AF */
-static const struct unidata st489[] = {
+{dd2033,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2034,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2035,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2036,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2037,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2038,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2039,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2040,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2040,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33A0-33AF */
+static const struct unidata st496[] = {
 {dd2041,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2042,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2043,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14324,17 +14564,17 @@ static const struct unidata st489[] = {
 {dd2046,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2047,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2048,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2049,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33B0-33BF */
-static const struct unidata st490[] = {
+{dd2049,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2050,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2051,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2052,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2053,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2054,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2055,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2056,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2056,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33B0-33BF */
+static const struct unidata st497[] = {
 {dd2057,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2058,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2059,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14343,17 +14583,17 @@ static const struct unidata st490[] = {
 {dd2062,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2063,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2064,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2065,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33C0-33CF */
-static const struct unidata st491[] = {
+{dd2065,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2066,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2067,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2068,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2069,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2070,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2071,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2072,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2072,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33C0-33CF */
+static const struct unidata st498[] = {
 {dd2073,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2074,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2075,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14362,17 +14602,17 @@ static const struct unidata st491[] = {
 {dd2078,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2079,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2080,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2081,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33D0-33DF */
-static const struct unidata st492[] = {
+{dd2081,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2082,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2083,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2084,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2085,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2086,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2087,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2088,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2088,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33D0-33DF */
+static const struct unidata st499[] = {
 {dd2089,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2090,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2091,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14381,17 +14621,17 @@ static const struct unidata st492[] = {
 {dd2094,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2095,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2096,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2097,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33E0-33EF */
-static const struct unidata st493[] = {
+{dd2097,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2098,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2099,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2100,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2101,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2102,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2103,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2104,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2104,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33E0-33EF */
+static const struct unidata st500[] = {
 {dd2105,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2106,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2107,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14400,17 +14640,17 @@ static const struct unidata st493[] = {
 {dd2110,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2111,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2112,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2113,0,0,0,So,CD,GBOther,WBOther,SBOther}
-};
-/* 33F0-33FF */
-static const struct unidata st494[] = {
+{dd2113,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2114,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2115,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2116,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2117,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2118,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2119,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2120,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2120,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 33F0-33FF */
+static const struct unidata st501[] = {
 {dd2121,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2122,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2123,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -14419,29 +14659,19 @@ static const struct unidata st494[] = {
 {dd2126,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2127,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2128,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd2129,0,0,0,So,CD,GBOther,WBOther,SBOther}
+{dd2129,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2130,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2131,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2132,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2133,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2134,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2135,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2136,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 4DB0-4DBF */
-static const struct unidata st495[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st502[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 9FC0-9FCF */
-static const struct unidata st496[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -14455,12 +14685,10 @@ static const struct unidata st496[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* A010-A01F */
-static const struct unidata st497[] = {
+static const struct unidata st503[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14478,8 +14706,27 @@ static const struct unidata st497[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
+/* A4F0-A4FF */
+static const struct unidata st504[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
+};
 /* A600-A60F */
-static const struct unidata st498[] = {
+static const struct unidata st505[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14498,7 +14745,7 @@ static const struct unidata st498[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* A620-A62F */
-static const struct unidata st499[] = {
+static const struct unidata st506[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -14517,64 +14764,64 @@ static const struct unidata st499[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* A640-A64F */
-static const struct unidata st500[] = {
-{0,dd4745,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st507[] = {
+{0,dd4852,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4746,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4853,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4747,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4854,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4748,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4855,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4749,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4856,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4750,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4857,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4751,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4858,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4752,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4859,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A650-A65F */
-static const struct unidata st501[] = {
-{0,dd4753,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st508[] = {
+{0,dd4860,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4861,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4755,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4862,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4863,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4757,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4864,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4758,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4865,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4866,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4867,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A660-A66F */
-static const struct unidata st502[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,dd4761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st509[] = {
+{0,dd4868,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4869,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4763,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4870,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4871,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4765,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4872,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4873,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4874,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* A670-A67F */
-static const struct unidata st503[] = {
+static const struct unidata st510[] = {
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
@@ -14593,33 +14840,33 @@ static const struct unidata st503[] = {
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
 };
 /* A680-A68F */
-static const struct unidata st504[] = {
-{0,dd4767,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st511[] = {
+{0,dd4875,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4876,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4769,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4877,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4770,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4878,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4771,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4879,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4772,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4880,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4773,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4881,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4774,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4882,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A690-A69F */
-static const struct unidata st505[] = {
-{0,dd4775,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st512[] = {
+{0,dd4883,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4776,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4884,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4777,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4885,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4778,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4886,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -14630,8 +14877,46 @@ static const struct unidata st505[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* A6E0-A6EF */
+static const struct unidata st513[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
+};
+/* A6F0-A6FF */
+static const struct unidata st514[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* A710-A71F */
-static const struct unidata st506[] = {
+static const struct unidata st515[] = {
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
@@ -14650,103 +14935,103 @@ static const struct unidata st506[] = {
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
 };
 /* A720-A72F */
-static const struct unidata st507[] = {
+static const struct unidata st516[] = {
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,dd4779,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4887,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4780,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4888,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4781,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4889,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4782,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4890,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4783,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4891,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4784,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4892,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4785,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4893,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A730-A73F */
-static const struct unidata st508[] = {
+static const struct unidata st517[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4786,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4894,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4787,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4895,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4788,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4896,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4789,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4897,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4790,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4898,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4791,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4899,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4792,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4900,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A740-A74F */
-static const struct unidata st509[] = {
-{0,dd4793,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st518[] = {
+{0,dd4901,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4794,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4902,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4795,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4903,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4796,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4904,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4797,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4905,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4798,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4906,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4799,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4907,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4800,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4908,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A750-A75F */
-static const struct unidata st510[] = {
-{0,dd4801,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st519[] = {
+{0,dd4909,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4802,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4910,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4803,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4911,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4804,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4912,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4805,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4913,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4806,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4914,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4807,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4915,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4916,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A760-A76F */
-static const struct unidata st511[] = {
-{0,dd4809,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st520[] = {
+{0,dd4917,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4918,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4811,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4919,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4812,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4920,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4813,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4921,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4814,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4922,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4815,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4923,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd2130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd2137,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A770-A77F */
-static const struct unidata st512[] = {
-{dd2130,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st521[] = {
+{dd2137,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -14755,39 +15040,73 @@ static const struct unidata st512[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4816,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4924,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4817,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4925,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4818,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4819,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4926,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4927,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* A780-A78F */
-static const struct unidata st513[] = {
-{0,dd4820,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st522[] = {
+{0,dd4928,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4821,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4929,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4822,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4930,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4823,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4931,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,dd4824,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4932,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd547,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* A790-A79F */
+static const struct unidata st523[] = {
+{0,dd4933,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* A7F0-A7FF */
-static const struct unidata st514[] = {
+/* A7A0-A7AF */
+static const struct unidata st524[] = {
+{0,dd4934,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4935,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4936,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4937,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4938,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* A7F0-A7FF */
+static const struct unidata st525[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -14795,6 +15114,10 @@ static const struct unidata st514[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14802,7 +15125,7 @@ static const struct unidata st514[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* A800-A80F */
-static const struct unidata st515[] = {
+static const struct unidata st526[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -14821,7 +15144,7 @@ static const struct unidata st515[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* A820-A82F */
-static const struct unidata st516[] = {
+static const struct unidata st527[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14839,8 +15162,27 @@ static const struct unidata st516[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* A830-A83F */
+static const struct unidata st528[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* A870-A87F */
-static const struct unidata st517[] = {
+static const struct unidata st529[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14859,7 +15201,7 @@ static const struct unidata st517[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* A880-A88F */
-static const struct unidata st518[] = {
+static const struct unidata st530[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14878,7 +15220,7 @@ static const struct unidata st518[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* A8B0-A8BF */
-static const struct unidata st519[] = {
+static const struct unidata st531[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14897,7 +15239,7 @@ static const struct unidata st519[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* A8C0-A8CF */
-static const struct unidata st520[] = {
+static const struct unidata st532[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -14915,8 +15257,27 @@ static const struct unidata st520[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
+/* A8F0-A8FF */
+static const struct unidata st533[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* A920-A92F */
-static const struct unidata st521[] = {
+static const struct unidata st534[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14935,7 +15296,7 @@ static const struct unidata st521[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* A940-A94F */
-static const struct unidata st522[] = {
+static const struct unidata st535[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -14954,7 +15315,7 @@ static const struct unidata st522[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* A950-A95F */
-static const struct unidata st523[] = {
+static const struct unidata st536[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
@@ -14972,36 +15333,112 @@ static const struct unidata st523[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
-/* AA20-AA2F */
-static const struct unidata st524[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+/* A970-A97F */
+static const struct unidata st537[] = {
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* A9B0-A9BF */
+static const struct unidata st538[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
-};
-/* AA30-AA3F */
-static const struct unidata st525[] = {
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+};
+/* A9C0-A9CF */
+static const struct unidata st539[] = {
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
+};
+/* A9D0-A9DF */
+static const struct unidata st540[] = {
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* AA20-AA2F */
+static const struct unidata st541[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+};
+/* AA30-AA3F */
+static const struct unidata st542[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15011,7 +15448,7 @@ static const struct unidata st525[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* AA40-AA4F */
-static const struct unidata st526[] = {
+static const struct unidata st543[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -15030,7 +15467,7 @@ static const struct unidata st526[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* AA50-AA5F */
-static const struct unidata st527[] = {
+static const struct unidata st544[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -15048,8 +15485,141 @@ static const struct unidata st527[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
+/* AA70-AA7F */
+static const struct unidata st545[] = {
+{0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* AAB0-AABF */
+static const struct unidata st546[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* AAC0-AACF */
+static const struct unidata st547[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* AAD0-AADF */
+static const struct unidata st548[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* AB00-AB0F */
+static const struct unidata st549[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* AB10-AB1F */
+static const struct unidata st550[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* ABE0-ABEF */
+static const struct unidata st551[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* AC00-AC0F */
-static const struct unidata st528[] = {
+static const struct unidata st552[] = {
 {0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15068,7 +15638,7 @@ static const struct unidata st528[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
 /* AC10-AC1F */
-static const struct unidata st529[] = {
+static const struct unidata st553[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15087,7 +15657,7 @@ static const struct unidata st529[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
 /* AC20-AC2F */
-static const struct unidata st530[] = {
+static const struct unidata st554[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15106,7 +15676,7 @@ static const struct unidata st530[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
 /* AC30-AC3F */
-static const struct unidata st531[] = {
+static const struct unidata st555[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15125,7 +15695,7 @@ static const struct unidata st531[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
 /* AC50-AC5F */
-static const struct unidata st532[] = {
+static const struct unidata st556[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15144,7 +15714,7 @@ static const struct unidata st532[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
 /* D7A0-D7AF */
-static const struct unidata st533[] = {
+static const struct unidata st557[] = {
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
@@ -15162,8 +15732,46 @@ static const struct unidata st533[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* D7C0-D7CF */
+static const struct unidata st558[] = {
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter}
+};
+/* D7F0-D7FF */
+static const struct unidata st559[] = {
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* D800-D80F */
-static const struct unidata st534[] = {
+static const struct unidata st560[] = {
 {0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
@@ -15182,7 +15790,7 @@ static const struct unidata st534[] = {
 {0,0,0,0,Cs,0,GBOther,WBOther,SBOther}
 };
 /* E000-E00F */
-static const struct unidata st535[] = {
+static const struct unidata st561[] = {
 {0,0,0,0,Co,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Co,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Co,0,GBOther,WBOther,SBOther},
@@ -15201,33 +15809,26 @@ static const struct unidata st535[] = {
 {0,0,0,0,Co,0,GBOther,WBOther,SBOther}
 };
 /* F900-F90F */
-static const struct unidata st536[] = {
-{dd2131,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2132,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2133,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2134,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2135,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2136,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2137,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st562[] = {
 {dd2138,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F910-F91F */
-static const struct unidata st537[] = {
+{dd2142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F910-F91F */
+static const struct unidata st563[] = {
 {dd2150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15236,17 +15837,17 @@ static const struct unidata st537[] = {
 {dd2155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F920-F92F */
-static const struct unidata st538[] = {
+{dd2158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F920-F92F */
+static const struct unidata st564[] = {
 {dd2166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15255,37 +15856,37 @@ static const struct unidata st538[] = {
 {dd2171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F930-F93F */
-static const struct unidata st539[] = {
+{dd2174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F930-F93F */
+static const struct unidata st565[] = {
 {dd2182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F940-F94F */
-static const struct unidata st540[] = {
-{dd1478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F940-F94F */
+static const struct unidata st566[] = {
+{dd1482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15293,36 +15894,36 @@ static const struct unidata st540[] = {
 {dd2201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F950-F95F */
-static const struct unidata st541[] = {
+{dd2204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F950-F95F */
+static const struct unidata st567[] = {
 {dd2212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F960-F96F */
-static const struct unidata st542[] = {
+{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F960-F96F */
+static const struct unidata st568[] = {
 {dd2227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15331,55 +15932,55 @@ static const struct unidata st542[] = {
 {dd2232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F970-F97F */
-static const struct unidata st543[] = {
+{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F970-F97F */
+static const struct unidata st569[] = {
 {dd2243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F980-F98F */
-static const struct unidata st544[] = {
+{dd2250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F980-F98F */
+static const struct unidata st570[] = {
 {dd2258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F990-F99F */
-static const struct unidata st545[] = {
+{dd2264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F990-F99F */
+static const struct unidata st571[] = {
 {dd2272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15388,36 +15989,36 @@ static const struct unidata st545[] = {
 {dd2277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9A0-F9AF */
-static const struct unidata st546[] = {
+{dd2280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9A0-F9AF */
+static const struct unidata st572[] = {
 {dd2288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9B0-F9BF */
-static const struct unidata st547[] = {
+{dd2294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9B0-F9BF */
+static const struct unidata st573[] = {
 {dd2302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15426,75 +16027,74 @@ static const struct unidata st547[] = {
 {dd2307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9C0-F9CF */
-static const struct unidata st548[] = {
 {dd2310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9C0-F9CF */
+static const struct unidata st574[] = {
 {dd2317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9D0-F9DF */
-static const struct unidata st549[] = {
+{dd2324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1765,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9D0-F9DF */
+static const struct unidata st575[] = {
 {dd2332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1772,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9E0-F9EF */
-static const struct unidata st550[] = {
+{dd2338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9E0-F9EF */
+static const struct unidata st576[] = {
 {dd2346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2350,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2351,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2352,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9F0-F9FF */
-static const struct unidata st551[] = {
+{dd2353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* F9F0-F9FF */
+static const struct unidata st577[] = {
 {dd2361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -15502,267 +16102,275 @@ static const struct unidata st551[] = {
 {dd2365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA00-FA0F */
-static const struct unidata st552[] = {
+{dd1401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA00-FA0F */
+static const struct unidata st578[] = {
 {dd2376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA10-FA1F */
-static const struct unidata st553[] = {
 {dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA10-FA1F */
+static const struct unidata st579[] = {
 {dd2388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA20-FA2F */
-static const struct unidata st554[] = {
 {dd2392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd1408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FA30-FA3F */
-static const struct unidata st555[] = {
+/* FA20-FA2F */
+static const struct unidata st580[] = {
+{dd2399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FA30-FA3F */
+static const struct unidata st581[] = {
 {dd2407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA40-FA4F */
-static const struct unidata st556[] = {
+{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA40-FA4F */
+static const struct unidata st582[] = {
 {dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1770,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA50-FA5F */
-static const struct unidata st557[] = {
+{dd2429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1774,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1777,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA50-FA5F */
+static const struct unidata st583[] = {
 {dd2437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1781,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA60-FA6F */
-static const struct unidata st558[] = {
+{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA60-FA6F */
+static const struct unidata st584[] = {
 {dd2450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FA70-FA7F */
-static const struct unidata st559[] = {
 {dd2453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FA70-FA7F */
+static const struct unidata st585[] = {
 {dd2463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA80-FA8F */
-static const struct unidata st560[] = {
+{dd2466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FA80-FA8F */
+static const struct unidata st586[] = {
 {dd2477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA90-FA9F */
-static const struct unidata st561[] = {
+{dd2480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd2489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FAA0-FAAF */
-static const struct unidata st562[] = {
-{dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* FA90-FA9F */
+static const struct unidata st587[] = {
 {dd2491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FAA0-FAAF */
+static const struct unidata st588[] = {
+{dd2391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FAB0-FABF */
-static const struct unidata st563[] = {
-{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FAC0-FACF */
-static const struct unidata st564[] = {
-{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* FAB0-FABF */
+static const struct unidata st589[] = {
+{dd2278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FAD0-FADF */
-static const struct unidata st565[] = {
+/* FAC0-FACF */
+static const struct unidata st590[] = {
 {dd2522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd2530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* FAD0-FADF */
+static const struct unidata st591[] = {
+{dd2532,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2533,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2534,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2535,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2536,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2537,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2538,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2539,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2540,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2541,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15771,14 +16379,14 @@ static const struct unidata st565[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FB00-FB0F */
-static const struct unidata st566[] = {
-{dd2532,dd2532,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2533,dd2533,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2534,dd2534,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2535,dd2535,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2536,dd2536,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2537,dd2538,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2538,dd2538,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st592[] = {
+{dd2542,dd2542,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2543,dd2543,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2544,dd2544,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2545,dd2545,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2546,dd2546,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2547,dd2548,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2548,dd2548,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15790,67 +16398,50 @@ static const struct unidata st566[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FB10-FB1F */
-static const struct unidata st567[] = {
+static const struct unidata st593[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2539,dd2539,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2540,dd2540,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2541,dd2541,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2542,dd2542,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2543,dd2543,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2549,dd2549,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2550,dd2550,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2551,dd2551,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2552,dd2552,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2553,dd2553,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2544,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2554,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,26,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd2545,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{dd2555,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* FB20-FB2F */
-static const struct unidata st568[] = {
-{dd2546,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st594[] = {
+{dd2556,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1102,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1105,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2547,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2548,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2549,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2550,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2551,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2552,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2557,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2558,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2559,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2560,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2561,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2562,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2553,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2554,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2555,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2556,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2557,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2558,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
-};
-/* FB30-FB3F */
-static const struct unidata st569[] = {
-{dd2559,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2560,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2561,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2562,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2563,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2564,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2565,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2566,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2567,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2568,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2568,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* FB30-FB3F */
+static const struct unidata st595[] = {
 {dd2569,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2570,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2571,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FB40-FB4F */
-static const struct unidata st570[] = {
 {dd2572,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2573,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2574,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2575,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15859,60 +16450,31 @@ static const struct unidata st570[] = {
 {dd2578,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2579,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2580,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2581,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FB40-FB4F */
+static const struct unidata st596[] = {
 {dd2582,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd2583,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2584,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2585,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2585,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2586,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2587,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2588,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2589,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2590,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2591,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2592,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2593,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2594,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* FB50-FB5F */
-static const struct unidata st571[] = {
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FB60-FB6F */
-static const struct unidata st572[] = {
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FB70-FB7F */
-static const struct unidata st573[] = {
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st597[] = {
 {dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -15920,29 +16482,41 @@ static const struct unidata st573[] = {
 {dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FB80-FB8F */
-static const struct unidata st574[] = {
 {dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FB60-FB6F */
+static const struct unidata st598[] = {
 {dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FB70-FB7F */
+static const struct unidata st599[] = {
 {dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FB90-FB9F */
-static const struct unidata st575[] = {
+{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -15954,35 +16528,88 @@ static const struct unidata st575[] = {
 {dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FB80-FB8F */
+static const struct unidata st600[] = {
 {dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FBA0-FBAF */
-static const struct unidata st576[] = {
-{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FBB0-FBBF */
-static const struct unidata st577[] = {
+/* FB90-FB9F */
+static const struct unidata st601[] = {
 {dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FBA0-FBAF */
+static const struct unidata st602[] = {
+{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FBB0-FBBF */
+static const struct unidata st603[] = {
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther}
+};
+/* FBC0-FBCF */
+static const struct unidata st604[] = {
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15999,83 +16626,70 @@ static const struct unidata st577[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FBD0-FBDF */
-static const struct unidata st578[] = {
+static const struct unidata st605[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FBE0-FBEF */
-static const struct unidata st579[] = {
-{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FBF0-FBFF */
-static const struct unidata st580[] = {
+{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FBE0-FBEF */
+static const struct unidata st606[] = {
 {dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC00-FC0F */
-static const struct unidata st581[] = {
+{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FBF0-FBFF */
+static const struct unidata st607[] = {
 {dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC00-FC0F */
+static const struct unidata st608[] = {
 {dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC10-FC1F */
-static const struct unidata st582[] = {
+{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16085,16 +16699,16 @@ static const struct unidata st582[] = {
 {dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC10-FC1F */
+static const struct unidata st609[] = {
 {dd2660,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC20-FC2F */
-static const struct unidata st583[] = {
+{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16104,16 +16718,16 @@ static const struct unidata st583[] = {
 {dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC20-FC2F */
+static const struct unidata st610[] = {
 {dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC30-FC3F */
-static const struct unidata st584[] = {
+{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16123,16 +16737,16 @@ static const struct unidata st584[] = {
 {dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC30-FC3F */
+static const struct unidata st611[] = {
 {dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC40-FC4F */
-static const struct unidata st585[] = {
+{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16142,16 +16756,16 @@ static const struct unidata st585[] = {
 {dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2707,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2707,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC40-FC4F */
+static const struct unidata st612[] = {
 {dd2708,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC50-FC5F */
-static const struct unidata st586[] = {
+{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16161,206 +16775,206 @@ static const struct unidata st586[] = {
 {dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC50-FC5F */
+static const struct unidata st613[] = {
 {dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2725,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2726,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2727,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2728,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2729,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC60-FC6F */
-static const struct unidata st587[] = {
+{dd2729,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2730,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2731,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2733,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2734,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2735,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2736,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2737,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2738,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2739,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2739,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FC70-FC7F */
-static const struct unidata st588[] = {
+/* FC60-FC6F */
+static const struct unidata st614[] = {
 {dd2740,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2741,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2742,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2743,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2744,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2745,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC80-FC8F */
-static const struct unidata st589[] = {
-{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2746,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2747,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2748,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2749,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FC90-FC9F */
-static const struct unidata st590[] = {
-{dd2727,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+/* FC70-FC7F */
+static const struct unidata st615[] = {
 {dd2750,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2751,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2752,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2660,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2753,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCA0-FCAF */
-static const struct unidata st591[] = {
+{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC80-FC8F */
+static const struct unidata st616[] = {
+{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2757,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2758,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FC90-FC9F */
+static const struct unidata st617[] = {
+{dd2737,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2760,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2762,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2733,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2734,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCA0-FCAF */
+static const struct unidata st618[] = {
+{dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2766,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCB0-FCBF */
-static const struct unidata st592[] = {
 {dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2757,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2669,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2670,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2671,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCB0-FCBF */
+static const struct unidata st619[] = {
 {dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2767,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCC0-FCCF */
-static const struct unidata st593[] = {
+{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2685,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2686,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCC0-FCCF */
+static const struct unidata st620[] = {
 {dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2758,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCD0-FCDF */
-static const struct unidata st594[] = {
-{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2707,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2708,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2768,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCD0-FCDF */
+static const struct unidata st621[] = {
 {dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2760,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2719,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2725,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2726,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2729,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2730,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2731,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* FCE0-FCEF */
-static const struct unidata st595[] = {
-{dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2762,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st622[] = {
 {dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCF0-FCFF */
-static const struct unidata st596[] = {
-{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2766,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2767,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2768,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCF0-FCFF */
+static const struct unidata st623[] = {
+{dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD00-FD0F */
-static const struct unidata st597[] = {
+{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16370,35 +16984,35 @@ static const struct unidata st597[] = {
 {dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2787,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD00-FD0F */
+static const struct unidata st624[] = {
 {dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD10-FD1F */
-static const struct unidata st598[] = {
+{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2797,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2802,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2803,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD10-FD1F */
+static const struct unidata st625[] = {
+{dd2805,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD20-FD2F */
-static const struct unidata st599[] = {
+{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2784,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2785,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16407,177 +17021,190 @@ static const struct unidata st599[] = {
 {dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD20-FD2F */
+static const struct unidata st626[] = {
 {dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD30-FD3F */
-static const struct unidata st600[] = {
-{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
-};
-/* FD50-FD5F */
-static const struct unidata st601[] = {
 {dd2797,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2802,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2803,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2805,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD30-FD3F */
+static const struct unidata st627[] = {
+{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2806,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2806,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
+};
+/* FD50-FD5F */
+static const struct unidata st628[] = {
 {dd2807,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2808,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2808,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2809,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2810,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD60-FD6F */
-static const struct unidata st602[] = {
 {dd2810,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2811,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2815,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2815,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2816,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2818,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2818,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2819,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FD70-FD7F */
-static const struct unidata st603[] = {
+/* FD60-FD6F */
+static const struct unidata st629[] = {
 {dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2821,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2821,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2822,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2822,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2823,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2823,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2825,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2825,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2826,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2827,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2827,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2828,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2828,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2829,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD70-FD7F */
+static const struct unidata st630[] = {
 {dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2832,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD80-FD8F */
-static const struct unidata st604[] = {
+{dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2832,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2833,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2834,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2835,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2835,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2838,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2838,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2839,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2840,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2840,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2841,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2842,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2842,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD80-FD8F */
+static const struct unidata st631[] = {
 {dd2843,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2844,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2845,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD90-FD9F */
-static const struct unidata st605[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2845,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2846,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2846,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2847,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2847,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2848,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2848,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2849,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2850,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2851,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2851,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2852,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2853,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2854,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2856,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2857,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FDA0-FDAF */
-static const struct unidata st606[] = {
+/* FD90-FD9F */
+static const struct unidata st632[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2856,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2857,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2858,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2859,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2860,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2861,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2861,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2862,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2863,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2864,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2865,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2865,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2866,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2867,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2867,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FDA0-FDAF */
+static const struct unidata st633[] = {
 {dd2868,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2869,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2870,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2871,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2872,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2873,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FDB0-FDBF */
-static const struct unidata st607[] = {
+{dd2873,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2874,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2875,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2876,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2877,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2833,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2878,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2879,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2880,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2881,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2880,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2884,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2885,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FDC0-FDCF */
-static const struct unidata st608[] = {
+/* FDB0-FDBF */
+static const struct unidata st634[] = {
+{dd2884,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2885,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2886,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2887,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2841,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2843,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2888,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2889,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2890,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2891,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2892,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2893,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2892,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2890,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2894,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2895,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FDC0-FDCF */
+static const struct unidata st635[] = {
+{dd2896,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2897,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2898,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2893,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2834,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2899,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2900,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -16588,26 +17215,26 @@ static const struct unidata st608[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FDF0-FDFF */
-static const struct unidata st609[] = {
-{dd2891,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2892,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2893,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2894,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2895,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2896,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2897,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2898,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2899,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2900,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st636[] = {
 {dd2901,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2902,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2903,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd2903,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2904,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2905,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2906,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2907,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2908,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2909,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2910,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2911,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2912,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2913,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FE00-FE0F */
-static const struct unidata st610[] = {
+static const struct unidata st637[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -16626,17 +17253,17 @@ static const struct unidata st610[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* FE10-FE1F */
-static const struct unidata st611[] = {
-{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
-{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
-{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+static const struct unidata st638[] = {
+{dd2914,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2915,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+{dd2916,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2917,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
 {dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2910,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2911,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2912,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2918,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2919,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2920,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2921,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2922,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -16645,162 +17272,124 @@ static const struct unidata st611[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FE30-FE3F */
-static const struct unidata st612[] = {
-{dd2913,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2914,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
-{dd2915,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+static const struct unidata st639[] = {
+{dd2923,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2924,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2925,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
 {dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2919,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2920,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2921,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2922,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2923,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2924,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd1191,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
-};
-/* FE40-FE4F */
-static const struct unidata st613[] = {
-{dd1192,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2925,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2926,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
 {dd2927,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd2928,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {dd2929,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd2930,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
+{dd2931,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2932,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2933,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2934,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd1195,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
+};
+/* FE40-FE4F */
+static const struct unidata st640[] = {
+{dd1196,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2935,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2936,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2937,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2938,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{dd2939,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2940,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
 };
 /* FE50-FE5F */
-static const struct unidata st614[] = {
-{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
-{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+static const struct unidata st641[] = {
+{dd2914,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2915,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
 {dd1057,0,0,0,Po,CD,GBOther,WBMidNumLet,SBATerm},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
-{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2914,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2917,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+{dd2919,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2918,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2924,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
 {dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2919,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2920,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther}
+{dd2927,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2928,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2929,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2930,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2942,0,0,0,Po,CD,GBOther,WBOther,SBOther}
 };
 /* FE60-FE6F */
-static const struct unidata st615[] = {
-{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2934,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+static const struct unidata st642[] = {
+{dd2943,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2944,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2935,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
-{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2937,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2945,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2946,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2947,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2938,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2939,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2948,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2949,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd2950,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2951,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FE70-FE7F */
-static const struct unidata st616[] = {
-{dd2942,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2943,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2944,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2945,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2946,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2947,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2948,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2949,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2950,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2951,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st643[] = {
 {dd2952,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2953,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2954,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2955,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FE80-FE8F */
-static const struct unidata st617[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2955,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2956,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FE90-FE9F */
-static const struct unidata st618[] = {
-{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FE80-FE8F */
+static const struct unidata st644[] = {
 {dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FEA0-FEAF */
-static const struct unidata st619[] = {
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEB0-FEBF */
-static const struct unidata st620[] = {
+/* FE90-FE9F */
+static const struct unidata st645[] = {
+{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16815,8 +17404,8 @@ static const struct unidata st620[] = {
 {dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEC0-FECF */
-static const struct unidata st621[] = {
+/* FEA0-FEAF */
+static const struct unidata st646[] = {
 {dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16828,22 +17417,14 @@ static const struct unidata st621[] = {
 {dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FED0-FEDF */
-static const struct unidata st622[] = {
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FEB0-FEBF */
+static const struct unidata st647[] = {
 {dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16851,10 +17432,7 @@ static const struct unidata st622[] = {
 {dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FEE0-FEEF */
-static const struct unidata st623[] = {
+{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16862,7 +17440,10 @@ static const struct unidata st623[] = {
 {dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FEC0-FECF */
+static const struct unidata st648[] = {
 {dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -16870,48 +17451,94 @@ static const struct unidata st623[] = {
 {dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FEF0-FEFF */
-static const struct unidata st624[] = {
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FED0-FEDF */
+static const struct unidata st649[] = {
+{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2995,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2995,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2995,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FEE0-FEEF */
+static const struct unidata st650[] = {
+{dd2995,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2996,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2996,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2996,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2996,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2997,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2997,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2997,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2997,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2998,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2998,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2998,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2998,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2999,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2999,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FEF0-FEFF */
+static const struct unidata st651[] = {
+{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3000,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3000,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3000,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3000,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3001,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3001,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3002,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3002,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3003,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3003,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3004,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3004,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
 /* FF00-FF0F */
-static const struct unidata st625[] = {
+static const struct unidata st652[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2995,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2939,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2996,0,0,0,Po,CD,GBOther,WBMidNumLet,SBOther},
+{dd2918,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd3005,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2942,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2949,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd2950,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2943,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd3006,0,0,0,Po,CD,GBOther,WBMidNumLet,SBOther},
 {dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
 {dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2934,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2944,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
-{dd2935,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2914,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2945,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
 {dd1057,0,0,0,Po,CD,GBOther,WBMidNumLet,SBATerm},
-{dd2997,0,0,0,Po,CD,GBOther,WBOther,SBOther}
+{dd3007,0,0,0,Po,CD,GBOther,WBOther,SBOther}
 };
 /* FF10-FF1F */
-static const struct unidata st626[] = {
+static const struct unidata st653[] = {
 {dd1070,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
 {dd9,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
 {dd4,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
@@ -16922,53 +17549,53 @@ static const struct unidata st626[] = {
 {dd1074,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
 {dd1075,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
 {dd1076,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+{dd2917,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
 {dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2946,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2937,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBSTerm}
+{dd2947,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2919,0,0,0,Po,CD,GBOther,WBOther,SBSTerm}
 };
 /* FF20-FF2F */
-static const struct unidata st627[] = {
-{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd491,dd4825,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,dd4826,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4827,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4828,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,dd4829,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,dd4830,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,dd4831,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,dd4832,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd499,dd4833,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,dd4834,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,dd4835,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4836,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4837,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,dd4838,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,dd4839,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+static const struct unidata st654[] = {
+{dd2951,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd491,dd4939,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,dd4940,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4941,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4942,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,dd4943,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,dd4944,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,dd4945,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,dd4946,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd499,dd4947,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,dd4948,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,dd4949,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4950,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4951,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,dd4952,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,dd4953,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* FF30-FF3F */
-static const struct unidata st628[] = {
-{dd507,dd4840,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,dd4841,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,dd4842,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,dd4843,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,dd4844,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,dd4845,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4846,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,dd4847,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4848,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,dd4849,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,dd4850,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2929,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2938,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2930,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2998,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
-{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
+static const struct unidata st655[] = {
+{dd507,dd4954,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,dd4955,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,dd4956,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,dd4957,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,dd4958,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,dd4959,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,dd4960,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,dd4961,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,dd4962,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,dd4963,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,dd4964,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2939,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2948,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2940,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd3008,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd2926,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
 };
 /* FF40-FF4F */
-static const struct unidata st629[] = {
+static const struct unidata st656[] = {
 {dd1040,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -16987,9 +17614,9 @@ static const struct unidata st629[] = {
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* FF50-FF5F */
-static const struct unidata st630[] = {
+static const struct unidata st657[] = {
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -16999,41 +17626,34 @@ static const struct unidata st630[] = {
 {dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2999,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd3000,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3001,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
+{dd2927,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd3009,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2928,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd3010,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3011,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
 };
 /* FF60-FF6F */
-static const struct unidata st631[] = {
-{dd3002,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2925,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2926,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
-{dd3003,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1873,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3004,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3005,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3006,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3007,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3008,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3009,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3010,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3011,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3012,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+static const struct unidata st658[] = {
+{dd3012,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2916,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2935,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2936,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2915,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+{dd3013,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd1880,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3014,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3015,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3016,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3017,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3018,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3019,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3020,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3021,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3022,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
 };
 /* FF70-FF7F */
-static const struct unidata st632[] = {
-{dd3013,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter},
-{dd1827,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1828,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1829,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1830,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1831,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1832,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1833,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+static const struct unidata st659[] = {
+{dd3023,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter},
 {dd1834,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1835,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1836,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
@@ -17041,17 +17661,17 @@ static const struct unidata st632[] = {
 {dd1838,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1839,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1840,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1841,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
-};
-/* FF80-FF8F */
-static const struct unidata st633[] = {
+{dd1841,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1842,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1843,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1844,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1845,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1846,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1847,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1848,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1848,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+};
+/* FF80-FF8F */
+static const struct unidata st660[] = {
 {dd1849,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1850,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1851,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
@@ -17060,48 +17680,42 @@ static const struct unidata st633[] = {
 {dd1854,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1855,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1856,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1857,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
-};
-/* FF90-FF9F */
-static const struct unidata st634[] = {
+{dd1857,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1858,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1859,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1860,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1861,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1862,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1863,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1864,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1864,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+};
+/* FF90-FF9F */
+static const struct unidata st661[] = {
 {dd1865,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1866,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1867,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1868,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1869,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
 {dd1870,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3014,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3015,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend},
-{dd3016,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend}
+{dd1871,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1872,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1873,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1874,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1875,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1876,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1877,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3024,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3025,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend},
+{dd3026,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend}
 };
 /* FFA0-FFAF */
-static const struct unidata st635[] = {
-{dd3017,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3018,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3019,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3020,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3021,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3022,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3023,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3024,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3025,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3026,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+static const struct unidata st662[] = {
 {dd3027,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3028,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3029,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3030,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3031,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3032,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FFB0-FFBF */
-static const struct unidata st636[] = {
+{dd3032,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3033,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3034,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3035,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -17111,73 +17725,86 @@ static const struct unidata st636[] = {
 {dd3039,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3040,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3041,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3042,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3042,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FFB0-FFBF */
+static const struct unidata st663[] = {
 {dd3043,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3044,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3045,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3046,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3047,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FFC0-FFCF */
-static const struct unidata st637[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd3048,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3049,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3050,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3051,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3052,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3053,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd3054,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3055,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3056,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3057,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3058,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3059,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FFD0-FFDF */
-static const struct unidata st638[] = {
+/* FFC0-FFCF */
+static const struct unidata st664[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3058,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3059,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3060,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3061,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3062,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3063,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3064,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3065,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3064,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3065,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3066,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3067,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd3068,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3069,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FFD0-FFDF */
+static const struct unidata st665[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3070,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3071,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3072,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3073,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3074,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3075,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3076,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3077,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3078,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FFE0-FFEF */
-static const struct unidata st639[] = {
-{dd3069,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3070,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3071,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3072,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
-{dd3073,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3074,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3075,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3076,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3078,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3080,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3081,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3082,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st666[] = {
+{dd3079,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3080,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3081,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3082,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd3083,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3084,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3085,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3086,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3087,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3088,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3089,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3090,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3091,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3092,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* FFF0-FFFF */
-static const struct unidata st640[] = {
+static const struct unidata st667[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17196,7 +17823,7 @@ static const struct unidata st640[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10000-1000F */
-static const struct unidata st641[] = {
+static const struct unidata st668[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17215,7 +17842,7 @@ static const struct unidata st641[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 10030-1003F */
-static const struct unidata st642[] = {
+static const struct unidata st669[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17234,7 +17861,7 @@ static const struct unidata st642[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 10100-1010F */
-static const struct unidata st643[] = {
+static const struct unidata st670[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17253,7 +17880,7 @@ static const struct unidata st643[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 10130-1013F */
-static const struct unidata st644[] = {
+static const struct unidata st671[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -17272,7 +17899,7 @@ static const struct unidata st644[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 10140-1014F */
-static const struct unidata st645[] = {
+static const struct unidata st672[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
@@ -17291,7 +17918,7 @@ static const struct unidata st645[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
 };
 /* 10170-1017F */
-static const struct unidata st646[] = {
+static const struct unidata st673[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
@@ -17310,7 +17937,7 @@ static const struct unidata st646[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 10180-1018F */
-static const struct unidata st647[] = {
+static const struct unidata st674[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17329,7 +17956,7 @@ static const struct unidata st647[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 101F0-101FF */
-static const struct unidata st648[] = {
+static const struct unidata st675[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17348,7 +17975,7 @@ static const struct unidata st648[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10310-1031F */
-static const struct unidata st649[] = {
+static const struct unidata st676[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17367,7 +17994,7 @@ static const struct unidata st649[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10320-1032F */
-static const struct unidata st650[] = {
+static const struct unidata st677[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -17386,7 +18013,7 @@ static const struct unidata st650[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10340-1034F */
-static const struct unidata st651[] = {
+static const struct unidata st678[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17405,7 +18032,7 @@ static const struct unidata st651[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10390-1039F */
-static const struct unidata st652[] = {
+static const struct unidata st679[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17424,7 +18051,7 @@ static const struct unidata st652[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 103C0-103CF */
-static const struct unidata st653[] = {
+static const struct unidata st680[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17443,7 +18070,7 @@ static const struct unidata st653[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 103D0-103DF */
-static const struct unidata st654[] = {
+static const struct unidata st681[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
@@ -17462,53 +18089,53 @@ static const struct unidata st654[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10400-1040F */
-static const struct unidata st655[] = {
-{0,dd4851,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4852,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4853,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4854,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4855,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4856,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4857,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4858,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4859,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4860,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4861,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4862,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4863,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4864,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4865,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4866,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st682[] = {
+{0,dd4965,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4966,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4967,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4968,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4969,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4970,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4971,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4972,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4973,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4974,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4975,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4976,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4977,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4978,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4979,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4980,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 10410-1041F */
-static const struct unidata st656[] = {
-{0,dd4867,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4868,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4869,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4870,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4871,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4872,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4873,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4874,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4875,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4876,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4877,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4878,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4879,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4880,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4881,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4882,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st683[] = {
+{0,dd4981,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4982,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4983,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4984,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4985,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4986,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4987,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4988,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4989,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4990,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4991,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4992,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4993,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4994,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4995,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4996,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 10420-1042F */
-static const struct unidata st657[] = {
-{0,dd4883,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4884,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4885,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4886,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4887,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4888,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4889,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4890,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st684[] = {
+{0,dd4997,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4998,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4999,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd5000,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd5001,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd5002,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd5003,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd5004,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -17519,7 +18146,7 @@ static const struct unidata st657[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 10800-1080F */
-static const struct unidata st658[] = {
+static const struct unidata st685[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17538,7 +18165,7 @@ static const struct unidata st658[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 10830-1083F */
-static const struct unidata st659[] = {
+static const struct unidata st686[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17556,8 +18183,27 @@ static const struct unidata st659[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
+/* 10850-1085F */
+static const struct unidata st687[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther}
+};
 /* 10910-1091F */
-static const struct unidata st660[] = {
+static const struct unidata st688[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17568,15 +18214,15 @@ static const struct unidata st660[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 10930-1093F */
-static const struct unidata st661[] = {
+static const struct unidata st689[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17595,7 +18241,7 @@ static const struct unidata st661[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 10A00-10A0F */
-static const struct unidata st662[] = {
+static const struct unidata st690[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -17614,7 +18260,7 @@ static const struct unidata st662[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 10A10-10A1F */
-static const struct unidata st663[] = {
+static const struct unidata st691[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17633,7 +18279,7 @@ static const struct unidata st663[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 10A30-10A3F */
-static const struct unidata st664[] = {
+static const struct unidata st692[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -17652,7 +18298,7 @@ static const struct unidata st664[] = {
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 10A40-10A4F */
-static const struct unidata st665[] = {
+static const struct unidata st693[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -17671,15 +18317,15 @@ static const struct unidata st665[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10A50-10A5F */
-static const struct unidata st666[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+static const struct unidata st694[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17689,37 +18335,94 @@ static const struct unidata st666[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 12460-1246F */
-static const struct unidata st667[] = {
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+/* 10A70-10A7F */
+static const struct unidata st695[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* 10B30-10B3F */
+static const struct unidata st696[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 12470-1247F */
-static const struct unidata st668[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* 10B50-10B5F */
+static const struct unidata st697[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther}
+};
+/* 10B70-10B7F */
+static const struct unidata st698[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther}
+};
+/* 10C40-10C4F */
+static const struct unidata st699[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17727,14 +18430,185 @@ static const struct unidata st668[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D0F0-1D0FF */
-static const struct unidata st669[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+/* 10E70-10E7F */
+static const struct unidata st700[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 11000-1100F */
+static const struct unidata st701[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 11030-1103F */
+static const struct unidata st702[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 11040-1104F */
+static const struct unidata st703[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 11050-1105F */
+static const struct unidata st704[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther}
+};
+/* 11060-1106F */
+static const struct unidata st705[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
+};
+/* 11090-1109F */
+static const struct unidata st706[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd4069,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd3093,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd4070,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd3094,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 110A0-110AF */
+static const struct unidata st707[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd4071,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd3095,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 110B0-110BF */
+static const struct unidata st708[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
+};
+/* 110C0-110CF */
+static const struct unidata st709[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17746,51 +18620,127 @@ static const struct unidata st669[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D120-1D12F */
-static const struct unidata st670[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+/* 12460-1246F */
+static const struct unidata st710[] = {
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
-};
-/* 1D150-1D15F */
-static const struct unidata st671[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3083,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3084,0,0,0,So,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D160-1D16F */
-static const struct unidata st672[] = {
-{dd3085,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3086,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3087,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3088,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3089,0,0,0,So,0,GBOther,WBOther,SBOther},
+/* 12470-1247F */
+static const struct unidata st711[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1B000-1B00F */
+static const struct unidata st712[] = {
+{0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1D0F0-1D0FF */
+static const struct unidata st713[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1D120-1D12F */
+static const struct unidata st714[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 1D150-1D15F */
+static const struct unidata st715[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3096,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3097,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 1D160-1D16F */
+static const struct unidata st716[] = {
+{dd3098,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3099,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3100,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3101,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3102,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,216,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -17804,7 +18754,7 @@ static const struct unidata st672[] = {
 {0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1D170-1D17F */
-static const struct unidata st673[] = {
+static const struct unidata st717[] = {
 {0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
@@ -17823,7 +18773,7 @@ static const struct unidata st673[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1D180-1D18F */
-static const struct unidata st674[] = {
+static const struct unidata st718[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -17842,7 +18792,7 @@ static const struct unidata st674[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 1D1A0-1D1AF */
-static const struct unidata st675[] = {
+static const struct unidata st719[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17861,7 +18811,7 @@ static const struct unidata st675[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 1D1B0-1D1BF */
-static const struct unidata st676[] = {
+static const struct unidata st720[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17873,15 +18823,15 @@ static const struct unidata st676[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3090,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3091,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3092,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3093,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3094,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd3103,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3104,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3105,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3106,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3107,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 1D1C0-1D1CF */
-static const struct unidata st677[] = {
-{dd3095,0,0,0,So,0,GBOther,WBOther,SBOther},
+static const struct unidata st721[] = {
+{dd3108,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -17898,8 +18848,27 @@ static const struct unidata st677[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
+/* 1D1D0-1D1DF */
+static const struct unidata st722[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 1D240-1D24F */
-static const struct unidata st678[] = {
+static const struct unidata st723[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -17918,7 +18887,7 @@ static const struct unidata st678[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1D370-1D37F */
-static const struct unidata st679[] = {
+static const struct unidata st724[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17937,7 +18906,7 @@ static const struct unidata st679[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1D400-1D40F */
-static const struct unidata st680[] = {
+static const struct unidata st725[] = {
 {dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -17956,16 +18925,16 @@ static const struct unidata st680[] = {
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D410-1D41F */
-static const struct unidata st681[] = {
+static const struct unidata st726[] = {
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -17975,7 +18944,7 @@ static const struct unidata st681[] = {
 {dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D420-1D42F */
-static const struct unidata st682[] = {
+static const struct unidata st727[] = {
 {dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -17986,7 +18955,7 @@ static const struct unidata st682[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -17994,7 +18963,7 @@ static const struct unidata st682[] = {
 {dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D430-1D43F */
-static const struct unidata st683[] = {
+static const struct unidata st728[] = {
 {dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18013,26 +18982,26 @@ static const struct unidata st683[] = {
 {dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D440-1D44F */
-static const struct unidata st684[] = {
+static const struct unidata st729[] = {
 {dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D450-1D45F */
-static const struct unidata st685[] = {
+static const struct unidata st730[] = {
 {dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18047,11 +19016,11 @@ static const struct unidata st685[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D460-1D46F */
-static const struct unidata st686[] = {
+static const struct unidata st731[] = {
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18070,7 +19039,7 @@ static const struct unidata st686[] = {
 {dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D470-1D47F */
-static const struct unidata st687[] = {
+static const struct unidata st732[] = {
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -18081,16 +19050,16 @@ static const struct unidata st687[] = {
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D480-1D48F */
-static const struct unidata st688[] = {
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st733[] = {
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18108,10 +19077,10 @@ static const struct unidata st688[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D490-1D49F */
-static const struct unidata st689[] = {
+static const struct unidata st734[] = {
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18127,7 +19096,7 @@ static const struct unidata st689[] = {
 {dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D4A0-1D4AF */
-static const struct unidata st690[] = {
+static const struct unidata st735[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -18142,16 +19111,16 @@ static const struct unidata st690[] = {
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D4B0-1D4BF */
-static const struct unidata st691[] = {
+static const struct unidata st736[] = {
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18165,14 +19134,14 @@ static const struct unidata st691[] = {
 {dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D4C0-1D4CF */
-static const struct unidata st692[] = {
+static const struct unidata st737[] = {
 {dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18184,7 +19153,7 @@ static const struct unidata st692[] = {
 {dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D500-1D50F */
-static const struct unidata st693[] = {
+static const struct unidata st738[] = {
 {dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18203,26 +19172,26 @@ static const struct unidata st693[] = {
 {dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D510-1D51F */
-static const struct unidata st694[] = {
+static const struct unidata st739[] = {
 {dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D520-1D52F */
-static const struct unidata st695[] = {
+static const struct unidata st740[] = {
 {dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18237,11 +19206,11 @@ static const struct unidata st695[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D530-1D53F */
-static const struct unidata st696[] = {
+static const struct unidata st741[] = {
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18260,7 +19229,7 @@ static const struct unidata st696[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1D540-1D54F */
-static const struct unidata st697[] = {
+static const struct unidata st742[] = {
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -18271,16 +19240,16 @@ static const struct unidata st697[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D550-1D55F */
-static const struct unidata st698[] = {
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st743[] = {
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18298,10 +19267,10 @@ static const struct unidata st698[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D560-1D56F */
-static const struct unidata st699[] = {
+static const struct unidata st744[] = {
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18317,7 +19286,7 @@ static const struct unidata st699[] = {
 {dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D570-1D57F */
-static const struct unidata st700[] = {
+static const struct unidata st745[] = {
 {dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -18332,16 +19301,16 @@ static const struct unidata st700[] = {
 {dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1274,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D580-1D58F */
-static const struct unidata st701[] = {
+static const struct unidata st746[] = {
 {dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1134,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1275,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18355,14 +19324,14 @@ static const struct unidata st701[] = {
 {dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D590-1D59F */
-static const struct unidata st702[] = {
+static const struct unidata st747[] = {
 {dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1276,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -18374,368 +19343,368 @@ static const struct unidata st702[] = {
 {dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D6A0-1D6AF */
-static const struct unidata st703[] = {
+static const struct unidata st748[] = {
 {dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3096,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3097,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3109,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3110,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D6B0-1D6BF */
-static const struct unidata st704[] = {
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st749[] = {
+{dd3117,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3118,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3119,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3120,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3121,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3122,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3123,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3124,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3125,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3127,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3128,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D6C0-1D6CF */
-static const struct unidata st705[] = {
+static const struct unidata st750[] = {
 {dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D6D0-1D6DF */
-static const struct unidata st706[] = {
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st751[] = {
+{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3139,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3140,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd3141,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3142,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3143,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3144,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3145,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3146,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3147,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D6E0-1D6EF */
-static const struct unidata st707[] = {
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st752[] = {
+{dd3148,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3149,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3117,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3118,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3119,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3120,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3121,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3122,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D6F0-1D6FF */
-static const struct unidata st708[] = {
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st753[] = {
+{dd3123,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3124,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3125,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3127,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3128,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D700-1D70F */
-static const struct unidata st709[] = {
+static const struct unidata st754[] = {
 {dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3139,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D710-1D71F */
-static const struct unidata st710[] = {
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st755[] = {
+{dd3140,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3141,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3142,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3143,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3144,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3145,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3146,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3147,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3148,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3149,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D720-1D72F */
-static const struct unidata st711[] = {
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st756[] = {
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3118,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3119,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3120,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3121,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3122,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3123,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3124,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3125,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D730-1D73F */
-static const struct unidata st712[] = {
+static const struct unidata st757[] = {
 {dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3127,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3128,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D740-1D74F */
-static const struct unidata st713[] = {
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st758[] = {
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3139,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3140,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+{dd3141,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3142,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3143,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
 };
 /* 1D750-1D75F */
-static const struct unidata st714[] = {
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st759[] = {
+{dd3144,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3145,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3146,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3147,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3148,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3149,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3117,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3118,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D760-1D76F */
-static const struct unidata st715[] = {
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st760[] = {
+{dd3119,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3120,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3121,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3122,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3123,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3124,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3125,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3127,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3128,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
 };
 /* 1D770-1D77F */
-static const struct unidata st716[] = {
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st761[] = {
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D780-1D78F */
-static const struct unidata st717[] = {
+static const struct unidata st762[] = {
 {dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3139,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3140,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd3141,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3142,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3143,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3144,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3145,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3146,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3147,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3148,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3149,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D790-1D79F */
-static const struct unidata st718[] = {
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st763[] = {
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3118,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3119,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3120,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3121,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3122,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3123,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 1D7A0-1D7AF */
-static const struct unidata st719[] = {
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+static const struct unidata st764[] = {
+{dd3124,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3125,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3127,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3128,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3129,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D7B0-1D7BF */
-static const struct unidata st720[] = {
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+static const struct unidata st765[] = {
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3139,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3140,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D7C0-1D7CF */
-static const struct unidata st721[] = {
+static const struct unidata st766[] = {
 {dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3137,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3141,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3142,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3143,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3144,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3145,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3146,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3147,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3148,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3149,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3150,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3151,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
 };
 /* 1D7D0-1D7DF */
-static const struct unidata st722[] = {
+static const struct unidata st767[] = {
 {dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
@@ -18754,7 +19723,7 @@ static const struct unidata st722[] = {
 {dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
 };
 /* 1D7E0-1D7EF */
-static const struct unidata st723[] = {
+static const struct unidata st768[] = {
 {dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
@@ -18773,7 +19742,7 @@ static const struct unidata st723[] = {
 {dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
 };
 /* 1D7F0-1D7FF */
-static const struct unidata st724[] = {
+static const struct unidata st769[] = {
 {dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
@@ -18791,318 +19760,694 @@ static const struct unidata st724[] = {
 {dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
 {dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
 };
-/* 2A6D0-2A6DF */
-static const struct unidata st725[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 1F0A0-1F0AF */
+static const struct unidata st770[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F0B0-1F0BF */
+static const struct unidata st771[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F100-1F10F */
+static const struct unidata st772[] = {
+{dd3152,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3153,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3154,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3155,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3156,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3157,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3158,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3159,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3160,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3161,0,0,0,No,CD,GBOther,WBOther,SBOther},
+{dd3162,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F110-1F11F */
+static const struct unidata st773[] = {
+{dd3163,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3164,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3165,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3166,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3167,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3168,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3169,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3170,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3171,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3172,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3173,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3174,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3175,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3176,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3177,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3178,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 1F120-1F12F */
+static const struct unidata st774[] = {
+{dd3179,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3180,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3181,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3182,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3183,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3184,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3185,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3186,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3187,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3188,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3189,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1086,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd508,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3190,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3191,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F130-1F13F */
+static const struct unidata st775[] = {
+{dd491,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd493,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1086,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd494,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd495,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1101,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd497,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd498,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd499,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd500,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd501,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd502,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd503,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd504,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd505,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd507,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 1F140-1F14F */
+static const struct unidata st776[] = {
+{dd1094,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd508,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1274,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd509,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd510,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1129,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd511,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1134,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1275,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1098,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3192,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2066,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3193,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3194,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3195,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3196,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 1F190-1F19F */
+static const struct unidata st777[] = {
+{dd3197,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F800-2F80F */
-static const struct unidata st726[] = {
-{dd3139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F1E0-1F1EF */
+static const struct unidata st778[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 2F810-2F81F */
-static const struct unidata st727[] = {
-{dd3152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3153,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F200-1F20F */
+static const struct unidata st779[] = {
+{dd3198,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3199,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1844,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F820-2F82F */
-static const struct unidata st728[] = {
-{dd3166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3169,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3170,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F210-1F21F */
+static const struct unidata st780[] = {
+{dd1348,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3200,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3201,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3202,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1291,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3203,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3204,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1666,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3205,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3206,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3207,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd2316,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3208,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3209,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3210,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3211,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 1F220-1F22F */
+static const struct unidata st781[] = {
+{dd3212,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3213,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1384,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3214,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3215,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3216,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3217,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3218,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3219,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1285,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1658,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3220,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1793,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1661,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1794,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3221,0,0,0,So,CD,GBOther,WBOther,SBOther}
+};
+/* 1F230-1F23F */
+static const struct unidata st782[] = {
+{dd1440,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3222,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3223,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3224,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3225,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3226,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1776,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd1358,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3227,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3228,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3229,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F830-2F83F */
-static const struct unidata st729[] = {
-{dd3176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F240-1F24F */
+static const struct unidata st783[] = {
+{dd3230,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3231,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3232,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3233,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3234,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3235,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3236,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3237,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3238,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F840-2F84F */
-static const struct unidata st730[] = {
-{dd3190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3200,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F250-1F25F */
+static const struct unidata st784[] = {
+{dd3239,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3240,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F850-2F85F */
-static const struct unidata st731[] = {
-{dd2369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F320-1F32F */
+static const struct unidata st785[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F860-2F86F */
-static const struct unidata st732[] = {
-{dd3218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3231,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* 1F330-1F33F */
+static const struct unidata st786[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 2F870-2F87F */
-static const struct unidata st733[] = {
-{dd3232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 1F370-1F37F */
+static const struct unidata st787[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F3C0-1F3CF */
+static const struct unidata st788[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F440-1F44F */
+static const struct unidata st789[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 1F4F0-1F4FF */
+static const struct unidata st790[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F560-1F56F */
+static const struct unidata st791[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F5F0-1F5FF */
+static const struct unidata st792[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 1F610-1F61F */
+static const struct unidata st793[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F620-1F62F */
+static const struct unidata st794[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 1F630-1F63F */
+static const struct unidata st795[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 1F640-1F64F */
+static const struct unidata st796[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+};
+/* 2A6D0-2A6DF */
+static const struct unidata st797[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 2F800-2F80F */
+static const struct unidata st798[] = {
 {dd3241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F880-2F88F */
-static const struct unidata st734[] = {
+{dd3245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F810-2F81F */
+static const struct unidata st799[] = {
 {dd3254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F890-2F89F */
-static const struct unidata st735[] = {
-{dd1335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F820-2F82F */
+static const struct unidata st800[] = {
 {dd3267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8A0-2F8AF */
-static const struct unidata st736[] = {
+{dd2230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F830-2F83F */
+static const struct unidata st801[] = {
 {dd3276,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8B0-2F8BF */
-static const struct unidata st737[] = {
-{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F840-2F84F */
+static const struct unidata st802[] = {
 {dd3290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8C0-2F8CF */
-static const struct unidata st738[] = {
+{dd3299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F850-2F85F */
+static const struct unidata st803[] = {
+{dd2376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3305,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3306,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8D0-2F8DF */
-static const struct unidata st739[] = {
 {dd3314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F860-2F86F */
+static const struct unidata st804[] = {
 {dd3317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8E0-2F8EF */
-static const struct unidata st740[] = {
+{dd3327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F870-2F87F */
+static const struct unidata st805[] = {
 {dd3331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8F0-2F8FF */
-static const struct unidata st741[] = {
+{dd3341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F880-2F88F */
+static const struct unidata st806[] = {
 {dd3345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19112,50 +20457,55 @@ static const struct unidata st741[] = {
 {dd3353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F900-2F90F */
-static const struct unidata st742[] = {
+{dd3356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F890-2F89F */
+static const struct unidata st807[] = {
+{dd1339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3364,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F910-2F91F */
-static const struct unidata st743[] = {
+{dd3369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8A0-2F8AF */
+static const struct unidata st808[] = {
 {dd3373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* 2F920-2F92F */
-static const struct unidata st744[] = {
+/* 2F8B0-2F8BF */
+static const struct unidata st809[] = {
+{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19167,13 +20517,11 @@ static const struct unidata st744[] = {
 {dd3394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* 2F930-2F93F */
-static const struct unidata st745[] = {
-{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 2F8C0-2F8CF */
+static const struct unidata st810[] = {
 {dd3399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19181,134 +20529,133 @@ static const struct unidata st745[] = {
 {dd3403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* 2F940-2F94F */
-static const struct unidata st746[] = {
-{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 2F8D0-2F8DF */
+static const struct unidata st811[] = {
 {dd3413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F950-2F95F */
-static const struct unidata st747[] = {
-{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8E0-2F8EF */
+static const struct unidata st812[] = {
 {dd3427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2534,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F960-2F96F */
-static const struct unidata st748[] = {
+{dd3434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8F0-2F8FF */
+static const struct unidata st813[] = {
 {dd3441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F970-2F97F */
-static const struct unidata st749[] = {
+{dd3450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F900-2F90F */
+static const struct unidata st814[] = {
 {dd3456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F980-2F98F */
-static const struct unidata st750[] = {
+{dd2495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F910-2F91F */
+static const struct unidata st815[] = {
 {dd3469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F990-2F99F */
-static const struct unidata st751[] = {
+{dd3480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F920-2F92F */
+static const struct unidata st816[] = {
 {dd3484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F9A0-2F9AF */
-static const struct unidata st752[] = {
+{dd3495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F930-2F93F */
+static const struct unidata st817[] = {
+{dd2500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19316,56 +20663,61 @@ static const struct unidata st752[] = {
 {dd3502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* 2F9B0-2F9BF */
-static const struct unidata st753[] = {
-{dd3511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 2F940-2F94F */
+static const struct unidata st818[] = {
+{dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2536,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd2192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* 2F9C0-2F9CF */
-static const struct unidata st754[] = {
+/* 2F950-2F95F */
+static const struct unidata st819[] = {
+{dd2509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3532,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3533,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3532,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3533,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F960-2F96F */
+static const struct unidata st820[] = {
 {dd3534,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3535,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3536,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3537,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3538,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3539,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F9D0-2F9DF */
-static const struct unidata st755[] = {
-{dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3539,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3540,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3541,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3542,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19375,13 +20727,12 @@ static const struct unidata st755[] = {
 {dd3546,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3547,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3548,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3549,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3549,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F970-2F97F */
+static const struct unidata st821[] = {
 {dd3550,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3551,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F9E0-2F9EF */
-static const struct unidata st756[] = {
 {dd3552,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3553,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3554,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19390,17 +20741,18 @@ static const struct unidata st756[] = {
 {dd3557,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3558,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3559,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3560,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3561,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3562,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3563,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3564,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3564,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F980-2F98F */
+static const struct unidata st822[] = {
 {dd3565,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3566,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3567,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F9F0-2F9FF */
-static const struct unidata st757[] = {
+{dd3567,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3568,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3569,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3570,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -19409,55 +20761,185 @@ static const struct unidata st757[] = {
 {dd3573,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3574,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3575,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3576,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3577,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3578,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3579,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3579,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F990-2F99F */
+static const struct unidata st823[] = {
 {dd3580,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3581,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2FA00-2FA0F */
-static const struct unidata st758[] = {
 {dd3582,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3583,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3584,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3585,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3586,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3587,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3588,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3589,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3590,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3591,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3592,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3593,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9A0-2F9AF */
+static const struct unidata st824[] = {
 {dd3594,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3595,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3596,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2FA10-2FA1F */
-static const struct unidata st759[] = {
+{dd3596,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3597,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3598,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3599,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3600,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3601,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3602,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3603,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3604,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3605,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3606,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd3607,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3608,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3609,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9B0-2F9BF */
+static const struct unidata st825[] = {
+{dd3610,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3611,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3612,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3613,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3614,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3615,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3616,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3617,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3618,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3619,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3620,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3621,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3622,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3623,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9C0-2F9CF */
+static const struct unidata st826[] = {
+{dd3624,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3625,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3626,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3627,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3628,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3629,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3630,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3631,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3632,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3633,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3634,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3635,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3636,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3637,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3638,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9D0-2F9DF */
+static const struct unidata st827[] = {
+{dd2521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3639,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3640,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3641,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3642,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3643,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3644,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3645,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3646,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3647,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3648,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3649,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3650,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9E0-2F9EF */
+static const struct unidata st828[] = {
+{dd3651,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3652,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3653,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3654,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3655,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3656,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3657,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3658,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3659,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3660,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3661,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3662,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3663,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3664,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3665,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3666,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9F0-2F9FF */
+static const struct unidata st829[] = {
+{dd3667,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3668,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3669,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3670,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3671,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3672,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3673,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3674,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3675,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3676,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3677,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3678,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3679,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3680,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2FA00-2FA0F */
+static const struct unidata st830[] = {
+{dd3681,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3682,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3683,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3684,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3685,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3686,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3687,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3688,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3689,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3690,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3691,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3692,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3693,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3694,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3695,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2FA10-2FA1F */
+static const struct unidata st831[] = {
+{dd3696,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3697,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3698,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3699,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3700,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3701,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3702,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3703,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3704,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3705,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3706,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* E0000-E000F */
-static const struct unidata st760[] = {
+static const struct unidata st832[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -19476,7 +20958,7 @@ static const struct unidata st760[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* E0020-E002F */
-static const struct unidata st761[] = {
+static const struct unidata st833[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
@@ -19623,28 +21105,24 @@ st107,
 st87,
 st108,
 st109,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
+st87,
 st110,
 st111,
-st87,
 st112,
+st87,
 st113,
 st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
 st115,
+st87,
 st116,
 st117,
 st118,
@@ -19656,89 +21134,89 @@ st123,
 st124,
 st125,
 st126,
-st119,
-st120,
 st127,
 st128,
 st129,
 st130,
+st123,
+st124,
 st131,
 st132,
 st133,
-st120,
 st134,
 st135,
 st136,
-st124,
 st137,
-st118,
-st119,
-st120,
+st124,
 st138,
 st139,
 st140,
-st124,
+st128,
 st141,
+st122,
+st123,
+st124,
 st142,
 st143,
 st144,
+st128,
 st145,
 st146,
 st147,
-st130,
 st148,
 st149,
 st150,
-st120,
 st151,
+st134,
 st152,
 st153,
-st124,
 st154,
+st124,
 st155,
-st150,
-st120,
 st156,
 st157,
+st128,
 st158,
-st124,
 st159,
-st155,
-st150,
-st120,
+st154,
+st124,
 st160,
 st161,
 st162,
-st124,
+st128,
 st163,
+st159,
+st154,
+st87,
 st164,
 st165,
-st87,
 st166,
+st128,
 st167,
 st168,
-st110,
 st169,
+st87,
 st170,
 st171,
-st171,
 st172,
+st114,
 st173,
 st174,
-st110,
-st110,
+st175,
 st175,
 st176,
 st177,
 st178,
+st114,
+st114,
 st179,
 st180,
-st110,
-st110,
 st181,
 st182,
 st183,
 st184,
+st114,
+st114,
 st185,
 st186,
 st187,
@@ -19749,14 +21227,14 @@ st191,
 st192,
 st193,
 st194,
-st110,
-st110,
-st171,
-st171,
 st195,
 st196,
 st197,
 st198,
+st114,
+st114,
+st175,
+st175,
 st199,
 st200,
 st201,
@@ -19764,63 +21242,67 @@ st202,
 st203,
 st204,
 st205,
-st87,
-st87,
 st206,
 st207,
-st207,
-st207,
-st207,
-st207,
 st208,
 st209,
-st209,
-st209,
-st209,
+st87,
+st87,
 st210,
 st211,
 st211,
 st211,
 st211,
+st211,
+st211,
+st212,
+st212,
+st212,
 st212,
-st87,
-st87,
-st87,
-st87,
 st213,
 st214,
+st214,
+st214,
+st214,
+st214,
 st87,
 st87,
-st213,
 st87,
 st87,
 st215,
 st216,
-st217,
-st87,
-st87,
 st87,
-st216,
 st87,
+st215,
 st87,
 st87,
+st217,
 st218,
 st219,
-st220,
 st87,
-st221,
 st87,
 st87,
+st218,
 st87,
 st87,
 st87,
+st220,
+st221,
 st222,
+st87,
 st223,
 st87,
 st87,
 st87,
 st87,
 st87,
+st224,
+st225,
+st87,
+st87,
+st87,
+st87,
+st87,
 st87,
 st87,
 st87,
@@ -19853,132 +21335,121 @@ st87,
 st87,
 st87,
 st87,
-st224,
-st225,
 st226,
+st87,
 st227,
+st228,
 st87,
 st87,
 st87,
 st87,
-st228,
 st229,
 st230,
 st231,
-st87,
 st232,
 st87,
 st233,
-st230,
+st87,
 st234,
-st171,
-st171,
-st171,
+st231,
 st235,
+st175,
+st175,
+st175,
 st236,
 st237,
 st238,
 st239,
 st240,
-st238,
-st87,
-st87,
 st241,
+st239,
 st87,
 st87,
 st242,
 st87,
 st87,
 st243,
-st110,
-st110,
-st110,
-st110,
-st110,
+st87,
 st87,
 st244,
+st87,
+st87,
+st87,
+st87,
 st245,
+st87,
 st246,
 st247,
-st171,
 st248,
 st249,
-st171,
-st171,
+st175,
 st250,
 st251,
+st175,
+st175,
 st252,
 st253,
 st254,
-st254,
-st87,
 st255,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
 st256,
-st257,
+st256,
 st87,
+st257,
+st175,
+st175,
+st175,
 st258,
 st259,
 st260,
+st239,
+st239,
 st261,
+st114,
+st114,
+st114,
+st114,
+st114,
 st262,
 st263,
 st87,
 st264,
-st238,
-st110,
-st110,
-st110,
-st110,
-st87,
-st87,
 st265,
 st266,
 st267,
-st107,
-st87,
 st268,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st36,
-st36,
 st269,
+st87,
 st270,
+st239,
+st87,
+st87,
 st271,
 st272,
+st87,
+st87,
 st273,
 st274,
-st36,
 st275,
+st107,
+st87,
 st276,
+st114,
+st114,
+st114,
+st114,
+st114,
 st277,
 st278,
 st279,
+st36,
+st36,
 st280,
 st281,
 st282,
 st283,
 st284,
 st285,
+st36,
 st286,
 st287,
 st288,
@@ -20019,7 +21490,6 @@ st322,
 st323,
 st324,
 st325,
-st110,
 st326,
 st327,
 st328,
@@ -20031,228 +21501,233 @@ st333,
 st334,
 st335,
 st336,
+st114,
 st337,
 st338,
 st339,
-st254,
 st340,
 st341,
-st254,
 st342,
 st343,
 st344,
 st345,
 st346,
 st347,
-st344,
 st348,
 st349,
 st350,
+st256,
 st351,
 st352,
+st256,
 st353,
-st344,
-st344,
 st354,
-st344,
 st355,
-st254,
 st356,
-st254,
-st254,
-st254,
-st254,
 st357,
-st254,
 st358,
-st344,
+st355,
 st359,
-st254,
 st360,
 st361,
-st110,
-st254,
-st254,
 st362,
-st110,
 st363,
-st110,
 st364,
+st355,
+st355,
 st365,
+st355,
 st366,
+st256,
 st367,
+st256,
+st256,
+st256,
+st256,
 st368,
+st256,
 st369,
+st355,
 st370,
+st256,
 st371,
 st372,
 st373,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
+st256,
+st256,
 st374,
+st114,
 st375,
-st254,
-st254,
+st114,
 st376,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
 st377,
-st254,
-st254,
 st378,
-st254,
 st379,
 st380,
-st110,
-st110,
-st110,
 st381,
-st254,
 st382,
-st254,
 st383,
 st384,
 st385,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
 st386,
-st373,
 st387,
-st254,
+st256,
+st256,
 st388,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
 st389,
-st344,
-st390,
-st344,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st344,
-st344,
-st344,
-st344,
-st344,
-st344,
-st344,
-st344,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st390,
+st256,
+st256,
+st256,
+st256,
 st391,
 st392,
-st344,
-st344,
-st344,
 st393,
-st344,
+st385,
 st394,
+st256,
+st256,
 st395,
-st344,
-st344,
-st344,
-st344,
-st344,
-st344,
+st355,
 st396,
-st344,
-st344,
-st344,
-st344,
-st344,
+st355,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st355,
+st355,
+st355,
+st355,
+st355,
+st355,
+st355,
+st355,
 st397,
-st344,
-st344,
-st254,
-st254,
-st254,
-st344,
 st398,
+st355,
+st355,
+st355,
 st399,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
+st355,
 st400,
 st401,
+st355,
+st355,
+st355,
+st355,
+st355,
+st355,
 st402,
-st36,
-st36,
+st355,
+st355,
+st355,
+st355,
+st355,
 st403,
+st355,
+st355,
+st256,
+st256,
+st256,
+st355,
 st404,
+st223,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
 st405,
 st406,
 st407,
+st36,
+st36,
 st408,
 st409,
 st410,
 st411,
 st412,
 st413,
-st36,
-st36,
 st414,
-st87,
-st87,
-st87,
 st415,
-st110,
-st87,
-st225,
-st416,
-st416,
-st416,
 st416,
-st43,
-st43,
 st417,
 st418,
+st36,
+st36,
 st419,
+st87,
+st87,
+st87,
 st420,
-st110,
-st110,
-st110,
-st110,
-st254,
 st421,
-st254,
-st254,
-st254,
-st254,
-st254,
+st87,
 st422,
 st423,
+st423,
+st423,
+st423,
+st43,
+st43,
 st424,
 st425,
 st426,
 st427,
+st114,
+st114,
+st114,
+st114,
+st256,
 st428,
+st256,
+st256,
+st256,
+st256,
+st256,
 st429,
 st430,
 st431,
@@ -20261,7 +21736,6 @@ st433,
 st434,
 st435,
 st436,
-st110,
 st437,
 st438,
 st439,
@@ -20269,9 +21743,9 @@ st440,
 st441,
 st442,
 st443,
+st114,
 st444,
 st445,
-st171,
 st446,
 st447,
 st448,
@@ -20279,8 +21753,8 @@ st449,
 st450,
 st451,
 st452,
+st175,
 st453,
-st87,
 st454,
 st455,
 st456,
@@ -20288,12 +21762,8 @@ st457,
 st458,
 st459,
 st460,
-st461,
 st87,
-st242,
-st254,
-st254,
-st380,
+st461,
 st462,
 st463,
 st464,
@@ -20301,6 +21771,11 @@ st465,
 st466,
 st467,
 st468,
+st87,
+st88,
+st256,
+st256,
+st373,
 st469,
 st470,
 st471,
 st492,
 st493,
 st494,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st495,
-st254,
-st254,
-st254,
-st254,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st496,
-st110,
-st110,
-st110,
-st87,
-st497,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st244,
-st254,
-st254,
-st254,
-st362,
-st110,
-st110,
-st110,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st498,
-st87,
-st499,
-st110,
-st500,
-st501,
-st502,
-st503,
-st504,
-st505,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st42,
-st506,
-st507,
-st508,
-st509,
-st510,
-st511,
-st512,
-st513,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st514,
-st515,
-st87,
-st516,
-st110,
-st87,
-st87,
-st87,
-st517,
-st518,
-st87,
-st87,
-st519,
-st520,
-st238,
-st110,
-st110,
-st107,
-st87,
-st521,
-st87,
-st522,
-st523,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st87,
-st87,
-st524,
-st525,
-st526,
-st527,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st532,
-st530,
-st528,
-st529,
-st530,
-st531,
-st530,
-st533,
-st110,
-st110,
-st110,
-st110,
-st110,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st534,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st535,
-st536,
-st537,
-st538,
-st539,
-st540,
-st541,
-st542,
-st543,
-st544,
-st545,
-st546,
-st547,
-st548,
-st549,
-st550,
-st551,
-st552,
-st553,
-st554,
-st555,
-st556,
-st557,
-st558,
-st559,
-st560,
-st561,
-st562,
-st563,
-st564,
-st565,
-st110,
-st110,
-st566,
-st567,
-st568,
-st569,
-st570,
-st571,
-st572,
-st573,
-st574,
-st575,
-st576,
-st577,
-st110,
-st578,
-st579,
-st580,
-st581,
-st582,
-st583,
-st584,
-st585,
-st586,
-st587,
-st588,
-st589,
-st590,
-st591,
-st592,
-st593,
-st594,
-st595,
-st596,
-st597,
-st598,
-st599,
-st600,
-st110,
-st601,
-st602,
-st603,
-st604,
-st605,
-st606,
-st607,
-st608,
-st110,
-st110,
-st609,
-st610,
-st611,
-st280,
-st612,
-st613,
-st614,
-st615,
-st616,
-st617,
-st618,
-st619,
-st620,
-st621,
-st622,
-st623,
-st624,
-st625,
-st626,
-st627,
-st628,
-st629,
-st630,
-st631,
-st632,
-st633,
-st634,
-st635,
-st636,
-st637,
-st638,
-st639,
-st640,
-st641,
-st87,
-st217,
-st642,
-st454,
-st454,
-st110,
-st110,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st88,
-st643,
-st373,
-st373,
-st644,
-st645,
-st645,
-st645,
-st646,
-st647,
-st437,
-st110,
-st110,
-st110,
-st254,
-st254,
-st648,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st87,
-st244,
-st87,
-st87,
-st87,
-st136,
-st110,
-st110,
-st87,
-st649,
-st650,
-st87,
-st651,
-st110,
-st110,
-st110,
-st87,
-st652,
-st87,
-st87,
-st653,
-st654,
-st110,
-st110,
-st655,
-st656,
-st657,
-st36,
-st36,
-st87,
-st87,
-st87,
-st87,
-st454,
-st238,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st658,
-st87,
-st87,
-st659,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st87,
-st660,
-st87,
-st661,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st662,
-st663,
-st87,
-st664,
-st665,
-st666,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st649,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st645,
-st645,
-st645,
-st645,
-st645,
-st645,
-st667,
-st668,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st669,
-st254,
-st254,
-st670,
-st254,
-st254,
-st671,
-st672,
-st673,
-st674,
-st254,
-st675,
-st676,
-st677,
-st378,
-st110,
-st110,
-st254,
-st254,
-st254,
-st254,
-st678,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st254,
-st254,
-st254,
-st254,
-st254,
-st362,
-st373,
-st679,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st680,
-st681,
-st682,
-st683,
-st684,
-st685,
-st686,
-st687,
-st688,
-st689,
-st690,
-st691,
-st692,
-st680,
-st681,
-st682,
-st693,
-st694,
-st695,
-st696,
-st697,
-st698,
-st699,
-st700,
-st701,
-st702,
-st680,
-st681,
-st682,
-st683,
-st684,
-st695,
-st686,
-st687,
-st688,
-st699,
-st700,
-st701,
-st702,
-st680,
-st681,
-st682,
-st703,
-st704,
-st705,
-st706,
-st707,
-st708,
-st709,
-st710,
-st711,
-st712,
-st713,
-st714,
-st715,
-st716,
-st717,
-st718,
-st719,
-st720,
-st721,
-st722,
-st723,
-st724,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st254,
-st254,
-st437,
-st254,
-st254,
-st254,
-st254,
-st254,
-st254,
-st380,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st171,
-st725,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
+st495,
+st496,
+st497,
+st498,
+st499,
+st500,
+st501,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st502,
+st256,
+st256,
+st256,
+st256,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st252,
+st114,
+st114,
+st114,
+st87,
+st503,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st246,
+st256,
+st256,
+st256,
+st374,
+st87,
+st87,
+st504,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st505,
+st87,
+st506,
+st114,
+st507,
+st508,
+st509,
+st510,
+st511,
+st512,
+st87,
+st87,
+st87,
+st87,
+st513,
+st514,
+st42,
+st515,
+st516,
+st517,
+st518,
+st519,
+st520,
+st521,
+st522,
+st523,
+st524,
+st114,
+st114,
+st114,
+st114,
+st525,
+st526,
+st87,
+st527,
+st528,
+st87,
+st87,
+st87,
+st529,
+st530,
+st87,
+st87,
+st531,
+st532,
+st239,
+st43,
+st533,
+st107,
+st87,
+st534,
+st87,
+st535,
+st536,
+st211,
+st537,
+st115,
+st87,
+st87,
+st538,
+st539,
+st540,
+st114,
+st114,
+st87,
+st87,
+st541,
+st542,
+st543,
+st544,
+st175,
+st545,
+st175,
+st175,
+st175,
+st546,
+st547,
+st548,
+st114,
+st114,
+st549,
+st550,
+st423,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st551,
+st239,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st556,
+st554,
+st552,
+st553,
+st554,
+st555,
+st554,
+st557,
+st212,
+st558,
+st214,
+st214,
+st559,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st560,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st561,
+st562,
+st563,
+st564,
+st565,
+st566,
+st567,
+st568,
+st569,
+st570,
+st571,
+st572,
+st573,
+st574,
+st575,
+st576,
+st577,
+st578,
+st579,
+st580,
+st581,
+st582,
+st583,
+st584,
+st585,
+st586,
+st587,
+st588,
+st589,
+st590,
+st591,
+st114,
+st114,
+st592,
+st593,
+st594,
+st595,
+st596,
+st597,
+st598,
+st599,
+st600,
+st601,
+st602,
+st603,
+st604,
+st605,
+st606,
+st607,
+st608,
+st609,
+st610,
+st611,
+st612,
+st613,
+st614,
+st615,
+st616,
+st617,
+st618,
+st619,
+st620,
+st621,
+st622,
+st623,
+st624,
+st625,
+st626,
+st627,
+st114,
+st628,
+st629,
+st630,
+st631,
+st632,
+st633,
+st634,
+st635,
+st114,
+st114,
+st636,
+st637,
+st638,
+st291,
+st639,
+st640,
+st641,
+st642,
+st643,
+st644,
+st645,
+st646,
+st647,
+st648,
+st649,
+st650,
+st651,
+st652,
+st653,
+st654,
+st655,
+st656,
+st657,
+st658,
+st659,
+st660,
+st661,
+st662,
+st663,
+st664,
+st665,
+st666,
+st667,
+st668,
+st87,
+st219,
+st669,
+st461,
+st461,
+st114,
+st114,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st88,
+st670,
+st385,
+st385,
+st671,
+st672,
+st672,
+st672,
+st673,
+st674,
+st444,
+st114,
+st114,
+st114,
+st256,
+st256,
+st675,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st246,
+st87,
+st87,
+st87,
+st140,
+st114,
+st114,
+st87,
+st676,
+st677,
+st87,
+st678,
+st114,
+st114,
+st114,
+st87,
+st679,
+st87,
+st87,
+st680,
+st681,
+st114,
+st114,
+st682,
+st683,
+st684,
+st36,
+st36,
+st87,
+st87,
+st87,
+st87,
+st461,
+st239,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st685,
+st87,
+st87,
+st686,
+st87,
+st687,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st688,
+st87,
+st689,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st690,
+st691,
+st87,
+st692,
+st693,
+st694,
+st87,
+st695,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st87,
+st696,
+st87,
+st697,
+st87,
+st698,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st87,
+st87,
+st699,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st385,
+st700,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st701,
+st87,
+st87,
+st702,
+st703,
+st704,
+st705,
+st114,
+st269,
+st706,
+st707,
+st708,
+st709,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st676,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st672,
+st672,
+st672,
+st672,
+st672,
+st672,
+st710,
+st711,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st676,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st699,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st712,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st713,
+st256,
+st256,
+st714,
+st256,
+st256,
+st715,
+st716,
+st717,
+st718,
+st256,
+st719,
+st720,
+st721,
+st722,
+st114,
+st114,
+st256,
+st256,
+st256,
+st256,
+st723,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st256,
+st256,
+st256,
+st256,
+st256,
+st374,
+st385,
+st724,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st725,
 st726,
 st727,
 st728,
@@ -31667,6 +28478,9 @@ st734,
 st735,
 st736,
 st737,
+st725,
+st726,
+st727,
 st738,
 st739,
 st740,
@@ -31677,6 +28491,22 @@ st744,
 st745,
 st746,
 st747,
+st725,
+st726,
+st727,
+st728,
+st729,
+st740,
+st731,
+st732,
+st733,
+st744,
+st745,
+st746,
+st747,
+st725,
+st726,
+st727,
 st748,
 st749,
 st750,
@@ -31689,132 +28519,4784 @@ st756,
 st757,
 st758,
 st759,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
 st760,
-st110,
-st761,
-st761,
 st761,
-st761,
-st761,
-st761,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st110,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st610,
-st110,
+st762,
+st763,
+st764,
+st765,
+st766,
+st767,
+st768,
+st769,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st256,
+st256,
+st444,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st373,
+st770,
+st771,
+st390,
+st390,
+st114,
+st114,
+st772,
+st773,
+st774,
+st775,
+st776,
+st256,
+st223,
+st256,
+st256,
+st777,
+st114,
+st114,
+st114,
+st114,
+st778,
+st256,
+st779,
+st780,
+st781,
+st782,
+st783,
+st784,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st256,
+st256,
+st785,
+st786,
+st256,
+st256,
+st256,
+st787,
+st256,
+st373,
+st256,
+st256,
+st788,
+st114,
+st256,
+st785,
+st256,
+st256,
+st256,
+st770,
+st789,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st790,
+st256,
+st256,
+st256,
+st722,
+st114,
+st256,
+st791,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st792,
+st390,
+st793,
+st794,
+st795,
+st796,
+st114,
+st114,
+st114,
+st256,
+st256,
+st256,
+st256,
+st713,
+st114,
+st114,
+st114,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st256,
+st373,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st797,
+st114,
+st114,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st251,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st175,
+st250,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st798,
+st799,
+st800,
+st801,
+st802,
+st803,
+st804,
+st805,
+st806,
+st807,
+st808,
+st809,
+st810,
+st811,
+st812,
+st813,
+st814,
+st815,
+st816,
+st817,
+st818,
+st819,
+st820,
+st821,
+st822,
+st823,
+st824,
+st825,
+st826,
+st827,
+st828,
+st829,
+st830,
+st831,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st832,
+st114,
+st833,
+st833,
+st833,
+st833,
+st833,
+st833,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st114,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st637,
+st114,
 };
 const struct unicode_utf8_row unicode_utf8_valid[] = {
  { 1, 0, 0 }, /* 0 */
index 100da166ab62c93ff1641623d19bb208ea6b782f..d6b47aaaea450e86433f98a0cc54414f7d283be2 100644 (file)
@@ -44,6 +44,9 @@ void become_mortal(void) {
     if(!(pw = getpwnam(config->user)))
       disorder_fatal(0, "cannot find user %s", config->user);
     if(pw->pw_uid != getuid()) {
+      disorder_info("becoming user %u group %u",
+                    (unsigned)pw->pw_uid,
+                    (unsigned)pw->pw_gid);
       if(initgroups(config->user, pw->pw_gid))
        disorder_fatal(errno, "error calling initgroups");
       if(setgid(pw->pw_gid) < 0)
index 8ce2505842f5dff6716cca1d7aef420293676399..6254708e14f328e17b64242c7e3b268bc7d0bbf4 100644 (file)
@@ -17,7 +17,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
-/** @file lib/validity.c
+/** @file lib/validity.h
  * @brief Various validity checks
  */
 #ifndef VALIDITY_H
index 4d798f1b31037554a22a466a1271e8cb1f1e8bba..fa8f9e388df6d0c90f157eacc94c7e14d6db4cd7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,6 +38,19 @@ void dynstr_append_bytes(struct dynstr *v, const char *ptr, size_t n) {
   }
 }
 
+/** @brief Free a string list */
+void free_strings(int nvec, char **vec) {
+  for(int n = 0; n < nvec; ++n)
+    xfree(vec[n]);
+  xfree(vec);
+}
+
+/** @brief Free and re-initialize a vector */
+void vector_clear(struct vector *v) {
+  free_strings(v->nvec, v->vec);
+  vector_init(v);
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index 31dfeda5e86ffee911719a8e901a1e927f781cdc..da84784e39ab0e45be79cff6b85a2a86b325cee1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -94,6 +94,9 @@ static inline void dynstr_append_string(struct dynstr *v, const char *ptr) {
   dynstr_append_bytes(v, ptr, strlen(ptr));
 }
 
+void free_strings(int nvec, char **vec);
+void vector_clear(struct vector *v);
+
 #endif /* VECTOR_H */
 
 /*
index 455bb729275ea66bcfae8efb4080aff735fc132d..fe7ffbbf0443289018bf2852dbc5c364f5f5e764 100644 (file)
--- a/lib/wav.c
+++ b/lib/wav.c
@@ -128,9 +128,8 @@ int wav_init(struct wavfile *f, const char *path) {
   off_t where;
   
   memset(f, 0, sizeof *f);
-  f->fd = -1;
   f->data = -1;
-  if((f->fd = open(path, O_RDONLY)) < 0) goto error_errno;
+  if(hreader_init(path, f->input)) goto error_errno;
   /* Read the file header
    *
    *  offset  size  meaning
@@ -138,7 +137,7 @@ int wav_init(struct wavfile *f, const char *path) {
    *  04      4     length of rest of file
    *  08      4     'WAVE'
    * */
-  if((n = pread(f->fd, header, 12, 0)) < 0) goto error_errno;
+  if((n = hreader_pread(f->input, header, 12, 0)) < 0) goto error_errno;
   else if(n < 12) goto einval;
   if(strncmp(header, "RIFF", 4) || strncmp(header + 8, "WAVE", 4))
     goto einval;
@@ -151,7 +150,7 @@ int wav_init(struct wavfile *f, const char *path) {
      *  00      4     chunk ID
      *  04      4     length of rest of chunk
      */
-    if((n = pread(f->fd, header, 8, where)) < 0) goto error_errno;
+    if((n = hreader_pread(f->input, header, 8, where)) < 0) goto error_errno;
     else if(n < 8) goto einval;
     if(!strncmp(header,"fmt ", 4)) {
       /* This is the format chunk
@@ -168,7 +167,8 @@ int wav_init(struct wavfile *f, const char *path) {
        *  18      ?     extra undocumented rubbish
        */
       if(get32(header + 4) < 16) goto einval;
-      if((n = pread(f->fd, header + 8, 16, where + 8)) < 0) goto error_errno;
+      if((n = hreader_pread(f->input, header + 8, 16, where + 8)) < 0)
+        goto error_errno;
       else if(n < 16) goto einval;
       f->channels = get16(header + 0x0A);
       f->rate = get32(header + 0x0C);
@@ -197,13 +197,7 @@ error:
 
 /** @brief Close a WAV file */
 void wav_destroy(struct wavfile *f) {
-  if(f) {
-    const int save_errno = errno;
-
-    if(f->fd >= 0)
-      close(f->fd);
-    errno = save_errno;
-  }
+  hreader_close(f->input);
 }
 
 /** @brief Visit all the data in a WAV file
@@ -227,7 +221,7 @@ int wav_data(struct wavfile *f,
     size_t want = (off_t)sizeof buffer > left ? (size_t)left : sizeof buffer;
 
     want -= want % bytes_per_frame;
-    if((n = pread(f->fd, buffer, want, where)) < 0) return errno;
+    if((n = hreader_pread(f->input, buffer, want, where)) < 0) return errno;
     if((size_t)n < want) return EINVAL;
     if((err = callback(f, buffer, n, u))) return err;
     where += n;
index d2de912b280ff9b16d8d4d9a96784bbe7ce25311..3c9c477bc5a2975559891126bd010cdb7a6b153c 100644 (file)
--- a/lib/wav.h
+++ b/lib/wav.h
 #ifndef WAV_H
 #define WAV_H
 
+#include "hreader.h"
+
 /** @brief WAV file access structure */
 struct wavfile {
-  /** @brief File descriptor onto file */
-  int fd;
+  /** @brief File read handle */
+  struct hreader input[1];
 
   /** @brief File length */
   off_t length;
index ae9e183ab448518a68887a67b1afc9c48cae9cfa..42e2d5cd43ce21514f394deb7411eb8b559fa76c 100644 (file)
@@ -119,14 +119,12 @@ xgetdate_r (const char *string, struct tm *tp,
            const char *const *template)
 {
   const char *line;
-  size_t len;
   char *result = NULL;
   time_t timer;
   struct tm tm;
   int mday_ok = 0;
 
   line = NULL;
-  len = 0;
   while((line = *template++))
     {
       /* Do the conversion.  */
index de3562b15506c47eaaaa89dea206597f289e29f2..e4a9eb0fb779d1c628df2aa7246e591ede7209fd 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2009 Richard Kettlewell
+# Copyright (C) 2008-2012 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@ TESTS=t-addr t-arcfour t-basen t-bits t-cache t-casefold t-charset    \
        t-kvp t-mime t-printf t-regsub t-selection t-signame t-sink     \
        t-split t-syscalls t-trackname t-unicode t-url t-utf8 t-vector  \
        t-words t-wstat t-macros t-cgi t-eventdist t-resample           \
-       t-configuration
+       t-configuration t-timeval
 
 noinst_PROGRAMS=$(TESTS)
 
@@ -63,9 +63,10 @@ t_words_SOURCES=t-words.c test.c test.h
 t_wstat_SOURCES=t-wstat.c test.c test.h
 t_eventdist_SOURCES=t-eventdist.c test.c test.h
 t_resample_SOURCES=t-resample.c test.c test.h
-t_resample_LDFLAGS=$(LIBSAMPLERATE)
+t_resample_LDADD=$(LDADD) $(LIBSAMPLERATE)
 t_configuration_SOURCES=t-configuration.c test.c test.h
-t_configuration_LDFLAGS=$(LIBGCRYPT)
+t_configuration_LDADD=$(LDADD) $(LIBGCRYPT)
+t_timeval_SOURCES=t-timeval.c test.c test.h
 
 check-report: before-check check make-coverage-reports
 before-check:
index e33a1d621a3a8ecdd2b5cb9d33f1054c4e4af666..6e438fc77303be29115b6c159bf63f5d3e0eaa81 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3cbc044a27ea7120f9d3f5edcc8f8a363729eb05..cdb4cc928906424e6a2ad433901127bc79076c04 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f6214953c3e7c6c0fbe9f38c4bb3ab5b967e2d5c..f94ebd91f0a4b628d3c5b0a03e55999d57df5c2a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7926e016c0aed17459924951757ec11da95a50f1..452b23dcde2f7e460badd0550ac44785f199ee59 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6aa72ef62714cc9e6f373c99ecb4937ff8eb52ce..25a99398bd1583516482d17dfc440598dbf51511 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -76,6 +76,9 @@ static void test_eventdist(void) {
   check_integer(wibbles, 2);
   check_integer(wobbles, 2);
   check_integer(wobble2s, 3);
+
+  event_cancel(wibble_handle);
+  event_cancel(wobble2_handle);
 }
 
 TEST(eventdist);
index 4d8b68aaa4afa348367aaef3f397e85bcef7d35d..759e5c93ffe934f1d890b1ffc6e499de7bb23233 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007, 2008, 2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,8 +50,10 @@ static void test_hash(void) {
   
   for(i = 0; i < 10000; ++i) {
     insist((ip = hash_find(h, do_printf("%d", i))) != 0);
-    check_integer(*ip, i);
-    insist(hash_add(h, do_printf("%d", i), &i, HASH_REPLACE) == 0);
+    if(ip) {
+      check_integer(*ip, i);
+      insist(hash_add(h, do_printf("%d", i), &i, HASH_REPLACE) == 0);
+    }
   }
   check_integer(hash_count(h), 10000);
   keys = hash_keys(h);
index a6f1b32c6f9a67518041d8871f63b01249075f22..d26c6152d636519a54d4b51da1f411e8c880e1bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007, 2008, 2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,12 +52,15 @@ static void test_hex(void) {
   check_string(hex(h, sizeof h), "00ff807f");
   check_string(hex(0, 0), "");
   u = unhex("00ff807f", &ul);
+  insist(u != 0);
   insist(ul == 4);
   insist(memcmp(u, h, 4) == 0);
   u = unhex("00FF807F", &ul);
+  insist(u != 0);
   insist(ul == 4);
   insist(memcmp(u, h, 4) == 0);
   u = unhex("", &ul);
+  insist(u != 0);
   insist(ul == 0);
   fprintf(stderr, "2 ERROR reports expected {\n");
   insist(unhex("F", 0) == 0);
diff --git a/libtests/t-timeval.c b/libtests/t-timeval.c
new file mode 100644 (file)
index 0000000..3f7beb6
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "test.h"
+#include "timeval.h"
+
+static struct timeval tv(time_t s, unsigned long us) {
+  struct timeval r;
+  r.tv_sec = s;
+  r.tv_usec = us;
+  return r;
+}
+
+static void test_timeval(void) {
+  check_integer(tvsub_us(tv(0, 0), 
+                         tv(0, 0)),
+                0);
+  check_integer(tvsub_us(tv(1, 0), 
+                         tv(0, 0)),
+                1000000);
+  check_integer(tvsub_us(tv(0, 0), 
+                         tv(1, 0)),
+                -1000000);
+  check_integer(tvsub_us(tv(1397621862, 1), 
+                         tv(1397621861, 2)),
+                999999);
+  check_integer(tvsub_us(tv(1397621861, 2), 
+                         tv(1397621862, 1)),
+                -999999);
+}
+
+TEST(timeval);
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 150584419961c80f4f8d190637d37d531857e404..2a199e35deaac777272194917290d40c63af2fec 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007-2009, 2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@ static FILE *open_unicode_test(const char *path) {
     base = path;
   if(!(fp = fopen(base, "r"))) {
     snprintf(buffer, sizeof buffer,
-             "wget http://www.unicode.org/Public/5.1.0/ucd/%s", path);
+             "wget http://www.unicode.org/Public/6.0.0/ucd/%s", path);
     if((w = system(buffer)))
       disorder_fatal(0, "%s: %s", buffer, wstat(w));
     if(chmod(base, 0444) < 0)
index 354106b2ffc4366b0bfd70882d456a3bd5b56039..3270d470ab47e9d0393bf0925140136e5ff5bc7f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index cada395ad03dcf55c8f0fcbc73d4775d928d7d7b..983633be3c60681e8072f4f7ee732711cdf14c14 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007, 2008, 2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -95,7 +95,7 @@ extern int skipped;
   const char *got = GOT;                                                \
   const char *want = WANT;                                              \
                                                                         \
-  if(want == 0) {                                                       \
+  if(got == 0) {                                                       \
     fprintf(stderr, "%s:%d: %s returned 0\n",                           \
             __FILE__, __LINE__, #GOT);                                  \
     count_error();                                                      \
index 7852152a2a81f30d09fafac385ea89dcda784828..16e06c63f5efc6da65d4fc62ad89ccc9df7aa384 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2008, 2010 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,7 +23,10 @@ AM_CPPFLAGS=-I${top_srcdir}/lib
 notify_la_SOURCES=notify.c
 notify_la_LDFLAGS=-module
 
-disorder_tracklength_la_SOURCES=tracklength.c mad.c madshim.h ../lib/wav.h ../lib/wav.c
+disorder_tracklength_la_SOURCES=tracklength.c tracklength.h    \
+tracklength-mp3.c tracklength-ogg.c tracklength-wav.c          \
+tracklength-flac.c mad.c madshim.h ../lib/wav.h ../lib/wav.c   \
+../lib/hreader.h ../lib/hreader.c
 disorder_tracklength_la_LDFLAGS=-module
 disorder_tracklength_la_LIBADD=$(LIBVORBISFILE) $(LIBMAD) $(LIBFLAC) -lm
 
index f6ed8b37d4c8b1eeb6e75658a74b19bc67121826..1cf638fb2942dffda7955ea4443578421b95ac15 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007, 2008, 2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,7 +39,6 @@ void disorder_play_track(const char *const *parameters,
   const char **vec;
 
   vec = disorder_malloc((nparameters + 2) * sizeof (char *));
-  i = 0;
   j = 0;
   for(i = 0; i < nparameters; ++i)
     vec[j++] = parameters[i];
index 8af8c61c1288c132e49c7163022c523c24b051ba..00108ad19524c16e67a95055967a9c91d122128b 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004-2008 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 /** @file plugins/execraw.c
  * @brief Plugin to play a track by executing a command (raw mode)
  *
diff --git a/plugins/tracklength-flac.c b/plugins/tracklength-flac.c
new file mode 100644 (file)
index 0000000..684221d
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007, 2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file plugins/tracklength-flac.c
+ * @brief Compute track lengths for FLAC files
+ */
+#include "tracklength.h"
+#include <FLAC/stream_decoder.h>
+
+/* libFLAC's "simplified" interface is rather heavyweight... */
+
+/** @brief State used when computing FLAC file length */
+struct flac_state {
+  /** @brief Duration or -1 */
+  long duration;
+
+  /** @brief File being analyzed */
+  const char *path;
+};
+
+static void flac_metadata(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                         const FLAC__StreamMetadata *metadata,
+                         void *client_data) {
+  struct flac_state *const state = client_data;
+  const FLAC__StreamMetadata_StreamInfo *const stream_info
+    = &metadata->data.stream_info;
+
+  if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO)
+    /* FLAC uses 0 to mean unknown and conveniently so do we */
+    state->duration = (stream_info->total_samples
+                      + stream_info->sample_rate - 1)
+           / stream_info->sample_rate;
+}
+
+static void flac_error(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                      FLAC__StreamDecoderErrorStatus status,
+                      void *client_data) {
+  const struct flac_state *const state = client_data;
+
+  disorder_error(0, "error decoding %s: %s", state->path,
+                FLAC__StreamDecoderErrorStatusString[status]);
+}
+
+static FLAC__StreamDecoderWriteStatus flac_write
+    (const FLAC__StreamDecoder attribute((unused)) *decoder,
+     const FLAC__Frame attribute((unused)) *frame,
+     const FLAC__int32 attribute((unused)) *const buffer_[],
+     void attribute((unused)) *client_data) {
+  const struct flac_state *const state = client_data;
+
+  if(state->duration >= 0)
+    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
+  else
+    return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
+}
+
+long tl_flac(const char *path) {
+  FLAC__StreamDecoder *sd = 0;
+  FLAC__StreamDecoderInitStatus is;
+  struct flac_state state[1];
+
+  state->duration = -1;                        /* error */
+  state->path = path;
+  if(!(sd = FLAC__stream_decoder_new())) {
+    disorder_error(0, "FLAC__stream_decoder_new failed");
+    goto fail;
+  }
+  if((is = FLAC__stream_decoder_init_file(sd, path, flac_write, flac_metadata,
+                                         flac_error, state))) {
+    disorder_error(0, "FLAC__stream_decoder_init_file %s: %s",
+                  path, FLAC__StreamDecoderInitStatusString[is]);
+    goto fail;
+  }
+  FLAC__stream_decoder_process_until_end_of_metadata(sd);
+fail:
+  if(sd)
+    FLAC__stream_decoder_delete(sd);
+  return state->duration;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+End:
+*/
diff --git a/plugins/tracklength-mp3.c b/plugins/tracklength-mp3.c
new file mode 100644 (file)
index 0000000..ecd1c1e
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file plugins/tracklength-mp3.c
+ * @brief Compute track lengths for MP3 files
+ */
+#include "tracklength.h"
+#include <mad.h>
+#include "madshim.h"
+
+static void *mmap_file(const char *path, size_t *lengthp) {
+  int fd;
+  void *base;
+  struct stat sb;
+  
+  if((fd = open(path, O_RDONLY)) < 0) {
+    disorder_error(errno, "error opening %s", path);
+    return 0;
+  }
+  if(fstat(fd, &sb) < 0) {
+    disorder_error(errno, "error calling stat on %s", path);
+    goto error;
+  }
+  if(sb.st_size == 0)                  /* can't map 0-length files */
+    goto error;
+  if((base = mmap(0, sb.st_size, PROT_READ,
+                 MAP_SHARED, fd, 0)) == (void *)-1) {
+    disorder_error(errno, "error calling mmap on %s", path);
+    goto error;
+  }
+  *lengthp = sb.st_size;
+  close(fd);
+  return base;
+error:
+  close(fd);
+  return 0;
+}
+
+long tl_mp3(const char *path) {
+  size_t length;
+  void *base;
+  buffer b;
+
+  if(!(base = mmap_file(path, &length))) return -1;
+  b.duration = mad_timer_zero;
+  scan_mp3(base, length, &b);
+  munmap(base, length);
+  return b.duration.seconds + !!b.duration.fraction;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+End:
+*/
diff --git a/plugins/tracklength-ogg.c b/plugins/tracklength-ogg.c
new file mode 100644 (file)
index 0000000..c5c90c6
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file plugins/tracklength-ogg.c
+ * @brief Compute track lengths for OGG files
+ */
+#include "tracklength.h"
+#include <vorbis/vorbisfile.h>
+
+long tl_ogg(const char *path) {
+  OggVorbis_File vf;
+  FILE *fp = 0;
+  double length;
+
+  if(!path) goto error;
+  if(!(fp = fopen(path, "rb"))) goto error;
+  if(ov_open(fp, &vf, 0, 0)) goto error;
+  fp = 0;
+  length = ov_time_total(&vf, -1);
+  ov_clear(&vf);
+  return ceil(length);
+error:
+  if(fp) fclose(fp);
+  return -1;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+End:
+*/
diff --git a/plugins/tracklength-wav.c b/plugins/tracklength-wav.c
new file mode 100644 (file)
index 0000000..bf501c5
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file plugins/tracklength-wav.c
+ * @brief Compute track lengths for WAV files
+ */
+#include "tracklength.h"
+#include "wav.h"
+
+long tl_wav(const char *path) {
+  struct wavfile f[1];
+  int err, sample_frame_size;
+  long duration;
+
+  if((err = wav_init(f, path))) {
+    disorder_error(err, "error opening %s", path); 
+    return -1;
+  }
+  sample_frame_size = (f->bits + 7) / 8 * f->channels;
+  if(sample_frame_size) {
+    const long long n_samples = f->datasize / sample_frame_size;
+    duration = (n_samples + f->rate - 1) / f->rate;
+  } else
+    duration = -1;
+  wav_destroy(f);
+  return duration;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+End:
+*/
index 86a1fc8a26667b94ef5393be51536c37342557d9..7f0866ed8aa1e9d7c714c982d3714cda73335b47 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007, 2008, 2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * Currently implements MP3, OGG, FLAC and WAV.
  */
-
-#include <config.h>
-
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <errno.h>
-
-#include <vorbis/vorbisfile.h>
-#include <mad.h>
-/* libFLAC has had an API change and stupidly taken away the old API */
-#if HAVE_FLAC_FILE_DECODER_H
-# include <FLAC/file_decoder.h>
-#else
-# include <FLAC/stream_decoder.h>
-#define FLAC__FileDecoder FLAC__StreamDecoder
-#define FLAC__FileDecoderState FLAC__StreamDecoderState
-#endif
-
-
-#include <disorder.h>
-
-#include "madshim.h"
-#include "wav.h"
-
-static void *mmap_file(const char *path, size_t *lengthp) {
-  int fd;
-  void *base;
-  struct stat sb;
-  
-  if((fd = open(path, O_RDONLY)) < 0) {
-    disorder_error(errno, "error opening %s", path);
-    return 0;
-  }
-  if(fstat(fd, &sb) < 0) {
-    disorder_error(errno, "error calling stat on %s", path);
-    goto error;
-  }
-  if(sb.st_size == 0)                  /* can't map 0-length files */
-    goto error;
-  if((base = mmap(0, sb.st_size, PROT_READ,
-                 MAP_SHARED, fd, 0)) == (void *)-1) {
-    disorder_error(errno, "error calling mmap on %s", path);
-    goto error;
-  }
-  *lengthp = sb.st_size;
-  close(fd);
-  return base;
-error:
-  close(fd);
-  return 0;
-}
-
-static long tl_mp3(const char *path) {
-  size_t length;
-  void *base;
-  buffer b;
-
-  if(!(base = mmap_file(path, &length))) return -1;
-  b.duration = mad_timer_zero;
-  scan_mp3(base, length, &b);
-  munmap(base, length);
-  return b.duration.seconds + !!b.duration.fraction;
-}
-
-static long tl_ogg(const char *path) {
-  OggVorbis_File vf;
-  FILE *fp = 0;
-  double length;
-
-  if(!path) goto error;
-  if(!(fp = fopen(path, "rb"))) goto error;
-  if(ov_open(fp, &vf, 0, 0)) goto error;
-  fp = 0;
-  length = ov_time_total(&vf, -1);
-  ov_clear(&vf);
-  return ceil(length);
-error:
-  if(fp) fclose(fp);
-  return -1;
-}
-
-static long tl_wav(const char *path) {
-  struct wavfile f[1];
-  int err, sample_frame_size;
-  long duration;
-
-  if((err = wav_init(f, path))) {
-    disorder_error(err, "error opening %s", path); 
-    return -1;
-  }
-  sample_frame_size = (f->bits + 7) / 8 * f->channels;
-  if(sample_frame_size) {
-    const long long n_samples = f->datasize / sample_frame_size;
-    duration = (n_samples + f->rate - 1) / f->rate;
-  } else
-    duration = -1;
-  wav_destroy(f);
-  return duration;
-}
-
-/* libFLAC's "simplified" interface is rather heavyweight... */
-
-struct flac_state {
-  long duration;
-  const char *path;
-};
-
-static void flac_metadata(const FLAC__FileDecoder attribute((unused)) *decoder,
-                         const FLAC__StreamMetadata *metadata,
-                         void *client_data) {
-  struct flac_state *const state = client_data;
-  const FLAC__StreamMetadata_StreamInfo *const stream_info
-    = &metadata->data.stream_info;
-
-  if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO)
-    /* FLAC uses 0 to mean unknown and conveniently so do we */
-    state->duration = (stream_info->total_samples
-                      + stream_info->sample_rate - 1)
-           / stream_info->sample_rate;
-}
-
-static void flac_error(const FLAC__FileDecoder attribute((unused)) *decoder,
-                      FLAC__StreamDecoderErrorStatus status,
-                      void *client_data) {
-  const struct flac_state *const state = client_data;
-
-  disorder_error(0, "error decoding %s: %s", state->path,
-                FLAC__StreamDecoderErrorStatusString[status]);
-}
-
-static FLAC__StreamDecoderWriteStatus flac_write
-    (const FLAC__FileDecoder attribute((unused)) *decoder,
-     const FLAC__Frame attribute((unused)) *frame,
-     const FLAC__int32 attribute((unused)) *const buffer_[],
-     void attribute((unused)) *client_data) {
-  const struct flac_state *const state = client_data;
-
-  if(state->duration >= 0)
-    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
-  else
-    return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
-}
-
-static long tl_flac(const char *path) {
-  struct flac_state state[1];
-
-  state->duration = -1;                        /* error */
-  state->path = path;
-#if HAVE_FLAC_FILE_DECODER_H 
-  {
-    FLAC__FileDecoder *fd = 0;
-    FLAC__FileDecoderState fs;
-    
-    if(!(fd = FLAC__file_decoder_new())) {
-      disorder_error(0, "FLAC__file_decoder_new failed");
-      goto fail;
-    }
-    if(!(FLAC__file_decoder_set_filename(fd, path))) {
-      disorder_error(0, "FLAC__file_set_filename failed");
-      goto fail;
-    }
-    FLAC__file_decoder_set_metadata_callback(fd, flac_metadata);
-    FLAC__file_decoder_set_error_callback(fd, flac_error);
-    FLAC__file_decoder_set_write_callback(fd, flac_write);
-    FLAC__file_decoder_set_client_data(fd, state);
-    if((fs = FLAC__file_decoder_init(fd))) {
-      disorder_error(0, "FLAC__file_decoder_init: %s",
-                    FLAC__FileDecoderStateString[fs]);
-      goto fail;
-    }
-    FLAC__file_decoder_process_until_end_of_metadata(fd);
-fail:
-    if(fd)
-      FLAC__file_decoder_delete(fd);
-  }
-#else
-  {
-    FLAC__StreamDecoder *sd = 0;
-    FLAC__StreamDecoderInitStatus is;
-    
-    if(!(sd = FLAC__stream_decoder_new())) {
-      disorder_error(0, "FLAC__stream_decoder_new failed");
-      goto fail;
-    }
-    if((is = FLAC__stream_decoder_init_file(sd, path, flac_write, flac_metadata,
-                                           flac_error, state))) {
-      disorder_error(0, "FLAC__stream_decoder_init_file %s: %s",
-                    path, FLAC__StreamDecoderInitStatusString[is]);
-      goto fail;
-    }
-    FLAC__stream_decoder_process_until_end_of_metadata(sd);
-fail:
-    if(sd)
-      FLAC__stream_decoder_delete(sd);
-  }
-#endif
-  return state->duration;
-}
+#include "tracklength.h"
 
 static const struct {
   const char *ext;
diff --git a/plugins/tracklength.h b/plugins/tracklength.h
new file mode 100644 (file)
index 0000000..b62bbb6
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2007, 2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file plugins/tracklength.h
+ * @brief Plugin to compute track lengths
+ */
+
+#ifndef TRACKLENGTH_H
+#define TRACKLENGTH_H
+
+#include <config.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+#include <disorder.h>
+
+long tl_ogg(const char *path);
+long tl_wav(const char *path);
+long tl_mp3(const char *path);
+long tl_flac(const char *path);
+
+#endif /* TRACKLENGTH_H */
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index fe054a9474aec4ef684cfec3e8efff3b30835a45..8a758c9bc11a586a631d6dc5f96722ba368cee51 100644 (file)
@@ -87,6 +87,7 @@ class Error(Exception):
   """Base class for DisOrder exceptions."""
 
 class _splitError(Error):
+  """Error parsing a quoted string list"""
   # _split failed
   def __init__(self, value):
     self.value = value
@@ -623,7 +624,7 @@ class client:
     track -- the track to modify
     key -- the preference to remove
     """
-    self._simple("set", track, key, value)
+    self._simple("set", track, key)
 
   def get(self, track, key):
     """Get a preference value.
@@ -843,7 +844,7 @@ class client:
     Arguments:
     key -- the preference to remove
     """
-    self._simple("set-global", key, value)
+    self._simple("set-global", key)
 
   def getglobal(self, key):
     """Get a global preference value.
index 3d9e6331b53194ab64f3f1d3693fd4f23ef17a17..d5d8c42325c14c09db31e9f1e332fb8c318772cb 100644 (file)
@@ -25,6 +25,6 @@ include ${top_srcdir}/scripts/sedfiles.make
 
 EXTRA_DIST=htmlman sedfiles.make text2c oggrename make-unidata fix-names \
        format-gcov-report make-version-string setup.in teardown.in macro-docs \
-       setversion
+       setversion protocol
 
 CLEANFILES=$(SEDFILES)
index f428eef1977f7851aea03e81c97baf8a0dac0b1d..c77f33ebbf18974ecbbe65c61a8e3eab4d825a38 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/bash
 #
 # This file is part of DisOrder
-# Copyright (C) 2005-2009 Richard Kettlewell
+# Copyright (C) 2005-2009, 2011 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 
 set -e
 web=$HOME/public_html/web/disorder
+chroots=/srv/chroot
 
 make
-make distcheck
+#make distcheck
 make dist-bzip2
 v=$(make echo-version)
 d=$(make echo-distdir)
 src=$d.tar.bz2
 
-# Report and execute a command remotely
+v() {
+  echo ">" "$@"
+  "$@"
+}
+
+# Execute a command in the build environment
 remote() {
   local h=$1
-  shift
-  echo "$h:" "$@"
-  ssh $h "$@"
+  local cmd="$2"
+  target=${h#*:}
+  case $h in
+  ssh:* )
+    v ssh ${target} "$cmd"
+    ;;
+  chroot:* )
+    v schroot -c${target} -- bash -c "cd && $cmd"
+    ;;
+  local:* )
+    cd
+    v "$cmd"
+    cd -
+    ;;
+  esac
 }
 
-# Build .debs and copy to the right place
+# Put files into the build environment
+put() {
+  local src="$1"
+  local h=$2
+  local dst="$3"
+  target=${h#*:}
+  case $h in
+  ssh:* )
+    v scp $src ${target}:$dst
+    ;;
+  chroot:* )
+    v cp $src ${chroots}/${target}/home/${LOGNAME}/$dst
+    ;;
+  local:* )
+    v cp $src $dst
+    ;;
+  esac
+}
+
+# Retrieve files form the build environment
+get() {
+  local h=$1
+  local src="$2"
+  local dst="$3"
+  target=${h#*:}
+  case $h in
+  ssh:* )
+    v scp ${target}:$src $dst
+    ;;
+  chroot:* )
+    v cp ${chroots}/${target}/home/${LOGNAME}/$src $dst
+    ;;
+  local:* )
+    v cp $src $dst
+    ;;
+  esac
+}
+
+# Build a .deb in some build environment, and copy it to the distribution
+# location
 build() {
   local h=$1                   # build host
-  local f=$2
-  local vs=$3
-  local dist=$4
+  local f=$2                    # distribution directory ("for")
+  local vs=$3                   # version suffix
+  local dist=$4                 # distribution (stable/oldstable)
 
   remote $h "mkdir -p _builds"
   remote $h "rm -rf _builds/*.deb _builds/$d"
-  scp $src $h:_builds
+  put $src $h _builds/$src
   remote $h "cd _builds && tar xfj $src"
   if [ "$vs" != "" ]; then
     remote $h "cd _builds/$d && scripts/setversion $v~$vs 'Backport to $vs' $dist"
   fi
   remote $h "cd _builds/$d && fakeroot debian/rules binary"
   mkdir -p $web/$f
-  scp $h:_builds/*.deb $web/$f/.
+  get $h _builds/\*.deb $web/$f/.
 }
 
 # Build various debs
-
-# Debian lenny (32-bit)
-build leucomorph lenny "" stable
-
-# Debian lenny (64-bit)
-build araminta lenny "" stable
+#build chroot:lenny64 lenny lenny oldstable
+#build ssh:leucomorph lenny lenny oldstable
+build ssh:araminta squeeze "" stable
+build ssh:sandestin squeeze "" stable
 
 # Update the web
-cp $src $web
+cp $src README README.developers CHANGES.html $web
 cd doc
 for f in *.[1-9].html; do
   echo $f
index d43533e3cb3f49e1561131621738b871cbf1f344..28532a94d8977cfb6b765a19e6b3cbc656fd33cb 100755 (executable)
@@ -92,7 +92,7 @@ sub input {
     my $path = shift;
     my $lpath = basename($path);
     if(!-e $lpath) {
-       system("wget http://www.unicode.org/Public/5.1.0/ucd/$path");
+       system("wget http://www.unicode.org/Public/6.0.0/ucd/$path");
        chmod(0444, $lpath) or die "$lpath: $!\n";
     }
     open(STDIN, "<$lpath") or die "$lpath: $!\n";
@@ -562,9 +562,11 @@ for(my $base = 0; $base <= $max; $base += $modulus) {
     my @t;
     for(my $c = $base; $c < $base + $modulus; ++$c) {
        my $d = $data{$c};
-       my $decompsym = ($data{$c}->{decompsym} or "0");
-       my $cfsym = ($data{$c}->{cfsym} or "0");
-       my $compsym = ($data{$c}->{compsym} or "0");
+       my $decompsym = ($d->{decompsym} or "0");
+       my $cfsym = ($d->{cfsym} or "0");
+       my $compsym = ($d->{compsym} or "0");
+        my $ccc = ($d->{ccc} or "0");
+        my $gc = ($d->{gc} or "Cn");
        my @flags = ();
        if($data{$c}->{ypogegrammeni}) {
            push(@flags, "NBC");
@@ -573,15 +575,15 @@ for(my $base = 0; $base <= $max; $base += $modulus) {
            push(@flags, "CD");
        }
        my $flags = @flags ? join("|", @flags) : 0;
-       push(@t, "{".
+       push(@t, "{".
             join(",",
                  $decompsym,
                  $cfsym,
                  $compsym,
 #                $d->{ud},
 #                $d->{ld},
-                 $d->{ccc},
-                 $d->{gc},
+                 $ccc,
+                 $gc,
                  $flags,
                  "GB$d->{gbreak}",
                  "WB$d->{wbreak}",
index 41a7115c1882462515ed7ab4203d3e4a7f799590..f7109c738982baa8e20b08d43e887967f23e7707 100755 (executable)
@@ -25,7 +25,7 @@ if(exists $ENV{CC}) {
 }
 die "no version found\n" unless defined $version;
 output("%s (DisOrder) $version\n");
-output("Copyright (C) 2003-2008 Richard Kettlewell et al\n");
+output("Copyright (C) 2003-2011 Richard Kettlewell et al\n");
 output("License GPLv3+: GNU GPL version 3 or later:\n");
 output("        http://www.gnu.org/licenses/gpl-3.0.html\n");
 output("This is free software: you are free to change and redistribute it.\n");
diff --git a/scripts/protocol b/scripts/protocol
new file mode 100755 (executable)
index 0000000..dec33e2
--- /dev/null
@@ -0,0 +1,949 @@
+#! /usr/bin/perl -w
+#
+# This file is part of DisOrder.
+# Copyright (C) 2010-11 Richard Kettlewell
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+use strict;
+
+# This file contains the definition of the disorder protocol, plus
+# code to generates stubs for it in the various supported languages.
+#
+# At the time of writing it is a work in progress!
+
+#
+# Types:
+#
+#    string         A (Unicode) string.
+#    string-raw     A string that is not subject to de-quoting (return only)
+#    integer        An integer.  Decimal on the wire.
+#    time           A timestamp.  Decimal on the wire.
+#    boolean        True or false.  "yes" or "no" on the wire.
+#    list           In commands: a list of strings in the command.
+#                   In returns: a list of lines in the response.
+#    pair-list      In returns: a list of key-value pairs in a response body.
+#    body           In commands: a list of strings as a command body.
+#                   In returns: a list of strings as a response body.
+#    queue          In returns: a list of queue entries in a response body.
+#    queue-one      In returns: a queue entry in the response.
+#    literal        Constant string sent in sequence
+#
+
+# Variables and utilities -----------------------------------------------------
+
+our @h = ();
+our @c = ();
+our @ah = ();
+our @ac = ();
+our @missing = ();
+
+# Mapping of return type sequences to eclient callbacks
+our @eclient_return = (
+    ["no_response" => []],
+    ["string_response" => ["string"]],
+    ["string_response" => ["string-raw"]],
+    ["integer_response" => ["integer"]],
+    ["integer_response" => ["boolean"]],
+    ["time_response" => ["time"]],
+    ["pair_integer_response" => ["integer", "integer"]],
+    ["queue_response" => ["queue"]],
+    ["playing_response" => ["queue-one"]],
+    ["list_response" => ["body"]],
+    );
+
+# eclient_response_matces(RETURNS, VARIANT)
+#
+# Return true if VARIANT matches RETURNS
+sub eclient_response_matches {
+    my $returns = shift;
+    my $variant = shift;
+    my $types = $variant->[1];
+    if(scalar @$returns != scalar @$types) { return 0; }
+    for my $n (0 .. $#$returns) {
+       my $return = $returns->[$n];
+       my $type = $return->[0];
+       if($type ne $types->[$n]) { return 0; }
+    }
+    return 1;
+}
+
+# find_eclient_type(RETURNS)
+#
+# Find the result type for an eclient call
+sub find_eclient_response {
+    my $returns = shift;
+    if(!defined $returns) {
+       $returns = [];
+    }
+    for my $variant (@eclient_return) {
+       if(eclient_response_matches($returns, $variant)) {
+           return $variant->[0];
+       }
+    }
+    return undef;
+}
+
+# Write(PATH, LINES)
+#
+# Write array ref LINES to file PATH.
+sub Write {
+    my $path = shift;
+    my $lines = shift;
+
+    (open(F, ">$path")
+     and print F @$lines
+     and close F)
+        or die "$0: $path: $!\n";
+}
+
+# Command classes -------------------------------------------------------------
+
+# c_in_decl([TYPE, NAME])
+#
+# Return the C declaration for an input parameter of type TYPE with
+# name NAME.
+sub c_in_decl {
+    my $arg = shift;
+
+    my $type = $arg->[0];
+    my $name = $arg->[1];
+    if($type eq 'string') {
+       return "const char *$name";
+    } elsif($type eq 'integer') {
+       return "long $name";
+    } elsif($type eq 'time') {
+       return "time_t $name";
+    } elsif($type eq 'list' or $type eq 'body') {
+       return ("char **$name",
+               "int n$name");
+    } elsif($type eq 'literal') {
+        return ();
+    } else {
+       die "$0: c_in_decl: unknown type '$type'\n";
+    }
+}
+
+# c_out_decl([TYPE, NAME])
+#
+# Return the C declaration for an output (reference) parameter of type
+# TYPE with name NAME.
+sub c_out_decl {
+    my $arg = shift;
+
+    return () unless defined $arg;
+    my $type = $arg->[0];
+    my $name = $arg->[1];
+    if($type eq 'string' or $type eq 'string-raw') {
+       return ("char **${name}p");
+    } elsif($type eq 'integer') {
+       return ("long *${name}p");
+    } elsif($type eq 'time') {
+       return ("time_t *${name}p");
+    } elsif($type eq 'boolean') {
+       return ("int *${name}p");
+    } elsif($type eq 'list' or $type eq 'body') {
+       return ("char ***${name}p",
+               "int *n${name}p");
+    } elsif($type eq 'pair-list') {
+       return ("struct kvp **${name}p");
+    } elsif($type eq 'queue' or $type eq 'queue-one') {
+       return ("struct queue_entry **${name}p");
+    } elsif($type eq 'user') {
+       return ();
+    } else {
+       die "$0: c_out_decl: unknown type '$type'\n";
+    }
+}
+
+# c_param_docs([TYPE, NAME})
+#
+# Return the doc string for a C input parameter.
+sub c_param_docs {
+    my $args = shift;
+    my @d = ();
+    for my $arg (@$args) {
+        my $type = $arg->[0];
+        my $name = $arg->[1];
+        my $description = $arg->[2];
+       if($type eq 'body' or $type eq 'list') {
+           push(@d,
+                " * \@param $name $description\n",
+                " * \@param n$name Length of $name\n");
+       } elsif($type ne 'literal') {
+           push(@d, " * \@param $name $description\n");
+       }
+    }
+    return @d;
+}
+
+# c_param_docs([TYPE, NAME})
+#
+# Return the doc string for a C output parameter.
+sub c_return_docs {
+    my $returns = shift;
+    return () unless defined $returns;
+    my @docs = ();
+    for my $return (@$returns) {
+        my $type = $return->[0];
+        my $name = $return->[1];
+        my $descr = $return->[2];
+        if($type eq 'string'
+           or $type eq 'string-raw'
+           or $type eq 'integer'
+           or $type eq 'time'
+           or $type eq 'boolean') {
+            push(@docs,
+                " * \@param ${name}p $descr\n");
+        } elsif($type eq 'list' or $type eq 'body') {
+            push(@docs,
+                " * \@param ${name}p $descr\n",
+                " * \@param n${name}p Number of elements in ${name}p\n");
+        } elsif($type eq 'pair-list') {
+            push(@docs,
+                " * \@param ${name}p $descr\n");
+        } elsif($type eq 'queue' or $type eq 'queue-one') {
+            push(@docs,
+                " * \@param ${name}p $descr\n");
+        } elsif($type eq 'user') {
+           # nothing
+        } else {
+            die "$0: c_return_docs: unknown type '$type'\n";
+        }
+    }
+    return @docs;
+}
+
+# simple(CMD, SUMMARY, DETAIL,
+#        [[TYPE,NAME,DESCR], [TYPE,NAME,DESCR], ...],
+#        [[RETURN-TYPE, RETURN-NAME, RETURN_DESCR]])
+#
+# CMD is normally just the name of the command, but can
+# be [COMMAND,FUNCTION] if the function name should differ
+# from the protocol command.
+sub simple {
+    my $cmd = shift;
+    my $summary = shift;
+    my $detail = shift;
+    my $args = shift;
+    my $returns = shift;
+
+    my $cmdc;
+    if(ref $cmd eq 'ARRAY') {
+        $cmdc = $$cmd[1];
+        $cmd = $$cmd[0];
+    } else {
+        $cmdc = $cmd;
+        $cmdc =~ s/-/_/g;
+    }
+    print STDERR "Processing $cmd... ";
+    # C argument types
+    my @cargs = ();
+    for my $arg (@$args) {
+        if($arg->[0] eq 'body' or $arg->[0] eq 'list') {
+            push(@cargs, "disorder__$arg->[0]", $arg->[1], "n$arg->[1]");
+        } elsif($arg->[0] eq 'string') {
+            push(@cargs, $arg->[1]);
+        } elsif($arg->[0] eq 'integer'
+               or $arg->[0] eq 'time') {
+            push(@cargs, "disorder__$arg->[0]", "$arg->[1]");
+        } elsif($arg->[0] eq 'literal') {
+            push(@cargs, "\"$arg->[1]\"");
+        } else {
+            die "$0: unsupported arg type '$arg->[0]' for '$cmd'\n";
+        }
+    }
+    # Synchronous C API
+    print STDERR "H ";
+    push(@h, "/** \@brief $summary\n",
+         " *\n",
+         " * $detail\n",
+         " *\n",
+        " * \@param c Client\n",
+         c_param_docs($args),
+        c_return_docs($returns),
+         " * \@return 0 on success, non-0 on error\n",
+         " */\n",
+         "int disorder_$cmdc(",
+        join(", ", "disorder_client *c",
+                   map(c_in_decl($_), @$args),
+                   map(c_out_decl($_), @$returns)),
+         ");\n\n");
+    print STDERR "C ";
+    push(@c, "int disorder_$cmdc(",
+        join(", ", "disorder_client *c",
+                   map(c_in_decl($_), @$args),
+                    map(c_out_decl($_), @$returns)),
+        ") {\n");
+    if(!defined $returns or scalar @$returns == 0) {
+        # Simple case
+       push(@c, "  return disorder_simple(",
+            join(", ", "c", "NULL", "\"$cmd\"", @cargs, "(char *)NULL"),
+            ");\n");
+    } elsif(scalar @$returns == 1
+            and $returns->[0]->[0] eq 'queue-one') {
+        # Special case
+        my $return = $$returns[0];
+       push(@c, "  return onequeue(c, \"$cmd\", $return->[1]p);\n");
+    } elsif(scalar @$returns == 1
+            and $returns->[0]->[0] eq 'string-raw') {
+        # Special case
+        my $return = $$returns[0];
+       push(@c, "  return disorder_simple(",
+            join(", ", "c", "$return->[1]p", "\"$cmd\"", @cargs, "(char *)NULL"),
+            ");\n");
+    } elsif(scalar @$returns == 1
+            and $returns->[0]->[0] eq 'pair-list') {
+        # Special case
+        my $return = $$returns[0];
+       push(@c, "  return pairlist(",
+             join(", ", "c", "$return->[1]p", "\"$cmd\"",
+                  @cargs,
+                  "(char *)NULL"),
+             ");\n");
+    } else {
+        my $expected = 0;
+        for(my $n = 0; $n < scalar @$returns; ++$n) {
+            my $return = $returns->[$n];
+            my $type = $return->[0];
+            my $name = $return->[1];
+            if($type eq 'string'
+               or $type eq 'boolean'
+               or $type eq 'integer'
+               or $type eq 'time'
+               or $type eq 'user') {
+               ++$expected;
+            }
+        }
+        if($expected) {
+            push(@c, "  char **v;\n",
+                "  int nv, rc = disorder_simple_split(",
+                join(", ",
+                     "c",
+                     "&v",
+                     "&nv",
+                     $expected,
+                     "\"$cmd\"",
+                     @cargs,
+                     "(char *)NULL"),
+                ");\n",
+                "  if(rc)\n",
+                "    return rc;\n");
+        } else {
+           push(@c,
+                "  int rc = disorder_simple(",
+                join(", ",
+                     "c",
+                     "NULL",
+                     "\"$cmd\"",
+                     @cargs,
+                     "(char *)NULL"),
+                ");\n",
+                "  if(rc)\n",
+                "    return rc;\n");
+       }
+        for(my $n = 0; $n < scalar @$returns; ++$n) {
+            my $return = $returns->[$n];
+            my $type = $return->[0];
+            my $name = $return->[1];
+            if($type eq 'string') {
+                push(@c,
+                     "  *${name}p = v[$n];\n",
+                    "  v[$n] = NULL;\n");
+            } elsif($type eq 'boolean') {
+                push(@c,
+                     "  if(boolean(\"$cmd\", v[$n], ${name}p))\n",
+                     "    return -1;\n");
+            } elsif($type eq 'integer') {
+                push(@c,
+                     "  *${name}p = atol(v[$n]);\n");
+            } elsif($type eq 'time') {
+                push(@c,
+                     "  *${name}p = atoll(v[$n]);\n");
+            } elsif($type eq 'user') {
+                push(@c,
+                     "  c->user = v[$n];\n",
+                    "  v[$n] = NULL;\n");
+            } elsif($type eq 'body') {
+                push(@c,
+                     "  if(readlist(c, ${name}p, n${name}p))\n",
+                     "    return -1;\n");
+            } elsif($type eq 'queue') {
+                push(@c,
+                     "  if(readqueue(c, ${name}p))\n",
+                     "    return -1;\n");
+            } else {
+                die "$0: C API: unknown return type '$type' for '$name'\n";
+            }
+        }
+       if($expected) {
+           push(@c,
+                "  free_strings(nv, v);\n");
+       }
+        push(@c, "  return 0;\n");
+    }
+    push(@c, "}\n\n");
+
+    # Asynchronous C API
+    my $variant = find_eclient_response($returns);
+    if(defined $variant) {
+       print STDERR "AH ";
+       push(@ah,
+            "/** \@brief $summary\n",
+            " *\n",
+            " * $detail\n",
+            " *\n",
+            " * \@param c Client\n",
+            " * \@param completed Called upon completion\n",
+            c_param_docs($args),
+            " * \@param v Passed to \@p completed\n",
+            " * \@return 0 if the command was queued successfuly, non-0 on error\n",
+            " */\n",
+            "int disorder_eclient_$cmdc(",
+            join(", ", "disorder_eclient *c",
+                 "disorder_eclient_$variant *completed",
+                 map(c_in_decl($_), @$args),
+                 "void *v"),
+            ");\n\n");
+
+       print STDERR "AC ";
+       push(@ac,
+            "int disorder_eclient_$cmdc(",
+            join(", ", "disorder_eclient *c",
+                 "disorder_eclient_$variant *completed",
+                 map(c_in_decl($_), @$args),
+                 "void *v"),
+            ") {\n");
+       push(@ac, "  return simple(",
+            join(", ", 
+                 "c",
+                 "${variant}_opcallback",
+                 "(void (*)())completed",
+                 "v",
+                 "\"$cmd\"",
+                 @cargs,
+                 "(char *)0"),
+            ");\n");
+       push(@ac, "}\n\n");
+    } else {
+       push(@missing, "disorder_eclient_$cmdc");
+    }
+
+    # Python API
+    # TODO
+
+    # Java API
+    # TODO
+    print STDERR "\n";
+}
+
+# TODO other command classes
+
+# Front matter ----------------------------------------------------------------
+
+our @generated = ("/*\n",
+                  " * Automatically generated file, see scripts/protocol\n",
+                  " *\n",
+                  " * DO NOT EDIT.\n",
+                  " */\n");
+
+our @gpl = ("/*\n",
+            " * This file is part of DisOrder.\n",
+            " * Copyright (C) 2010-11 Richard Kettlewell\n",
+            " *\n",
+            " * This program is free software: you can redistribute it and/or modify\n",
+            " * it under the terms of the GNU General Public License as published by\n",
+            " * the Free Software Foundation, either version 3 of the License, or\n",
+            " * (at your option) any later version.\n",
+            " *\n",
+            " * This program is distributed in the hope that it will be useful,\n",
+            " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n",
+            " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n",
+            " * GNU General Public License for more details.\n",
+            " *\n",
+            " * You should have received a copy of the GNU General Public License\n",
+            " * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n",
+            " */\n");
+
+
+push(@h, @generated, @gpl,
+     "#ifndef CLIENT_STUBS_H\n",
+     "#define CLIENT_STUBS_H\n",
+     "/** \@file lib/client-stubs.h\n",
+     " * \@brief Generated client API\n",
+     " *\n",
+     " * Don't include this file directly - use \@ref lib/client.h instead.\n",
+     " */\n",
+     "\n");
+
+push(@c, @generated, @gpl,
+     "/** \@file lib/client-stubs.c\n",
+     " * \@brief Generated client API implementation\n",
+     " */\n",
+     "\n");
+
+push(@ah, @generated, @gpl,
+     "#ifndef ECLIENT_STUBS_H\n",
+     "#define ECLIENT_STUBS_H\n",
+     "/** \@file lib/client-stubs.h\n",
+     " * \@brief Generated asynchronous client API\n",
+     " *\n",
+     " * Don't include this file directly - use \@ref lib/eclient.h instead.\n",
+     " */\n",
+     "\n");
+
+push(@ac, @generated, @gpl,
+     "/** \@file lib/client-stubs.c\n",
+     " * \@brief Generated asynchronous client API implementation\n",
+     " */\n",
+     "\n");
+
+# The protocol ----------------------------------------------------------------
+
+simple("adopt",
+       "Adopt a track",
+       "Makes the calling user owner of a randomly picked track.",
+       [["string", "id", "Track ID"]]);
+
+simple("adduser",
+       "Create a user",
+       "Create a new user.  Requires the 'admin' right.  Email addresses etc must be filled in in separate commands.",
+       [["string", "user", "New username"],
+        ["string", "password", "Initial password"],
+        ["string", "rights", "Initial rights (optional)"]]);
+
+simple("allfiles",
+       "List files and directories in a directory",
+       "See 'files' and 'dirs' for more specific lists.",
+       [["string", "dir", "Directory to list (optional)"],
+       ["string", "re", "Regexp that results must match (optional)"]],
+       [["body", "files", "List of matching files and directories"]]);
+
+simple("confirm",
+       "Confirm registration",
+       "The confirmation string must have been created with 'register'.  The username is returned so the caller knows who they are.",
+       [["string", "confirmation", "Confirmation string"]],
+       [["user"]]);
+
+simple("cookie",
+       "Log in with a cookie",
+       "The cookie must have been created with 'make-cookie'.  The username is returned so the caller knows who they are.",
+       [["string", "cookie", "Cookie string"]],
+       [["user"]]);
+
+simple("deluser",
+       "Delete user",
+       "Requires the 'admin' right.",
+       [["string", "user", "User to delete"]]);
+
+simple("dirs",
+       "List directories in a directory",
+       "",
+       [["string", "dir", "Directory to list (optional)"],
+       ["string", "re", "Regexp that results must match (optional)"]],
+       [["body", "files", "List of matching directories"]]);
+
+simple("disable",
+       "Disable play",
+       "Play will stop at the end of the current track, if one is playing.  Requires the 'global prefs' right.",
+       []);
+
+simple("edituser",
+       "Set a user property",
+       "With the 'admin' right you can do anything.  Otherwise you need the 'userinfo' right and can only set 'email' and 'password'.",
+       [["string", "username", "User to modify"],
+        ["string", "property", "Property name"],
+       ["string", "value", "New property value"]]);
+
+simple("enable",
+       "Enable play",
+       "Requires the 'global prefs' right.",
+       []);
+
+simple("enabled",
+       "Detect whether play is enabled",
+       "",
+       [],
+       [["boolean", "enabled", "1 if play is enabled and 0 otherwise"]]);
+
+simple("exists",
+       "Test whether a track exists",
+       "",
+       [["string", "track", "Track name"]],
+       [["boolean", "exists", "1 if the track exists and 0 otherwise"]]);
+
+simple("files",
+       "List files in a directory",
+       "",
+       [["string", "dir", "Directory to list (optional)"],
+       ["string", "re", "Regexp that results must match (optional)"]],
+       [["body", "files", "List of matching files"]]);
+
+simple("get",
+       "Get a track preference",
+       "If the track does not exist that is an error.  If the track exists but the preference does not then a null value is returned.",
+       [["string", "track", "Track name"],
+        ["string", "pref", "Preference name"]],
+       [["string", "value", "Preference value"]]);
+
+simple("get-global",
+       "Get a global preference",
+       "If the preference does exist not then a null value is returned.",
+       [["string", "pref", "Global preference name"]],
+       [["string", "value", "Preference value"]]);
+
+simple("length",
+       "Get a track's length",
+       "If the track does not exist an error is returned.",
+       [["string", "track", "Track name"]],
+       [["integer", "length", "Track length in seconds"]]);
+
+# TODO log
+
+simple("make-cookie",
+       "Create a login cookie for this user",
+       "The cookie may be redeemed via the 'cookie' command",
+       [],
+       [["string", "cookie", "Newly created cookie"]]);
+
+simple("move",
+       "Move a track",
+       "Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.",
+       [["string", "track", "Track ID or name"],
+       ["integer", "delta", "How far to move the track towards the head of the queue"]]);
+
+simple("moveafter",
+       "Move multiple tracks",
+       "Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.",
+       [["string", "target", "Move after this track, or to head if \"\""],
+       ["list", "ids", "List of tracks to move by ID"]]);
+
+simple(["new", "new_tracks"],
+       "List recently added tracks",
+       "",
+       [["integer", "max", "Maximum tracks to fetch, or 0 for all available"]],
+       [["body", "tracks", "Recently added tracks"]]);
+
+simple("nop",
+       "Do nothing",
+       "Used as a keepalive.  No authentication required.",
+       []);
+
+simple("part",
+       "Get a track name part",
+       "If the name part cannot be constructed an empty string is returned.",
+       [["string", "track", "Track name"],
+        ["string", "context", "Context (\"sort\" or \"display\")"],
+        ["string", "part", "Name part (\"artist\", \"album\" or \"title\")"]],
+       [["string", "part", "Value of name part"]]);
+
+simple("pause",
+       "Pause the currently playing track",
+       "Requires the 'pause' right.",
+       []);
+
+simple("play",
+       "Play a track",
+       "Requires the 'play' right.",
+       [["string", "track", "Track to play"]],
+       [["string-raw", "id", "Queue ID of new track"]]);
+
+simple("playafter",
+       "Play multiple tracks",
+       "Requires the 'play' right.",
+       [["string", "target", "Insert into queue after this track, or at head if \"\""],
+       ["list", "tracks", "List of track names to play"]]);
+
+simple("playing",
+       "Retrieve the playing track",
+       "",
+       [],
+       [["queue-one", "playing", "Details of the playing track"]]);
+
+simple("playlist-delete",
+       "Delete a playlist",
+       "Requires the 'play' right and permission to modify the playlist.",
+       [["string", "playlist", "Playlist to delete"]]);
+
+simple("playlist-get",
+       "List the contents of a playlist",
+       "Requires the 'read' right and oermission to read the playlist.",
+       [["string", "playlist", "Playlist name"]],
+       [["body", "tracks", "List of tracks in playlist"]]);
+
+simple("playlist-get-share",
+       "Get a playlist's sharing status",
+       "Requires the 'read' right and permission to read the playlist.",
+       [["string", "playlist", "Playlist to read"]],
+       [["string-raw", "share", "Sharing status (\"public\", \"private\" or \"shared\")"]]);
+
+simple("playlist-lock",
+       "Lock a playlist",
+       "Requires the 'play' right and permission to modify the playlist.  A given connection may lock at most one playlist.",
+       [["string", "playlist", "Playlist to delete"]]);
+
+simple("playlist-set",
+       "Set the contents of a playlist",
+       "Requires the 'play' right and permission to modify the playlist, which must be locked.",
+       [["string", "playlist", "Playlist to modify"],
+       ["body", "tracks", "New list of tracks for playlist"]]);
+
+simple("playlist-set-share",
+       "Set a playlist's sharing status",
+       "Requires the 'play' right and permission to modify the playlist.",
+       [["string", "playlist", "Playlist to modify"],
+        ["string", "share", "New sharing status (\"public\", \"private\" or \"shared\")"]]);
+
+simple("playlist-unlock",
+       "Unlock the locked playlist playlist",
+       "The playlist to unlock is implicit in the connection.",
+       []);
+
+simple("playlists",
+       "List playlists",
+       "Requires the 'read' right.  Only playlists that you have permission to read are returned.",
+       [],
+       [["body", "playlists", "Playlist names"]]);
+
+simple("prefs",
+       "Get all the preferences for a track",
+       "",
+       [["string", "track", "Track name"]],
+       [["pair-list", "prefs", "Track preferences"]]);
+
+simple("queue",
+       "List the queue",
+       "",
+       [],
+       [["queue", "queue", "Current queue contents"]]);
+
+simple("random-disable",
+       "Disable random play",
+       "Requires the 'global prefs' right.",
+       []);
+
+simple("random-enable",
+       "Enable random play",
+       "Requires the 'global prefs' right.",
+       []);
+
+simple("random-enabled",
+       "Detect whether random play is enabled",
+       "Random play counts as enabled even if play is disabled.",
+       [],
+       [["boolean", "enabled", "1 if random play is enabled and 0 otherwise"]]);
+
+simple("recent",
+       "List recently played tracks",
+       "",
+       [],
+       [["queue", "recent", "Recently played tracks"]]);
+
+simple("reconfigure",
+       "Re-read configuraiton file.",
+       "Requires the 'admin' right.",
+       []);
+
+simple("register",
+       "Register a new user",
+       "Requires the 'register' right which is usually only available to the 'guest' user.  Redeem the confirmation string via 'confirm' to complete registration.",
+       [["string", "username", "Requested new username"],
+        ["string", "password", "Requested initial password"],
+        ["string", "email", "New user's email address"]],
+       [["string", "confirmation", "Confirmation string"]]);
+
+simple("reminder",
+       "Send a password reminder.",
+       "If the user has no valid email address, or no password, or a reminder has been sent too recently, then no reminder will be sent.",
+       [["string", "username", "User to remind"]]);
+
+simple("remove",
+       "Remove a track form the queue.",
+       "Requires one of the 'remove mine', 'remove random' or 'remove any' rights depending on how the track came to be added to the queue.",
+       [["string", "id", "Track ID"]]);
+
+simple("rescan",
+       "Rescan all collections for new or obsolete tracks.",
+       "Requires the 'rescan' right.",
+       []);     # TODO wait/fresh flags
+
+simple("resolve",
+       "Resolve a track name",
+       "Converts aliases to non-alias track names",
+       [["string", "track", "Track name (might be an alias)"]],
+       [["string", "resolved", "Resolve track name (definitely not an alias)"]]);
+
+simple("resume",
+       "Resume the currently playing track",
+       "Requires the 'pause' right.",
+       []);
+
+simple("revoke",
+       "Revoke a cookie.",
+       "It will not subsequently be possible to log in with the cookie.",
+       []);
+
+simple("rtp-address",
+       "Get the server's RTP address information",
+       "",
+       [],
+       [["string", "address", "Where to store hostname or address"],
+        ["string", "port", "Where to store service name or port number"]]);
+
+simple("scratch",
+       "Terminate the playing track.",
+       "Requires one of the 'scratch mine', 'scratch random' or 'scratch any' rights depending on how the track came to be added to the queue.",
+       [["string", "id", "Track ID (optional)"]]);
+
+simple(["schedule-add", "schedule_add_play"],
+       "Schedule a track to play in the future",
+       "",
+       [["time", "when", "When to play the track"],
+        ["string", "priority", "Event priority (\"normal\" or \"junk\")"],
+        ["literal", "play", ""],
+        ["string", "track", "Track to play"]]);
+
+simple(["schedule-add", "schedule_add_set_global"],
+       "Schedule a global setting to be changed in the future",
+       "",
+       [["time", "when", "When to change the setting"],
+        ["string", "priority", "Event priority (\"normal\" or \"junk\")"],
+        ["literal", "set-global", ""],
+        ["string", "pref", "Global preference to set"],
+        ["string", "value", "New value of global preference"]]);
+
+simple(["schedule-add", "schedule_add_unset_global"],
+       "Schedule a global setting to be unset in the future",
+       "",
+       [["time", "when", "When to change the setting"],
+        ["string", "priority", "Event priority (\"normal\" or \"junk\")"],
+        ["literal", "set-global", ""],
+        ["string", "pref", "Global preference to set"]]);
+
+simple("schedule-del",
+       "Delete a scheduled event.",
+       "Users can always delete their own scheduled events; with the admin right you can delete any event.",
+       [["string", "event", "ID of event to delete"]]);
+
+simple("schedule-get",
+       "Get the details of scheduled event",
+       "",
+       [["string", "id", "Event ID"]],
+       [["pair-list", "actiondata", "Details of event"]]);
+
+simple("schedule-list",
+       "List scheduled events",
+       "This just lists IDs.  Use 'schedule-get' to retrieve more detail",
+       [],
+       [["body", "ids", "List of event IDs"]]);
+
+simple("search",
+       "Search for tracks",
+       "Terms are either keywords or tags formatted as 'tag:TAG-NAME'.",
+       [["string", "terms", "List of search terms"]],
+       [["body", "tracks", "List of matching tracks"]]);
+
+simple("set",
+       "Set a track preference",
+       "Requires the 'prefs' right.",
+       [["string", "track", "Track name"],
+        ["string", "pref", "Preference name"],
+       ["string", "value", "New value"]]);
+
+simple("set-global",
+       "Set a global preference",
+       "Requires the 'global prefs' right.",
+       [["string", "pref", "Preference name"],
+       ["string", "value", "New value"]]);
+
+simple("shutdown",
+       "Request server shutdown",
+       "Requires the 'admin' right.",
+       []);
+
+simple("stats",
+       "Get server statistics",
+       "The details of what the server reports are not really defined.  The returned strings are intended to be printed out one to a line.",
+       [],
+       [["body", "stats", "List of server information strings."]]);
+
+simple("tags",
+       "Get a list of known tags",
+       "Only tags which apply to at least one track are returned.",
+       [],
+       [["body", "tags", "List of tags"]]);
+
+simple("unset",
+       "Unset a track preference",
+       "Requires the 'prefs' right.",
+       [["string", "track", "Track name"],
+        ["string", "pref", "Preference name"]]);
+
+simple("unset-global",
+       "Set a global preference",
+       "Requires the 'global prefs' right.",
+       [["string", "pref", "Preference name"]]);
+
+# 'user' only used for authentication
+
+simple("userinfo",
+       "Get a user property.",
+       "If the user does not exist an error is returned, if the user exists but the property does not then a null value is returned.",
+       [["string", "username", "User to read"],
+        ["string", "property", "Property to read"]],
+       [["string", "value", "Value of property"]]);
+
+simple("users",
+       "Get a list of users",
+       "",
+       [],
+       [["body", "users", "List of users"]]);
+
+simple("version",
+       "Get the server version",
+       "",
+       [],
+       [["string", "version", "Server version string"]]);
+
+simple(["volume", "set_volume"],
+       "Set the volume",
+       "",
+       [["integer", "left", "Left channel volume"],
+        ["integer", "right", "Right channel volume"]]);
+
+simple(["volume", "get_volume"],
+       "Get the volume",
+       "",
+       [],
+       [["integer", "left", "Left channel volume"],
+        ["integer", "right", "Right channel volume"]]);
+
+# End matter ------------------------------------------------------------------
+
+push(@h, "#endif\n");
+
+push(@ah, "#endif\n");
+
+# Write it all out ------------------------------------------------------------
+
+Write("lib/client-stubs.h", \@h);
+Write("lib/client-stubs.c", \@c);
+
+Write("lib/eclient-stubs.h", \@ah);
+Write("lib/eclient-stubs.c", \@ac);
+
+if(scalar @missing) {
+  print "Missing:\n";
+  print map("  $_\n", @missing);
+}
index fc7e1d9cf537992cd407f63208d7e1e042c0b9de..c6febdca6370c73125caebf1ca7cd754656c6f24 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2009 Richard Kettlewell
+# Copyright (C) 2004-2011 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -25,11 +25,11 @@ AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 
 disorderd_SOURCES=disorderd.c api.c api-server.c daemonize.c play.c    \
        server.c server-queue.c queue-ops.c state.c plugin.c            \
-       schedule.c dbparams.c background.c \
+       schedule.c dbparams.c background.c mount.c \
        exports.c ../lib/memgc.c disorder-server.h
 disorderd_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBPCRE) $(LIBDB) $(LIBAO) $(LIBGC) $(LIBGCRYPT) $(LIBICONV) \
-       $(LIBASOUND) $(COREAUDIO)
+       $(LIBASOUND) $(COREAUDIO) $(LIBPTHREAD) $(LIBDL)
 disorderd_LDFLAGS=-export-dynamic
 disorderd_DEPENDENCIES=../lib/libdisorder.a
 
@@ -44,7 +44,8 @@ disorder_speaker_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBPTHREAD)
 disorder_speaker_DEPENDENCIES=../lib/libdisorder.a
 
-disorder_decode_SOURCES=decode.c disorder-server.h
+disorder_decode_SOURCES=decode.c decode.h disorder-server.h    \
+decode-mp3.c decode-ogg.c decode-wav.c decode-flac.c
 disorder_decode_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBMAD) $(LIBVORBISFILE) $(LIBFLAC)
 disorder_decode_DEPENDENCIES=../lib/libdisorder.a
@@ -57,7 +58,7 @@ disorder_normalize_DEPENDENCIES=../lib/libdisorder.a
 disorder_rescan_SOURCES=rescan.c plugin.c api.c api-server.c exports.c \
        ../lib/memgc.c disorder-server.h
 disorder_rescan_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
-       $(LIBDB) $(LIBGC) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT)
+       $(LIBDB) $(LIBGC) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT) $(LIBDL)
 disorder_rescan_LDFLAGS=-export-dynamic
 disorder_rescan_DEPENDENCIES=../lib/libdisorder.a
 
@@ -87,9 +88,6 @@ trackname_SOURCES=trackname.c disorder-server.h
 trackname_LDADD=../lib/libdisorder.a $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT)
 trackname_DEPENDENCIES=../lib/libdisorder.a
 
-install-exec-hook:
-       $(LIBTOOL) --mode=finish $(DESTDIR)$(libdir)
-
 check: check-help check-decode
 
 # check everything has working --help and --version
index 4901047903b8e77f54290b0792142cb1fb2cc519..8c07361c289b367b449d8c63aba57550a409e73a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2009 Richard Kettlewell
+ * Copyright (C) 2004-2009, 2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -70,19 +70,9 @@ int play_background(ev_source *ev,
       --optc;
       break;
     }
-    if(!strcmp(optv[0], "--wait-for-device")
-       || !strncmp(optv[0], "--wait-for-device=", 18)) {
-      const char *waitdevice;
-      if((waitdevice = strchr(optv[0], '='))) {
-       params->waitdevice = waitdevice + 1;
-      } else
-        params->waitdevice = "";       /* use default */
-      ++optv;
-      --optc;
-    } else {
-      disorder_error(0, "unknown option %s", optv[0]);
-      return START_HARDFAIL;
-    }
+    /* Currently no options supported */
+    disorder_error(0, "unknown option %s", optv[0]);
+    return START_HARDFAIL;
   }
   params->argc = optc;
   params->argv = optv;
index 405a95df9bf8d43cc09d5c8ff0d448f11f324aba..4b2d94fe0804989a3c491702d7355d4a75ddb4a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder 
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2009, 2011 Richard Kettlewell
  * Copyright (C) 2008 Mark Wooding
  *
  * This program is free software: you can redistribute it and/or modify
index 960b4ad338dc6bf4e051d01a8ef60018bcf10af4..7333819ff2ed0bdd626cb9f4a75d7c362676da6a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 18e6aa1049ab114fbeb5ffc9212c22b687d8ef75..e44b7f505b8089717d9e509babe5d6192cf06521 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 72a82d47145d0f61f16d05f251ebf54b7691023d..636e382e42a6dc9cc65f08644ee2431cf79ac9b6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder 
- * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2005, 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/server/decode-flac.c b/server/decode-flac.c
new file mode 100644 (file)
index 0000000..56af481
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2007-2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/decode-flac.c
+ * @brief General-purpose decoder for use by speaker process
+ */
+#include "decode.h"
+#include <FLAC/stream_decoder.h>
+
+/** @brief Metadata callback for FLAC decoder
+ *
+ * This is a no-op here.
+ */
+static void flac_metadata(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                         const FLAC__StreamMetadata attribute((unused)) *metadata,
+                         void attribute((unused)) *client_data) {
+}
+
+/** @brief Error callback for FLAC decoder */
+static void flac_error(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                      FLAC__StreamDecoderErrorStatus status,
+                      void attribute((unused)) *client_data) {
+  disorder_fatal(0, "error decoding %s: %s", path,
+                 FLAC__StreamDecoderErrorStatusString[status]);
+}
+
+/** @brief Write callback for FLAC decoder */
+static FLAC__StreamDecoderWriteStatus flac_write
+    (const FLAC__StreamDecoder attribute((unused)) *decoder,
+     const FLAC__Frame *frame,
+     const FLAC__int32 *const buffer[],
+     void attribute((unused)) *client_data) {
+  size_t n, c;
+
+  output_header(frame->header.sample_rate,
+                frame->header.channels,
+                frame->header.bits_per_sample,
+                (frame->header.channels * frame->header.blocksize
+                 * frame->header.bits_per_sample) / 8,
+                ENDIAN_BIG);
+  for(n = 0; n < frame->header.blocksize; ++n) {
+    for(c = 0; c < frame->header.channels; ++c) {
+      switch(frame->header.bits_per_sample) {
+      case 8: output_8(buffer[c][n]); break;
+      case 16: output_16(buffer[c][n]); break;
+      case 24: output_24(buffer[c][n]); break;
+      case 32: output_32(buffer[c][n]); break;
+      }
+    }
+  }
+  return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
+}
+
+static FLAC__StreamDecoderReadStatus flac_read(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                                               FLAC__byte buffer[],
+                                               size_t *bytes,
+                                               void *client_data) {
+  struct hreader *flacinput = client_data;
+  int n = hreader_read(flacinput, buffer, *bytes);
+  if(n == 0) {
+    *bytes = 0;
+    return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
+  }
+  if(n < 0) {
+    *bytes = 0;
+    return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
+  }
+  *bytes = n;
+  return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
+}
+
+static FLAC__StreamDecoderSeekStatus flac_seek(const FLAC__StreamDecoder attribute((unused)) *decoder,
+                                               FLAC__uint64 absolute_byte_offset, 
+                                               void *client_data) {
+  struct hreader *flacinput = client_data;
+  if(hreader_seek(flacinput, absolute_byte_offset, SEEK_SET) < 0)
+    return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
+  else
+    return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
+}
+
+static FLAC__StreamDecoderTellStatus flac_tell(const FLAC__StreamDecoder attribute((unused)) *decoder, 
+                                               FLAC__uint64 *absolute_byte_offset,
+                                               void *client_data) {
+  struct hreader *flacinput = client_data;
+  off_t offset = hreader_seek(flacinput, 0, SEEK_CUR);
+  if(offset < 0)
+    return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
+  *absolute_byte_offset = offset;
+  return FLAC__STREAM_DECODER_TELL_STATUS_OK;
+}
+
+static FLAC__StreamDecoderLengthStatus flac_length(const FLAC__StreamDecoder attribute((unused)) *decoder, 
+                                                   FLAC__uint64 *stream_length, 
+                                                   void *client_data) {
+  struct hreader *flacinput = client_data;
+  *stream_length = hreader_size(flacinput);
+  return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
+}
+
+static FLAC__bool flac_eof(const FLAC__StreamDecoder attribute((unused)) *decoder, 
+                           void *client_data) {
+  struct hreader *flacinput = client_data;
+  return hreader_eof(flacinput);
+}
+
+/** @brief FLAC file decoder */
+void decode_flac(void) {
+  FLAC__StreamDecoder *sd = FLAC__stream_decoder_new();
+  FLAC__StreamDecoderInitStatus is;
+  struct hreader flacinput[1];
+
+  if (!sd)
+    disorder_fatal(0, "FLAC__stream_decoder_new failed");
+  if(hreader_init(path, flacinput))
+    disorder_fatal(errno, "error opening %s", path);
+
+  if((is = FLAC__stream_decoder_init_stream(sd,
+                                            flac_read,
+                                            flac_seek,
+                                            flac_tell,
+                                            flac_length,
+                                            flac_eof,
+                                            flac_write, flac_metadata,
+                                            flac_error, 
+                                            flacinput)))
+    disorder_fatal(0, "FLAC__stream_decoder_init_stream %s: %s",
+                   path, FLAC__StreamDecoderInitStatusString[is]);
+
+  FLAC__stream_decoder_process_until_end_of_stream(sd);
+  FLAC__stream_decoder_finish(sd);
+  FLAC__stream_decoder_delete(sd);
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/server/decode-mp3.c b/server/decode-mp3.c
new file mode 100644 (file)
index 0000000..6837beb
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2007-2010 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/decode-mp3.c
+ * @brief Decode MP3 files.
+ */
+#include "decode.h"
+#include <mad.h>
+
+static struct hreader input[1];
+
+/** @brief Dithering state
+ * Filched from mpg321, which credits it to Robert Leslie */
+struct audio_dither {
+  mad_fixed_t error[3];
+  mad_fixed_t random;
+};
+
+/** @brief 32-bit PRNG
+ * Filched from mpg321, which credits it to Robert Leslie */
+static inline unsigned long prng(unsigned long state)
+{
+  return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
+}
+
+/** @brief Generic linear sample quantize and dither routine
+ * Filched from mpg321, which credits it to Robert Leslie */
+static long audio_linear_dither(mad_fixed_t sample,
+                               struct audio_dither *dither) {
+  unsigned int scalebits;
+  mad_fixed_t output, mask, rnd;
+  const int bits = 16;
+
+  enum {
+    MIN = -MAD_F_ONE,
+    MAX =  MAD_F_ONE - 1
+  };
+
+  /* noise shape */
+  sample += dither->error[0] - dither->error[1] + dither->error[2];
+
+  dither->error[2] = dither->error[1];
+  dither->error[1] = dither->error[0] / 2;
+
+  /* bias */
+  output = sample + (1L << (MAD_F_FRACBITS + 1 - bits - 1));
+
+  scalebits = MAD_F_FRACBITS + 1 - bits;
+  mask = (1L << scalebits) - 1;
+
+  /* dither */
+  rnd  = prng(dither->random);
+  output += (rnd & mask) - (dither->random & mask);
+
+  dither->random = rnd;
+
+  /* clip */
+  if (output > MAX) {
+    output = MAX;
+
+    if (sample > MAX)
+      sample = MAX;
+  }
+  else if (output < MIN) {
+    output = MIN;
+
+    if (sample < MIN)
+      sample = MIN;
+  }
+
+  /* quantize */
+  output &= ~mask;
+
+  /* error feedback */
+  dither->error[0] = sample - output;
+
+  /* scale */
+  return output >> scalebits;
+}
+
+/** @brief MP3 output callback */
+static enum mad_flow mp3_output(void attribute((unused)) *data,
+                               struct mad_header const *header,
+                               struct mad_pcm *pcm) {
+  size_t n = pcm->length;
+  const mad_fixed_t *l = pcm->samples[0], *r = pcm->samples[1];
+  static struct audio_dither ld[1], rd[1];
+
+  output_header(header->samplerate,
+               pcm->channels,
+               16,
+                2 * pcm->channels * pcm->length,
+                ENDIAN_BIG);
+  switch(pcm->channels) {
+  case 1:
+    while(n--)
+      output_16(audio_linear_dither(*l++, ld));
+    break;
+  case 2:
+    while(n--) {
+      output_16(audio_linear_dither(*l++, ld));
+      output_16(audio_linear_dither(*r++, rd));
+    }
+    break;
+  }
+  return MAD_FLOW_CONTINUE;
+}
+
+/** @brief MP3 input callback */
+static enum mad_flow mp3_input(void attribute((unused)) *data,
+                              struct mad_stream *stream) {
+  int used, remain, n;
+
+  /* libmad requires its caller to do ALL the buffering work, including coping
+   * with partial frames.  Given that it appears to be completely undocumented
+   * you could perhaps be forgiven for not discovering this...  */
+  if(input_count) {
+    /* Compute total number of bytes consumed */
+    used = (char *)stream->next_frame - input_buffer;
+    /* Compute number of bytes left to consume */
+    remain = input_count - used;
+    memmove(input_buffer, input_buffer + used, remain);
+  } else {
+    remain = 0;
+  }
+  /* Read new data */
+  n = hreader_read(input,
+                   input_buffer + remain, 
+                   (sizeof input_buffer) - remain);
+  if(n < 0)
+    disorder_fatal(errno, "reading from %s", path);
+  /* Compute total number of bytes available */
+  input_count = remain + n;
+  if(input_count)
+    mad_stream_buffer(stream, (unsigned char *)input_buffer, input_count);
+  if(n)
+    return MAD_FLOW_CONTINUE;
+  else
+    return MAD_FLOW_STOP;
+}
+
+/** @brief MP3 error callback */
+static enum mad_flow mp3_error(void attribute((unused)) *data,
+                              struct mad_stream *stream,
+                              struct mad_frame attribute((unused)) *frame) {
+  if(0)
+    /* Just generates pointless verbosity l-( */
+    disorder_error(0, "decoding %s: %s (%#04x)",
+                   path, mad_stream_errorstr(stream), stream->error);
+  return MAD_FLOW_CONTINUE;
+}
+
+/** @brief MP3 decoder */
+void decode_mp3(void) {
+  struct mad_decoder mad[1];
+
+  if(hreader_init(path, input))
+    disorder_fatal(errno, "opening %s", path);
+  mad_decoder_init(mad, 0/*data*/, mp3_input, 0/*header*/, 0/*filter*/,
+                  mp3_output, mp3_error, 0/*message*/);
+  if(mad_decoder_run(mad, MAD_DECODER_MODE_SYNC))
+    exit(1);
+  mad_decoder_finish(mad);
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/server/decode-ogg.c b/server/decode-ogg.c
new file mode 100644 (file)
index 0000000..e48d95a
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2007-2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/decode-ogg.c
+ * @brief General-purpose decoder for use by speaker process
+ */
+#include "decode.h"
+
+#include <vorbis/vorbisfile.h>
+
+static size_t ogg_read_func(void *ptr, size_t size, size_t nmemb, void *datasource) {
+  struct hreader *h = datasource;
+  
+  int n = hreader_read(h, ptr, size * nmemb);
+  if(n < 0) n = 0;
+  return n / size;
+}
+
+static int ogg_seek_func(void *datasource, ogg_int64_t offset, int whence) {
+  struct hreader *h = datasource;
+  
+  return hreader_seek(h, offset, whence) < 0 ? -1 : 0;
+}
+
+static int ogg_close_func(void attribute((unused)) *datasource) {
+  return 0;
+}
+
+static long ogg_tell_func(void *datasource) {
+  struct hreader *h = datasource;
+  
+  return hreader_seek(h, 0, SEEK_CUR);
+}
+
+static const ov_callbacks ogg_callbacks = {
+  ogg_read_func,
+  ogg_seek_func,
+  ogg_close_func,
+  ogg_tell_func,
+};
+
+/** @brief OGG decoder */
+void decode_ogg(void) {
+  struct hreader ogginput[1];
+  OggVorbis_File vf[1];
+  int err;
+  long n;
+  int bitstream;
+  vorbis_info *vi;
+
+  hreader_init(path, ogginput);
+  /* There doesn't seem to be any standard function for mapping the error codes
+   * to strings l-( */
+  if((err = ov_open_callbacks(ogginput, vf, 0/*initial*/, 0/*ibytes*/,
+                              ogg_callbacks)))
+    disorder_fatal(0, "ov_open_callbacks %s: %d", path, err);
+  if(!(vi = ov_info(vf, 0/*link*/)))
+    disorder_fatal(0, "ov_info %s: failed", path);
+  while((n = ov_read(vf, input_buffer, sizeof input_buffer, 1/*bigendianp*/,
+                     2/*bytes/word*/, 1/*signed*/, &bitstream))) {
+    if(n < 0)
+      disorder_fatal(0, "ov_read %s: %ld", path, n);
+    if(bitstream > 0)
+      disorder_fatal(0, "only single-bitstream ogg files are supported");
+    output_header(vi->rate, vi->channels, 16/*bits*/, n, ENDIAN_BIG);
+    if(fwrite(input_buffer, 1, n, outputfp) < (size_t)n)
+      disorder_fatal(errno, "decoding %s: writing sample data", path);
+  }
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/server/decode-wav.c b/server/decode-wav.c
new file mode 100644 (file)
index 0000000..fbc550e
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2007-2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/decode-wav.c
+ * @brief General-purpose decoder for use by speaker process
+ */
+#include "decode.h"
+#include "wav.h"
+
+/** @brief Sample data callback used by decode_wav() */
+static int wav_write(struct wavfile attribute((unused)) *f,
+                     const char *data,
+                     size_t nbytes,
+                     void attribute((unused)) *u) {
+  if(fwrite(data, 1, nbytes, outputfp) < nbytes)
+    disorder_fatal(errno, "decoding %s: writing sample data", path);
+  return 0;
+}
+
+/** @brief WAV file decoder */
+void decode_wav(void) {
+  struct wavfile f[1];
+  int err;
+
+  if((err = wav_init(f, path)))
+    disorder_fatal(err, "opening %s", path);
+  output_header(f->rate, f->channels, f->bits, f->datasize, ENDIAN_LITTLE);
+  if((err = wav_data(f, wav_write, 0)))
+    disorder_fatal(err, "error decoding %s", path);
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 11a05928038f86658dd8a2ef129493eee7246bc2..8a09013b23666533acbe299859cd128c9fa43ff3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007-2009 Richard Kettlewell
+ * Copyright (C) 2007-2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 /** @file server/decode.c
  * @brief General-purpose decoder for use by speaker process
  */
-
-#include "disorder-server.h"
+#include "decode.h"
 
 #include <mad.h>
 #include <vorbis/vorbisfile.h>
 
-/* libFLAC has had an API change and stupidly taken away the old API */
-#if HAVE_FLAC_FILE_DECODER_H
-# include <FLAC/file_decoder.h>
-#else
-# include <FLAC/stream_decoder.h>
-#define FLAC__FileDecoder FLAC__StreamDecoder
-#define FLAC__FileDecoderState FLAC__StreamDecoderState
-#endif
+#include <FLAC/stream_decoder.h>
 
 #include "wav.h"
-#include "speaker-protocol.h"
 
 
 /** @brief Encoding lookup table type */
@@ -45,50 +36,10 @@ struct decoder {
   void (*decode)(void);
 };
 
-/** @brief Input file */
-static int inputfd;
-
-/** @brief Output file */
-static FILE *outputfp;
-
-/** @brief Filename */
-static const char *path;
-
-/** @brief Input buffer */
-static char input_buffer[1048576];
-
-/** @brief Number of bytes read into buffer */
-static int input_count;
-
-/** @brief Write an 8-bit word */
-static inline void output_8(int n) {
-  if(putc(n, outputfp) < 0)
-    disorder_fatal(errno, "decoding %s: output error", path);
-}
-
-/** @brief Write a 16-bit word in bigendian format */
-static inline void output_16(uint16_t n) {
-  if(putc(n >> 8, outputfp) < 0
-     || putc(n, outputfp) < 0)
-    disorder_fatal(errno, "decoding %s: output error", path);
-}
-
-/** @brief Write a 24-bit word in bigendian format */
-static inline void output_24(uint32_t n) {
-  if(putc(n >> 16, outputfp) < 0
-     || putc(n >> 8, outputfp) < 0
-     || putc(n, outputfp) < 0)
-    disorder_fatal(errno, "decoding %s: output error", path);
-}
-
-/** @brief Write a 32-bit word in bigendian format */
-static inline void output_32(uint32_t n) {
-  if(putc(n >> 24, outputfp) < 0
-     || putc(n >> 16, outputfp) < 0
-     || putc(n >> 8, outputfp) < 0
-     || putc(n, outputfp) < 0)
-    disorder_fatal(errno, "decoding %s: output error", path);
-}
+FILE *outputfp;
+const char *path;
+char input_buffer[INPUT_BUFFER_SIZE];
+int input_count;
 
 /** @brief Write a block header
  * @param rate Sample rate in Hz
@@ -100,11 +51,11 @@ static inline void output_32(uint32_t n) {
  * Checks that the sample format is a supported one (so other calls do not have
  * to) and calls disorder_fatal() on error.
  */
-static void output_header(int rate,
-                         int channels,
-                         int bits,
-                          int nbytes,
-                          int endian) {
+void output_header(int rate,
+                   int channels,
+                   int bits,
+                   int nbytes,
+                   int endian) {
   struct stream_header header;
 
   if(bits <= 0 || bits % 8 || bits > 64)
@@ -124,288 +75,6 @@ static void output_header(int rate,
     disorder_fatal(errno, "decoding %s: writing format header", path);
 }
 
-/** @brief Dithering state
- * Filched from mpg321, which credits it to Robert Leslie */
-struct audio_dither {
-  mad_fixed_t error[3];
-  mad_fixed_t random;
-};
-
-/** @brief 32-bit PRNG
- * Filched from mpg321, which credits it to Robert Leslie */
-static inline unsigned long prng(unsigned long state)
-{
-  return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
-}
-
-/** @brief Generic linear sample quantize and dither routine
- * Filched from mpg321, which credits it to Robert Leslie */
-static long audio_linear_dither(mad_fixed_t sample,
-                               struct audio_dither *dither) {
-  unsigned int scalebits;
-  mad_fixed_t output, mask, rnd;
-  const int bits = 16;
-
-  enum {
-    MIN = -MAD_F_ONE,
-    MAX =  MAD_F_ONE - 1
-  };
-
-  /* noise shape */
-  sample += dither->error[0] - dither->error[1] + dither->error[2];
-
-  dither->error[2] = dither->error[1];
-  dither->error[1] = dither->error[0] / 2;
-
-  /* bias */
-  output = sample + (1L << (MAD_F_FRACBITS + 1 - bits - 1));
-
-  scalebits = MAD_F_FRACBITS + 1 - bits;
-  mask = (1L << scalebits) - 1;
-
-  /* dither */
-  rnd  = prng(dither->random);
-  output += (rnd & mask) - (dither->random & mask);
-
-  dither->random = rnd;
-
-  /* clip */
-  if (output > MAX) {
-    output = MAX;
-
-    if (sample > MAX)
-      sample = MAX;
-  }
-  else if (output < MIN) {
-    output = MIN;
-
-    if (sample < MIN)
-      sample = MIN;
-  }
-
-  /* quantize */
-  output &= ~mask;
-
-  /* error feedback */
-  dither->error[0] = sample - output;
-
-  /* scale */
-  return output >> scalebits;
-}
-
-/** @brief MP3 output callback */
-static enum mad_flow mp3_output(void attribute((unused)) *data,
-                               struct mad_header const *header,
-                               struct mad_pcm *pcm) {
-  size_t n = pcm->length;
-  const mad_fixed_t *l = pcm->samples[0], *r = pcm->samples[1];
-  static struct audio_dither ld[1], rd[1];
-
-  output_header(header->samplerate,
-               pcm->channels,
-               16,
-                2 * pcm->channels * pcm->length,
-                ENDIAN_BIG);
-  switch(pcm->channels) {
-  case 1:
-    while(n--)
-      output_16(audio_linear_dither(*l++, ld));
-    break;
-  case 2:
-    while(n--) {
-      output_16(audio_linear_dither(*l++, ld));
-      output_16(audio_linear_dither(*r++, rd));
-    }
-    break;
-  }
-  return MAD_FLOW_CONTINUE;
-}
-
-/** @brief MP3 input callback */
-static enum mad_flow mp3_input(void attribute((unused)) *data,
-                              struct mad_stream *stream) {
-  int used, remain, n;
-
-  /* libmad requires its caller to do ALL the buffering work, including coping
-   * with partial frames.  Given that it appears to be completely undocumented
-   * you could perhaps be forgiven for not discovering this...  */
-  if(input_count) {
-    /* Compute total number of bytes consumed */
-    used = (char *)stream->next_frame - input_buffer;
-    /* Compute number of bytes left to consume */
-    remain = input_count - used;
-    memmove(input_buffer, input_buffer + used, remain);
-  } else {
-    remain = 0;
-  }
-  /* Read new data */
-  n = read(inputfd, input_buffer + remain, (sizeof input_buffer) - remain);
-  if(n < 0)
-    disorder_fatal(errno, "reading from %s", path);
-  /* Compute total number of bytes available */
-  input_count = remain + n;
-  if(input_count)
-    mad_stream_buffer(stream, (unsigned char *)input_buffer, input_count);
-  if(n)
-    return MAD_FLOW_CONTINUE;
-  else
-    return MAD_FLOW_STOP;
-}
-
-/** @brief MP3 error callback */
-static enum mad_flow mp3_error(void attribute((unused)) *data,
-                              struct mad_stream *stream,
-                              struct mad_frame attribute((unused)) *frame) {
-  if(0)
-    /* Just generates pointless verbosity l-( */
-    disorder_error(0, "decoding %s: %s (%#04x)",
-                   path, mad_stream_errorstr(stream), stream->error);
-  return MAD_FLOW_CONTINUE;
-}
-
-/** @brief MP3 decoder */
-static void decode_mp3(void) {
-  struct mad_decoder mad[1];
-
-  if((inputfd = open(path, O_RDONLY)) < 0)
-    disorder_fatal(errno, "opening %s", path);
-  mad_decoder_init(mad, 0/*data*/, mp3_input, 0/*header*/, 0/*filter*/,
-                  mp3_output, mp3_error, 0/*message*/);
-  if(mad_decoder_run(mad, MAD_DECODER_MODE_SYNC))
-    exit(1);
-  mad_decoder_finish(mad);
-}
-
-/** @brief OGG decoder */
-static void decode_ogg(void) {
-  FILE *fp;
-  OggVorbis_File vf[1];
-  int err;
-  long n;
-  int bitstream;
-  vorbis_info *vi;
-
-  if(!(fp = fopen(path, "rb")))
-    disorder_fatal(errno, "cannot open %s", path);
-  /* There doesn't seem to be any standard function for mapping the error codes
-   * to strings l-( */
-  if((err = ov_open(fp, vf, 0/*initial*/, 0/*ibytes*/)))
-    disorder_fatal(0, "ov_fopen %s: %d", path, err);
-  if(!(vi = ov_info(vf, 0/*link*/)))
-    disorder_fatal(0, "ov_info %s: failed", path);
-  while((n = ov_read(vf, input_buffer, sizeof input_buffer, 1/*bigendianp*/,
-                     2/*bytes/word*/, 1/*signed*/, &bitstream))) {
-    if(n < 0)
-      disorder_fatal(0, "ov_read %s: %ld", path, n);
-    if(bitstream > 0)
-      disorder_fatal(0, "only single-bitstream ogg files are supported");
-    output_header(vi->rate, vi->channels, 16/*bits*/, n, ENDIAN_BIG);
-    if(fwrite(input_buffer, 1, n, outputfp) < (size_t)n)
-      disorder_fatal(errno, "decoding %s: writing sample data", path);
-  }
-}
-
-/** @brief Sample data callback used by decode_wav() */
-static int wav_write(struct wavfile attribute((unused)) *f,
-                     const char *data,
-                     size_t nbytes,
-                     void attribute((unused)) *u) {
-  if(fwrite(data, 1, nbytes, outputfp) < nbytes)
-    disorder_fatal(errno, "decoding %s: writing sample data", path);
-  return 0;
-}
-
-/** @brief WAV file decoder */
-static void decode_wav(void) {
-  struct wavfile f[1];
-  int err;
-
-  if((err = wav_init(f, path)))
-    disorder_fatal(err, "opening %s", path);
-  output_header(f->rate, f->channels, f->bits, f->datasize, ENDIAN_LITTLE);
-  if((err = wav_data(f, wav_write, 0)))
-    disorder_fatal(err, "error decoding %s", path);
-}
-
-/** @brief Metadata callback for FLAC decoder
- *
- * This is a no-op here.
- */
-static void flac_metadata(const FLAC__FileDecoder attribute((unused)) *decoder,
-                         const FLAC__StreamMetadata attribute((unused)) *metadata,
-                         void attribute((unused)) *client_data) {
-}
-
-/** @brief Error callback for FLAC decoder */
-static void flac_error(const FLAC__FileDecoder attribute((unused)) *decoder,
-                      FLAC__StreamDecoderErrorStatus status,
-                      void attribute((unused)) *client_data) {
-  disorder_fatal(0, "error decoding %s: %s", path,
-                 FLAC__StreamDecoderErrorStatusString[status]);
-}
-
-/** @brief Write callback for FLAC decoder */
-static FLAC__StreamDecoderWriteStatus flac_write
-    (const FLAC__FileDecoder attribute((unused)) *decoder,
-     const FLAC__Frame *frame,
-     const FLAC__int32 *const buffer[],
-     void attribute((unused)) *client_data) {
-  size_t n, c;
-
-  output_header(frame->header.sample_rate,
-                frame->header.channels,
-                frame->header.bits_per_sample,
-                (frame->header.channels * frame->header.blocksize
-                 * frame->header.bits_per_sample) / 8,
-                ENDIAN_BIG);
-  for(n = 0; n < frame->header.blocksize; ++n) {
-    for(c = 0; c < frame->header.channels; ++c) {
-      switch(frame->header.bits_per_sample) {
-      case 8: output_8(buffer[c][n]); break;
-      case 16: output_16(buffer[c][n]); break;
-      case 24: output_24(buffer[c][n]); break;
-      case 32: output_32(buffer[c][n]); break;
-      }
-    }
-  }
-  return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
-}
-
-
-/** @brief FLAC file decoder */
-static void decode_flac(void) {
-#if HAVE_FLAC_FILE_DECODER_H
-  FLAC__FileDecoder *fd = 0;
-  FLAC__FileDecoderState fs;
-
-  if(!(fd = FLAC__file_decoder_new()))
-    disorder_fatal(0, "FLAC__file_decoder_new failed");
-  if(!(FLAC__file_decoder_set_filename(fd, path)))
-    disorder_fatal(0, "FLAC__file_set_filename failed");
-  FLAC__file_decoder_set_metadata_callback(fd, flac_metadata);
-  FLAC__file_decoder_set_error_callback(fd, flac_error);
-  FLAC__file_decoder_set_write_callback(fd, flac_write);
-  if((fs = FLAC__file_decoder_init(fd)))
-    disorder_fatal(0, "FLAC__file_decoder_init: %s", FLAC__FileDecoderStateString[fs]);
-  FLAC__file_decoder_process_until_end_of_file(fd);
-#else
-  FLAC__StreamDecoder *sd = FLAC__stream_decoder_new();
-  FLAC__StreamDecoderInitStatus is;
-
-  if (!sd)
-    disorder_fatal(0, "FLAC__stream_decoder_new failed");
-
-  if((is = FLAC__stream_decoder_init_file(sd, path, flac_write, flac_metadata,
-                                          flac_error, 0)))
-    disorder_fatal(0, "FLAC__stream_decoder_init_file %s: %s",
-                   path, FLAC__StreamDecoderInitStatusString[is]);
-
-  FLAC__stream_decoder_process_until_end_of_stream(sd);
-  FLAC__stream_decoder_finish(sd);
-  FLAC__stream_decoder_delete(sd);
-#endif
-}
-
 /** @brief Lookup table of decoders */
 static const struct decoder decoders[] = {
   { "*.mp3", decode_mp3 },
diff --git a/server/decode.h b/server/decode.h
new file mode 100644 (file)
index 0000000..97bf687
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2007-2010 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/decode.h
+ * @brief General-purpose decoder for use by speaker process
+ */
+#ifndef DECODE_H
+#define DECODE_H
+
+#include "disorder-server.h"
+#include "hreader.h"
+#include "speaker-protocol.h"
+
+#define INPUT_BUFFER_SIZE 1048576
+  
+/** @brief Output file */
+extern FILE *outputfp;
+
+/** @brief Input filename */
+extern const char *path;
+
+/** @brief Input buffer */
+extern char input_buffer[INPUT_BUFFER_SIZE];
+
+/** @brief Number of bytes read into buffer */
+extern int input_count;
+
+/** @brief Write an 8-bit word */
+static inline void output_8(int n) {
+  if(putc(n, outputfp) < 0)
+    disorder_fatal(errno, "decoding %s: output error", path);
+}
+
+/** @brief Write a 16-bit word in bigendian format */
+static inline void output_16(uint16_t n) {
+  if(putc(n >> 8, outputfp) < 0
+     || putc(n, outputfp) < 0)
+    disorder_fatal(errno, "decoding %s: output error", path);
+}
+
+/** @brief Write a 24-bit word in bigendian format */
+static inline void output_24(uint32_t n) {
+  if(putc(n >> 16, outputfp) < 0
+     || putc(n >> 8, outputfp) < 0
+     || putc(n, outputfp) < 0)
+    disorder_fatal(errno, "decoding %s: output error", path);
+}
+
+/** @brief Write a 32-bit word in bigendian format */
+static inline void output_32(uint32_t n) {
+  if(putc(n >> 24, outputfp) < 0
+     || putc(n >> 16, outputfp) < 0
+     || putc(n >> 8, outputfp) < 0
+     || putc(n, outputfp) < 0)
+    disorder_fatal(errno, "decoding %s: output error", path);
+}
+
+void output_header(int rate,
+                   int channels,
+                   int bits,
+                   int nbytes,
+                   int endian);
+
+void decode_mp3(void);
+void decode_ogg(void);
+void decode_wav(void);
+void decode_flac(void);
+
+#endif /* DECODE_H */
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index e8f4dabd17c6aea1a3df02eb623766a0bbe82d7e..7a6b73a7e9554f59ca00477d4286caea9a24e5c9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2008, 2009 Richard Kettlewell
+ * Copyright (C) 2008-2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -179,13 +179,16 @@ void play(ev_source *ev);
 /* try to play something, if playing is enabled and nothing is playing
  * already */
 
+/** @brief Return true if @p represents a true flag */
+int flag_enabled(const char *s);
+
 int playing_is_enabled(void);
 /* return true iff playing is enabled */
 
 void enable_playing(const char *who, ev_source *ev);
 /* enable playing */
 
-void disable_playing(const char *who);
+void disable_playing(const char *who, ev_source *ev);
 /* disable playing. */
 
 int random_is_enabled(void);
@@ -194,7 +197,7 @@ int random_is_enabled(void);
 void enable_random(const char *who, ev_source *ev);
 /* enable random play */
 
-void disable_random(const char *who);
+void disable_random(const char *who, ev_source *ev);
 /* disable random play */
 
 void scratch(const char *who, const char *id);
@@ -231,7 +234,8 @@ void add_random_track(ev_source *ev);
 
 int server_start(ev_source *ev, int pf,
                 size_t socklen, const struct sockaddr *sa,
-                const char *name);
+                const char *name,
+                 int privileged);
 /* start listening.  Return the fd. */
 
 int server_stop(ev_source *ev, int fd);
@@ -345,8 +349,6 @@ struct pbgc_params {
   int argc;
   /** @brief Player command */
   const char **argv;
-  /** @brief Device to wait for or NULL */
-  const char *waitdevice;
   /** @brief Raw track name */
   const char *rawpath;
 };
@@ -372,6 +374,11 @@ int play_background(ev_source *ev,
 #define START_HARDFAIL 1   /**< @brief Track is broken. */
 #define START_SOFTFAIL 2   /**< @brief Track OK, system (temporarily?) broken */
 
+void periodic_mount_check(ev_source *ev_);
+
+/** @brief How often to check for new (or old) filesystems */
+# define MOUNT_CHECK_INTERVAL 5         /* seconds */
+
 #endif /* DISORDER_SERVER_H */
 
 /*
index 14b459f861524a7d66d9ff9b8ded1fc2c59f6403..612ac288cfa96015d5e321ecf1e3c12df7c5ae25 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2009 Richard Kettlewell
+ * Copyright (C) 2004-2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@ static const struct option options[] = {
   { "log", required_argument, 0, 'l' },
   { "pidfile", required_argument, 0, 'P' },
   { "wide-open", no_argument, 0, 'w' },
+  { "wait-for-root", no_argument, 0, 'W' },
   { "syslog", no_argument, 0, 's' },
   { 0, 0, 0, 0 }
 };
@@ -80,8 +81,12 @@ static int handle_sigterm(ev_source attribute((unused)) *ev_,
 
 /* periodic actions --------------------------------------------------------- */
 
+/** @brief A job executed periodically by the server */
 struct periodic_data {
+  /** @brief Callback to process job */
   void (*callback)(ev_source *);
+
+  /** @brief Period of job in seconds */
   int period;
 };
 
@@ -172,8 +177,29 @@ static void fix_path(void) {
   disorder_info("%s", newpath); 
 }
 
+/* Used by test scripts to wait for things to get ready */
+static void wait_for_root(void) {
+  const char *password;
+
+  while(!trackdb_readable()) {
+    disorder_info("waiting for trackdb...");
+    sleep(1);
+  }
+  trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
+  for(;;) {
+    trackdb_open(TRACKDB_READ_ONLY);
+    password = trackdb_get_password("root");
+    trackdb_close();
+    if(password)
+      break;
+    disorder_info("waiting for root user to be created...");
+    sleep(1);
+  }
+  trackdb_deinit(NULL);
+}
+
 int main(int argc, char **argv) {
-  int n, background = 1, logsyslog = 0;
+  int n, background = 1, logsyslog = 0, wfr = 0;
   const char *pidfile = 0;
   struct rlimit rl[1];
 
@@ -184,7 +210,7 @@ int main(int argc, char **argv) {
   /* garbage-collect PCRE's memory */
   pcre_malloc = xmalloc;
   pcre_free = xfree;
-  while((n = getopt_long(argc, argv, "hVc:dfP:Ns", options, 0)) >= 0) {
+  while((n = getopt_long(argc, argv, "hVc:dfP:NsW", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'V': version("disorderd");
@@ -194,9 +220,16 @@ int main(int argc, char **argv) {
     case 'P': pidfile = optarg; break;
     case 's': logsyslog = 1; break;
     case 'w': wideopen = 1; break;
+    case 'W': wfr = 1; break;
     default: disorder_fatal(0, "invalid option");
     }
   }
+  if(wfr) {
+    if(config_read(1,  NULL))
+      disorder_fatal(0, "cannot read configuration");
+    wait_for_root();
+    return 0;
+  }
   /* go into background if necessary */
   if(background)
     daemonize(progname, LOG_DAEMON, pidfile);
@@ -274,8 +307,6 @@ int main(int argc, char **argv) {
   recent_read();
   /* Arrange timeouts for schedule actions */
   schedule_init(ev);
-  /* pull in old users */
-  trackdb_old_users();
   /* create a root login */
   trackdb_create_root();
   /* create sockets */
@@ -302,6 +333,8 @@ int main(int argc, char **argv) {
   create_periodic(ev, periodic_play_check, 1, 0);
   /* Try adding a random track immediately and once every two seconds */
   create_periodic(ev, periodic_add_random, 2, 1);
+  /* Issue a rescan when devices are mounted or unmouted */
+  create_periodic(ev, periodic_mount_check, MOUNT_CHECK_INTERVAL, 1);
   /* enter the event loop */
   n = ev_run(ev);
   /* if we exit the event loop, something must have gone wrong */
index cdc3a44fc72a57e70eb1f60d823afda31a9e209e..475fc8188bd837f9eee633d40c732db936cc13dd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 #include "disorder-server.h"
 
+enum {
+  NO_SETUID = UCHAR_MAX + 1,
+};
+
 static const struct option options[] = {
   { "help", no_argument, 0, 'h' },
   { "version", no_argument, 0, 'V' },
@@ -31,6 +35,7 @@ static const struct option options[] = {
   { "recover-fatal", no_argument, 0, 'R' },
   { "recompute-aliases", no_argument, 0, 'a' },
   { "remove-pathless", no_argument, 0, 'P' },
+  { "no-setuid", no_argument, 0, NO_SETUID },
   { 0, 0, 0, 0 }
 };
 
@@ -48,6 +53,7 @@ static void help(void) {
          "  --recover, -r            Run database recovery\n"
          "  --recompute-aliases, -a  Recompute aliases\n"
          "  --remove-pathless, -P    Remove pathless tracks\n"
+          "  --no-setuid              Do not become jukebox user\n"
          "  --debug                  Debug mode\n");
   xfclose(stdout);
   exit(0);
@@ -365,12 +371,13 @@ fail:
 int main(int argc, char **argv) {
   int n, dump = 0, undump = 0, recover = TRACKDB_NO_RECOVER, recompute = 0;
   int remove_pathless = 0, fd;
+  int changeuid = !getuid();
   const char *path;
   char *tmp;
   FILE *fp;
 
   mem_init();
-  while((n = getopt_long(argc, argv, "hVc:dDurRaP", options, 0)) >= 0) {
+  while((n = getopt_long(argc, argv, "hVc:dDurRaPR", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'V': version("disorder-dump");
@@ -378,10 +385,11 @@ int main(int argc, char **argv) {
     case 'd': dump = 1; break;
     case 'u': undump = 1; break;
     case 'D': debugging = 1; break;
-    case 'r': recover = TRACKDB_NORMAL_RECOVER;
-    case 'R': recover = TRACKDB_FATAL_RECOVER;
+    case 'r': recover = TRACKDB_NORMAL_RECOVER; break;
+    case 'R': recover = TRACKDB_FATAL_RECOVER; break;
     case 'a': recompute = 1; break;
     case 'P': remove_pathless = 1; break;
+    case NO_SETUID: changeuid = 0; break;
     default: disorder_fatal(0, "invalid option");
     }
   }
@@ -400,8 +408,6 @@ int main(int argc, char **argv) {
   }
   if(config_read(0, NULL))
     disorder_fatal(0, "cannot read configuration");
-  trackdb_init(recover|TRACKDB_MAY_CREATE);
-  trackdb_open(TRACKDB_NO_UPGRADE);
   if(dump) {
     /* We write to a temporary file and rename into place.  We make
      * sure the permissions are tight from the start. */
@@ -410,17 +416,24 @@ int main(int argc, char **argv) {
       disorder_fatal(errno, "error opening %s", tmp);
     if(!(fp = fdopen(fd, "w")))
       disorder_fatal(errno, "fdopen on %s", tmp);
+    trackdb_init(recover|TRACKDB_MAY_CREATE);
+    trackdb_open(TRACKDB_NO_UPGRADE);
     do_dump(fp, tmp);
     if(fclose(fp) < 0) disorder_fatal(errno, "error closing %s", tmp);
     if(rename(tmp, path) < 0)
       disorder_fatal(errno, "error renaming %s to %s", tmp, path);
   } else if(undump) {
+    /* Open the dump file before changing UID */
+    if(!(fp = fopen(path, "r")))
+      disorder_fatal(errno, "error opening %s", path);
+    if(changeuid)
+      become_mortal();
     /* the databases or logfiles might end up with wrong permissions
      * if new ones are created */
     if(getuid() == 0)
       disorder_info("you might need to chown database files");
-    if(!(fp = fopen(path, "r")))
-      disorder_fatal(errno, "error opening %s", path);
+    trackdb_init(recover|TRACKDB_MAY_CREATE);
+    trackdb_open(TRACKDB_NO_UPGRADE);
     do_undump(fp, path, remove_pathless);
     xfclose(fp);
   } else if(recompute) {
index b7e916851bdc112be3bf75db89f0148833338016..b4a604ee0c93ffff81df456a46622fba15e8d3fa 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 /** @file server/endian.c
  * @brief Expose runtime endianness to makefile for testing
  */
index fb8426f2428c26163970bd81198755d4f31b5060..cdb0188fb56f1f634f392b025908773547e5ddef 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007, 2008 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/server/mount.c b/server/mount.c
new file mode 100644 (file)
index 0000000..6fbd2be
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2010, 2011 Richard Kettlewell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/mount.c
+ * @brief Periodically check for devices being mounted and unmounted
+ */
+#include "disorder-server.h"
+#if HAVE_GETFSSTAT
+# include <sys/param.h>
+# include <sys/ucred.h>
+# include <sys/mount.h>
+#endif
+
+#if HAVE_GETFSSTAT
+static int compare_fsstat(const void *av, const void *bv) {
+  const struct statfs *a = av, *b = bv;
+  int c;
+  c = memcmp(&a->f_fsid, &b->f_fsid, sizeof a->f_fsid);
+  if(c)
+    return c;
+  c = strcmp(a->f_mntonname, b->f_mntonname);
+  if(c)
+    return c;
+  return 0;
+}
+#endif
+
+#if HAVE_GETFSSTAT || defined PATH_MTAB
+void periodic_mount_check(ev_source *ev_) {
+  if(!config->mount_rescan)
+    return;
+#if HAVE_GETFSSTAT
+  /* On OS X, we keep track of the hash of the kernel's mounted
+   * filesystem list */
+  static int first = 1;
+  static unsigned char last[20];
+  unsigned char *current;
+  int nfilesystems, space;
+  struct statfs *buf;
+  gcrypt_hash_handle h;
+  gcry_error_t e;
+
+  space = getfsstat(NULL, 0, MNT_NOWAIT);
+  buf = xcalloc(space, sizeof *buf);
+  nfilesystems = getfsstat(buf, space * sizeof *buf, MNT_NOWAIT);
+  if(nfilesystems > space)
+    // The array grew between check and use!  We just give up and try later.
+    return;
+  // Put into order so we get a bit of consistency
+  qsort(buf, nfilesystems, sizeof *buf, compare_fsstat);
+  if((e = gcry_md_open(&h, GCRY_MD_SHA1, 0))) {
+    disorder_error(0, "gcry_md_open: %s", gcry_strerror(e));
+    return;
+  }
+  for(int n = 0; n < nfilesystems; ++n) {
+    gcry_md_write(h, &buf[n].f_fsid, sizeof buf[n].f_fsid);
+    gcry_md_write(h, buf[n].f_mntonname, 1 + strlen(buf[n].f_mntonname));
+  }
+  current = gcry_md_read(h, GCRY_MD_SHA1);
+  if(!first && memcmp(current, last, sizeof last))
+    trackdb_rescan(ev_, 1/*check*/, 0, 0);
+  memcpy(last, current, sizeof last);
+  first = 0;
+  gcry_md_close(h);
+#elif defined PATH_PROC_MOUNTS
+  /* On Linux we hash /proc/mounts */
+  static int first = 1;
+  static unsigned char last[20];
+
+  unsigned char *current;
+  int fd = -1, n;
+  gcrypt_hash_handle h = 0;
+  gcry_error_t e;
+  char buffer[1024];
+
+  if((e = gcry_md_open(&h, GCRY_MD_SHA1, 0))) {
+    disorder_error(0, "gcry_md_open: %s", gcry_strerror(e));
+    goto done;
+  }
+  if((fd = open(PATH_PROC_MOUNTS, O_RDONLY)) < 0) {
+    disorder_error(errno, "open %s", PATH_PROC_MOUNTS);
+    goto done;
+  }
+  for(;;) {
+    n = read(fd, buffer, sizeof buffer);
+    if(n > 0)
+      gcry_md_write(h, buffer, n);
+    else if(n == 0)
+      break;
+    else if(errno != EINTR) {
+      disorder_error(errno, "reading %s", PATH_PROC_MOUNTS);
+      goto done;
+    }
+  }
+  current = gcry_md_read(h, GCRY_MD_SHA1);
+  if(!first && memcmp(current, last, sizeof last))
+    trackdb_rescan(ev_, 1/*check*/, 0, 0);
+  memcpy(last, current, sizeof last);
+  first = 0;
+ done:
+  if(h) gcry_md_close(h);
+  if(fd != -1) close(fd);
+#elif defined PATH_MTAB
+  /* As a further alternative we track the modification time of /etc/mtab */
+  static time_t last_mount;
+  struct stat sb;
+  
+  if(stat(PATH_MTAB, &sb) >= 0) {
+    if(last_mount != 0 && last_mount != sb.st_mtime)
+      trackdb_rescan(ev_, 1/*check*/, 0, 0);
+    last_mount = sb.st_mtime;
+  }
+#endif
+}
+#else
+void periodic_mount_check(ev_source attribute((unused)) *ev_ ) {
+}
+#endif
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 99ef4837326d5acf1229b840a381d5a251736f76..96e4a507f557446093dfafd712f78155537dfc82 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2009 Richard Kettlewell
+ * Copyright (C) 2004-2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -250,10 +250,12 @@ static int player_finished(ev_source *ev,
       q->state = playing_ok;
     break;
   }
-  /* Regardless we always report and record the status and do cleanup for
-   * prefork calls. */
-  if(status)
-    disorder_error(0, "player for %s %s", q->track, wstat(status));
+  /* Report the status unless we killed it */
+  if(status) {
+    if(!(q->killed && WIFSIGNALED(status) && WTERMSIG(status) == q->killed))
+      disorder_error(0, "player for %s %s", q->track, wstat(status));
+  }
+  /* Clean up any prefork calls */
   if(q->type & DISORDER_PLAYER_PREFORK)
     play_cleanup(q->pl, q->data);
   q->wstat = status;
@@ -300,7 +302,7 @@ static int start(ev_source *ev,
 
   D(("start %s", q->id));
   /* Find the player plugin. */
-  if(!(player = find_player(q)) < 0)
+  if(!(player = find_player(q)))
     return START_HARDFAIL;              /* No player */
   if(!(q->pl = open_plugin(player->s[1], 0)))
     return START_HARDFAIL;
@@ -338,35 +340,6 @@ static int start(ev_source *ev,
 static int start_child(struct queue_entry *q, 
                        const struct pbgc_params *params,
                        void attribute((unused)) *bgdata) {
-  int n;
-
-  /* Wait for a device to clear.  This ugliness is now deprecated and will
-   * eventually be removed. */
-  if(params->waitdevice) {
-    ao_initialize();
-    if(*params->waitdevice) {
-      n = ao_driver_id(params->waitdevice);
-      if(n == -1)
-        disorder_fatal(0, "invalid libao driver: %s", params->waitdevice);
-    } else
-      n = ao_default_driver_id();
-    /* Make up a format. */
-    ao_sample_format format;
-    memset(&format, 0, sizeof format);
-    format.bits = 8;
-    format.rate = 44100;
-    format.channels = 1;
-    format.byte_format = AO_FMT_NATIVE;
-    int retries = 20;
-    struct timespec ts;
-    ts.tv_sec = 0;
-    ts.tv_nsec = 100000000;             /* 0.1s */
-    ao_device *device;
-    while((device = ao_open_live(n, &format, 0)) == 0 && retries-- > 0)
-      nanosleep(&ts, 0);
-    if(device)
-      ao_close(device);
-  }
   /* Play the track */
   play_track(q->pl,
              params->argv, params->argc,
@@ -395,7 +368,7 @@ int prepare(ev_source *ev,
   if(q->prepared || q->preparing)
     return START_OK;
   /* Find the player plugin */
-  if(!(player = find_player(q)) < 0
+  if(!(player = find_player(q))) 
     return START_HARDFAIL;              /* No player */
   q->pl = open_plugin(player->s[1], 0);
   q->type = play_get_type(q->pl);
@@ -449,7 +422,7 @@ static int prepare_child(struct queue_entry *q,
       memset(&addr, 0, sizeof addr);
       addr.sun_family = AF_UNIX;
       snprintf(addr.sun_path, sizeof addr.sun_path,
-               "%s/speaker/socket", config->home);
+               "%s/private/speaker", config->home);
       int sfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
       if(connect(sfd, (const struct sockaddr *)&addr, sizeof addr) < 0)
         disorder_fatal(errno, "connecting to %s", addr.sun_path);
@@ -501,6 +474,15 @@ static int prepare_child(struct queue_entry *q,
   return 0;
 }
 
+/** @brief Kill a player
+ * @param q Queue entry corresponding to player
+ */
+static void kill_player(struct queue_entry *q) {
+  if(q->pid >= 0)
+    kill(-q->pid, config->signal);
+  q->killed = config->signal;
+}
+
 /** @brief Abandon a queue entry
  *
  * Called from c_remove() (but NOT when scratching a track).  Only does
@@ -516,7 +498,7 @@ void abandon(ev_source attribute((unused)) *ev,
   if((q->type & DISORDER_PLAYER_TYPEMASK) != DISORDER_PLAYER_RAW)
     return;                            /* Not a raw player. */
   /* Terminate the player. */
-  kill(-q->pid, config->signal);
+  kill_player(q);
   /* Cancel the track. */
   memset(&sm, 0, sizeof sm);
   sm.type = SM_CANCEL;
@@ -640,11 +622,13 @@ void play(ev_source *ev) {
 
 /* Miscelleneous ------------------------------------------------------------ */
 
+int flag_enabled(const char *s) {
+  return !s || !strcmp(s, "yes");
+}
+
 /** @brief Return true if play is enabled */
 int playing_is_enabled(void) {
-  const char *s = trackdb_get_global("playing");
-
-  return !s || !strcmp(s, "yes");
+  return flag_enabled(trackdb_get_global("playing"));
 }
 
 /** @brief Enable play */
@@ -656,15 +640,13 @@ void enable_playing(const char *who, ev_source *ev) {
 }
 
 /** @brief Disable play */
-void disable_playing(const char *who) {
+void disable_playing(const char *who, ev_source attribute((unused)) *ev) {
   trackdb_set_global("playing", "no", who);
 }
 
 /** @brief Return true if random play is enabled */
 int random_is_enabled(void) {
-  const char *s = trackdb_get_global("random-play");
-
-  return !s || !strcmp(s, "yes");
+  return flag_enabled(trackdb_get_global("random-play"));
 }
 
 /** @brief Enable random play */
@@ -675,7 +657,7 @@ void enable_random(const char *who, ev_source *ev) {
 }
 
 /** @brief Disable random play */
-void disable_random(const char *who) {
+void disable_random(const char *who, ev_source attribute((unused)) *ev) {
   trackdb_set_global("random-play", "no", who);
 }
 
@@ -720,10 +702,8 @@ void scratch(const char *who, const char *id) {
     playing->state = playing_scratched;
     playing->scratched = who ? xstrdup(who) : 0;
     /* Find the player and kill the whole process group */
-    if(playing->pid >= 0) {
-      D(("kill -%d -%lu", config->signal, (unsigned long)playing->pid));
-      kill(-playing->pid, config->signal);
-    }
+    if(playing->pid >= 0)
+      kill_player(playing);
     /* Tell the speaker, if we think it'll care */
     if((playing->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) {
       memset(&sm, 0, sizeof sm);
@@ -762,17 +742,13 @@ void quitting(ev_source *ev) {
   shutting_down = 1;
   /* Shut down the current player */
   if(playing) {
-    if(playing->pid >= 0)
-      kill(-playing->pid, config->signal);
+    kill_player(playing);
     playing->state = playing_quitting;
     finished(0);
   }
   /* Zap any background decoders that are going */
   for(q = qhead.next; q != &qhead; q = q->next)
-    if(q->pid >= 0) {
-      D(("kill -%d %lu", config->signal, (unsigned long)q->pid));
-      kill(-q->pid, config->signal);
-    }
+    kill_player(q);
   /* Don't need the speaker any more */
   ev_fd_cancel(ev, ev_read, speaker_fd);
   xclose(speaker_fd);
index 7afbde9ccd397010b79e7f041f616810e05b6b5f..6a78693da992d8e8282fd590b2eb3584f95e7766 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009, 2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 # define SOSUFFIX ".so"
 #endif
 
+/** @brief A loaded plugin */
 struct plugin {
+  /** @brief Next plugin */
   struct plugin *next;
+
+  /** @brief Handle returned from dlopen() */
   void *dlhandle;
+
+  /** @brief Plugin name */
   const char *name;
 };
 
index 7dcaa845bef920505f6b29979b1659bbac5f3367..2bfe589f75b6299943fe9abb2d8283c098868b02 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index bc99681db8297a40d42c69a7116f7276e0a844f9..792bdf588908fa88d31f59e024a775339b4f4688 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder 
- * Copyright (C) 2005-2008 Richard Kettlewell
+ * Copyright (C) 2005-2011 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -160,18 +160,37 @@ done:
   if(fp)
     xfclose(fp);
   if(pid)
-    while((r = waitpid(pid, &w, 0)) == -1 && errno == EINTR)
+    while((waitpid(pid, &w, 0)) == -1 && errno == EINTR)
       ;
 }
 
+/** @brief State for the recheck phase of the rescan */
 struct recheck_state {
+  /** @brief Collection being rechecked */
   const struct collection *c;
-  long nobsolete, nnocollection, nlength;
+
+  /** @brief Number of tracks obsoleted */
+  long nobsolete;
+
+  /** @brief Number of tracks belonging to no collection */
+  long nnocollection;
+
+  /** @brief Number of lengths computed */
+  long nlength;
+
+  /** @brief Linked list of tracks to recheck */
   struct recheck_track *tracks;
 };
 
+/** @brief A track to recheck
+ *
+ * A node in a linked list.
+ */
 struct recheck_track {
+  /** @brief Next track */
   struct recheck_track *next;
+
+  /** @brief Track */
   const char *track;
 };
 
index f1b20a123d96433188d70bef0286f60fcf8406c5..219fc14b50de3f74179d9c0af61d4c713ef5e69c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008-2010 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -471,14 +471,12 @@ static int schedule_lookup(const char *id,
 static int schedule_trigger(ev_source *ev,
                            const struct timeval attribute((unused)) *now,
                            void *u) {
-  const char *action, *id = u;
+  const char *id = u;
   struct kvp *actiondata = schedule_get(id);
   int n;
 
   if(!actiondata)
     return 0;
-  /* schedule_get() enforces these being present */
-  action = kvp_get(actiondata, "action");
   /* Look up the action */
   n = schedule_lookup(id, actiondata);
   if(n < 0)
index 25dae71792769dca3c850d2418969c105466ab80..763f4f3a65923213a9feadd2672975d833f6dd3a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0ebfb4f0782fb8c4d5d8f91184928a4eb6606c5b..2d4ab797e7a6e761f2b105977b679661c25acfbd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2009 Richard Kettlewell
+ * Copyright (C) 2004-2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,6 +42,7 @@ int wideopen;
 struct listener {
   const char *name;
   int pf;
+  int privileged;
 };
 
 struct conn;
@@ -201,9 +202,9 @@ static int reader_error(ev_source attribute((unused)) *ev,
 
 static int c_disable(struct conn *c, char **vec, int nvec) {
   if(nvec == 0)
-    disable_playing(c->who);
+    disable_playing(c->who, c->ev);
   else if(nvec == 1 && !strcmp(vec[0], "now"))
-    disable_playing(c->who);
+    disable_playing(c->who, c->ev);
   else {
     sink_writes(ev_writer_sink(c->w), "550 invalid argument\n");
     return 1;                  /* completed */
@@ -589,7 +590,7 @@ static int c_user(struct conn *c,
   /* check whether the response is right */
   res = authhash(c->nonce, sizeof c->nonce, password,
                 config->authorization_algorithm);
-  if(wideopen || (res && !strcmp(res, vec[1]))) {
+  if(wideopen || c->l->privileged || (res && !strcmp(res, vec[1]))) {
     c->who = vec[0];
     c->rights = rights;
     /* currently we only bother logging remote connections */
@@ -634,7 +635,7 @@ static int c_queue(struct conn *c,
       if((l = trackdb_get(playing->track, "_length"))
         && (length = atol(l))) {
        xtime(&when);
-       when += length - playing->sofar + config->gap;
+       when += length - playing->sofar;
       }
     } else
       /* Nothing is playing but playing is enabled, so whatever is
@@ -649,7 +650,7 @@ static int c_queue(struct conn *c,
     if(when) {
       if((l = trackdb_get(q->track, "_length"))
         && (length = atol(l)))
-       when += length + config->gap;
+       when += length;
       else
        when = 0;
     }
@@ -866,7 +867,7 @@ static int c_random_enable(struct conn *c,
 static int c_random_disable(struct conn *c,
                            char attribute((unused)) **vec,
                            int attribute((unused)) nvec) {
-  disable_random(c->who);
+  disable_random(c->who, c->ev);
   sink_writes(ev_writer_sink(c->w), "250 OK\n");
   return 1;                    /* completed */
 }
@@ -1150,8 +1151,19 @@ static int c_set_global(struct conn *c,
     sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n");
     return 1;
   }
-  trackdb_set_global(vec[0], vec[1], c->who);
-  sink_printf(ev_writer_sink(c->w), "250 OK\n");
+  /* We special-case the 'magic' preferences here. */
+  if(!strcmp(vec[0], "playing")) {
+    (flag_enabled(vec[1]) ? enable_playing : disable_playing)(c->who, c->ev);
+    sink_printf(ev_writer_sink(c->w), "250 OK\n");
+  } else if(!strcmp(vec[0], "random-play")) {
+    (flag_enabled(vec[1]) ? enable_random : disable_random)(c->who, c->ev);
+    sink_printf(ev_writer_sink(c->w), "250 OK\n");
+  } else {
+    if(!trackdb_set_global(vec[0], vec[1], c->who))
+      sink_printf(ev_writer_sink(c->w), "250 OK\n");
+    else
+      sink_writes(ev_writer_sink(c->w), "550 not found\n");
+  }
   return 1;
 }
 
@@ -1177,7 +1189,7 @@ static int c_nop(struct conn *c,
 static int c_new(struct conn *c,
                 char **vec,
                 int nvec) {
-  int max, n;
+  int max;
   char **tracks;
 
   if(nvec > 0)
@@ -1188,7 +1200,6 @@ static int c_new(struct conn *c,
     max = config->new_max;
   tracks = trackdb_new(0, max);
   sink_printf(ev_writer_sink(c->w), "253 New track list follows\n");
-  n = 0;
   while(*tracks) {
     sink_printf(ev_writer_sink(c->w), "%s%s\n",
                **tracks == '.' ? "." : "", *tracks);
@@ -1269,7 +1280,7 @@ static int c_revoke(struct conn *c,
     revoke_cookie(c->cookie);
     sink_writes(ev_writer_sink(c->w), "250 OK\n");
   } else
-    sink_writes(ev_writer_sink(c->w), "550 Did not log in with cookie\n");
+    sink_writes(ev_writer_sink(c->w), "510 Did not log in with cookie\n");
   return 1;
 }
 
@@ -1280,7 +1291,7 @@ static int c_adduser(struct conn *c,
 
   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
     disorder_error(0, "S%x: remote adduser", c->tag);
-    sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+    sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
     return 1;
   }
   if(nvec > 2) {
@@ -1306,7 +1317,7 @@ static int c_deluser(struct conn *c,
 
   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
     disorder_error(0, "S%x: remote deluser", c->tag);
-    sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+    sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
     return 1;
   }
   if(trackdb_deluser(vec[0])) {
@@ -1328,7 +1339,7 @@ static int c_edituser(struct conn *c,
 
   if(!config->remote_userman && !(c->rights & RIGHT__LOCAL)) {
     disorder_error(0, "S%x: remote edituser", c->tag);
-    sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+    sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
     return 1;
   }
   /* RIGHT_ADMIN can do anything; otherwise you can only set your own email
@@ -1387,7 +1398,7 @@ static int c_userinfo(struct conn *c,
      && !(c->rights & RIGHT__LOCAL)
      && strcmp(vec[1], "rights")) {
     disorder_error(0, "S%x: remote userinfo %s %s", c->tag, vec[0], vec[1]);
-    sink_writes(ev_writer_sink(c->w), "550 Remote user management is disabled\n");
+    sink_writes(ev_writer_sink(c->w), "510 Remote user management is disabled\n");
     return 1;
   }
   /* RIGHT_ADMIN allows anything; otherwise you can only get your own email
@@ -1460,7 +1471,7 @@ static int c_confirm(struct conn *c,
   }
   user = xstrndup(vec[0], sep - vec[0]);
   if(trackdb_confirm(user, vec[0], &rights))
-    sink_writes(ev_writer_sink(c->w), "550 Incorrect confirmation string\n");
+    sink_writes(ev_writer_sink(c->w), "510 Incorrect confirmation string\n");
   else {
     c->who = user;
     c->cookie = 0;
@@ -1610,7 +1621,7 @@ static int c_schedule_del(struct conn *c,
     const char *who = kvp_get(actiondata, "who");
 
     if(!who || !c->who || strcmp(who, c->who)) {
-      sink_writes(ev_writer_sink(c->w), "551 Not authorized\n");
+      sink_writes(ev_writer_sink(c->w), "510 Not authorized\n");
       return 1;                                /* completed */
     }
   }
@@ -1695,7 +1706,7 @@ static int playlist_response(struct conn *c,
   case 0:
     assert(!"cannot cope with success");
   case EACCES:
-    sink_writes(ev_writer_sink(c->w), "550 Access denied\n");
+    sink_writes(ev_writer_sink(c->w), "510 Access denied\n");
     break;
   case EINVAL:
     sink_writes(ev_writer_sink(c->w), "550 Invalid playlist name\n");
@@ -1835,7 +1846,8 @@ static int c_playlist_unlock(struct conn *c,
   return 1;
 }
 
-static const struct command {
+/** @brief Server's definition of a command */
+static const struct server_command {
   /** @brief Command name */
   const char *name;
 
@@ -2125,12 +2137,16 @@ static int listen_callback(ev_source *ev,
 
 int server_start(ev_source *ev, int pf,
                 size_t socklen, const struct sockaddr *sa,
-                const char *name) {
+                const char *name,
+                int privileged) {
   int fd;
   struct listener *l = xmalloc(sizeof *l);
   static const int one = 1;
 
-  D(("server_init socket %s", name));
+  D(("server_init socket %s privileged=%d", name, privileged));
+  /* Sanity check */
+  if(privileged && pf != AF_UNIX)
+    disorder_fatal(0, "cannot create a privileged listener on a non-local port");
   fd = xsocket(pf, SOCK_STREAM, 0);
   xsetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
   if(bind(fd, sa, socklen) < 0) {
@@ -2142,6 +2158,7 @@ int server_start(ev_source *ev, int pf,
   cloexec(fd);
   l->name = name;
   l->pf = pf;
+  l->privileged = privileged;
   if(ev_listen(ev, fd, listen_callback, l, "server listener"))
     exit(EXIT_FAILURE);
   disorder_info("listening on %s", name);
index a2c2e7c7650a8b45a7f5de5b0a406d5a360e1fca..212ffb9a59ef045afca74da1b06abce898167258 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2005-2010 Richard Kettlewell
+ * Copyright (C) 2005-2012 Richard Kettlewell
  * Portions (C) 2007 Mark Wooding
  *
  * This program is free software: you can redistribute it and/or modify
@@ -36,8 +36,8 @@
  * assumed that the main server won't start outrageously many decoders.
  *
  * Audio is supplied from this buffer to the uaudio play callback.  Playback is
- * enabled when a track is to be played and disabled when the its last bytes
- * have been return by the callback; pause and resume is implemneted the
+ * enabled when a track is to be played and disabled when its last bytes
+ * have been returned by the callback; pause and resume is implemented the
  * obvious way.  If the callback finds itself required to play when there is no
  * playing track it returns dead air.
  *
@@ -75,7 +75,6 @@
 #include <syslog.h>
 #include <unistd.h>
 #include <errno.h>
-#include <ao/ao.h>
 #include <sys/select.h>
 #include <sys/wait.h>
 #include <time.h>
@@ -117,7 +116,7 @@ struct track {
   struct track *next;
 
   /** @brief Input file descriptor */
-  int fd;                               /* input FD */
+  int fd;
 
   /** @brief Track ID */
   char id[24];
@@ -173,26 +172,37 @@ struct track {
  */
 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
-/** @brief Linked list of all prepared tracks */
+/** @brief Linked list of all prepared tracks
+ *
+ * This includes @ref playing and @ref pending_playing.
+ */
 static struct track *tracks;
 
 /** @brief Playing track, or NULL
  *
  * This means the track the speaker process intends to play.  It does not
  * reflect any other state (e.g. activation of uaudio backend).
+ *
+ * This track remains on @ref track.
  */
 static struct track *playing;
 
 /** @brief Pending playing track, or NULL
  *
  * This means the track the server wants the speaker to play.
+ *
+ * This track remains on @p track.
  */
 static struct track *pending_playing;
 
 /** @brief Array of file descriptors for poll() */
 static struct pollfd fds[NFDS];
 
-/** @brief Next free slot in @ref fds */
+/** @brief Next free slot in @ref fds
+ *
+ * This is used when filling in the @ref fds array each iteration through the
+ * event loop.
+ */
 static int fdno;
 
 /** @brief Listen socket */
@@ -243,7 +253,7 @@ static void help(void) {
 
 /** @brief Find track @p id, maybe creating it if not found
  * @param id Track ID to find
- * @param create If nonzero, create track structure of @p id not found
+ * @param create If nonzero, create track structure of @p id if not found
  * @return Pointer to track structure or NULL
  */
 static struct track *findtrack(const char *id, int create) {
@@ -294,6 +304,8 @@ static void destroy(struct track *t) {
  * This is effectively the read callback on @c t->fd.  It is called from the
  * main loop whenever the track's file descriptor is readable, assuming the
  * buffer has not reached the maximum allowed occupancy.
+ *
+ * Errors count as EOF.
  */
 static int speaker_fill(struct track *t) {
   size_t where, left;
@@ -340,7 +352,8 @@ static int speaker_fill(struct track *t) {
         t->playable = 1;
       rc = 0;
     }
-  }
+  } else
+    rc = 0;
   return rc;
 }
 
@@ -352,7 +365,9 @@ static int speaker_fill(struct track *t) {
  * We don't allow tracks to be paused if we've already told the server we've
  * finished them; that would cause such tracks to survive much longer than the
  * few samples they're supposed to, with report() remaining silent for the
- * duration.
+ * duration.  The effect is that if you hit pause towards the end of a track,
+ * what should happen is that it finished but the next one is paused right at
+ * its start.
  */
 static int playable(void) {
   return playing
@@ -429,7 +444,8 @@ static size_t speaker_callback(void *buffer,
       /* Wrap around to start of buffer */
       if(playing->start == sizeof playing->buffer)
         playing->start = 0;
-      /* See if we've reached the end of the track */
+      /* See if we've reached the end of the track; if so make sure the event
+       * loop wakes up. */
       if(playing->used == 0 && playing->eof) {
         int ignored = write(sigpipe[1], "", 1);
         (void) ignored;
@@ -459,8 +475,8 @@ static void mainloop(void) {
   struct speaker_message sm;
   int n, fd, stdin_slot, timeout, listen_slot, sigpipe_slot;
 
-  /* Keep going while our parent process is alive */
   pthread_mutex_lock(&lock);
+  /* Keep going while our parent process is alive */
   while(getppid() != 1) {
     int force_report = 0;
 
@@ -481,6 +497,8 @@ static void mainloop(void) {
       playing->slot = addfd(playing->fd, POLLIN);
     else if(playing)
       playing->slot = -1;
+    /* Allow the poll() to be interrupted at the end of a track */
+    sigpipe_slot = addfd(sigpipe[0], POLLIN);
     /* If any other tracks don't have a full buffer, try to read sample data
      * from them.  We do this last of all, so that if we run out of slots,
      * nothing important can't be monitored. */
@@ -493,7 +511,6 @@ static void mainloop(void) {
         } else
           t->slot = -1;
       }
-    sigpipe_slot = addfd(sigpipe[0], POLLIN);
     /* Wait for something interesting to happen */
     pthread_mutex_unlock(&lock);
     n = poll(fds, fdno, timeout);
@@ -510,6 +527,10 @@ static void mainloop(void) {
       char id[24];
 
       if((fd = accept(listenfd, (struct sockaddr *)&addr, &addrlen)) >= 0) {
+        /* We do blocking reads for the header.  In theory this means that the
+         * connecting process could wedge the speaker indefinitely.  In
+         * practice that would mean that the main server was broken anyway.
+         * Still, this is ugly, and a rewrite would be nice. */
         blocking(fd);
         if(read(fd, &l, sizeof l) < 4) {
           disorder_error(errno, "reading length from inbound connection");
@@ -668,6 +689,10 @@ static void mainloop(void) {
     }
     /* When the track is actually finished, deconfigure it */
     if(playing && playing->eof && !playing->used) {
+      if(!playing->finished) {
+        /* should never happen but we'd like to know if it does */
+        disorder_fatal(0, "track finish state inconsistent");
+      }
       removetrack(playing->id);
       destroy(playing);
       playing = 0;
@@ -771,8 +796,8 @@ int main(int argc, char **argv) {
   if(backend->configure)
     backend->configure();
   backend->start(speaker_callback, NULL);
-  /* create the socket directory */
-  byte_xasprintf(&dir, "%s/speaker", config->home);
+  /* create the private socket directory */
+  byte_xasprintf(&dir, "%s/private", config->home);
   unlink(dir);                          /* might be a leftover socket */
   if(mkdir(dir, 0700) < 0 && errno != EEXIST)
     disorder_fatal(errno, "error creating %s", dir);
@@ -780,7 +805,7 @@ int main(int argc, char **argv) {
   listenfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
   memset(&addr, 0, sizeof addr);
   addr.sun_family = AF_UNIX;
-  snprintf(addr.sun_path, sizeof addr.sun_path, "%s/speaker/socket",
+  snprintf(addr.sun_path, sizeof addr.sun_path, "%s/private/speaker",
            config->home);
   if(unlink(addr.sun_path) < 0 && errno != ENOENT)
     disorder_error(errno, "removing %s", addr.sun_path);
index b1254170fe4df78ac181210f902eda4855dcdbcc..11b21f6b6016d282d02554db9190d14e7752bd72 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009, 2012 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 #include "disorder-server.h"
 
-/** @brief Current AF_UNIX socket path */
-static const char *current_unix;
+/** @brief A unix domain socket */
+struct unix_socket {
+  const char *path;
+  int fd;
+};
 
-/** @brief Current AF_UNIX socket */
-static int current_unix_fd;
+struct unix_socket main_socket[1], priv_socket[1];
 
 /** @brief TCP listener definition */
 struct listener {
@@ -77,40 +79,53 @@ static struct sockaddr *copy_sockaddr(const struct addrinfo *addr) {
   return sa;
 }
 
-/** @brief Create and destroy sockets to set current configuration */
-void reset_sockets(ev_source *ev) {
-  const char *new_unix;
-  struct addrinfo *res, *r;
-  struct listener *l, **ll;
+static void reset_unix_socket(ev_source *ev,
+                              struct unix_socket *s,
+                              const char *new_path,
+                              int privileged) {
   struct sockaddr_un sun;
-
-  /* unix first */
-  new_unix = config_get_file("socket");
-  if(!current_unix || strcmp(current_unix, new_unix)) {
+  if(!s->path || strcmp(s->path, new_path)) {
     /* either there was no socket, or there was but a different path */
-    if(current_unix) {
+    if(s->path) {
       /* stop the old one and remove it from the filesystem */
-      server_stop(ev, current_unix_fd);
-      if(unlink(current_unix) < 0)
-       disorder_fatal(errno, "unlink %s", current_unix);
+      server_stop(ev, s->fd);
+      if(unlink(s->path) < 0)
+       disorder_fatal(errno, "unlink %s", s->path);
     }
     /* start the new one */
-    if(strlen(new_unix) >= sizeof sun.sun_path)
-      disorder_fatal(0, "socket path %s is too long", new_unix);
+    if(strlen(new_path) >= sizeof sun.sun_path)
+      disorder_fatal(0, "socket path %s is too long", new_path);
     memset(&sun, 0, sizeof sun);
     sun.sun_family = AF_UNIX;
-    strcpy(sun.sun_path, new_unix);
-    if(unlink(new_unix) < 0 && errno != ENOENT)
-      disorder_fatal(errno, "unlink %s", new_unix);
-    if((current_unix_fd = server_start(ev, PF_UNIX, sizeof sun,
-                                      (const struct sockaddr *)&sun,
-                                      new_unix)) >= 0) {
-      current_unix = new_unix;
-      if(chmod(new_unix, 0777) < 0)
-       disorder_fatal(errno, "error calling chmod %s", new_unix);
+    strcpy(sun.sun_path, new_path);
+    if(unlink(new_path) < 0 && errno != ENOENT)
+      disorder_fatal(errno, "unlink %s", new_path);
+    if((s->fd = server_start(ev, PF_UNIX, sizeof sun,
+                             (const struct sockaddr *)&sun,
+                             new_path,
+                             privileged)) >= 0) {
+      s->path = new_path;
+      if(chmod(new_path, 0777) < 0)     /* TODO */
+       disorder_fatal(errno, "error calling chmod %s", new_path);
     } else
-      current_unix = 0;
+      s->path = 0;
   }
+}
+
+/** @brief Create and destroy sockets to set current configuration */
+void reset_sockets(ev_source *ev) {
+  struct addrinfo *res, *r;
+  struct listener *l, **ll;
+  const char *private_dir = config_get_file("private");
+  
+  /* create the private socket directory */
+  unlink(private_dir);
+  if(mkdir(private_dir, 0700) < 0 && errno != EEXIST)
+    disorder_fatal(errno, "error creating %s", private_dir);
+
+  /* unix first */
+  reset_unix_socket(ev, main_socket, config_get_file("socket"), 0);
+  reset_unix_socket(ev, priv_socket, config_get_file("private/socket"), 1);
 
   /* get the new listen config */
   if(config->listen.af != -1)
@@ -142,7 +157,7 @@ void reset_sockets(ev_source *ev) {
     if(!l) {
       /* Didn't find a match, need a new listener */
       int fd = server_start(ev, r->ai_family, r->ai_addrlen, r->ai_addr,
-                           format_sockaddr(r->ai_addr));
+                           format_sockaddr(r->ai_addr), 0);
       if(fd >= 0) {
        l = xmalloc(sizeof *l);
        l->next = listeners;
index 60e2e39cd2129d897ef5b2e2fab5a31df04b6232..1ac1cd7a037ff2534b07abbbb0901fe7d9408789 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 096f97a7b59d35a2a09da59e6e43783c6832ee7e..2c62d0ccfaa821120a48a6400f67ef3bf06073aa 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1f939476f9931df592aa61abfb19512c5f21253e..0ce7a540ad059bca5ee30f14aed3e3bdee310b64 100644 (file)
@@ -19,8 +19,7 @@
 pkgdata_DATA=about.tmpl choose.tmpl playing.tmpl recent.tmpl           \
             prefs.tmpl help.tmpl error.tmpl                    \
             new.tmpl login.tmpl macros.tmpl                            \
-            options options.labels                                     \
-            options.columns
+            options options.labels
 pkghttp_DATA=disorder.css
 
 EXTRA_DIST=${pkgdata_DATA} $(pkghttp_DATA)
index a0842dbbab2cb71875db2a9b279291ca4f7e0471..9056b111b27a663c21b5c9b4a226eb685a46ac4f 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
 <!--
 This file is part of DisOrder.
-Copyright (C) 2004-2009 Richard Kettlewell
+Copyright (C) 2004-2011 Richard Kettlewell
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -61,7 +61,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
   <div class=section>
 
-   <p>Copyright &copy; 2003-2009 <a
+   <p>Copyright &copy; 2003-2011 <a
    href="http://www.greenend.org.uk/rjk/">Richard Kettlewell</a><br>
 
    Portions copyright &copy; 2007 <a
index c83fd35e9dbc26d2794747ad153e6f57f6cd679f..6b94317e8363330a3b16b2d96cb6432c82280b8f 100644 (file)
@@ -1,5 +1,5 @@
 This file is part of DisOrder.
-Copyright (C) 2008, 2009 Richard Kettlewell
+Copyright (C) 2008, 2009, 2011 Richard Kettlewell
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -117,7 +117,7 @@ and then redefine macros as desired.
   <a href="http://www.greenend.org.uk/rjk/disorder/"
      title="DisOrder web site">DisOrder
      version @version</a>
-  &copy; 2003-2009 Richard Kettlewell et al
+  &copy; 2003-2011 Richard Kettlewell et al
 </p>}
 
 @# Expand to the time that @id will be played
index e7313b07492d1b1613041523d774d6948cfeb995..ff61a5461592ff7938aa2099dd7e1b831e78a5fc 100644 (file)
@@ -1,8 +1,5 @@
 # default label values
 include options.labels
 
-# default columns
-include options.columns
-
 # user overrides - you supply this
 include options.user
diff --git a/templates/options.columns b/templates/options.columns
deleted file mode 100644 (file)
index 53badbd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-columns playing when who artist album title length button
-columns recent when who artist album title length
-columns search artist album title
index 5563f7fbeb61c590ed53df901d39033c8e73407f..9fd1a6bd826917d18f00fbd08c5571701f93fc61 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
+# Copyright (C) 2004, 2005, 2007-2009, 2011 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ disorder_udplog_LDADD=$(LIBOBJS) ../lib/libdisorder.a $(LIBGC)
 disorder_udplog_DEPENDENCIES=../lib/libdisorder.a
 
 TESTS=cookie.py dbversion.py dump.py files.py play.py queue.py \
-       recode.py search.py user-upgrade.py user.py aliases.py  \
+       recode.py search.py user.py aliases.py  \
        schedule.py hashes.py playlists.py
 
 TESTS_ENVIRONMENT=${PYTHON} -u
index da4efbfe91789cfb0ce99ac9a42826c5fe0db47d..62249260da8a5808e490750805183f178f144267 100755 (executable)
@@ -1,7 +1,7 @@
 #! /usr/bin/env python
 #
 # This file is part of DisOrder.
-# Copyright (C) 2007 Richard Kettlewell
+# Copyright (C) 2007-08 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
index a5a8be9c7c483ad2de06fad4831e8857ec1526de..a8ea64cdb526ecc136e269c7596be743a09e17ff 100644 (file)
@@ -1,7 +1,7 @@
 #-*-python-*-
 #
 # This file is part of DisOrder.
-# Copyright (C) 2007-2009 Richard Kettlewell
+# Copyright (C) 2007-2012 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -170,7 +170,6 @@ def default_config(encoding="UTF-8"):
     """home %s/home
 collection fs %s %s/tracks
 scratch %s/scratch.ogg
-gap 0
 queue_pad 5
 stopword 01 02 03 04 05 06 07 08 09 10
 stopword 1 2 3 4 5 6 7 8 9
@@ -256,8 +255,8 @@ Start the daemon."""
     if waited > 0:
         print "  took about %ss for socket to appear" % waited
     # Wait for root user to be created
-    command(["disorder",
-             "--config", disorder._configfile, "--no-per-user-config",
+    command(["disorderd",
+             "--config", disorder._configfile,
              "--wait-for-root"])
 
 def create_user(username="fred", password="fredpass"):
index 7958ea30fe4766fa1dd5c8030f21bde733ccdb4a..1703d1bcb328baf26033850ae59c38caa6f2322c 100755 (executable)
@@ -1,7 +1,7 @@
 #! /usr/bin/env python
 #
 # This file is part of DisOrder.
-# Copyright (C) 2007, 2008 Richard Kettlewell
+# Copyright (C) 2007-2009 Richard Kettlewell
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
index 81c0808c42c8cb72d0056da7f91cfd4617ccba4d..d326dbb6c2a2f9835d948b24e7987c7329a8f368 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/tests/user-upgrade.py b/tests/user-upgrade.py
deleted file mode 100755 (executable)
index 019c4c9..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /usr/bin/env python
-#
-# This file is part of DisOrder.
-# Copyright (C) 2007, 2008 Richard Kettlewell
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-import dtest,disorder
-
-def test():
-    """Test upgrade to new user database"""
-    print " testing upgrade from old versions"
-    open("%s/config" % dtest.testroot, "a").write(
-      """allow fred fredpass
-trust fred
-""")
-    dtest.start_daemon()
-    print " checking can log in after upgrade"
-    c = disorder.client()
-    c.version()
-    dtest.stop_daemon()
-    dtest.default_config()
-    dtest.start_daemon()
-    print " checking can log in after removing 'allow'"
-    c = disorder.client()
-    c.version()
-
-if __name__ == '__main__':
-    dtest.run()